obsidian-integration-testing 4.3.0 → 5.0.0
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 +51 -54
- package/dist/lib/cjs/global-setup-core.cjs +39 -12
- package/dist/lib/cjs/global-setup-core.d.cts +1 -1
- package/dist/lib/cjs/index.cjs +1 -4
- package/dist/lib/cjs/index.d.cts +2 -3
- package/dist/lib/cjs/kill-process-tree.cjs +57 -0
- package/dist/lib/cjs/kill-process-tree.d.cts +16 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/obsidian-config.cjs +11 -85
- package/dist/lib/cjs/obsidian-config.d.cts +12 -72
- package/dist/lib/cjs/obsidian-installer.cjs +180 -0
- package/dist/lib/cjs/obsidian-installer.d.cts +45 -0
- package/dist/lib/cjs/obsidian-instance.cjs +100 -0
- package/dist/lib/cjs/obsidian-instance.d.cts +55 -0
- package/dist/lib/cjs/obsidian-version-switch.cjs +105 -0
- package/dist/lib/cjs/obsidian-version-switch.d.cts +63 -0
- package/dist/lib/cjs/obsidian-version.cjs +85 -0
- package/dist/lib/cjs/obsidian-version.d.cts +111 -0
- package/dist/lib/cjs/setup-lock.cjs +158 -0
- package/dist/lib/cjs/setup-lock.d.cts +55 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +121 -7
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +75 -14
- package/dist/lib/cjs/transport-factory.cjs +63 -32
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +37 -14
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +1 -1
- package/dist/lib/cjs/vitest/global-setup.cjs +2 -2
- package/dist/lib/cjs/vitest/typings.d.cts +1 -1
- package/dist/lib/esm/global-setup-core.d.mts +1 -1
- package/dist/lib/esm/global-setup-core.mjs +39 -12
- package/dist/lib/esm/index.d.mts +2 -3
- package/dist/lib/esm/index.mjs +1 -3
- package/dist/lib/esm/kill-process-tree.d.mts +16 -0
- package/dist/lib/esm/kill-process-tree.mjs +23 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/obsidian-config.d.mts +12 -72
- package/dist/lib/esm/obsidian-config.mjs +10 -78
- package/dist/lib/esm/obsidian-installer.d.mts +45 -0
- package/dist/lib/esm/obsidian-installer.mjs +158 -0
- package/dist/lib/esm/obsidian-instance.d.mts +55 -0
- package/dist/lib/esm/obsidian-instance.mjs +75 -0
- package/dist/lib/esm/obsidian-version-switch.d.mts +63 -0
- package/dist/lib/esm/obsidian-version-switch.mjs +89 -0
- package/dist/lib/esm/obsidian-version.d.mts +111 -0
- package/dist/lib/esm/obsidian-version.mjs +55 -0
- package/dist/lib/esm/setup-lock.d.mts +55 -0
- package/dist/lib/esm/setup-lock.mjs +132 -0
- package/dist/lib/esm/transport-desktop-cdp.d.mts +75 -14
- package/dist/lib/esm/transport-desktop-cdp.mjs +125 -7
- package/dist/lib/esm/transport-factory.mjs +68 -28
- package/dist/lib/esm/transport-options.d.mts +37 -14
- package/dist/lib/esm/transport.d.mts +1 -1
- package/dist/lib/esm/vitest/global-setup.mjs +2 -2
- package/dist/lib/esm/vitest/typings.d.mts +1 -1
- package/dist/obsidian-integration-testing-5.0.0.tgz +0 -0
- package/package.json +16 -15
- package/dist/lib/cjs/transport-desktop-cli.cjs +0 -540
- package/dist/lib/cjs/transport-desktop-cli.d.cts +0 -154
- package/dist/lib/esm/transport-desktop-cli.d.mts +0 -154
- package/dist/lib/esm/transport-desktop-cli.mjs +0 -520
- package/dist/obsidian-integration-testing-4.3.0.tgz +0 -0
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@ globalThis.__obsidianIntegrationTesting = {
|
|
|
71
71
|
|
|
72
72
|
After setup, `globalThis.__obsidianIntegrationTesting.tempVaultPath` is available in test workers.
|
|
73
73
|
|
|
74
|
-
By default this
|
|
74
|
+
By default this launches a **harness-owned, isolated `CDP` instance** (a temporary Obsidian that never touches your real config). See [Transport modes](#transport-modes) for version pinning, attaching to a running Obsidian, and mobile.
|
|
75
75
|
|
|
76
76
|
### Write integration tests
|
|
77
77
|
|
|
@@ -365,7 +365,7 @@ Both files share the same `createSetup` instance (via the common module), so `te
|
|
|
365
365
|
>
|
|
366
366
|
> **Parallelism:**
|
|
367
367
|
>
|
|
368
|
-
>
|
|
368
|
+
> A test run shares a single Obsidian instance and one temporary vault. Running test files in parallel makes them race on that shared instance and vault, producing flaky failures. Disable file-level parallelism in your Vitest config:
|
|
369
369
|
>
|
|
370
370
|
> ```ts
|
|
371
371
|
> // vitest.config.ts
|
|
@@ -432,48 +432,20 @@ const title2 = await evalInObsidian({
|
|
|
432
432
|
|
|
433
433
|
The transport determines how the library communicates with Obsidian. Configure it via transport options in your test framework's config (see [Quick start](#quick-start)):
|
|
434
434
|
|
|
435
|
-
| Type
|
|
436
|
-
|
|
437
|
-
| `obsidian-
|
|
438
|
-
| `obsidian-
|
|
439
|
-
| `obsidian-android-appium` | Mobile | Obsidian Android Appium WebView JS injection |
|
|
435
|
+
| Type | Platform | Mechanism |
|
|
436
|
+
|---------------------------|----------|---------------------------------------------|
|
|
437
|
+
| `obsidian-cdp` (default) | Desktop | Obsidian `Chrome DevTools Protocol` (`CDP`) |
|
|
438
|
+
| `obsidian-android-appium` | Mobile | Obsidian Android Appium WebView injection |
|
|
440
439
|
|
|
441
|
-
#### `
|
|
440
|
+
#### `CDP` transport (default)
|
|
442
441
|
|
|
443
|
-
|
|
442
|
+
By default the library **launches and owns an isolated Obsidian instance** in a temporary `--user-data-dir` on a free `--remote-debugging-port`, and communicates with it over the Obsidian `Chrome DevTools Protocol` (`CDP`). The owned instance never touches your real Obsidian — your config, vault registry, running window, and auto-update are all left untouched — and it runs in parallel with your everyday Obsidian.
|
|
444
443
|
|
|
445
444
|
**Setup:**
|
|
446
445
|
|
|
447
|
-
1. [Install
|
|
448
|
-
2. Enable `CLI` in Obsidian: `Settings → General → Developer tools → Enable CLI`.
|
|
449
|
-
|
|
450
|
-
No additional vitest configuration needed — `CLI` is the default transport.
|
|
451
|
-
|
|
452
|
-
#### `CDP` transport
|
|
453
|
-
|
|
454
|
-
Connects via WebSocket to Obsidian `Chrome DevTools Protocol` (`CDP`) endpoint. No `CLI` binary needed, no `CLI enabled` setting required, and lower overhead per eval.
|
|
455
|
-
|
|
456
|
-
**Setup:**
|
|
457
|
-
|
|
458
|
-
1. Launch Obsidian with the `--remote-debugging-port` flag:
|
|
459
|
-
|
|
460
|
-
```powershell
|
|
461
|
-
# Windows (PowerShell) — uses Obsidian from PATH (e.g. scoop), falling back to the installer location
|
|
462
|
-
$obsidian = (Get-Command Obsidian.exe -ErrorAction SilentlyContinue).Source
|
|
463
|
-
if (-not $obsidian) { $obsidian = "$env:LOCALAPPDATA\Programs\Obsidian\Obsidian.exe" }
|
|
464
|
-
Start-Process $obsidian -ArgumentList '--remote-debugging-port=8315'
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
```bash
|
|
468
|
-
# macOS
|
|
469
|
-
/Applications/Obsidian.app/Contents/MacOS/Obsidian --remote-debugging-port=8315
|
|
470
|
-
|
|
471
|
-
# Linux
|
|
472
|
-
obsidian --remote-debugging-port=8315
|
|
473
|
-
```
|
|
474
|
-
|
|
446
|
+
1. [Install Obsidian](https://obsidian.md/download) (the desktop app) so a shell is available to launch.
|
|
475
447
|
2. Ensure [`Node.js`](https://nodejs.org/) 22+ is installed (uses built-in `WebSocket` and `fetch` globals).
|
|
476
|
-
3.
|
|
448
|
+
3. No transport configuration is required — the owned `CDP` instance is the default:
|
|
477
449
|
|
|
478
450
|
```ts
|
|
479
451
|
// vitest.config.ts
|
|
@@ -481,27 +453,52 @@ Connects via WebSocket to Obsidian `Chrome DevTools Protocol` (`CDP`) endpoint.
|
|
|
481
453
|
test: {
|
|
482
454
|
fileParallelism: false,
|
|
483
455
|
globalSetup: ['obsidian-integration-testing/vitest-global-setup'],
|
|
484
|
-
environmentOptions: {
|
|
485
|
-
obsidianTransport: { type: 'obsidian-cdp' },
|
|
486
|
-
},
|
|
487
456
|
},
|
|
488
457
|
});
|
|
489
458
|
```
|
|
490
459
|
|
|
491
|
-
|
|
460
|
+
##### Pinning an Obsidian version
|
|
492
461
|
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
462
|
+
To run the tests against a specific Obsidian version, set `obsidianVersion` and/or `obsidianInstallerVersion`. Each accepts an explicit `'x.y.z'`, `'public-latest'`, or `'catalyst-latest'`. Downloaded asars and installer shells are cached under the system temp dir for reuse.
|
|
463
|
+
|
|
464
|
+
```ts
|
|
465
|
+
environmentOptions: {
|
|
466
|
+
obsidianTransport: {
|
|
467
|
+
type: 'obsidian-cdp',
|
|
468
|
+
// The Obsidian app version (asar). At or above the installed shell version
|
|
469
|
+
// it is applied as a fast asar swap; an older version transparently
|
|
470
|
+
// downloads the matching installer.
|
|
471
|
+
obsidianVersion: '1.8.10',
|
|
472
|
+
},
|
|
473
|
+
}
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
- **`obsidianVersion`** pins the app code (asar). When omitted, the owned instance runs the same version your installed Obsidian currently runs.
|
|
477
|
+
- **`obsidianInstallerVersion`** pins the Electron shell (installer build), downloaded and extracted from the matching GitHub release (Windows installers require [7-Zip](https://www.7-zip.org/) on `PATH`). Public releases only — catalyst/beta builds have no public installer, so a catalyst version can only be pinned at the asar level.
|
|
478
|
+
|
|
479
|
+
##### Attaching to a running Obsidian
|
|
480
|
+
|
|
481
|
+
To attach to an already-running Obsidian instead of owning one, launch Obsidian with `--remote-debugging-port=<port>` and set `port` to that same port (the version-pinning options do not apply in attach mode):
|
|
482
|
+
|
|
483
|
+
```powershell
|
|
484
|
+
# Windows (PowerShell) — uses Obsidian from PATH (e.g. scoop), falling back to the installer location
|
|
485
|
+
$obsidian = (Get-Command Obsidian.exe -ErrorAction SilentlyContinue).Source
|
|
486
|
+
if (-not $obsidian) { $obsidian = "$env:LOCALAPPDATA\Programs\Obsidian\Obsidian.exe" }
|
|
487
|
+
Start-Process $obsidian -ArgumentList '--remote-debugging-port=8315'
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
```ts
|
|
491
|
+
environmentOptions: {
|
|
492
|
+
obsidianTransport: {
|
|
493
|
+
type: 'obsidian-cdp',
|
|
494
|
+
port: 8315, // must match the --remote-debugging-port Obsidian was launched with
|
|
495
|
+
|
|
496
|
+
// default values can be omitted
|
|
497
|
+
host: 'localhost',
|
|
498
|
+
commandTimeoutInMilliseconds: 30000,
|
|
499
|
+
},
|
|
500
|
+
}
|
|
501
|
+
```
|
|
505
502
|
|
|
506
503
|
#### Obsidian Android Appium transport
|
|
507
504
|
|
|
@@ -40,10 +40,11 @@ var import_enable_plugin = require("./enable-plugin.cjs");
|
|
|
40
40
|
var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
|
|
41
41
|
var import_log = require("./log.cjs");
|
|
42
42
|
var import_serialize_error = require("./serialize-error.cjs");
|
|
43
|
+
var import_setup_lock = require("./setup-lock.cjs");
|
|
43
44
|
var import_temp_vault = require("./temp-vault.cjs");
|
|
44
45
|
var import_transport_appium = require("./transport-appium.cjs");
|
|
45
46
|
var import_transport_factory = require("./transport-factory.cjs");
|
|
46
|
-
const DEFAULT_TRANSPORT_TYPE = "obsidian-
|
|
47
|
+
const DEFAULT_TRANSPORT_TYPE = "obsidian-cdp";
|
|
47
48
|
const DIST_DEV = "dist/dev";
|
|
48
49
|
const DIST_BUILD = "dist/build";
|
|
49
50
|
const MAIN_JS = "main.js";
|
|
@@ -53,6 +54,8 @@ const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
|
|
|
53
54
|
const activeSetups = /* @__PURE__ */ new Set();
|
|
54
55
|
const disposedResults = /* @__PURE__ */ new WeakSet();
|
|
55
56
|
let isCleanupHandlerRegistered = false;
|
|
57
|
+
const setupLocks = /* @__PURE__ */ new Map();
|
|
58
|
+
const ANDROID_LOCK_SCOPE = "android";
|
|
56
59
|
async function coreSetup(params) {
|
|
57
60
|
const projectRoot = findProjectRoot();
|
|
58
61
|
const envFilePath = (0, import_node_path.join)(projectRoot, ".env");
|
|
@@ -61,11 +64,19 @@ async function coreSetup(params) {
|
|
|
61
64
|
}
|
|
62
65
|
const transportOptions = params?.transportOptions;
|
|
63
66
|
const label = transportOptions?.type ?? DEFAULT_TRANSPORT_TYPE;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
const lockScope = getLockScope(transportOptions);
|
|
68
|
+
let lock;
|
|
69
|
+
if (lockScope !== void 0) {
|
|
70
|
+
(0, import_log.log)(`[integration-setup:${label}] Acquiring '${lockScope}' setup lock (serializes against any concurrent integration-test run)...`);
|
|
71
|
+
lock = await (0, import_setup_lock.acquireSetupLock)({ label, scope: lockScope });
|
|
72
|
+
(0, import_log.log)(`[integration-setup:${label}] Setup lock acquired.`);
|
|
73
|
+
}
|
|
74
|
+
let transport;
|
|
67
75
|
let tempVault;
|
|
68
76
|
try {
|
|
77
|
+
(0, import_log.log)(`[integration-setup:${label}] Creating transport...`);
|
|
78
|
+
transport = await (0, import_transport_factory.createTransportFromOptions)(transportOptions);
|
|
79
|
+
(0, import_log.log)(`[integration-setup:${label}] Transport created: ${transport.constructor.name}`);
|
|
69
80
|
(0, import_log.log)(`[integration-setup:${label}] Project root: ${projectRoot}`);
|
|
70
81
|
const distPath = await resolveDistPath(projectRoot);
|
|
71
82
|
const manifestJson = JSON.parse(await (0, import_promises.readFile)((0, import_node_path.join)(distPath, "manifest.json"), "utf-8"));
|
|
@@ -106,28 +117,32 @@ async function coreSetup(params) {
|
|
|
106
117
|
throw new Error(`Plugin "${pluginId}" failed to load: ${errorMessage}`);
|
|
107
118
|
}
|
|
108
119
|
(0, import_log.log)(`[integration-setup:${label}] Plugin "${pluginId}" enabled successfully.`);
|
|
120
|
+
const augmentedOptions = augmentTransportOptions(transportOptions, transport);
|
|
121
|
+
const result = { tempVault, transport, transportLabel: label, transportOptions: augmentedOptions };
|
|
122
|
+
activeSetups.add(result);
|
|
123
|
+
if (lock) {
|
|
124
|
+
setupLocks.set(result, lock);
|
|
125
|
+
}
|
|
126
|
+
registerProcessCleanupHandler();
|
|
127
|
+
return result;
|
|
109
128
|
} catch (error) {
|
|
110
129
|
(0, import_log.log)(`[integration-setup:${label}] Setup failed, cleaning up...`);
|
|
111
130
|
try {
|
|
112
|
-
if (tempVault) {
|
|
131
|
+
if (tempVault && transport) {
|
|
113
132
|
await tempVault.dispose(transport);
|
|
114
133
|
}
|
|
115
134
|
} catch (cleanupError) {
|
|
116
135
|
(0, import_log.log)(`[integration-setup:${label}] Vault cleanup error (non-fatal): ${(0, import_serialize_error.serializeError)(cleanupError)}`);
|
|
117
136
|
}
|
|
118
137
|
try {
|
|
119
|
-
await transport
|
|
138
|
+
await transport?.dispose?.();
|
|
120
139
|
} catch (cleanupError) {
|
|
121
140
|
(0, import_log.log)(`[integration-setup:${label}] Transport cleanup error (non-fatal): ${(0, import_serialize_error.serializeError)(cleanupError)}`);
|
|
122
141
|
}
|
|
142
|
+
lock?.release();
|
|
123
143
|
(0, import_log.log)(`[integration-setup:${label}] NOTE: If the test runner reports "No test files found", ignore it \u2014 it is a side effect of the setup failure above.`);
|
|
124
144
|
throw error;
|
|
125
145
|
}
|
|
126
|
-
const augmentedOptions = augmentTransportOptions(transportOptions, transport);
|
|
127
|
-
const result = { tempVault, transport, transportLabel: label, transportOptions: augmentedOptions };
|
|
128
|
-
activeSetups.add(result);
|
|
129
|
-
registerProcessCleanupHandler();
|
|
130
|
-
return result;
|
|
131
146
|
}
|
|
132
147
|
async function coreTeardown(result) {
|
|
133
148
|
if (!result || disposedResults.has(result)) {
|
|
@@ -141,6 +156,7 @@ async function coreTeardown(result) {
|
|
|
141
156
|
(0, import_log.log)(`[integration-teardown:${result.transportLabel}] Cleanup error (non-fatal): ${(0, import_serialize_error.serializeError)(error)}`);
|
|
142
157
|
} finally {
|
|
143
158
|
activeSetups.delete(result);
|
|
159
|
+
releaseSetupLock(result);
|
|
144
160
|
}
|
|
145
161
|
}
|
|
146
162
|
function augmentTransportOptions(options, transport) {
|
|
@@ -168,6 +184,9 @@ function findProjectRoot() {
|
|
|
168
184
|
dir = parent;
|
|
169
185
|
}
|
|
170
186
|
}
|
|
187
|
+
function getLockScope(transportOptions) {
|
|
188
|
+
return transportOptions?.type === "obsidian-android-appium" ? ANDROID_LOCK_SCOPE : void 0;
|
|
189
|
+
}
|
|
171
190
|
function registerProcessCleanupHandler() {
|
|
172
191
|
if (isCleanupHandlerRegistered) {
|
|
173
192
|
return;
|
|
@@ -211,10 +230,18 @@ function registerProcessCleanupHandler() {
|
|
|
211
230
|
} catch (error) {
|
|
212
231
|
(0, import_log.log)(`[integration-teardown:${result.transportLabel}] Sync vault cleanup error (non-fatal): ${(0, import_serialize_error.serializeError)(error)}`);
|
|
213
232
|
}
|
|
233
|
+
releaseSetupLock(result);
|
|
214
234
|
}
|
|
215
235
|
activeSetups.clear();
|
|
216
236
|
});
|
|
217
237
|
}
|
|
238
|
+
function releaseSetupLock(result) {
|
|
239
|
+
const lock = setupLocks.get(result);
|
|
240
|
+
if (lock) {
|
|
241
|
+
lock.release();
|
|
242
|
+
setupLocks.delete(result);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
218
245
|
async function resolveDistPath(projectRoot) {
|
|
219
246
|
const devPath = (0, import_node_path.join)(projectRoot, DIST_DEV);
|
|
220
247
|
const buildPath = (0, import_node_path.join)(projectRoot, DIST_BUILD);
|
|
@@ -250,4 +277,4 @@ async function teardownAsync(result) {
|
|
|
250
277
|
coreSetup,
|
|
251
278
|
coreTeardown
|
|
252
279
|
});
|
|
253
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBQb3B1bGF0ZUZpbGVzUGFyYW1zIH0gZnJvbSAnLi90ZW1wLXZhdWx0LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlIH0gZnJvbSAnLi9lbmFibGUtcGx1Z2luLmNqcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemUtZXJyb3IuY2pzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuaW1wb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLmNqcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkuY2pzJztcblxuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jbGknO1xuY29uc3QgRElTVF9ERVYgPSAnZGlzdC9kZXYnO1xuY29uc3QgRElTVF9CVUlMRCA9ICdkaXN0L2J1aWxkJztcbmNvbnN0IE1BSU5fSlMgPSAnbWFpbi5qcyc7XG5jb25zdCBPQlNJRElBTl9DT05GSUdfRElSID0gJy5vYnNpZGlhbic7XG5jb25zdCBQTFVHSU5TX0RJUiA9ICdwbHVnaW5zJztcbmNvbnN0IENPTU1VTklUWV9QTFVHSU5TX0pTT04gPSAnY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5cbi8qKlxuICogVHJhY2tzIHNldHVwcyB0aGF0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYnV0IGhhdmVuJ3QgYmVlbiB0b3JuIGRvd24geWV0LlxuICogVXNlZCBieSB0aGUgYGJlZm9yZUV4aXRgIGhhbmRsZXIgdG8gY2xlYW4gdXAgd2hlbiBhIHRlc3QgcnVubmVyIGV4aXRzXG4gKiB3aXRob3V0IGNhbGxpbmcgdGVhcmRvd24gKGUuZy4sIHdoZW4gb25lIHByb2plY3QncyBzZXR1cCBmYWlscyBhbmQgdGhlXG4gKiBydW5uZXIgYWJvcnRzIGJlZm9yZSB0ZWFyaW5nIGRvd24gYWxyZWFkeS1pbml0aWFsaXplZCBwcm9qZWN0cykuXG4gKi9cbmNvbnN0IGFjdGl2ZVNldHVwcyA9IG5ldyBTZXQ8Q29yZVNldHVwUmVzdWx0PigpO1xuY29uc3QgZGlzcG9zZWRSZXN1bHRzID0gbmV3IFdlYWtTZXQ8Q29yZVNldHVwUmVzdWx0PigpO1xubGV0IGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gZmFsc2U7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcmVTZXR1cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIEZpbGVzIGFuZCBmb2xkZXJzIHRvIHdyaXRlIGludG8gdGhlIHZhdWx0ICoqYmVmb3JlKiogT2JzaWRpYW4gb3BlbnMgaXQsIHNvXG4gICAqIGl0cyBzdGFydHVwIHNjYW4gaW5kZXhlcyB0aGVtIGluIG9uZSBwYXNzIChzZWUge0BsaW5rIFRlbXBWYXVsdC5wb3B1bGF0ZX0pLlxuICAgKiBVc2UgdGhpcyBmb3IgbGFyZ2UgZml4dHVyZXMgXHUyMDE0IHdyaXRpbmcgdGhvdXNhbmRzIG9mIG5vdGVzIGFmdGVyIG9wZW4gYW5kXG4gICAqIGZvcmNpbmcgYSByZS1zY2FuIGlzIGZhciBzbG93ZXIgYW5kIGxlc3MgcmVsaWFibGUuXG4gICAqL1xuICByZWFkb25seSBwb3B1bGF0ZT86IFBvcHVsYXRlRmlsZXNQYXJhbXMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRyYW5zcG9ydCBvcHRpb25zLiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHRoZSBDTEkgdHJhbnNwb3J0LiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSB7QGxpbmsgY29yZVNldHVwfSwgdXNlZCBieSBmcmFtZXdvcmsgYWRhcHRlcnNcbiAqIHRvIHBhc3MgY29udGV4dCB0byB0ZXN0IHdvcmtlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUmVzdWx0IHtcbiAgLyoqIFRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IGluc3RhbmNlIHVzZWQgZHVyaW5nIHNldHVwLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzIChlLmcuIGBcIm9ic2lkaWFuLWNsaVwiYCwgYFwib2JzaWRpYW4tY2RwXCJgKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0TGFiZWw6IHN0cmluZztcblxuICAvKiogVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgc2V0dXAgbG9naWMuXG4gKlxuICogTG9hZHMgYC5lbnZgIGZyb20gdGhlIHByb2plY3Qgcm9vdCwgY3JlYXRlcyBhIHRyYW5zcG9ydCwgY29waWVzIHRoZSBidWlsdFxuICogcGx1Z2luIGludG8gYSB0ZW1wb3JhcnkgdmF1bHQsIHJlZ2lzdGVycyB0aGUgdmF1bHQgd2l0aCBPYnNpZGlhbiwgYW5kXG4gKiBlbmFibGVzIHRoZSBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcGFyYW1zPy50cmFuc3BvcnRPcHRpb25zO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0aW5nIHRyYW5zcG9ydC4uLmApO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gIGxldCB0ZW1wVmF1bHQ6IFRlbXBWYXVsdCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gICAgY29uc3QgZGlzdFBhdGggPSBhd2FpdCByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3QpO1xuICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICAgIGNvbnN0IHBsdWdpbklkID0gbWFuaWZlc3RKc29uLmlkO1xuXG4gICAgaWYgKHRyYW5zcG9ydC5pc01vYmlsZSAmJiBtYW5pZmVzdEpzb24uaXNEZXNrdG9wT25seSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgaXNEZXNrdG9wT25seTogdHJ1ZSBpbiBtYW5pZmVzdC5qc29uLiBNb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgY2Fubm90IHJ1biBmb3IgZGVza3RvcC1vbmx5IHBsdWdpbnMuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgICBjb25zdCBidWlsZFN0YXQgPSBhd2FpdCBzdGF0KG1haW5Kcyk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVXNpbmcgJHtkaXN0UGF0aH0gKCR7YnVpbGRTdGF0Lm10aW1lLnRvSVNPU3RyaW5nKCl9KS4gSWYgb3V0ZGF0ZWQsIHJlYnVpbGQuYCk7XG5cbiAgICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wVmF1bHQucGF0aH1gKTtcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBqb2luKHRlbXBWYXVsdC5wYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICAgIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIENPTU1VTklUWV9QTFVHSU5TX0pTT04pLCBKU09OLnN0cmluZ2lmeShbcGx1Z2luSWRdKSk7XG5cbiAgICBpZiAocGFyYW1zPy5wb3B1bGF0ZSkge1xuICAgICAgY29uc3QgZW50cnlDb3VudCA9IE9iamVjdC5rZXlzKHBhcmFtcy5wb3B1bGF0ZSkubGVuZ3RoO1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBvcHVsYXRpbmcgdmF1bHQgd2l0aCAke1N0cmluZyhlbnRyeUNvdW50KX0gZW50cmllcyBiZWZvcmUgb3Blbi4uLmApO1xuICAgICAgdGVtcFZhdWx0LnBvcHVsYXRlKHBhcmFtcy5wb3B1bGF0ZSk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFN5bmNpbmcgdmF1bHQgdG8gZGV2aWNlLi4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnN5bmNUb0RldmljZSh0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBSZWdpc3RlcmluZyB2YXVsdC4uLmApO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5yZWdpc3Rlcih0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCByZWdpc3RlcmVkLmApO1xuXG4gICAgLy8gRW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQuIE9ic2lkaWFuJ3MgZW5hYmxlUGx1Z2luKCkgd3JhcHNcbiAgICAvLyBMb2FkUGx1Z2luKCkgaW4gYSB0cnktY2F0Y2ggdGhhdCBzd2FsbG93cyBlcnJvcnMgYW5kIHJldHVybnMgZmFsc2UuXG4gICAgLy8gV2UgbW9ua2V5LXBhdGNoIGxvYWRQbHVnaW4oKSB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsaW5nIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIuLi5gKTtcbiAgICBjb25zdCB7IGVycm9yTWVzc2FnZSB9ID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgYXJnczogeyBwbHVnaW5JZCB9LFxuICAgICAgZm46IGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgdHJhbnNwb3J0LFxuICAgICAgdmF1bHRQYXRoOiB0ZW1wVmF1bHQucGF0aFxuICAgIH0pO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2V0dXAgZmFpbGVkLCBjbGVhbmluZyB1cC4uLmApO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGVtcFZhdWx0KSB7XG4gICAgICAgIGF3YWl0IHRlbXBWYXVsdC5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihjbGVhbnVwRXJyb3IpfWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIE5PVEU6IElmIHRoZSB0ZXN0IHJ1bm5lciByZXBvcnRzIFwiTm8gdGVzdCBmaWxlcyBmb3VuZFwiLCBpZ25vcmUgaXQgXHUyMDE0IGl0IGlzIGEgc2lkZSBlZmZlY3Qgb2YgdGhlIHNldHVwIGZhaWx1cmUgYWJvdmUuYCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBjb25zdCBhdWdtZW50ZWRPcHRpb25zID0gYXVnbWVudFRyYW5zcG9ydE9wdGlvbnModHJhbnNwb3J0T3B0aW9ucywgdHJhbnNwb3J0KTtcbiAgY29uc3QgcmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQgPSB7IHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRMYWJlbDogbGFiZWwsIHRyYW5zcG9ydE9wdGlvbnM6IGF1Z21lbnRlZE9wdGlvbnMgfTtcbiAgYWN0aXZlU2V0dXBzLmFkZChyZXN1bHQpO1xuICByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgdGVhcmRvd24gbG9naWMuXG4gKlxuICogRGlzcG9zZXMgb2YgdGhlIHRlbXBvcmFyeSB2YXVsdCBhbmQgdHJhbnNwb3J0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmVzdWx0IGZyb20ge0BsaW5rIGNvcmVTZXR1cH0uIFdoZW4gYHVuZGVmaW5lZGAsIGRvZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVUZWFyZG93bihyZXN1bHQ/OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXN1bHQgfHwgZGlzcG9zZWRSZXN1bHRzLmhhcyhyZXN1bHQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRpc3Bvc2VkUmVzdWx0cy5hZGQocmVzdWx0KTtcblxuICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRlYXJpbmcgZG93bi4uLmApO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGVhcmRvd25Bc3luYyhyZXN1bHQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gQ2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlU2V0dXBzLmRlbGV0ZShyZXN1bHQpO1xuICB9XG59XG5cbi8qKlxuICogQXVnbWVudHMgdHJhbnNwb3J0IG9wdGlvbnMgd2l0aCBzZXNzaW9uIHJldXNlIGluZm8gd2hlbiB0aGUgdHJhbnNwb3J0XG4gKiBzdXBwb3J0cyBpdCAoY3VycmVudGx5IEFwcGl1bSBvbmx5KS5cbiAqXG4gKiBUaGUgYXVnbWVudGVkIG9wdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2VycyBzbyB0aGV5IGNhbiByZWF0dGFjaFxuICogdG8gdGhlIGV4aXN0aW5nIHNlc3Npb24gaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlICE9PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nIHx8ICEodHJhbnNwb3J0IGluc3RhbmNlb2YgQXBwaXVtVHJhbnNwb3J0KSkge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgY29uc3Qgc2Vzc2lvbkluZm8gPSB0cmFuc3BvcnQuZ2V0U2Vzc2lvbkluZm8oKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGRldmljZUlkOiBzZXNzaW9uSW5mby5kZXZpY2VJZCxcbiAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICB9O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXIsICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBjbGVhbnVwIGhhbmRsZXJzIGZvciBvcnBoYW5lZCBzZXR1cHMgdGhhdCB3ZXJlIG5ldmVyIGV4cGxpY2l0bHlcbiAqIHRvcm4gZG93bi5cbiAqXG4gKiBUd28gaGFuZGxlcnMgY292ZXIgZGlmZmVyZW50IGV4aXQgc2NlbmFyaW9zOlxuICpcbiAqIC0gYGJlZm9yZUV4aXRgIFx1MjAxNCBmaXJlcyB3aGVuIHRoZSBldmVudCBsb29wIGRyYWlucyBuYXR1cmFsbHkuIEFsbG93cyBmdWxsXG4gKiAgIGFzeW5jIHRlYXJkb3duICh1bnJlZ2lzdGVyIHZhdWx0cywgZGlzcG9zZSB0cmFuc3BvcnRzKS4gRG9lcyBOT1QgZmlyZVxuICogICB3aGVuIGBwcm9jZXNzLmV4aXQoKWAgaXMgY2FsbGVkIGRpcmVjdGx5LlxuICpcbiAqIC0gYHVuaGFuZGxlZFJlamVjdGlvbmAgXHUyMDE0IGNhdGNoZXMgYXN5bmMgZXJyb3JzIHRoYXQgYnlwYXNzIGBjb3JlU2V0dXBgJ3NcbiAqICAgY2F0Y2ggYmxvY2suIFBlcmZvcm1zIGZ1bGwgYXN5bmMgdGVhcmRvd24gd2hpbGUgd2Ugc3RpbGwgY2FuLlxuICpcbiAqIC0gYGV4aXRgIFx1MjAxNCBmaXJlcyBvbiBldmVyeSBleGl0LCBpbmNsdWRpbmcgYHByb2Nlc3MuZXhpdCgpYC4gT25seSBzeW5jaHJvbm91c1xuICogICB3b3JrIGlzIHBvc3NpYmxlLCBzbyB0aGlzIGhhbmRsZXIgZG9lcyBiZXN0LWVmZm9ydCBjbGVhbnVwOiBraWxscyBjaGlsZFxuICogICBwcm9jZXNzZXMgdmlhIGBkaXNwb3NlU3luYygpYCBhbmQgcmVtb3ZlcyB0ZW1wIHZhdWx0IGRpcmVjdG9yaWVzIHdpdGhcbiAqICAgYHJtU3luY2AuIFVucmVnaXN0ZXJpbmcgdmF1bHRzICh3aGljaCByZXF1aXJlcyBJUEMgd2l0aCBPYnNpZGlhbikgaXNcbiAqICAgc2tpcHBlZCBcdTIwMTQgYSBzdGFsZSB2YXVsdCBlbnRyeSBpcyBhbiBhY2NlcHRhYmxlIHRyYWRlLW9mZiB2cy4gbGVha2VkXG4gKiAgIHByb2Nlc3NlcyBhbmQgdGVtcCBkaXJlY3Rvcmllcy5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTogdm9pZCB7XG4gIGlmIChpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBleGl0aW5nIHdpdGggJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBzZXR1cChzKSBub3QgdG9ybiBkb3duLiBDbGVhbmluZyB1cC4uLmApO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFByb2Nlc3MgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gVW5oYW5kbGVkIHJlamVjdGlvbiBkZXRlY3RlZC4gVGVhcmluZyBkb3duICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gYWN0aXZlIHNldHVwKHMpLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFJlamVjdGlvbiBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gU3luYyBjbGVhbnVwOiAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IG9ycGhhbmVkIHNldHVwKHMpLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBybVN5bmMocmVzdWx0LnRlbXBWYXVsdC5wYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFjdGl2ZVNldHVwcy5jbGVhcigpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZGlzdCBwYXRoIHRvIHVzZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogUGlja3Mgd2hpY2hldmVyIG9mIGBkaXN0L2RldmAgYW5kIGBkaXN0L2J1aWxkYCBoYXMgYSBuZXdlciBgbWFpbi5qc2AuXG4gKiBJZiBvbmx5IG9uZSBleGlzdHMsIHRoYXQgb25lIGlzIHVzZWQuIFRocm93cyBpZiBuZWl0aGVyIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGNob3NlbiBkaXN0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXZQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9ERVYpO1xuICBjb25zdCBidWlsZFBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0JVSUxEKTtcbiAgY29uc3QgZGV2TWFpbkpzID0gam9pbihkZXZQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRNYWluSnMgPSBqb2luKGJ1aWxkUGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGRldlN0YXQgPSBleGlzdHNTeW5jKGRldk1haW5KcykgPyBhd2FpdCBzdGF0KGRldk1haW5KcykgOiBudWxsO1xuICBjb25zdCBidWlsZFN0YXQgPSBleGlzdHNTeW5jKGJ1aWxkTWFpbkpzKSA/IGF3YWl0IHN0YXQoYnVpbGRNYWluSnMpIDogbnVsbDtcblxuICBpZiAoZGV2U3RhdCAmJiBidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gZGV2U3RhdC5tdGltZSA+IGJ1aWxkU3RhdC5tdGltZSA/IGRldlBhdGggOiBidWlsZFBhdGg7XG4gIH1cblxuICBpZiAoZGV2U3RhdCkge1xuICAgIHJldHVybiBkZXZQYXRoO1xuICB9XG5cbiAgaWYgKGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBidWlsZFBhdGg7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJ1aWxkIGZvdW5kLiBSdW4gYG5wbSBydW4gYnVpbGRgIG9yIGBucG0gcnVuIGRldmAgZmlyc3QuJyk7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFzeW5jIHRlYXJkb3duIHdvcmsgKHZhdWx0IGRpc3Bvc2FsICsgdHJhbnNwb3J0IGRpc3Bvc2FsKS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB0byB0ZWFyIGRvd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duQXN5bmMocmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcFZhdWx0LmRpc3Bvc2UocmVzdWx0LnRyYW5zcG9ydCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBLHFCQUdPO0FBQ1Asc0JBTU87QUFDUCx1QkFBcUI7QUFDckIsMEJBQXFDO0FBTXJDLDJCQUE2QztBQUM3Qyw4QkFBK0I7QUFDL0IsaUJBQW9CO0FBQ3BCLDZCQUErQjtBQUMvQix3QkFBMEI7QUFDMUIsOEJBQWdDO0FBQ2hDLCtCQUEyQztBQUUzQyxNQUFNLHlCQUF5QjtBQUMvQixNQUFNLFdBQVc7QUFDakIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUFRL0IsTUFBTSxlQUFlLG9CQUFJLElBQXFCO0FBQzlDLE1BQU0sa0JBQWtCLG9CQUFJLFFBQXlCO0FBQ3JELElBQUksNkJBQTZCO0FBOENqQyxlQUFzQixVQUFVLFFBQW9EO0FBQ2xGLFFBQU0sY0FBYyxnQkFBZ0I7QUFDcEMsUUFBTSxrQkFBYyx1QkFBSyxhQUFhLE1BQU07QUFDNUMsVUFBSSwyQkFBVyxXQUFXLEdBQUc7QUFDM0IseUNBQVksV0FBVztBQUFBLEVBQ3pCO0FBRUEsUUFBTSxtQkFBbUIsUUFBUTtBQUNqQyxRQUFNLFFBQVEsa0JBQWtCLFFBQVE7QUFDeEMsc0JBQUksc0JBQXNCLEtBQUsseUJBQXlCO0FBQ3hELFFBQU0sWUFBWSxVQUFNLHFEQUEyQixnQkFBZ0I7QUFDbkUsc0JBQUksc0JBQXNCLEtBQUssd0JBQXdCLFVBQVUsWUFBWSxJQUFJLEVBQUU7QUFFbkYsTUFBSTtBQUVKLE1BQUk7QUFDRix3QkFBSSxzQkFBc0IsS0FBSyxtQkFBbUIsV0FBVyxFQUFFO0FBQy9ELFVBQU0sV0FBVyxNQUFNLGdCQUFnQixXQUFXO0FBQ2xELFVBQU0sZUFBZSxLQUFLLE1BQU0sVUFBTSw4QkFBUyx1QkFBSyxVQUFVLGVBQWUsR0FBRyxPQUFPLENBQUM7QUFDeEYsVUFBTSxXQUFXLGFBQWE7QUFFOUIsUUFBSSxVQUFVLFlBQVksYUFBYSxlQUFlO0FBQ3BELFlBQU0sSUFBSTtBQUFBLFFBQ1IsV0FBVyxRQUFRO0FBQUEsTUFDckI7QUFBQSxJQUNGO0FBRUEsVUFBTSxhQUFTLHVCQUFLLFVBQVUsT0FBTztBQUNyQyxVQUFNLFlBQVksVUFBTSxzQkFBSyxNQUFNO0FBRW5DLHdCQUFJLHNCQUFzQixLQUFLLFdBQVcsUUFBUSxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUMsMEJBQTBCO0FBRTlHLGdCQUFZLElBQUksNEJBQVU7QUFDMUIsd0JBQUksc0JBQXNCLEtBQUsseUJBQXlCLFVBQVUsSUFBSSxFQUFFO0FBQ3hFLFVBQU0sZ0JBQVksdUJBQUssVUFBVSxNQUFNLHFCQUFxQixhQUFhLFFBQVE7QUFDakYsY0FBTSx1QkFBTSxXQUFXLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDMUMsY0FBTSxvQkFBRyxVQUFVLFdBQVcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNqRCxjQUFNLCtCQUFVLHVCQUFLLFVBQVUsTUFBTSxxQkFBcUIsc0JBQXNCLEdBQUcsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0csUUFBSSxRQUFRLFVBQVU7QUFDcEIsWUFBTSxhQUFhLE9BQU8sS0FBSyxPQUFPLFFBQVEsRUFBRTtBQUNoRCwwQkFBSSxzQkFBc0IsS0FBSywyQkFBMkIsT0FBTyxVQUFVLENBQUMseUJBQXlCO0FBQ3JHLGdCQUFVLFNBQVMsT0FBTyxRQUFRO0FBQUEsSUFDcEM7QUFFQSx3QkFBSSxzQkFBc0IsS0FBSyw4QkFBOEI7QUFDN0QsVUFBTSxVQUFVLGFBQWEsU0FBUztBQUN0Qyx3QkFBSSxzQkFBc0IsS0FBSyx3QkFBd0I7QUFDdkQsVUFBTSxVQUFVLFNBQVMsU0FBUztBQUNsQyx3QkFBSSxzQkFBc0IsS0FBSyxxQkFBcUI7QUFLcEQsd0JBQUksc0JBQXNCLEtBQUssc0JBQXNCLFFBQVEsTUFBTTtBQUNuRSxVQUFNLEVBQUUsYUFBYSxJQUFJLFVBQU0sd0NBQWU7QUFBQSxNQUM1QyxNQUFNLEVBQUUsU0FBUztBQUFBLE1BQ2pCLElBQUk7QUFBQSxNQUNKLDJCQUEyQjtBQUFBLE1BQzNCO0FBQUEsTUFDQSxXQUFXLFVBQVU7QUFBQSxJQUN2QixDQUFDO0FBRUQsUUFBSSxjQUFjO0FBQ2hCLFlBQU0sSUFBSSxNQUFNLFdBQVcsUUFBUSxxQkFBcUIsWUFBWSxFQUFFO0FBQUEsSUFDeEU7QUFFQSx3QkFBSSxzQkFBc0IsS0FBSyxhQUFhLFFBQVEseUJBQXlCO0FBQUEsRUFDL0UsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSxzQkFBc0IsS0FBSyxnQ0FBZ0M7QUFDL0QsUUFBSTtBQUNGLFVBQUksV0FBVztBQUNiLGNBQU0sVUFBVSxRQUFRLFNBQVM7QUFBQSxNQUNuQztBQUFBLElBQ0YsU0FBUyxjQUF1QjtBQUM5QiwwQkFBSSxzQkFBc0IsS0FBSywwQ0FBc0MsdUNBQWUsWUFBWSxDQUFDLEVBQUU7QUFBQSxJQUNyRztBQUNBLFFBQUk7QUFDRixZQUFNLFVBQVUsVUFBVTtBQUFBLElBQzVCLFNBQVMsY0FBdUI7QUFDOUIsMEJBQUksc0JBQXNCLEtBQUssOENBQTBDLHVDQUFlLFlBQVksQ0FBQyxFQUFFO0FBQUEsSUFDekc7QUFFQSx3QkFBSSxzQkFBc0IsS0FBSyw0SEFBdUg7QUFDdEosVUFBTTtBQUFBLEVBQ1I7QUFFQSxRQUFNLG1CQUFtQix3QkFBd0Isa0JBQWtCLFNBQVM7QUFDNUUsUUFBTSxTQUEwQixFQUFFLFdBQVcsV0FBVyxnQkFBZ0IsT0FBTyxrQkFBa0IsaUJBQWlCO0FBQ2xILGVBQWEsSUFBSSxNQUFNO0FBQ3ZCLGdDQUE4QjtBQUM5QixTQUFPO0FBQ1Q7QUFTQSxlQUFzQixhQUFhLFFBQXlDO0FBQzFFLE1BQUksQ0FBQyxVQUFVLGdCQUFnQixJQUFJLE1BQU0sR0FBRztBQUMxQztBQUFBLEVBQ0Y7QUFDQSxrQkFBZ0IsSUFBSSxNQUFNO0FBRTFCLHNCQUFJLHlCQUF5QixPQUFPLGNBQWMsbUJBQW1CO0FBRXJFLE1BQUk7QUFDRixVQUFNLGNBQWMsTUFBTTtBQUFBLEVBQzVCLFNBQVMsT0FBZ0I7QUFDdkIsd0JBQUkseUJBQXlCLE9BQU8sY0FBYyxvQ0FBZ0MsdUNBQWUsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUMzRyxVQUFFO0FBQ0EsaUJBQWEsT0FBTyxNQUFNO0FBQUEsRUFDNUI7QUFDRjtBQWFBLFNBQVMsd0JBQ1AsU0FDQSxXQUNzQztBQUN0QyxNQUFJLFNBQVMsU0FBUyw2QkFBNkIsRUFBRSxxQkFBcUIsMENBQWtCO0FBQzFGLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxjQUFjLFVBQVUsZUFBZTtBQUM3QyxzQkFBSSxzQkFBc0IsUUFBUSxJQUFJLG1DQUFtQyxZQUFZLFNBQVMsY0FBYyxZQUFZLFFBQVEsRUFBRTtBQUVsSSxTQUFPO0FBQUEsSUFDTCxHQUFHO0FBQUEsSUFDSCxVQUFVLFlBQVk7QUFBQSxJQUN0QixXQUFXLFlBQVk7QUFBQSxFQUN6QjtBQUNGO0FBT0EsU0FBUyxrQkFBMEI7QUFDakMsTUFBSSxNQUFNLG9CQUFBQSxRQUFRLElBQUk7QUFHdEIsU0FBTyxNQUFNO0FBQ1gsWUFBSSwrQkFBVyx1QkFBSyxLQUFLLGNBQWMsQ0FBQyxHQUFHO0FBQ3pDLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxhQUFTLHVCQUFLLEtBQUssSUFBSTtBQUM3QixRQUFJLFdBQVcsS0FBSztBQUNsQixZQUFNLElBQUksTUFBTSxzREFBc0Q7QUFBQSxJQUN4RTtBQUNBLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFzQkEsU0FBUyxnQ0FBc0M7QUFDN0MsTUFBSSw0QkFBNEI7QUFDOUI7QUFBQSxFQUNGO0FBQ0EsK0JBQTZCO0FBRTdCLHNCQUFBQSxRQUFRLEdBQUcsY0FBYyxNQUFNO0FBQzdCLFFBQUksYUFBYSxTQUFTLEdBQUc7QUFDM0I7QUFBQSxJQUNGO0FBRUEsd0JBQUksK0NBQStDLE9BQU8sYUFBYSxJQUFJLENBQUMseUNBQXlDO0FBRXJILGVBQVcsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHO0FBQ3RDLG1CQUFhLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBbUI7QUFDN0MsNEJBQUkseUJBQXlCLE9BQU8sY0FBYyw0Q0FBd0MsdUNBQWUsS0FBSyxDQUFDLEVBQUU7QUFBQSxNQUNuSCxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0YsQ0FBQztBQUVELHNCQUFBQSxRQUFRLEdBQUcsc0JBQXNCLE1BQU07QUFDckMsUUFBSSxhQUFhLFNBQVMsR0FBRztBQUMzQjtBQUFBLElBQ0Y7QUFFQSx3QkFBSSxxRUFBcUUsT0FBTyxhQUFhLElBQUksQ0FBQyxxQkFBcUI7QUFDdkgsZUFBVyxVQUFVLENBQUMsR0FBRyxZQUFZLEdBQUc7QUFDdEMsbUJBQWEsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFtQjtBQUM3Qyw0QkFBSSx5QkFBeUIsT0FBTyxjQUFjLDhDQUEwQyx1Q0FBZSxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3JILENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRixDQUFDO0FBRUQsc0JBQUFBLFFBQVEsR0FBRyxRQUFRLE1BQU07QUFDdkIsUUFBSSxhQUFhLFNBQVMsR0FBRztBQUMzQjtBQUFBLElBQ0Y7QUFFQSx3QkFBSSx3Q0FBd0MsT0FBTyxhQUFhLElBQUksQ0FBQyxxQkFBcUI7QUFDMUYsZUFBVyxVQUFVLENBQUMsR0FBRyxZQUFZLEdBQUc7QUFDdEMsVUFBSTtBQUNGLGVBQU8sVUFBVSxjQUFjO0FBQUEsTUFDakMsU0FBUyxPQUFnQjtBQUN2Qiw0QkFBSSx5QkFBeUIsT0FBTyxjQUFjLG1EQUErQyx1Q0FBZSxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQzFIO0FBQ0EsVUFBSTtBQUNGLG1DQUFPLE9BQU8sVUFBVSxNQUFNLEVBQUUsT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQUEsTUFDaEUsU0FBUyxPQUFnQjtBQUN2Qiw0QkFBSSx5QkFBeUIsT0FBTyxjQUFjLCtDQUEyQyx1Q0FBZSxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3RIO0FBQUEsSUFDRjtBQUNBLGlCQUFhLE1BQU07QUFBQSxFQUNyQixDQUFDO0FBQ0g7QUFXQSxlQUFlLGdCQUFnQixhQUFzQztBQUNuRSxRQUFNLGNBQVUsdUJBQUssYUFBYSxRQUFRO0FBQzFDLFFBQU0sZ0JBQVksdUJBQUssYUFBYSxVQUFVO0FBQzlDLFFBQU0sZ0JBQVksdUJBQUssU0FBUyxPQUFPO0FBQ3ZDLFFBQU0sa0JBQWMsdUJBQUssV0FBVyxPQUFPO0FBQzNDLFFBQU0sY0FBVSwyQkFBVyxTQUFTLElBQUksVUFBTSxzQkFBSyxTQUFTLElBQUk7QUFDaEUsUUFBTSxnQkFBWSwyQkFBVyxXQUFXLElBQUksVUFBTSxzQkFBSyxXQUFXLElBQUk7QUFFdEUsTUFBSSxXQUFXLFdBQVc7QUFDeEIsV0FBTyxRQUFRLFFBQVEsVUFBVSxRQUFRLFVBQVU7QUFBQSxFQUNyRDtBQUVBLE1BQUksU0FBUztBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxXQUFXO0FBQ2IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLElBQUksTUFBTSw2REFBNkQ7QUFDL0U7QUFPQSxlQUFlLGNBQWMsUUFBd0M7QUFDbkUsTUFBSTtBQUNGLFVBQU0sT0FBTyxVQUFVLFFBQVEsT0FBTyxTQUFTO0FBQUEsRUFDakQsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSx5QkFBeUIsT0FBTyxjQUFjLDBDQUFzQyx1Q0FBZSxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQ2pIO0FBRUEsTUFBSTtBQUNGLFVBQU0sT0FBTyxVQUFVLFVBQVU7QUFBQSxFQUNuQyxTQUFTLE9BQWdCO0FBQ3ZCLHdCQUFJLHlCQUF5QixPQUFPLGNBQWMsOENBQTBDLHVDQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDckg7QUFDRjsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
|
|
280
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2suY2pzJztcbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5janMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVFcnJvciB9IGZyb20gJy4vc2VyaWFsaXplLWVycm9yLmNqcyc7XG5pbXBvcnQgeyBhY3F1aXJlU2V0dXBMb2NrIH0gZnJvbSAnLi9zZXR1cC1sb2NrLmNqcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFRyYWNrcyBzZXR1cHMgdGhhdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBoYXZlbid0IGJlZW4gdG9ybiBkb3duIHlldC5cbiAqIFVzZWQgYnkgdGhlIGBiZWZvcmVFeGl0YCBoYW5kbGVyIHRvIGNsZWFuIHVwIHdoZW4gYSB0ZXN0IHJ1bm5lciBleGl0c1xuICogd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIChlLmcuLCB3aGVuIG9uZSBwcm9qZWN0J3Mgc2V0dXAgZmFpbHMgYW5kIHRoZVxuICogcnVubmVyIGFib3J0cyBiZWZvcmUgdGVhcmluZyBkb3duIGFscmVhZHktaW5pdGlhbGl6ZWQgcHJvamVjdHMpLlxuICovXG5jb25zdCBhY3RpdmVTZXR1cHMgPSBuZXcgU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmNvbnN0IGRpc3Bvc2VkUmVzdWx0cyA9IG5ldyBXZWFrU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmxldCBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBjcm9zcy1wcm9jZXNzIHNldHVwIGxvY2sgaGVsZCBieSBlYWNoIGFjdGl2ZSBzZXR1cC4gUmVsZWFzZWQgd2hlbiB0aGVcbiAqIHNldHVwIGlzIHRvcm4gZG93biAob3IgYnkgdGhlIHByb2Nlc3MgY2xlYW51cCBoYW5kbGVycyksIGFsbG93aW5nIGEgY29tcGV0aW5nXG4gKiBydW4gdG8gcHJvY2VlZC4gU2VlIHtAbGluayBhY3F1aXJlU2V0dXBMb2NrfS5cbiAqL1xuY29uc3Qgc2V0dXBMb2NrcyA9IG5ldyBNYXA8Q29yZVNldHVwUmVzdWx0LCBTZXR1cExvY2s+KCk7XG5cbmNvbnN0IEFORFJPSURfTE9DS19TQ09QRSA9ICdhbmRyb2lkJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKipcbiAgICogRmlsZXMgYW5kIGZvbGRlcnMgdG8gd3JpdGUgaW50byB0aGUgdmF1bHQgKipiZWZvcmUqKiBPYnNpZGlhbiBvcGVucyBpdCwgc29cbiAgICogaXRzIHN0YXJ0dXAgc2NhbiBpbmRleGVzIHRoZW0gaW4gb25lIHBhc3MgKHNlZSB7QGxpbmsgVGVtcFZhdWx0LnBvcHVsYXRlfSkuXG4gICAqIFVzZSB0aGlzIGZvciBsYXJnZSBmaXh0dXJlcyBcdTIwMTQgd3JpdGluZyB0aG91c2FuZHMgb2Ygbm90ZXMgYWZ0ZXIgb3BlbiBhbmRcbiAgICogZm9yY2luZyBhIHJlLXNjYW4gaXMgZmFyIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvcHVsYXRlPzogUG9wdWxhdGVGaWxlc1BhcmFtcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gdGhlIENMSSB0cmFuc3BvcnQuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgcmVhZG9ubHkgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMgKGUuZy4gYFwib2JzaWRpYW4tY2RwXCJgKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0TGFiZWw6IHN0cmluZztcblxuICAvKiogVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgc2V0dXAgbG9naWMuXG4gKlxuICogTG9hZHMgYC5lbnZgIGZyb20gdGhlIHByb2plY3Qgcm9vdCwgY3JlYXRlcyBhIHRyYW5zcG9ydCwgY29waWVzIHRoZSBidWlsdFxuICogcGx1Z2luIGludG8gYSB0ZW1wb3JhcnkgdmF1bHQsIHJlZ2lzdGVycyB0aGUgdmF1bHQgd2l0aCBPYnNpZGlhbiwgYW5kXG4gKiBlbmFibGVzIHRoZSBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcGFyYW1zPy50cmFuc3BvcnRPcHRpb25zO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcbiAgY29uc3QgbG9ja1Njb3BlID0gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gIGxldCBsb2NrOiBTZXR1cExvY2sgfCB1bmRlZmluZWQ7XG4gIGlmIChsb2NrU2NvcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBBY3F1aXJpbmcgJyR7bG9ja1Njb3BlfScgc2V0dXAgbG9jayAoc2VyaWFsaXplcyBhZ2FpbnN0IGFueSBjb25jdXJyZW50IGludGVncmF0aW9uLXRlc3QgcnVuKS4uLmApO1xuICAgIGxvY2sgPSBhd2FpdCBhY3F1aXJlU2V0dXBMb2NrKHsgbGFiZWwsIHNjb3BlOiBsb2NrU2NvcGUgfSk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGxvY2sgYWNxdWlyZWQuYCk7XG4gIH1cblxuICBsZXQgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcbiAgbGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0aW5nIHRyYW5zcG9ydC4uLmApO1xuICAgIHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBUcmFuc3BvcnQgY3JlYXRlZDogJHt0cmFuc3BvcnQuY29uc3RydWN0b3IubmFtZX1gKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gICAgY29uc3QgZGlzdFBhdGggPSBhd2FpdCByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3QpO1xuICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICAgIGNvbnN0IHBsdWdpbklkID0gbWFuaWZlc3RKc29uLmlkO1xuXG4gICAgaWYgKHRyYW5zcG9ydC5pc01vYmlsZSAmJiBtYW5pZmVzdEpzb24uaXNEZXNrdG9wT25seSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgaXNEZXNrdG9wT25seTogdHJ1ZSBpbiBtYW5pZmVzdC5qc29uLiBNb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgY2Fubm90IHJ1biBmb3IgZGVza3RvcC1vbmx5IHBsdWdpbnMuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgICBjb25zdCBidWlsZFN0YXQgPSBhd2FpdCBzdGF0KG1haW5Kcyk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVXNpbmcgJHtkaXN0UGF0aH0gKCR7YnVpbGRTdGF0Lm10aW1lLnRvSVNPU3RyaW5nKCl9KS4gSWYgb3V0ZGF0ZWQsIHJlYnVpbGQuYCk7XG5cbiAgICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wVmF1bHQucGF0aH1gKTtcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBqb2luKHRlbXBWYXVsdC5wYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICAgIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIENPTU1VTklUWV9QTFVHSU5TX0pTT04pLCBKU09OLnN0cmluZ2lmeShbcGx1Z2luSWRdKSk7XG5cbiAgICBpZiAocGFyYW1zPy5wb3B1bGF0ZSkge1xuICAgICAgY29uc3QgZW50cnlDb3VudCA9IE9iamVjdC5rZXlzKHBhcmFtcy5wb3B1bGF0ZSkubGVuZ3RoO1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBvcHVsYXRpbmcgdmF1bHQgd2l0aCAke1N0cmluZyhlbnRyeUNvdW50KX0gZW50cmllcyBiZWZvcmUgb3Blbi4uLmApO1xuICAgICAgdGVtcFZhdWx0LnBvcHVsYXRlKHBhcmFtcy5wb3B1bGF0ZSk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFN5bmNpbmcgdmF1bHQgdG8gZGV2aWNlLi4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnN5bmNUb0RldmljZSh0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBSZWdpc3RlcmluZyB2YXVsdC4uLmApO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5yZWdpc3Rlcih0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCByZWdpc3RlcmVkLmApO1xuXG4gICAgLy8gRW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQuIE9ic2lkaWFuJ3MgZW5hYmxlUGx1Z2luKCkgd3JhcHNcbiAgICAvLyBMb2FkUGx1Z2luKCkgaW4gYSB0cnktY2F0Y2ggdGhhdCBzd2FsbG93cyBlcnJvcnMgYW5kIHJldHVybnMgZmFsc2UuXG4gICAgLy8gV2UgbW9ua2V5LXBhdGNoIGxvYWRQbHVnaW4oKSB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsaW5nIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIuLi5gKTtcbiAgICBjb25zdCB7IGVycm9yTWVzc2FnZSB9ID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgYXJnczogeyBwbHVnaW5JZCB9LFxuICAgICAgZm46IGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgdHJhbnNwb3J0LFxuICAgICAgdmF1bHRQYXRoOiB0ZW1wVmF1bHQucGF0aFxuICAgIH0pO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseS5gKTtcblxuICAgIGNvbnN0IGF1Z21lbnRlZE9wdGlvbnMgPSBhdWdtZW50VHJhbnNwb3J0T3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zLCB0cmFuc3BvcnQpO1xuICAgIGNvbnN0IHJlc3VsdDogQ29yZVNldHVwUmVzdWx0ID0geyB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0TGFiZWw6IGxhYmVsLCB0cmFuc3BvcnRPcHRpb25zOiBhdWdtZW50ZWRPcHRpb25zIH07XG4gICAgYWN0aXZlU2V0dXBzLmFkZChyZXN1bHQpO1xuICAgIGlmIChsb2NrKSB7XG4gICAgICBzZXR1cExvY2tzLnNldChyZXN1bHQsIGxvY2spO1xuICAgIH1cbiAgICByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCwgY2xlYW5pbmcgdXAuLi5gKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRlbXBWYXVsdCAmJiB0cmFuc3BvcnQpIHtcbiAgICAgICAgYXdhaXQgdGVtcFZhdWx0LmRpc3Bvc2UodHJhbnNwb3J0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyBhIHdhaXRpbmcgcnVuIGNhbiBwcm9jZWVkIGV2ZW4gdGhvdWdoIHRoaXMgcnVuIGZhaWxlZC5cbiAgICBsb2NrPy5yZWxlYXNlKCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gTk9URTogSWYgdGhlIHRlc3QgcnVubmVyIHJlcG9ydHMgXCJObyB0ZXN0IGZpbGVzIGZvdW5kXCIsIGlnbm9yZSBpdCBcdTIwMTQgaXQgaXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgc2V0dXAgZmFpbHVyZSBhYm92ZS5gKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgdGVhcmRvd24gbG9naWMuXG4gKlxuICogRGlzcG9zZXMgb2YgdGhlIHRlbXBvcmFyeSB2YXVsdCBhbmQgdHJhbnNwb3J0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmVzdWx0IGZyb20ge0BsaW5rIGNvcmVTZXR1cH0uIFdoZW4gYHVuZGVmaW5lZGAsIGRvZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVUZWFyZG93bihyZXN1bHQ/OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXN1bHQgfHwgZGlzcG9zZWRSZXN1bHRzLmhhcyhyZXN1bHQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRpc3Bvc2VkUmVzdWx0cy5hZGQocmVzdWx0KTtcblxuICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRlYXJpbmcgZG93bi4uLmApO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGVhcmRvd25Bc3luYyhyZXN1bHQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gQ2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlU2V0dXBzLmRlbGV0ZShyZXN1bHQpO1xuICAgIHJlbGVhc2VTZXR1cExvY2socmVzdWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggc2Vzc2lvbiByZXVzZSBpbmZvIHdoZW4gdGhlIHRyYW5zcG9ydFxuICogc3VwcG9ydHMgaXQgKGN1cnJlbnRseSBBcHBpdW0gb25seSkuXG4gKlxuICogVGhlIGF1Z21lbnRlZCBvcHRpb25zIGFyZSBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnMgc28gdGhleSBjYW4gcmVhdHRhY2hcbiAqIHRvIHRoZSBleGlzdGluZyBzZXNzaW9uIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9yaWdpbmFsIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKiBAcmV0dXJucyBUaGUgYXVnbWVudGVkIG9wdGlvbnMsIG9yIHRoZSBvcmlnaW5hbCBvcHRpb25zIGlmIG5vdCBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBhdWdtZW50VHJhbnNwb3J0T3B0aW9ucyhcbiAgb3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0XG4pOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9ucz8udHlwZSAhPT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJyB8fCAhKHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7b3B0aW9ucy50eXBlfV0gU2Vzc2lvbiByZXVzZSBpbmZvOiBzZXNzaW9uSWQ9JHtzZXNzaW9uSW5mby5zZXNzaW9uSWR9LCBkZXZpY2VJZD0ke3Nlc3Npb25JbmZvLmRldmljZUlkfWApO1xuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgc2Vzc2lvbklkOiBzZXNzaW9uSW5mby5zZXNzaW9uSWRcbiAgfTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcHJvamVjdCByb290IGJ5IHdhbGtpbmcgdXAgZnJvbSBgcHJvY2Vzcy5jd2QoKWAgbG9va2luZyBmb3IgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZmluZFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIExvb3AgdGVybWluYXRlcyBhdCBmaWxlc3lzdGVtIHJvb3QuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihkaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGpvaW4oZGlyLCAnLi4nKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcHJvamVjdCByb290IChubyBwYWNrYWdlLmpzb24gZm91bmQpLicpO1xuICAgIH1cbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY3Jvc3MtcHJvY2VzcyBsb2NrIHNjb3BlIGZvciBhIHRyYW5zcG9ydCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub1xuICogbG9jayBpcyBuZWVkZWQuXG4gKlxuICogRGVza3RvcCBydW5zIHVzZSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZXMgKHRoZWlyIG93biB1c2VyLWRhdGEgZGlyXG4gKiBhbmQgQ0RQIHBvcnQpLCBzbyB0aGV5IG5vIGxvbmdlciBjb250ZW5kIGFuZCBuZWVkIG5vIGxvY2suIE9ubHkgdGhlIEFuZHJvaWRcbiAqIHRyYW5zcG9ydCwgd2hpY2ggc2hhcmVzIHRoZSBzaW5nbGUgZW11bGF0b3IgYW5kIEFwcGl1bSBzZXJ2ZXIsIG11c3Qgc2VyaWFsaXplLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnRPcHRpb25zIC0gVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGxvY2sgc2NvcGUgc3RyaW5nLCBvciBgdW5kZWZpbmVkYCBpZiBubyBsb2NrIGlzIG5lZWRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0cmFuc3BvcnRPcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nID8gQU5EUk9JRF9MT0NLX1NDT1BFIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBjbGVhbnVwIGhhbmRsZXJzIGZvciBvcnBoYW5lZCBzZXR1cHMgdGhhdCB3ZXJlIG5ldmVyIGV4cGxpY2l0bHlcbiAqIHRvcm4gZG93bi5cbiAqXG4gKiBUd28gaGFuZGxlcnMgY292ZXIgZGlmZmVyZW50IGV4aXQgc2NlbmFyaW9zOlxuICpcbiAqIC0gYGJlZm9yZUV4aXRgIFx1MjAxNCBmaXJlcyB3aGVuIHRoZSBldmVudCBsb29wIGRyYWlucyBuYXR1cmFsbHkuIEFsbG93cyBmdWxsXG4gKiAgIGFzeW5jIHRlYXJkb3duICh1bnJlZ2lzdGVyIHZhdWx0cywgZGlzcG9zZSB0cmFuc3BvcnRzKS4gRG9lcyBOT1QgZmlyZVxuICogICB3aGVuIGBwcm9jZXNzLmV4aXQoKWAgaXMgY2FsbGVkIGRpcmVjdGx5LlxuICpcbiAqIC0gYHVuaGFuZGxlZFJlamVjdGlvbmAgXHUyMDE0IGNhdGNoZXMgYXN5bmMgZXJyb3JzIHRoYXQgYnlwYXNzIGBjb3JlU2V0dXBgJ3NcbiAqICAgY2F0Y2ggYmxvY2suIFBlcmZvcm1zIGZ1bGwgYXN5bmMgdGVhcmRvd24gd2hpbGUgd2Ugc3RpbGwgY2FuLlxuICpcbiAqIC0gYGV4aXRgIFx1MjAxNCBmaXJlcyBvbiBldmVyeSBleGl0LCBpbmNsdWRpbmcgYHByb2Nlc3MuZXhpdCgpYC4gT25seSBzeW5jaHJvbm91c1xuICogICB3b3JrIGlzIHBvc3NpYmxlLCBzbyB0aGlzIGhhbmRsZXIgZG9lcyBiZXN0LWVmZm9ydCBjbGVhbnVwOiBraWxscyBjaGlsZFxuICogICBwcm9jZXNzZXMgdmlhIGBkaXNwb3NlU3luYygpYCBhbmQgcmVtb3ZlcyB0ZW1wIHZhdWx0IGRpcmVjdG9yaWVzIHdpdGhcbiAqICAgYHJtU3luY2AuIFVucmVnaXN0ZXJpbmcgdmF1bHRzICh3aGljaCByZXF1aXJlcyBJUEMgd2l0aCBPYnNpZGlhbikgaXNcbiAqICAgc2tpcHBlZCBcdTIwMTQgYSBzdGFsZSB2YXVsdCBlbnRyeSBpcyBhbiBhY2NlcHRhYmxlIHRyYWRlLW9mZiB2cy4gbGVha2VkXG4gKiAgIHByb2Nlc3NlcyBhbmQgdGVtcCBkaXJlY3Rvcmllcy5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTogdm9pZCB7XG4gIGlmIChpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBleGl0aW5nIHdpdGggJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBzZXR1cChzKSBub3QgdG9ybiBkb3duLiBDbGVhbmluZyB1cC4uLmApO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFByb2Nlc3MgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gVW5oYW5kbGVkIHJlamVjdGlvbiBkZXRlY3RlZC4gVGVhcmluZyBkb3duICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gYWN0aXZlIHNldHVwKHMpLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFJlamVjdGlvbiBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gU3luYyBjbGVhbnVwOiAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IG9ycGhhbmVkIHNldHVwKHMpLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBybVN5bmMocmVzdWx0LnRlbXBWYXVsdC5wYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gICAgfVxuICAgIGFjdGl2ZVNldHVwcy5jbGVhcigpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhbmQgZm9yZ2V0cyB0aGUgc2V0dXAgbG9jayBhc3NvY2lhdGVkIHdpdGggYSByZXN1bHQsIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB3aG9zZSBsb2NrIHNob3VsZCBiZSByZWxlYXNlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZVNldHVwTG9jayhyZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCk6IHZvaWQge1xuICBjb25zdCBsb2NrID0gc2V0dXBMb2Nrcy5nZXQocmVzdWx0KTtcbiAgaWYgKGxvY2spIHtcbiAgICBsb2NrLnJlbGVhc2UoKTtcbiAgICBzZXR1cExvY2tzLmRlbGV0ZShyZXN1bHQpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGRpc3QgcGF0aCB0byB1c2UgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIFBpY2tzIHdoaWNoZXZlciBvZiBgZGlzdC9kZXZgIGFuZCBgZGlzdC9idWlsZGAgaGFzIGEgbmV3ZXIgYG1haW4uanNgLlxuICogSWYgb25seSBvbmUgZXhpc3RzLCB0aGF0IG9uZSBpcyB1c2VkLiBUaHJvd3MgaWYgbmVpdGhlciBleGlzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3RSb290IC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGV2UGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfREVWKTtcbiAgY29uc3QgYnVpbGRQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9CVUlMRCk7XG4gIGNvbnN0IGRldk1haW5KcyA9IGpvaW4oZGV2UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkTWFpbkpzID0gam9pbihidWlsZFBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBkZXZTdGF0ID0gZXhpc3RzU3luYyhkZXZNYWluSnMpID8gYXdhaXQgc3RhdChkZXZNYWluSnMpIDogbnVsbDtcbiAgY29uc3QgYnVpbGRTdGF0ID0gZXhpc3RzU3luYyhidWlsZE1haW5KcykgPyBhd2FpdCBzdGF0KGJ1aWxkTWFpbkpzKSA6IG51bGw7XG5cbiAgaWYgKGRldlN0YXQgJiYgYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGRldlN0YXQubXRpbWUgPiBidWlsZFN0YXQubXRpbWUgPyBkZXZQYXRoIDogYnVpbGRQYXRoO1xuICB9XG5cbiAgaWYgKGRldlN0YXQpIHtcbiAgICByZXR1cm4gZGV2UGF0aDtcbiAgfVxuXG4gIGlmIChidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBidWlsZCBmb3VuZC4gUnVuIGBucG0gcnVuIGJ1aWxkYCBvciBgbnBtIHJ1biBkZXZgIGZpcnN0LicpO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhc3luYyB0ZWFyZG93biB3b3JrICh2YXVsdCBkaXNwb3NhbCArIHRyYW5zcG9ydCBkaXNwb3NhbCkuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBzZXR1cCByZXN1bHQgdG8gdGVhciBkb3duLlxuICovXG5hc3luYyBmdW5jdGlvbiB0ZWFyZG93bkFzeW5jKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRlbXBWYXVsdC5kaXNwb3NlKHJlc3VsdC50cmFuc3BvcnQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQSxxQkFHTztBQUNQLHNCQU1PO0FBQ1AsdUJBQXFCO0FBQ3JCLDBCQUFxQztBQU9yQywyQkFBNkM7QUFDN0MsOEJBQStCO0FBQy9CLGlCQUFvQjtBQUNwQiw2QkFBK0I7QUFDL0Isd0JBQWlDO0FBQ2pDLHdCQUEwQjtBQUMxQiw4QkFBZ0M7QUFDaEMsK0JBQTJDO0FBRTNDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sV0FBVztBQUNqQixNQUFNLGFBQWE7QUFDbkIsTUFBTSxVQUFVO0FBQ2hCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sY0FBYztBQUNwQixNQUFNLHlCQUF5QjtBQVEvQixNQUFNLGVBQWUsb0JBQUksSUFBcUI7QUFDOUMs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
|
|
@@ -32,7 +32,7 @@ export interface CoreSetupResult {
|
|
|
32
32
|
readonly tempVault: TempVault;
|
|
33
33
|
/** The transport instance used during setup. */
|
|
34
34
|
readonly transport: ObsidianTransport;
|
|
35
|
-
/** Short label for log messages (e.g. `"obsidian-
|
|
35
|
+
/** Short label for log messages (e.g. `"obsidian-cdp"`). */
|
|
36
36
|
readonly transportLabel: string;
|
|
37
37
|
/** The transport options that were resolved. */
|
|
38
38
|
readonly transportOptions: ObsidianTransportOptions | undefined;
|
package/dist/lib/cjs/index.cjs
CHANGED
|
@@ -21,7 +21,6 @@ __export(index_exports, {
|
|
|
21
21
|
AppiumTransport: () => import_transport_appium.AppiumTransport,
|
|
22
22
|
ContextId: () => import_context_id.ContextId,
|
|
23
23
|
DesktopCdpTransport: () => import_transport_desktop_cdp.DesktopCdpTransport,
|
|
24
|
-
DesktopCliTransport: () => import_transport_desktop_cli.DesktopCliTransport,
|
|
25
24
|
TempVault: () => import_temp_vault.TempVault,
|
|
26
25
|
createTransportFromOptions: () => import_transport_factory.createTransportFromOptions,
|
|
27
26
|
evalInObsidian: () => import_eval_in_obsidian.evalInObsidian,
|
|
@@ -37,7 +36,6 @@ var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
|
|
|
37
36
|
var import_temp_vault = require("./temp-vault.cjs");
|
|
38
37
|
var import_transport_appium = require("./transport-appium.cjs");
|
|
39
38
|
var import_transport_desktop_cdp = require("./transport-desktop-cdp.cjs");
|
|
40
|
-
var import_transport_desktop_cli = require("./transport-desktop-cli.cjs");
|
|
41
39
|
var import_transport_factory = require("./transport-factory.cjs");
|
|
42
40
|
var import_vault_registry = require("./vault-registry.cjs");
|
|
43
41
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -45,7 +43,6 @@ var import_vault_registry = require("./vault-registry.cjs");
|
|
|
45
43
|
AppiumTransport,
|
|
46
44
|
ContextId,
|
|
47
45
|
DesktopCdpTransport,
|
|
48
|
-
DesktopCliTransport,
|
|
49
46
|
TempVault,
|
|
50
47
|
createTransportFromOptions,
|
|
51
48
|
evalInObsidian,
|
|
@@ -54,4 +51,4 @@ var import_vault_registry = require("./vault-registry.cjs");
|
|
|
54
51
|
setVaultPathResolver,
|
|
55
52
|
unregisterVault
|
|
56
53
|
});
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgVmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLmNqcyc7XG5leHBvcnQge1xuICBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIHNldFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5janMnO1xuZXhwb3J0IHR5cGUgeyBFdmFsSW5PYnNpZGlhblBhcmFtcyB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuZXhwb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgUG9wdWxhdGVGaWxlQ29udGVudCxcbiAgUG9wdWxhdGVGaWxlc1BhcmFtc1xufSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmV4cG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VBc2FyLFxuICBPd25lZEluc3RhbmNlQ29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuZXhwb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkuY2pzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSx3QkFBMEI7QUFLMUIsOEJBR087QUFFUCw4QkFBK0I7QUFLL0Isd0JBQTBCO0FBSzFCLDhCQUFnQztBQU1oQyxtQ0FBb0M7QUFDcEMsK0JBQTJDO0FBVTNDLDRCQUdPOyIsCiAgIm5hbWVzIjogW10KfQo=
|
package/dist/lib/cjs/index.d.cts
CHANGED
|
@@ -12,10 +12,9 @@ export type { PopulateFileContent, PopulateFilesParams } from './temp-vault.cjs'
|
|
|
12
12
|
export { TempVault } from './temp-vault.cjs';
|
|
13
13
|
export type { AppiumSessionInfo, AppiumTransportConfig } from './transport-appium.cjs';
|
|
14
14
|
export { AppiumTransport } from './transport-appium.cjs';
|
|
15
|
-
export type { DesktopCdpTransportConfig } from './transport-desktop-cdp.cjs';
|
|
15
|
+
export type { DesktopCdpTransportConfig, OwnedInstanceAsar, OwnedInstanceConfig } from './transport-desktop-cdp.cjs';
|
|
16
16
|
export { DesktopCdpTransport } from './transport-desktop-cdp.cjs';
|
|
17
|
-
export { DesktopCliTransport } from './transport-desktop-cli.cjs';
|
|
18
17
|
export { createTransportFromOptions } from './transport-factory.cjs';
|
|
19
|
-
export type { ObsidianAndroidAppiumTransportOptions, ObsidianCdpTransportOptions,
|
|
18
|
+
export type { ObsidianAndroidAppiumTransportOptions, ObsidianCdpTransportOptions, ObsidianTransportOptions } from './transport-options.cjs';
|
|
20
19
|
export type { ObsidianTransport, TransportEvalOptions } from './transport.cjs';
|
|
21
20
|
export { registerVault, unregisterVault } from './vault-registry.cjs';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var kill_process_tree_exports = {};
|
|
30
|
+
__export(kill_process_tree_exports, {
|
|
31
|
+
killProcessTree: () => killProcessTree
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(kill_process_tree_exports);
|
|
34
|
+
var import_node_child_process = require("node:child_process");
|
|
35
|
+
var import_node_process = __toESM(require("node:process"), 1);
|
|
36
|
+
var import_log = require("./log.cjs");
|
|
37
|
+
function killProcessTree(child) {
|
|
38
|
+
if (child.pid === void 0) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (import_node_process.default.platform === "win32") {
|
|
42
|
+
try {
|
|
43
|
+
(0, import_node_child_process.execFileSync)("taskkill", ["/F", "/T", "/PID", String(child.pid)], { stdio: "ignore" });
|
|
44
|
+
} catch (error) {
|
|
45
|
+
(0, import_log.log)(
|
|
46
|
+
`[kill-process-tree] taskkill for PID ${String(child.pid)} failed (may have already exited): ${error instanceof Error ? error.message : "unknown error"}`
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
child.kill("SIGKILL");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
54
|
+
0 && (module.exports = {
|
|
55
|
+
killProcessTree
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2tpbGwtcHJvY2Vzcy10cmVlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIHRvIGtpbGwgYSBjaGlsZCBwcm9jZXNzIGFuZCBpdHMgZW50aXJlIHByb2Nlc3MgdHJlZS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBwcm9jZXNzIG1hbmFnZW1lbnQgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5cbi8qKlxuICogS2lsbHMgYSBjaGlsZCBwcm9jZXNzIGFuZCBpdHMgZW50aXJlIHByb2Nlc3MgdHJlZS5cbiAqXG4gKiBPbiBXaW5kb3dzLCBgY2hpbGQua2lsbCgpYCBvbmx5IHNlbmRzIFNJR1RFUk0gdG8gdGhlIGRpcmVjdCBwcm9jZXNzLFxuICogbGVhdmluZyBzcGF3bmVkIGdyYW5kY2hpbGRyZW4gKGUuZy4gRWxlY3Ryb24gcmVuZGVyZXIvR1BVIGhlbHBlcnMsIFFFTVUsXG4gKiBVaUF1dG9tYXRvcikgYWxpdmUuIGB0YXNra2lsbCAvRiAvVCAvUElEYCBmb3JjZWZ1bGx5IHRlcm1pbmF0ZXMgdGhlIGVudGlyZSB0cmVlLlxuICpcbiAqIEBwYXJhbSBjaGlsZCAtIFRoZSBjaGlsZCBwcm9jZXNzIHRvIGtpbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBraWxsUHJvY2Vzc1RyZWUoY2hpbGQ6IENoaWxkUHJvY2Vzcyk6IHZvaWQge1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMoJ3Rhc2traWxsJywgWycvRicsICcvVCcsICcvUElEJywgU3RyaW5nKGNoaWxkLnBpZCldLCB7IHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW2tpbGwtcHJvY2Vzcy10cmVlXSB0YXNra2lsbCBmb3IgUElEICR7U3RyaW5nKGNoaWxkLnBpZCl9IGZhaWxlZCAobWF5IGhhdmUgYWxyZWFkeSBleGl0ZWQpOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNoaWxkLmtpbGwoJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQSxnQ0FBNkI7QUFDN0IsMEJBQW9CO0FBRXBCLGlCQUFvQjtBQVdiLFNBQVMsZ0JBQWdCLE9BQTJCO0FBQ3pELE1BQUksTUFBTSxRQUFRLFFBQVc7QUFDM0I7QUFBQSxFQUNGO0FBRUEsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFNBQVM7QUFDaEMsUUFBSTtBQUNGLGtEQUFhLFlBQVksQ0FBQyxNQUFNLE1BQU0sUUFBUSxPQUFPLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLFNBQVMsQ0FBQztBQUFBLElBQ3ZGLFNBQVMsT0FBZ0I7QUFDdkI7QUFBQSxRQUNFLHdDQUF3QyxPQUFPLE1BQU0sR0FBRyxDQUFDLHNDQUFzQyxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsZUFBZTtBQUFBLE1BQ3pKO0FBQUEsSUFDRjtBQUFBLEVBQ0YsT0FBTztBQUNMLFVBQU0sS0FBSyxTQUFTO0FBQUEsRUFDdEI7QUFDRjsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Cross-platform helper to kill a child process and its entire process tree.
|
|
5
|
+
*/
|
|
6
|
+
import type { ChildProcess } from 'node:child_process';
|
|
7
|
+
/**
|
|
8
|
+
* Kills a child process and its entire process tree.
|
|
9
|
+
*
|
|
10
|
+
* On Windows, `child.kill()` only sends SIGTERM to the direct process,
|
|
11
|
+
* leaving spawned grandchildren (e.g. Electron renderer/GPU helpers, QEMU,
|
|
12
|
+
* UiAutomator) alive. `taskkill /F /T /PID` forcefully terminates the entire tree.
|
|
13
|
+
*
|
|
14
|
+
* @param child - The child process to kill.
|
|
15
|
+
*/
|
|
16
|
+
export declare function killProcessTree(child: ChildProcess): void;
|
package/dist/lib/cjs/library.cjs
CHANGED
|
@@ -21,7 +21,7 @@ __export(library_exports, {
|
|
|
21
21
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(library_exports);
|
|
24
|
-
const LIBRARY_VERSION = false ? "dev" : "4.
|
|
24
|
+
const LIBRARY_VERSION = false ? "dev" : "4.4.0";
|
|
25
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
26
|
0 && (module.exports = {
|
|
27
27
|
LIBRARY_VERSION
|