@dbx-tools/cli-service 0.9.43 → 0.9.47

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 CHANGED
@@ -1,8 +1,9 @@
1
1
  # @dbx-tools/cli-service
2
2
 
3
- Add desktop-service installation, lifecycle commands, and a tray menu to a
4
- Commander CLI. Users can keep your command running after their terminal closes
5
- and manage it through the same `service` commands on macOS, Linux, and Windows.
3
+ Add desktop-service installation, lifecycle commands, optional uv-managed
4
+ Python dependencies, and a tray menu to a Commander CLI. Users can keep your
5
+ command running after their terminal closes and manage it through the same
6
+ `service` commands on macOS, Linux, and Windows.
6
7
 
7
8
  ## Add Service Commands
8
9
 
@@ -29,6 +30,22 @@ Use `command.binName` when the package has multiple executable entries. Set
29
30
  package entrypoint. Managed commands default `NODE_ENV` to `production`; an
30
31
  explicit `command.environment.NODE_ENV` overrides it.
31
32
 
33
+ Set `pythonPackage` when the compiled service command needs a Python runtime:
34
+
35
+ ```ts
36
+ defineService(import.meta.url, {
37
+ pythonPackage: { name: "example-runtime" },
38
+ command: { arguments: ["serve"] },
39
+ });
40
+ ```
41
+
42
+ During installation, the service creates an isolated uv environment under its
43
+ data directory, installs the Python distribution at the service version, and
44
+ sets `PYTHON` to that environment's interpreter. `pythonPackage.python` selects
45
+ the Python version uv manages and defaults to `3.11`. uv must be available on
46
+ `PATH` during installation. Uninstalling the service removes the environment
47
+ with the rest of the service-owned data.
48
+
32
49
  `command.options` accepts either a concrete option object or a Zod object
33
50
  schema. Objects serialize their current values. Schemas parse `{}` and serialize
34
51
  their defaults. Boolean values become positive or negated flags, arrays become
package/index.ts CHANGED
@@ -3,14 +3,14 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
6
- export const PACKAGE_VERSION = "0.9.43";
6
+ export const PACKAGE_VERSION = "0.9.47";
7
7
  export * as cli from "./src/cli.ts";
8
8
  export * as definition from "./src/definition.ts";
9
9
  export * as icon from "./src/icon.ts";
10
10
  export * as service from "./src/service.ts";
11
11
  export { CliServiceInstallOptionsSchema } from "./src/cli.ts";
12
12
  export type { CliServiceDefinitionSource, CliServiceCliDependencies } from "./src/cli.ts";
13
- export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServiceDefinitionSchema } from "./src/definition.ts";
14
- export type { CliServiceCommand, CliServiceCommandInput, CliServiceMenuItem, CliServiceDefinition, CliServiceDefinitionOptions } from "./src/definition.ts";
13
+ export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.ts";
14
+ export type { CliServiceCommand, CliServiceCommandInput, CliServiceMenuItem, CliServicePythonPackage, CliServicePythonPackageInput, CliServiceDefinition, CliServiceDefinitionOptions } from "./src/definition.ts";
15
15
  export { CliService } from "./src/service.ts";
16
- export type { CliServiceCompiler, CliServiceRuntimeInstaller, CliServiceRuntimeOptions, CliServiceStatus, CliServiceLifecycle } from "./src/service.ts";
16
+ export type { CliServiceCompiler, CliServiceRuntimeInstaller, CliServicePythonInstaller, CliServiceRuntimeOptions, CliServiceStatus, CliServiceLifecycle } from "./src/service.ts";
package/lib/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
2
- export declare const PACKAGE_VERSION = "0.9.43";
2
+ export declare const PACKAGE_VERSION = "0.9.47";
3
3
  export * as cli from "./src/cli.ts";
4
4
  export * as definition from "./src/definition.ts";
5
5
  export * as icon from "./src/icon.ts";
6
6
  export * as service from "./src/service.ts";
7
7
  export { CliServiceInstallOptionsSchema } from "./src/cli.ts";
8
8
  export type { CliServiceDefinitionSource, CliServiceCliDependencies } from "./src/cli.ts";
9
- export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServiceDefinitionSchema } from "./src/definition.ts";
10
- export type { CliServiceCommand, CliServiceCommandInput, CliServiceMenuItem, CliServiceDefinition, CliServiceDefinitionOptions } from "./src/definition.ts";
9
+ export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.ts";
10
+ export type { CliServiceCommand, CliServiceCommandInput, CliServiceMenuItem, CliServicePythonPackage, CliServicePythonPackageInput, CliServiceDefinition, CliServiceDefinitionOptions } from "./src/definition.ts";
11
11
  export { CliService } from "./src/service.ts";
12
- export type { CliServiceCompiler, CliServiceRuntimeInstaller, CliServiceRuntimeOptions, CliServiceStatus, CliServiceLifecycle } from "./src/service.ts";
12
+ export type { CliServiceCompiler, CliServiceRuntimeInstaller, CliServicePythonInstaller, CliServiceRuntimeOptions, CliServiceStatus, CliServiceLifecycle } from "./src/service.ts";
package/lib/index.js CHANGED
@@ -2,12 +2,12 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
5
- export const PACKAGE_VERSION = "0.9.43";
5
+ export const PACKAGE_VERSION = "0.9.47";
6
6
  export * as cli from "./src/cli.js";
7
7
  export * as definition from "./src/definition.js";
8
8
  export * as icon from "./src/icon.js";
9
9
  export * as service from "./src/service.js";
10
10
  export { CliServiceInstallOptionsSchema } from "./src/cli.js";
11
- export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServiceDefinitionSchema } from "./src/definition.js";
11
+ export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.js";
12
12
  export { CliService } from "./src/service.js";
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFcEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGktc2VydmljZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjQzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgZGVmaW5pdGlvbiBmcm9tIFwiLi9zcmMvZGVmaW5pdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgaWNvbiBmcm9tIFwiLi9zcmMvaWNvbi50c1wiO1xuZXhwb3J0ICogYXMgc2VydmljZSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuZXhwb3J0IHsgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSwgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyB9IGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCB7IENsaVNlcnZpY2VDb21tYW5kU2NoZW1hLCBDbGlTZXJ2aWNlTWVudUl0ZW1TY2hlbWEsIENsaVNlcnZpY2VEZWZpbml0aW9uU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2RlZmluaXRpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2xpU2VydmljZUNvbW1hbmQsIENsaVNlcnZpY2VDb21tYW5kSW5wdXQsIENsaVNlcnZpY2VNZW51SXRlbSwgQ2xpU2VydmljZURlZmluaXRpb24sIENsaVNlcnZpY2VEZWZpbml0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9kZWZpbml0aW9uLnRzXCI7XG5leHBvcnQgeyBDbGlTZXJ2aWNlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2xpU2VydmljZUNvbXBpbGVyLCBDbGlTZXJ2aWNlUnVudGltZUluc3RhbGxlciwgQ2xpU2VydmljZVJ1bnRpbWVPcHRpb25zLCBDbGlTZXJ2aWNlU3RhdHVzLCBDbGlTZXJ2aWNlTGlmZWN5Y2xlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2UudHNcIjtcbiJdfQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGktc2VydmljZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjQ3XCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgZGVmaW5pdGlvbiBmcm9tIFwiLi9zcmMvZGVmaW5pdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgaWNvbiBmcm9tIFwiLi9zcmMvaWNvbi50c1wiO1xuZXhwb3J0ICogYXMgc2VydmljZSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuZXhwb3J0IHsgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSwgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyB9IGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCB7IENsaVNlcnZpY2VDb21tYW5kU2NoZW1hLCBDbGlTZXJ2aWNlTWVudUl0ZW1TY2hlbWEsIENsaVNlcnZpY2VQeXRob25QYWNrYWdlU2NoZW1hLCBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYSB9IGZyb20gXCIuL3NyYy9kZWZpbml0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IENsaVNlcnZpY2VDb21tYW5kLCBDbGlTZXJ2aWNlQ29tbWFuZElucHV0LCBDbGlTZXJ2aWNlTWVudUl0ZW0sIENsaVNlcnZpY2VQeXRob25QYWNrYWdlLCBDbGlTZXJ2aWNlUHl0aG9uUGFja2FnZUlucHV0LCBDbGlTZXJ2aWNlRGVmaW5pdGlvbiwgQ2xpU2VydmljZURlZmluaXRpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2RlZmluaXRpb24udHNcIjtcbmV4cG9ydCB7IENsaVNlcnZpY2UgfSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlTZXJ2aWNlQ29tcGlsZXIsIENsaVNlcnZpY2VSdW50aW1lSW5zdGFsbGVyLCBDbGlTZXJ2aWNlUHl0aG9uSW5zdGFsbGVyLCBDbGlTZXJ2aWNlUnVudGltZU9wdGlvbnMsIENsaVNlcnZpY2VTdGF0dXMsIENsaVNlcnZpY2VMaWZlY3ljbGUgfSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuIl19
@@ -1,2 +1,4 @@
1
1
  export declare function externalRuntimePackages(dependencies: Readonly<Record<string, string>>): string[];
2
2
  export declare function installServiceRuntime(bunExecutable: string, directory: string, dependencies: Readonly<Record<string, string>>): Promise<void>;
3
+ /** Create a clean uv environment and install the primary and companion Python packages. */
4
+ export declare function installServicePythonPackage(uvExecutable: string, directory: string, packageSpecifiers: readonly string[], python: string, platform: NodeJS.Platform): Promise<string>;
@@ -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
  import * as exec from "@dbx-tools/core/exec";
4
4
  export function externalRuntimePackages(dependencies) {
@@ -25,6 +25,24 @@ export async function installServiceRuntime(bunExecutable, directory, dependenci
25
25
  stderr: "capture",
26
26
  });
27
27
  }
