@dbx-tools/cli-service 0.9.40 → 0.9.46
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 +77 -34
- package/index.ts +5 -4
- package/lib/index.d.ts +5 -4
- package/lib/index.js +4 -3
- package/lib/src/_runtime.d.ts +2 -0
- package/lib/src/_runtime.js +20 -2
- package/lib/src/cli.d.ts +5 -0
- package/lib/src/cli.js +12 -6
- package/lib/src/definition.d.ts +29 -1
- package/lib/src/definition.js +42 -7
- package/lib/src/service.d.ts +10 -1
- package/lib/src/service.js +34 -11
- package/package.json +4 -3
- package/src/_runtime.ts +34 -1
- package/src/cli.ts +19 -7
- package/src/definition.ts +74 -8
- package/src/service.ts +64 -7
package/lib/src/service.d.ts
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module owns current-user service compilation and lifecycle across
|
|
5
5
|
* consuming CLIs. Reuse {@link CliService} rather than adding product-specific
|
|
6
|
-
* installers, startup registration, runtime
|
|
6
|
+
* installers, uv Python environments, startup registration, runtime
|
|
7
|
+
* directories, or control sockets.
|
|
7
8
|
*
|
|
8
9
|
* @module
|
|
9
10
|
*/
|
|
@@ -12,6 +13,8 @@ import { type CliServiceDefinition } from "./definition.ts";
|
|
|
12
13
|
export type CliServiceCompiler = (entrypoint: string, output: string, workingDirectory: string, external?: readonly string[]) => Promise<void>;
|
|
13
14
|
/** Install exact external runtime dependencies into the dbx-tools home. */
|
|
14
15
|
export type CliServiceRuntimeInstaller = (bunExecutable: string, directory: string, dependencies: Readonly<Record<string, string>>) => Promise<void>;
|
|
16
|
+
/** Install a Python package into a service-owned uv environment. */
|
|
17
|
+
export type CliServicePythonInstaller = (uvExecutable: string, directory: string, packageSpecifier: string, python: string, platform: NodeJS.Platform) => Promise<string>;
|
|
15
18
|
/** Host runtime overrides for tests, embedded distributions, and nonstandard homes. */
|
|
16
19
|
export interface CliServiceRuntimeOptions {
|
|
17
20
|
/** Operating system used for configuration and startup registration. */
|
|
@@ -26,10 +29,14 @@ export interface CliServiceRuntimeOptions {
|
|
|
26
29
|
readonly globalHomeDirectory?: string;
|
|
27
30
|
/** Package-provided Bun executable override. */
|
|
28
31
|
readonly bunExecutable?: string;
|
|
32
|
+
/** uv executable used for managed Python package environments. */
|
|
33
|
+
readonly uvExecutable?: string;
|
|
29
34
|
/** Standalone compiler override. */
|
|
30
35
|
readonly compile?: CliServiceCompiler;
|
|
31
36
|
/** External runtime dependency installer override. */
|
|
32
37
|
readonly installRuntime?: CliServiceRuntimeInstaller;
|
|
38
|
+
/** Python package installer override. */
|
|
39
|
+
readonly installPython?: CliServicePythonInstaller;
|
|
33
40
|
/** System-tray host source entrypoint override. */
|
|
34
41
|
readonly hostEntrypoint?: string;
|
|
35
42
|
/** systray2 native executable override. */
|
|
@@ -72,8 +79,10 @@ export declare class CliService implements CliServiceLifecycle {
|
|
|
72
79
|
private readonly runtime;
|
|
73
80
|
private readonly globalHomeDirectory;
|
|
74
81
|
private readonly bunExecutable;
|
|
82
|
+
private readonly uvExecutable;
|
|
75
83
|
private readonly compiler;
|
|
76
84
|
private readonly runtimeInstaller;
|
|
85
|
+
private readonly pythonInstaller;
|
|
77
86
|
private readonly hostEntrypoint;
|
|
78
87
|
private readonly trayExecutable;
|
|
79
88
|
/**
|
package/lib/src/service.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module owns current-user service compilation and lifecycle across
|
|
5
5
|
* consuming CLIs. Reuse {@link CliService} rather than adding product-specific
|
|
6
|
-
* installers, startup registration, runtime
|
|
6
|
+
* installers, uv Python environments, startup registration, runtime
|
|
7
|
+
* directories, or control sockets.
|
|
7
8
|
*
|
|
8
9
|
* @module
|
|
9
10
|
*/
|
|
@@ -19,7 +20,7 @@ import { readServiceDefinition, writeServiceDefinition } from "./_config.js";
|
|
|
19
20
|
import { requestServiceControl } from "./_control.js";
|
|
20
21
|
import { resolveServicePackage } from "./_package.js";
|
|
21
22
|
import { defaultRuntimeContext, resolveServicePaths, } from "./_paths.js";
|
|
22
|
-
import { externalRuntimePackages, installServiceRuntime } from "./_runtime.js";
|
|
23
|
+
import { externalRuntimePackages, installServicePythonPackage, installServiceRuntime, } from "./_runtime.js";
|
|
23
24
|
import { installStartup, removeStartup } from "./_startup.js";
|
|
24
25
|
import { CliServiceDefinitionSchema, } from "./definition.js";
|
|
25
26
|
const DEFAULT_START_TIMEOUT_MILLISECONDS = 15_000;
|
|
@@ -31,8 +32,10 @@ export class CliService {
|
|
|
31
32
|
runtime;
|
|
32
33
|
globalHomeDirectory;
|
|
33
34
|
bunExecutable;
|
|
35
|
+
uvExecutable;
|
|
34
36
|
compiler;
|
|
35
37
|
runtimeInstaller;
|
|
38
|
+
pythonInstaller;
|
|
36
39
|
hostEntrypoint;
|
|
37
40
|
trayExecutable;
|
|
38
41
|
/**
|
|
@@ -53,10 +56,12 @@ export class CliService {
|
|
|
53
56
|
this.globalHomeDirectory =
|
|
54
57
|
options.globalHomeDirectory ?? join(this.runtime.homeDirectory, ".dbx-tools");
|
|
55
58
|
this.bunExecutable = options.bunExecutable ?? resolveBunExecutable();
|
|
59
|
+
this.uvExecutable = options.uvExecutable ?? "uv";
|
|
56
60
|
this.compiler =
|
|
57
61
|
options.compile ??
|
|
58
62
|
((entrypoint, output, workingDirectory, external) => compileWithBun(this.bunExecutable, entrypoint, output, workingDirectory, external));
|
|
59
63
|
this.runtimeInstaller = options.installRuntime ?? installServiceRuntime;
|
|
64
|
+
this.pythonInstaller = options.installPython ?? installServicePythonPackage;
|
|
60
65
|
this.hostEntrypoint = options.hostEntrypoint ?? resolveHostEntrypoint();
|
|
61
66
|
this.trayExecutable = options.trayExecutable ?? resolveTrayExecutable(this.runtime.platform);
|
|
62
67
|
}
|
|
@@ -67,7 +72,7 @@ export class CliService {
|
|
|
67
72
|
const external = new Set(externalRuntimePackages(dependencies));
|
|
68
73
|
await this.runtimeInstaller(this.bunExecutable, this.globalHomeDirectory, Object.fromEntries(Object.entries(dependencies).filter(([name]) => external.has(name))));
|
|
69
74
|
const paths = resolveServicePaths(this.definition, this.runtime);
|
|
70
|
-
const installedDefinition = await this.installDefinition(owner);
|
|
75
|
+
const installedDefinition = await this.installDefinition(owner, paths.directory);
|
|
71
76
|
const host = await this.ensureCompiledBinary(this.binaryName(installedDefinition, "service"), this.hostEntrypoint, resolve(dirname(this.hostEntrypoint), ".."));
|
|
72
77
|
await this.ensureTrayBinary();
|
|
73
78
|
await this.stop();
|
|
@@ -143,38 +148,56 @@ export class CliService {
|
|
|
143
148
|
arguments: ["--service-config", configFile],
|
|
144
149
|
};
|
|
145
150
|
}
|
|
146
|
-
async installDefinition(owner) {
|
|
151
|
+
async installDefinition(owner, directory) {
|
|
147
152
|
const definition = CliServiceDefinitionSchema.parse({
|
|
148
153
|
...this.definition,
|
|
149
154
|
version: this.definition.version ?? owner.version,
|
|
150
155
|
});
|
|
156
|
+
if (!definition.version)
|
|
157
|
+
throw new Error(`${definition.name} has no installable version`);
|
|
158
|
+
const pythonPackage = definition.pythonPackage
|
|
159
|
+
? {
|
|
160
|
+
...definition.pythonPackage,
|
|
161
|
+
version: definition.pythonPackage.version ?? definition.version,
|
|
162
|
+
}
|
|
163
|
+
: undefined;
|
|
164
|
+
const pythonEnvironment = {};
|
|
165
|
+
if (pythonPackage) {
|
|
166
|
+
pythonEnvironment.PYTHON = await this.pythonInstaller(this.uvExecutable, join(directory, "python"), `${pythonPackage.name}==${pythonPackage.version}`, pythonPackage.python, this.runtime.platform);
|
|
167
|
+
}
|
|
151
168
|
const command = definition.command
|
|
152
|
-
? await this.installCommand(definition, owner, definition.command, "command")
|
|
169
|
+
? await this.installCommand(definition, owner, definition.command, "command", pythonEnvironment)
|
|
153
170
|
: undefined;
|
|
154
171
|
const menu = [];
|
|
155
172
|
for (const [index, item] of (definition.menu ?? []).entries()) {
|
|
156
173
|
menu.push(item.type === "command"
|
|
157
174
|
? {
|
|
158
175
|
...item,
|
|
159
|
-
command: await this.installCommand(definition, owner, item.command, `menu-${index + 1}
|
|
176
|
+
command: await this.installCommand(definition, owner, item.command, `menu-${index + 1}`, pythonEnvironment),
|
|
160
177
|
}
|
|
161
178
|
: item);
|
|
162
179
|
}
|
|
163
180
|
return CliServiceDefinitionSchema.parse({
|
|
164
181
|
...definition,
|
|
182
|
+
...(pythonPackage ? { pythonPackage } : {}),
|
|
165
183
|
...(command ? { command } : {}),
|
|
166
184
|
...(menu.length > 0 ? { menu } : {}),
|
|
167
185
|
});
|
|
168
186
|
}
|
|
169
|
-
async installCommand(definition, owner, command, purpose) {
|
|
170
|
-
|
|
171
|
-
|
|
187
|
+
async installCommand(definition, owner, command, purpose, runtimeEnvironment) {
|
|
188
|
+
const environment = { ...command.environment, ...runtimeEnvironment };
|
|
189
|
+
if (command.executable) {
|
|
190
|
+
return {
|
|
191
|
+
...command,
|
|
192
|
+
...(Object.keys(environment).length > 0 ? { environment } : {}),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
172
195
|
const entrypoint = command.entrypoint ?? owner.bin(command.binName);
|
|
173
196
|
const installed = await this.ensureCompiledBinary(this.binaryName(definition, purpose), resolve(entrypoint), owner.directory, externalRuntimePackages(owner.dependencies()));
|
|
174
197
|
return {
|
|
175
198
|
executable: installed.path,
|
|
176
199
|
...(command.arguments ? { arguments: command.arguments } : {}),
|
|
177
|
-
...(
|
|
200
|
+
...(Object.keys(environment).length > 0 ? { environment } : {}),
|
|
178
201
|
cwd: command.cwd ?? this.globalHomeDirectory,
|
|
179
202
|
};
|
|
180
203
|
}
|
|
@@ -297,4 +320,4 @@ async function waitForState(read, expected, timeoutMilliseconds, message) {
|
|
|
297
320
|
}
|
|
298
321
|
throw new Error(message);
|
|
299
322
|
}
|
|
300
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLG1CQUFtQixHQUVwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQXNCLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFDTCwwQkFBMEIsR0FJM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLGtDQUFrQyxHQUFHLE1BQU0sQ0FBQztBQUNsRCxNQUFNLGlDQUFpQyxHQUFHLE1BQU0sQ0FBQztBQUNqRCxNQUFNLDBCQUEwQixHQUFHLEdBQUcsQ0FBQztBQTJFdkMseUVBQXlFO0FBQ3pFLE1BQU0sT0FBTyxVQUFVO0lBQ1osVUFBVSxDQUF1QjtJQUV6QixPQUFPLENBQXdCO0lBQy9CLG1CQUFtQixDQUFTO0lBQzVCLGFBQWEsQ0FBUztJQUN0QixRQUFRLENBQXFCO0lBQzdCLGdCQUFnQixDQUE2QjtJQUM3QyxjQUFjLENBQVM7SUFDdkIsY0FBYyxDQUFTO0lBRXhDOzs7OztPQUtHO0lBQ0gsWUFBWSxVQUFnQyxFQUFFLFVBQW9DLEVBQUU7UUFDbEYsSUFBSSxDQUFDLFVBQVUsR0FBRywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsTUFBTSxRQUFRLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVE7WUFDL0MsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLFdBQVc7WUFDeEQsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLGFBQWE7WUFDOUQsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxrQkFBa0I7U0FDOUUsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUI7WUFDdEIsT0FBTyxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUTtZQUNYLE9BQU8sQ0FBQyxPQUFPO2dCQUNmLENBQUMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ2xELGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxxQkFBcUIsQ0FBQztRQUN4RSxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUN4RSxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBb0MsRUFBRTtRQUNsRCxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUN6QixJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDeEYsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLEVBQy9DLElBQUksQ0FBQyxjQUFjLEVBQ25CLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUM1QyxDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixNQUFNLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNwRSxNQUFNLGNBQWMsQ0FDbEIsbUJBQW1CLEVBQ25CLEtBQUssRUFDTCxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQ3pDLENBQUM7UUFDRixJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksbUJBQW1CLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0scUJBQXFCLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBRXhGLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUN4RSxLQUFLLENBQUMsVUFBVSxDQUNqQixDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUN2RCxRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVkLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztZQUNqQixZQUFZLENBQ1YsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0scUJBQXFCLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFDdkYsSUFBSSxFQUNKLGtDQUFrQyxFQUNsQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxnQkFBZ0IsQ0FDeEM7WUFDRCxJQUFJLE9BQU8sQ0FBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUNsQyxNQUFNLENBQ0osSUFBSSxLQUFLLENBQ1AsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksZ0NBQWdDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDakYsQ0FDRixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLE1BQU0scUJBQXFCLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDdEIsTUFBTSxZQUFZLENBQ2hCLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQ3ZGLEtBQUssRUFDTCxpQ0FBaUMsRUFDakMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksZUFBZSxDQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVELDRDQUE0QztJQUM1QyxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsS0FBSyxDQUFDLFNBQVM7UUFDYixNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixNQUFNLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsdURBQXVEO0lBQ3ZELEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0UsT0FBTztZQUNMLFNBQVM7WUFDVCxPQUFPLEVBQUUsUUFBUSxLQUFLLFNBQVM7WUFDL0IsR0FBRyxDQUFDLFFBQVE7Z0JBQ1YsQ0FBQyxDQUFDO29CQUNFLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztvQkFDakIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNwRTtnQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBa0IsRUFBRSxVQUFrQjtRQUNuRCxPQUFPO1lBQ0wsVUFBVTtZQUNWLFNBQVMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQztTQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFxQjtRQUNuRCxNQUFNLFVBQVUsR0FBRywwQkFBMEIsQ0FBQyxLQUFLLENBQUM7WUFDbEQsR0FBRyxJQUFJLENBQUMsVUFBVTtZQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU87U0FDbEQsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU87WUFDaEMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDO1lBQzdFLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxNQUFNLElBQUksR0FBeUIsRUFBRSxDQUFDO1FBQ3RDLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsSUFBSSxDQUNQLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztnQkFDckIsQ0FBQyxDQUFDO29CQUNFLEdBQUcsSUFBSTtvQkFDUCxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUNoQyxVQUFVLEVBQ1YsS0FBSyxFQUNMLElBQUksQ0FBQyxPQUFPLEVBQ1osUUFBUSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQ3BCO2lCQUNGO2dCQUNILENBQUMsQ0FBQyxJQUFJLENBQ1QsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLDBCQUEwQixDQUFDLEtBQUssQ0FBQztZQUN0QyxHQUFHLFVBQVU7WUFDYixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDckMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjLENBQzFCLFVBQWdDLEVBQ2hDLEtBQXFCLEVBQ3JCLE9BQTBCLEVBQzFCLE9BQWU7UUFFZixJQUFJLE9BQU8sQ0FBQyxVQUFVO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQ3BDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFDbkIsS0FBSyxDQUFDLFNBQVMsRUFDZix1QkFBdUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FDOUMsQ0FBQztRQUNGLE9BQU87WUFDTCxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUk7WUFDMUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlELEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsbUJBQW1CO1NBQzdDLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUNoQyxJQUFZLEVBQ1osVUFBa0IsRUFDbEIsZ0JBQXdCLEVBQ3hCLFdBQThCLEVBQUU7UUFFaEMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUNmLElBQUksRUFDSixLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO1lBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDMUUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3BDLENBQUMsRUFDRDtZQUNFLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUNyQyxnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDNUIsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQy9ELFdBQVcsRUFBRTtnQkFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtnQkFDOUIsTUFBTTtnQkFDTixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7YUFDekI7WUFDRCxnQkFBZ0IsRUFBRSxJQUFJO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBWTtRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUM5QixNQUFNO1lBQ04sSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hFLENBQUM7SUFDSixDQUFDO0lBRU8sVUFBVSxDQUFDLFVBQWdDLEVBQUUsT0FBZTtRQUNsRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0UsT0FBTyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzdELENBQUM7Q0FDRjtBQUVELFNBQVMscUJBQXFCO0lBQzVCLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUNWLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLO1FBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsQ0FBQztRQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFTLG9CQUFvQjtJQUMzQixPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLFFBQXlCO0lBQ25ELElBQUksUUFBUSxLQUFLLFFBQVE7UUFBRSxPQUFPLHFCQUFxQixDQUFDO0lBQ3hELElBQUksUUFBUSxLQUFLLE9BQU87UUFBRSxPQUFPLG9CQUFvQixDQUFDO0lBQ3RELElBQUksUUFBUSxLQUFLLE9BQU87UUFBRSxPQUFPLDBCQUEwQixDQUFDO0lBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsUUFBeUI7SUFDdEQsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDakYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFZLEVBQUUsUUFBeUI7SUFDN0QsT0FBTyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDckQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEtBQWE7SUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLElBQUksQ0FBQyxLQUFLO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQywyQkFBMkIsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNwRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxLQUFLLFVBQVUsY0FBYyxDQUMzQixhQUFxQixFQUNyQixVQUFrQixFQUNsQixNQUFjLEVBQ2QsZ0JBQXdCLEVBQ3hCLFdBQThCLEVBQUU7SUFFaEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pELElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDZCxhQUFhLEVBQ2I7WUFDRSxPQUFPO1lBQ1AsVUFBVTtZQUNWLFdBQVc7WUFDWCxpQ0FBaUM7WUFDakMsV0FBVztZQUNYLE1BQU07WUFDTixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ2hFLEVBQ0Q7WUFDRSxLQUFLLEVBQUUsSUFBSTtZQUNYLEdBQUcsRUFBRSxnQkFBZ0I7WUFDckIsR0FBRyxFQUFFO2dCQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7Z0JBQ2QsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQzNCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQ3hCO1lBQ0QsS0FBSyxFQUFFLFFBQVE7WUFDZixNQUFNLEVBQUUsU0FBUztZQUNqQixNQUFNLEVBQUUsU0FBUztTQUNsQixDQUNGLENBQUM7SUFDSixDQUFDO1lBQVMsQ0FBQztRQUNULEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxFQUFFO29CQUN6QyxTQUFTLEVBQUUsSUFBSTtvQkFDZixLQUFLLEVBQUUsSUFBSTtpQkFDWixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGlCQUFpQixDQUFDLFNBQWlCO0lBQ2hELE9BQU8sSUFBSSxHQUFHLENBQ1osQ0FBQyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN2QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRSxJQUFJLEVBQUUsQ0FDVixDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSxZQUFZLENBQ3pCLElBQTRCLEVBQzVCLFFBQWlCLEVBQ2pCLG1CQUEyQixFQUMzQixPQUFlO0lBRWYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLG1CQUFtQixDQUFDO0lBQ2xELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDeEMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW5zdGFsbCwgc3RhcnQsIHN0b3AsIGFuZCBpbnNwZWN0IGEgc3lzdGVtLXRyYXkgdXNlciBzZXJ2aWNlLlxuICpcbiAqIFRoaXMgbW9kdWxlIG93bnMgY3VycmVudC11c2VyIHNlcnZpY2UgY29tcGlsYXRpb24gYW5kIGxpZmVjeWNsZSBhY3Jvc3NcbiAqIGNvbnN1bWluZyBDTElzLiBSZXVzZSB7QGxpbmsgQ2xpU2VydmljZX0gcmF0aGVyIHRoYW4gYWRkaW5nIHByb2R1Y3Qtc3BlY2lmaWNcbiAqIGluc3RhbGxlcnMsIHN0YXJ0dXAgcmVnaXN0cmF0aW9uLCBydW50aW1lIGRpcmVjdG9yaWVzLCBvciBjb250cm9sIHNvY2tldHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkZGlyLCBybSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCwgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5pbXBvcnQgKiBhcyBiaW4gZnJvbSBcIkBkYngtdG9vbHMvY29yZS9iaW5cIjtcbmltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5cbmltcG9ydCB7IHJlYWRTZXJ2aWNlRGVmaW5pdGlvbiwgd3JpdGVTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL19jb25maWcudHNcIjtcbmltcG9ydCB7IHJlcXVlc3RTZXJ2aWNlQ29udHJvbCB9IGZyb20gXCIuL19jb250cm9sLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlU2VydmljZVBhY2thZ2UsIHR5cGUgU2VydmljZVBhY2thZ2UgfSBmcm9tIFwiLi9fcGFja2FnZS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJ1bnRpbWVDb250ZXh0LFxuICByZXNvbHZlU2VydmljZVBhdGhzLFxuICB0eXBlIFNlcnZpY2VSdW50aW1lQ29udGV4dCxcbn0gZnJvbSBcIi4vX3BhdGhzLnRzXCI7XG5pbXBvcnQgeyBleHRlcm5hbFJ1bnRpbWVQYWNrYWdlcywgaW5zdGFsbFNlcnZpY2VSdW50aW1lIH0gZnJvbSBcIi4vX3J1bnRpbWUudHNcIjtcbmltcG9ydCB7IGluc3RhbGxTdGFydHVwLCByZW1vdmVTdGFydHVwLCB0eXBlIFNlcnZpY2VMYXVuY2ggfSBmcm9tIFwiLi9fc3RhcnR1cC50c1wiO1xuaW1wb3J0IHtcbiAgQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWEsXG4gIHR5cGUgQ2xpU2VydmljZUNvbW1hbmQsXG4gIHR5cGUgQ2xpU2VydmljZURlZmluaXRpb24sXG4gIHR5cGUgQ2xpU2VydmljZU1lbnVJdGVtLFxufSBmcm9tIFwiLi9kZWZpbml0aW9uLnRzXCI7XG5cbmNvbnN0IERFRkFVTFRfU1RBUlRfVElNRU9VVF9NSUxMSVNFQ09ORFMgPSAxNV8wMDA7XG5jb25zdCBERUZBVUxUX1NUT1BfVElNRU9VVF9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5jb25zdCBQT0xMX0lOVEVSVkFMX01JTExJU0VDT05EUyA9IDEwMDtcblxuLyoqIENvbXBpbGUgb25lIFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCBlbnRyeXBvaW50IGludG8gYSBzdGFuZGFsb25lIGV4ZWN1dGFibGUuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlQ29tcGlsZXIgPSAoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgZXh0ZXJuYWw/OiByZWFkb25seSBzdHJpbmdbXSxcbikgPT4gUHJvbWlzZTx2b2lkPjtcblxuLyoqIEluc3RhbGwgZXhhY3QgZXh0ZXJuYWwgcnVudGltZSBkZXBlbmRlbmNpZXMgaW50byB0aGUgZGJ4LXRvb2xzIGhvbWUuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlUnVudGltZUluc3RhbGxlciA9IChcbiAgYnVuRXhlY3V0YWJsZTogc3RyaW5nLFxuICBkaXJlY3Rvcnk6IHN0cmluZyxcbiAgZGVwZW5kZW5jaWVzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbikgPT4gUHJvbWlzZTx2b2lkPjtcblxuLyoqIEhvc3QgcnVudGltZSBvdmVycmlkZXMgZm9yIHRlc3RzLCBlbWJlZGRlZCBkaXN0cmlidXRpb25zLCBhbmQgbm9uc3RhbmRhcmQgaG9tZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaVNlcnZpY2VSdW50aW1lT3B0aW9ucyB7XG4gIC8qKiBPcGVyYXRpbmcgc3lzdGVtIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXJ0dXAgcmVnaXN0cmF0aW9uLiAqL1xuICByZWFkb25seSBwbGF0Zm9ybT86IE5vZGVKUy5QbGF0Zm9ybTtcbiAgLyoqIEVudmlyb25tZW50IHVzZWQgdG8gbG9jYXRlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMuICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogUmVhZG9ubHk8Tm9kZUpTLlByb2Nlc3NFbnY+O1xuICAvKiogSG9tZSBkaXJlY3RvcnkgdXNlZCB3aGVuIHBsYXRmb3JtIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYWJzZW50LiAqL1xuICByZWFkb25seSBob21lRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAvKiogVGVtcG9yYXJ5IGRpcmVjdG9yeSB1c2VkIGZvciB0aGUgbG9jYWwgY29udHJvbCBzb2NrZXQuICovXG4gIHJlYWRvbmx5IHRlbXBvcmFyeURpcmVjdG9yeT86IHN0cmluZztcbiAgLyoqIFNoYXJlZCBkYngtdG9vbHMgaG9tZSBjb250YWluaW5nIGluc3RhbGxlZCBzZXJ2aWNlIGJpbmFyaWVzLiAqL1xuICByZWFkb25seSBnbG9iYWxIb21lRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAvKiogUGFja2FnZS1wcm92aWRlZCBCdW4gZXhlY3V0YWJsZSBvdmVycmlkZS4gKi9cbiAgcmVhZG9ubHkgYnVuRXhlY3V0YWJsZT86IHN0cmluZztcbiAgLyoqIFN0YW5kYWxvbmUgY29tcGlsZXIgb3ZlcnJpZGUuICovXG4gIHJlYWRvbmx5IGNvbXBpbGU/OiBDbGlTZXJ2aWNlQ29tcGlsZXI7XG4gIC8qKiBFeHRlcm5hbCBydW50aW1lIGRlcGVuZGVuY3kgaW5zdGFsbGVyIG92ZXJyaWRlLiAqL1xuICByZWFkb25seSBpbnN0YWxsUnVudGltZT86IENsaVNlcnZpY2VSdW50aW1lSW5zdGFsbGVyO1xuICAvKiogU3lzdGVtLXRyYXkgaG9zdCBzb3VyY2UgZW50cnlwb2ludCBvdmVycmlkZS4gKi9cbiAgcmVhZG9ubHkgaG9zdEVudHJ5cG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBzeXN0cmF5MiBuYXRpdmUgZXhlY3V0YWJsZSBvdmVycmlkZS4gKi9cbiAgcmVhZG9ubHkgdHJheUV4ZWN1dGFibGU/OiBzdHJpbmc7XG59XG5cbi8qKiBPcHRpb25zIGNvbnRyb2xsaW5nIHNlcnZpY2UgaW5zdGFsbGF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnMge1xuICAvKiogU3RhcnQgdGhlIHNlcnZpY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgd3JpdGluZyBpdHMgY29uZmlndXJhdGlvbiBhbmQgbG9naW4gZW50cnkuICovXG4gIHJlYWRvbmx5IHN0YXJ0PzogYm9vbGVhbjtcbn1cblxuLyoqIEN1cnJlbnQgaW5zdGFsbGF0aW9uIGFuZCBwcm9jZXNzIHN0YXRlIGZvciBhIHN5c3RlbS10cmF5IHNlcnZpY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaVNlcnZpY2VTdGF0dXMge1xuICAvKiogV2hldGhlciB0aGUgc2VyaWFsaXplZCBzZXJ2aWNlIGRlZmluaXRpb24gZXhpc3RzLiAqL1xuICByZWFkb25seSBpbnN0YWxsZWQ6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSB0cmF5IGhvc3QgYW5zd2VyZWQgaXRzIGxvY2FsIGNvbnRyb2wgc29ja2V0LiAqL1xuICByZWFkb25seSBydW5uaW5nOiBib29sZWFuO1xuICAvKiogVHJheSBob3N0IHByb2Nlc3MgSUQgd2hlbiBydW5uaW5nLiAqL1xuICByZWFkb25seSBwaWQ/OiBudW1iZXI7XG4gIC8qKiBNYW5hZ2VkIGNoaWxkIHByb2Nlc3MgSUQgd2hlbiB0aGUgZGVmaW5pdGlvbiBpbmNsdWRlcyBhIGNvbW1hbmQuICovXG4gIHJlYWRvbmx5IHNlcnZpY2VQaWQ/OiBudW1iZXI7XG59XG5cbi8qKiBMaWZlY3ljbGUgY29udHJhY3QgY29uc3VtZWQgYnkgQ0xJIGNvbW1hbmQgYnVpbGRlcnMuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaVNlcnZpY2VMaWZlY3ljbGUge1xuICAvKiogSW5zdGFsbCB0aGUgbG9naW4gZW50cnkgYW5kIG9wdGlvbmFsbHkgc3RhcnQgdGhlIHNlcnZpY2UuICovXG4gIGluc3RhbGwob3B0aW9ucz86IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBTdGFydCB0aGUgaW5zdGFsbGVkIHNlcnZpY2Ugd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBydW5uaW5nLiAqL1xuICBzdGFydCgpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogU3RvcCB0aGUgcnVubmluZyB0cmF5IGhvc3QgYW5kIGl0cyBtYW5hZ2VkIGNoaWxkIHByb2Nlc3MuICovXG4gIHN0b3AoKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFN0b3AgYW5kIHN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZS4gKi9cbiAgcmVzdGFydCgpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogU3RvcCB0aGUgc2VydmljZSBhbmQgcmVtb3ZlIGl0cyBsb2dpbiBlbnRyeSBhbmQgcGFja2FnZS1vd25lZCBzdGF0ZS4gKi9cbiAgdW5pbnN0YWxsKCk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZWFkIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBhbmQgcHJvY2VzcyBzdGF0ZS4gKi9cbiAgc3RhdHVzKCk6IFByb21pc2U8Q2xpU2VydmljZVN0YXR1cz47XG59XG5cbi8qKiBDcm9zcy1wbGF0Zm9ybSBsaWZlY3ljbGUgbWFuYWdlciBmb3Igb25lIHN5c3RlbS10cmF5IHVzZXIgc2VydmljZS4gKi9cbmV4cG9ydCBjbGFzcyBDbGlTZXJ2aWNlIGltcGxlbWVudHMgQ2xpU2VydmljZUxpZmVjeWNsZSB7XG4gIHJlYWRvbmx5IGRlZmluaXRpb246IENsaVNlcnZpY2VEZWZpbml0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZTogU2VydmljZVJ1bnRpbWVDb250ZXh0O1xuICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEhvbWVEaXJlY3Rvcnk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBidW5FeGVjdXRhYmxlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcGlsZXI6IENsaVNlcnZpY2VDb21waWxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lSW5zdGFsbGVyOiBDbGlTZXJ2aWNlUnVudGltZUluc3RhbGxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBob3N0RW50cnlwb2ludDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYXlFeGVjdXRhYmxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGxpZmVjeWNsZSBtYW5hZ2VyIGZyb20gYSBzZXJpYWxpemFibGUgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGRlZmluaXRpb24gUHJvZHVjdC1vd25lZCBzZXJ2aWNlIG1ldGFkYXRhLCBwcm9jZXNzLCBhbmQgbWVudS5cbiAgICogQHBhcmFtIG9wdGlvbnMgSG9zdCBydW50aW1lIG92ZXJyaWRlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRlZmluaXRpb246IENsaVNlcnZpY2VEZWZpbml0aW9uLCBvcHRpb25zOiBDbGlTZXJ2aWNlUnVudGltZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZGVmaW5pdGlvbiA9IENsaVNlcnZpY2VEZWZpbml0aW9uU2NoZW1hLnBhcnNlKGRlZmluaXRpb24pO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZGVmYXVsdFJ1bnRpbWVDb250ZXh0KCk7XG4gICAgdGhpcy5ydW50aW1lID0ge1xuICAgICAgcGxhdGZvcm06IG9wdGlvbnMucGxhdGZvcm0gPz8gZGVmYXVsdHMucGxhdGZvcm0sXG4gICAgICBlbnZpcm9ubWVudDogb3B0aW9ucy5lbnZpcm9ubWVudCA/PyBkZWZhdWx0cy5lbnZpcm9ubWVudCxcbiAgICAgIGhvbWVEaXJlY3Rvcnk6IG9wdGlvbnMuaG9tZURpcmVjdG9yeSA/PyBkZWZhdWx0cy5ob21lRGlyZWN0b3J5LFxuICAgICAgdGVtcG9yYXJ5RGlyZWN0b3J5OiBvcHRpb25zLnRlbXBvcmFyeURpcmVjdG9yeSA/PyBkZWZhdWx0cy50ZW1wb3JhcnlEaXJlY3RvcnksXG4gICAgfTtcbiAgICB0aGlzLmdsb2JhbEhvbWVEaXJlY3RvcnkgPVxuICAgICAgb3B0aW9ucy5nbG9iYWxIb21lRGlyZWN0b3J5ID8/IGpvaW4odGhpcy5ydW50aW1lLmhvbWVEaXJlY3RvcnksIFwiLmRieC10b29sc1wiKTtcbiAgICB0aGlzLmJ1bkV4ZWN1dGFibGUgPSBvcHRpb25zLmJ1bkV4ZWN1dGFibGUgPz8gcmVzb2x2ZUJ1bkV4ZWN1dGFibGUoKTtcbiAgICB0aGlzLmNvbXBpbGVyID1cbiAgICAgIG9wdGlvbnMuY29tcGlsZSA/P1xuICAgICAgKChlbnRyeXBvaW50LCBvdXRwdXQsIHdvcmtpbmdEaXJlY3RvcnksIGV4dGVybmFsKSA9PlxuICAgICAgICBjb21waWxlV2l0aEJ1bih0aGlzLmJ1bkV4ZWN1dGFibGUsIGVudHJ5cG9pbnQsIG91dHB1dCwgd29ya2luZ0RpcmVjdG9yeSwgZXh0ZXJuYWwpKTtcbiAgICB0aGlzLnJ1bnRpbWVJbnN0YWxsZXIgPSBvcHRpb25zLmluc3RhbGxSdW50aW1lID8/IGluc3RhbGxTZXJ2aWNlUnVudGltZTtcbiAgICB0aGlzLmhvc3RFbnRyeXBvaW50ID0gb3B0aW9ucy5ob3N0RW50cnlwb2ludCA/PyByZXNvbHZlSG9zdEVudHJ5cG9pbnQoKTtcbiAgICB0aGlzLnRyYXlFeGVjdXRhYmxlID0gb3B0aW9ucy50cmF5RXhlY3V0YWJsZSA/PyByZXNvbHZlVHJheUV4ZWN1dGFibGUodGhpcy5ydW50aW1lLnBsYXRmb3JtKTtcbiAgfVxuXG4gIC8qKiBJbnN0YWxsIHRoZSBsb2dpbiBlbnRyeSBhbmQgb3B0aW9uYWxseSBzdGFydCB0aGUgc2VydmljZS4gKi9cbiAgYXN5bmMgaW5zdGFsbChvcHRpb25zOiBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG93bmVyID0gcmVzb2x2ZVNlcnZpY2VQYWNrYWdlKHRoaXMuZGVmaW5pdGlvbi5wYWNrYWdlTmFtZSk7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gb3duZXIuZGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgZXh0ZXJuYWwgPSBuZXcgU2V0KGV4dGVybmFsUnVudGltZVBhY2thZ2VzKGRlcGVuZGVuY2llcykpO1xuICAgIGF3YWl0IHRoaXMucnVudGltZUluc3RhbGxlcihcbiAgICAgIHRoaXMuYnVuRXhlY3V0YWJsZSxcbiAgICAgIHRoaXMuZ2xvYmFsSG9tZURpcmVjdG9yeSxcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpLmZpbHRlcigoW25hbWVdKSA9PiBleHRlcm5hbC5oYXMobmFtZSkpKSxcbiAgICApO1xuICAgIGNvbnN0IHBhdGhzID0gcmVzb2x2ZVNlcnZpY2VQYXRocyh0aGlzLmRlZmluaXRpb24sIHRoaXMucnVudGltZSk7XG4gICAgY29uc3QgaW5zdGFsbGVkRGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMuaW5zdGFsbERlZmluaXRpb24ob3duZXIpO1xuICAgIGNvbnN0IGhvc3QgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbXBpbGVkQmluYXJ5KFxuICAgICAgdGhpcy5iaW5hcnlOYW1lKGluc3RhbGxlZERlZmluaXRpb24sIFwic2VydmljZVwiKSxcbiAgICAgIHRoaXMuaG9zdEVudHJ5cG9pbnQsXG4gICAgICByZXNvbHZlKGRpcm5hbWUodGhpcy5ob3N0RW50cnlwb2ludCksIFwiLi5cIiksXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVRyYXlCaW5hcnkoKTtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKTtcbiAgICBhd2FpdCB3cml0ZVNlcnZpY2VEZWZpbml0aW9uKHBhdGhzLmNvbmZpZ0ZpbGUsIGluc3RhbGxlZERlZmluaXRpb24pO1xuICAgIGF3YWl0IGluc3RhbGxTdGFydHVwKFxuICAgICAgaW5zdGFsbGVkRGVmaW5pdGlvbixcbiAgICAgIHBhdGhzLFxuICAgICAgdGhpcy5ydW50aW1lLFxuICAgICAgdGhpcy5sYXVuY2goaG9zdC5wYXRoLCBwYXRocy5jb25maWdGaWxlKSxcbiAgICApO1xuICAgIGlmIChvcHRpb25zLnN0YXJ0ID8/IHRydWUpIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIC8qKiBTdGFydCB0aGUgaW5zdGFsbGVkIHNlcnZpY2Ugd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBydW5uaW5nLiAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXRocyA9IHJlc29sdmVTZXJ2aWNlUGF0aHModGhpcy5kZWZpbml0aW9uLCB0aGlzLnJ1bnRpbWUpO1xuICAgIGlmICghKGF3YWl0IHRoaXMuc3RhdHVzKCkpLmluc3RhbGxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuZGVmaW5pdGlvbi5uYW1lfSBpcyBub3QgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIGlmICgoYXdhaXQgcmVxdWVzdFNlcnZpY2VDb250cm9sKHBhdGhzLmNvbnRyb2xBZGRyZXNzLCBcInN0YXR1c1wiKSkgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5zdGFsbGVkRGVmaW5pdGlvbiA9IGF3YWl0IHJlYWRTZXJ2aWNlRGVmaW5pdGlvbihwYXRocy5jb25maWdGaWxlKTtcbiAgICBjb25zdCBsYXVuY2ggPSB0aGlzLmxhdW5jaChcbiAgICAgIHRoaXMuYmluYXJ5Q29udGV4dCh0aGlzLmJpbmFyeU5hbWUoaW5zdGFsbGVkRGVmaW5pdGlvbiwgXCJzZXJ2aWNlXCIpKS5wYXRoLFxuICAgICAgcGF0aHMuY29uZmlnRmlsZSxcbiAgICApO1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24obGF1bmNoLmV4ZWN1dGFibGUsIGxhdW5jaC5hcmd1bWVudHMsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86IFwiaWdub3JlXCIsXG4gICAgfSk7XG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICB3YWl0Rm9yU3RhdGUoXG4gICAgICAgIGFzeW5jICgpID0+IChhd2FpdCByZXF1ZXN0U2VydmljZUNvbnRyb2wocGF0aHMuY29udHJvbEFkZHJlc3MsIFwic3RhdHVzXCIpKSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICB0cnVlLFxuICAgICAgICBERUZBVUxUX1NUQVJUX1RJTUVPVVRfTUlMTElTRUNPTkRTLFxuICAgICAgICBgJHt0aGlzLmRlZmluaXRpb24ubmFtZX0gZGlkIG5vdCBzdGFydGAsXG4gICAgICApLFxuICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgICAgICBjaGlsZC5vbmNlKFwiZXhpdFwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgJHt0aGlzLmRlZmluaXRpb24ubmFtZX0gaG9zdCBleGl0ZWQgYmVmb3JlIHN0YXJ0dXAgKCR7c2lnbmFsID8/IFN0cmluZyhjb2RlKX0pYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBydW5uaW5nIHRyYXkgaG9zdCBhbmQgaXRzIG1hbmFnZWQgY2hpbGQgcHJvY2Vzcy4gKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXRocyA9IHJlc29sdmVTZXJ2aWNlUGF0aHModGhpcy5kZWZpbml0aW9uLCB0aGlzLnJ1bnRpbWUpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFNlcnZpY2VDb250cm9sKHBhdGhzLmNvbnRyb2xBZGRyZXNzLCBcInN0b3BcIik7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuO1xuICAgIGF3YWl0IHdhaXRGb3JTdGF0ZShcbiAgICAgIGFzeW5jICgpID0+IChhd2FpdCByZXF1ZXN0U2VydmljZUNvbnRyb2wocGF0aHMuY29udHJvbEFkZHJlc3MsIFwic3RhdHVzXCIpKSAhPT0gdW5kZWZpbmVkLFxuICAgICAgZmFsc2UsXG4gICAgICBERUZBVUxUX1NUT1BfVElNRU9VVF9NSUxMSVNFQ09ORFMsXG4gICAgICBgJHt0aGlzLmRlZmluaXRpb24ubmFtZX0gZGlkIG5vdCBzdG9wYCxcbiAgICApO1xuICB9XG5cbiAgLyoqIFN0b3AgYW5kIHN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZS4gKi9cbiAgYXN5bmMgcmVzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0KCk7XG4gIH1cblxuICAvKiogU3RvcCB0aGUgc2VydmljZSBhbmQgcmVtb3ZlIGl0cyBsb2dpbiBlbnRyeSBhbmQgcGFja2FnZS1vd25lZCBzdGF0ZS4gKi9cbiAgYXN5bmMgdW5pbnN0YWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGhzID0gcmVzb2x2ZVNlcnZpY2VQYXRocyh0aGlzLmRlZmluaXRpb24sIHRoaXMucnVudGltZSk7XG4gICAgYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgYXdhaXQgcmVtb3ZlU3RhcnR1cChwYXRocyk7XG4gICAgYXdhaXQgcm0ocGF0aHMuZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cblxuICAvKiogUmVhZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gYW5kIHByb2Nlc3Mgc3RhdGUuICovXG4gIGFzeW5jIHN0YXR1cygpOiBQcm9taXNlPENsaVNlcnZpY2VTdGF0dXM+IHtcbiAgICBjb25zdCBwYXRocyA9IHJlc29sdmVTZXJ2aWNlUGF0aHModGhpcy5kZWZpbml0aW9uLCB0aGlzLnJ1bnRpbWUpO1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGV4aXN0c1N5bmMocGF0aHMuY29uZmlnRmlsZSk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0U2VydmljZUNvbnRyb2wocGF0aHMuY29udHJvbEFkZHJlc3MsIFwic3RhdHVzXCIpO1xuICAgIHJldHVybiB7XG4gICAgICBpbnN0YWxsZWQsXG4gICAgICBydW5uaW5nOiByZXNwb25zZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgLi4uKHJlc3BvbnNlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcGlkOiByZXNwb25zZS5waWQsXG4gICAgICAgICAgICAuLi4ocmVzcG9uc2Uuc2VydmljZVBpZCA/IHsgc2VydmljZVBpZDogcmVzcG9uc2Uuc2VydmljZVBpZCB9IDoge30pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbGF1bmNoKGV4ZWN1dGFibGU6IHN0cmluZywgY29uZmlnRmlsZTogc3RyaW5nKTogU2VydmljZUxhdW5jaCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBhcmd1bWVudHM6IFtcIi0tc2VydmljZS1jb25maWdcIiwgY29uZmlnRmlsZV0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5zdGFsbERlZmluaXRpb24ob3duZXI6IFNlcnZpY2VQYWNrYWdlKTogUHJvbWlzZTxDbGlTZXJ2aWNlRGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYS5wYXJzZSh7XG4gICAgICAuLi50aGlzLmRlZmluaXRpb24sXG4gICAgICB2ZXJzaW9uOiB0aGlzLmRlZmluaXRpb24udmVyc2lvbiA/PyBvd25lci52ZXJzaW9uLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBkZWZpbml0aW9uLmNvbW1hbmRcbiAgICAgID8gYXdhaXQgdGhpcy5pbnN0YWxsQ29tbWFuZChkZWZpbml0aW9uLCBvd25lciwgZGVmaW5pdGlvbi5jb21tYW5kLCBcImNvbW1hbmRcIilcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1lbnU6IENsaVNlcnZpY2VNZW51SXRlbVtdID0gW107XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIChkZWZpbml0aW9uLm1lbnUgPz8gW10pLmVudHJpZXMoKSkge1xuICAgICAgbWVudS5wdXNoKFxuICAgICAgICBpdGVtLnR5cGUgPT09IFwiY29tbWFuZFwiXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGF3YWl0IHRoaXMuaW5zdGFsbENvbW1hbmQoXG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgICAgICBpdGVtLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgYG1lbnUtJHtpbmRleCArIDF9YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGl0ZW0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWEucGFyc2Uoe1xuICAgICAgLi4uZGVmaW5pdGlvbixcbiAgICAgIC4uLihjb21tYW5kID8geyBjb21tYW5kIH0gOiB7fSksXG4gICAgICAuLi4obWVudS5sZW5ndGggPiAwID8geyBtZW51IH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc3RhbGxDb21tYW5kKFxuICAgIGRlZmluaXRpb246IENsaVNlcnZpY2VEZWZpbml0aW9uLFxuICAgIG93bmVyOiBTZXJ2aWNlUGFja2FnZSxcbiAgICBjb21tYW5kOiBDbGlTZXJ2aWNlQ29tbWFuZCxcbiAgICBwdXJwb3NlOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q2xpU2VydmljZUNvbW1hbmQ+IHtcbiAgICBpZiAoY29tbWFuZC5leGVjdXRhYmxlKSByZXR1cm4gY29tbWFuZDtcbiAgICBjb25zdCBlbnRyeXBvaW50ID0gY29tbWFuZC5lbnRyeXBvaW50ID8/IG93bmVyLmJpbihjb21tYW5kLmJpbk5hbWUpO1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IHRoaXMuZW5zdXJlQ29tcGlsZWRCaW5hcnkoXG4gICAgICB0aGlzLmJpbmFyeU5hbWUoZGVmaW5pdGlvbiwgcHVycG9zZSksXG4gICAgICByZXNvbHZlKGVudHJ5cG9pbnQpLFxuICAgICAgb3duZXIuZGlyZWN0b3J5LFxuICAgICAgZXh0ZXJuYWxSdW50aW1lUGFja2FnZXMob3duZXIuZGVwZW5kZW5jaWVzKCkpLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4ZWN1dGFibGU6IGluc3RhbGxlZC5wYXRoLFxuICAgICAgLi4uKGNvbW1hbmQuYXJndW1lbnRzID8geyBhcmd1bWVudHM6IGNvbW1hbmQuYXJndW1lbnRzIH0gOiB7fSksXG4gICAgICAuLi4oY29tbWFuZC5lbnZpcm9ubWVudCA/IHsgZW52aXJvbm1lbnQ6IGNvbW1hbmQuZW52aXJvbm1lbnQgfSA6IHt9KSxcbiAgICAgIGN3ZDogY29tbWFuZC5jd2QgPz8gdGhpcy5nbG9iYWxIb21lRGlyZWN0b3J5LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbXBpbGVkQmluYXJ5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gICAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICAgIGV4dGVybmFsOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICApOiBQcm9taXNlPGJpbi5CaW5Db250ZXh0PiB7XG4gICAgcmV0dXJuIGJpbi5lbnN1cmUoXG4gICAgICBuYW1lLFxuICAgICAgYXN5bmMgKHsgdGVtcERpciB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGpvaW4odGVtcERpciwgZXhlY3V0YWJsZU5hbWUobmFtZSwgdGhpcy5ydW50aW1lLnBsYXRmb3JtKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXIoZW50cnlwb2ludCwgb3V0cHV0LCB3b3JraW5nRGlyZWN0b3J5LCBleHRlcm5hbCk7XG4gICAgICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKG91dHB1dCkuaHJlZjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlc3RpbmF0aW9uOiB0aGlzLmJpbmFyeUNvbnRleHQobmFtZSksXG4gICAgICAgIHNraXBWZXJzaW9uQ2hlY2s6IHRydWUsXG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVUcmF5QmluYXJ5KCk6IFByb21pc2U8YmluLkJpbkNvbnRleHQ+IHtcbiAgICBjb25zdCBuYW1lID0gdHJheUV4ZWN1dGFibGVOYW1lKHRoaXMucnVudGltZS5wbGF0Zm9ybSk7XG4gICAgY29uc3QgYmluRGlyID0gam9pbih0aGlzLmdsb2JhbEhvbWVEaXJlY3RvcnksIFwiYmluXCIsIFwidHJheWJpblwiKTtcbiAgICByZXR1cm4gYmluLmVuc3VyZShuYW1lLCBwYXRoVG9GaWxlVVJMKHRoaXMudHJheUV4ZWN1dGFibGUpLmhyZWYsIHtcbiAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgIHJvb3Q6IHRoaXMuZ2xvYmFsSG9tZURpcmVjdG9yeSxcbiAgICAgICAgYmluRGlyLFxuICAgICAgICBwYXRoOiBqb2luKGJpbkRpciwgbmFtZSksXG4gICAgICB9LFxuICAgICAgc2tpcFZlcnNpb25DaGVjazogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluYXJ5Q29udGV4dChuYW1lOiBzdHJpbmcpOiBiaW4uQmluQ29udGV4dCB7XG4gICAgY29uc3QgYmluRGlyID0gam9pbih0aGlzLmdsb2JhbEhvbWVEaXJlY3RvcnksIFwiYmluXCIpO1xuICAgIHJldHVybiB7XG4gICAgICByb290OiB0aGlzLmdsb2JhbEhvbWVEaXJlY3RvcnksXG4gICAgICBiaW5EaXIsXG4gICAgICBwYXRoOiBqb2luKGJpbkRpciwgZXhlY3V0YWJsZU5hbWUobmFtZSwgdGhpcy5ydW50aW1lLnBsYXRmb3JtKSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYmluYXJ5TmFtZShkZWZpbml0aW9uOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbiwgcHVycG9zZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gc2FmZVRva2VuKGRlZmluaXRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKS5yZXBsYWNlKC9bLl9dKy9nLCBcIi1cIik7XG4gICAgcmV0dXJuIHB1cnBvc2UgPT09IFwic2VydmljZVwiID8gbmFtZSA6IGAke25hbWV9LSR7cHVycG9zZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVIb3N0RW50cnlwb2ludCgpOiBzdHJpbmcge1xuICBjb25zdCBjdXJyZW50ID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBzb3VyY2UgPVxuICAgIGV4dG5hbWUoY3VycmVudCkgPT09IFwiLnRzXCJcbiAgICAgID8gam9pbihkaXJuYW1lKGN1cnJlbnQpLCBcIl9ob3N0LnRzXCIpXG4gICAgICA6IHJlc29sdmUoZGlybmFtZShjdXJyZW50KSwgXCIuLlwiLCBcIi4uXCIsIFwic3JjXCIsIFwiX2hvc3QudHNcIik7XG4gIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gIHRocm93IG5ldyBFcnJvcihgY291bGQgbm90IHJlc29sdmUgY2xpLXNlcnZpY2UgaG9zdCBzb3VyY2U6ICR7c291cmNlfWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQnVuRXhlY3V0YWJsZSgpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXCJidW4vYmluL2J1bi5leGVcIik7XG59XG5cbmZ1bmN0aW9uIHRyYXlFeGVjdXRhYmxlTmFtZShwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtKTogc3RyaW5nIHtcbiAgaWYgKHBsYXRmb3JtID09PSBcImRhcndpblwiKSByZXR1cm4gXCJ0cmF5X2Rhcndpbl9yZWxlYXNlXCI7XG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJsaW51eFwiKSByZXR1cm4gXCJ0cmF5X2xpbnV4X3JlbGVhc2VcIjtcbiAgaWYgKHBsYXRmb3JtID09PSBcIndpbjMyXCIpIHJldHVybiBcInRyYXlfd2luZG93c19yZWxlYXNlLmV4ZVwiO1xuICB0aHJvdyBuZXcgRXJyb3IoYHN5c3RyYXkyIGRvZXMgbm90IHN1cHBvcnQgJHtwbGF0Zm9ybX1gKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRyYXlFeGVjdXRhYmxlKHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0pOiBzdHJpbmcge1xuICBjb25zdCBtYW5pZmVzdCA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKS5yZXNvbHZlKFwic3lzdHJheTIvcGFja2FnZS5qc29uXCIpO1xuICByZXR1cm4gam9pbihkaXJuYW1lKG1hbmlmZXN0KSwgXCJ0cmF5YmluXCIsIHRyYXlFeGVjdXRhYmxlTmFtZShwbGF0Zm9ybSkpO1xufVxuXG5mdW5jdGlvbiBleGVjdXRhYmxlTmFtZShuYW1lOiBzdHJpbmcsIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0pOiBzdHJpbmcge1xuICByZXR1cm4gcGxhdGZvcm0gPT09IFwid2luMzJcIiA/IGAke25hbWV9LmV4ZWAgOiBuYW1lO1xufVxuXG5mdW5jdGlvbiBzYWZlVG9rZW4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRva2VuID0gdmFsdWUucmVwbGFjZSgvW15hLXowLTkuXy1dKy9naSwgXCItXCIpLnJlcGxhY2UoL14tK3wtKyQvZywgXCJcIik7XG4gIGlmICghdG9rZW4pIHRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgYmluYXJ5IHZlcnNpb246ICR7dmFsdWV9YCk7XG4gIHJldHVybiB0b2tlbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGlsZVdpdGhCdW4oXG4gIGJ1bkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZW50cnlwb2ludDogc3RyaW5nLFxuICBvdXRwdXQ6IHN0cmluZyxcbiAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICBleHRlcm5hbDogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBiZWZvcmUgPSBhd2FpdCBidW5CdWlsZEFydGlmYWN0cyh3b3JraW5nRGlyZWN0b3J5KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjLnNwYXduKFxuICAgICAgYnVuRXhlY3V0YWJsZSxcbiAgICAgIFtcbiAgICAgICAgXCJidWlsZFwiLFxuICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICBcIi0tY29tcGlsZVwiLFxuICAgICAgICBcIi0tY29tcGlsZS1hdXRvbG9hZC1wYWNrYWdlLWpzb25cIixcbiAgICAgICAgXCItLW91dGZpbGVcIixcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICAuLi5leHRlcm5hbC5mbGF0TWFwKChkZXBlbmRlbmN5KSA9PiBbXCItLWV4dGVybmFsXCIsIGRlcGVuZGVuY3ldKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGNoZWNrOiB0cnVlLFxuICAgICAgICBjd2Q6IHdvcmtpbmdEaXJlY3RvcnksXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgIEJVTl9UTVBESVI6IGRpcm5hbWUob3V0cHV0KSxcbiAgICAgICAgICBUTVBESVI6IGRpcm5hbWUob3V0cHV0KSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgICB9LFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBhd2FpdCBidW5CdWlsZEFydGlmYWN0cyh3b3JraW5nRGlyZWN0b3J5KSkge1xuICAgICAgaWYgKCFiZWZvcmUuaGFzKGFydGlmYWN0KSkge1xuICAgICAgICBhd2FpdCBybShqb2luKHdvcmtpbmdEaXJlY3RvcnksIGFydGlmYWN0KSwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1bkJ1aWxkQXJ0aWZhY3RzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICByZXR1cm4gbmV3IFNldChcbiAgICAoYXdhaXQgcmVhZGRpcihkaXJlY3RvcnkpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJiBuYW1lLmVuZHNXaXRoKFwiLmJ1bi1idWlsZFwiKSlcbiAgICAgIC5zb3J0KCksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JTdGF0ZShcbiAgcmVhZDogKCkgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgZXhwZWN0ZWQ6IGJvb2xlYW4sXG4gIHRpbWVvdXRNaWxsaXNlY29uZHM6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNaWxsaXNlY29uZHM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAoKGF3YWl0IHJlYWQoKSkgPT09IGV4cGVjdGVkKSByZXR1cm47XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgUE9MTF9JTlRFUlZBTF9NSUxMSVNFQ09ORFMpKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG4iXX0=
|
|
323
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixtQkFBbUIsR0FFcEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFzQixNQUFNLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQ0wsMEJBQTBCLEdBSTNCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsTUFBTSxrQ0FBa0MsR0FBRyxNQUFNLENBQUM7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RUFBRSxDQUNWLENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLFlBQVksQ0FDekIsSUFBNEIsRUFDNUIsUUFBaUIsRUFDakIsbUJBQTJCLEVBQzNCLE9BQWU7SUFFZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsbUJBQW1CLENBQUM7SUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsS0FBSyxRQUFRO1lBQUUsT0FBTztRQUN4QyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLDBCQUEwQixDQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnN0YWxsLCBzdGFydCwgc3RvcCwgYW5kIGluc3BlY3QgYSBzeXN0ZW0tdHJheSB1c2VyIHNlcnZpY2UuXG4gKlxuICogVGhpcyBtb2R1bGUgb3ducyBjdXJyZW50LXVzZXIgc2VydmljZSBjb21waWxhdGlvbiBhbmQgbGlmZWN5Y2xlIGFjcm9zc1xuICogY29uc3VtaW5nIENMSXMuIFJldXNlIHtAbGluayBDbGlTZXJ2aWNlfSByYXRoZXIgdGhhbiBhZGRpbmcgcHJvZHVjdC1zcGVjaWZpY1xuICogaW5zdGFsbGVycywgdXYgUHl0aG9uIGVudmlyb25tZW50cywgc3RhcnR1cCByZWdpc3RyYXRpb24sIHJ1bnRpbWVcbiAqIGRpcmVjdG9yaWVzLCBvciBjb250cm9sIHNvY2tldHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkZGlyLCBybSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCwgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5pbXBvcnQgKiBhcyBiaW4gZnJvbSBcIkBkYngtdG9vbHMvY29yZS9iaW5cIjtcbmltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5cbmltcG9ydCB7IHJlYWRTZXJ2aWNlRGVmaW5pdGlvbiwgd3JpdGVTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL19jb25maWcudHNcIjtcbmltcG9ydCB7IHJlcXVlc3RTZXJ2aWNlQ29udHJvbCB9IGZyb20gXCIuL19jb250cm9sLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlU2VydmljZVBhY2thZ2UsIHR5cGUgU2VydmljZVBhY2thZ2UgfSBmcm9tIFwiLi9fcGFja2FnZS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJ1bnRpbWVDb250ZXh0LFxuICByZXNvbHZlU2VydmljZVBhdGhzLFxuICB0eXBlIFNlcnZpY2VSdW50aW1lQ29udGV4dCxcbn0gZnJvbSBcIi4vX3BhdGhzLnRzXCI7XG5pbXBvcnQge1xuICBleHRlcm5hbFJ1bnRpbWVQYWNrYWdlcyxcbiAgaW5zdGFsbFNlcnZpY2VQeXRob25QYWNrYWdlLFxuICBpbnN0YWxsU2VydmljZVJ1bnRpbWUsXG59IGZyb20gXCIuL19ydW50aW1lLnRzXCI7XG5pbXBvcnQgeyBpbnN0YWxsU3RhcnR1cCwgcmVtb3ZlU3RhcnR1cCwgdHlwZSBTZXJ2aWNlTGF1bmNoIH0gZnJvbSBcIi4vX3N0YXJ0dXAudHNcIjtcbmltcG9ydCB7XG4gIENsaVNlcnZpY2VEZWZpbml0aW9uU2NoZW1hLFxuICB0eXBlIENsaVNlcnZpY2VDb21tYW5kLFxuICB0eXBlIENsaVNlcnZpY2VEZWZpbml0aW9uLFxuICB0eXBlIENsaVNlcnZpY2VNZW51SXRlbSxcbn0gZnJvbSBcIi4vZGVmaW5pdGlvbi50c1wiO1xuXG5jb25zdCBERUZBVUxUX1NUQVJUX1RJTUVPVVRfTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuY29uc3QgREVGQVVMVF9TVE9QX1RJTUVPVVRfTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuY29uc3QgUE9MTF9JTlRFUlZBTF9NSUxMSVNFQ09ORFMgPSAxMDA7XG5cbi8qKiBDb21waWxlIG9uZSBUeXBlU2NyaXB0IG9yIEphdmFTY3JpcHQgZW50cnlwb2ludCBpbnRvIGEgc3RhbmRhbG9uZSBleGVjdXRhYmxlLiAqL1xuZXhwb3J0IHR5cGUgQ2xpU2VydmljZUNvbXBpbGVyID0gKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIG91dHB1dDogc3RyaW5nLFxuICB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcsXG4gIGV4dGVybmFsPzogcmVhZG9ubHkgc3RyaW5nW10sXG4pID0+IFByb21pc2U8dm9pZD47XG5cbi8qKiBJbnN0YWxsIGV4YWN0IGV4dGVybmFsIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIGludG8gdGhlIGRieC10b29scyBob21lLiAqL1xuZXhwb3J0IHR5cGUgQ2xpU2VydmljZVJ1bnRpbWVJbnN0YWxsZXIgPSAoXG4gIGJ1bkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIGRlcGVuZGVuY2llczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4pID0+IFByb21pc2U8dm9pZD47XG5cbi8qKiBJbnN0YWxsIGEgUHl0aG9uIHBhY2thZ2UgaW50byBhIHNlcnZpY2Utb3duZWQgdXYgZW52aXJvbm1lbnQuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlUHl0aG9uSW5zdGFsbGVyID0gKFxuICB1dkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIHBhY2thZ2VTcGVjaWZpZXI6IHN0cmluZyxcbiAgcHl0aG9uOiBzdHJpbmcsXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0sXG4pID0+IFByb21pc2U8c3RyaW5nPjtcblxuLyoqIEhvc3QgcnVudGltZSBvdmVycmlkZXMgZm9yIHRlc3RzLCBlbWJlZGRlZCBkaXN0cmlidXRpb25zLCBhbmQgbm9uc3RhbmRhcmQgaG9tZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaVNlcnZpY2VSdW50aW1lT3B0aW9ucyB7XG4gIC8qKiBPcGVyYXRpbmcgc3lzdGVtIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXJ0dXAgcmVnaXN0cmF0aW9uLiAqL1xuICByZWFkb25seSBwbGF0Zm9ybT86IE5vZGVKUy5QbGF0Zm9ybTtcbiAgLyoqIEVudmlyb25tZW50IHVzZWQgdG8gbG9jYXRlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMuICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogUmVhZG9ubHk8Tm9kZUpTLlByb2Nlc3NFbnY+O1xuICAvKiogSG9tZSBkaXJlY3RvcnkgdXNlZCB3aGVuIHBsYXRmb3JtIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYWJzZW50LiAqL1xuICByZWFkb25seSBob21lRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAvKiogVGVtcG9yYXJ5IGRpcmVjdG9yeSB1c2VkIGZvciB0aGUgbG9jYWwgY29udHJvbCBzb2NrZXQuICovXG4gIHJlYWRvbmx5IHRlbXBvcmFyeURpcmVjdG9yeT86IHN0cmluZztcbiAgLyoqIFNoYXJlZCBkYngtdG9vbHMgaG9tZSBjb250YWluaW5nIGluc3RhbGxlZCBzZXJ2aWNlIGJpbmFyaWVzLiAqL1xuICByZWFkb25seSBnbG9iYWxIb21lRGlyZWN0b3J5Pzogc3RyaW5nO1xuICAvKiogUGFja2FnZS1wcm92aWRlZCBCdW4gZXhlY3V0YWJsZSBvdmVycmlkZS4gKi9cbiAgcmVhZG9ubHkgYnVuRXhlY3V0YWJsZT86IHN0cmluZztcbiAgLyoqIHV2IGV4ZWN1dGFibGUgdXNlZCBmb3IgbWFuYWdlZCBQeXRob24gcGFja2FnZSBlbnZpcm9ubWVudHMuICovXG4gIHJlYWRvbmx5IHV2RXhlY3V0YWJsZT86IHN0cmluZztcbiAgLyoqIFN0YW5kYWxvbmUgY29tcGlsZXIgb3ZlcnJpZGUuICovXG4gIHJlYWRvbmx5IGNvbXBpbGU/OiBDbGlTZXJ2aWNlQ29tcGlsZXI7XG4gIC8qKiBFeHRlcm5hbCBydW50aW1lIGRlcGVuZGVuY3kgaW5zdGFsbGVyIG92ZXJyaWRlLiAqL1xuICByZWFkb25seSBpbnN0YWxsUnVudGltZT86IENsaVNlcnZpY2VSdW50aW1lSW5zdGFsbGVyO1xuICAvKiogUHl0aG9uIHBhY2thZ2UgaW5zdGFsbGVyIG92ZXJyaWRlLiAqL1xuICByZWFkb25seSBpbnN0YWxsUHl0aG9uPzogQ2xpU2VydmljZVB5dGhvbkluc3RhbGxlcjtcbiAgLyoqIFN5c3RlbS10cmF5IGhvc3Qgc291cmNlIGVudHJ5cG9pbnQgb3ZlcnJpZGUuICovXG4gIHJlYWRvbmx5IGhvc3RFbnRyeXBvaW50Pzogc3RyaW5nO1xuICAvKiogc3lzdHJheTIgbmF0aXZlIGV4ZWN1dGFibGUgb3ZlcnJpZGUuICovXG4gIHJlYWRvbmx5IHRyYXlFeGVjdXRhYmxlPzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBjb250cm9sbGluZyBzZXJ2aWNlIGluc3RhbGxhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zIHtcbiAgLyoqIFN0YXJ0IHRoZSBzZXJ2aWNlIGltbWVkaWF0ZWx5IGFmdGVyIHdyaXRpbmcgaXRzIGNvbmZpZ3VyYXRpb24gYW5kIGxvZ2luIGVudHJ5LiAqL1xuICByZWFkb25seSBzdGFydD86IGJvb2xlYW47XG59XG5cbi8qKiBDdXJyZW50IGluc3RhbGxhdGlvbiBhbmQgcHJvY2VzcyBzdGF0ZSBmb3IgYSBzeXN0ZW0tdHJheSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlTZXJ2aWNlU3RhdHVzIHtcbiAgLyoqIFdoZXRoZXIgdGhlIHNlcmlhbGl6ZWQgc2VydmljZSBkZWZpbml0aW9uIGV4aXN0cy4gKi9cbiAgcmVhZG9ubHkgaW5zdGFsbGVkOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdHJheSBob3N0IGFuc3dlcmVkIGl0cyBsb2NhbCBjb250cm9sIHNvY2tldC4gKi9cbiAgcmVhZG9ubHkgcnVubmluZzogYm9vbGVhbjtcbiAgLyoqIFRyYXkgaG9zdCBwcm9jZXNzIElEIHdoZW4gcnVubmluZy4gKi9cbiAgcmVhZG9ubHkgcGlkPzogbnVtYmVyO1xuICAvKiogTWFuYWdlZCBjaGlsZCBwcm9jZXNzIElEIHdoZW4gdGhlIGRlZmluaXRpb24gaW5jbHVkZXMgYSBjb21tYW5kLiAqL1xuICByZWFkb25seSBzZXJ2aWNlUGlkPzogbnVtYmVyO1xufVxuXG4vKiogTGlmZWN5Y2xlIGNvbnRyYWN0IGNvbnN1bWVkIGJ5IENMSSBjb21tYW5kIGJ1aWxkZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlTZXJ2aWNlTGlmZWN5Y2xlIHtcbiAgLyoqIEluc3RhbGwgdGhlIGxvZ2luIGVudHJ5IGFuZCBvcHRpb25hbGx5IHN0YXJ0IHRoZSBzZXJ2aWNlLiAqL1xuICBpbnN0YWxsKG9wdGlvbnM/OiBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogU3RhcnQgdGhlIGluc3RhbGxlZCBzZXJ2aWNlIHdoZW4gaXQgaXMgbm90IGFscmVhZHkgcnVubmluZy4gKi9cbiAgc3RhcnQoKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFN0b3AgdGhlIHJ1bm5pbmcgdHJheSBob3N0IGFuZCBpdHMgbWFuYWdlZCBjaGlsZCBwcm9jZXNzLiAqL1xuICBzdG9wKCk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBTdG9wIGFuZCBzdGFydCB0aGUgaW5zdGFsbGVkIHNlcnZpY2UuICovXG4gIHJlc3RhcnQoKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFN0b3AgdGhlIHNlcnZpY2UgYW5kIHJlbW92ZSBpdHMgbG9naW4gZW50cnkgYW5kIHBhY2thZ2Utb3duZWQgc3RhdGUuICovXG4gIHVuaW5zdGFsbCgpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogUmVhZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gYW5kIHByb2Nlc3Mgc3RhdGUuICovXG4gIHN0YXR1cygpOiBQcm9taXNlPENsaVNlcnZpY2VTdGF0dXM+O1xufVxuXG4vKiogQ3Jvc3MtcGxhdGZvcm0gbGlmZWN5Y2xlIG1hbmFnZXIgZm9yIG9uZSBzeXN0ZW0tdHJheSB1c2VyIHNlcnZpY2UuICovXG5leHBvcnQgY2xhc3MgQ2xpU2VydmljZSBpbXBsZW1lbnRzIENsaVNlcnZpY2VMaWZlY3ljbGUge1xuICByZWFkb25seSBkZWZpbml0aW9uOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFNlcnZpY2VSdW50aW1lQ29udGV4dDtcbiAgcHJpdmF0ZSByZWFkb25seSBnbG9iYWxIb21lRGlyZWN0b3J5OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVuRXhlY3V0YWJsZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHV2RXhlY3V0YWJsZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBpbGVyOiBDbGlTZXJ2aWNlQ29tcGlsZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZUluc3RhbGxlcjogQ2xpU2VydmljZVJ1bnRpbWVJbnN0YWxsZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHl0aG9uSW5zdGFsbGVyOiBDbGlTZXJ2aWNlUHl0aG9uSW5zdGFsbGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbnRyeXBvaW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJheUV4ZWN1dGFibGU6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbGlmZWN5Y2xlIG1hbmFnZXIgZnJvbSBhIHNlcmlhbGl6YWJsZSBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiBQcm9kdWN0LW93bmVkIHNlcnZpY2UgbWV0YWRhdGEsIHByb2Nlc3MsIGFuZCBtZW51LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBIb3N0IHJ1bnRpbWUgb3ZlcnJpZGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZGVmaW5pdGlvbjogQ2xpU2VydmljZURlZmluaXRpb24sIG9wdGlvbnM6IENsaVNlcnZpY2VSdW50aW1lT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5kZWZpbml0aW9uID0gQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWEucGFyc2UoZGVmaW5pdGlvbik7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBkZWZhdWx0UnVudGltZUNvbnRleHQoKTtcbiAgICB0aGlzLnJ1bnRpbWUgPSB7XG4gICAgICBwbGF0Zm9ybTogb3B0aW9ucy5wbGF0Zm9ybSA/PyBkZWZhdWx0cy5wbGF0Zm9ybSxcbiAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50ID8/IGRlZmF1bHRzLmVudmlyb25tZW50LFxuICAgICAgaG9tZURpcmVjdG9yeTogb3B0aW9ucy5ob21lRGlyZWN0b3J5ID8/IGRlZmF1bHRzLmhvbWVEaXJlY3RvcnksXG4gICAgICB0ZW1wb3JhcnlEaXJlY3Rvcnk6IG9wdGlvbnMudGVtcG9yYXJ5RGlyZWN0b3J5ID8/IGRlZmF1bHRzLnRlbXBvcmFyeURpcmVjdG9yeSxcbiAgICB9O1xuICAgIHRoaXMuZ2xvYmFsSG9tZURpcmVjdG9yeSA9XG4gICAgICBvcHRpb25zLmdsb2JhbEhvbWVEaXJlY3RvcnkgPz8gam9pbih0aGlzLnJ1bnRpbWUuaG9tZURpcmVjdG9yeSwgXCIuZGJ4LXRvb2xzXCIpO1xuICAgIHRoaXMuYnVuRXhlY3V0YWJsZSA9IG9wdGlvbnMuYnVuRXhlY3V0YWJsZSA/PyByZXNvbHZlQnVuRXhlY3V0YWJsZSgpO1xuICAgIHRoaXMudXZFeGVjdXRhYmxlID0gb3B0aW9ucy51dkV4ZWN1dGFibGUgPz8gXCJ1dlwiO1xuICAgIHRoaXMuY29tcGlsZXIgPVxuICAgICAgb3B0aW9ucy5jb21waWxlID8/XG4gICAgICAoKGVudHJ5cG9pbnQsIG91dHB1dCwgd29ya2luZ0RpcmVjdG9yeSwgZXh0ZXJuYWwpID0+XG4gICAgICAgIGNvbXBpbGVXaXRoQnVuKHRoaXMuYnVuRXhlY3V0YWJsZSwgZW50cnlwb2ludCwgb3V0cHV0LCB3b3JraW5nRGlyZWN0b3J5LCBleHRlcm5hbCkpO1xuICAgIHRoaXMucnVudGltZUluc3RhbGxlciA9IG9wdGlvbnMuaW5zdGFsbFJ1bnRpbWUgPz8gaW5zdGFsbFNlcnZpY2VSdW50aW1lO1xuICAgIHRoaXMucHl0aG9uSW5zdGFsbGVyID0gb3B0aW9ucy5pbnN0YWxsUHl0aG9uID8/IGluc3RhbGxTZXJ2aWNlUHl0aG9uUGFja2FnZTtcbiAgICB0aGlzLmhvc3RFbnRyeXBvaW50ID0gb3B0aW9ucy5ob3N0RW50cnlwb2ludCA/PyByZXNvbHZlSG9zdEVudHJ5cG9pbnQoKTtcbiAgICB0aGlzLnRyYXlFeGVjdXRhYmxlID0gb3B0aW9ucy50cmF5RXhlY3V0YWJsZSA/PyByZXNvbHZlVHJheUV4ZWN1dGFibGUodGhpcy5ydW50aW1lLnBsYXRmb3JtKTtcbiAgfVxuXG4gIC8qKiBJbnN0YWxsIHRoZSBsb2dpbiBlbnRyeSBhbmQgb3B0aW9uYWxseSBzdGFydCB0aGUgc2VydmljZS4gKi9cbiAgYXN5bmMgaW5zdGFsbChvcHRpb25zOiBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG93bmVyID0gcmVzb2x2ZVNlcnZpY2VQYWNrYWdlKHRoaXMuZGVmaW5pdGlvbi5wYWNrYWdlTmFtZSk7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gb3duZXIuZGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgZXh0ZXJuYWwgPSBuZXcgU2V0KGV4dGVybmFsUnVudGltZVBhY2thZ2VzKGRlcGVuZGVuY2llcykpO1xuICAgIGF3YWl0IHRoaXMucnVudGltZUluc3RhbGxlcihcbiAgICAgIHRoaXMuYnVuRXhlY3V0YWJsZSxcbiAgICAgIHRoaXMuZ2xvYmFsSG9tZURpcmVjdG9yeSxcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpLmZpbHRlcigoW25hbWVdKSA9PiBleHRlcm5hbC5oYXMobmFtZSkpKSxcbiAgICApO1xuICAgIGNvbnN0IHBhdGhzID0gcmVzb2x2ZVNlcnZpY2VQYXRocyh0aGlzLmRlZmluaXRpb24sIHRoaXMucnVudGltZSk7XG4gICAgY29uc3QgaW5zdGFsbGVkRGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMuaW5zdGFsbERlZmluaXRpb24ob3duZXIsIHBhdGhzLmRpcmVjdG9yeSk7XG4gICAgY29uc3QgaG9zdCA9IGF3YWl0IHRoaXMuZW5zdXJlQ29tcGlsZWRCaW5hcnkoXG4gICAgICB0aGlzLmJpbmFyeU5hbWUoaW5zdGFsbGVkRGVmaW5pdGlvbiwgXCJzZXJ2aWNlXCIpLFxuICAgICAgdGhpcy5ob3N0RW50cnlwb2ludCxcbiAgICAgIHJlc29sdmUoZGlybmFtZSh0aGlzLmhvc3RFbnRyeXBvaW50KSwgXCIuLlwiKSxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlVHJheUJpbmFyeSgpO1xuICAgIGF3YWl0IHRoaXMuc3RvcCgpO1xuICAgIGF3YWl0IHdyaXRlU2VydmljZURlZmluaXRpb24ocGF0aHMuY29uZmlnRmlsZSwgaW5zdGFsbGVkRGVmaW5pdGlvbik7XG4gICAgYXdhaXQgaW5zdGFsbFN0YXJ0dXAoXG4gICAgICBpbnN0YWxsZWREZWZpbml0aW9uLFxuICAgICAgcGF0aHMsXG4gICAgICB0aGlzLnJ1bnRpbWUsXG4gICAgICB0aGlzLmxhdW5jaChob3N0LnBhdGgsIHBhdGhzLmNvbmZpZ0ZpbGUpLFxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuc3RhcnQgPz8gdHJ1ZSkgYXdhaXQgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgLyoqIFN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZSB3aGVuIGl0IGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcuICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGhzID0gcmVzb2x2ZVNlcnZpY2VQYXRocyh0aGlzLmRlZmluaXRpb24sIHRoaXMucnVudGltZSk7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5zdGF0dXMoKSkuaW5zdGFsbGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5kZWZpbml0aW9uLm5hbWV9IGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICB9XG4gICAgaWYgKChhd2FpdCByZXF1ZXN0U2VydmljZUNvbnRyb2wocGF0aHMuY29udHJvbEFkZHJlc3MsIFwic3RhdHVzXCIpKSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBjb25zdCBpbnN0YWxsZWREZWZpbml0aW9uID0gYXdhaXQgcmVhZFNlcnZpY2VEZWZpbml0aW9uKHBhdGhzLmNvbmZpZ0ZpbGUpO1xuICAgIGNvbnN0IGxhdW5jaCA9IHRoaXMubGF1bmNoKFxuICAgICAgdGhpcy5iaW5hcnlDb250ZXh0KHRoaXMuYmluYXJ5TmFtZShpbnN0YWxsZWREZWZpbml0aW9uLCBcInNlcnZpY2VcIikpLnBhdGgsXG4gICAgICBwYXRocy5jb25maWdGaWxlLFxuICAgICk7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihsYXVuY2guZXhlY3V0YWJsZSwgbGF1bmNoLmFyZ3VtZW50cywge1xuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICB9KTtcbiAgICBjaGlsZC51bnJlZigpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgIHdhaXRGb3JTdGF0ZShcbiAgICAgICAgYXN5bmMgKCkgPT4gKGF3YWl0IHJlcXVlc3RTZXJ2aWNlQ29udHJvbChwYXRocy5jb250cm9sQWRkcmVzcywgXCJzdGF0dXNcIikpICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHRydWUsXG4gICAgICAgIERFRkFVTFRfU1RBUlRfVElNRU9VVF9NSUxMSVNFQ09ORFMsXG4gICAgICAgIGAke3RoaXMuZGVmaW5pdGlvbi5uYW1lfSBkaWQgbm90IHN0YXJ0YCxcbiAgICAgICksXG4gICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF9yZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY2hpbGQub25jZShcImVycm9yXCIsIHJlamVjdCk7XG4gICAgICAgIGNoaWxkLm9uY2UoXCJleGl0XCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke3RoaXMuZGVmaW5pdGlvbi5uYW1lfSBob3N0IGV4aXRlZCBiZWZvcmUgc3RhcnR1cCAoJHtzaWduYWwgPz8gU3RyaW5nKGNvZGUpfSlgLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqIFN0b3AgdGhlIHJ1bm5pbmcgdHJheSBob3N0IGFuZCBpdHMgbWFuYWdlZCBjaGlsZCBwcm9jZXNzLiAqL1xuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGhzID0gcmVzb2x2ZVNlcnZpY2VQYXRocyh0aGlzLmRlZmluaXRpb24sIHRoaXMucnVudGltZSk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0U2VydmljZUNvbnRyb2wocGF0aHMuY29udHJvbEFkZHJlc3MsIFwic3RvcFwiKTtcbiAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG4gICAgYXdhaXQgd2FpdEZvclN0YXRlKFxuICAgICAgYXN5bmMgKCkgPT4gKGF3YWl0IHJlcXVlc3RTZXJ2aWNlQ29udHJvbChwYXRocy5jb250cm9sQWRkcmVzcywgXCJzdGF0dXNcIikpICE9PSB1bmRlZmluZWQsXG4gICAgICBmYWxzZSxcbiAgICAgIERFRkFVTFRfU1RPUF9USU1FT1VUX01JTExJU0VDT05EUyxcbiAgICAgIGAke3RoaXMuZGVmaW5pdGlvbi5uYW1lfSBkaWQgbm90IHN0b3BgLFxuICAgICk7XG4gIH1cblxuICAvKiogU3RvcCBhbmQgc3RhcnQgdGhlIGluc3RhbGxlZCBzZXJ2aWNlLiAqL1xuICBhc3luYyByZXN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc3RvcCgpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBzZXJ2aWNlIGFuZCByZW1vdmUgaXRzIGxvZ2luIGVudHJ5IGFuZCBwYWNrYWdlLW93bmVkIHN0YXRlLiAqL1xuICBhc3luYyB1bmluc3RhbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF0aHMgPSByZXNvbHZlU2VydmljZVBhdGhzKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5ydW50aW1lKTtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKTtcbiAgICBhd2FpdCByZW1vdmVTdGFydHVwKHBhdGhzKTtcbiAgICBhd2FpdCBybShwYXRocy5kaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBhbmQgcHJvY2VzcyBzdGF0ZS4gKi9cbiAgYXN5bmMgc3RhdHVzKCk6IFByb21pc2U8Q2xpU2VydmljZVN0YXR1cz4ge1xuICAgIGNvbnN0IHBhdGhzID0gcmVzb2x2ZVNlcnZpY2VQYXRocyh0aGlzLmRlZmluaXRpb24sIHRoaXMucnVudGltZSk7XG4gICAgY29uc3QgaW5zdGFsbGVkID0gZXhpc3RzU3luYyhwYXRocy5jb25maWdGaWxlKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RTZXJ2aWNlQ29udHJvbChwYXRocy5jb250cm9sQWRkcmVzcywgXCJzdGF0dXNcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluc3RhbGxlZCxcbiAgICAgIHJ1bm5pbmc6IHJlc3BvbnNlICE9PSB1bmRlZmluZWQsXG4gICAgICAuLi4ocmVzcG9uc2VcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwaWQ6IHJlc3BvbnNlLnBpZCxcbiAgICAgICAgICAgIC4uLihyZXNwb25zZS5zZXJ2aWNlUGlkID8geyBzZXJ2aWNlUGlkOiByZXNwb25zZS5zZXJ2aWNlUGlkIH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsYXVuY2goZXhlY3V0YWJsZTogc3RyaW5nLCBjb25maWdGaWxlOiBzdHJpbmcpOiBTZXJ2aWNlTGF1bmNoIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGFyZ3VtZW50czogW1wiLS1zZXJ2aWNlLWNvbmZpZ1wiLCBjb25maWdGaWxlXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbnN0YWxsRGVmaW5pdGlvbihcbiAgICBvd25lcjogU2VydmljZVBhY2thZ2UsXG4gICAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q2xpU2VydmljZURlZmluaXRpb24+IHtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWEucGFyc2Uoe1xuICAgICAgLi4udGhpcy5kZWZpbml0aW9uLFxuICAgICAgdmVyc2lvbjogdGhpcy5kZWZpbml0aW9uLnZlcnNpb24gPz8gb3duZXIudmVyc2lvbixcbiAgICB9KTtcbiAgICBpZiAoIWRlZmluaXRpb24udmVyc2lvbikgdGhyb3cgbmV3IEVycm9yKGAke2RlZmluaXRpb24ubmFtZX0gaGFzIG5vIGluc3RhbGxhYmxlIHZlcnNpb25gKTtcbiAgICBjb25zdCBweXRob25QYWNrYWdlID0gZGVmaW5pdGlvbi5weXRob25QYWNrYWdlXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5kZWZpbml0aW9uLnB5dGhvblBhY2thZ2UsXG4gICAgICAgICAgdmVyc2lvbjogZGVmaW5pdGlvbi5weXRob25QYWNrYWdlLnZlcnNpb24gPz8gZGVmaW5pdGlvbi52ZXJzaW9uLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBweXRob25FbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGlmIChweXRob25QYWNrYWdlKSB7XG4gICAgICBweXRob25FbnZpcm9ubWVudC5QWVRIT04gPSBhd2FpdCB0aGlzLnB5dGhvbkluc3RhbGxlcihcbiAgICAgICAgdGhpcy51dkV4ZWN1dGFibGUsXG4gICAgICAgIGpvaW4oZGlyZWN0b3J5LCBcInB5dGhvblwiKSxcbiAgICAgICAgYCR7cHl0aG9uUGFja2FnZS5uYW1lfT09JHtweXRob25QYWNrYWdlLnZlcnNpb259YCxcbiAgICAgICAgcHl0aG9uUGFja2FnZS5weXRob24sXG4gICAgICAgIHRoaXMucnVudGltZS5wbGF0Zm9ybSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1hbmQgPSBkZWZpbml0aW9uLmNvbW1hbmRcbiAgICAgID8gYXdhaXQgdGhpcy5pbnN0YWxsQ29tbWFuZChcbiAgICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIGRlZmluaXRpb24uY29tbWFuZCxcbiAgICAgICAgICBcImNvbW1hbmRcIixcbiAgICAgICAgICBweXRob25FbnZpcm9ubWVudCxcbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVudTogQ2xpU2VydmljZU1lbnVJdGVtW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2YgKGRlZmluaXRpb24ubWVudSA/PyBbXSkuZW50cmllcygpKSB7XG4gICAgICBtZW51LnB1c2goXG4gICAgICAgIGl0ZW0udHlwZSA9PT0gXCJjb21tYW5kXCJcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgY29tbWFuZDogYXdhaXQgdGhpcy5pbnN0YWxsQ29tbWFuZChcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgICAgIGl0ZW0uY29tbWFuZCxcbiAgICAgICAgICAgICAgICBgbWVudS0ke2luZGV4ICsgMX1gLFxuICAgICAgICAgICAgICAgIHB5dGhvbkVudmlyb25tZW50LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogaXRlbSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYS5wYXJzZSh7XG4gICAgICAuLi5kZWZpbml0aW9uLFxuICAgICAgLi4uKHB5dGhvblBhY2thZ2UgPyB7IHB5dGhvblBhY2thZ2UgfSA6IHt9KSxcbiAgICAgIC4uLihjb21tYW5kID8geyBjb21tYW5kIH0gOiB7fSksXG4gICAgICAuLi4obWVudS5sZW5ndGggPiAwID8geyBtZW51IH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc3RhbGxDb21tYW5kKFxuICAgIGRlZmluaXRpb246IENsaVNlcnZpY2VEZWZpbml0aW9uLFxuICAgIG93bmVyOiBTZXJ2aWNlUGFja2FnZSxcbiAgICBjb21tYW5kOiBDbGlTZXJ2aWNlQ29tbWFuZCxcbiAgICBwdXJwb3NlOiBzdHJpbmcsXG4gICAgcnVudGltZUVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgKTogUHJvbWlzZTxDbGlTZXJ2aWNlQ29tbWFuZD4ge1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0geyAuLi5jb21tYW5kLmVudmlyb25tZW50LCAuLi5ydW50aW1lRW52aXJvbm1lbnQgfTtcbiAgICBpZiAoY29tbWFuZC5leGVjdXRhYmxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21tYW5kLFxuICAgICAgICAuLi4oT2JqZWN0LmtleXMoZW52aXJvbm1lbnQpLmxlbmd0aCA+IDAgPyB7IGVudmlyb25tZW50IH0gOiB7fSksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gY29tbWFuZC5lbnRyeXBvaW50ID8/IG93bmVyLmJpbihjb21tYW5kLmJpbk5hbWUpO1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IHRoaXMuZW5zdXJlQ29tcGlsZWRCaW5hcnkoXG4gICAgICB0aGlzLmJpbmFyeU5hbWUoZGVmaW5pdGlvbiwgcHVycG9zZSksXG4gICAgICByZXNvbHZlKGVudHJ5cG9pbnQpLFxuICAgICAgb3duZXIuZGlyZWN0b3J5LFxuICAgICAgZXh0ZXJuYWxSdW50aW1lUGFja2FnZXMob3duZXIuZGVwZW5kZW5jaWVzKCkpLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4ZWN1dGFibGU6IGluc3RhbGxlZC5wYXRoLFxuICAgICAgLi4uKGNvbW1hbmQuYXJndW1lbnRzID8geyBhcmd1bWVudHM6IGNvbW1hbmQuYXJndW1lbnRzIH0gOiB7fSksXG4gICAgICAuLi4oT2JqZWN0LmtleXMoZW52aXJvbm1lbnQpLmxlbmd0aCA+IDAgPyB7IGVudmlyb25tZW50IH0gOiB7fSksXG4gICAgICBjd2Q6IGNvbW1hbmQuY3dkID8/IHRoaXMuZ2xvYmFsSG9tZURpcmVjdG9yeSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb21waWxlZEJpbmFyeShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZW50cnlwb2ludDogc3RyaW5nLFxuICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgICBleHRlcm5hbDogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKTogUHJvbWlzZTxiaW4uQmluQ29udGV4dD4ge1xuICAgIHJldHVybiBiaW4uZW5zdXJlKFxuICAgICAgbmFtZSxcbiAgICAgIGFzeW5jICh7IHRlbXBEaXIgfSkgPT4ge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBqb2luKHRlbXBEaXIsIGV4ZWN1dGFibGVOYW1lKG5hbWUsIHRoaXMucnVudGltZS5wbGF0Zm9ybSkpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyKGVudHJ5cG9pbnQsIG91dHB1dCwgd29ya2luZ0RpcmVjdG9yeSwgZXh0ZXJuYWwpO1xuICAgICAgICByZXR1cm4gcGF0aFRvRmlsZVVSTChvdXRwdXQpLmhyZWY7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkZXN0aW5hdGlvbjogdGhpcy5iaW5hcnlDb250ZXh0KG5hbWUpLFxuICAgICAgICBza2lwVmVyc2lvbkNoZWNrOiB0cnVlLFxuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVHJheUJpbmFyeSgpOiBQcm9taXNlPGJpbi5CaW5Db250ZXh0PiB7XG4gICAgY29uc3QgbmFtZSA9IHRyYXlFeGVjdXRhYmxlTmFtZSh0aGlzLnJ1bnRpbWUucGxhdGZvcm0pO1xuICAgIGNvbnN0IGJpbkRpciA9IGpvaW4odGhpcy5nbG9iYWxIb21lRGlyZWN0b3J5LCBcImJpblwiLCBcInRyYXliaW5cIik7XG4gICAgcmV0dXJuIGJpbi5lbnN1cmUobmFtZSwgcGF0aFRvRmlsZVVSTCh0aGlzLnRyYXlFeGVjdXRhYmxlKS5ocmVmLCB7XG4gICAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgICByb290OiB0aGlzLmdsb2JhbEhvbWVEaXJlY3RvcnksXG4gICAgICAgIGJpbkRpcixcbiAgICAgICAgcGF0aDogam9pbihiaW5EaXIsIG5hbWUpLFxuICAgICAgfSxcbiAgICAgIHNraXBWZXJzaW9uQ2hlY2s6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJpbmFyeUNvbnRleHQobmFtZTogc3RyaW5nKTogYmluLkJpbkNvbnRleHQge1xuICAgIGNvbnN0IGJpbkRpciA9IGpvaW4odGhpcy5nbG9iYWxIb21lRGlyZWN0b3J5LCBcImJpblwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgcm9vdDogdGhpcy5nbG9iYWxIb21lRGlyZWN0b3J5LFxuICAgICAgYmluRGlyLFxuICAgICAgcGF0aDogam9pbihiaW5EaXIsIGV4ZWN1dGFibGVOYW1lKG5hbWUsIHRoaXMucnVudGltZS5wbGF0Zm9ybSkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJpbmFyeU5hbWUoZGVmaW5pdGlvbjogQ2xpU2VydmljZURlZmluaXRpb24sIHB1cnBvc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHNhZmVUb2tlbihkZWZpbml0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkucmVwbGFjZSgvWy5fXSsvZywgXCItXCIpO1xuICAgIHJldHVybiBwdXJwb3NlID09PSBcInNlcnZpY2VcIiA/IG5hbWUgOiBgJHtuYW1lfS0ke3B1cnBvc2V9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlSG9zdEVudHJ5cG9pbnQoKTogc3RyaW5nIHtcbiAgY29uc3QgY3VycmVudCA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbiAgY29uc3Qgc291cmNlID1cbiAgICBleHRuYW1lKGN1cnJlbnQpID09PSBcIi50c1wiXG4gICAgICA/IGpvaW4oZGlybmFtZShjdXJyZW50KSwgXCJfaG9zdC50c1wiKVxuICAgICAgOiByZXNvbHZlKGRpcm5hbWUoY3VycmVudCksIFwiLi5cIiwgXCIuLlwiLCBcInNyY1wiLCBcIl9ob3N0LnRzXCIpO1xuICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSByZXR1cm4gc291cmNlO1xuICB0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCByZXNvbHZlIGNsaS1zZXJ2aWNlIGhvc3Qgc291cmNlOiAke3NvdXJjZX1gKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJ1bkV4ZWN1dGFibGUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKS5yZXNvbHZlKFwiYnVuL2Jpbi9idW4uZXhlXCIpO1xufVxuXG5mdW5jdGlvbiB0cmF5RXhlY3V0YWJsZU5hbWUocGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSk6IHN0cmluZyB7XG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIikgcmV0dXJuIFwidHJheV9kYXJ3aW5fcmVsZWFzZVwiO1xuICBpZiAocGxhdGZvcm0gPT09IFwibGludXhcIikgcmV0dXJuIFwidHJheV9saW51eF9yZWxlYXNlXCI7XG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSByZXR1cm4gXCJ0cmF5X3dpbmRvd3NfcmVsZWFzZS5leGVcIjtcbiAgdGhyb3cgbmV3IEVycm9yKGBzeXN0cmF5MiBkb2VzIG5vdCBzdXBwb3J0ICR7cGxhdGZvcm19YCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUcmF5RXhlY3V0YWJsZShwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtKTogc3RyaW5nIHtcbiAgY29uc3QgbWFuaWZlc3QgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZShcInN5c3RyYXkyL3BhY2thZ2UuanNvblwiKTtcbiAgcmV0dXJuIGpvaW4oZGlybmFtZShtYW5pZmVzdCksIFwidHJheWJpblwiLCB0cmF5RXhlY3V0YWJsZU5hbWUocGxhdGZvcm0pKTtcbn1cblxuZnVuY3Rpb24gZXhlY3V0YWJsZU5hbWUobmFtZTogc3RyaW5nLCBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBgJHtuYW1lfS5leGVgIDogbmFtZTtcbn1cblxuZnVuY3Rpb24gc2FmZVRva2VuKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0b2tlbiA9IHZhbHVlLnJlcGxhY2UoL1teYS16MC05Ll8tXSsvZ2ksIFwiLVwiKS5yZXBsYWNlKC9eLSt8LSskL2csIFwiXCIpO1xuICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIGJpbmFyeSB2ZXJzaW9uOiAke3ZhbHVlfWApO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBpbGVXaXRoQnVuKFxuICBidW5FeGVjdXRhYmxlOiBzdHJpbmcsXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgZXh0ZXJuYWw6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmVmb3JlID0gYXdhaXQgYnVuQnVpbGRBcnRpZmFjdHMod29ya2luZ0RpcmVjdG9yeSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYy5zcGF3bihcbiAgICAgIGJ1bkV4ZWN1dGFibGUsXG4gICAgICBbXG4gICAgICAgIFwiYnVpbGRcIixcbiAgICAgICAgZW50cnlwb2ludCxcbiAgICAgICAgXCItLWNvbXBpbGVcIixcbiAgICAgICAgXCItLWNvbXBpbGUtYXV0b2xvYWQtcGFja2FnZS1qc29uXCIsXG4gICAgICAgIFwiLS1vdXRmaWxlXCIsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgLi4uZXh0ZXJuYWwuZmxhdE1hcCgoZGVwZW5kZW5jeSkgPT4gW1wiLS1leHRlcm5hbFwiLCBkZXBlbmRlbmN5XSksXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBjaGVjazogdHJ1ZSxcbiAgICAgICAgY3dkOiB3b3JraW5nRGlyZWN0b3J5LFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICBCVU5fVE1QRElSOiBkaXJuYW1lKG91dHB1dCksXG4gICAgICAgICAgVE1QRElSOiBkaXJuYW1lKG91dHB1dCksXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgICAgfSxcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgYXdhaXQgYnVuQnVpbGRBcnRpZmFjdHMod29ya2luZ0RpcmVjdG9yeSkpIHtcbiAgICAgIGlmICghYmVmb3JlLmhhcyhhcnRpZmFjdCkpIHtcbiAgICAgICAgYXdhaXQgcm0oam9pbih3b3JraW5nRGlyZWN0b3J5LCBhcnRpZmFjdCksIHtcbiAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBidW5CdWlsZEFydGlmYWN0cyhkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgcmV0dXJuIG5ldyBTZXQoXG4gICAgKGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5KSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgbmFtZS5lbmRzV2l0aChcIi5idW4tYnVpbGRcIikpXG4gICAgICAuc29ydCgpLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yU3RhdGUoXG4gIHJlYWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gIGV4cGVjdGVkOiBib29sZWFuLFxuICB0aW1lb3V0TWlsbGlzZWNvbmRzOiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TWlsbGlzZWNvbmRzO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKChhd2FpdCByZWFkKCkpID09PSBleHBlY3RlZCkgcmV0dXJuO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIFBPTExfSU5URVJWQUxfTUlMTElTRUNPTkRTKSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dbx-tools/cli-service",
|
|
3
|
-
"description": "Cross-platform service lifecycle and system tray menus for CLIs",
|
|
3
|
+
"description": "Cross-platform service lifecycle, uv Python runtimes, and system tray menus for CLIs",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/reggie-db/dbx-tools.git",
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"typescript": "^5.9.3"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@dbx-tools/
|
|
26
|
+
"@dbx-tools/cli-args": "^0.9.46",
|
|
27
|
+
"@dbx-tools/core": "^0.9.46",
|
|
27
28
|
"bun": "1.3.14",
|
|
28
29
|
"commander": "^15.0.0",
|
|
29
30
|
"systray2": "^2.1.4",
|
|
@@ -59,7 +60,7 @@
|
|
|
59
60
|
"./package.json": "./package.json"
|
|
60
61
|
}
|
|
61
62
|
},
|
|
62
|
-
"version": "0.9.
|
|
63
|
+
"version": "0.9.46",
|
|
63
64
|
"types": "./lib/index.d.ts",
|
|
64
65
|
"dbxToolsConfig": {
|
|
65
66
|
"tags": [
|
package/src/_runtime.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
|
|
4
4
|
import * as exec from "@dbx-tools/core/exec";
|
|
@@ -41,6 +41,39 @@ export async function installServiceRuntime(
|
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/** Create a clean uv environment and install one exact Python package. */
|
|
45
|
+
export async function installServicePythonPackage(
|
|
46
|
+
uvExecutable: string,
|
|
47
|
+
directory: string,
|
|
48
|
+
packageSpecifier: string,
|
|
49
|
+
python: string,
|
|
50
|
+
platform: NodeJS.Platform,
|
|
51
|
+
): Promise<string> {
|
|
52
|
+
await rm(directory, { recursive: true, force: true });
|
|
53
|
+
await exec.spawn(
|
|
54
|
+
uvExecutable,
|
|
55
|
+
["venv", "--managed-python", "--no-project", "--python", python, directory],
|
|
56
|
+
{
|
|
57
|
+
check: true,
|
|
58
|
+
stdin: "ignore",
|
|
59
|
+
stdout: "capture",
|
|
60
|
+
stderr: "capture",
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
const executable = join(directory, platform === "win32" ? "Scripts/python.exe" : "bin/python");
|
|
64
|
+
await exec.spawn(
|
|
65
|
+
uvExecutable,
|
|
66
|
+
["pip", "install", "--python", executable, "--upgrade", packageSpecifier],
|
|
67
|
+
{
|
|
68
|
+
check: true,
|
|
69
|
+
stdin: "ignore",
|
|
70
|
+
stdout: "capture",
|
|
71
|
+
stderr: "capture",
|
|
72
|
+
},
|
|
73
|
+
);
|
|
74
|
+
return executable;
|
|
75
|
+
}
|
|
76
|
+
|
|
44
77
|
async function readOptionalRecord(path: string): Promise<Record<string, unknown>> {
|
|
45
78
|
try {
|
|
46
79
|
const value: unknown = JSON.parse(await readFile(path, "utf8"));
|
package/src/cli.ts
CHANGED
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { addArgs, parseArgs } from "@dbx-tools/cli-args/args";
|
|
10
11
|
import { Command } from "commander";
|
|
12
|
+
import { z } from "zod";
|
|
11
13
|
|
|
12
14
|
import type { CliServiceDefinition } from "./definition.ts";
|
|
13
15
|
import { CliService, type CliServiceLifecycle } from "./service.ts";
|
|
@@ -28,6 +30,15 @@ const DEFAULT_DEPENDENCIES: CliServiceCliDependencies = {
|
|
|
28
30
|
write: (value) => process.stdout.write(value),
|
|
29
31
|
};
|
|
30
32
|
|
|
33
|
+
export const CliServiceInstallOptionsSchema = z
|
|
34
|
+
.object({
|
|
35
|
+
start: z.boolean().default(true).describe("Start the service after installation."),
|
|
36
|
+
})
|
|
37
|
+
.strict()
|
|
38
|
+
.describe("Options for installing a current-user CLI service.");
|
|
39
|
+
|
|
40
|
+
export type CliServiceInstallOptions = z.output<typeof CliServiceInstallOptionsSchema>;
|
|
41
|
+
|
|
31
42
|
/** Build install, start, stop, restart, status, and uninstall commands for a service. */
|
|
32
43
|
export function buildServiceCommand(
|
|
33
44
|
source: CliServiceDefinitionSource,
|
|
@@ -41,13 +52,14 @@ export function buildServiceCommand(
|
|
|
41
52
|
: `Install and manage the ${source.name} desktop service`,
|
|
42
53
|
);
|
|
43
54
|
|
|
44
|
-
|
|
45
|
-
.command("install")
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
});
|
|
55
|
+
const install = addArgs(
|
|
56
|
+
command.command("install").description("Install the service for the current user and start it"),
|
|
57
|
+
CliServiceInstallOptionsSchema,
|
|
58
|
+
);
|
|
59
|
+
install.action(async () => {
|
|
60
|
+
const options = parseArgs(install, CliServiceInstallOptionsSchema);
|
|
61
|
+
await service().install({ start: options.start });
|
|
62
|
+
});
|
|
51
63
|
|
|
52
64
|
command
|
|
53
65
|
.command("start")
|
package/src/definition.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* @module
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { serializeArgs, type ArgumentSource } from "@dbx-tools/cli-args/args";
|
|
11
12
|
import { z } from "zod";
|
|
12
13
|
|
|
13
14
|
import { resolveServicePackage, servicePackageDefaults } from "./_package.ts";
|
|
@@ -51,6 +52,14 @@ export const CliServiceCommandSchema = z
|
|
|
51
52
|
/** A process launched by the system-tray service host. */
|
|
52
53
|
export type CliServiceCommand = z.infer<typeof CliServiceCommandSchema>;
|
|
53
54
|
|
|
55
|
+
/** Command input accepted by {@link defineService} before option serialization. */
|
|
56
|
+
export type CliServiceCommandInput = Omit<CliServiceCommand, "arguments"> & {
|
|
57
|
+
/** Positional or pre-serialized arguments placed before generated options. */
|
|
58
|
+
readonly arguments?: readonly string[];
|
|
59
|
+
/** Zod defaults or concrete option values converted into CLI flags. */
|
|
60
|
+
readonly options?: ArgumentSource;
|
|
61
|
+
};
|
|
62
|
+
|
|
54
63
|
/** A typed custom item inserted between the default service title and Quit item. */
|
|
55
64
|
export const CliServiceMenuItemSchema = z.discriminatedUnion("type", [
|
|
56
65
|
z.object({ type: z.literal("separator") }).readonly(),
|
|
@@ -73,6 +82,30 @@ export const CliServiceMenuItemSchema = z.discriminatedUnion("type", [
|
|
|
73
82
|
/** A typed custom item inserted between the default service title and Quit item. */
|
|
74
83
|
export type CliServiceMenuItem = z.infer<typeof CliServiceMenuItemSchema>;
|
|
75
84
|
|
|
85
|
+
/** Python package installed into a service-owned uv environment. */
|
|
86
|
+
export const CliServicePythonPackageSchema = z
|
|
87
|
+
.object({
|
|
88
|
+
name: z.string().min(1).describe("Python distribution name installed by uv."),
|
|
89
|
+
version: z
|
|
90
|
+
.string()
|
|
91
|
+
.min(1)
|
|
92
|
+
.optional()
|
|
93
|
+
.describe("Python distribution version. Defaults to the service package version."),
|
|
94
|
+
python: z
|
|
95
|
+
.string()
|
|
96
|
+
.min(1)
|
|
97
|
+
.default("3.11")
|
|
98
|
+
.describe("Python version request passed to uv when creating the environment."),
|
|
99
|
+
})
|
|
100
|
+
.readonly()
|
|
101
|
+
.describe("Python runtime package installed with uv for a managed service.");
|
|
102
|
+
|
|
103
|
+
/** Python package installed into a service-owned uv environment. */
|
|
104
|
+
export type CliServicePythonPackage = z.infer<typeof CliServicePythonPackageSchema>;
|
|
105
|
+
|
|
106
|
+
/** Python package input accepted before the default Python version is applied. */
|
|
107
|
+
export type CliServicePythonPackageInput = z.input<typeof CliServicePythonPackageSchema>;
|
|
108
|
+
|
|
76
109
|
/** Complete serializable definition consumed by the lifecycle manager and tray host. */
|
|
77
110
|
export const CliServiceDefinitionSchema = z
|
|
78
111
|
.object({
|
|
@@ -87,6 +120,9 @@ export const CliServiceDefinitionSchema = z
|
|
|
87
120
|
icon: z.string().min(1),
|
|
88
121
|
isTemplateIcon: z.boolean().optional(),
|
|
89
122
|
dataDirectory: z.string().min(1).optional(),
|
|
123
|
+
pythonPackage: CliServicePythonPackageSchema.optional().describe(
|
|
124
|
+
"Python runtime package installed into a service-owned uv environment.",
|
|
125
|
+
),
|
|
90
126
|
command: CliServiceCommandSchema.optional(),
|
|
91
127
|
menu: z.array(CliServiceMenuItemSchema).readonly().optional(),
|
|
92
128
|
})
|
|
@@ -98,9 +134,21 @@ export type CliServiceDefinition = z.infer<typeof CliServiceDefinitionSchema>;
|
|
|
98
134
|
/** Package-derived service fields plus caller-owned icon, process, and menu options. */
|
|
99
135
|
export type CliServiceDefinitionOptions = Omit<
|
|
100
136
|
CliServiceDefinition,
|
|
101
|
-
|
|
137
|
+
| "packageName"
|
|
138
|
+
| "id"
|
|
139
|
+
| "name"
|
|
140
|
+
| "version"
|
|
141
|
+
| "icon"
|
|
142
|
+
| "isTemplateIcon"
|
|
143
|
+
| "pythonPackage"
|
|
144
|
+
| "command"
|
|
102
145
|
> &
|
|
103
|
-
Partial<Pick<CliServiceDefinition, "id" | "name" | "version" | "icon" | "isTemplateIcon"
|
|
146
|
+
Partial<Pick<CliServiceDefinition, "id" | "name" | "version" | "icon" | "isTemplateIcon">> & {
|
|
147
|
+
/** Python package installed into a service-owned uv environment. */
|
|
148
|
+
readonly pythonPackage?: CliServicePythonPackageInput;
|
|
149
|
+
/** Service process command with optional schema or object-backed options. */
|
|
150
|
+
readonly command?: CliServiceCommandInput;
|
|
151
|
+
};
|
|
104
152
|
|
|
105
153
|
/** Define a service from an owning module URL or installed package name. */
|
|
106
154
|
export function defineService(
|
|
@@ -109,14 +157,32 @@ export function defineService(
|
|
|
109
157
|
): CliServiceDefinition {
|
|
110
158
|
const pkg = resolveServicePackage(packageReference);
|
|
111
159
|
const defaults = servicePackageDefaults(pkg);
|
|
160
|
+
const { command, ...definition } = options;
|
|
112
161
|
return CliServiceDefinitionSchema.parse({
|
|
113
|
-
...
|
|
162
|
+
...definition,
|
|
163
|
+
command: resolveServiceCommand(command),
|
|
114
164
|
packageName: pkg.name,
|
|
115
|
-
id:
|
|
116
|
-
name:
|
|
117
|
-
version:
|
|
118
|
-
icon:
|
|
119
|
-
isTemplateIcon:
|
|
165
|
+
id: definition.id ?? defaults.id,
|
|
166
|
+
name: definition.name ?? defaults.name,
|
|
167
|
+
version: definition.version ?? pkg.version,
|
|
168
|
+
icon: definition.icon ?? serviceTrayIcon(),
|
|
169
|
+
isTemplateIcon: definition.isTemplateIcon ?? process.platform === "darwin",
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function resolveServiceCommand(
|
|
174
|
+
command: CliServiceCommandInput | undefined,
|
|
175
|
+
): CliServiceCommand | undefined {
|
|
176
|
+
if (!command) return undefined;
|
|
177
|
+
const { options, ...definition } = command;
|
|
178
|
+
const arguments_ = [
|
|
179
|
+
...(definition.arguments ?? []),
|
|
180
|
+
...(options === undefined ? [] : serializeArgs(options)),
|
|
181
|
+
];
|
|
182
|
+
return CliServiceCommandSchema.parse({
|
|
183
|
+
...definition,
|
|
184
|
+
environment: { NODE_ENV: "production", ...definition.environment },
|
|
185
|
+
...(arguments_.length > 0 ? { arguments: arguments_ } : {}),
|
|
120
186
|
});
|
|
121
187
|
}
|
|
122
188
|
|