@dbx-tools/cli-service 0.9.93 → 0.9.99
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 +33 -4
- package/index.ts +2 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +2 -2
- package/lib/src/_compile.js +11 -1
- package/lib/src/_runtime.d.ts +1 -1
- package/lib/src/_runtime.js +30 -4
- package/lib/src/cli.d.ts +5 -1
- package/lib/src/cli.js +41 -5
- package/lib/src/icon.d.ts +4 -2
- package/lib/src/icon.js +54 -9
- package/lib/src/service.d.ts +9 -1
- package/lib/src/service.js +23 -4
- package/package.json +3 -3
- package/src/_compile.ts +11 -0
- package/src/_runtime.ts +30 -2
- package/src/cli.ts +52 -10
- package/src/icon.ts +69 -14
- package/src/service.ts +32 -2
package/README.md
CHANGED
|
@@ -46,6 +46,12 @@ the Python version uv manages and defaults to `3.11`. uv must be available on
|
|
|
46
46
|
`PATH` during installation. Uninstalling the service removes the environment
|
|
47
47
|
with the rest of the service-owned data.
|
|
48
48
|
|
|
49
|
+
Pass `--python-project <path>` to `service install` to install the primary
|
|
50
|
+
Python package from a local project instead of the versioned registry package.
|
|
51
|
+
Package extras such as `[dev]` and companion dependencies remain active. Add
|
|
52
|
+
`--offline` to resolve entirely from uv's cache and fail immediately when an
|
|
53
|
+
artifact is unavailable instead of contacting a package index.
|
|
54
|
+
|
|
49
55
|
`command.options` accepts either a concrete option object or a Zod object
|
|
50
56
|
schema. Objects serialize their current values. Schemas parse `{}` and serialize
|
|
51
57
|
their defaults. Boolean values become positive or negated flags, arrays become
|
|
@@ -70,15 +76,21 @@ For the example program above:
|
|
|
70
76
|
|
|
71
77
|
```sh
|
|
72
78
|
example service install
|
|
79
|
+
example service install --python-project packages/py/example --offline
|
|
73
80
|
example service status
|
|
74
81
|
example service stop
|
|
75
82
|
example service start
|
|
76
83
|
example service restart
|
|
84
|
+
example service logs
|
|
85
|
+
example service logs -- tail -f
|
|
77
86
|
example service uninstall
|
|
78
87
|
```
|
|
79
88
|
|
|
80
89
|
Installation starts the service by default. Pass `--no-start` to install without
|
|
81
|
-
launching it. `status` reports installation and process state as JSON.
|
|
90
|
+
launching it. `status` reports installation and process state as JSON. `logs`
|
|
91
|
+
prints the managed process log path. Arguments after `--` run as a command with
|
|
92
|
+
that path appended, so `logs -- cat` prints the log and `logs -- tail -f` follows
|
|
93
|
+
it.
|
|
82
94
|
|
|
83
95
|
The service belongs to the current user. Login startup uses a LaunchAgent on
|
|
84
96
|
macOS, an XDG autostart entry on Linux, and a Startup command on Windows. Package
|
|
@@ -120,6 +132,7 @@ Install and manage the desktop service
|
|
|
120
132
|
| `stop` | Stop the running service |
|
|
121
133
|
| `restart` | Restart the installed service |
|
|
122
134
|
| `status` | Print service installation and process state as JSON |
|
|
135
|
+
| `logs [command...]` | Print the service log path or append it to a command |
|
|
123
136
|
| `uninstall` | Stop and remove the service for the current user |
|
|
124
137
|
|
|
125
138
|
### `<cli> service install`
|
|
@@ -132,9 +145,11 @@ Install the service for the current user and start it
|
|
|
132
145
|
|
|
133
146
|
#### Options
|
|
134
147
|
|
|
135
|
-
| Option
|
|
136
|
-
|
|
|
137
|
-
| `--no-start`
|
|
148
|
+
| Option | Description |
|
|
149
|
+
| ------------------------- | ---------------------------------------------------------------- |
|
|
150
|
+
| `--no-start` | Do not start the service after installation |
|
|
151
|
+
| `--python-project <path>` | Install a local Python project instead of the registry package |
|
|
152
|
+
| `--offline` | Install Python packages from the uv cache without network access |
|
|
138
153
|
|
|
139
154
|
### `<cli> service start`
|
|
140
155
|
|
|
@@ -168,6 +183,20 @@ Print service installation and process state as JSON
|
|
|
168
183
|
<cli> service status
|
|
169
184
|
```
|
|
170
185
|
|
|
186
|
+
### `<cli> service logs`
|
|
187
|
+
|
|
188
|
+
Print the service log path or append it to a command
|
|
189
|
+
|
|
190
|
+
```sh
|
|
191
|
+
<cli> service logs [command...]
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
#### Arguments
|
|
195
|
+
|
|
196
|
+
| Argument | Description |
|
|
197
|
+
| --------- | -------------------------------------------------------- |
|
|
198
|
+
| `command` | Command and arguments to run before the service log path |
|
|
199
|
+
|
|
171
200
|
### `<cli> service uninstall`
|
|
172
201
|
|
|
173
202
|
Stop and remove the service for the current user
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.99";
|
|
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";
|
|
@@ -12,5 +12,6 @@ export { CliServiceInstallOptionsSchema } from "./src/cli.ts";
|
|
|
12
12
|
export type { CliServiceDefinitionSource, CliServiceCliDependencies } from "./src/cli.ts";
|
|
13
13
|
export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.ts";
|
|
14
14
|
export type { CliServiceCommand, CliServiceCommandInput, CliServiceMenuItem, CliServicePythonPackage, CliServicePythonPackageInput, CliServiceDefinition, CliServiceDefinitionOptions } from "./src/definition.ts";
|
|
15
|
+
export type { ServiceTrayGlyph } from "./src/icon.ts";
|
|
15
16
|
export { CliService } from "./src/service.ts";
|
|
16
17
|
export type { CliServiceCompiler, CliServiceRuntimeInstaller, CliServicePythonInstaller, CliServiceRuntimeOptions, CliServiceStatus, CliServiceLifecycle } from "./src/service.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.99";
|
|
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";
|
|
@@ -8,5 +8,6 @@ export { CliServiceInstallOptionsSchema } from "./src/cli.ts";
|
|
|
8
8
|
export type { CliServiceDefinitionSource, CliServiceCliDependencies } from "./src/cli.ts";
|
|
9
9
|
export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.ts";
|
|
10
10
|
export type { CliServiceCommand, CliServiceCommandInput, CliServiceMenuItem, CliServicePythonPackage, CliServicePythonPackageInput, CliServiceDefinition, CliServiceDefinitionOptions } from "./src/definition.ts";
|
|
11
|
+
export type { ServiceTrayGlyph } from "./src/icon.ts";
|
|
11
12
|
export { CliService } from "./src/service.ts";
|
|
12
13
|
export type { CliServiceCompiler, CliServiceRuntimeInstaller, CliServicePythonInstaller, CliServiceRuntimeOptions, CliServiceStatus, CliServiceLifecycle } from "./src/service.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/cli-service";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.99";
|
|
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";
|
|
@@ -10,4 +10,4 @@ export * as service from "./src/service.js";
|
|
|
10
10
|
export { CliServiceInstallOptionsSchema } from "./src/cli.js";
|
|
11
11
|
export { CliServiceCommandSchema, CliServiceMenuItemSchema, CliServicePythonPackageSchema, CliServiceDefinitionSchema } from "./src/definition.js";
|
|
12
12
|
export { CliService } from "./src/service.js";
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHbkosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jbGktc2VydmljZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45Ljk5XCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgZGVmaW5pdGlvbiBmcm9tIFwiLi9zcmMvZGVmaW5pdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgaWNvbiBmcm9tIFwiLi9zcmMvaWNvbi50c1wiO1xuZXhwb3J0ICogYXMgc2VydmljZSBmcm9tIFwiLi9zcmMvc2VydmljZS50c1wiO1xuZXhwb3J0IHsgQ2xpU2VydmljZUluc3RhbGxPcHRpb25zU2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSwgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyB9IGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCB7IENsaVNlcnZpY2VDb21tYW5kU2NoZW1hLCBDbGlTZXJ2aWNlTWVudUl0ZW1TY2hlbWEsIENsaVNlcnZpY2VQeXRob25QYWNrYWdlU2NoZW1hLCBDbGlTZXJ2aWNlRGVmaW5pdGlvblNjaGVtYSB9IGZyb20gXCIuL3NyYy9kZWZpbml0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IENsaVNlcnZpY2VDb21tYW5kLCBDbGlTZXJ2aWNlQ29tbWFuZElucHV0LCBDbGlTZXJ2aWNlTWVudUl0ZW0sIENsaVNlcnZpY2VQeXRob25QYWNrYWdlLCBDbGlTZXJ2aWNlUHl0aG9uUGFja2FnZUlucHV0LCBDbGlTZXJ2aWNlRGVmaW5pdGlvbiwgQ2xpU2VydmljZURlZmluaXRpb25PcHRpb25zIH0gZnJvbSBcIi4vc3JjL2RlZmluaXRpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmljZVRyYXlHbHlwaCB9IGZyb20gXCIuL3NyYy9pY29uLnRzXCI7XG5leHBvcnQgeyBDbGlTZXJ2aWNlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2xpU2VydmljZUNvbXBpbGVyLCBDbGlTZXJ2aWNlUnVudGltZUluc3RhbGxlciwgQ2xpU2VydmljZVB5dGhvbkluc3RhbGxlciwgQ2xpU2VydmljZVJ1bnRpbWVPcHRpb25zLCBDbGlTZXJ2aWNlU3RhdHVzLCBDbGlTZXJ2aWNlTGlmZWN5Y2xlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2UudHNcIjtcbiJdfQ==
|
package/lib/src/_compile.js
CHANGED
|
@@ -2,12 +2,18 @@ import { mkdtemp, readdir, rm } from "node:fs/promises";
|
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join, resolve } from "node:path";
|
|
4
4
|
import * as exec from "@dbx-tools/core/exec";
|
|
5
|
+
import { log } from "@dbx-tools/shared-core";
|
|
6
|
+
const logger = log.logger("cli:service");
|
|
5
7
|
/** Compile an entrypoint while containing Bun's intermediate executables. */
|
|
6
8
|
export async function compileWithBun(bunExecutable, entrypoint, output, workingDirectory, external = [], temporaryDirectory = tmpdir()) {
|
|
7
9
|
const absoluteEntrypoint = resolve(workingDirectory, entrypoint);
|
|
8
10
|
const absoluteOutput = resolve(workingDirectory, output);
|
|
9
11
|
const before = await bunBuildArtifacts(workingDirectory);
|
|
10
12
|
const compileDirectory = await mkdtemp(join(temporaryDirectory, "dbx-tools-bun-compile-"));
|
|
13
|
+
logger.info("compiling service executable with Bun", {
|
|
14
|
+
entrypoint: absoluteEntrypoint,
|
|
15
|
+
output: absoluteOutput,
|
|
16
|
+
});
|
|
11
17
|
try {
|
|
12
18
|
await exec.spawn(bunExecutable, [
|
|
13
19
|
"build",
|
|
@@ -24,6 +30,10 @@ export async function compileWithBun(bunExecutable, entrypoint, output, workingD
|
|
|
24
30
|
stdout: "capture",
|
|
25
31
|
stderr: "capture",
|
|
26
32
|
});
|
|
33
|
+
logger.info("service executable compiled", {
|
|
34
|
+
entrypoint: absoluteEntrypoint,
|
|
35
|
+
output: absoluteOutput,
|
|
36
|
+
});
|
|
27
37
|
}
|
|
28
38
|
finally {
|
|
29
39
|
try {
|
|
@@ -46,4 +56,4 @@ async function bunBuildArtifacts(directory) {
|
|
|
46
56
|
.filter((name) => name.startsWith(".") && name.endsWith(".bun-build"))
|
|
47
57
|
.sort());
|
|
48
58
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NvbXBpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2NvbXBpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUUxQyxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXpDLDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsYUFBcUIsRUFDckIsVUFBa0IsRUFDbEIsTUFBYyxFQUNkLGdCQUF3QixFQUN4QixXQUE4QixFQUFFLEVBQ2hDLHFCQUE2QixNQUFNLEVBQUU7SUFFckMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7SUFDM0YsTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsRUFBRTtRQUNuRCxVQUFVLEVBQUUsa0JBQWtCO1FBQzlCLE1BQU0sRUFBRSxjQUFjO0tBQ3ZCLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDZCxhQUFhLEVBQ2I7WUFDRSxPQUFPO1lBQ1Asa0JBQWtCO1lBQ2xCLFdBQVc7WUFDWCxpQ0FBaUM7WUFDakMsV0FBVztZQUNYLGNBQWM7WUFDZCxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ2hFLEVBQ0Q7WUFDRSxLQUFLLEVBQUUsSUFBSTtZQUNYLEdBQUcsRUFBRSxnQkFBZ0I7WUFDckIsS0FBSyxFQUFFLFFBQVE7WUFDZixNQUFNLEVBQUUsU0FBUztZQUNqQixNQUFNLEVBQUUsU0FBUztTQUNsQixDQUNGLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQ3pDLFVBQVUsRUFBRSxrQkFBa0I7WUFDOUIsTUFBTSxFQUFFLGNBQWM7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztZQUFTLENBQUM7UUFDVCxJQUFJLENBQUM7WUFDSCxLQUFLLE1BQU0sUUFBUSxJQUFJLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUMxQixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLEVBQUU7d0JBQ3pDLFNBQVMsRUFBRSxJQUFJO3dCQUNmLEtBQUssRUFBRSxJQUFJO3FCQUNaLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sRUFBRSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsaUJBQWlCLENBQUMsU0FBaUI7SUFDaEQsT0FBTyxJQUFJLEdBQUcsQ0FDWixDQUFDLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3ZCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JFLElBQUksRUFBRSxDQUNWLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkdGVtcCwgcmVhZGRpciwgcm0gfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY2xpOnNlcnZpY2VcIik7XG5cbi8qKiBDb21waWxlIGFuIGVudHJ5cG9pbnQgd2hpbGUgY29udGFpbmluZyBCdW4ncyBpbnRlcm1lZGlhdGUgZXhlY3V0YWJsZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcGlsZVdpdGhCdW4oXG4gIGJ1bkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZW50cnlwb2ludDogc3RyaW5nLFxuICBvdXRwdXQ6IHN0cmluZyxcbiAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICBleHRlcm5hbDogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgdGVtcG9yYXJ5RGlyZWN0b3J5OiBzdHJpbmcgPSB0bXBkaXIoKSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhYnNvbHV0ZUVudHJ5cG9pbnQgPSByZXNvbHZlKHdvcmtpbmdEaXJlY3RvcnksIGVudHJ5cG9pbnQpO1xuICBjb25zdCBhYnNvbHV0ZU91dHB1dCA9IHJlc29sdmUod29ya2luZ0RpcmVjdG9yeSwgb3V0cHV0KTtcbiAgY29uc3QgYmVmb3JlID0gYXdhaXQgYnVuQnVpbGRBcnRpZmFjdHMod29ya2luZ0RpcmVjdG9yeSk7XG4gIGNvbnN0IGNvbXBpbGVEaXJlY3RvcnkgPSBhd2FpdCBta2R0ZW1wKGpvaW4odGVtcG9yYXJ5RGlyZWN0b3J5LCBcImRieC10b29scy1idW4tY29tcGlsZS1cIikpO1xuICBsb2dnZXIuaW5mbyhcImNvbXBpbGluZyBzZXJ2aWNlIGV4ZWN1dGFibGUgd2l0aCBCdW5cIiwge1xuICAgIGVudHJ5cG9pbnQ6IGFic29sdXRlRW50cnlwb2ludCxcbiAgICBvdXRwdXQ6IGFic29sdXRlT3V0cHV0LFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjLnNwYXduKFxuICAgICAgYnVuRXhlY3V0YWJsZSxcbiAgICAgIFtcbiAgICAgICAgXCJidWlsZFwiLFxuICAgICAgICBhYnNvbHV0ZUVudHJ5cG9pbnQsXG4gICAgICAgIFwiLS1jb21waWxlXCIsXG4gICAgICAgIFwiLS1jb21waWxlLWF1dG9sb2FkLXBhY2thZ2UtanNvblwiLFxuICAgICAgICBcIi0tb3V0ZmlsZVwiLFxuICAgICAgICBhYnNvbHV0ZU91dHB1dCxcbiAgICAgICAgLi4uZXh0ZXJuYWwuZmxhdE1hcCgoZGVwZW5kZW5jeSkgPT4gW1wiLS1leHRlcm5hbFwiLCBkZXBlbmRlbmN5XSksXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBjaGVjazogdHJ1ZSxcbiAgICAgICAgY3dkOiBjb21waWxlRGlyZWN0b3J5LFxuICAgICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcInNlcnZpY2UgZXhlY3V0YWJsZSBjb21waWxlZFwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBhYnNvbHV0ZUVudHJ5cG9pbnQsXG4gICAgICBvdXRwdXQ6IGFic29sdXRlT3V0cHV0LFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGF3YWl0IGJ1bkJ1aWxkQXJ0aWZhY3RzKHdvcmtpbmdEaXJlY3RvcnkpKSB7XG4gICAgICAgIGlmICghYmVmb3JlLmhhcyhhcnRpZmFjdCkpIHtcbiAgICAgICAgICBhd2FpdCBybShqb2luKHdvcmtpbmdEaXJlY3RvcnksIGFydGlmYWN0KSwge1xuICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcm0oY29tcGlsZURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBidW5CdWlsZEFydGlmYWN0cyhkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgcmV0dXJuIG5ldyBTZXQoXG4gICAgKGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5KSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgbmFtZS5lbmRzV2l0aChcIi5idW4tYnVpbGRcIikpXG4gICAgICAuc29ydCgpLFxuICApO1xufVxuIl19
|
package/lib/src/_runtime.d.ts
CHANGED
|
@@ -1,4 +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
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>;
|
|
4
|
+
export declare function installServicePythonPackage(uvExecutable: string, directory: string, packageSpecifiers: readonly string[], python: string, platform: NodeJS.Platform, offline: boolean): Promise<string>;
|
package/lib/src/_runtime.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
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
|
-
import { object } from "@dbx-tools/shared-core";
|
|
4
|
+
import { log, object } from "@dbx-tools/shared-core";
|
|
5
|
+
const logger = log.logger("cli:service");
|
|
5
6
|
export function externalRuntimePackages(dependencies) {
|
|
6
7
|
return Object.keys(dependencies).filter((name) => !name.startsWith("@dbx-tools/"));
|
|
7
8
|
}
|
|
8
9
|
export async function installServiceRuntime(bunExecutable, directory, dependencies) {
|
|
10
|
+
const packages = Object.keys(dependencies);
|
|
9
11
|
await mkdir(directory, { recursive: true });
|
|
10
12
|
const manifestPath = join(directory, "package.json");
|
|
11
13
|
const current = await readOptionalRecord(manifestPath);
|
|
@@ -18,6 +20,9 @@ export async function installServiceRuntime(bunExecutable, directory, dependenci
|
|
|
18
20
|
...dependencies,
|
|
19
21
|
},
|
|
20
22
|
}, null, 2)}\n`, "utf8");
|
|
23
|
+
if (packages.length > 0) {
|
|
24
|
+
logger.info("installing service runtime packages", { directory, packages });
|
|
25
|
+
}
|
|
21
26
|
await exec.spawn(bunExecutable, ["install", "--production", "--cwd", directory], {
|
|
22
27
|
check: true,
|
|
23
28
|
cwd: directory,
|
|
@@ -25,9 +30,13 @@ export async function installServiceRuntime(bunExecutable, directory, dependenci
|
|
|
25
30
|
stdout: "capture",
|
|
26
31
|
stderr: "capture",
|
|
27
32
|
});
|
|
33
|
+
if (packages.length > 0) {
|
|
34
|
+
logger.info("service runtime packages installed", { directory, packages });
|
|
35
|
+
}
|
|
28
36
|
}
|
|
29
37
|
/** Create a clean uv environment and install the primary and companion Python packages. */
|
|
30
|
-
export async function installServicePythonPackage(uvExecutable, directory, packageSpecifiers, python, platform) {
|
|
38
|
+
export async function installServicePythonPackage(uvExecutable, directory, packageSpecifiers, python, platform, offline) {
|
|
39
|
+
logger.info("creating service Python environment", { directory, python });
|
|
31
40
|
await rm(directory, { recursive: true, force: true });
|
|
32
41
|
await exec.spawn(uvExecutable, ["venv", "--managed-python", "--no-project", "--python", python, directory], {
|
|
33
42
|
check: true,
|
|
@@ -36,12 +45,29 @@ export async function installServicePythonPackage(uvExecutable, directory, packa
|
|
|
36
45
|
stderr: "capture",
|
|
37
46
|
});
|
|
38
47
|
const executable = join(directory, platform === "win32" ? "Scripts/python.exe" : "bin/python");
|
|
39
|
-
|
|
48
|
+
logger.info("installing service Python packages", {
|
|
49
|
+
executable,
|
|
50
|
+
offline,
|
|
51
|
+
packages: packageSpecifiers,
|
|
52
|
+
});
|
|
53
|
+
await exec.spawn(uvExecutable, [
|
|
54
|
+
"pip",
|
|
55
|
+
"install",
|
|
56
|
+
"--python",
|
|
57
|
+
executable,
|
|
58
|
+
...(offline ? ["--offline"] : []),
|
|
59
|
+
...packageSpecifiers,
|
|
60
|
+
], {
|
|
40
61
|
check: true,
|
|
41
62
|
stdin: "ignore",
|
|
42
63
|
stdout: "capture",
|
|
43
64
|
stderr: "capture",
|
|
44
65
|
});
|
|
66
|
+
logger.info("service Python packages installed", {
|
|
67
|
+
executable,
|
|
68
|
+
offline,
|
|
69
|
+
packages: packageSpecifiers,
|
|
70
|
+
});
|
|
45
71
|
return executable;
|
|
46
72
|
}
|
|
47
73
|
async function readOptionalRecord(path) {
|
|
@@ -62,4 +88,4 @@ function stringRecord(value) {
|
|
|
62
88
|
return {};
|
|
63
89
|
return Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[1] === "string"));
|
|
64
90
|
}
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3J1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFFekMsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFlBQThDO0lBQ3BGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxhQUFxQixFQUNyQixTQUFpQixFQUNqQixZQUE4QztJQUU5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsQ0FDYixZQUFZLEVBQ1osR0FBRyxJQUFJLENBQUMsU0FBUyxDQUNmO1FBQ0Us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SSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFLLEtBQStCLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNsRSxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUMxQixDQUFDLEtBQUssRUFBNkIsRUFBRSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FDbkUsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyLCByZWFkRmlsZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgKiBhcyBleGVjIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvZXhlY1wiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY2xpOnNlcnZpY2VcIik7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlcm5hbFJ1bnRpbWVQYWNrYWdlcyhkZXBlbmRlbmNpZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5maWx0ZXIoKG5hbWUpID0+ICFuYW1lLnN0YXJ0c1dpdGgoXCJAZGJ4LXRvb2xzL1wiKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsU2VydmljZVJ1bnRpbWUoXG4gIGJ1bkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIGRlcGVuZGVuY2llczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZXMgPSBPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpO1xuICBhd2FpdCBta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCByZWFkT3B0aW9uYWxSZWNvcmQobWFuaWZlc3RQYXRoKTtcbiAgYXdhaXQgd3JpdGVGaWxlKFxuICAgIG1hbmlmZXN0UGF0aCxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgbmFtZTogXCJAZGJ4LXRvb2xzL3NlcnZpY2UtcnVudGltZVwiLFxuICAgICAgICBwcml2YXRlOiB0cnVlLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICAuLi5zdHJpbmdSZWNvcmQoY3VycmVudC5kZXBlbmRlbmNpZXMpLFxuICAgICAgICAgIC4uLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBudWxsLFxuICAgICAgMixcbiAgICApfVxcbmAsXG4gICAgXCJ1dGY4XCIsXG4gICk7XG4gIGlmIChwYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIHNlcnZpY2UgcnVudGltZSBwYWNrYWdlc1wiLCB7IGRpcmVjdG9yeSwgcGFja2FnZXMgfSk7XG4gIH1cbiAgYXdhaXQgZXhlYy5zcGF3bihidW5FeGVjdXRhYmxlLCBbXCJpbnN0YWxsXCIsIFwiLS1wcm9kdWN0aW9uXCIsIFwiLS1jd2RcIiwgZGlyZWN0b3J5XSwge1xuICAgIGNoZWNrOiB0cnVlLFxuICAgIGN3ZDogZGlyZWN0b3J5LFxuICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgfSk7XG4gIGlmIChwYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJzZXJ2aWNlIHJ1bnRpbWUgcGFja2FnZXMgaW5zdGFsbGVkXCIsIHsgZGlyZWN0b3J5LCBwYWNrYWdlcyB9KTtcbiAgfVxufVxuXG4vKiogQ3JlYXRlIGEgY2xlYW4gdXYgZW52aXJvbm1lbnQgYW5kIGluc3RhbGwgdGhlIHByaW1hcnkgYW5kIGNvbXBhbmlvbiBQeXRob24gcGFja2FnZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFNlcnZpY2VQeXRob25QYWNrYWdlKFxuICB1dkV4ZWN1dGFibGU6IHN0cmluZyxcbiAgZGlyZWN0b3J5OiBzdHJpbmcsXG4gIHBhY2thZ2VTcGVjaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcHl0aG9uOiBzdHJpbmcsXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0sXG4gIG9mZmxpbmU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBsb2dnZXIuaW5mbyhcImNyZWF0aW5nIHNlcnZpY2UgUHl0aG9uIGVudmlyb25tZW50XCIsIHsgZGlyZWN0b3J5LCBweXRob24gfSk7XG4gIGF3YWl0IHJtKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBhd2FpdCBleGVjLnNwYXduKFxuICAgIHV2RXhlY3V0YWJsZSxcbiAgICBbXCJ2ZW52XCIsIFwiLS1tYW5hZ2VkLXB5dGhvblwiLCBcIi0tbm8tcHJvamVjdFwiLCBcIi0tcHl0aG9uXCIsIHB5dGhvbiwgZGlyZWN0b3J5XSxcbiAgICB7XG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgfSxcbiAgKTtcbiAgY29uc3QgZXhlY3V0YWJsZSA9IGpvaW4oZGlyZWN0b3J5LCBwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJTY3JpcHRzL3B5dGhvbi5leGVcIiA6IFwiYmluL3B5dGhvblwiKTtcbiAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIHNlcnZpY2UgUHl0aG9uIHBhY2thZ2VzXCIsIHtcbiAgICBleGVjdXRhYmxlLFxuICAgIG9mZmxpbmUsXG4gICAgcGFja2FnZXM6IHBhY2thZ2VTcGVjaWZpZXJzLFxuICB9KTtcbiAgYXdhaXQgZXhlYy5zcGF3bihcbiAgICB1dkV4ZWN1dGFibGUsXG4gICAgW1xuICAgICAgXCJwaXBcIixcbiAgICAgIFwiaW5zdGFsbFwiLFxuICAgICAgXCItLXB5dGhvblwiLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIC4uLihvZmZsaW5lID8gW1wiLS1vZmZsaW5lXCJdIDogW10pLFxuICAgICAgLi4ucGFja2FnZVNwZWNpZmllcnMsXG4gICAgXSxcbiAgICB7XG4gICAgICBjaGVjazogdHJ1ZSxcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgfSxcbiAgKTtcbiAgbG9nZ2VyLmluZm8oXCJzZXJ2aWNlIFB5dGhvbiBwYWNrYWdlcyBpbnN0YWxsZWRcIiwge1xuICAgIGV4ZWN1dGFibGUsXG4gICAgb2ZmbGluZSxcbiAgICBwYWNrYWdlczogcGFja2FnZVNwZWNpZmllcnMsXG4gIH0pO1xuICByZXR1cm4gZXhlY3V0YWJsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE9wdGlvbmFsUmVjb3JkKHBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgSlNPTiBmaWxlIGlzIG5vdCBhbiBvYmplY3Q6ICR7cGF0aH1gKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB7fTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdSZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLmZpbHRlcihcbiAgICAgIChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4gdHlwZW9mIGVudHJ5WzFdID09PSBcInN0cmluZ1wiLFxuICAgICksXG4gICk7XG59XG4iXX0=
|
package/lib/src/cli.d.ts
CHANGED
|
@@ -18,10 +18,14 @@ export interface CliServiceCliDependencies {
|
|
|
18
18
|
create(definition: CliServiceDefinition): CliServiceLifecycle;
|
|
19
19
|
/** Write the JSON result of the status command. */
|
|
20
20
|
write(value: string): void;
|
|
21
|
+
/** Run a caller-supplied command with inherited terminal input and output. */
|
|
22
|
+
readonly execute?: (command: string, arguments_: readonly string[]) => Promise<void>;
|
|
21
23
|
}
|
|
22
24
|
export declare const CliServiceInstallOptionsSchema: z.ZodObject<{
|
|
23
25
|
start: z.ZodDefault<z.ZodBoolean>;
|
|
26
|
+
pythonProject: z.ZodOptional<z.ZodString>;
|
|
27
|
+
offline: z.ZodDefault<z.ZodBoolean>;
|
|
24
28
|
}, z.core.$strict>;
|
|
25
29
|
export type CliServiceInstallOptions = z.output<typeof CliServiceInstallOptionsSchema>;
|
|
26
|
-
/** Build install, start, stop, restart, status, and uninstall commands for a service. */
|
|
30
|
+
/** Build install, start, stop, restart, status, logs, and uninstall commands for a service. */
|
|
27
31
|
export declare function buildServiceCommand(source: CliServiceDefinitionSource, dependencies?: CliServiceCliDependencies): Command;
|
package/lib/src/cli.js
CHANGED
|
@@ -6,35 +6,55 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
+
import * as exec from "@dbx-tools/core/exec";
|
|
9
10
|
import { Command } from "commander";
|
|
10
11
|
import { z } from "zod";
|
|
11
12
|
import { CliService } from "./service.js";
|
|
12
13
|
const DEFAULT_DEPENDENCIES = {
|
|
13
14
|
create: (definition) => new CliService(definition),
|
|
14
15
|
write: (value) => process.stdout.write(value),
|
|
16
|
+
execute: async (command, arguments_) => {
|
|
17
|
+
await exec.spawn(command, arguments_, { check: true });
|
|
18
|
+
},
|
|
15
19
|
};
|
|
16
20
|
export const CliServiceInstallOptionsSchema = z
|
|
17
21
|
.object({
|
|
18
22
|
start: z.boolean().default(true).describe("Start the service after installation."),
|
|
23
|
+
pythonProject: z
|
|
24
|
+
.string()
|
|
25
|
+
.min(1)
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Local Python project installed instead of the registry package."),
|
|
28
|
+
offline: z
|
|
29
|
+
.boolean()
|
|
30
|
+
.default(false)
|
|
31
|
+
.describe("Install Python packages from the uv cache without network access."),
|
|
19
32
|
})
|
|
20
33
|
.strict()
|
|
21
34
|
.describe("Options for installing a current-user CLI service.");
|
|
22
|
-
/** Build install, start, stop, restart, status, and uninstall commands for a service. */
|
|
35
|
+
/** Build install, start, stop, restart, status, logs, and uninstall commands for a service. */
|
|
23
36
|
export function buildServiceCommand(source, dependencies = DEFAULT_DEPENDENCIES) {
|
|
24
37
|
const definition = resolveDefinition(source);
|
|
25
38
|
const service = () => dependencies.create(definition());
|
|
26
|
-
const
|
|
39
|
+
const execute = dependencies.execute ?? DEFAULT_DEPENDENCIES.execute;
|
|
40
|
+
const command = new Command("service")
|
|
41
|
+
.enablePositionalOptions()
|
|
42
|
+
.description(typeof source === "function"
|
|
27
43
|
? "Install and manage the desktop service"
|
|
28
44
|
: `Install and manage the ${source.name} desktop service`);
|
|
29
45
|
const install = command
|
|
30
46
|
.command("install")
|
|
31
47
|
.description("Install the service for the current user and start it")
|
|
32
|
-
.option("--no-start", "Do not start the service after installation")
|
|
48
|
+
.option("--no-start", "Do not start the service after installation")
|
|
49
|
+
.option("--python-project <path>", "Install a local Python project instead of the registry package")
|
|
50
|
+
.option("--offline", "Install Python packages from the uv cache without network access");
|
|
33
51
|
install.action(async () => {
|
|
34
52
|
const options = CliServiceInstallOptionsSchema.parse({
|
|
35
53
|
start: install.getOptionValue("start"),
|
|
54
|
+
pythonProject: install.getOptionValue("pythonProject"),
|
|
55
|
+
offline: install.getOptionValue("offline"),
|
|
36
56
|
});
|
|
37
|
-
await service().install(
|
|
57
|
+
await service().install(options);
|
|
38
58
|
});
|
|
39
59
|
command
|
|
40
60
|
.command("start")
|
|
@@ -60,6 +80,22 @@ export function buildServiceCommand(source, dependencies = DEFAULT_DEPENDENCIES)
|
|
|
60
80
|
.action(async () => {
|
|
61
81
|
dependencies.write(`${JSON.stringify(await service().status(), null, 2)}\n`);
|
|
62
82
|
});
|
|
83
|
+
command
|
|
84
|
+
.command("logs")
|
|
85
|
+
.description("Print the service log path or append it to a command")
|
|
86
|
+
.argument("[command...]", "Command and arguments to run before the service log path")
|
|
87
|
+
.allowUnknownOption()
|
|
88
|
+
.passThroughOptions()
|
|
89
|
+
.allowExcessArguments()
|
|
90
|
+
.action(async (commandArguments) => {
|
|
91
|
+
const logPath = service().logPath();
|
|
92
|
+
if (commandArguments.length === 0) {
|
|
93
|
+
dependencies.write(`${logPath}\n`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const [executable, ...arguments_] = commandArguments;
|
|
97
|
+
await execute(executable, [...arguments_, logPath]);
|
|
98
|
+
});
|
|
63
99
|
command
|
|
64
100
|
.command("uninstall")
|
|
65
101
|
.description("Stop and remove the service for the current user")
|
|
@@ -71,4 +107,4 @@ export function buildServiceCommand(source, dependencies = DEFAULT_DEPENDENCIES)
|
|
|
71
107
|
function resolveDefinition(source) {
|
|
72
108
|
return typeof source === "function" ? source : () => source;
|
|
73
109
|
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBR3hCLE9BQU8sRUFBRSxVQUFVLEVBQTRCLE1BQU0sY0FBYyxDQUFDO0FBYXBFLE1BQU0sb0JBQW9CLEdBQThCO0lBQ3RELE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDO0lBQ2xELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0NBQzlDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxDQUFDO0tBQzVDLE1BQU0sQ0FBQztJQUNOLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyx1Q0FBdUMsQ0FBQztDQUNuRixDQUFDO0tBQ0QsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7QUFJbEUseUZBQXlGO0FBQ3pGLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsTUFBa0MsRUFDbEMsZUFBMEMsb0JBQW9CO0lBRTlELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQ2hELE9BQU8sTUFBTSxLQUFLLFVBQVU7UUFDMUIsQ0FBQyxDQUFDLHdDQUF3QztRQUMxQyxDQUFDLENBQUMsMEJBQTBCLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUM1RCxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsT0FBTztTQUNwQixPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ2xCLFdBQVcsQ0FBQyx1REFBdUQsQ0FBQztTQUNwRSxNQUFNLENBQUMsWUFBWSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN4QixNQUFNLE9BQU8sR0FBRyw4QkFBOEIsQ0FBQyxLQUFLLENBQUM7WUFDbkQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTztTQUNKLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDaEIsV0FBVyxDQUFDLDZCQUE2QixDQUFDO1NBQzFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQixNQUFNLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTztTQUNKLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDZixXQUFXLENBQUMsMEJBQTBCLENBQUM7U0FDdkMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPO1NBQ0osT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUNsQixXQUFXLENBQUMsK0JBQStCLENBQUM7U0FDNUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPO1NBQ0osT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNqQixXQUFXLENBQUMsc0RBQXNELENBQUM7U0FDbkUsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRSxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU87U0FDSixPQUFPLENBQUMsV0FBVyxDQUFDO1NBQ3BCLFdBQVcsQ0FBQyxrREFBa0QsQ0FBQztTQUMvRCxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsTUFBTSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM5QixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQWtDO0lBQzNELE9BQU8sT0FBTyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21tYW5kZXIgY29tbWFuZCBncm91cCBmb3IgdGhlIHNoYXJlZCBzeXN0ZW0tdHJheSBzZXJ2aWNlIGxpZmVjeWNsZS5cbiAqXG4gKiBDb25zdW1pbmcgQ0xJcyBzaG91bGQgbW91bnQge0BsaW5rIGJ1aWxkU2VydmljZUNvbW1hbmR9IGluc3RlYWQgb2YgZGVmaW5pbmdcbiAqIHBhY2thZ2UtbG9jYWwgaW5zdGFsbC9zdGFydC9zdG9wL3N0YXR1cyBjb21tYW5kcyB3aXRoIGRpdmVyZ2VudCBiZWhhdmlvci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB0eXBlIHsgQ2xpU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi9kZWZpbml0aW9uLnRzXCI7XG5pbXBvcnQgeyBDbGlTZXJ2aWNlLCB0eXBlIENsaVNlcnZpY2VMaWZlY3ljbGUgfSBmcm9tIFwiLi9zZXJ2aWNlLnRzXCI7XG5cbi8qKiBTdGF0aWMgZGVmaW5pdGlvbiBvciBhY3Rpb24tdGltZSBmYWN0b3J5IHVzZWQgYnkgYSBzZXJ2aWNlIGNvbW1hbmQgZ3JvdXAuICovXG5leHBvcnQgdHlwZSBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSA9IENsaVNlcnZpY2VEZWZpbml0aW9uIHwgKCgpID0+IENsaVNlcnZpY2VEZWZpbml0aW9uKTtcblxuLyoqIEluamVjdGFibGUgbGlmZWN5Y2xlIGFuZCBvdXRwdXQgYm91bmRhcnkgZm9yIHNlcnZpY2UgQ0xJIHRlc3RzIGFuZCBjb21wb3NpdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyB7XG4gIC8qKiBDb25zdHJ1Y3QgdGhlIGxpZmVjeWNsZSBtYW5hZ2VyIHVzZWQgYnkgY29tbWFuZCBhY3Rpb25zLiAqL1xuICBjcmVhdGUoZGVmaW5pdGlvbjogQ2xpU2VydmljZURlZmluaXRpb24pOiBDbGlTZXJ2aWNlTGlmZWN5Y2xlO1xuICAvKiogV3JpdGUgdGhlIEpTT04gcmVzdWx0IG9mIHRoZSBzdGF0dXMgY29tbWFuZC4gKi9cbiAgd3JpdGUodmFsdWU6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmNvbnN0IERFRkFVTFRfREVQRU5ERU5DSUVTOiBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzID0ge1xuICBjcmVhdGU6IChkZWZpbml0aW9uKSA9PiBuZXcgQ2xpU2VydmljZShkZWZpbml0aW9uKSxcbiAgd3JpdGU6ICh2YWx1ZSkgPT4gcHJvY2Vzcy5zdGRvdXQud3JpdGUodmFsdWUpLFxufTtcblxuZXhwb3J0IGNvbnN0IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgc3RhcnQ6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSkuZGVzY3JpYmUoXCJTdGFydCB0aGUgc2VydmljZSBhZnRlciBpbnN0YWxsYXRpb24uXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiT3B0aW9ucyBmb3IgaW5zdGFsbGluZyBhIGN1cnJlbnQtdXNlciBDTEkgc2VydmljZS5cIik7XG5cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VJbnN0YWxsT3B0aW9ucyA9IHoub3V0cHV0PHR5cGVvZiBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnNTY2hlbWE+O1xuXG4vKiogQnVpbGQgaW5zdGFsbCwgc3RhcnQsIHN0b3AsIHJlc3RhcnQsIHN0YXR1cywgYW5kIHVuaW5zdGFsbCBjb21tYW5kcyBmb3IgYSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2VydmljZUNvbW1hbmQoXG4gIHNvdXJjZTogQ2xpU2VydmljZURlZmluaXRpb25Tb3VyY2UsXG4gIGRlcGVuZGVuY2llczogQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyA9IERFRkFVTFRfREVQRU5ERU5DSUVTLFxuKTogQ29tbWFuZCB7XG4gIGNvbnN0IGRlZmluaXRpb24gPSByZXNvbHZlRGVmaW5pdGlvbihzb3VyY2UpO1xuICBjb25zdCBzZXJ2aWNlID0gKCkgPT4gZGVwZW5kZW5jaWVzLmNyZWF0ZShkZWZpbml0aW9uKCkpO1xuICBjb25zdCBjb21tYW5kID0gbmV3IENvbW1hbmQoXCJzZXJ2aWNlXCIpLmRlc2NyaXB0aW9uKFxuICAgIHR5cGVvZiBzb3VyY2UgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBcIkluc3RhbGwgYW5kIG1hbmFnZSB0aGUgZGVza3RvcCBzZXJ2aWNlXCJcbiAgICAgIDogYEluc3RhbGwgYW5kIG1hbmFnZSB0aGUgJHtzb3VyY2UubmFtZX0gZGVza3RvcCBzZXJ2aWNlYCxcbiAgKTtcblxuICBjb25zdCBpbnN0YWxsID0gY29tbWFuZFxuICAgIC5jb21tYW5kKFwiaW5zdGFsbFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkluc3RhbGwgdGhlIHNlcnZpY2UgZm9yIHRoZSBjdXJyZW50IHVzZXIgYW5kIHN0YXJ0IGl0XCIpXG4gICAgLm9wdGlvbihcIi0tbm8tc3RhcnRcIiwgXCJEbyBub3Qgc3RhcnQgdGhlIHNlcnZpY2UgYWZ0ZXIgaW5zdGFsbGF0aW9uXCIpO1xuICBpbnN0YWxsLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYS5wYXJzZSh7XG4gICAgICBzdGFydDogaW5zdGFsbC5nZXRPcHRpb25WYWx1ZShcInN0YXJ0XCIpLFxuICAgIH0pO1xuICAgIGF3YWl0IHNlcnZpY2UoKS5pbnN0YWxsKHsgc3RhcnQ6IG9wdGlvbnMuc3RhcnQgfSk7XG4gIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInN0YXJ0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RhcnQgdGhlIGluc3RhbGxlZCBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkuc3RhcnQoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdG9wXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RvcCB0aGUgcnVubmluZyBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkuc3RvcCgpO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInJlc3RhcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJSZXN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnJlc3RhcnQoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdGF0dXNcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCBzZXJ2aWNlIGluc3RhbGxhdGlvbiBhbmQgcHJvY2VzcyBzdGF0ZSBhcyBKU09OXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBkZXBlbmRlbmNpZXMud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkoYXdhaXQgc2VydmljZSgpLnN0YXR1cygpLCBudWxsLCAyKX1cXG5gKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJ1bmluc3RhbGxcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTdG9wIGFuZCByZW1vdmUgdGhlIHNlcnZpY2UgZm9yIHRoZSBjdXJyZW50IHVzZXJcIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHNlcnZpY2UoKS51bmluc3RhbGwoKTtcbiAgICB9KTtcblxuICByZXR1cm4gY29tbWFuZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmluaXRpb24oc291cmNlOiBDbGlTZXJ2aWNlRGVmaW5pdGlvblNvdXJjZSk6ICgpID0+IENsaVNlcnZpY2VEZWZpbml0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiBzb3VyY2UgPT09IFwiZnVuY3Rpb25cIiA/IHNvdXJjZSA6ICgpID0+IHNvdXJjZTtcbn1cbiJdfQ==
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHeEIsT0FBTyxFQUFFLFVBQVUsRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFlcEUsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUNsRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQWUsRUFBRSxVQUE2QixFQUFFLEVBQUU7UUFDaEUsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ2tDLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQztLQUM1QyxNQUFNLENBQUM7SUFDTixLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsdUNBQXVDLENBQUM7SUFDbEYsYUFBYSxFQUFFLENBQUM7U0FDYixNQUFNLEVBQUU7U0FDUixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ04sUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLGlFQUFpRSxDQUFDO0lBQzlFLE9BQU8sRUFBRSxDQUFDO1NBQ1AsT0FBTyxFQUFFO1NBQ1QsT0FBTyxDQUFD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QUFDO1NBQ25FLFFBQVEsQ0FBQyxjQUFjLEVBQUUsMERBQTBELENBQUM7U0FDcEYsa0JBQWtCLEVBQUU7U0FDcEIsa0JBQWtCLEVBQUU7U0FDcEIsb0JBQW9CLEVBQUU7U0FDdEIsTUFBTSxDQUFDLEtBQUssRUFBRSxnQkFBMEIsRUFBRSxFQUFFO1FBQzNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO1FBQ3JELE1BQU0sT0FBTyxDQUFDLFVBQVcsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPO1NBQ0osT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUNwQixXQUFXLENBQUMsa0RBQWtELENBQUM7U0FDL0QsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFrQztJQUMzRCxPQUFPLE9BQU8sTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbWFuZGVyIGNvbW1hbmQgZ3JvdXAgZm9yIHRoZSBzaGFyZWQgc3lzdGVtLXRyYXkgc2VydmljZSBsaWZlY3ljbGUuXG4gKlxuICogQ29uc3VtaW5nIENMSXMgc2hvdWxkIG1vdW50IHtAbGluayBidWlsZFNlcnZpY2VDb21tYW5kfSBpbnN0ZWFkIG9mIGRlZmluaW5nXG4gKiBwYWNrYWdlLWxvY2FsIGluc3RhbGwvc3RhcnQvc3RvcC9zdGF0dXMgY29tbWFuZHMgd2l0aCBkaXZlcmdlbnQgYmVoYXZpb3IuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHR5cGUgeyBDbGlTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL2RlZmluaXRpb24udHNcIjtcbmltcG9ydCB7IENsaVNlcnZpY2UsIHR5cGUgQ2xpU2VydmljZUxpZmVjeWNsZSB9IGZyb20gXCIuL3NlcnZpY2UudHNcIjtcblxuLyoqIFN0YXRpYyBkZWZpbml0aW9uIG9yIGFjdGlvbi10aW1lIGZhY3RvcnkgdXNlZCBieSBhIHNlcnZpY2UgY29tbWFuZCBncm91cC4gKi9cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VEZWZpbml0aW9uU291cmNlID0gQ2xpU2VydmljZURlZmluaXRpb24gfCAoKCkgPT4gQ2xpU2VydmljZURlZmluaXRpb24pO1xuXG4vKiogSW5qZWN0YWJsZSBsaWZlY3ljbGUgYW5kIG91dHB1dCBib3VuZGFyeSBmb3Igc2VydmljZSBDTEkgdGVzdHMgYW5kIGNvbXBvc2l0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzIHtcbiAgLyoqIENvbnN0cnVjdCB0aGUgbGlmZWN5Y2xlIG1hbmFnZXIgdXNlZCBieSBjb21tYW5kIGFjdGlvbnMuICovXG4gIGNyZWF0ZShkZWZpbml0aW9uOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbik6IENsaVNlcnZpY2VMaWZlY3ljbGU7XG4gIC8qKiBXcml0ZSB0aGUgSlNPTiByZXN1bHQgb2YgdGhlIHN0YXR1cyBjb21tYW5kLiAqL1xuICB3cml0ZSh2YWx1ZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFJ1biBhIGNhbGxlci1zdXBwbGllZCBjb21tYW5kIHdpdGggaW5oZXJpdGVkIHRlcm1pbmFsIGlucHV0IGFuZCBvdXRwdXQuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGU/OiAoY29tbWFuZDogc3RyaW5nLCBhcmd1bWVudHNfOiByZWFkb25seSBzdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuY29uc3QgREVGQVVMVF9ERVBFTkRFTkNJRVMgPSB7XG4gIGNyZWF0ZTogKGRlZmluaXRpb24pID0+IG5ldyBDbGlTZXJ2aWNlKGRlZmluaXRpb24pLFxuICB3cml0ZTogKHZhbHVlKSA9PiBwcm9jZXNzLnN0ZG91dC53cml0ZSh2YWx1ZSksXG4gIGV4ZWN1dGU6IGFzeW5jIChjb21tYW5kOiBzdHJpbmcsIGFyZ3VtZW50c186IHJlYWRvbmx5IHN0cmluZ1tdKSA9PiB7XG4gICAgYXdhaXQgZXhlYy5zcGF3bihjb21tYW5kLCBhcmd1bWVudHNfLCB7IGNoZWNrOiB0cnVlIH0pO1xuICB9LFxufSBzYXRpc2ZpZXMgQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcztcblxuZXhwb3J0IGNvbnN0IENsaVNlcnZpY2VJbnN0YWxsT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgc3RhcnQ6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSkuZGVzY3JpYmUoXCJTdGFydCB0aGUgc2VydmljZSBhZnRlciBpbnN0YWxsYXRpb24uXCIpLFxuICAgIHB5dGhvblByb2plY3Q6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm1pbigxKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkxvY2FsIFB5dGhvbiBwcm9qZWN0IGluc3RhbGxlZCBpbnN0ZWFkIG9mIHRoZSByZWdpc3RyeSBwYWNrYWdlLlwiKSxcbiAgICBvZmZsaW5lOiB6XG4gICAgICAuYm9vbGVhbigpXG4gICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgIC5kZXNjcmliZShcIkluc3RhbGwgUHl0aG9uIHBhY2thZ2VzIGZyb20gdGhlIHV2IGNhY2hlIHdpdGhvdXQgbmV0d29yayBhY2Nlc3MuXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiT3B0aW9ucyBmb3IgaW5zdGFsbGluZyBhIGN1cnJlbnQtdXNlciBDTEkgc2VydmljZS5cIik7XG5cbmV4cG9ydCB0eXBlIENsaVNlcnZpY2VJbnN0YWxsT3B0aW9ucyA9IHoub3V0cHV0PHR5cGVvZiBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnNTY2hlbWE+O1xuXG4vKiogQnVpbGQgaW5zdGFsbCwgc3RhcnQsIHN0b3AsIHJlc3RhcnQsIHN0YXR1cywgbG9ncywgYW5kIHVuaW5zdGFsbCBjb21tYW5kcyBmb3IgYSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2VydmljZUNvbW1hbmQoXG4gIHNvdXJjZTogQ2xpU2VydmljZURlZmluaXRpb25Tb3VyY2UsXG4gIGRlcGVuZGVuY2llczogQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcyA9IERFRkFVTFRfREVQRU5ERU5DSUVTLFxuKTogQ29tbWFuZCB7XG4gIGNvbnN0IGRlZmluaXRpb24gPSByZXNvbHZlRGVmaW5pdGlvbihzb3VyY2UpO1xuICBjb25zdCBzZXJ2aWNlID0gKCkgPT4gZGVwZW5kZW5jaWVzLmNyZWF0ZShkZWZpbml0aW9uKCkpO1xuICBjb25zdCBleGVjdXRlID0gZGVwZW5kZW5jaWVzLmV4ZWN1dGUgPz8gREVGQVVMVF9ERVBFTkRFTkNJRVMuZXhlY3V0ZTtcbiAgY29uc3QgY29tbWFuZCA9IG5ldyBDb21tYW5kKFwic2VydmljZVwiKVxuICAgIC5lbmFibGVQb3NpdGlvbmFsT3B0aW9ucygpXG4gICAgLmRlc2NyaXB0aW9uKFxuICAgICAgdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gXCJJbnN0YWxsIGFuZCBtYW5hZ2UgdGhlIGRlc2t0b3Agc2VydmljZVwiXG4gICAgICAgIDogYEluc3RhbGwgYW5kIG1hbmFnZSB0aGUgJHtzb3VyY2UubmFtZX0gZGVza3RvcCBzZXJ2aWNlYCxcbiAgICApO1xuXG4gIGNvbnN0IGluc3RhbGwgPSBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJpbnN0YWxsXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiSW5zdGFsbCB0aGUgc2VydmljZSBmb3IgdGhlIGN1cnJlbnQgdXNlciBhbmQgc3RhcnQgaXRcIilcbiAgICAub3B0aW9uKFwiLS1uby1zdGFydFwiLCBcIkRvIG5vdCBzdGFydCB0aGUgc2VydmljZSBhZnRlciBpbnN0YWxsYXRpb25cIilcbiAgICAub3B0aW9uKFxuICAgICAgXCItLXB5dGhvbi1wcm9qZWN0IDxwYXRoPlwiLFxuICAgICAgXCJJbnN0YWxsIGEgbG9jYWwgUHl0aG9uIHByb2plY3QgaW5zdGVhZCBvZiB0aGUgcmVnaXN0cnkgcGFja2FnZVwiLFxuICAgIClcbiAgICAub3B0aW9uKFwiLS1vZmZsaW5lXCIsIFwiSW5zdGFsbCBQeXRob24gcGFja2FnZXMgZnJvbSB0aGUgdXYgY2FjaGUgd2l0aG91dCBuZXR3b3JrIGFjY2Vzc1wiKTtcbiAgaW5zdGFsbC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBDbGlTZXJ2aWNlSW5zdGFsbE9wdGlvbnNTY2hlbWEucGFyc2Uoe1xuICAgICAgc3RhcnQ6IGluc3RhbGwuZ2V0T3B0aW9uVmFsdWUoXCJzdGFydFwiKSxcbiAgICAgIHB5dGhvblByb2plY3Q6IGluc3RhbGwuZ2V0T3B0aW9uVmFsdWUoXCJweXRob25Qcm9qZWN0XCIpLFxuICAgICAgb2ZmbGluZTogaW5zdGFsbC5nZXRPcHRpb25WYWx1ZShcIm9mZmxpbmVcIiksXG4gICAgfSk7XG4gICAgYXdhaXQgc2VydmljZSgpLmluc3RhbGwob3B0aW9ucyk7XG4gIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInN0YXJ0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RhcnQgdGhlIGluc3RhbGxlZCBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkuc3RhcnQoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdG9wXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RvcCB0aGUgcnVubmluZyBzZXJ2aWNlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXJ2aWNlKCkuc3RvcCgpO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInJlc3RhcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJSZXN0YXJ0IHRoZSBpbnN0YWxsZWQgc2VydmljZVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnJlc3RhcnQoKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJzdGF0dXNcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCBzZXJ2aWNlIGluc3RhbGxhdGlvbiBhbmQgcHJvY2VzcyBzdGF0ZSBhcyBKU09OXCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBkZXBlbmRlbmNpZXMud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkoYXdhaXQgc2VydmljZSgpLnN0YXR1cygpLCBudWxsLCAyKX1cXG5gKTtcbiAgICB9KTtcblxuICBjb21tYW5kXG4gICAgLmNvbW1hbmQoXCJsb2dzXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnQgdGhlIHNlcnZpY2UgbG9nIHBhdGggb3IgYXBwZW5kIGl0IHRvIGEgY29tbWFuZFwiKVxuICAgIC5hcmd1bWVudChcIltjb21tYW5kLi4uXVwiLCBcIkNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBydW4gYmVmb3JlIHRoZSBzZXJ2aWNlIGxvZyBwYXRoXCIpXG4gICAgLmFsbG93VW5rbm93bk9wdGlvbigpXG4gICAgLnBhc3NUaHJvdWdoT3B0aW9ucygpXG4gICAgLmFsbG93RXhjZXNzQXJndW1lbnRzKClcbiAgICAuYWN0aW9uKGFzeW5jIChjb21tYW5kQXJndW1lbnRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgY29uc3QgbG9nUGF0aCA9IHNlcnZpY2UoKS5sb2dQYXRoKCk7XG4gICAgICBpZiAoY29tbWFuZEFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLndyaXRlKGAke2xvZ1BhdGh9XFxuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFtleGVjdXRhYmxlLCAuLi5hcmd1bWVudHNfXSA9IGNvbW1hbmRBcmd1bWVudHM7XG4gICAgICBhd2FpdCBleGVjdXRlKGV4ZWN1dGFibGUhLCBbLi4uYXJndW1lbnRzXywgbG9nUGF0aF0pO1xuICAgIH0pO1xuXG4gIGNvbW1hbmRcbiAgICAuY29tbWFuZChcInVuaW5zdGFsbFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0b3AgYW5kIHJlbW92ZSB0aGUgc2VydmljZSBmb3IgdGhlIGN1cnJlbnQgdXNlclwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmljZSgpLnVuaW5zdGFsbCgpO1xuICAgIH0pO1xuXG4gIHJldHVybiBjb21tYW5kO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbihzb3VyY2U6IENsaVNlcnZpY2VEZWZpbml0aW9uU291cmNlKTogKCkgPT4gQ2xpU2VydmljZURlZmluaXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiID8gc291cmNlIDogKCkgPT4gc291cmNlO1xufVxuIl19
|
package/lib/src/icon.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export
|
|
1
|
+
/** Plain glyphs available to identify dbx-tools system-tray services. */
|
|
2
|
+
export type ServiceTrayGlyph = "model-proxy" | "graphiti" | "lakebase";
|
|
3
|
+
/** Return a service glyph as a systray2 PNG or Windows ICO payload. */
|
|
4
|
+
export declare function serviceTrayIcon(glyph?: ServiceTrayGlyph, platform?: NodeJS.Platform): string;
|
package/lib/src/icon.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { deflateSync } from "node:zlib";
|
|
2
2
|
const SIZE = 32;
|
|
3
|
-
const
|
|
3
|
+
const MODEL_PROXY_RECTANGLES = [
|
|
4
4
|
[4, 13, 6, 6],
|
|
5
5
|
[24, 4, 6, 6],
|
|
6
6
|
[24, 13, 6, 6],
|
|
@@ -11,26 +11,71 @@ const RECTANGLES = [
|
|
|
11
11
|
[18, 15, 6, 2],
|
|
12
12
|
[18, 24, 6, 2],
|
|
13
13
|
];
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const GRAPHITI_BOLT_RECTANGLES = [
|
|
15
|
+
[10, 5, 10, 2],
|
|
16
|
+
[17, 7, 2, 2],
|
|
17
|
+
[15, 9, 7, 2],
|
|
18
|
+
];
|
|
19
|
+
/** Return a service glyph as a systray2 PNG or Windows ICO payload. */
|
|
20
|
+
export function serviceTrayIcon(glyph = "model-proxy", platform = process.platform) {
|
|
16
21
|
const color = platform === "darwin"
|
|
17
22
|
? [0x00, 0x00, 0x00, 0xff]
|
|
18
23
|
: [0xff, 0x36, 0x21, 0xff];
|
|
19
|
-
const png = encodePng(renderGlyph(color));
|
|
24
|
+
const png = encodePng(renderGlyph(glyph, color));
|
|
20
25
|
return (platform === "win32" ? encodeIco(png) : png).toString("base64");
|
|
21
26
|
}
|
|
22
|
-
function renderGlyph(color) {
|
|
27
|
+
function renderGlyph(glyph, color) {
|
|
23
28
|
const rgba = Buffer.alloc(SIZE * SIZE * 4);
|
|
24
29
|
for (let y = 0; y < SIZE; y += 1) {
|
|
25
30
|
for (let x = 0; x < SIZE; x += 1) {
|
|
26
|
-
|
|
31
|
+
const opacity = glyphOpacity(glyph, x, y);
|
|
32
|
+
if (opacity === 0)
|
|
27
33
|
continue;
|
|
28
|
-
|
|
29
|
-
rgba.set(color, (y * SIZE + x) * 4);
|
|
34
|
+
rgba.set([color[0], color[1], color[2], Math.round(color[3] * opacity)], (y * SIZE + x) * 4);
|
|
30
35
|
}
|
|
31
36
|
}
|
|
32
37
|
return rgba;
|
|
33
38
|
}
|
|
39
|
+
function glyphOpacity(glyph, x, y) {
|
|
40
|
+
switch (glyph) {
|
|
41
|
+
case "model-proxy":
|
|
42
|
+
return modelProxyGlyphContains(x, y) ? 1 : 0;
|
|
43
|
+
case "graphiti":
|
|
44
|
+
return graphitiGlyphContains(x, y) ? 1 : 0;
|
|
45
|
+
case "lakebase":
|
|
46
|
+
return lakebaseGlyphOpacity(x, y);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function modelProxyGlyphContains(x, y) {
|
|
50
|
+
return MODEL_PROXY_RECTANGLES.some(([left, top, width, height]) => x >= left && x < left + width && y >= top && y < top + height);
|
|
51
|
+
}
|
|
52
|
+
function graphitiGlyphContains(x, y) {
|
|
53
|
+
// Preserve the Graphiti bot mark through its bolt, antennae, outlined head, and ringed eyes.
|
|
54
|
+
const bolt = GRAPHITI_BOLT_RECTANGLES.some(([left, top, width, height]) => x >= left && x < left + width && y >= top && y < top + height);
|
|
55
|
+
const head = (y >= 10 && y < 13 && x >= 6 && x < 26) ||
|
|
56
|
+
(y >= 13 && y < 25 && x >= 4 && x < 7) ||
|
|
57
|
+
(y >= 13 && y < 25 && x >= 25 && x < 28) ||
|
|
58
|
+
(y >= 24 && y < 27 && x >= 6 && x < 26);
|
|
59
|
+
const antenna = y >= 3 && y < 11 && ((x >= 7 && x < 9) || (x >= 23 && x < 25));
|
|
60
|
+
return bolt || head || antenna || graphitiEyeContains(x, y, 11) || graphitiEyeContains(x, y, 21);
|
|
61
|
+
}
|
|
62
|
+
function graphitiEyeContains(x, y, centerX) {
|
|
63
|
+
const distance = (x - centerX) ** 2 + (y - 18) ** 2;
|
|
64
|
+
return distance >= 10 && distance <= 25;
|
|
65
|
+
}
|
|
66
|
+
function lakebaseGlyphOpacity(x, y) {
|
|
67
|
+
if (x < 5 || x >= 27)
|
|
68
|
+
return 0;
|
|
69
|
+
if (y >= 5 && y < 11)
|
|
70
|
+
return 0.45;
|
|
71
|
+
// Keep the official mark's light middle band, dark wave channel, and solid lower band.
|
|
72
|
+
const middleBoundary = 19 - Math.round(Math.sin(((x - 5) / 21) * Math.PI * 2));
|
|
73
|
+
if (y >= 13 && y < middleBoundary)
|
|
74
|
+
return 0.45;
|
|
75
|
+
if (y >= middleBoundary + 3 && y < 27)
|
|
76
|
+
return 1;
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
34
79
|
function encodePng(rgba) {
|
|
35
80
|
const header = Buffer.alloc(13);
|
|
36
81
|
header.writeUInt32BE(SIZE, 0);
|
|
@@ -81,4 +126,4 @@ function encodeIco(png) {
|
|
|
81
126
|
header.writeUInt32LE(header.length, 18);
|
|
82
127
|
return Buffer.concat([header, png]);
|
|
83
128
|
}
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pY29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNkLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNOLENBQUM7QUFFWCxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxXQUE0QixPQUFPLENBQUMsUUFBUTtJQUMxRSxNQUFNLEtBQUssR0FDVCxRQUFRLEtBQUssUUFBUTtRQUNuQixDQUFDLENBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQVc7UUFDckMsQ0FBQyxDQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFXLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBZ0Q7SUFDbkUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQ0UsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUNkLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQzdCLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FDaEUsRUFDRCxDQUFDO2dCQUNELFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBWTtJQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RCxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztRQUN4QixRQUFRLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLElBQVksRUFBRSxJQUFZO0lBQzFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxJQUFZO0lBQ3pCLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQztJQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDZCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEdBQVc7SUFDNUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDakIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5cbmNvbnN0IFNJWkUgPSAzMjtcbmNvbnN0IFJFQ1RBTkdMRVMgPSBbXG4gIFs0LCAxMywgNiwgNl0sXG4gIFsyNCwgNCwgNiwgNl0sXG4gIFsyNCwgMTMsIDYsIDZdLFxuICBbMjQsIDIyLCA2LCA2XSxcbiAgWzEwLCAxNSwgNiwgMl0sXG4gIFsxNiwgNiwgMiwgMjBdLFxuICBbMTgsIDYsIDYsIDJdLFxuICBbMTgsIDE1LCA2LCAyXSxcbiAgWzE4LCAyNCwgNiwgMl0sXG5dIGFzIGNvbnN0O1xuXG4vKiogUmV0dXJuIHRoZSBkYngtdG9vbHMgc2VydmljZSBnbHlwaCBhcyBhIHN5c3RyYXkyIFBORyBvciBXaW5kb3dzIElDTyBwYXlsb2FkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VUcmF5SWNvbihwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbG9yID1cbiAgICBwbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIlxuICAgICAgPyAoWzB4MDAsIDB4MDAsIDB4MDAsIDB4ZmZdIGFzIGNvbnN0KVxuICAgICAgOiAoWzB4ZmYsIDB4MzYsIDB4MjEsIDB4ZmZdIGFzIGNvbnN0KTtcbiAgY29uc3QgcG5nID0gZW5jb2RlUG5nKHJlbmRlckdseXBoKGNvbG9yKSk7XG4gIHJldHVybiAocGxhdGZvcm0gPT09IFwid2luMzJcIiA/IGVuY29kZUljbyhwbmcpIDogcG5nKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyR2x5cGgoY29sb3I6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKTogQnVmZmVyIHtcbiAgY29uc3QgcmdiYSA9IEJ1ZmZlci5hbGxvYyhTSVpFICogU0laRSAqIDQpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IFNJWkU7IHkgKz0gMSkge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgU0laRTsgeCArPSAxKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFSRUNUQU5HTEVTLnNvbWUoXG4gICAgICAgICAgKFtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHRdKSA9PlxuICAgICAgICAgICAgeCA+PSBsZWZ0ICYmIHggPCBsZWZ0ICsgd2lkdGggJiYgeSA+PSB0b3AgJiYgeSA8IHRvcCArIGhlaWdodCxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmdiYS5zZXQoY29sb3IsICh5ICogU0laRSArIHgpICogNCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZ2JhO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVQbmcocmdiYTogQnVmZmVyKTogQnVmZmVyIHtcbiAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDEzKTtcbiAgaGVhZGVyLndyaXRlVUludDMyQkUoU0laRSwgMCk7XG4gIGhlYWRlci53cml0ZVVJbnQzMkJFKFNJWkUsIDQpO1xuICBoZWFkZXJbOF0gPSA4O1xuICBoZWFkZXJbOV0gPSA2O1xuXG4gIGNvbnN0IHNjYW5saW5lcyA9IEJ1ZmZlci5hbGxvYygoU0laRSAqIDQgKyAxKSAqIFNJWkUpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IFNJWkU7IHkgKz0gMSkge1xuICAgIGNvbnN0IG9mZnNldCA9IHkgKiAoU0laRSAqIDQgKyAxKTtcbiAgICBzY2FubGluZXNbb2Zmc2V0XSA9IDA7XG4gICAgcmdiYS5jb3B5KHNjYW5saW5lcywgb2Zmc2V0ICsgMSwgeSAqIFNJWkUgKiA0LCAoeSArIDEpICogU0laRSAqIDQpO1xuICB9XG5cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW1xuICAgIEJ1ZmZlci5mcm9tKFsweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhXSksXG4gICAgcG5nQ2h1bmsoXCJJSERSXCIsIGhlYWRlciksXG4gICAgcG5nQ2h1bmsoXCJJREFUXCIsIGRlZmxhdGVTeW5jKHNjYW5saW5lcykpLFxuICAgIHBuZ0NodW5rKFwiSUVORFwiLCBCdWZmZXIuYWxsb2MoMCkpLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gcG5nQ2h1bmsodHlwZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiBCdWZmZXIge1xuICBjb25zdCBuYW1lID0gQnVmZmVyLmZyb20odHlwZSwgXCJhc2NpaVwiKTtcbiAgY29uc3QgY2h1bmsgPSBCdWZmZXIuYWxsb2MoMTIgKyBkYXRhLmxlbmd0aCk7XG4gIGNodW5rLndyaXRlVUludDMyQkUoZGF0YS5sZW5ndGgsIDApO1xuICBuYW1lLmNvcHkoY2h1bmssIDQpO1xuICBkYXRhLmNvcHkoY2h1bmssIDgpO1xuICBjaHVuay53cml0ZVVJbnQzMkJFKGNyYzMyKEJ1ZmZlci5jb25jYXQoW25hbWUsIGRhdGFdKSksIDggKyBkYXRhLmxlbmd0aCk7XG4gIHJldHVybiBjaHVuaztcbn1cblxuZnVuY3Rpb24gY3JjMzIoZGF0YTogQnVmZmVyKTogbnVtYmVyIHtcbiAgbGV0IHZhbHVlID0gMHhmZmZmZmZmZjtcbiAgZm9yIChjb25zdCBieXRlIG9mIGRhdGEpIHtcbiAgICB2YWx1ZSBePSBieXRlO1xuICAgIGZvciAobGV0IGJpdCA9IDA7IGJpdCA8IDg7IGJpdCArPSAxKSB7XG4gICAgICB2YWx1ZSA9ICh2YWx1ZSA+Pj4gMSkgXiAodmFsdWUgJiAxID8gMHhlZGI4ODMyMCA6IDApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKHZhbHVlIF4gMHhmZmZmZmZmZikgPj4+IDA7XG59XG5cbmZ1bmN0aW9uIGVuY29kZUljbyhwbmc6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyMik7XG4gIGhlYWRlci53cml0ZVVJbnQxNkxFKDEsIDIpO1xuICBoZWFkZXIud3JpdGVVSW50MTZMRSgxLCA0KTtcbiAgaGVhZGVyWzZdID0gU0laRTtcbiAgaGVhZGVyWzddID0gU0laRTtcbiAgaGVhZGVyLndyaXRlVUludDE2TEUoMSwgMTApO1xuICBoZWFkZXIud3JpdGVVSW50MTZMRSgzMiwgMTIpO1xuICBoZWFkZXIud3JpdGVVSW50MzJMRShwbmcubGVuZ3RoLCAxNCk7XG4gIGhlYWRlci53cml0ZVVJbnQzMkxFKGhlYWRlci5sZW5ndGgsIDE4KTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcG5nXSk7XG59XG4iXX0=
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pY29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ04sQ0FBQztBQUNYLE1BQU0sd0JBQXdCLEdBQUc7SUFDL0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ0wsQ0FBQztBQUtYLHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUEwQixhQUFhLEVBQ3ZDLFdBQTRC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QUM7SUFDM0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuXG5jb25zdCBTSVpFID0gMzI7XG5jb25zdCBNT0RFTF9QUk9YWV9SRUNUQU5HTEVTID0gW1xuICBbNCwgMTMsIDYsIDZdLFxuICBbMjQsIDQsIDYsIDZdLFxuICBbMjQsIDEzLCA2LCA2XSxcbiAgWzI0LCAyMiwgNiwgNl0sXG4gIFsxMCwgMTUsIDYsIDJdLFxuICBbMTYsIDYsIDIsIDIwXSxcbiAgWzE4LCA2LCA2LCAyXSxcbiAgWzE4LCAxNSwgNiwgMl0sXG4gIFsxOCwgMjQsIDYsIDJdLFxuXSBhcyBjb25zdDtcbmNvbnN0IEdSQVBISVRJX0JPTFRfUkVDVEFOR0xFUyA9IFtcbiAgWzEwLCA1LCAxMCwgMl0sXG4gIFsxNywgNywgMiwgMl0sXG4gIFsxNSwgOSwgNywgMl0sXG5dIGFzIGNvbnN0O1xuXG4vKiogUGxhaW4gZ2x5cGhzIGF2YWlsYWJsZSB0byBpZGVudGlmeSBkYngtdG9vbHMgc3lzdGVtLXRyYXkgc2VydmljZXMuICovXG5leHBvcnQgdHlwZSBTZXJ2aWNlVHJheUdseXBoID0gXCJtb2RlbC1wcm94eVwiIHwgXCJncmFwaGl0aVwiIHwgXCJsYWtlYmFzZVwiO1xuXG4vKiogUmV0dXJuIGEgc2VydmljZSBnbHlwaCBhcyBhIHN5c3RyYXkyIFBORyBvciBXaW5kb3dzIElDTyBwYXlsb2FkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VUcmF5SWNvbihcbiAgZ2x5cGg6IFNlcnZpY2VUcmF5R2x5cGggPSBcIm1vZGVsLXByb3h5XCIsXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY29sb3IgPVxuICAgIHBsYXRmb3JtID09PSBcImRhcndpblwiXG4gICAgICA/IChbMHgwMCwgMHgwMCwgMHgwMCwgMHhmZl0gYXMgY29uc3QpXG4gICAgICA6IChbMHhmZiwgMHgzNiwgMHgyMSwgMHhmZl0gYXMgY29uc3QpO1xuICBjb25zdCBwbmcgPSBlbmNvZGVQbmcocmVuZGVyR2x5cGgoZ2x5cGgsIGNvbG9yKSk7XG4gIHJldHVybiAocGxhdGZvcm0gPT09IFwid2luMzJcIiA/IGVuY29kZUljbyhwbmcpIDogcG5nKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyR2x5cGgoXG4gIGdseXBoOiBTZXJ2aWNlVHJheUdseXBoLFxuICBjb2xvcjogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4pOiBCdWZmZXIge1xuICBjb25zdCByZ2JhID0gQnVmZmVyLmFsbG9jKFNJWkUgKiBTSVpFICogNCk7XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgU0laRTsgeSArPSAxKSB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBTSVpFOyB4ICs9IDEpIHtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBnbHlwaE9wYWNpdHkoZ2x5cGgsIHgsIHkpO1xuICAgICAgaWYgKG9wYWNpdHkgPT09IDApIGNvbnRpbnVlO1xuICAgICAgcmdiYS5zZXQoW2NvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIE1hdGgucm91bmQoY29sb3JbM10gKiBvcGFjaXR5KV0sICh5ICogU0laRSArIHgpICogNCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZ2JhO1xufVxuXG5mdW5jdGlvbiBnbHlwaE9wYWNpdHkoZ2x5cGg6IFNlcnZpY2VUcmF5R2x5cGgsIHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgc3dpdGNoIChnbHlwaCkge1xuICAgIGNhc2UgXCJtb2RlbC1wcm94eVwiOlxuICAgICAgcmV0dXJuIG1vZGVsUHJveHlHbHlwaENvbnRhaW5zKHgsIHkpID8gMSA6IDA7XG4gICAgY2FzZSBcImdyYXBoaXRpXCI6XG4gICAgICByZXR1cm4gZ3JhcGhpdGlHbHlwaENvbnRhaW5zKHgsIHkpID8gMSA6IDA7XG4gICAgY2FzZSBcImxha2ViYXNlXCI6XG4gICAgICByZXR1cm4gbGFrZWJhc2VHbHlwaE9wYWNpdHkoeCwgeSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW9kZWxQcm94eUdseXBoQ29udGFpbnMoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIE1PREVMX1BST1hZX1JFQ1RBTkdMRVMuc29tZShcbiAgICAoW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0pID0+IHggPj0gbGVmdCAmJiB4IDwgbGVmdCArIHdpZHRoICYmIHkgPj0gdG9wICYmIHkgPCB0b3AgKyBoZWlnaHQsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdyYXBoaXRpR2x5cGhDb250YWlucyh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAvLyBQcmVzZXJ2ZSB0aGUgR3JhcGhpdGkgYm90IG1hcmsgdGhyb3VnaCBpdHMgYm9sdCwgYW50ZW5uYWUsIG91dGxpbmVkIGhlYWQsIGFuZCByaW5nZWQgZXllcy5cbiAgY29uc3QgYm9sdCA9IEdSQVBISVRJX0JPTFRfUkVDVEFOR0xFUy5zb21lKFxuICAgIChbbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0XSkgPT4geCA+PSBsZWZ0ICYmIHggPCBsZWZ0ICsgd2lkdGggJiYgeSA+PSB0b3AgJiYgeSA8IHRvcCArIGhlaWdodCxcbiAgKTtcbiAgY29uc3QgaGVhZCA9XG4gICAgKHkgPj0gMTAgJiYgeSA8IDEzICYmIHggPj0gNiAmJiB4IDwgMjYpIHx8XG4gICAgKHkgPj0gMTMgJiYgeSA8IDI1ICYmIHggPj0gNCAmJiB4IDwgNykgfHxcbiAgICAoeSA+PSAxMyAmJiB5IDwgMjUgJiYgeCA+PSAyNSAmJiB4IDwgMjgpIHx8XG4gICAgKHkgPj0gMjQgJiYgeSA8IDI3ICYmIHggPj0gNiAmJiB4IDwgMjYpO1xuICBjb25zdCBhbnRlbm5hID0geSA+PSAzICYmIHkgPCAxMSAmJiAoKHggPj0gNyAmJiB4IDwgOSkgfHwgKHggPj0gMjMgJiYgeCA8IDI1KSk7XG4gIHJldHVybiBib2x0IHx8IGhlYWQgfHwgYW50ZW5uYSB8fCBncmFwaGl0aUV5ZUNvbnRhaW5zKHgsIHksIDExKSB8fCBncmFwaGl0aUV5ZUNvbnRhaW5zKHgsIHksIDIxKTtcbn1cblxuZnVuY3Rpb24gZ3JhcGhpdGlFeWVDb250YWlucyh4OiBudW1iZXIsIHk6IG51bWJlciwgY2VudGVyWDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpc3RhbmNlID0gKHggLSBjZW50ZXJYKSAqKiAyICsgKHkgLSAxOCkgKiogMjtcbiAgcmV0dXJuIGRpc3RhbmNlID49IDEwICYmIGRpc3RhbmNlIDw9IDI1O1xufVxuXG5mdW5jdGlvbiBsYWtlYmFzZUdseXBoT3BhY2l0eSh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICh4IDwgNSB8fCB4ID49IDI3KSByZXR1cm4gMDtcbiAgaWYgKHkgPj0gNSAmJiB5IDwgMTEpIHJldHVybiAwLjQ1O1xuXG4gIC8vIEtlZXAgdGhlIG9mZmljaWFsIG1hcmsncyBsaWdodCBtaWRkbGUgYmFuZCwgZGFyayB3YXZlIGNoYW5uZWwsIGFuZCBzb2xpZCBsb3dlciBiYW5kLlxuICBjb25zdCBtaWRkbGVCb3VuZGFyeSA9IDE5IC0gTWF0aC5yb3VuZChNYXRoLnNpbigoKHggLSA1KSAvIDIxKSAqIE1hdGguUEkgKiAyKSk7XG4gIGlmICh5ID49IDEzICYmIHkgPCBtaWRkbGVCb3VuZGFyeSkgcmV0dXJuIDAuNDU7XG4gIGlmICh5ID49IG1pZGRsZUJvdW5kYXJ5ICsgMyAmJiB5IDwgMjcpIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZW5jb2RlUG5nKHJnYmE6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygxMyk7XG4gIGhlYWRlci53cml0ZVVJbnQzMkJFKFNJWkUsIDApO1xuICBoZWFkZXIud3JpdGVVSW50MzJCRShTSVpFLCA0KTtcbiAgaGVhZGVyWzhdID0gODtcbiAgaGVhZGVyWzldID0gNjtcblxuICBjb25zdCBzY2FubGluZXMgPSBCdWZmZXIuYWxsb2MoKFNJWkUgKiA0ICsgMSkgKiBTSVpFKTtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBTSVpFOyB5ICs9IDEpIHtcbiAgICBjb25zdCBvZmZzZXQgPSB5ICogKFNJWkUgKiA0ICsgMSk7XG4gICAgc2NhbmxpbmVzW29mZnNldF0gPSAwO1xuICAgIHJnYmEuY29weShzY2FubGluZXMsIG9mZnNldCArIDEsIHkgKiBTSVpFICogNCwgKHkgKyAxKSAqIFNJWkUgKiA0KTtcbiAgfVxuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFtcbiAgICBCdWZmZXIuZnJvbShbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV0pLFxuICAgIHBuZ0NodW5rKFwiSUhEUlwiLCBoZWFkZXIpLFxuICAgIHBuZ0NodW5rKFwiSURBVFwiLCBkZWZsYXRlU3luYyhzY2FubGluZXMpKSxcbiAgICBwbmdDaHVuayhcIklFTkRcIiwgQnVmZmVyLmFsbG9jKDApKSxcbiAgXSk7XG59XG5cbmZ1bmN0aW9uIHBuZ0NodW5rKHR5cGU6IHN0cmluZywgZGF0YTogQnVmZmVyKTogQnVmZmVyIHtcbiAgY29uc3QgbmFtZSA9IEJ1ZmZlci5mcm9tKHR5cGUsIFwiYXNjaWlcIik7XG4gIGNvbnN0IGNodW5rID0gQnVmZmVyLmFsbG9jKDEyICsgZGF0YS5sZW5ndGgpO1xuICBjaHVuay53cml0ZVVJbnQzMkJFKGRhdGEubGVuZ3RoLCAwKTtcbiAgbmFtZS5jb3B5KGNodW5rLCA0KTtcbiAgZGF0YS5jb3B5KGNodW5rLCA4KTtcbiAgY2h1bmsud3JpdGVVSW50MzJCRShjcmMzMihCdWZmZXIuY29uY2F0KFtuYW1lLCBkYXRhXSkpLCA4ICsgZGF0YS5sZW5ndGgpO1xuICByZXR1cm4gY2h1bms7XG59XG5cbmZ1bmN0aW9uIGNyYzMyKGRhdGE6IEJ1ZmZlcik6IG51bWJlciB7XG4gIGxldCB2YWx1ZSA9IDB4ZmZmZmZmZmY7XG4gIGZvciAoY29uc3QgYnl0ZSBvZiBkYXRhKSB7XG4gICAgdmFsdWUgXj0gYnl0ZTtcbiAgICBmb3IgKGxldCBiaXQgPSAwOyBiaXQgPCA4OyBiaXQgKz0gMSkge1xuICAgICAgdmFsdWUgPSAodmFsdWUgPj4+IDEpIF4gKHZhbHVlICYgMSA/IDB4ZWRiODgzMjAgOiAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICh2YWx1ZSBeIDB4ZmZmZmZmZmYpID4+PiAwO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVJY28ocG5nOiBCdWZmZXIpOiBCdWZmZXIge1xuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMjIpO1xuICBoZWFkZXIud3JpdGVVSW50MTZMRSgxLCAyKTtcbiAgaGVhZGVyLndyaXRlVUludDE2TEUoMSwgNCk7XG4gIGhlYWRlcls2XSA9IFNJWkU7XG4gIGhlYWRlcls3XSA9IFNJWkU7XG4gIGhlYWRlci53cml0ZVVJbnQxNkxFKDEsIDEwKTtcbiAgaGVhZGVyLndyaXRlVUludDE2TEUoMzIsIDEyKTtcbiAgaGVhZGVyLndyaXRlVUludDMyTEUocG5nLmxlbmd0aCwgMTQpO1xuICBoZWFkZXIud3JpdGVVSW50MzJMRShoZWFkZXIubGVuZ3RoLCAxOCk7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIHBuZ10pO1xufVxuIl19
|