28
+ /** Create a clean uv environment and install the primary and companion Python packages. */
29
+ export async function installServicePythonPackage(uvExecutable, directory, packageSpecifiers, python, platform) {
30
+ await rm(directory, { recursive: true, force: true });
31
+ await exec.spawn(uvExecutable, ["venv", "--managed-python", "--no-project", "--python", python, directory], {
32
+ check: true,
33
+ stdin: "ignore",
34
+ stdout: "capture",
35
+ stderr: "capture",
36
+ });
37
+ const executable = join(directory, platform === "win32" ? "Scripts/python.exe" : "bin/python");
38
+ await exec.spawn(uvExecutable, ["pip", "install", "--python", executable, "--upgrade", ...packageSpecifiers], {
39
+ check: true,
40
+ stdin: "ignore",
41
+ stdout: "capture",
42
+ stderr: "capture",
43
+ });
44
+ return executable;
45
+ }
28
46
  async function readOptionalRecord(path) {
29
47
  try {
30
48
  const value = JSON.parse(await readFile(path, "utf8"));
@@ -46,4 +64,4 @@ function stringRecord(value) {
46
64
  function isRecord(value) {
47
65
  return value !== null && typeof value === "object" && !Array.isArray(value);
48
66
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3J1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBRTdDLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxZQUE4QztJQUNwRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FDekMsYUFBcUIsRUFDckIsU0FBaUIsRUFDakIsWUFBOEM7SUFFOUMsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sU0FBUyxDQUNiLFlBQVksRUFDWixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2Y7UUFDRSxHQUFHLE9BQU87UUFDVixJQUFJLEVBQUUsNEJBQTRCO1FBQ2xDLE9BQU8sRUFBRSxJQUFJO1FBQ2IsWUFBWSxFQUFFO1lBQ1osR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUNyQyxHQUFHLFlBQVk7U0FDaEI7S0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsSUFBSSxFQUNMLE1BQU0sQ0FDUCxDQUFDO0lBQ0YsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQy9FLEtBQUssRUFBRSxJQUFJO1FBQ1gsR0FBRyxFQUFFLFNBQVM7UUFDZCxLQUFLLEVBQUUsUUFBUTtRQUNmLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLE1BQU0sRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsSUFBWTtJQUM1QyxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBWSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSyxLQUErQixDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDbEUsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNoQyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUMxQixDQUFDLEtBQUssRUFBNkIsRUFBRSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FDbkUsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlcm5hbFJ1bnRpbWVQYWNrYWdlcyhkZXBlbmRlbmNpZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5maWx0ZXIoKG5hbWUpID0+ICFuYW1lLnN0YXJ0c1dpdGgoXCJAZGJ4LXRvb2xzL1wiKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsU2VydmljZVJ1bnRpbWUoXG4gIGJ1bkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIGRlcGVuZGVuY2llczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihkaXJlY3RvcnksIFwicGFja2FnZS5qc29uXCIpO1xuICBjb25zdCBjdXJyZW50ID0gYXdhaXQgcmVhZE9wdGlvbmFsUmVjb3JkKG1hbmlmZXN0UGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShcbiAgICBtYW5pZmVzdFBhdGgsXG4gICAgYCR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgIG5hbWU6IFwiQGRieC10b29scy9zZXJ2aWNlLXJ1bnRpbWVcIixcbiAgICAgICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgLi4uc3RyaW5nUmVjb3JkKGN1cnJlbnQuZGVwZW5kZW5jaWVzKSxcbiAgICAgICAgICAuLi5kZXBlbmRlbmNpZXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbnVsbCxcbiAgICAgIDIsXG4gICAgKX1cXG5gLFxuICAgIFwidXRmOFwiLFxuICApO1xuICBhd2FpdCBleGVjLnNwYXduKGJ1bkV4ZWN1dGFibGUsIFtcImluc3RhbGxcIiwgXCItLXByb2R1Y3Rpb25cIiwgXCItLWN3ZFwiLCBkaXJlY3RvcnldLCB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgY3dkOiBkaXJlY3RvcnksXG4gICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE9wdGlvbmFsUmVjb3JkKHBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKGBKU09OIGZpbGUgaXMgbm90IGFuIG9iamVjdDogJHtwYXRofWApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHt9O1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1JlY29yZCh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHt9O1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5maWx0ZXIoXG4gICAgICAoZW50cnkpOiBlbnRyeSBpcyBbc3RyaW5nLCBzdHJpbmddID0+IHR5cGVvZiBlbnRyeVsxXSA9PT0gXCJzdHJpbmdcIixcbiAgICApLFxuICApO1xufVxuXG5mdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iXX0=
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3J1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUU3QyxNQUFNLFVBQVUsdUJBQXVCLENBQUMsWUFBOEM7SUFDcEYsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLGFBQXFCLEVBQ3JCLFNBQWlCLEVBQ2pCLFlBQThDO0lBRTlDLE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsQ0FDYixZQUFZLEVBQ1osR0FBRyxJQUFJLENBQUMsU0FBUyxDQUNmO1FBQ0UsR0FBRyxPQUFPO1FBQ1YsSUFBSSxFQUFFLDRCQUE0QjtRQUNsQyxPQUFPLEVBQUUsSUFBSTtRQUNiLFlBQVksRUFBRTtZQUNaLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDckMsR0FBRyxZQUFZO1NBQ2hCO0tBQ0YsRUFDRCxJQUFJLEVBQ0osQ0FBQyxDQUNGLElBQUks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RmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgKiBhcyBleGVjIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvZXhlY1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZXJuYWxSdW50aW1lUGFja2FnZXMoZGVwZW5kZW5jaWVzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykuZmlsdGVyKChuYW1lKSA9PiAhbmFtZS5zdGFydHNXaXRoKFwiQGRieC10b29scy9cIikpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFNlcnZpY2VSdW50aW1lKFxuICBidW5FeGVjdXRhYmxlOiBzdHJpbmcsXG4gIGRpcmVjdG9yeTogc3RyaW5nLFxuICBkZXBlbmRlbmNpZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBcInBhY2thZ2UuanNvblwiKTtcbiAgY29uc3QgY3VycmVudCA9IGF3YWl0IHJlYWRPcHRpb25hbFJlY29yZChtYW5pZmVzdFBhdGgpO1xuICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgbWFuaWZlc3RQYXRoLFxuICAgIGAke0pTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICBuYW1lOiBcIkBkYngtdG9vbHMvc2VydmljZS1ydW50aW1lXCIsXG4gICAgICAgIHByaXZhdGU6IHRydWUsXG4gICAgICAgIGRlcGVuZGVuY2llczoge1xuICAgICAgICAgIC4uLnN0cmluZ1JlY29yZChjdXJyZW50LmRlcGVuZGVuY2llcyksXG4gICAgICAgICAgLi4uZGVwZW5kZW5jaWVzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG51bGwsXG4gICAgICAyLFxuICAgICl9XFxuYCxcbiAgICBcInV0ZjhcIixcbiAgKTtcbiAgYXdhaXQgZXhlYy5zcGF3bihidW5FeGVjdXRhYmxlLCBbXCJpbnN0YWxsXCIsIFwiLS1wcm9kdWN0aW9uXCIsIFwiLS1jd2RcIiwgZGlyZWN0b3J5XSwge1xuICAgIGNoZWNrOiB0cnVlLFxuICAgIGN3ZDogZGlyZWN0b3J5LFxuICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgfSk7XG59XG5cbi8qKiBDcmVhdGUgYSBjbGVhbiB1diBlbnZpcm9ubWVudCBhbmQgaW5zdGFsbCB0aGUgcHJpbWFyeSBhbmQgY29tcGFuaW9uIFB5dGhvbiBwYWNrYWdlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsU2VydmljZVB5dGhvblBhY2thZ2UoXG4gIHV2RXhlY3V0YWJsZTogc3RyaW5nLFxuICBkaXJlY3Rvcnk6IHN0cmluZyxcbiAgcGFja2FnZVNwZWNpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBweXRob246IHN0cmluZyxcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGF3YWl0IHJtKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBhd2FpdCBleGVjLnNwYXduKFxuICAgIHV2RXhlY3V0YWJsZSxcbiAgICBbXCJ2ZW52XCIsIFwiLS1tYW5hZ2VkLXB5dGhvblwiLCBcIi0tbm8tcHJvamVjdFwiLCBcIi0tcHl0aG9uXCIsIHB5dGhvbiwgZGlyZWN0b3J5XSxcbiAgICB7XG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgfSxcbiAgKTtcbiAgY29uc3QgZXhlY3V0YWJsZSA9IGpvaW4oZGlyZWN0b3J5LCBwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJTY3JpcHRzL3B5dGhvbi5leGVcIiA6IFwiYmluL3B5dGhvblwiKTtcbiAgYXdhaXQgZXhlYy5zcGF3bihcbiAgICB1dkV4ZWN1dGFibGUsXG4gICAgW1wicGlwXCIsIFwiaW5zdGFsbFwiLCBcIi0tcHl0aG9uXCIsIGV4ZWN1dGFibGUsIFwiLS11cGdyYWRlXCIsIC4uLnBhY2thZ2VTcGVjaWZpZXJzXSxcbiAgICB7XG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIGV4ZWN1dGFibGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRPcHRpb25hbFJlY29yZChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsdWU6IHVua25vd24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKHBhdGgsIFwidXRmOFwiKSk7XG4gICAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgSlNPTiBmaWxlIGlzIG5vdCBhbiBvYmplY3Q6ICR7cGF0aH1gKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB7fTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdSZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiB7fTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZmlsdGVyKFxuICAgICAgKGVudHJ5KTogZW50cnkgaXMgW3N0cmluZywgc3RyaW5nXSA9PiB0eXBlb2YgZW50cnlbMV0gPT09IFwic3RyaW5nXCIsXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuIl19
package/lib/src/cli.js CHANGED
@@ -27,7 +27,7 @@ export function buildServiceCommand(source, dependencies = DEFAULT_DEPENDENCIES)
27
27
  const command = new Command("service").description(typeof source === "function"
28
28
  ? "Install and manage the desktop service"
29
29
  : `Install and manage the ${source.name} desktop service`);
30
- const install = addArgs(command.command("install").description("Install the service for the current user and start it"), CliServiceInstallOptionsSchema, { scope: [] });
30
+ const install = addArgs(command.command("install").description("Install the service for the current user and start it"), CliServiceInstallOptionsSchema);
31
31
  install.action(async () => {
32
32
  const options = parseArgs(install, CliServiceInstallOptionsSchema);
33
33
  await service().install({ start: options.start });
@@ -67,4 +67,4 @@ export function buildServiceCommand(source, dependencies = DEFAULT_DEPENDENCIES)
67
67
  function resolveDefinition(source) {
68
68
  return typeof source === "function" ? source : () => source;
69
69
  }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHeEIsT0FBTyxFQUFFLFVBQVUsRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFhcEUsTUFBTSxvQkFBb0IsR0FBOEI7SUFDdEQsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDbEQsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Q0FDOUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLENBQUM7S0FDNUMsTUFBTSxDQUFDO0lBQ04sS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLHVDQUF1QyxDQUFDO0NBQ25GLENBQUM7S0FDRCxNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsb0RBQW9ELENBQUMsQ0FBQztBQUlsRSx5RkFBeUY7QUFDekYsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxNQUFrQyxFQUNsQyxlQUEwQyxvQkFBb0I7SUFFOUQsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FDaEQsT0FBTyxNQUFNLEtBQUssVUFBVTtRQUMxQixDQUFDLENBQUMsd0NBQXdDO1FBQzFDLENBQUMsQ0FBQywwQkFBMEIsTUFBTSxDQUFDLElBQUksa0JBQWtCLENBQzVELENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxDQUFDLHVEQUF1RCxDQUFDLEVBQy9GLDhCQUE4QixFQUM5QixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FDZCxDQUFDO0lBQ0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN4QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDbkUsTUFBTSxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPO1NBQ0osT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUNoQixXQUFXLENBQUMsNkJBQTZCLENBQUM7U0FDMUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPO1NBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUNmLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQztTQUN2QyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsTUFBTSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87U0FDSixPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ2xCLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQztTQUM1QyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsTUFBTSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87U0FDSixPQUFPLENBQUMsUUFBUSxDQUFDO1NBQ2pCLFdBQVcsQ0FBQyxzREFBc0QsQ0FBQztTQUNuRSxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9FLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTztTQUNKLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDcEIsV0FBVyxDQUFDLGtEQUFrRCxDQUFDO1NBQy9ELE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQixNQUFNLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzlCLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsTUFBa0M7SUFDM0QsT0FBTyxPQUFPLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1hbmRlciBjb21tYW5kIGdyb3VwIGZvciB0aGUgc2hhcmVkIHN5c3RlbS10cmF5IHNlcnZpY2UgbGlmZWN5Y2xlLlxuICpcbiAqIENvbnN1bWluZyBDTElzIHNob3VsZCBtb3VudCB7QGxpbmsgYnVpbGRTZXJ2aWNlQ29tbWFuZH0gaW5zdGVhZCBvZiBkZWZpbmluZ1xuICogcGFja2FnZS1sb2NhbCBpbnN0YWxsL3N0YXJ0L3N0b3Avc3RhdHVzIGNvbW1hbmRzIHdpdGggZGl2ZXJnZW50IGJlaGF2aW9yLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBhZGRBcmdzLCBwYXJzZUFyZ3MgfSBmcm9tIFwiQGRieC10b29scy9jbGktYXJncy9hcmdzXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL2RlZmluaXRpb24udHNcIjtcbmltcG9ydCB7IENsaVNlcnZpY2UsIHR5cGUgQ2xpU2VydmljZUxpZmVjeWNsZSB9IGZyb20gXCIuL3NlcnZpY2UudHNcIjtcblxuLyoqIFN0YXRpYyBkZWZpbml0aW9uIG9yIGFjdGlvbi10aW1lIGZhY3RvcnkgdXNlZCBieSBhIHNlcnZpY2UgY29tbWFuZCBncm91cC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VEZWZpbml0aW9uU291cmNlID0gQ2xpU2VydmljZURlZmluaXRpb24gfCAoKCkgPT4gQ2xpU2VydmljZURlZmluaXRpb24pO1xuXG4vKiogSW5qZWN0YWJsZSBsaWZlY3ljbGUgYW5kIG91dHB1dCBib3VuZGFyeSBmb3Igc2VydmljZSBDTEkgdGVzdHMgYW5kIGNvbXBvc2l0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzIHtcbiAgLyoqIENvbnN0cnVjdCB0aGUgbGlmZWN5Y2xlIG1hbmFnZXIgdXNlZCBieSBjb21tYW5kIGFjdGlvbnMuICovXG4gIGNyZWF0ZShkZWZpbml0aW9uOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbik6IENsaVNlcnZpY2VMaWZlY3ljbGU7XG4gIC8qKiBXcml0ZSB0aGUgSlNPTiByZXN1bHQgb2YgdGhlIHN0YXR1cyBjb21tYW5kLiAqL1xuICB3cml0ZSh2YWx1ZTogc3RyaW5nKTogdm9pZDtcbn1cblxuY29uc3QgREVGQVVMVF9ERVBFTkRFTkNJRVM6IENsaVNlcnZpY2VDbGlEZXBlbmRlbmNpZXMgPSB7XG4gIGNyZWF0ZTogKGRlZmluaXRpb24pID0+IG5ldyBDbGlTZXJ2aWNlKGRlZmluaXRpb24pLFxuICB3cml0ZTogKHZhbHVlKSA9PiBwcm9jZXNzLnN0ZG91dC53cml0ZSh2YWx1ZSksXG59O1xuXG5leHBvcnQgY29uc3QgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBzdGFydDogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKS5kZXNjcmliZShcIlN0YXJ0IHRoZSBzZXJ2aWNlIGFmdGVyIGluc3RhbGxhdGlvbi5cIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJPcHRpb25zIGZvciBpbnN0YWxsaW5nIGEgY3VycmVudC11c2VyIENMSSBzZXJ2aWNlLlwiKTtcblxuZXhwb3J0IHR5cGUgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zID0gei5vdXRwdXQ8dHlwZW9mIENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBCdWlsZCBpbnN0YWxsLCBzdGFydCwgc3RvcCwgcmVzdGFydCwgc3RhdHVzLCBhbmQgdW5pbnN0YWxsIGNvbW1hbmRzIGZvciBhIHNlcnZpY2UuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTZXJ2aWNlQ29tbWFuZChcbiAgc291cmNlOiBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSxcbiAgZGVwZW5kZW5jaWVzOiBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzID0gREVGQVVMVF9ERVBFTkRFTkNJRVMsXG4pOiBDb21tYW5kIHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IHJlc29sdmVEZWZpbml0aW9uKHNvdXJjZSk7XG4gIGNvbnN0IHNlcnZpY2UgPSAoKSA9PiBkZXBlbmRlbmNpZXMuY3JlYXRlKGRlZmluaXRpb24oKSk7XG4gIGNvbnN0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZChcInNlcnZpY2VcIikuZGVzY3JpcHRpb24oXG4gICAgdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IFwiSW5zdGFsbCBhbmQgbWFuYWdlIHRoZSBkZXNrdG9wIHNlcnZpY2VcIlxuICAgICAgOiBgSW5zdGFsbCBhbmQgbWFuYWdlIHRoZSAke3NvdXJjZS5uYW1lfSBkZXNrdG9wIHNlcnZpY2VgLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbGwgPSBhZGRBcmdzKFxuICAgIGNvbW1hbmQuY29tbWFuZChcImluc3RhbGxcIikuZGVzY3JpcHRpb24oXCJJbnN0YWxsIHRoZSBzZXJ2aWNlIGZvciB0aGUgY3VycmVudCB1c2VyIGFuZCBzdGFydCBpdFwiKSxcbiAgICBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnNTY2hlbWEsXG4gICAgeyBzY29wZTogW10gfSxcbiAgKTtcbiAgaW5zdGFsbC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUFyZ3MoaW5zdGFsbCwgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zU2NoZW1hKTtcbiAgICBhd2FpdCBzZXJ2aWNlKCkuaW5zdGFsbCh7IHN0YXJ0OiBvcHRpb25zLnN0YXJ0IH0pO1xuICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdGFydFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnN0YXJ0KCk7XG4gICAgfSk7XG5cbiAgY29tbWFuZFxuICAgIC5jb21tYW5kKFwic3RvcFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0b3AgdGhlIHJ1bm5pbmcgc2VydmljZVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnN0b3AoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJyZXN0YXJ0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUmVzdGFydCB0aGUgaW5zdGFsbGVkIHNlcnZpY2VcIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNlcnZpY2UoKS5yZXN0YXJ0KCk7XG4gICAgfSk7XG5cbiAgY29tbWFuZFxuICAgIC5jb21tYW5kKFwic3RhdHVzXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnQgc2VydmljZSBpbnN0YWxsYXRpb24gYW5kIHByb2Nlc3Mgc3RhdGUgYXMgSlNPTlwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgZGVwZW5kZW5jaWVzLndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGF3YWl0IHNlcnZpY2UoKS5zdGF0dXMoKSwgbnVsbCwgMil9XFxuYCk7XG4gICAgfSk7XG5cbiAgY29tbWFuZFxuICAgIC5jb21tYW5kKFwidW5pbnN0YWxsXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RvcCBhbmQgcmVtb3ZlIHRoZSBzZXJ2aWNlIGZvciB0aGUgY3VycmVudCB1c2VyXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkudW5pbnN0YWxsKCk7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGNvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZpbml0aW9uKHNvdXJjZTogQ2xpU2VydmljZURlZmluaXRpb25Tb3VyY2UpOiAoKSA9PiBDbGlTZXJ2aWNlRGVmaW5pdGlvbiB7XG4gIHJldHVybiB0eXBlb2Ygc291cmNlID09PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2UgOiAoKSA9PiBzb3VyY2U7XG59XG4iXX0=
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHeEIsT0FBTyxFQUFFLFVBQVUsRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFhcEUsTUFBTSxvQkFBb0IsR0FBOEI7SUFDdEQsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDbEQsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Q0FDOUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLENBQUM7S0FDNUMsTUFBTSxDQUFDO0lBQ04sS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLHVDQUF1QyxDQUFDO0NBQ25GLENBQUM7S0FDRCxNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsb0RBQW9ELENBQUMsQ0FBQztBQUlsRSx5RkFBeUY7QUFDekYsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxNQUFrQyxFQUNsQyxlQUEwQyxvQkFBb0I7SUFFOUQsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FDaEQsT0FBTyxNQUFNLEtBQUssVUFBVTtRQUMxQixDQUFDLENBQUMsd0NBQXdDO1FBQzFDLENBQUMsQ0FBQywwQkFBMEIsTUFBTSxDQUFDLElBQUksa0JBQWtCLENBQzVELENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxDQUFDLHVEQUF1RCxDQUFDLEVBQy9GLDhCQUE4QixDQUMvQixDQUFDO0lBQ0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN4QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDbkUsTUFBTSxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPO1NBQ0osT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUNoQixXQUFXLENBQUMsNkJBQTZCLENBQUM7U0FDMUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPO1NBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUNmLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQztTQUN2QyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsTUFBTSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87U0FDSixPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ2xCLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQztTQUM1QyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsTUFBTSxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87U0FDSixPQUFPLENBQUMsUUFBUSxDQUFDO1NBQ2pCLFdBQVcsQ0FBQyxzREFBc0QsQ0FBQztTQUNuRSxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9FLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTztTQUNKLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDcEIsV0FBVyxDQUFDLGtEQUFrRCxDQUFDO1NBQy9ELE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQixNQUFNLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzlCLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsTUFBa0M7SUFDM0QsT0FBTyxPQUFPLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1hbmRlciBjb21tYW5kIGdyb3VwIGZvciB0aGUgc2hhcmVkIHN5c3RlbS10cmF5IHNlcnZpY2UgbGlmZWN5Y2xlLlxuICpcbiAqIENvbnN1bWluZyBDTElzIHNob3VsZCBtb3VudCB7QGxpbmsgYnVpbGRTZXJ2aWNlQ29tbWFuZH0gaW5zdGVhZCBvZiBkZWZpbmluZ1xuICogcGFja2FnZS1sb2NhbCBpbnN0YWxsL3N0YXJ0L3N0b3Avc3RhdHVzIGNvbW1hbmRzIHdpdGggZGl2ZXJnZW50IGJlaGF2aW9yLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBhZGRBcmdzLCBwYXJzZUFyZ3MgfSBmcm9tIFwiQGRieC10b29scy9jbGktYXJncy9hcmdzXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL2RlZmluaXRpb24udHNcIjtcbmltcG9ydCB7IENsaVNlcnZpY2UsIHR5cGUgQ2xpU2VydmljZUxpZmVjeWNsZSB9IGZyb20gXCIuL3NlcnZpY2UudHNcIjtcblxuLyoqIFN0YXRpYyBkZWZpbml0aW9uIG9yIGFjdGlvbi10aW1lIGZhY3RvcnkgdXNlZCBieSBhIHNlcnZpY2UgY29tbWFuZCBncm91cC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VEZWZpbml0aW9uU291cmNlID0gQ2xpU2VydmljZURlZmluaXRpb24gfCAoKCkgPT4gQ2xpU2VydmljZURlZmluaXRpb24pO1xuXG4vKiogSW5qZWN0YWJsZSBsaWZlY3ljbGUgYW5kIG91dHB1dCBib3VuZGFyeSBmb3Igc2VydmljZSBDTEkgdGVzdHMgYW5kIGNvbXBvc2l0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzIHtcbiAgLyoqIENvbnN0cnVjdCB0aGUgbGlmZWN5Y2xlIG1hbmFnZXIgdXNlZCBieSBjb21tYW5kIGFjdGlvbnMuICovXG4gIGNyZWF0ZShkZWZpbml0aW9uOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbik6IENsaVNlcnZpY2VMaWZlY3ljbGU7XG4gIC8qKiBXcml0ZSB0aGUgSlNPTiByZXN1bHQgb2YgdGhlIHN0YXR1cyBjb21tYW5kLiAqL1xuICB3cml0ZSh2YWx1ZTogc3RyaW5nKTogdm9pZDtcbn1cblxuY29uc3QgREVGQVVMVF9ERVBFTkRFTkNJRVM6IENsaVNlcnZpY2VDbGlEZXBlbmRlbmNpZXMgPSB7XG4gIGNyZWF0ZTogKGRlZmluaXRpb24pID0+IG5ldyBDbGlTZXJ2aWNlKGRlZmluaXRpb24pLFxuICB3cml0ZTogKHZhbHVlKSA9PiBwcm9jZXNzLnN0ZG91dC53cml0ZSh2YWx1ZSksXG59O1xuXG5leHBvcnQgY29uc3QgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBzdGFydDogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKS5kZXNjcmliZShcIlN0YXJ0IHRoZSBzZXJ2aWNlIGFmdGVyIGluc3RhbGxhdGlvbi5cIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJPcHRpb25zIGZvciBpbnN0YWxsaW5nIGEgY3VycmVudC11c2VyIENMSSBzZXJ2aWNlLlwiKTtcblxuZXhwb3J0IHR5cGUgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zID0gei5vdXRwdXQ8dHlwZW9mIENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBCdWlsZCBpbnN0YWxsLCBzdGFydCwgc3RvcCwgcmVzdGFydCwgc3RhdHVzLCBhbmQgdW5pbnN0YWxsIGNvbW1hbmRzIGZvciBhIHNlcnZpY2UuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTZXJ2aWNlQ29tbWFuZChcbiAgc291cmNlOiBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSxcbiAgZGVwZW5kZW5jaWVzOiBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzID0gREVGQVVMVF9ERVBFTkRFTkNJRVMsXG4pOiBDb21tYW5kIHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IHJlc29sdmVEZWZpbml0aW9uKHNvdXJjZSk7XG4gIGNvbnN0IHNlcnZpY2UgPSAoKSA9PiBkZXBlbmRlbmNpZXMuY3JlYXRlKGRlZmluaXRpb24oKSk7XG4gIGNvbnN0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZChcInNlcnZpY2VcIikuZGVzY3JpcHRpb24oXG4gICAgdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IFwiSW5zdGFsbCBhbmQgbWFuYWdlIHRoZSBkZXNrdG9wIHNlcnZpY2VcIlxuICAgICAgOiBgSW5zdGFsbCBhbmQgbWFuYWdlIHRoZSAke3NvdXJjZS5uYW1lfSBkZXNrdG9wIHNlcnZpY2VgLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbGwgPSBhZGRBcmdzKFxuICAgIGNvbW1hbmQuY29tbWFuZChcImluc3RhbGxcIikuZGVzY3JpcHRpb24oXCJJbnN0YWxsIHRoZSBzZXJ2aWNlIGZvciB0aGUgY3VycmVudCB1c2VyIGFuZCBzdGFydCBpdFwiKSxcbiAgICBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnNTY2hlbWEsXG4gICk7XG4gIGluc3RhbGwuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGluc3RhbGwsIENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYSk7XG4gICAgYXdhaXQgc2VydmljZSgpLmluc3RhbGwoeyBzdGFydDogb3B0aW9ucy5zdGFydCB9KTtcbiAgfSk7XG5cbiAgY29tbWFuZFxuICAgIC5jb21tYW5kKFwic3RhcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTdGFydCB0aGUgaW5zdGFsbGVkIHNlcnZpY2VcIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNlcnZpY2UoKS5zdGFydCgpO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInN0b3BcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTdG9wIHRoZSBydW5uaW5nIHNlcnZpY2VcIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNlcnZpY2UoKS5zdG9wKCk7XG4gICAgfSk7XG5cbiAgY29tbWFuZFxuICAgIC5jb21tYW5kKFwicmVzdGFydFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlJlc3RhcnQgdGhlIGluc3RhbGxlZCBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkucmVzdGFydCgpO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInN0YXR1c1wiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50IHNlcnZpY2UgaW5zdGFsbGF0aW9uIGFuZCBwcm9jZXNzIHN0YXRlIGFzIEpTT05cIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGRlcGVuZGVuY2llcy53cml0ZShgJHtKU09OLnN0cmluZ2lmeShhd2FpdCBzZXJ2aWNlKCkuc3RhdHVzKCksIG51bGwsIDIpfVxcbmApO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInVuaW5zdGFsbFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0b3AgYW5kIHJlbW92ZSB0aGUgc2VydmljZSBmb3IgdGhlIGN1cnJlbnQgdXNlclwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnVuaW5zdGFsbCgpO1xuICAgIH0pO1xuXG4gIHJldHVybiBjb21tYW5kO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbihzb3VyY2U6IENsaVNlcnZpY2VEZWZpbml0aW9uU291cmNlKTogKCkgPT4gQ2xpU2VydmljZURlZmluaXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiID8gc291cmNlIDogKCkgPT4gc291cmNlO1xufVxuIl19
@@ -48,6 +48,17 @@ export declare const CliServiceMenuItemSchema: z.ZodDiscriminatedUnion<[z.ZodRea
48
48
  }, z.core.$strip>>], "type">;
49
49
  /** A typed custom item inserted between the default service title and Quit item. */
50
50
  export type CliServiceMenuItem = z.infer<typeof CliServiceMenuItemSchema>;
51
+ /** Python package installed into a service-owned uv environment. */
52
+ export declare const CliServicePythonPackageSchema: z.ZodReadonly<z.ZodObject<{
53
+ name: z.ZodString;
54
+ version: z.ZodOptional<z.ZodString>;
55
+ python: z.ZodDefault<z.ZodString>;
56
+ dependencies: z.ZodDefault<z.ZodArray<z.ZodString>>;
57
+ }, z.core.$strip>>;
58
+ /** Python package installed into a service-owned uv environment. */
59
+ export type CliServicePythonPackage = z.infer<typeof CliServicePythonPackageSchema>;
60
+ /** Python package input accepted before the default Python version is applied. */
61
+ export type CliServicePythonPackageInput = z.input<typeof CliServicePythonPackageSchema>;
51
62
  /** Complete serializable definition consumed by the lifecycle manager and tray host. */
52
63
  export declare const CliServiceDefinitionSchema: z.ZodReadonly<z.ZodObject<{
53
64
  id: z.ZodString;
@@ -57,6 +68,12 @@ export declare const CliServiceDefinitionSchema: z.ZodReadonly<z.ZodObject<{
57
68
  icon: z.ZodString;
58
69
  isTemplateIcon: z.ZodOptional<z.ZodBoolean>;
59
70
  dataDirectory: z.ZodOptional<z.ZodString>;
71
+ pythonPackage: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
72
+ name: z.ZodString;
73
+ version: z.ZodOptional<z.ZodString>;
74
+ python: z.ZodDefault<z.ZodString>;
75
+ dependencies: z.ZodDefault<z.ZodArray<z.ZodString>>;
76
+ }, z.core.$strip>>>;
60
77
  command: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
61
78
  executable: z.ZodOptional<z.ZodString>;
62
79
  entrypoint: z.ZodOptional<z.ZodString>;
@@ -87,7 +104,9 @@ export declare const CliServiceDefinitionSchema: z.ZodReadonly<z.ZodObject<{
87
104
  /** Complete serializable definition consumed by the lifecycle manager and tray host. */
88
105
  export type CliServiceDefinition = z.infer<typeof CliServiceDefinitionSchema>;
89
106
  /** Package-derived service fields plus caller-owned icon, process, and menu options. */
90
- export type CliServiceDefinitionOptions = Omit<CliServiceDefinition, "packageName" | "id" | "name" | "version" | "icon" | "isTemplateIcon" | "command"> & Partial<Pick<CliServiceDefinition, "id" | "name" | "version" | "icon" | "isTemplateIcon">> & {
107
+ export type CliServiceDefinitionOptions = Omit<CliServiceDefinition, "packageName" | "id" | "name" | "version" | "icon" | "isTemplateIcon" | "pythonPackage" | "command"> & Partial<Pick<CliServiceDefinition, "id" | "name" | "version" | "icon" | "isTemplateIcon">> & {
108
+ /** Python package installed into a service-owned uv environment. */
109
+ readonly pythonPackage?: CliServicePythonPackageInput;
91
110
  /** Service process command with optional schema or object-backed options. */
92
111
  readonly command?: CliServiceCommandInput;
93
112
  };
@@ -60,6 +60,27 @@ export const CliServiceMenuItemSchema = z.discriminatedUnion("type", [
60
60
  })
61
61
  .readonly(),
62
62
  ]);
63
+ /** Python package installed into a service-owned uv environment. */
64
+ export const CliServicePythonPackageSchema = z
65
+ .object({
66
+ name: z.string().min(1).describe("Python distribution name installed by uv."),
67
+ version: z
68
+ .string()
69
+ .min(1)
70
+ .optional()
71
+ .describe("Python distribution version. Defaults to the service package version."),
72
+ python: z
73
+ .string()
74
+ .min(1)
75
+ .default("3.11")
76
+ .describe("Python version request passed to uv when creating the environment."),
77
+ dependencies: z
78
+ .array(z.string().min(1))
79
+ .default([])
80
+ .describe("Additional uv package specs installed beside the primary distribution."),
81
+ })
82
+ .readonly()
83
+ .describe("Python runtime package installed with uv for a managed service.");
63
84
  /** Complete serializable definition consumed by the lifecycle manager and tray host. */
64
85
  export const CliServiceDefinitionSchema = z
65
86
  .object({
@@ -74,6 +95,7 @@ export const CliServiceDefinitionSchema = z
74
95
  icon: z.string().min(1),
75
96
  isTemplateIcon: z.boolean().optional(),
76
97
  dataDirectory: z.string().min(1).optional(),
98
+ pythonPackage: CliServicePythonPackageSchema.optional().describe("Python runtime package installed into a service-owned uv environment."),
77
99
  command: CliServiceCommandSchema.optional(),
78
100
  menu: z.array(CliServiceMenuItemSchema).readonly().optional(),
79
101
  })
@@ -112,4 +134,4 @@ function resolveServiceCommand(command) {
112
134
  export function resolveServicePackageBin(packageReference, binName) {
113
135
  return resolveServicePackage(packageReference).bin(binName);
114
136
  }
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBdUIsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFbkUsU0FBUyxTQUFTLENBQUMsS0FBYTtJQUM5QixJQUFJLENBQUM7UUFDSCxPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUN4QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3JDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FB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QyxVQUFVLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDekQsQ0FBQztJQUNGLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxDQUFDO1FBQ25DLEdBQUcsVUFBVTtRQUNiLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFO1FBQ2xFLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM1RCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxnQkFBd0IsRUFBRSxPQUFnQjtJQUNqRixPQUFPLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlcmlhbGl6YWJsZSBjb25maWd1cmF0aW9uIGZvciBhIHN5c3RlbS10cmF5IENMSSBzZXJ2aWNlLlxuICpcbiAqIFRoaXMgbW9kdWxlIG93bnMgdGhlIGNyb3NzLXBhY2thZ2Ugc2VydmljZSBkZWZpbml0aW9uIGNvbnRyYWN0LCBwYWNrYWdlXG4gKiBpZGVudGl0eSBkZWZhdWx0cywgcHJvY2VzcyBjb21tYW5kLCBpY29uLCBhbmQgbWVudSBzY2hlbWEuIFJldXNlXG4gKiB7QGxpbmsgZGVmaW5lU2VydmljZX0gaW5zdGVhZCBvZiBtYWludGFpbmluZyBhbm90aGVyIHNlcnZpY2UgbWFuaWZlc3Qgc2hhcGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNlcmlhbGl6ZUFyZ3MsIHR5cGUgQXJndW1lbnRTb3VyY2UgfSBmcm9tIFwiQGRieC10b29scy9jbGktYXJncy9hcmdzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyByZXNvbHZlU2VydmljZVBhY2thZ2UsIHNlcnZpY2VQYWNrYWdlRGVmYXVsdHMgfSBmcm9tIFwiLi9fcGFja2FnZS50c1wiO1xuaW1wb3J0IHsgc2VydmljZVRyYXlJY29uIH0gZnJvbSBcIi4vaWNvbi50c1wiO1xuXG5jb25zdCBTQUZFX1VSTF9QUk9UT0NPTFMgPSBuZXcgU2V0KFtcImh0dHA6XCIsIFwiaHR0cHM6XCIsIFwibWFpbHRvOlwiXSk7XG5cbmZ1bmN0aW9uIGlzU2FmZVVybCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIFNBRkVfVVJMX1BST1RPQ09MUy5oYXMobmV3IFVSTCh2YWx1ZSkucHJvdG9jb2wpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEEgcHJvY2VzcyBsYXVuY2hlZCBieSB0aGUgc3lzdGVtLXRyYXkgc2VydmljZSBob3N0LiAqL1xuZXhwb3J0IGNvbnN0IENsaVNlcnZpY2VDb21tYW5kU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBleGVjdXRhYmxlOiB6LnN0cmluZygpLm1pbigxKS5vcHRpb25hbCgpLFxuICAgIGVudHJ5cG9pbnQ6IHouc3RyaW5nKCkubWluKDEpLm9wdGlvbmFsKCksXG4gICAgYmluTmFtZTogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcbiAgICBhcmd1bWVudHM6IHouYXJyYXkoei5zdHJpbmcoKSkucmVhZG9ubHkoKS5vcHRpb25hbCgpLFxuICAgIGVudmlyb25tZW50OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5yZWFkb25seSgpLm9wdGlvbmFsKCksXG4gICAgY3dkOiB6LnN0cmluZygpLm1pbigxKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3VwZXJSZWZpbmUoKGNvbW1hbmQsIGNvbnRleHQpID0+IHtcbiAgICBpZiAoXG4gICAgICBOdW1iZXIoY29tbWFuZC5leGVjdXRhYmxlICE9PSB1bmRlZmluZWQpICtcbiAgICAgICAgTnVtYmVyKGNvbW1hbmQuZW50cnlwb2ludCAhPT0gdW5kZWZpbmVkKSArXG4gICAgICAgIE51bWJlcihjb21tYW5kLmJpbk5hbWUgIT09IHVuZGVmaW5lZCkgPlxuICAgICAgMVxuICAgICkge1xuICAgICAgY29udGV4dC5hZGRJc3N1ZSh7XG4gICAgICAgIGNvZGU6IFwiY3VzdG9tXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiY29tbWFuZCBhY2NlcHRzIGF0IG1vc3Qgb25lIG9mIGV4ZWN1dGFibGUsIGVudHJ5cG9pbnQsIG9yIGJpbk5hbWVcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgfSlcbiAgLnJlYWRvbmx5KCk7XG5cbi8qKiBBIHByb2Nlc3MgbGF1bmNoZWQgYnkgdGhlIHN5c3RlbS10cmF5IHNlcnZpY2UgaG9zdC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VDb21tYW5kID0gei5pbmZlcjx0eXBlb2YgQ2xpU2VydmljZUNvbW1hbmRTY2hlbWE+O1xuXG4vKiogQ29tbWFuZCBpbnB1dCBhY2NlcHRlZCBieSB7QGxpbmsgZGVmaW5lU2VydmljZX0gYmVmb3JlIG9wdGlvbiBzZXJpYWxpemF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgQ2xpU2VydmljZUNvbW1hbmRJbnB1dCA9IE9taXQ8Q2xpU2VydmljZUNvbW1hbmQsIFwiYXJndW1lbnRzXCI+ICYge1xuICAvKiogUG9zaXRpb25hbCBvciBwcmUtc2VyaWFsaXplZCBhcmd1bWVudHMgcGxhY2VkIGJlZm9yZSBnZW5lcmF0ZWQgb3B0aW9ucy4gKi9cbiAgcmVhZG9ubHkgYXJndW1lbnRzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBab2QgZGVmYXVsdHMgb3IgY29uY3JldGUgb3B0aW9uIHZhbHVlcyBjb252ZXJ0ZWQgaW50byBDTEkgZmxhZ3MuICovXG4gIHJlYWRvbmx5IG9wdGlvbnM/OiBBcmd1bWVudFNvdXJjZTtcbn07XG5cbi8qKiBBIHR5cGVkIGN1c3RvbSBpdGVtIGluc2VydGVkIGJldHdlZW4gdGhlIGRlZmF1bHQgc2VydmljZSB0aXRsZSBhbmQgUXVpdCBpdGVtLiAqL1xuZXhwb3J0IGNvbnN0IENsaVNlcnZpY2VNZW51SXRlbVNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIHoub2JqZWN0KHsgdHlwZTogei5saXRlcmFsKFwic2VwYXJhdG9yXCIpIH0pLnJlYWRvbmx5KCksXG4gIHpcbiAgICAub2JqZWN0KHtcbiAgICAgIHR5cGU6IHoubGl0ZXJhbChcInVybFwiKSxcbiAgICAgIGxhYmVsOiB6LnN0cmluZygpLm1pbigxKSxcbiAgICAgIHVybDogei5zdHJpbmcoKS5yZWZpbmUoaXNTYWZlVXJsLCBcIlVSTCBtdXN0IHVzZSBIVFRQLCBIVFRQUywgb3IgbWFpbHRvXCIpLFxuICAgIH0pXG4gICAgLnJlYWRvbmx5KCksXG4gIHpcbiAgICAub2JqZWN0KHtcbiAgICAgIHR5cGU6IHoubGl0ZXJhbChcImNvbW1hbmRcIiksXG4gICAgICBsYWJlbDogei5zdHJpbmcoKS5taW4oMSksXG4gICAgICBjb21tYW5kOiBDbGlTZXJ2aWNlQ29tbWFuZFNjaGVtYSxcbiAgICB9KVxuICAgIC5yZWFkb25seSgpLFxuXSk7XG5cbi8qKiBBIHR5cGVkIGN1c3RvbSBpdGVtIGluc2VydGVkIGJldHdlZW4gdGhlIGRlZmF1bHQgc2VydmljZSB0aXRsZSBhbmQgUXVpdCBpdGVtLiAqL1xuZXhwb3J0IHR5cGUgQ2xpU2VydmljZU1lbnVJdGVtID0gei5pbmZlcjx0eXBlb2YgQ2xpU2VydmljZU1lbnVJdGVtU2NoZW1hPjtcblxuLyoqIENvbXBsZXRlIHNlcmlhbGl6YWJsZSBkZWZpbml0aW9uIGNvbnN1bWVkIGJ5IHRoZSBsaWZlY3ljbGUgbWFuYWdlciBhbmQgdHJheSBob3N0LiAqL1xuZXhwb3J0IGNvbnN0IENsaVNlcnZpY2VEZWZpbml0aW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBpZDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEpXG4gICAgICAubWF4KDEyOClcbiAgICAgIC5yZWdleCgvXlthLXowLTldW2EtejAtOS5fLV0qJC8sIFwic2VydmljZSBpZCBtdXN0IGJlIGZpbGVzeXN0ZW0gc2FmZVwiKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLm1pbigxKSxcbiAgICBwYWNrYWdlTmFtZTogei5zdHJpbmcoKS5taW4oMSksXG4gICAgdmVyc2lvbjogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcbiAgICBpY29uOiB6LnN0cmluZygpLm1pbigxKSxcbiAgICBpc1RlbXBsYXRlSWNvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICBkYXRhRGlyZWN0b3J5OiB6LnN0cmluZygpLm1pbigxKS5vcHRpb25hbCgpLFxuICAgIGNvbW1hbmQ6IENsaVNlcnZpY2VDb21tYW5kU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgbWVudTogei5hcnJheShDbGlTZXJ2aWNlTWVudUl0ZW1TY2hlbWEpLnJlYWRvbmx5KCkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnJlYWRvbmx5KCk7XG5cbi8qKiBDb21wbGV0ZSBzZXJpYWxpemFibGUgZGVmaW5pdGlvbiBjb25zdW1lZCBieSB0aGUgbGlmZWN5Y2xlIG1hbmFnZXIgYW5kIHRyYXkgaG9zdC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VEZWZpbml0aW9uID0gei5pbmZlcjx0eXBlb2YgQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWE+O1xuXG4vKiogUGFja2FnZS1kZXJpdmVkIHNlcnZpY2UgZmllbGRzIHBsdXMgY2FsbGVyLW93bmVkIGljb24sIHByb2Nlc3MsIGFuZCBtZW51IG9wdGlvbnMuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlRGVmaW5pdGlvbk9wdGlvbnMgPSBPbWl0PFxuICBDbGlTZXJ2aWNlRGVmaW5pdGlvbixcbiAgXCJwYWNrYWdlTmFtZVwiIHwgXCJpZFwiIHwgXCJuYW1lXCIgfCBcInZlcnNpb25cIiB8IFwiaWNvblwiIHwgXCJpc1RlbXBsYXRlSWNvblwiIHwgXCJjb21tYW5kXCJcbj4gJlxuICBQYXJ0aWFsPFBpY2s8Q2xpU2VydmljZURlZmluaXRpb24sIFwiaWRcIiB8IFwibmFtZVwiIHwgXCJ2ZXJzaW9uXCIgfCBcImljb25cIiB8IFwiaXNUZW1wbGF0ZUljb25cIj4+ICYge1xuICAgIC8qKiBTZXJ2aWNlIHByb2Nlc3MgY29tbWFuZCB3aXRoIG9wdGlvbmFsIHNjaGVtYSBvciBvYmplY3QtYmFja2VkIG9wdGlvbnMuICovXG4gICAgcmVhZG9ubHkgY29tbWFuZD86IENsaVNlcnZpY2VDb21tYW5kSW5wdXQ7XG4gIH07XG5cbi8qKiBEZWZpbmUgYSBzZXJ2aWNlIGZyb20gYW4gb3duaW5nIG1vZHVsZSBVUkwgb3IgaW5zdGFsbGVkIHBhY2thZ2UgbmFtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTZXJ2aWNlKFxuICBwYWNrYWdlUmVmZXJlbmNlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IENsaVNlcnZpY2VEZWZpbml0aW9uT3B0aW9ucyxcbik6IENsaVNlcnZpY2VEZWZpbml0aW9uIHtcbiAgY29uc3QgcGtnID0gcmVzb2x2ZVNlcnZpY2VQYWNrYWdlKHBhY2thZ2VSZWZlcmVuY2UpO1xuICBjb25zdCBkZWZhdWx0cyA9IHNlcnZpY2VQYWNrYWdlRGVmYXVsdHMocGtnKTtcbiAgY29uc3QgeyBjb21tYW5kLCAuLi5kZWZpbml0aW9uIH0gPSBvcHRpb25zO1xuICByZXR1cm4gQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWEucGFyc2Uoe1xuICAgIC4uLmRlZmluaXRpb24sXG4gICAgY29tbWFuZDogcmVzb2x2ZVNlcnZpY2VDb21tYW5kKGNvbW1hbmQpLFxuICAgIHBhY2thZ2VOYW1lOiBwa2cubmFtZSxcbiAgICBpZDogZGVmaW5pdGlvbi5pZCA/PyBkZWZhdWx0cy5pZCxcbiAgICBuYW1lOiBkZWZpbml0aW9uLm5hbWUgPz8gZGVmYXVsdHMubmFtZSxcbiAgICB2ZXJzaW9uOiBkZWZpbml0aW9uLnZlcnNpb24gPz8gcGtnLnZlcnNpb24sXG4gICAgaWNvbjogZGVmaW5pdGlvbi5pY29uID8/IHNlcnZpY2VUcmF5SWNvbigpLFxuICAgIGlzVGVtcGxhdGVJY29uOiBkZWZpbml0aW9uLmlzVGVtcGxhdGVJY29uID8/IHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU2VydmljZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IENsaVNlcnZpY2VDb21tYW5kSW5wdXQgfCB1bmRlZmluZWQsXG4pOiBDbGlTZXJ2aWNlQ29tbWFuZCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29tbWFuZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgeyBvcHRpb25zLCAuLi5kZWZpbml0aW9uIH0gPSBjb21tYW5kO1xuICBjb25zdCBhcmd1bWVudHNfID0gW1xuICAgIC4uLihkZWZpbml0aW9uLmFyZ3VtZW50cyA/PyBbXSksXG4gICAgLi4uKG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IFtdIDogc2VyaWFsaXplQXJncyhvcHRpb25zKSksXG4gIF07XG4gIHJldHVybiBDbGlTZXJ2aWNlQ29tbWFuZFNjaGVtYS5wYXJzZSh7XG4gICAgLi4uZGVmaW5pdGlvbixcbiAgICBlbnZpcm9ubWVudDogeyBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIsIC4uLmRlZmluaXRpb24uZW52aXJvbm1lbnQgfSxcbiAgICAuLi4oYXJndW1lbnRzXy5sZW5ndGggPiAwID8geyBhcmd1bWVudHM6IGFyZ3VtZW50c18gfSA6IHt9KSxcbiAgfSk7XG59XG5cbi8qKiBSZXNvbHZlIGEgcGFja2FnZSdzIHNpbmdsZSBvciBleHBsaWNpdGx5IG5hbWVkIGV4ZWN1dGFibGUgZW50cnlwb2ludC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VydmljZVBhY2thZ2VCaW4ocGFja2FnZVJlZmVyZW5jZTogc3RyaW5nLCBiaW5OYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmVTZXJ2aWNlUGFja2FnZShwYWNrYWdlUmVmZXJlbmNlKS5iaW4oYmluTmFtZSk7XG59XG4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBdUIsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFbkUsU0FBUyxTQUFTLENBQUMsS0FBYTtJQUM5QixJQUFJLENBQUM7UUFDSCxPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUN4QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3JDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FB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VSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDNUQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsd0JBQXdCLENBQUMsZ0JBQXdCLEVBQUUsT0FBZ0I7SUFDakYsT0FBTyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXJpYWxpemFibGUgY29uZmlndXJhdGlvbiBmb3IgYSBzeXN0ZW0tdHJheSBDTEkgc2VydmljZS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIHRoZSBjcm9zcy1wYWNrYWdlIHNlcnZpY2UgZGVmaW5pdGlvbiBjb250cmFjdCwgcGFja2FnZVxuICogaWRlbnRpdHkgZGVmYXVsdHMsIHByb2Nlc3MgY29tbWFuZCwgaWNvbiwgYW5kIG1lbnUgc2NoZW1hLiBSZXVzZVxuICoge0BsaW5rIGRlZmluZVNlcnZpY2V9IGluc3RlYWQgb2YgbWFpbnRhaW5pbmcgYW5vdGhlciBzZXJ2aWNlIG1hbmlmZXN0IHNoYXBlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzZXJpYWxpemVBcmdzLCB0eXBlIEFyZ3VtZW50U291cmNlIH0gZnJvbSBcIkBkYngtdG9vbHMvY2xpLWFyZ3MvYXJnc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZVNlcnZpY2VQYWNrYWdlLCBzZXJ2aWNlUGFja2FnZURlZmF1bHRzIH0gZnJvbSBcIi4vX3BhY2thZ2UudHNcIjtcbmltcG9ydCB7IHNlcnZpY2VUcmF5SWNvbiB9IGZyb20gXCIuL2ljb24udHNcIjtcblxuY29uc3QgU0FGRV9VUkxfUFJPVE9DT0xTID0gbmV3IFNldChbXCJodHRwOlwiLCBcImh0dHBzOlwiLCBcIm1haWx0bzpcIl0pO1xuXG5mdW5jdGlvbiBpc1NhZmVVcmwodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBTQUZFX1VSTF9QUk9UT0NPTFMuaGFzKG5ldyBVUkwodmFsdWUpLnByb3RvY29sKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBBIHByb2Nlc3MgbGF1bmNoZWQgYnkgdGhlIHN5c3RlbS10cmF5IHNlcnZpY2UgaG9zdC4gKi9cbmV4cG9ydCBjb25zdCBDbGlTZXJ2aWNlQ29tbWFuZFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZXhlY3V0YWJsZTogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcbiAgICBlbnRyeXBvaW50OiB6LnN0cmluZygpLm1pbigxKS5vcHRpb25hbCgpLFxuICAgIGJpbk5hbWU6IHouc3RyaW5nKCkubWluKDEpLm9wdGlvbmFsKCksXG4gICAgYXJndW1lbnRzOiB6LmFycmF5KHouc3RyaW5nKCkpLnJlYWRvbmx5KCkub3B0aW9uYWwoKSxcbiAgICBlbnZpcm9ubWVudDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkucmVhZG9ubHkoKS5vcHRpb25hbCgpLFxuICAgIGN3ZDogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN1cGVyUmVmaW5lKChjb21tYW5kLCBjb250ZXh0KSA9PiB7XG4gICAgaWYgKFxuICAgICAgTnVtYmVyKGNvbW1hbmQuZXhlY3V0YWJsZSAhPT0gdW5kZWZpbmVkKSArXG4gICAgICAgIE51bWJlcihjb21tYW5kLmVudHJ5cG9pbnQgIT09IHVuZGVmaW5lZCkgK1xuICAgICAgICBOdW1iZXIoY29tbWFuZC5iaW5OYW1lICE9PSB1bmRlZmluZWQpID5cbiAgICAgIDFcbiAgICApIHtcbiAgICAgIGNvbnRleHQuYWRkSXNzdWUoe1xuICAgICAgICBjb2RlOiBcImN1c3RvbVwiLFxuICAgICAgICBtZXNzYWdlOiBcImNvbW1hbmQgYWNjZXB0cyBhdCBtb3N0IG9uZSBvZiBleGVjdXRhYmxlLCBlbnRyeXBvaW50LCBvciBiaW5OYW1lXCIsXG4gICAgICB9KTtcbiAgICB9XG4gIH0pXG4gIC5yZWFkb25seSgpO1xuXG4vKiogQSBwcm9jZXNzIGxhdW5jaGVkIGJ5IHRoZSBzeXN0ZW0tdHJheSBzZXJ2aWNlIGhvc3QuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlQ29tbWFuZCA9IHouaW5mZXI8dHlwZW9mIENsaVNlcnZpY2VDb21tYW5kU2NoZW1hPjtcblxuLyoqIENvbW1hbmQgaW5wdXQgYWNjZXB0ZWQgYnkge0BsaW5rIGRlZmluZVNlcnZpY2V9IGJlZm9yZSBvcHRpb24gc2VyaWFsaXphdGlvbi4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VDb21tYW5kSW5wdXQgPSBPbWl0PENsaVNlcnZpY2VDb21tYW5kLCBcImFyZ3VtZW50c1wiPiAmIHtcbiAgLyoqIFBvc2l0aW9uYWwgb3IgcHJlLXNlcmlhbGl6ZWQgYXJndW1lbnRzIHBsYWNlZCBiZWZvcmUgZ2VuZXJhdGVkIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGFyZ3VtZW50cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogWm9kIGRlZmF1bHRzIG9yIGNvbmNyZXRlIG9wdGlvbiB2YWx1ZXMgY29udmVydGVkIGludG8gQ0xJIGZsYWdzLiAqL1xuICByZWFkb25seSBvcHRpb25zPzogQXJndW1lbnRTb3VyY2U7XG59O1xuXG4vKiogQSB0eXBlZCBjdXN0b20gaXRlbSBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBkZWZhdWx0IHNlcnZpY2UgdGl0bGUgYW5kIFF1aXQgaXRlbS4gKi9cbmV4cG9ydCBjb25zdCBDbGlTZXJ2aWNlTWVudUl0ZW1TY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6Lm9iamVjdCh7IHR5cGU6IHoubGl0ZXJhbChcInNlcGFyYXRvclwiKSB9KS5yZWFkb25seSgpLFxuICB6XG4gICAgLm9iamVjdCh7XG4gICAgICB0eXBlOiB6LmxpdGVyYWwoXCJ1cmxcIiksXG4gICAgICBsYWJlbDogei5zdHJpbmcoKS5taW4oMSksXG4gICAgICB1cmw6IHouc3RyaW5nKCkucmVmaW5lKGlzU2FmZVVybCwgXCJVUkwgbXVzdCB1c2UgSFRUUCwgSFRUUFMsIG9yIG1haWx0b1wiKSxcbiAgICB9KVxuICAgIC5yZWFkb25seSgpLFxuICB6XG4gICAgLm9iamVjdCh7XG4gICAgICB0eXBlOiB6LmxpdGVyYWwoXCJjb21tYW5kXCIpLFxuICAgICAgbGFiZWw6IHouc3RyaW5nKCkubWluKDEpLFxuICAgICAgY29tbWFuZDogQ2xpU2VydmljZUNvbW1hbmRTY2hlbWEsXG4gICAgfSlcbiAgICAucmVhZG9ubHkoKSxcbl0pO1xuXG4vKiogQSB0eXBlZCBjdXN0b20gaXRlbSBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBkZWZhdWx0IHNlcnZpY2UgdGl0bGUgYW5kIFF1aXQgaXRlbS4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VNZW51SXRlbSA9IHouaW5mZXI8dHlwZW9mIENsaVNlcnZpY2VNZW51SXRlbVNjaGVtYT47XG5cbi8qKiBQeXRob24gcGFja2FnZSBpbnN0YWxsZWQgaW50byBhIHNlcnZpY2Utb3duZWQgdXYgZW52aXJvbm1lbnQuICovXG5leHBvcnQgY29uc3QgQ2xpU2VydmljZVB5dGhvblBhY2thZ2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG5hbWU6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiUHl0aG9uIGRpc3RyaWJ1dGlvbiBuYW1lIGluc3RhbGxlZCBieSB1di5cIiksXG4gICAgdmVyc2lvbjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEpXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiUHl0aG9uIGRpc3RyaWJ1dGlvbiB2ZXJzaW9uLiBEZWZhdWx0cyB0byB0aGUgc2VydmljZSBwYWNrYWdlIHZlcnNpb24uXCIpLFxuICAgIHB5dGhvbjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEpXG4gICAgICAuZGVmYXVsdChcIjMuMTFcIilcbiAgICAgIC5kZXNjcmliZShcIlB5dGhvbiB2ZXJzaW9uIHJlcXVlc3QgcGFzc2VkIHRvIHV2IHdoZW4gY3JlYXRpbmcgdGhlIGVudmlyb25tZW50LlwiKSxcbiAgICBkZXBlbmRlbmNpZXM6IHpcbiAgICAgIC5hcnJheSh6LnN0cmluZygpLm1pbigxKSlcbiAgICAgIC5kZWZhdWx0KFtdKVxuICAgICAgLmRlc2NyaWJlKFwiQWRkaXRpb25hbCB1diBwYWNrYWdlIHNwZWNzIGluc3RhbGxlZCBiZXNpZGUgdGhlIHByaW1hcnkgZGlzdHJpYnV0aW9uLlwiKSxcbiAgfSlcbiAgLnJlYWRvbmx5KClcbiAgLmRlc2NyaWJlKFwiUHl0aG9uIHJ1bnRpbWUgcGFja2FnZSBpbnN0YWxsZWQgd2l0aCB1diBmb3IgYSBtYW5hZ2VkIHNlcnZpY2UuXCIpO1xuXG4vKiogUHl0aG9uIHBhY2thZ2UgaW5zdGFsbGVkIGludG8gYSBzZXJ2aWNlLW93bmVkIHV2IGVudmlyb25tZW50LiAqL1xuZXhwb3J0IHR5cGUgQ2xpU2VydmljZVB5dGhvblBhY2thZ2UgPSB6LmluZmVyPHR5cGVvZiBDbGlTZXJ2aWNlUHl0aG9uUGFja2FnZVNjaGVtYT47XG5cbi8qKiBQeXRob24gcGFja2FnZSBpbnB1dCBhY2NlcHRlZCBiZWZvcmUgdGhlIGRlZmF1bHQgUHl0aG9uIHZlcnNpb24gaXMgYXBwbGllZC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VQeXRob25QYWNrYWdlSW5wdXQgPSB6LmlucHV0PHR5cGVvZiBDbGlTZXJ2aWNlUHl0aG9uUGFja2FnZVNjaGVtYT47XG5cbi8qKiBDb21wbGV0ZSBzZXJpYWxpemFibGUgZGVmaW5pdGlvbiBjb25zdW1lZCBieSB0aGUgbGlmZWN5Y2xlIG1hbmFnZXIgYW5kIHRyYXkgaG9zdC4gKi9cbmV4cG9ydCBjb25zdCBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgaWQ6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm1pbigxKVxuICAgICAgLm1heCgxMjgpXG4gICAgICAucmVnZXgoL15bYS16MC05XVthLXowLTkuXy1dKiQvLCBcInNlcnZpY2UgaWQgbXVzdCBiZSBmaWxlc3lzdGVtIHNhZmVcIiksXG4gICAgbmFtZTogei5zdHJpbmcoKS5taW4oMSksXG4gICAgcGFja2FnZU5hbWU6IHouc3RyaW5nKCkubWluKDEpLFxuICAgIHZlcnNpb246IHouc3RyaW5nKCkubWluKDEpLm9wdGlvbmFsKCksXG4gICAgaWNvbjogei5zdHJpbmcoKS5taW4oMSksXG4gICAgaXNUZW1wbGF0ZUljb246IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgZGF0YURpcmVjdG9yeTogei5zdHJpbmcoKS5taW4oMSkub3B0aW9uYWwoKSxcbiAgICBweXRob25QYWNrYWdlOiBDbGlTZXJ2aWNlUHl0aG9uUGFja2FnZVNjaGVtYS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgXCJQeXRob24gcnVudGltZSBwYWNrYWdlIGluc3RhbGxlZCBpbnRvIGEgc2VydmljZS1vd25lZCB1diBlbnZpcm9ubWVudC5cIixcbiAgICApLFxuICAgIGNvbW1hbmQ6IENsaVNlcnZpY2VDb21tYW5kU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgbWVudTogei5hcnJheShDbGlTZXJ2aWNlTWVudUl0ZW1TY2hlbWEpLnJlYWRvbmx5KCkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnJlYWRvbmx5KCk7XG5cbi8qKiBDb21wbGV0ZSBzZXJpYWxpemFibGUgZGVmaW5pdGlvbiBjb25zdW1lZCBieSB0aGUgbGlmZWN5Y2xlIG1hbmFnZXIgYW5kIHRyYXkgaG9zdC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VEZWZpbml0aW9uID0gei5pbmZlcjx0eXBlb2YgQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWE+O1xuXG4vKiogUGFja2FnZS1kZXJpdmVkIHNlcnZpY2UgZmllbGRzIHBsdXMgY2FsbGVyLW93bmVkIGljb24sIHByb2Nlc3MsIGFuZCBtZW51IG9wdGlvbnMuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlRGVmaW5pdGlvbk9wdGlvbnMgPSBPbWl0PFxuICBDbGlTZXJ2aWNlRGVmaW5pdGlvbixcbiAgfCBcInBhY2thZ2VOYW1lXCJcbiAgfCBcImlkXCJcbiAgfCBcIm5hbWVcIlxuICB8IFwidmVyc2lvblwiXG4gIHwgXCJpY29uXCJcbiAgfCBcImlzVGVtcGxhdGVJY29uXCJcbiAgfCBcInB5dGhvblBhY2thZ2VcIlxuICB8IFwiY29tbWFuZFwiXG4+ICZcbiAgUGFydGlhbDxQaWNrPENsaVNlcnZpY2VEZWZpbml0aW9uLCBcImlkXCIgfCBcIm5hbWVcIiB8IFwidmVyc2lvblwiIHwgXCJpY29uXCIgfCBcImlzVGVtcGxhdGVJY29uXCI+PiAmIHtcbiAgICAvKiogUHl0aG9uIHBhY2thZ2UgaW5zdGFsbGVkIGludG8gYSBzZXJ2aWNlLW93bmVkIHV2IGVudmlyb25tZW50LiAqL1xuICAgIHJlYWRvbmx5IHB5dGhvblBhY2thZ2U/OiBDbGlTZXJ2aWNlUHl0aG9uUGFja2FnZUlucHV0O1xuICAgIC8qKiBTZXJ2aWNlIHByb2Nlc3MgY29tbWFuZCB3aXRoIG9wdGlvbmFsIHNjaGVtYSBvciBvYmplY3QtYmFja2VkIG9wdGlvbnMuICovXG4gICAgcmVhZG9ubHkgY29tbWFuZD86IENsaVNlcnZpY2VDb21tYW5kSW5wdXQ7XG4gIH07XG5cbi8qKiBEZWZpbmUgYSBzZXJ2aWNlIGZyb20gYW4gb3duaW5nIG1vZHVsZSBVUkwgb3IgaW5zdGFsbGVkIHBhY2thZ2UgbmFtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTZXJ2aWNlKFxuICBwYWNrYWdlUmVmZXJlbmNlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IENsaVNlcnZpY2VEZWZpbml0aW9uT3B0aW9ucyxcbik6IENsaVNlcnZpY2VEZWZpbml0aW9uIHtcbiAgY29uc3QgcGtnID0gcmVzb2x2ZVNlcnZpY2VQYWNrYWdlKHBhY2thZ2VSZWZlcmVuY2UpO1xuICBjb25zdCBkZWZhdWx0cyA9IHNlcnZpY2VQYWNrYWdlRGVmYXVsdHMocGtnKTtcbiAgY29uc3QgeyBjb21tYW5kLCAuLi5kZWZpbml0aW9uIH0gPSBvcHRpb25zO1xuICByZXR1cm4gQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWEucGFyc2Uoe1xuICAgIC4uLmRlZmluaXRpb24sXG4gICAgY29tbWFuZDogcmVzb2x2ZVNlcnZpY2VDb21tYW5kKGNvbW1hbmQpLFxuICAgIHBhY2thZ2VOYW1lOiBwa2cubmFtZSxcbiAgICBpZDogZGVmaW5pdGlvbi5pZCA/PyBkZWZhdWx0cy5pZCxcbiAgICBuYW1lOiBkZWZpbml0aW9uLm5hbWUgPz8gZGVmYXVsdHMubmFtZSxcbiAgICB2ZXJzaW9uOiBkZWZpbml0aW9uLnZlcnNpb24gPz8gcGtnLnZlcnNpb24sXG4gICAgaWNvbjogZGVmaW5pdGlvbi5pY29uID8/IHNlcnZpY2VUcmF5SWNvbigpLFxuICAgIGlzVGVtcGxhdGVJY29uOiBkZWZpbml0aW9uLmlzVGVtcGxhdGVJY29uID8/IHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU2VydmljZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IENsaVNlcnZpY2VDb21tYW5kSW5wdXQgfCB1bmRlZmluZWQsXG4pOiBDbGlTZXJ2aWNlQ29tbWFuZCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29tbWFuZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgeyBvcHRpb25zLCAuLi5kZWZpbml0aW9uIH0gPSBjb21tYW5kO1xuICBjb25zdCBhcmd1bWVudHNfID0gW1xuICAgIC4uLihkZWZpbml0aW9uLmFyZ3VtZW50cyA/PyBbXSksXG4gICAgLi4uKG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IFtdIDogc2VyaWFsaXplQXJncyhvcHRpb25zKSksXG4gIF07XG4gIHJldHVybiBDbGlTZXJ2aWNlQ29tbWFuZFNjaGVtYS5wYXJzZSh7XG4gICAgLi4uZGVmaW5pdGlvbixcbiAgICBlbnZpcm9ubWVudDogeyBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIsIC4uLmRlZmluaXRpb24uZW52aXJvbm1lbnQgfSxcbiAgICAuLi4oYXJndW1lbnRzXy5sZW5ndGggPiAwID8geyBhcmd1bWVudHM6IGFyZ3VtZW50c18gfSA6IHt9KSxcbiAgfSk7XG59XG5cbi8qKiBSZXNvbHZlIGEgcGFja2FnZSdzIHNpbmdsZSBvciBleHBsaWNpdGx5IG5hbWVkIGV4ZWN1dGFibGUgZW50cnlwb2ludC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VydmljZVBhY2thZ2VCaW4ocGFja2FnZVJlZmVyZW5jZTogc3RyaW5nLCBiaW5OYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmVTZXJ2aWNlUGFja2FnZShwYWNrYWdlUmVmZXJlbmNlKS5iaW4oYmluTmFtZSk7XG59XG4iXX0=
@@ -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 directories, or control sockets.
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, packageSpecifiers: readonly 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
  /**
@@ -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 directories, or control sockets.
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.dependencies], 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
- if (command.executable)
171
- return command;
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
- ...(command.environment ? { environment: command.environment } : {}),
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLG1CQUFtQixHQUVwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQXNCLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFDTCwwQkFBMEIsR0FJM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLGtDQUFrQyxHQUFHLE1BQU0sQ0FBQztBQUNsRCxNQUFNLGlDQUFp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QUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDeEMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW5zdGFsbCwgc3RhcnQsIHN0b3AsIGFuZCBpbnNwZWN0IGEgc3lzdGVtLXRyYXkgdXNlciBzZXJ2aWNlLlxuICpcbiAqIFRoaXMgbW9kdWxlIG93bnMgY3VycmVudC11c2VyIHNlcnZpY2UgY29tcGlsYXRpb24gYW5kIGxpZmVjeWNsZSBhY3Jvc3NcbiAqIGNvbnN1bWluZyBDTElzLiBSZXVzZSB7QGxpbmsgQ2xpU2VydmljZX0gcmF0aGVyIHRoYW4gYWRkaW5nIHByb2R1Y3Qtc3BlY2lmaWNcbiAqIGluc3RhbGxlcnMsIHN0YXJ0dXAgcmVnaXN0cmF0aW9uLCBydW50aW1lIGRpcmVjdG9yaWVzLCBvciBjb250cm9sIHNvY2tldHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkZGlyLCBybSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCwgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5pbXBvcnQgKiBhcyBiaW4gZnJvbSBcIkBkYngtdG9vbHMvY29yZS9iaW5cIjtcbmltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5cbmltcG9ydCB7IHJlYWRTZXJ2aWNlRGVmaW5pdGlvbiwgd3JpdGVTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL19jb25maWcudHNcIjtcbmltcG9ydCB7IHJlcXVlc3RTZXJ2aWNlQ29udHJvbCB9IGZyb20gXCIuL19jb250cm9sLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlU2VydmljZVBhY2thZ2UsIHR5cGUgU2VydmljZVBhY2thZ2UgfSBmcm9tIFwiLi9fcGFja2FnZS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJ1bnRpbWVDb250ZXh0LFxuICByZXNvbHZlU2VydmljZVBhdGhzLFxuICB0eXBlIFNlcnZpY2VSdW50aW1lQ29udGV4dCxcbn0gZnJvbSBcIi4vX3BhdGhzLnRzXCI7XG5pbXBvcnQgeyBleHRlcm5hbFJ1bnRpbWVQYWNrYWdlcywgaW5zdGFsbFNlcnZpY2VSdW50aW1lIH0gZnJvbSBcIi4vX3J1bnRpbWUudHNcIjtcbmltcG9ydCB7IGluc3RhbGxTdGFydHVwLCByZW1vdmVTdGFydHVwLCB0eXBlIFNlcnZpY2VMYXVuY2ggfSBmcm9tIFwiLi9fc3RhcnR1cC50c1wiO1xuaW1wb3J0IHtcbiAgQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWEsXG4gIHR5cGUgQ2xpU2VydmljZUNvbW1hbmQsXG4gIHR5cGUgQ2xpU2VydmljZURlZmluaXRpb24sXG4gIHR5cGUgQ2xpU2VydmljZU1lbnVJdGVtLFxufSBmcm9tIFwiLi9kZWZpbml0aW9uLnRzXCI7XG5cbmNvbnN0IERFRkFVTFRfU1RBUlRfVElNRU9VVF9NSUxMSVNFQ09ORFMgPSAxNV8wMDA7XG5jb25zdCBERUZBVUxUX1NUT1BfVElNRU9VVF9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5jb25zdCBQT0xMX0lOVEVSVkFMX01JTExJU0VDT05EUyA9IDEwMDtcblxuLyoqIENvbXBpbGUgb25lIFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCBlbnRyeXBvaW50IGludG8gYSBzdGFuZGFsb25lIGV4ZWN1dGFibGUuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlQ29tcGlsZXIgPSAoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgZXh0ZXJuYWw/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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QUFRLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDckUsSUFBSSxFQUFFLENBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUN6QixJQUE0QixFQUM1QixRQUFpQixFQUNqQixtQkFBMkIsRUFDM0IsT0FBZTtJQUVmLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQztJQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQ3hDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluc3RhbGwsIHN0YXJ0LCBzdG9wLCBhbmQgaW5zcGVjdCBhIHN5c3RlbS10cmF5IHVzZXIgc2VydmljZS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIGN1cnJlbnQtdXNlciBzZXJ2aWNlIGNvbXBpbGF0aW9uIGFuZCBsaWZlY3ljbGUgYWNyb3NzXG4gKiBjb25zdW1pbmcgQ0xJcy4gUmV1c2Uge0BsaW5rIENsaVNlcnZpY2V9IHJhdGhlciB0aGFuIGFkZGluZyBwcm9kdWN0LXNwZWNpZmljXG4gKiBpbnN0YWxsZXJzLCB1diBQeXRob24gZW52aXJvbm1lbnRzLCBzdGFydHVwIHJlZ2lzdHJhdGlvbiwgcnVudGltZVxuICogZGlyZWN0b3JpZXMsIG9yIGNvbnRyb2wgc29ja2V0cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlYWRkaXIsIHJtIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGV4dG5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmltcG9ydCAqIGFzIGJpbiBmcm9tIFwiQGRieC10b29scy9jb3JlL2JpblwiO1xuaW1wb3J0ICogYXMgZXhlYyBmcm9tIFwiQGRieC10b29scy9jb3JlL2V4ZWNcIjtcblxuaW1wb3J0IHsgcmVhZFNlcnZpY2VEZWZpbml0aW9uLCB3cml0ZVNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vX2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFNlcnZpY2VDb250cm9sIH0gZnJvbSBcIi4vX2NvbnRyb2wudHNcIjtcbmltcG9ydCB7IHJlc29sdmVTZXJ2aWNlUGFja2FnZSwgdHlwZSBTZXJ2aWNlUGFja2FnZSB9IGZyb20gXCIuL19wYWNrYWdlLnRzXCI7XG5pbXBvcnQge1xuICBkZWZhdWx0UnVudGltZUNvbnRleHQsXG4gIHJlc29sdmVTZXJ2aWNlUGF0aHMsXG4gIHR5cGUgU2VydmljZVJ1bnRpbWVDb250ZXh0LFxufSBmcm9tIFwiLi9fcGF0aHMudHNcIjtcbmltcG9ydCB7XG4gIGV4dGVybmFsUnVudGltZVBhY2thZ2VzLFxuICBpbnN0YWxsU2VydmljZVB5dGhvblBhY2thZ2UsXG4gIGluc3RhbGxTZXJ2aWNlUnVudGltZSxcbn0gZnJvbSBcIi4vX3J1bnRpbWUudHNcIjtcbmltcG9ydCB7IGluc3RhbGxTdGFydHVwLCByZW1vdmVTdGFydHVwLCB0eXBlIFNlcnZpY2VMYXVuY2ggfSBmcm9tIFwiLi9fc3RhcnR1cC50c1wiO1xuaW1wb3J0IHtcbiAgQ2xpU2VydmljZURlZmluaXRpb25TY2hlbWEsXG4gIHR5cGUgQ2xpU2VydmljZUNvbW1hbmQsXG4gIHR5cGUgQ2xpU2VydmljZURlZmluaXRpb24sXG4gIHR5cGUgQ2xpU2VydmljZU1lbnVJdGVtLFxufSBmcm9tIFwiLi9kZWZpbml0aW9uLnRzXCI7XG5cbmNvbnN0IERFRkFVTFRfU1RBUlRfVElNRU9VVF9NSUxMSVNFQ09ORFMgPSAxNV8wMDA7XG5jb25zdCBERUZBVUxUX1NUT1BfVElNRU9VVF9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5jb25zdCBQT0xMX0lOVEVSVkFMX01JTExJU0VDT05EUyA9IDEwMDtcblxuLyoqIENvbXBpbGUgb25lIFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCBlbnRyeXBvaW50IGludG8gYSBzdGFuZGFsb25lIGV4ZWN1dGFibGUuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlQ29tcGlsZXIgPSAoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZyxcbiAgZXh0ZXJuYWw/OiByZWFkb25seSBzdHJpbmdbXSxcbikgPT4gUHJvbWlzZTx2b2lkPjtcblxuLyoqIEluc3RhbGwgZXhhY3QgZXh0ZXJuYWwgcnVudGltZSBkZXBlbmRlbmNpZXMgaW50byB0aGUgZGJ4LXRvb2xzIGhvbWUuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlUnVudGltZUluc3RhbGxlciA9IChcbiAgYnVuRXhlY3V0YWJsZTogc3RyaW5nLFxuICBkaXJlY3Rvcnk6IHN0cmluZyxcbiAgZGVwZW5kZW5jaWVzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbikgPT4gUHJvbWlzZTx2b2lkPjtcblxuLyoqIEluc3RhbGwgYSBQeXRob24gcGFja2FnZSBpbnRvIGEgc2VydmljZS1vd25lZCB1diBlbnZpcm9ubWVudC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VQeXRob25JbnN0YWxsZXIgPSAoXG4gIHV2RXhlY3V0YWJsZTogc3RyaW5nLFxuICBkaXJlY3Rvcnk6IHN0cmluZyxcbiAgcGFja2FnZVNwZWNpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBweXRob246IHN0cmluZyxcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSxcbikgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4vKiogSG9zdCBydW50aW1lIG92ZXJyaWRlcyBmb3IgdGVzdHMsIGVtYmVkZGVkIGRpc3RyaWJ1dGlvbnMsIGFuZCBub25zdGFuZGFyZCBob21lcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpU2VydmljZVJ1bnRpbWVPcHRpb25zIHtcbiAgLyoqIE9wZXJhdGluZyBzeXN0ZW0gdXNlZCBmb3IgY29uZmlndXJhdGlvbiBhbmQgc3RhcnR1cCByZWdpc3RyYXRpb24uICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogTm9kZUpTLlBsYXRmb3JtO1xuICAvKiogRW52aXJvbm1lbnQgdXNlZCB0byBsb2NhdGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBkaXJlY3Rvcmllcy4gKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiBSZWFkb25seTxOb2RlSlMuUHJvY2Vzc0Vudj47XG4gIC8qKiBIb21lIGRpcmVjdG9yeSB1c2VkIHdoZW4gcGxhdGZvcm0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBhYnNlbnQuICovXG4gIHJlYWRvbmx5IGhvbWVEaXJlY3Rvcnk/OiBzdHJpbmc7XG4gIC8qKiBUZW1wb3JhcnkgZGlyZWN0b3J5IHVzZWQgZm9yIHRoZSBsb2NhbCBjb250cm9sIHNvY2tldC4gKi9cbiAgcmVhZG9ubHkgdGVtcG9yYXJ5RGlyZWN0b3J5Pzogc3RyaW5nO1xuICAvKiogU2hhcmVkIGRieC10b29scyBob21lIGNvbnRhaW5pbmcgaW5zdGFsbGVkIHNlcnZpY2UgYmluYXJpZXMuICovXG4gIHJlYWRvbmx5IGdsb2JhbEhvbWVEaXJlY3Rvcnk/OiBzdHJpbmc7XG4gIC8qKiBQYWNrYWdlLXByb3ZpZGVkIEJ1biBleGVjdXRhYmxlIG92ZXJyaWRlLiAqL1xuICByZWFkb25seSBidW5FeGVjdXRhYmxlPzogc3RyaW5nO1xuICAvKiogdXYgZXhlY3V0YWJsZSB1c2VkIGZvciBtYW5hZ2VkIFB5dGhvbiBwYWNrYWdlIGVudmlyb25tZW50cy4gKi9cbiAgcmVhZG9ubHkgdXZFeGVjdXRhYmxlPzogc3RyaW5nO1xuICAvKiogU3RhbmRhbG9uZSBjb21waWxlciBvdmVycmlkZS4gKi9cbiAgcmVhZG9ubHkgY29tcGlsZT86IENsaVNlcnZpY2VDb21waWxlcjtcbiAgLyoqIEV4dGVybmFsIHJ1bnRpbWUgZGVwZW5kZW5jeSBpbnN0YWxsZXIgb3ZlcnJpZGUuICovXG4gIHJlYWRvbmx5IGluc3RhbGxSdW50aW1lPzogQ2xpU2VydmljZVJ1bnRpbWVJbnN0YWxsZXI7XG4gIC8qKiBQeXRob24gcGFja2FnZSBpbnN0YWxsZXIgb3ZlcnJpZGUuICovXG4gIHJlYWRvbmx5IGluc3RhbGxQeXRob24/OiBDbGlTZXJ2aWNlUHl0aG9uSW5zdGFsbGVyO1xuICAvKiogU3lzdGVtLXRyYXkgaG9zdCBzb3VyY2UgZW50cnlwb2ludCBvdmVycmlkZS4gKi9cbiAgcmVhZG9ubHkgaG9zdEVudHJ5cG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBzeXN0cmF5MiBuYXRpdmUgZXhlY3V0YWJsZSBvdmVycmlkZS4gKi9cbiAgcmVhZG9ubHkgdHJheUV4ZWN1dGFibGU/OiBzdHJpbmc7XG59XG5cbi8qKiBPcHRpb25zIGNvbnRyb2xsaW5nIHNlcnZpY2UgaW5zdGFsbGF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnMge1xuICAvKiogU3RhcnQgdGhlIHNlcnZpY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgd3JpdGluZyBpdHMgY29uZmlndXJhdGlvbiBhbmQgbG9naW4gZW50cnkuICovXG4gIHJlYWRvbmx5IHN0YXJ0PzogYm9vbGVhbjtcbn1cblxuLyoqIEN1cnJlbnQgaW5zdGFsbGF0aW9uIGFuZCBwcm9jZXNzIHN0YXRlIGZvciBhIHN5c3RlbS10cmF5IHNlcnZpY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaVNlcnZpY2VTdGF0dXMge1xuICAvKiogV2hldGhlciB0aGUgc2VyaWFsaXplZCBzZXJ2aWNlIGRlZmluaXRpb24gZXhpc3RzLiAqL1xuICByZWFkb25seSBpbnN0YWxsZWQ6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSB0cmF5IGhvc3QgYW5zd2VyZWQgaXRzIGxvY2FsIGNvbnRyb2wgc29ja2V0LiAqL1xuICByZWFkb25seSBydW5uaW5nOiBib29sZWFuO1xuICAvKiogVHJheSBob3N0IHByb2Nlc3MgSUQgd2hlbiBydW5uaW5nLiAqL1xuICByZWFkb25seSBwaWQ/OiBudW1iZXI7XG4gIC8qKiBNYW5hZ2VkIGNoaWxkIHByb2Nlc3MgSUQgd2hlbiB0aGUgZGVmaW5pdGlvbiBpbmNsdWRlcyBhIGNvbW1hbmQuICovXG4gIHJlYWRvbmx5IHNlcnZpY2VQaWQ/OiBudW1iZXI7XG59XG5cbi8qKiBMaWZlY3ljbGUgY29udHJhY3QgY29uc3VtZWQgYnkgQ0xJIGNvbW1hbmQgYnVpbGRlcnMuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaVNlcnZpY2VMaWZlY3ljbGUge1xuICAvKiogSW5zdGFsbCB0aGUgbG9naW4gZW50cnkgYW5kIG9wdGlvbmFsbHkgc3RhcnQgdGhlIHNlcnZpY2UuICovXG4gIGluc3RhbGwob3B0aW9ucz86IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBTdGFydCB0aGUgaW5zdGFsbGVkIHNlcnZpY2Ugd2hlbiBpdCBpcyBub3QgYWxyZWFkeSBydW5uaW5nLiAqL1xuICBzdGFydCgpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogU3RvcCB0aGUgcnVubmluZyB0cmF5IGhvc3QgYW5kIGl0cyBtYW5hZ2VkIGNoaWxkIHByb2Nlc3MuICovXG4gIHN0b3AoKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFN0b3AgYW5kIHN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZS4gKi9cbiAgcmVzdGFydCgpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogU3RvcCB0aGUgc2VydmljZSBhbmQgcmVtb3ZlIGl0cyBsb2dpbiBlbnRyeSBhbmQgcGFja2FnZS1vd25lZCBzdGF0ZS4gKi9cbiAgdW5pbnN0YWxsKCk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZWFkIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBhbmQgcHJvY2VzcyBzdGF0ZS4gKi9cbiAgc3RhdHVzKCk6IFByb21pc2U8Q2xpU2VydmljZVN0YXR1cz47XG59XG5cbi8qKiBDcm9zcy1wbGF0Zm9ybSBsaWZlY3ljbGUgbWFuYWdlciBmb3Igb25lIHN5c3RlbS10cmF5IHVzZXIgc2VydmljZS4gKi9cbmV4cG9ydCBjbGFzcyBDbGlTZXJ2aWNlIGltcGxlbWVudHMgQ2xpU2VydmljZUxpZmVjeWNsZSB7XG4gIHJlYWRvbmx5IGRlZmluaXRpb246IENsaVNlcnZpY2VEZWZpbml0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZTogU2VydmljZVJ1bnRpbWVDb250ZXh0O1xuICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEhvbWVEaXJlY3Rvcnk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBidW5FeGVjdXRhYmxlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXZFeGVjdXRhYmxlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcGlsZXI6IENsaVNlcnZpY2VDb21waWxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lSW5zdGFsbGVyOiBDbGlTZXJ2aWNlUnVudGltZUluc3RhbGxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBweXRob25JbnN0YWxsZXI6IENsaVNlcnZpY2VQeXRob25JbnN0YWxsZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdEVudHJ5cG9pbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0cmF5RXhlY3V0YWJsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBsaWZlY3ljbGUgbWFuYWdlciBmcm9tIGEgc2VyaWFsaXphYmxlIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkZWZpbml0aW9uIFByb2R1Y3Qtb3duZWQgc2VydmljZSBtZXRhZGF0YSwgcHJvY2VzcywgYW5kIG1lbnUuXG4gICAqIEBwYXJhbSBvcHRpb25zIEhvc3QgcnVudGltZSBvdmVycmlkZXMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkZWZpbml0aW9uOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbiwgb3B0aW9uczogQ2xpU2VydmljZVJ1bnRpbWVPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmRlZmluaXRpb24gPSBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYS5wYXJzZShkZWZpbml0aW9uKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGRlZmF1bHRSdW50aW1lQ29udGV4dCgpO1xuICAgIHRoaXMucnVudGltZSA9IHtcbiAgICAgIHBsYXRmb3JtOiBvcHRpb25zLnBsYXRmb3JtID8/IGRlZmF1bHRzLnBsYXRmb3JtLFxuICAgICAgZW52aXJvbm1lbnQ6IG9wdGlvbnMuZW52aXJvbm1lbnQgPz8gZGVmYXVsdHMuZW52aXJvbm1lbnQsXG4gICAgICBob21lRGlyZWN0b3J5OiBvcHRpb25zLmhvbWVEaXJlY3RvcnkgPz8gZGVmYXVsdHMuaG9tZURpcmVjdG9yeSxcbiAgICAgIHRlbXBvcmFyeURpcmVjdG9yeTogb3B0aW9ucy50ZW1wb3JhcnlEaXJlY3RvcnkgPz8gZGVmYXVsdHMudGVtcG9yYXJ5RGlyZWN0b3J5LFxuICAgIH07XG4gICAgdGhpcy5nbG9iYWxIb21lRGlyZWN0b3J5ID1cbiAgICAgIG9wdGlvbnMuZ2xvYmFsSG9tZURpcmVjdG9yeSA/PyBqb2luKHRoaXMucnVudGltZS5ob21lRGlyZWN0b3J5LCBcIi5kYngtdG9vbHNcIik7XG4gICAgdGhpcy5idW5FeGVjdXRhYmxlID0gb3B0aW9ucy5idW5FeGVjdXRhYmxlID8/IHJlc29sdmVCdW5FeGVjdXRhYmxlKCk7XG4gICAgdGhpcy51dkV4ZWN1dGFibGUgPSBvcHRpb25zLnV2RXhlY3V0YWJsZSA/PyBcInV2XCI7XG4gICAgdGhpcy5jb21waWxlciA9XG4gICAgICBvcHRpb25zLmNvbXBpbGUgPz9cbiAgICAgICgoZW50cnlwb2ludCwgb3V0cHV0LCB3b3JraW5nRGlyZWN0b3J5LCBleHRlcm5hbCkgPT5cbiAgICAgICAgY29tcGlsZVdpdGhCdW4odGhpcy5idW5FeGVjdXRhYmxlLCBlbnRyeXBvaW50LCBvdXRwdXQsIHdvcmtpbmdEaXJlY3RvcnksIGV4dGVybmFsKSk7XG4gICAgdGhpcy5ydW50aW1lSW5zdGFsbGVyID0gb3B0aW9ucy5pbnN0YWxsUnVudGltZSA/PyBpbnN0YWxsU2VydmljZVJ1bnRpbWU7XG4gICAgdGhpcy5weXRob25JbnN0YWxsZXIgPSBvcHRpb25zLmluc3RhbGxQeXRob24gPz8gaW5zdGFsbFNlcnZpY2VQeXRob25QYWNrYWdlO1xuICAgIHRoaXMuaG9zdEVudHJ5cG9pbnQgPSBvcHRpb25zLmhvc3RFbnRyeXBvaW50ID8/IHJlc29sdmVIb3N0RW50cnlwb2ludCgpO1xuICAgIHRoaXMudHJheUV4ZWN1dGFibGUgPSBvcHRpb25zLnRyYXlFeGVjdXRhYmxlID8/IHJlc29sdmVUcmF5RXhlY3V0YWJsZSh0aGlzLnJ1bnRpbWUucGxhdGZvcm0pO1xuICB9XG5cbiAgLyoqIEluc3RhbGwgdGhlIGxvZ2luIGVudHJ5IGFuZCBvcHRpb25hbGx5IHN0YXJ0IHRoZSBzZXJ2aWNlLiAqL1xuICBhc3luYyBpbnN0YWxsKG9wdGlvbnM6IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3duZXIgPSByZXNvbHZlU2VydmljZVBhY2thZ2UodGhpcy5kZWZpbml0aW9uLnBhY2thZ2VOYW1lKTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBvd25lci5kZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBleHRlcm5hbCA9IG5ldyBTZXQoZXh0ZXJuYWxSdW50aW1lUGFja2FnZXMoZGVwZW5kZW5jaWVzKSk7XG4gICAgYXdhaXQgdGhpcy5ydW50aW1lSW5zdGFsbGVyKFxuICAgICAgdGhpcy5idW5FeGVjdXRhYmxlLFxuICAgICAgdGhpcy5nbG9iYWxIb21lRGlyZWN0b3J5LFxuICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykuZmlsdGVyKChbbmFtZV0pID0+IGV4dGVybmFsLmhhcyhuYW1lKSkpLFxuICAgICk7XG4gICAgY29uc3QgcGF0aHMgPSByZXNvbHZlU2VydmljZVBhdGhzKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5ydW50aW1lKTtcbiAgICBjb25zdCBpbnN0YWxsZWREZWZpbml0aW9uID0gYXdhaXQgdGhpcy5pbnN0YWxsRGVmaW5pdGlvbihvd25lciwgcGF0aHMuZGlyZWN0b3J5KTtcbiAgICBjb25zdCBob3N0ID0gYXdhaXQgdGhpcy5lbnN1cmVDb21waWxlZEJpbmFyeShcbiAgICAgIHRoaXMuYmluYXJ5TmFtZShpbnN0YWxsZWREZWZpbml0aW9uLCBcInNlcnZpY2VcIiksXG4gICAgICB0aGlzLmhvc3RFbnRyeXBvaW50LFxuICAgICAgcmVzb2x2ZShkaXJuYW1lKHRoaXMuaG9zdEVudHJ5cG9pbnQpLCBcIi4uXCIpLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVUcmF5QmluYXJ5KCk7XG4gICAgYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgYXdhaXQgd3JpdGVTZXJ2aWNlRGVmaW5pdGlvbihwYXRocy5jb25maWdGaWxlLCBpbnN0YWxsZWREZWZpbml0aW9uKTtcbiAgICBhd2FpdCBpbnN0YWxsU3RhcnR1cChcbiAgICAgIGluc3RhbGxlZERlZmluaXRpb24sXG4gICAgICBwYXRocyxcbiAgICAgIHRoaXMucnVudGltZSxcbiAgICAgIHRoaXMubGF1bmNoKGhvc3QucGF0aCwgcGF0aHMuY29uZmlnRmlsZSksXG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5zdGFydCA/PyB0cnVlKSBhd2FpdCB0aGlzLnN0YXJ0KCk7XG4gIH1cblxuICAvKiogU3RhcnQgdGhlIGluc3RhbGxlZCBzZXJ2aWNlIHdoZW4gaXQgaXMgbm90IGFscmVhZHkgcnVubmluZy4gKi9cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF0aHMgPSByZXNvbHZlU2VydmljZVBhdGhzKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5ydW50aW1lKTtcbiAgICBpZiAoIShhd2FpdCB0aGlzLnN0YXR1cygpKS5pbnN0YWxsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmRlZmluaXRpb24ubmFtZX0gaXMgbm90IGluc3RhbGxlZGApO1xuICAgIH1cbiAgICBpZiAoKGF3YWl0IHJlcXVlc3RTZXJ2aWNlQ29udHJvbChwYXRocy5jb250cm9sQWRkcmVzcywgXCJzdGF0dXNcIikpICE9PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgIGNvbnN0IGluc3RhbGxlZERlZmluaXRpb24gPSBhd2FpdCByZWFkU2VydmljZURlZmluaXRpb24ocGF0aHMuY29uZmlnRmlsZSk7XG4gICAgY29uc3QgbGF1bmNoID0gdGhpcy5sYXVuY2goXG4gICAgICB0aGlzLmJpbmFyeUNvbnRleHQodGhpcy5iaW5hcnlOYW1lKGluc3RhbGxlZERlZmluaXRpb24sIFwic2VydmljZVwiKSkucGF0aCxcbiAgICAgIHBhdGhzLmNvbmZpZ0ZpbGUsXG4gICAgKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGxhdW5jaC5leGVjdXRhYmxlLCBsYXVuY2guYXJndW1lbnRzLCB7XG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxuICAgIH0pO1xuICAgIGNoaWxkLnVucmVmKCk7XG5cbiAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgd2FpdEZvclN0YXRlKFxuICAgICAgICBhc3luYyAoKSA9PiAoYXdhaXQgcmVxdWVzdFNlcnZpY2VDb250cm9sKHBhdGhzLmNvbnRyb2xBZGRyZXNzLCBcInN0YXR1c1wiKSkgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgREVGQVVMVF9TVEFSVF9USU1FT1VUX01JTExJU0VDT05EUyxcbiAgICAgICAgYCR7dGhpcy5kZWZpbml0aW9uLm5hbWV9IGRpZCBub3Qgc3RhcnRgLFxuICAgICAgKSxcbiAgICAgIG5ldyBQcm9taXNlPG5ldmVyPigoX3Jlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjaGlsZC5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICAgICAgY2hpbGQub25jZShcImV4aXRcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYCR7dGhpcy5kZWZpbml0aW9uLm5hbWV9IGhvc3QgZXhpdGVkIGJlZm9yZSBzdGFydHVwICgke3NpZ25hbCA/PyBTdHJpbmcoY29kZSl9KWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgXSk7XG4gIH1cblxuICAvKiogU3RvcCB0aGUgcnVubmluZyB0cmF5IGhvc3QgYW5kIGl0cyBtYW5hZ2VkIGNoaWxkIHByb2Nlc3MuICovXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF0aHMgPSByZXNvbHZlU2VydmljZVBhdGhzKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5ydW50aW1lKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RTZXJ2aWNlQ29udHJvbChwYXRocy5jb250cm9sQWRkcmVzcywgXCJzdG9wXCIpO1xuICAgIGlmICghcmVzcG9uc2UpIHJldHVybjtcbiAgICBhd2FpdCB3YWl0Rm9yU3RhdGUoXG4gICAgICBhc3luYyAoKSA9PiAoYXdhaXQgcmVxdWVzdFNlcnZpY2VDb250cm9sKHBhdGhzLmNvbnRyb2xBZGRyZXNzLCBcInN0YXR1c1wiKSkgIT09IHVuZGVmaW5lZCxcbiAgICAgIGZhbHNlLFxuICAgICAgREVGQVVMVF9TVE9QX1RJTUVPVVRfTUlMTElTRUNPTkRTLFxuICAgICAgYCR7dGhpcy5kZWZpbml0aW9uLm5hbWV9IGRpZCBub3Qgc3RvcGAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTdG9wIGFuZCBzdGFydCB0aGUgaW5zdGFsbGVkIHNlcnZpY2UuICovXG4gIGFzeW5jIHJlc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgLyoqIFN0b3AgdGhlIHNlcnZpY2UgYW5kIHJlbW92ZSBpdHMgbG9naW4gZW50cnkgYW5kIHBhY2thZ2Utb3duZWQgc3RhdGUuICovXG4gIGFzeW5jIHVuaW5zdGFsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXRocyA9IHJlc29sdmVTZXJ2aWNlUGF0aHModGhpcy5kZWZpbml0aW9uLCB0aGlzLnJ1bnRpbWUpO1xuICAgIGF3YWl0IHRoaXMuc3RvcCgpO1xuICAgIGF3YWl0IHJlbW92ZVN0YXJ0dXAocGF0aHMpO1xuICAgIGF3YWl0IHJtKHBhdGhzLmRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIGFuZCBwcm9jZXNzIHN0YXRlLiAqL1xuICBhc3luYyBzdGF0dXMoKTogUHJvbWlzZTxDbGlTZXJ2aWNlU3RhdHVzPiB7XG4gICAgY29uc3QgcGF0aHMgPSByZXNvbHZlU2VydmljZVBhdGhzKHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5ydW50aW1lKTtcbiAgICBjb25zdCBpbnN0YWxsZWQgPSBleGlzdHNTeW5jKHBhdGhzLmNvbmZpZ0ZpbGUpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFNlcnZpY2VDb250cm9sKHBhdGhzLmNvbnRyb2xBZGRyZXNzLCBcInN0YXR1c1wiKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zdGFsbGVkLFxuICAgICAgcnVubmluZzogcmVzcG9uc2UgIT09IHVuZGVmaW5lZCxcbiAgICAgIC4uLihyZXNwb25zZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHBpZDogcmVzcG9uc2UucGlkLFxuICAgICAgICAgICAgLi4uKHJlc3BvbnNlLnNlcnZpY2VQaWQgPyB7IHNlcnZpY2VQaWQ6IHJlc3BvbnNlLnNlcnZpY2VQaWQgfSA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxhdW5jaChleGVjdXRhYmxlOiBzdHJpbmcsIGNvbmZpZ0ZpbGU6IHN0cmluZyk6IFNlcnZpY2VMYXVuY2gge1xuICAgIHJldHVybiB7XG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgYXJndW1lbnRzOiBbXCItLXNlcnZpY2UtY29uZmlnXCIsIGNvbmZpZ0ZpbGVdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc3RhbGxEZWZpbml0aW9uKFxuICAgIG93bmVyOiBTZXJ2aWNlUGFja2FnZSxcbiAgICBkaXJlY3Rvcnk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxDbGlTZXJ2aWNlRGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYS5wYXJzZSh7XG4gICAgICAuLi50aGlzLmRlZmluaXRpb24sXG4gICAgICB2ZXJzaW9uOiB0aGlzLmRlZmluaXRpb24udmVyc2lvbiA/PyBvd25lci52ZXJzaW9uLFxuICAgIH0pO1xuICAgIGlmICghZGVmaW5pdGlvbi52ZXJzaW9uKSB0aHJvdyBuZXcgRXJyb3IoYCR7ZGVmaW5pdGlvbi5uYW1lfSBoYXMgbm8gaW5zdGFsbGFibGUgdmVyc2lvbmApO1xuICAgIGNvbnN0IHB5dGhvblBhY2thZ2UgPSBkZWZpbml0aW9uLnB5dGhvblBhY2thZ2VcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmRlZmluaXRpb24ucHl0aG9uUGFja2FnZSxcbiAgICAgICAgICB2ZXJzaW9uOiBkZWZpbml0aW9uLnB5dGhvblBhY2thZ2UudmVyc2lvbiA/PyBkZWZpbml0aW9uLnZlcnNpb24sXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHB5dGhvbkVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKHB5dGhvblBhY2thZ2UpIHtcbiAgICAgIHB5dGhvbkVudmlyb25tZW50LlBZVEhPTiA9IGF3YWl0IHRoaXMucHl0aG9uSW5zdGFsbGVyKFxuICAgICAgICB0aGlzLnV2RXhlY3V0YWJsZSxcbiAgICAgICAgam9pbihkaXJlY3RvcnksIFwicHl0aG9uXCIpLFxuICAgICAgICBbYCR7cHl0aG9uUGFja2FnZS5uYW1lfT09JHtweXRob25QYWNrYWdlLnZlcnNpb259YCwgLi4ucHl0aG9uUGFja2FnZS5kZXBlbmRlbmNpZXNdLFxuICAgICAgICBweXRob25QYWNrYWdlLnB5dGhvbixcbiAgICAgICAgdGhpcy5ydW50aW1lLnBsYXRmb3JtLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY29tbWFuZCA9IGRlZmluaXRpb24uY29tbWFuZFxuICAgICAgPyBhd2FpdCB0aGlzLmluc3RhbGxDb21tYW5kKFxuICAgICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgZGVmaW5pdGlvbi5jb21tYW5kLFxuICAgICAgICAgIFwiY29tbWFuZFwiLFxuICAgICAgICAgIHB5dGhvbkVudmlyb25tZW50LFxuICAgICAgICApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZW51OiBDbGlTZXJ2aWNlTWVudUl0ZW1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiAoZGVmaW5pdGlvbi5tZW51ID8/IFtdKS5lbnRyaWVzKCkpIHtcbiAgICAgIG1lbnUucHVzaChcbiAgICAgICAgaXRlbS50eXBlID09PSBcImNvbW1hbmRcIlxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICBjb21tYW5kOiBhd2FpdCB0aGlzLmluc3RhbGxDb21tYW5kKFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICAgICAgaXRlbS5jb21tYW5kLFxuICAgICAgICAgICAgICAgIGBtZW51LSR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgICAgICAgcHl0aG9uRW52aXJvbm1lbnQsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBpdGVtLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIENsaVNlcnZpY2VEZWZpbml0aW9uU2NoZW1hLnBhcnNlKHtcbiAgICAgIC4uLmRlZmluaXRpb24sXG4gICAgICAuLi4ocHl0aG9uUGFja2FnZSA/IHsgcHl0aG9uUGFja2FnZSB9IDoge30pLFxuICAgICAgLi4uKGNvbW1hbmQgPyB7IGNvbW1hbmQgfSA6IHt9KSxcbiAgICAgIC4uLihtZW51Lmxlbmd0aCA+IDAgPyB7IG1lbnUgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5zdGFsbENvbW1hbmQoXG4gICAgZGVmaW5pdGlvbjogQ2xpU2VydmljZURlZmluaXRpb24sXG4gICAgb3duZXI6IFNlcnZpY2VQYWNrYWdlLFxuICAgIGNvbW1hbmQ6IENsaVNlcnZpY2VDb21tYW5kLFxuICAgIHB1cnBvc2U6IHN0cmluZyxcbiAgICBydW50aW1lRW52aXJvbm1lbnQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICApOiBQcm9taXNlPENsaVNlcnZpY2VDb21tYW5kPiB7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB7IC4uLmNvbW1hbmQuZW52aXJvbm1lbnQsIC4uLnJ1bnRpbWVFbnZpcm9ubWVudCB9O1xuICAgIGlmIChjb21tYW5kLmV4ZWN1dGFibGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbW1hbmQsXG4gICAgICAgIC4uLihPYmplY3Qua2V5cyhlbnZpcm9ubWVudCkubGVuZ3RoID4gMCA/IHsgZW52aXJvbm1lbnQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBjb21tYW5kLmVudHJ5cG9pbnQgPz8gb3duZXIuYmluKGNvbW1hbmQuYmluTmFtZSk7XG4gICAgY29uc3QgaW5zdGFsbGVkID0gYXdhaXQgdGhpcy5lbnN1cmVDb21waWxlZEJpbmFyeShcbiAgICAgIHRoaXMuYmluYXJ5TmFtZShkZWZpbml0aW9uLCBwdXJwb3NlKSxcbiAgICAgIHJlc29sdmUoZW50cnlwb2ludCksXG4gICAgICBvd25lci5kaXJlY3RvcnksXG4gICAgICBleHRlcm5hbFJ1bnRpbWVQYWNrYWdlcyhvd25lci5kZXBlbmRlbmNpZXMoKSksXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhlY3V0YWJsZTogaW5zdGFsbGVkLnBhdGgsXG4gICAgICAuLi4oY29tbWFuZC5hcmd1bWVudHMgPyB7IGFyZ3VtZW50czogY29tbWFuZC5hcmd1bWVudHMgfSA6IHt9KSxcbiAgICAgIC4uLihPYmplY3Qua2V5cyhlbnZpcm9ubWVudCkubGVuZ3RoID4gMCA/IHsgZW52aXJvbm1lbnQgfSA6IHt9KSxcbiAgICAgIGN3ZDogY29tbWFuZC5jd2QgPz8gdGhpcy5nbG9iYWxIb21lRGlyZWN0b3J5LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbXBpbGVkQmluYXJ5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gICAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICAgIGV4dGVybmFsOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICApOiBQcm9taXNlPGJpbi5CaW5Db250ZXh0PiB7XG4gICAgcmV0dXJuIGJpbi5lbnN1cmUoXG4gICAgICBuYW1lLFxuICAgICAgYXN5bmMgKHsgdGVtcERpciB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGpvaW4odGVtcERpciwgZXhlY3V0YWJsZU5hbWUobmFtZSwgdGhpcy5ydW50aW1lLnBsYXRmb3JtKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXIoZW50cnlwb2ludCwgb3V0cHV0LCB3b3JraW5nRGlyZWN0b3J5LCBleHRlcm5hbCk7XG4gICAgICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKG91dHB1dCkuaHJlZjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlc3RpbmF0aW9uOiB0aGlzLmJpbmFyeUNvbnRleHQobmFtZSksXG4gICAgICAgIHNraXBWZXJzaW9uQ2hlY2s6IHRydWUsXG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVUcmF5QmluYXJ5KCk6IFByb21pc2U8YmluLkJpbkNvbnRleHQ+IHtcbiAgICBjb25zdCBuYW1lID0gdHJheUV4ZWN1dGFibGVOYW1lKHRoaXMucnVudGltZS5wbGF0Zm9ybSk7XG4gICAgY29uc3QgYmluRGlyID0gam9pbih0aGlzLmdsb2JhbEhvbWVEaXJlY3RvcnksIFwiYmluXCIsIFwidHJheWJpblwiKTtcbiAgICByZXR1cm4gYmluLmVuc3VyZShuYW1lLCBwYXRoVG9GaWxlVVJMKHRoaXMudHJheUV4ZWN1dGFibGUpLmhyZWYsIHtcbiAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgIHJvb3Q6IHRoaXMuZ2xvYmFsSG9tZURpcmVjdG9yeSxcbiAgICAgICAgYmluRGlyLFxuICAgICAgICBwYXRoOiBqb2luKGJpbkRpciwgbmFtZSksXG4gICAgICB9LFxuICAgICAgc2tpcFZlcnNpb25DaGVjazogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluYXJ5Q29udGV4dChuYW1lOiBzdHJpbmcpOiBiaW4uQmluQ29udGV4dCB7XG4gICAgY29uc3QgYmluRGlyID0gam9pbih0aGlzLmdsb2JhbEhvbWVEaXJlY3RvcnksIFwiYmluXCIpO1xuICAgIHJldHVybiB7XG4gICAgICByb290OiB0aGlzLmdsb2JhbEhvbWVEaXJlY3RvcnksXG4gICAgICBiaW5EaXIsXG4gICAgICBwYXRoOiBqb2luKGJpbkRpciwgZXhlY3V0YWJsZU5hbWUobmFtZSwgdGhpcy5ydW50aW1lLnBsYXRmb3JtKSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYmluYXJ5TmFtZShkZWZpbml0aW9uOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbiwgcHVycG9zZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gc2FmZVRva2VuKGRlZmluaXRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKS5yZXBsYWNlKC9bLl9dKy9nLCBcIi1cIik7XG4gICAgcmV0dXJuIHB1cnBvc2UgPT09IFwic2VydmljZVwiID8gbmFtZSA6IGAke25hbWV9LSR7cHVycG9zZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVIb3N0RW50cnlwb2ludCgpOiBzdHJpbmcge1xuICBjb25zdCBjdXJyZW50ID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBzb3VyY2UgPVxuICAgIGV4dG5hbWUoY3VycmVudCkgPT09IFwiLnRzXCJcbiAgICAgID8gam9pbihkaXJuYW1lKGN1cnJlbnQpLCBcIl9ob3N0LnRzXCIpXG4gICAgICA6IHJlc29sdmUoZGlybmFtZShjdXJyZW50KSwgXCIuLlwiLCBcIi4uXCIsIFwic3JjXCIsIFwiX2hvc3QudHNcIik7XG4gIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gIHRocm93IG5ldyBFcnJvcihgY291bGQgbm90IHJlc29sdmUgY2xpLXNlcnZpY2UgaG9zdCBzb3VyY2U6ICR7c291cmNlfWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQnVuRXhlY3V0YWJsZSgpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXCJidW4vYmluL2J1bi5leGVcIik7XG59XG5cbmZ1bmN0aW9uIHRyYXlFeGVjdXRhYmxlTmFtZShwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtKTogc3RyaW5nIHtcbiAgaWYgKHBsYXRmb3JtID09PSBcImRhcndpblwiKSByZXR1cm4gXCJ0cmF5X2Rhcndpbl9yZWxlYXNlXCI7XG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJsaW51eFwiKSByZXR1cm4gXCJ0cmF5X2xpbnV4X3JlbGVhc2VcIjtcbiAgaWYgKHBsYXRmb3JtID09PSBcIndpbjMyXCIpIHJldHVybiBcInRyYXlfd2luZG93c19yZWxlYXNlLmV4ZVwiO1xuICB0aHJvdyBuZXcgRXJyb3IoYHN5c3RyYXkyIGRvZXMgbm90IHN1cHBvcnQgJHtwbGF0Zm9ybX1gKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRyYXlFeGVjdXRhYmxlKHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0pOiBzdHJpbmcge1xuICBjb25zdCBtYW5pZmVzdCA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKS5yZXNvbHZlKFwic3lzdHJheTIvcGFja2FnZS5qc29uXCIpO1xuICByZXR1cm4gam9pbihkaXJuYW1lKG1hbmlmZXN0KSwgXCJ0cmF5YmluXCIsIHRyYXlFeGVjdXRhYmxlTmFtZShwbGF0Zm9ybSkpO1xufVxuXG5mdW5jdGlvbiBleGVjdXRhYmxlTmFtZShuYW1lOiBzdHJpbmcsIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0pOiBzdHJpbmcge1xuICByZXR1cm4gcGxhdGZvcm0gPT09IFwid2luMzJcIiA/IGAke25hbWV9LmV4ZWAgOiBuYW1lO1xufVxuXG5mdW5jdGlvbiBzYWZlVG9rZW4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRva2VuID0gdmFsdWUucmVwbGFjZSgvW15hLXowLTkuXy1dKy9naSwgXCItXCIpLnJlcGxhY2UoL14tK3wtKyQvZywgXCJcIik7XG4gIGlmICghdG9rZW4pIHRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgYmluYXJ5IHZlcnNpb246ICR7dmFsdWV9YCk7XG4gIHJldHVybiB0b2tlbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGlsZVdpdGhCdW4oXG4gIGJ1bkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZW50cnlwb2ludDogc3RyaW5nLFxuICBvdXRwdXQ6IHN0cmluZyxcbiAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICBleHRlcm5hbDogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBiZWZvcmUgPSBhd2FpdCBidW5CdWlsZEFydGlmYWN0cyh3b3JraW5nRGlyZWN0b3J5KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjLnNwYXduKFxuICAgICAgYnVuRXhlY3V0YWJsZSxcbiAgICAgIFtcbiAgICAgICAgXCJidWlsZFwiLFxuICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICBcIi0tY29tcGlsZVwiLFxuICAgICAgICBcIi0tY29tcGlsZS1hdXRvbG9hZC1wYWNrYWdlLWpzb25cIixcbiAgICAgICAgXCItLW91dGZpbGVcIixcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICAuLi5leHRlcm5hbC5mbGF0TWFwKChkZXBlbmRlbmN5KSA9PiBbXCItLWV4dGVybmFsXCIsIGRlcGVuZGVuY3ldKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGNoZWNrOiB0cnVlLFxuICAgICAgICBjd2Q6IHdvcmtpbmdEaXJlY3RvcnksXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgIEJVTl9UTVBESVI6IGRpcm5hbWUob3V0cHV0KSxcbiAgICAgICAgICBUTVBESVI6IGRpcm5hbWUob3V0cHV0KSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgICB9LFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBhd2FpdCBidW5CdWlsZEFydGlmYWN0cyh3b3JraW5nRGlyZWN0b3J5KSkge1xuICAgICAgaWYgKCFiZWZvcmUuaGFzKGFydGlmYWN0KSkge1xuICAgICAgICBhd2FpdCBybShqb2luKHdvcmtpbmdEaXJlY3RvcnksIGFydGlmYWN0KSwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1bkJ1aWxkQXJ0aWZhY3RzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICByZXR1cm4gbmV3IFNldChcbiAgICAoYXdhaXQgcmVhZGRpcihkaXJlY3RvcnkpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJiBuYW1lLmVuZHNXaXRoKFwiLmJ1bi1idWlsZFwiKSlcbiAgICAgIC5zb3J0KCksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JTdGF0ZShcbiAgcmVhZDogKCkgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgZXhwZWN0ZWQ6IGJvb2xlYW4sXG4gIHRpbWVvdXRNaWxsaXNlY29uZHM6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNaWxsaXNlY29uZHM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAoKGF3YWl0IHJlYWQoKSkgPT09IGV4cGVjdGVkKSByZXR1cm47XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgUE9MTF9JTlRFUlZBTF9NSUxMSVNFQ09ORFMpKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG4iXX0=
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,8 +23,8 @@
23
23
  "typescript": "^5.9.3"
24
24
  },
25
25
  "dependencies": {
26
- "@dbx-tools/cli-args": "^0.9.43",
27
- "@dbx-tools/core": "^0.9.43",
26
+ "@dbx-tools/cli-args": "^0.9.47",
27
+ "@dbx-tools/core": "^0.9.47",
28
28
  "bun": "1.3.14",
29
29
  "commander": "^15.0.0",
30
30
  "systray2": "^2.1.4",
@@ -60,7 +60,7 @@
60
60
  "./package.json": "./package.json"
61
61
  }
62
62
  },
63
- "version": "0.9.43",
63
+ "version": "0.9.47",
64
64
  "types": "./lib/index.d.ts",
65
65
  "dbxToolsConfig": {
66
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 the primary and companion Python packages. */
45
+ export async function installServicePythonPackage(
46
+ uvExecutable: string,
47
+ directory: string,
48
+ packageSpecifiers: readonly 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", ...packageSpecifiers],
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
@@ -55,7 +55,6 @@ export function buildServiceCommand(
55
55
  const install = addArgs(
56
56
  command.command("install").description("Install the service for the current user and start it"),
57
57
  CliServiceInstallOptionsSchema,
58
- { scope: [] },
59
58
  );
60
59
  install.action(async () => {
61
60
  const options = parseArgs(install, CliServiceInstallOptionsSchema);
package/src/definition.ts CHANGED
@@ -82,6 +82,34 @@ export const CliServiceMenuItemSchema = z.discriminatedUnion("type", [
82
82
  /** A typed custom item inserted between the default service title and Quit item. */
83
83
  export type CliServiceMenuItem = z.infer<typeof CliServiceMenuItemSchema>;
84
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
+ dependencies: z
100
+ .array(z.string().min(1))
101
+ .default([])
102
+ .describe("Additional uv package specs installed beside the primary distribution."),
103
+ })
104
+ .readonly()
105
+ .describe("Python runtime package installed with uv for a managed service.");
106
+
107
+ /** Python package installed into a service-owned uv environment. */
108
+ export type CliServicePythonPackage = z.infer<typeof CliServicePythonPackageSchema>;
109
+
110
+ /** Python package input accepted before the default Python version is applied. */
111
+ export type CliServicePythonPackageInput = z.input<typeof CliServicePythonPackageSchema>;
112
+
85
113
  /** Complete serializable definition consumed by the lifecycle manager and tray host. */
86
114
  export const CliServiceDefinitionSchema = z
87
115
  .object({
@@ -96,6 +124,9 @@ export const CliServiceDefinitionSchema = z
96
124
  icon: z.string().min(1),
97
125
  isTemplateIcon: z.boolean().optional(),
98
126
  dataDirectory: z.string().min(1).optional(),
127
+ pythonPackage: CliServicePythonPackageSchema.optional().describe(
128
+ "Python runtime package installed into a service-owned uv environment.",
129
+ ),
99
130
  command: CliServiceCommandSchema.optional(),
100
131
  menu: z.array(CliServiceMenuItemSchema).readonly().optional(),
101
132
  })
@@ -107,9 +138,18 @@ export type CliServiceDefinition = z.infer<typeof CliServiceDefinitionSchema>;
107
138
  /** Package-derived service fields plus caller-owned icon, process, and menu options. */
108
139
  export type CliServiceDefinitionOptions = Omit<
109
140
  CliServiceDefinition,
110
- "packageName" | "id" | "name" | "version" | "icon" | "isTemplateIcon" | "command"
141
+ | "packageName"
142
+ | "id"
143
+ | "name"
144
+ | "version"
145
+ | "icon"
146
+ | "isTemplateIcon"
147
+ | "pythonPackage"
148
+ | "command"
111
149
  > &
112
150
  Partial<Pick<CliServiceDefinition, "id" | "name" | "version" | "icon" | "isTemplateIcon">> & {
151
+ /** Python package installed into a service-owned uv environment. */
152
+ readonly pythonPackage?: CliServicePythonPackageInput;
113
153
  /** Service process command with optional schema or object-backed options. */
114
154
  readonly command?: CliServiceCommandInput;
115
155
  };
package/src/service.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 directories, or control sockets.
6
+ * installers, uv Python environments, startup registration, runtime
7
+ * directories, or control sockets.
7
8
  *
8
9
  * @module
9
10
  */
@@ -26,7 +27,11 @@ import {
26
27
  resolveServicePaths,
27
28
  type ServiceRuntimeContext,
28
29
  } from "./_paths.ts";
29
- import { externalRuntimePackages, installServiceRuntime } from "./_runtime.ts";
30
+ import {
31
+ externalRuntimePackages,
32
+ installServicePythonPackage,
33
+ installServiceRuntime,
34
+ } from "./_runtime.ts";
30
35
  import { installStartup, removeStartup, type ServiceLaunch } from "./_startup.ts";
31
36
  import {
32
37
  CliServiceDefinitionSchema,
@@ -54,6 +59,15 @@ export type CliServiceRuntimeInstaller = (
54
59
  dependencies: Readonly<Record<string, string>>,
55
60
  ) => Promise<void>;
56
61
 
62
+ /** Install a Python package into a service-owned uv environment. */
63
+ export type CliServicePythonInstaller = (
64
+ uvExecutable: string,
65
+ directory: string,
66
+ packageSpecifiers: readonly string[],
67
+ python: string,
68
+ platform: NodeJS.Platform,
69
+ ) => Promise<string>;
70
+
57
71
  /** Host runtime overrides for tests, embedded distributions, and nonstandard homes. */
58
72
  export interface CliServiceRuntimeOptions {
59
73
  /** Operating system used for configuration and startup registration. */
@@ -68,10 +82,14 @@ export interface CliServiceRuntimeOptions {
68
82
  readonly globalHomeDirectory?: string;
69
83
  /** Package-provided Bun executable override. */
70
84
  readonly bunExecutable?: string;
85
+ /** uv executable used for managed Python package environments. */
86
+ readonly uvExecutable?: string;
71
87
  /** Standalone compiler override. */
72
88
  readonly compile?: CliServiceCompiler;
73
89
  /** External runtime dependency installer override. */
74
90
  readonly installRuntime?: CliServiceRuntimeInstaller;
91
+ /** Python package installer override. */
92
+ readonly installPython?: CliServicePythonInstaller;
75
93
  /** System-tray host source entrypoint override. */
76
94
  readonly hostEntrypoint?: string;
77
95
  /** systray2 native executable override. */
@@ -119,8 +137,10 @@ export class CliService implements CliServiceLifecycle {
119
137
  private readonly runtime: ServiceRuntimeContext;
120
138
  private readonly globalHomeDirectory: string;
121
139
  private readonly bunExecutable: string;
140
+ private readonly uvExecutable: string;
122
141
  private readonly compiler: CliServiceCompiler;
123
142
  private readonly runtimeInstaller: CliServiceRuntimeInstaller;
143
+ private readonly pythonInstaller: CliServicePythonInstaller;
124
144
  private readonly hostEntrypoint: string;
125
145
  private readonly trayExecutable: string;
126
146
 
@@ -142,11 +162,13 @@ export class CliService implements CliServiceLifecycle {
142
162
  this.globalHomeDirectory =
143
163
  options.globalHomeDirectory ?? join(this.runtime.homeDirectory, ".dbx-tools");
144
164
  this.bunExecutable = options.bunExecutable ?? resolveBunExecutable();
165
+ this.uvExecutable = options.uvExecutable ?? "uv";
145
166
  this.compiler =
146
167
  options.compile ??
147
168
  ((entrypoint, output, workingDirectory, external) =>
148
169
  compileWithBun(this.bunExecutable, entrypoint, output, workingDirectory, external));
149
170
  this.runtimeInstaller = options.installRuntime ?? installServiceRuntime;
171
+ this.pythonInstaller = options.installPython ?? installServicePythonPackage;
150
172
  this.hostEntrypoint = options.hostEntrypoint ?? resolveHostEntrypoint();
151
173
  this.trayExecutable = options.trayExecutable ?? resolveTrayExecutable(this.runtime.platform);
152
174
  }
@@ -162,7 +184,7 @@ export class CliService implements CliServiceLifecycle {
162
184
  Object.fromEntries(Object.entries(dependencies).filter(([name]) => external.has(name))),
163
185
  );
164
186
  const paths = resolveServicePaths(this.definition, this.runtime);
165
- const installedDefinition = await this.installDefinition(owner);
187
+ const installedDefinition = await this.installDefinition(owner, paths.directory);
166
188
  const host = await this.ensureCompiledBinary(
167
189
  this.binaryName(installedDefinition, "service"),
168
190
  this.hostEntrypoint,
@@ -270,13 +292,39 @@ export class CliService implements CliServiceLifecycle {
270
292
  };
271
293
  }
272
294
 
273
- private async installDefinition(owner: ServicePackage): Promise<CliServiceDefinition> {
295
+ private async installDefinition(
296
+ owner: ServicePackage,
297
+ directory: string,
298
+ ): Promise<CliServiceDefinition> {
274
299
  const definition = CliServiceDefinitionSchema.parse({
275
300
  ...this.definition,
276
301
  version: this.definition.version ?? owner.version,
277
302
  });
303
+ if (!definition.version) throw new Error(`${definition.name} has no installable version`);
304
+ const pythonPackage = definition.pythonPackage
305
+ ? {
306
+ ...definition.pythonPackage,
307
+ version: definition.pythonPackage.version ?? definition.version,
308
+ }
309
+ : undefined;
310
+ const pythonEnvironment: Record<string, string> = {};
311
+ if (pythonPackage) {
312
+ pythonEnvironment.PYTHON = await this.pythonInstaller(
313
+ this.uvExecutable,
314
+ join(directory, "python"),
315
+ [`${pythonPackage.name}==${pythonPackage.version}`, ...pythonPackage.dependencies],
316
+ pythonPackage.python,
317
+ this.runtime.platform,
318
+ );
319
+ }
278
320
  const command = definition.command
279
- ? await this.installCommand(definition, owner, definition.command, "command")
321
+ ? await this.installCommand(
322
+ definition,
323
+ owner,
324
+ definition.command,
325
+ "command",
326
+ pythonEnvironment,
327
+ )
280
328
  : undefined;
281
329
  const menu: CliServiceMenuItem[] = [];
282
330
  for (const [index, item] of (definition.menu ?? []).entries()) {
@@ -289,6 +337,7 @@ export class CliService implements CliServiceLifecycle {
289
337
  owner,
290
338
  item.command,
291
339
  `menu-${index + 1}`,
340
+ pythonEnvironment,
292
341
  ),
293
342
  }
294
343
  : item,
@@ -296,6 +345,7 @@ export class CliService implements CliServiceLifecycle {
296
345
  }
297
346
  return CliServiceDefinitionSchema.parse({
298
347
  ...definition,
348
+ ...(pythonPackage ? { pythonPackage } : {}),
299
349
  ...(command ? { command } : {}),
300
350
  ...(menu.length > 0 ? { menu } : {}),
301
351
  });
@@ -306,8 +356,15 @@ export class CliService implements CliServiceLifecycle {
306
356
  owner: ServicePackage,
307
357
  command: CliServiceCommand,
308
358
  purpose: string,
359
+ runtimeEnvironment: Readonly<Record<string, string>>,
309
360
  ): Promise<CliServiceCommand> {
310
- if (command.executable) return command;
361
+ const environment = { ...command.environment, ...runtimeEnvironment };
362
+ if (command.executable) {
363
+ return {
364
+ ...command,
365
+ ...(Object.keys(environment).length > 0 ? { environment } : {}),
366
+ };
367
+ }
311
368
  const entrypoint = command.entrypoint ?? owner.bin(command.binName);
312
369
  const installed = await this.ensureCompiledBinary(
313
370
  this.binaryName(definition, purpose),
@@ -318,7 +375,7 @@ export class CliService implements CliServiceLifecycle {
318
375
  return {
319
376
  executable: installed.path,
320
377
  ...(command.arguments ? { arguments: command.arguments } : {}),
321
- ...(command.environment ? { environment: command.environment } : {}),
378
+ ...(Object.keys(environment).length > 0 ? { environment } : {}),
322
379
  cwd: command.cwd ?? this.globalHomeDirectory,
323
380
  };
324
381
  }