@pagopa/dx-cli 0.24.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/bin/index.js +13 -3
- package/dist/adapters/azure/cloud-account-service.js +169 -92
- package/dist/adapters/azure/locations.d.ts +5 -1
- package/dist/adapters/azure/locations.js +1 -1
- package/dist/adapters/azure-monitor/instrumentation.d.ts +26 -0
- package/dist/adapters/azure-monitor/instrumentation.js +84 -0
- package/dist/adapters/azure-monitor/telemetry.d.ts +19 -0
- package/dist/adapters/azure-monitor/telemetry.js +28 -0
- package/dist/adapters/commander/commands/add.d.ts +32 -7
- package/dist/adapters/commander/commands/add.js +197 -15
- package/dist/adapters/commander/commands/doctor.js +4 -1
- package/dist/adapters/commander/commands/init.js +64 -15
- package/dist/adapters/github/github-repo.js +20 -2
- package/dist/adapters/octokit/index.d.ts +12 -0
- package/dist/adapters/octokit/index.js +26 -2
- package/dist/adapters/plop/actions/setup-pnpm.js +5 -1
- package/dist/adapters/plop/actions/sync-repository-environments.d.ts +15 -0
- package/dist/adapters/plop/actions/sync-repository-environments.js +98 -0
- package/dist/adapters/plop/generators/environment/actions.js +4 -1
- package/dist/adapters/plop/generators/environment/index.d.ts +3 -3
- package/dist/adapters/plop/generators/environment/index.js +6 -3
- package/dist/adapters/plop/generators/environment/prompts.d.ts +38 -0
- package/dist/adapters/plop/generators/environment/prompts.js +236 -91
- package/dist/adapters/plop/index.d.ts +3 -3
- package/dist/adapters/plop/index.js +5 -5
- package/dist/domain/authorization.js +4 -4
- package/dist/domain/environment.d.ts +6 -1
- package/dist/domain/environment.js +1 -1
- package/dist/index.js +132 -8
- package/package.json +24 -16
- package/templates/environment/workflow/_release-terraform-apply-bootstrapper-{{env.name}}.yaml.hbs +145 -2
|
@@ -3,5 +3,9 @@ export declare const locations: readonly ["italynorth", "westeurope"];
|
|
|
3
3
|
export type AzureLocation = (typeof locations)[number];
|
|
4
4
|
export declare function isAzureLocation(location: string): location is AzureLocation;
|
|
5
5
|
export declare const defaultLocation: "italynorth";
|
|
6
|
-
export declare const locationShort:
|
|
6
|
+
export declare const locationShort: {
|
|
7
|
+
readonly italynorth: "itn";
|
|
8
|
+
readonly westeurope: "weu";
|
|
9
|
+
};
|
|
10
|
+
export type LocationShortValue = (typeof locationShort)[keyof typeof locationShort];
|
|
7
11
|
export declare const cloudRegions: CloudRegion[];
|
|
@@ -19,4 +19,4 @@ export const cloudRegions = locations.map((l) => ({
|
|
|
19
19
|
name: l,
|
|
20
20
|
short: locationShort[l],
|
|
21
21
|
}));
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2xvY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFJekQsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQVUsQ0FBQztBQUkvRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUF5QixDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELHdDQUF3QztBQUN4QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixVQUFVLEVBQUUsS0FBSztJQUNqQixVQUFVLEVBQUUsS0FBSztDQUMrQixDQUFDO0FBS25ELE1BQU0sV0FBVyxHQUFrQztJQUNqRCxVQUFVLEVBQUUsYUFBYTtJQUN6QixVQUFVLEVBQUUsYUFBYTtDQUMxQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFrQixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksRUFBRSxDQUFDO0lBQ1AsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7Q0FDeEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGVzZSBhcmUgdGhlIG9ubHkgcmVnaW9ucyB3ZSBjdXJyZW50bHkgc3VwcG9ydCBmb3IgRFhcblxuaW1wb3J0IHR5cGUgeyBDbG91ZFJlZ2lvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vY2xvdWQtYWNjb3VudC5qc1wiO1xuXG4vLyBPcmRlciBtYXR0ZXJzISB0aGV5IGdvIGZyb20gdGhlIHByZWZlcnJlZCB0byB0aGUgbGVzcyBwcmVmZXJyZWQgb25lc1xuZXhwb3J0IGNvbnN0IGxvY2F0aW9ucyA9IFtcIml0YWx5bm9ydGhcIiwgXCJ3ZXN0ZXVyb3BlXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBenVyZUxvY2F0aW9uID0gKHR5cGVvZiBsb2NhdGlvbnMpW251bWJlcl07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0F6dXJlTG9jYXRpb24obG9jYXRpb246IHN0cmluZyk6IGxvY2F0aW9uIGlzIEF6dXJlTG9jYXRpb24ge1xuICByZXR1cm4gbG9jYXRpb25zLmluY2x1ZGVzKGxvY2F0aW9uIGFzIEF6dXJlTG9jYXRpb24pO1xufVxuXG4vLyBUaGUgZGVmYXVsdCBsb2NhdGlvbiBpcyB0aGUgZmlyc3Qgb25lXG5leHBvcnQgY29uc3QgZGVmYXVsdExvY2F0aW9uID0gbG9jYXRpb25zWzBdO1xuXG5leHBvcnQgY29uc3QgbG9jYXRpb25TaG9ydCA9IHtcbiAgaXRhbHlub3J0aDogXCJpdG5cIixcbiAgd2VzdGV1cm9wZTogXCJ3ZXVcIixcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxBenVyZUxvY2F0aW9uLCBzdHJpbmc+O1xuXG5leHBvcnQgdHlwZSBMb2NhdGlvblNob3J0VmFsdWUgPVxuICAodHlwZW9mIGxvY2F0aW9uU2hvcnQpW2tleW9mIHR5cGVvZiBsb2NhdGlvblNob3J0XTtcblxuY29uc3QgZGlzcGxheU5hbWU6IFJlY29yZDxBenVyZUxvY2F0aW9uLCBzdHJpbmc+ID0ge1xuICBpdGFseW5vcnRoOiBcIkl0YWx5IE5vcnRoXCIsXG4gIHdlc3RldXJvcGU6IFwiV2VzdCBFdXJvcGVcIixcbn07XG5cbmV4cG9ydCBjb25zdCBjbG91ZFJlZ2lvbnM6IENsb3VkUmVnaW9uW10gPSBsb2NhdGlvbnMubWFwKChsKSA9PiAoe1xuICBkaXNwbGF5TmFtZTogZGlzcGxheU5hbWVbbF0sXG4gIG5hbWU6IGwsXG4gIHNob3J0OiBsb2NhdGlvblNob3J0W2xdLFxufSkpO1xuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTel preload module for the dx CLI.
|
|
3
|
+
*
|
|
4
|
+
* This module is a deliberate side-effect entrypoint. It MUST be the first
|
|
5
|
+
* module loaded by the process (via a sequential dynamic import in bin/index.js)
|
|
6
|
+
* so that import-in-the-middle can register its hook before any HTTP client
|
|
7
|
+
* libraries (undici/fetch, octokit, Azure SDKs) are loaded.
|
|
8
|
+
*
|
|
9
|
+
* Initialising the Azure Monitor exporter is deferred to `enableAzureMonitor()`
|
|
10
|
+
* so the CLI can decide at runtime whether to emit telemetry (only PagoPA org
|
|
11
|
+
* members do). The import-in-the-middle hook is still registered eagerly at
|
|
12
|
+
* preload because it must run before any instrumented module is imported.
|
|
13
|
+
*
|
|
14
|
+
* Reads APPLICATIONINSIGHTS_CONNECTION_STRING from process.env because this IS
|
|
15
|
+
* the configuration boundary — no higher caller can inject config at this point
|
|
16
|
+
* in the process lifecycle.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Initialises the Azure Monitor exporter and registers HTTP instrumentation.
|
|
20
|
+
*
|
|
21
|
+
* Deferred (not run at preload) so the CLI only emits telemetry once it has
|
|
22
|
+
* confirmed the user is a PagoPA org member. Idempotent: safe to call more than
|
|
23
|
+
* once. Must be called before logging is configured so the logtape OTel sink
|
|
24
|
+
* binds to the real (rather than no-op) LoggerProvider.
|
|
25
|
+
*/
|
|
26
|
+
export declare const enableAzureMonitor: () => void;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OTel preload module for the dx CLI.
|
|
3
|
+
*
|
|
4
|
+
* This module is a deliberate side-effect entrypoint. It MUST be the first
|
|
5
|
+
* module loaded by the process (via a sequential dynamic import in bin/index.js)
|
|
6
|
+
* so that import-in-the-middle can register its hook before any HTTP client
|
|
7
|
+
* libraries (undici/fetch, octokit, Azure SDKs) are loaded.
|
|
8
|
+
*
|
|
9
|
+
* Initialising the Azure Monitor exporter is deferred to `enableAzureMonitor()`
|
|
10
|
+
* so the CLI can decide at runtime whether to emit telemetry (only PagoPA org
|
|
11
|
+
* members do). The import-in-the-middle hook is still registered eagerly at
|
|
12
|
+
* preload because it must run before any instrumented module is imported.
|
|
13
|
+
*
|
|
14
|
+
* Reads APPLICATIONINSIGHTS_CONNECTION_STRING from process.env because this IS
|
|
15
|
+
* the configuration boundary — no higher caller can inject config at this point
|
|
16
|
+
* in the process lifecycle.
|
|
17
|
+
*/
|
|
18
|
+
import { useAzureMonitor } from "@azure/monitor-opentelemetry";
|
|
19
|
+
import { metrics, trace } from "@opentelemetry/api";
|
|
20
|
+
import { registerInstrumentations } from "@opentelemetry/instrumentation";
|
|
21
|
+
import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
|
|
22
|
+
// import-in-the-middle and module must be the first imports so that
|
|
23
|
+
// createAddHookMessageChannel / register run as early as possible.
|
|
24
|
+
import { createAddHookMessageChannel } from "import-in-the-middle";
|
|
25
|
+
import { register } from "module";
|
|
26
|
+
import os from "node:os";
|
|
27
|
+
const { registerOptions, waitForAllMessagesAcknowledged } = createAddHookMessageChannel();
|
|
28
|
+
// Register the ESM module hook so that subsequent dynamic imports are
|
|
29
|
+
// intercepted by OpenTelemetry's module instrumentation.
|
|
30
|
+
register("import-in-the-middle/hook.mjs", import.meta.url, registerOptions);
|
|
31
|
+
// Set service name before useAzureMonitor() initialises the Resource so
|
|
32
|
+
// that Azure Monitor picks it up as the cloud_RoleName.
|
|
33
|
+
process.env["OTEL_SERVICE_NAME"] = "cli";
|
|
34
|
+
process.env["OTEL_RESOURCE_ATTRIBUTES"] = [
|
|
35
|
+
process.env["OTEL_RESOURCE_ATTRIBUTES"],
|
|
36
|
+
"service.namespace=dx",
|
|
37
|
+
]
|
|
38
|
+
.filter(Boolean)
|
|
39
|
+
.join(",");
|
|
40
|
+
// os.platform() returns "win32" on Windows; the OTel os.type enum uses "windows".
|
|
41
|
+
const osPlatform = os.platform();
|
|
42
|
+
const osType = osPlatform === "win32" ? "windows" : osPlatform;
|
|
43
|
+
process.env["OTEL_RESOURCE_ATTRIBUTES"] = [
|
|
44
|
+
process.env["OTEL_RESOURCE_ATTRIBUTES"],
|
|
45
|
+
`os.type=${osType}`,
|
|
46
|
+
`os.version=${os.release()}`,
|
|
47
|
+
`os.machine=${os.machine()}`,
|
|
48
|
+
]
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
.join(",");
|
|
51
|
+
let azureMonitorEnabled = false;
|
|
52
|
+
/**
|
|
53
|
+
* Initialises the Azure Monitor exporter and registers HTTP instrumentation.
|
|
54
|
+
*
|
|
55
|
+
* Deferred (not run at preload) so the CLI only emits telemetry once it has
|
|
56
|
+
* confirmed the user is a PagoPA org member. Idempotent: safe to call more than
|
|
57
|
+
* once. Must be called before logging is configured so the logtape OTel sink
|
|
58
|
+
* binds to the real (rather than no-op) LoggerProvider.
|
|
59
|
+
*/
|
|
60
|
+
export const enableAzureMonitor = () => {
|
|
61
|
+
if (azureMonitorEnabled) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
azureMonitorEnabled = true;
|
|
65
|
+
useAzureMonitor({
|
|
66
|
+
azureMonitorExporterOptions: {
|
|
67
|
+
connectionString: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING ||
|
|
68
|
+
"InstrumentationKey=e0ff8094-78fa-45e5-a21d-e62b453dc5d1;IngestionEndpoint=https://italynorth-0.in.applicationinsights.azure.com/;LiveEndpoint=https://italynorth.livediagnostics.monitor.azure.com/;ApplicationId=ce469d55-2ff7-4dfd-a249-cc787291e672",
|
|
69
|
+
},
|
|
70
|
+
enableLiveMetrics: true,
|
|
71
|
+
});
|
|
72
|
+
// Registered after useAzureMonitor() so the instrumentation binds to the
|
|
73
|
+
// real tracer/meter providers it installs (rather than the no-op defaults).
|
|
74
|
+
registerInstrumentations({
|
|
75
|
+
instrumentations: [new UndiciInstrumentation()],
|
|
76
|
+
meterProvider: metrics.getMeterProvider(),
|
|
77
|
+
tracerProvider: trace.getTracerProvider(),
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
// Block module evaluation until the hook is fully acknowledged.
|
|
81
|
+
// This ensures that when bin/index.js proceeds to import the CLI entry
|
|
82
|
+
// module, all transitive imports go through the registered hook.
|
|
83
|
+
await waitForAllMessagesAcknowledged();
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlLW1vbml0b3IvaW5zdHJ1bWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV6QixNQUFNLEVBQUUsZUFBZSxFQUFFLDhCQUE4QixFQUFFLEdBQ3ZELDJCQUEyQixFQUFFLENBQUM7QUFFaEMsc0VBQXNFO0FBQ3RFLHlEQUF5RDtBQUN6RCxRQUFRLENBQUMsK0JBQStCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFFNUUsd0VBQXdFO0FBQ3hFLHdEQUF3RDtBQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsR0FBRztJQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZDLHNCQUFzQjtDQUN2QjtLQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFYixrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2pDLE1BQU0sTUFBTSxHQUFHLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsR0FBRztJQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZDLFdBQVcsTUFBTSxFQUFFO0lBQ25CLGNBQWMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO0lBQzVCLGNBQWMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO0NBQzdCO0tBQ0UsTUFBTSxDQUFDLE9BQU8sQ0FBQztLQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUViLElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBRWhDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFTLEVBQUU7SUFDM0MsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hCLE9BQU87SUFDVCxDQUFDO0lBQ0QsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBRTNCLGVBQWUsQ0FBQztRQUNkLDJCQUEyQixFQUFFO1lBQzNCLGdCQUFnQixFQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDO2dCQUNqRCx3UEFBd1A7U0FDM1A7UUFDRCxpQkFBaUIsRUFBRSxJQUFJO0tBQ3hCLENBQUMsQ0FBQztJQUVILHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsd0JBQXdCLENBQUM7UUFDdkIsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDL0MsYUFBYSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QyxjQUFjLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixFQUFFO0tBQzFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLGdFQUFnRTtBQUNoRSx1RUFBdUU7QUFDdkUsaUVBQWlFO0FBQ2pFLE1BQU0sOEJBQThCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT1RlbCBwcmVsb2FkIG1vZHVsZSBmb3IgdGhlIGR4IENMSS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBhIGRlbGliZXJhdGUgc2lkZS1lZmZlY3QgZW50cnlwb2ludC4gSXQgTVVTVCBiZSB0aGUgZmlyc3RcbiAqIG1vZHVsZSBsb2FkZWQgYnkgdGhlIHByb2Nlc3MgKHZpYSBhIHNlcXVlbnRpYWwgZHluYW1pYyBpbXBvcnQgaW4gYmluL2luZGV4LmpzKVxuICogc28gdGhhdCBpbXBvcnQtaW4tdGhlLW1pZGRsZSBjYW4gcmVnaXN0ZXIgaXRzIGhvb2sgYmVmb3JlIGFueSBIVFRQIGNsaWVudFxuICogbGlicmFyaWVzICh1bmRpY2kvZmV0Y2gsIG9jdG9raXQsIEF6dXJlIFNES3MpIGFyZSBsb2FkZWQuXG4gKlxuICogSW5pdGlhbGlzaW5nIHRoZSBBenVyZSBNb25pdG9yIGV4cG9ydGVyIGlzIGRlZmVycmVkIHRvIGBlbmFibGVBenVyZU1vbml0b3IoKWBcbiAqIHNvIHRoZSBDTEkgY2FuIGRlY2lkZSBhdCBydW50aW1lIHdoZXRoZXIgdG8gZW1pdCB0ZWxlbWV0cnkgKG9ubHkgUGFnb1BBIG9yZ1xuICogbWVtYmVycyBkbykuIFRoZSBpbXBvcnQtaW4tdGhlLW1pZGRsZSBob29rIGlzIHN0aWxsIHJlZ2lzdGVyZWQgZWFnZXJseSBhdFxuICogcHJlbG9hZCBiZWNhdXNlIGl0IG11c3QgcnVuIGJlZm9yZSBhbnkgaW5zdHJ1bWVudGVkIG1vZHVsZSBpcyBpbXBvcnRlZC5cbiAqXG4gKiBSZWFkcyBBUFBMSUNBVElPTklOU0lHSFRTX0NPTk5FQ1RJT05fU1RSSU5HIGZyb20gcHJvY2Vzcy5lbnYgYmVjYXVzZSB0aGlzIElTXG4gKiB0aGUgY29uZmlndXJhdGlvbiBib3VuZGFyeSDigJQgbm8gaGlnaGVyIGNhbGxlciBjYW4gaW5qZWN0IGNvbmZpZyBhdCB0aGlzIHBvaW50XG4gKiBpbiB0aGUgcHJvY2VzcyBsaWZlY3ljbGUuXG4gKi9cblxuaW1wb3J0IHsgdXNlQXp1cmVNb25pdG9yIH0gZnJvbSBcIkBhenVyZS9tb25pdG9yLW9wZW50ZWxlbWV0cnlcIjtcbmltcG9ydCB7IG1ldHJpY3MsIHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvblwiO1xuaW1wb3J0IHsgVW5kaWNpSW5zdHJ1bWVudGF0aW9uIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi11bmRpY2lcIjtcbi8vIGltcG9ydC1pbi10aGUtbWlkZGxlIGFuZCBtb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3QgaW1wb3J0cyBzbyB0aGF0XG4vLyBjcmVhdGVBZGRIb29rTWVzc2FnZUNoYW5uZWwgLyByZWdpc3RlciBydW4gYXMgZWFybHkgYXMgcG9zc2libGUuXG5pbXBvcnQgeyBjcmVhdGVBZGRIb29rTWVzc2FnZUNoYW5uZWwgfSBmcm9tIFwiaW1wb3J0LWluLXRoZS1taWRkbGVcIjtcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmNvbnN0IHsgcmVnaXN0ZXJPcHRpb25zLCB3YWl0Rm9yQWxsTWVzc2FnZXNBY2tub3dsZWRnZWQgfSA9XG4gIGNyZWF0ZUFkZEhvb2tNZXNzYWdlQ2hhbm5lbCgpO1xuXG4vLyBSZWdpc3RlciB0aGUgRVNNIG1vZHVsZSBob29rIHNvIHRoYXQgc3Vic2VxdWVudCBkeW5hbWljIGltcG9ydHMgYXJlXG4vLyBpbnRlcmNlcHRlZCBieSBPcGVuVGVsZW1ldHJ5J3MgbW9kdWxlIGluc3RydW1lbnRhdGlvbi5cbnJlZ2lzdGVyKFwiaW1wb3J0LWluLXRoZS1taWRkbGUvaG9vay5tanNcIiwgaW1wb3J0Lm1ldGEudXJsLCByZWdpc3Rlck9wdGlvbnMpO1xuXG4vLyBTZXQgc2VydmljZSBuYW1lIGJlZm9yZSB1c2VBenVyZU1vbml0b3IoKSBpbml0aWFsaXNlcyB0aGUgUmVzb3VyY2Ugc29cbi8vIHRoYXQgQXp1cmUgTW9uaXRvciBwaWNrcyBpdCB1cCBhcyB0aGUgY2xvdWRfUm9sZU5hbWUuXG5wcm9jZXNzLmVudltcIk9URUxfU0VSVklDRV9OQU1FXCJdID0gXCJjbGlcIjtcbnByb2Nlc3MuZW52W1wiT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTXCJdID0gW1xuICBwcm9jZXNzLmVudltcIk9URUxfUkVTT1VSQ0VfQVRUUklCVVRFU1wiXSxcbiAgXCJzZXJ2aWNlLm5hbWVzcGFjZT1keFwiLFxuXVxuICAuZmlsdGVyKEJvb2xlYW4pXG4gIC5qb2luKFwiLFwiKTtcblxuLy8gb3MucGxhdGZvcm0oKSByZXR1cm5zIFwid2luMzJcIiBvbiBXaW5kb3dzOyB0aGUgT1RlbCBvcy50eXBlIGVudW0gdXNlcyBcIndpbmRvd3NcIi5cbmNvbnN0IG9zUGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuY29uc3Qgb3NUeXBlID0gb3NQbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJ3aW5kb3dzXCIgOiBvc1BsYXRmb3JtO1xucHJvY2Vzcy5lbnZbXCJPVEVMX1JFU09VUkNFX0FUVFJJQlVURVNcIl0gPSBbXG4gIHByb2Nlc3MuZW52W1wiT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTXCJdLFxuICBgb3MudHlwZT0ke29zVHlwZX1gLFxuICBgb3MudmVyc2lvbj0ke29zLnJlbGVhc2UoKX1gLFxuICBgb3MubWFjaGluZT0ke29zLm1hY2hpbmUoKX1gLFxuXVxuICAuZmlsdGVyKEJvb2xlYW4pXG4gIC5qb2luKFwiLFwiKTtcblxubGV0IGF6dXJlTW9uaXRvckVuYWJsZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBJbml0aWFsaXNlcyB0aGUgQXp1cmUgTW9uaXRvciBleHBvcnRlciBhbmQgcmVnaXN0ZXJzIEhUVFAgaW5zdHJ1bWVudGF0aW9uLlxuICpcbiAqIERlZmVycmVkIChub3QgcnVuIGF0IHByZWxvYWQpIHNvIHRoZSBDTEkgb25seSBlbWl0cyB0ZWxlbWV0cnkgb25jZSBpdCBoYXNcbiAqIGNvbmZpcm1lZCB0aGUgdXNlciBpcyBhIFBhZ29QQSBvcmcgbWVtYmVyLiBJZGVtcG90ZW50OiBzYWZlIHRvIGNhbGwgbW9yZSB0aGFuXG4gKiBvbmNlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbG9nZ2luZyBpcyBjb25maWd1cmVkIHNvIHRoZSBsb2d0YXBlIE9UZWwgc2lua1xuICogYmluZHMgdG8gdGhlIHJlYWwgKHJhdGhlciB0aGFuIG5vLW9wKSBMb2dnZXJQcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZUF6dXJlTW9uaXRvciA9ICgpOiB2b2lkID0+IHtcbiAgaWYgKGF6dXJlTW9uaXRvckVuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXp1cmVNb25pdG9yRW5hYmxlZCA9IHRydWU7XG5cbiAgdXNlQXp1cmVNb25pdG9yKHtcbiAgICBhenVyZU1vbml0b3JFeHBvcnRlck9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmc6XG4gICAgICAgIHByb2Nlc3MuZW52LkFQUExJQ0FUSU9OSU5TSUdIVFNfQ09OTkVDVElPTl9TVFJJTkcgfHxcbiAgICAgICAgXCJJbnN0cnVtZW50YXRpb25LZXk9ZTBmZjgwOTQtNzhmYS00NWU1LWEyMWQtZTYyYjQ1M2RjNWQxO0luZ2VzdGlvbkVuZHBvaW50PWh0dHBzOi8vaXRhbHlub3J0aC0wLmluLmFwcGxpY2F0aW9uaW5zaWdodHMuYXp1cmUuY29tLztMaXZlRW5kcG9pbnQ9aHR0cHM6Ly9pdGFseW5vcnRoLmxpdmVkaWFnbm9zdGljcy5tb25pdG9yLmF6dXJlLmNvbS87QXBwbGljYXRpb25JZD1jZTQ2OWQ1NS0yZmY3LTRkZmQtYTI0OS1jYzc4NzI5MWU2NzJcIixcbiAgICB9LFxuICAgIGVuYWJsZUxpdmVNZXRyaWNzOiB0cnVlLFxuICB9KTtcblxuICAvLyBSZWdpc3RlcmVkIGFmdGVyIHVzZUF6dXJlTW9uaXRvcigpIHNvIHRoZSBpbnN0cnVtZW50YXRpb24gYmluZHMgdG8gdGhlXG4gIC8vIHJlYWwgdHJhY2VyL21ldGVyIHByb3ZpZGVycyBpdCBpbnN0YWxscyAocmF0aGVyIHRoYW4gdGhlIG5vLW9wIGRlZmF1bHRzKS5cbiAgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zKHtcbiAgICBpbnN0cnVtZW50YXRpb25zOiBbbmV3IFVuZGljaUluc3RydW1lbnRhdGlvbigpXSxcbiAgICBtZXRlclByb3ZpZGVyOiBtZXRyaWNzLmdldE1ldGVyUHJvdmlkZXIoKSxcbiAgICB0cmFjZXJQcm92aWRlcjogdHJhY2UuZ2V0VHJhY2VyUHJvdmlkZXIoKSxcbiAgfSk7XG59O1xuXG4vLyBCbG9jayBtb2R1bGUgZXZhbHVhdGlvbiB1bnRpbCB0aGUgaG9vayBpcyBmdWxseSBhY2tub3dsZWRnZWQuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIGJpbi9pbmRleC5qcyBwcm9jZWVkcyB0byBpbXBvcnQgdGhlIENMSSBlbnRyeVxuLy8gbW9kdWxlLCBhbGwgdHJhbnNpdGl2ZSBpbXBvcnRzIGdvIHRocm91Z2ggdGhlIHJlZ2lzdGVyZWQgaG9vay5cbmF3YWl0IHdhaXRGb3JBbGxNZXNzYWdlc0Fja25vd2xlZGdlZCgpO1xuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry helpers for the dx CLI.
|
|
3
|
+
*
|
|
4
|
+
* All functions are no-ops when the OTel SDK has not been initialised (i.e.,
|
|
5
|
+
* when telemetry is disabled or the connection string is absent).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Flush pending telemetry before the process exits.
|
|
9
|
+
*
|
|
10
|
+
* Uses shutdownAzureMonitor() which force-flushes AND shuts down every
|
|
11
|
+
* provider (traces, logs, metrics). Flushing only the logger provider is not
|
|
12
|
+
* enough: the root span ends right before the process exits, so without a
|
|
13
|
+
* trace flush it would never be exported and would not appear in the
|
|
14
|
+
* Application Insights timeline.
|
|
15
|
+
*
|
|
16
|
+
* Safe to call unconditionally — swallows all errors and is a no-op when the
|
|
17
|
+
* SDK was never initialised (telemetry disabled or no connection string).
|
|
18
|
+
*/
|
|
19
|
+
export declare const flushTelemetry: () => Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry helpers for the dx CLI.
|
|
3
|
+
*
|
|
4
|
+
* All functions are no-ops when the OTel SDK has not been initialised (i.e.,
|
|
5
|
+
* when telemetry is disabled or the connection string is absent).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Flush pending telemetry before the process exits.
|
|
9
|
+
*
|
|
10
|
+
* Uses shutdownAzureMonitor() which force-flushes AND shuts down every
|
|
11
|
+
* provider (traces, logs, metrics). Flushing only the logger provider is not
|
|
12
|
+
* enough: the root span ends right before the process exits, so without a
|
|
13
|
+
* trace flush it would never be exported and would not appear in the
|
|
14
|
+
* Application Insights timeline.
|
|
15
|
+
*
|
|
16
|
+
* Safe to call unconditionally — swallows all errors and is a no-op when the
|
|
17
|
+
* SDK was never initialised (telemetry disabled or no connection string).
|
|
18
|
+
*/
|
|
19
|
+
export const flushTelemetry = async () => {
|
|
20
|
+
try {
|
|
21
|
+
const { shutdownAzureMonitor } = await import("@azure/monitor-opentelemetry");
|
|
22
|
+
await shutdownAzureMonitor();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Telemetry must never break the CLI.
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlLW1vbml0b3IvdGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxJQUFtQixFQUFFO0lBQ3RELElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUM1QixNQUFNLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sb0JBQW9CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asc0NBQXNDO0lBQ3hDLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbGVtZXRyeSBoZWxwZXJzIGZvciB0aGUgZHggQ0xJLlxuICpcbiAqIEFsbCBmdW5jdGlvbnMgYXJlIG5vLW9wcyB3aGVuIHRoZSBPVGVsIFNESyBoYXMgbm90IGJlZW4gaW5pdGlhbGlzZWQgKGkuZS4sXG4gKiB3aGVuIHRlbGVtZXRyeSBpcyBkaXNhYmxlZCBvciB0aGUgY29ubmVjdGlvbiBzdHJpbmcgaXMgYWJzZW50KS5cbiAqL1xuXG4vKipcbiAqIEZsdXNoIHBlbmRpbmcgdGVsZW1ldHJ5IGJlZm9yZSB0aGUgcHJvY2VzcyBleGl0cy5cbiAqXG4gKiBVc2VzIHNodXRkb3duQXp1cmVNb25pdG9yKCkgd2hpY2ggZm9yY2UtZmx1c2hlcyBBTkQgc2h1dHMgZG93biBldmVyeVxuICogcHJvdmlkZXIgKHRyYWNlcywgbG9ncywgbWV0cmljcykuIEZsdXNoaW5nIG9ubHkgdGhlIGxvZ2dlciBwcm92aWRlciBpcyBub3RcbiAqIGVub3VnaDogdGhlIHJvb3Qgc3BhbiBlbmRzIHJpZ2h0IGJlZm9yZSB0aGUgcHJvY2VzcyBleGl0cywgc28gd2l0aG91dCBhXG4gKiB0cmFjZSBmbHVzaCBpdCB3b3VsZCBuZXZlciBiZSBleHBvcnRlZCBhbmQgd291bGQgbm90IGFwcGVhciBpbiB0aGVcbiAqIEFwcGxpY2F0aW9uIEluc2lnaHRzIHRpbWVsaW5lLlxuICpcbiAqIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHkg4oCUIHN3YWxsb3dzIGFsbCBlcnJvcnMgYW5kIGlzIGEgbm8tb3Agd2hlbiB0aGVcbiAqIFNESyB3YXMgbmV2ZXIgaW5pdGlhbGlzZWQgKHRlbGVtZXRyeSBkaXNhYmxlZCBvciBubyBjb25uZWN0aW9uIHN0cmluZykuXG4gKi9cbmV4cG9ydCBjb25zdCBmbHVzaFRlbGVtZXRyeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHNodXRkb3duQXp1cmVNb25pdG9yIH0gPVxuICAgICAgYXdhaXQgaW1wb3J0KFwiQGF6dXJlL21vbml0b3Itb3BlbnRlbGVtZXRyeVwiKTtcbiAgICBhd2FpdCBzaHV0ZG93bkF6dXJlTW9uaXRvcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgQ0xJLlxuICB9XG59O1xuIl19
|
|
@@ -1,20 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Add command - Scaffold new components into existing workspaces
|
|
2
|
+
* Add command - Scaffold new components into existing workspaces.
|
|
3
3
|
*
|
|
4
|
-
* This module implements the `dx add` command
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - environment: Add a new deployment environment to the project
|
|
4
|
+
* This module implements the `dx add` command and keeps the CLI-specific flag
|
|
5
|
+
* parsing/validation close to the Commander adapter. It turns supported flags
|
|
6
|
+
* into prefilled answers for the plop generator so the command can run with a
|
|
7
|
+
* mix of non-interactive inputs and guided prompts.
|
|
9
8
|
*/
|
|
10
9
|
import { Command } from "commander";
|
|
11
10
|
import { ResultAsync } from "neverthrow";
|
|
12
|
-
import
|
|
11
|
+
import { z } from "zod/v4";
|
|
12
|
+
import type { InitialAnswers as DeploymentEnvironmentInitialAnswers, Payload as EnvironmentPayload } from "../../plop/generators/environment/index.js";
|
|
13
13
|
import type { CliEnv } from "../env.js";
|
|
14
14
|
import { AuthorizationResult, AuthorizationService } from "../../../domain/authorization.js";
|
|
15
15
|
import { GitHubAuthFactory } from "../../../domain/dependencies.js";
|
|
16
|
+
declare const addEnvironmentCommandOptionsSchema: z.ZodObject<{
|
|
17
|
+
account: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
18
|
+
businessUnit: z.ZodOptional<z.ZodString>;
|
|
19
|
+
clientId: z.ZodOptional<z.ZodString>;
|
|
20
|
+
domain: z.ZodOptional<z.ZodString>;
|
|
21
|
+
installationId: z.ZodOptional<z.ZodString>;
|
|
22
|
+
location: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<{
|
|
23
|
+
accountId: string;
|
|
24
|
+
location: "italynorth" | "westeurope";
|
|
25
|
+
}, string>>>>;
|
|
26
|
+
managementTeam: z.ZodOptional<z.ZodString>;
|
|
27
|
+
name: z.ZodOptional<z.ZodEnum<{
|
|
28
|
+
dev: "dev";
|
|
29
|
+
prod: "prod";
|
|
30
|
+
uat: "uat";
|
|
31
|
+
}>>;
|
|
32
|
+
prefix: z.ZodOptional<z.ZodString>;
|
|
33
|
+
privateKeyPath: z.ZodOptional<z.ZodString>;
|
|
34
|
+
runnerAppId: z.ZodOptional<z.ZodString>;
|
|
35
|
+
yes: z.ZodOptional<z.ZodBoolean>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
export type AddEnvironmentCommandOptions = z.infer<typeof addEnvironmentCommandOptionsSchema>;
|
|
38
|
+
export declare const parseAddEnvironmentCommandOptions: (input: unknown) => AddEnvironmentCommandOptions;
|
|
39
|
+
export declare const getEnvironmentInitialAnswers: (options: AddEnvironmentCommandOptions) => Promise<DeploymentEnvironmentInitialAnswers>;
|
|
16
40
|
/**
|
|
17
41
|
* Authorize a Cloud Account (Azure Subscription, AWS Account, ...), creating a Pull Request for each account that requires authorization.
|
|
18
42
|
*/
|
|
19
43
|
export declare const authorizeCloudAccounts: (authorizationService: AuthorizationService) => (envPayload: EnvironmentPayload) => ResultAsync<AuthorizationResult[], never>;
|
|
20
44
|
export declare const makeAddCommand: (requireGitHubAuth: GitHubAuthFactory, env: CliEnv) => Command;
|
|
45
|
+
export {};
|
|
@@ -1,23 +1,180 @@
|
|
|
1
1
|
import { getLogger } from "@logtape/logtape";
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
/**
|
|
4
|
-
* Add command - Scaffold new components into existing workspaces
|
|
4
|
+
* Add command - Scaffold new components into existing workspaces.
|
|
5
5
|
*
|
|
6
|
-
* This module implements the `dx add` command
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - environment: Add a new deployment environment to the project
|
|
6
|
+
* This module implements the `dx add` command and keeps the CLI-specific flag
|
|
7
|
+
* parsing/validation close to the Commander adapter. It turns supported flags
|
|
8
|
+
* into prefilled answers for the plop generator so the command can run with a
|
|
9
|
+
* mix of non-interactive inputs and guided prompts.
|
|
11
10
|
*/
|
|
12
|
-
import { Command } from "commander";
|
|
11
|
+
import { Command, Option } from "commander";
|
|
13
12
|
import { okAsync, ResultAsync } from "neverthrow";
|
|
13
|
+
import { readFile } from "node:fs/promises";
|
|
14
|
+
import { z } from "zod/v4";
|
|
14
15
|
import { requestAuthorizationInputSchema, } from "../../../domain/authorization.js";
|
|
15
|
-
import { environmentShort } from "../../../domain/environment.js";
|
|
16
|
-
import { isAzureLocation, locationShort } from "../../azure/locations.js";
|
|
16
|
+
import { environmentSchema, environmentShort, } from "../../../domain/environment.js";
|
|
17
|
+
import { isAzureLocation, locationShort, } from "../../azure/locations.js";
|
|
18
|
+
import { workspaceSchema } from "../../plop/generators/environment/prompts.js";
|
|
17
19
|
import { collectDeploymentEnvironmentPayload, getPlopInstance, runDeploymentEnvironmentActions, } from "../../plop/index.js";
|
|
18
20
|
import { asError, reportCommandError } from "../command-errors.js";
|
|
19
21
|
import { createCommandPresenter, resolveOutputMode, } from "../presenters/index.js";
|
|
20
22
|
import { runAddEnvironmentPreconditions } from "./init.js";
|
|
23
|
+
const appendOptionValue = (value, previous = []) => [...previous, value];
|
|
24
|
+
const locationOptionSchema = z
|
|
25
|
+
.string()
|
|
26
|
+
.trim()
|
|
27
|
+
.transform((value, ctx) => {
|
|
28
|
+
const [rawAccountId, ...rawLocationParts] = value.split("=");
|
|
29
|
+
const accountId = rawAccountId?.trim();
|
|
30
|
+
const location = rawLocationParts.join("=").trim();
|
|
31
|
+
if (!accountId || rawLocationParts.length === 0 || location.length === 0) {
|
|
32
|
+
ctx.addIssue({
|
|
33
|
+
code: z.ZodIssueCode.custom,
|
|
34
|
+
message: "Location must use the format <subscription-id=region>.",
|
|
35
|
+
});
|
|
36
|
+
return z.NEVER;
|
|
37
|
+
}
|
|
38
|
+
if (!isAzureLocation(location)) {
|
|
39
|
+
ctx.addIssue({
|
|
40
|
+
code: z.ZodIssueCode.custom,
|
|
41
|
+
message: `Unsupported Azure location "${location}".`,
|
|
42
|
+
});
|
|
43
|
+
return z.NEVER;
|
|
44
|
+
}
|
|
45
|
+
return { accountId, location };
|
|
46
|
+
});
|
|
47
|
+
const addEnvironmentCommandOptionsSchema = z
|
|
48
|
+
.object({
|
|
49
|
+
account: z
|
|
50
|
+
.array(z.string().trim().min(1, "Cloud account id cannot be empty"))
|
|
51
|
+
.optional(),
|
|
52
|
+
businessUnit: z
|
|
53
|
+
.string()
|
|
54
|
+
.trim()
|
|
55
|
+
.min(1, "Business unit cannot be empty")
|
|
56
|
+
.optional(),
|
|
57
|
+
clientId: z.string().trim().min(1, "Client id cannot be empty").optional(),
|
|
58
|
+
domain: workspaceSchema.shape.domain.optional(),
|
|
59
|
+
installationId: z
|
|
60
|
+
.string()
|
|
61
|
+
.trim()
|
|
62
|
+
.min(1, "Installation id cannot be empty")
|
|
63
|
+
.optional(),
|
|
64
|
+
location: z.array(locationOptionSchema).optional(),
|
|
65
|
+
managementTeam: z
|
|
66
|
+
.string()
|
|
67
|
+
.trim()
|
|
68
|
+
.min(1, "Management team cannot be empty")
|
|
69
|
+
.optional(),
|
|
70
|
+
name: environmentSchema.shape.name.optional(),
|
|
71
|
+
prefix: environmentSchema.shape.prefix.optional(),
|
|
72
|
+
privateKeyPath: z
|
|
73
|
+
.string()
|
|
74
|
+
.trim()
|
|
75
|
+
.min(1, "Private key path cannot be empty")
|
|
76
|
+
.optional(),
|
|
77
|
+
runnerAppId: z
|
|
78
|
+
.string()
|
|
79
|
+
.trim()
|
|
80
|
+
.min(1, "Runner app id cannot be empty")
|
|
81
|
+
.optional(),
|
|
82
|
+
yes: z.boolean().optional(),
|
|
83
|
+
})
|
|
84
|
+
.superRefine((value, ctx) => {
|
|
85
|
+
if (value.location && !value.account?.length) {
|
|
86
|
+
ctx.addIssue({
|
|
87
|
+
code: z.ZodIssueCode.custom,
|
|
88
|
+
message: "Location mappings require at least one --account flag.",
|
|
89
|
+
path: ["location"],
|
|
90
|
+
});
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (value.account && value.location) {
|
|
94
|
+
const selectedAccounts = new Set(value.account);
|
|
95
|
+
for (const mapping of value.location) {
|
|
96
|
+
if (!selectedAccounts.has(mapping.accountId)) {
|
|
97
|
+
ctx.addIssue({
|
|
98
|
+
code: z.ZodIssueCode.custom,
|
|
99
|
+
message: `Location mapping references unknown account "${mapping.accountId}".`,
|
|
100
|
+
path: ["location"],
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
export const parseAddEnvironmentCommandOptions = (input) => {
|
|
107
|
+
const result = addEnvironmentCommandOptionsSchema.safeParse(input);
|
|
108
|
+
if (!result.success) {
|
|
109
|
+
throw new Error(`Invalid add environment command options:\n${z.prettifyError(result.error)}`, {
|
|
110
|
+
cause: result.error,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return result.data;
|
|
114
|
+
};
|
|
115
|
+
const buildBaseEnvironmentInitialAnswers = (options) => {
|
|
116
|
+
const env = {
|
|
117
|
+
...(options.name && { name: options.name }),
|
|
118
|
+
...(options.prefix && { prefix: options.prefix }),
|
|
119
|
+
...(options.account?.length && {
|
|
120
|
+
cloudAccountIds: Array.from(new Set(options.account)),
|
|
121
|
+
}),
|
|
122
|
+
...(options.location?.length && {
|
|
123
|
+
locations: Object.fromEntries(options.location.map(({ accountId, location }) => [
|
|
124
|
+
accountId,
|
|
125
|
+
location,
|
|
126
|
+
])),
|
|
127
|
+
}),
|
|
128
|
+
};
|
|
129
|
+
const tags = {
|
|
130
|
+
...(options.businessUnit && { BusinessUnit: options.businessUnit }),
|
|
131
|
+
...(options.managementTeam && { ManagementTeam: options.managementTeam }),
|
|
132
|
+
};
|
|
133
|
+
return {
|
|
134
|
+
...(Object.keys(env).length > 0 && { env }),
|
|
135
|
+
...(Object.keys(tags).length > 0 && { tags }),
|
|
136
|
+
...(options.domain && { workspace: { domain: options.domain } }),
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
export const getEnvironmentInitialAnswers = async (options) => {
|
|
140
|
+
const initialAnswers = buildBaseEnvironmentInitialAnswers(options);
|
|
141
|
+
const privateKey = options.privateKeyPath === undefined
|
|
142
|
+
? undefined
|
|
143
|
+
: await readFile(options.privateKeyPath, "utf8").catch((cause) => {
|
|
144
|
+
throw new Error(`Failed to read private key file at "${options.privateKeyPath}".`, { cause });
|
|
145
|
+
});
|
|
146
|
+
// Fail fast on an empty (or whitespace-only) key file: the file contents are
|
|
147
|
+
// never trimmed, so an empty value would otherwise skip the recovery prompt
|
|
148
|
+
// and surface as an opaque schema error (or a silently invalid key) later.
|
|
149
|
+
if (privateKey !== undefined && privateKey.trim().length === 0) {
|
|
150
|
+
throw new Error(`Private key file at "${options.privateKeyPath}" is empty.`);
|
|
151
|
+
}
|
|
152
|
+
// Prefill runner-app credentials only when at least one credential flag was
|
|
153
|
+
// provided. Unspecified fields stay `undefined` on purpose so the generator
|
|
154
|
+
// prompts for the missing pieces and validates the complete set later. With
|
|
155
|
+
// no credential flag at all, leave this `undefined` to keep initialization
|
|
156
|
+
// fully interactive.
|
|
157
|
+
const runnerAppCredentials = options.runnerAppId === undefined &&
|
|
158
|
+
options.clientId === undefined &&
|
|
159
|
+
options.installationId === undefined &&
|
|
160
|
+
privateKey === undefined
|
|
161
|
+
? undefined
|
|
162
|
+
: {
|
|
163
|
+
clientId: options.clientId,
|
|
164
|
+
id: options.runnerAppId,
|
|
165
|
+
installationId: options.installationId,
|
|
166
|
+
key: privateKey,
|
|
167
|
+
};
|
|
168
|
+
return {
|
|
169
|
+
...initialAnswers,
|
|
170
|
+
...((options.yes || runnerAppCredentials) && {
|
|
171
|
+
init: {
|
|
172
|
+
...(options.yes && { confirm: true }),
|
|
173
|
+
...(runnerAppCredentials && { runnerAppCredentials }),
|
|
174
|
+
},
|
|
175
|
+
}),
|
|
176
|
+
};
|
|
177
|
+
};
|
|
21
178
|
/**
|
|
22
179
|
* Authorize a Cloud Account (Azure Subscription, AWS Account, ...), creating a Pull Request for each account that requires authorization.
|
|
23
180
|
*/
|
|
@@ -88,27 +245,52 @@ const reportSummary = (presenter, outputMode) => (result) => {
|
|
|
88
245
|
}
|
|
89
246
|
};
|
|
90
247
|
const trackStep = (presenter, name, task, mapError) => ResultAsync.fromPromise(presenter.trackStep(name, task), mapError);
|
|
91
|
-
const addEnvironmentAction = (authorizationService, gitHubService, presenter) => runAddEnvironmentPreconditions(presenter)
|
|
248
|
+
const addEnvironmentAction = (authorizationService, gitHubService, presenter, initialAnswers = {}) => runAddEnvironmentPreconditions(presenter)
|
|
92
249
|
.andThen(() => trackStep(presenter, "Initializing environment generator...", getPlopInstance, asError("Failed to initialize plop")))
|
|
93
250
|
.andThen((plop) =>
|
|
94
251
|
// The prompt phase must run outside trackStep: in text mode trackStep
|
|
95
252
|
// renders a spinner that occupies the TTY and hides the prompts.
|
|
96
|
-
ResultAsync.fromPromise(collectDeploymentEnvironmentPayload(plop, gitHubService), asError("Failed to run the deployment environment generator")))
|
|
253
|
+
ResultAsync.fromPromise(collectDeploymentEnvironmentPayload(plop, gitHubService, undefined, initialAnswers), asError("Failed to run the deployment environment generator")))
|
|
97
254
|
.andThen(({ generator, payload }) => trackStep(presenter, "Creating environment...", () => runDeploymentEnvironmentActions(generator, payload), asError("Failed to create the deployment environment")))
|
|
98
255
|
.andThen((payload) => authorizeCloudAccounts(authorizationService)(payload).map((authorizationPrs) => ({
|
|
99
256
|
authorizationPrs,
|
|
257
|
+
payload,
|
|
100
258
|
})));
|
|
101
259
|
export const makeAddCommand = (requireGitHubAuth, env) => new Command()
|
|
102
260
|
.name("add")
|
|
103
261
|
.description("Add a new component to your workspace")
|
|
104
262
|
.addCommand(new Command("environment")
|
|
105
263
|
.description("Add a new deployment environment")
|
|
106
|
-
.
|
|
264
|
+
.addOption(new Option("--name <name>", "Environment name").choices([
|
|
265
|
+
"dev",
|
|
266
|
+
"uat",
|
|
267
|
+
"prod",
|
|
268
|
+
]))
|
|
269
|
+
.addOption(new Option("--account <subscription-id>", "Cloud account subscription id").argParser(appendOptionValue))
|
|
270
|
+
.addOption(new Option("--location <subscription-id=region>", "Default Azure location for a selected account").argParser(appendOptionValue))
|
|
271
|
+
.addOption(new Option("--prefix <prefix>", "Environment prefix"))
|
|
272
|
+
.addOption(new Option("--domain <domain>", "Workspace domain"))
|
|
273
|
+
.addOption(new Option("--business-unit <business-unit>", "Business unit tag"))
|
|
274
|
+
.addOption(new Option("--management-team <management-team>", "Management team tag"))
|
|
275
|
+
.addOption(new Option("-y, --yes", "Confirm environment initialization without prompting"))
|
|
276
|
+
.addOption(new Option("--runner-app-id <runner-app-id>", "GitHub Runner App ID"))
|
|
277
|
+
.addOption(new Option("--client-id <client-id>", "GitHub Runner App Client ID"))
|
|
278
|
+
.addOption(new Option("--installation-id <installation-id>", "GitHub Runner App Installation ID"))
|
|
279
|
+
.addOption(new Option("--private-key-path <private-key-path>", "Path to a local GitHub Runner App private key file"))
|
|
280
|
+
.action(async function (options) {
|
|
107
281
|
const { output } = this.optsWithGlobals();
|
|
108
282
|
const outputMode = resolveOutputMode(env, output);
|
|
109
283
|
const presenter = createCommandPresenter(outputMode);
|
|
110
|
-
await
|
|
111
|
-
|
|
284
|
+
await ResultAsync.fromPromise(Promise.resolve().then(() => parseAddEnvironmentCommandOptions(options)), (cause) => cause instanceof Error
|
|
285
|
+
? cause
|
|
286
|
+
: new Error("Failed to parse add environment command options", {
|
|
287
|
+
cause,
|
|
288
|
+
}))
|
|
289
|
+
.andThen((addEnvironmentOptions) => ResultAsync.fromPromise(getEnvironmentInitialAnswers(addEnvironmentOptions), (cause) => cause instanceof Error
|
|
290
|
+
? cause
|
|
291
|
+
: new Error("Failed to load add environment initial answers", {
|
|
292
|
+
cause,
|
|
293
|
+
})).andThen((initialAnswers) => requireGitHubAuth().andThen(({ authorizationService, gitHubService }) => addEnvironmentAction(authorizationService, gitHubService, presenter, initialAnswers))))
|
|
112
294
|
.match(reportSummary(presenter, outputMode), reportCommandError(this, presenter, outputMode));
|
|
113
295
|
}));
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9hZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQjs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFPbEQsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUUsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxlQUFlLEVBQ2YsK0JBQStCLEdBQ2hDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTNEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQ2pDLENBQUMsb0JBQTBDLEVBQUUsRUFBRSxDQUMvQyxDQUNFLFVBQThCLEVBQ2EsRUFBRTtJQUM3QyxNQUFNLG9CQUFvQixHQUN4QixVQUFVLENBQUMsSUFBSSxFQUFFLHlCQUF5QixJQUFJLEVBQUUsQ0FBQztJQUVuRCxJQUFJLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxP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QWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXJELE1BQU0saUJBQWlCLEVBQUU7U0FDdEIsT0FBTyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQ25ELG9CQUFvQixDQUNsQixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLFNBQVMsQ0FDVixDQUNGO1NBQ0EsS0FBSyxDQUNKLGFBQWEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQ3BDLGtCQUFrQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQ2hELENBQUM7QUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbi8qKlxuICogQWRkIGNvbW1hbmQgLSBTY2FmZm9sZCBuZXcgY29tcG9uZW50cyBpbnRvIGV4aXN0aW5nIHdvcmtzcGFjZXNcbiAqXG4gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBgZHggYWRkYCBjb21tYW5kIHdoaWNoIGFsbG93cyBkZXZlbG9wZXJzIHRvIHNjYWZmb2xkXG4gKiBuZXcgY29tcG9uZW50cyBpbnRvIHRoZWlyIGV4aXN0aW5nIHdvcmtzcGFjZSBmb2xsb3dpbmcgRGV2RXggZ3VpZGVsaW5lcy5cbiAqXG4gKiBDdXJyZW50bHkgc3VwcG9ydGVkIGNvbXBvbmVudHM6XG4gKiAtIGVudmlyb25tZW50OiBBZGQgYSBuZXcgZGVwbG95bWVudCBlbnZpcm9ubWVudCB0byB0aGUgcHJvamVjdFxuICovXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRQcmVzZW50ZXIgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2NvbW1hbmQtcHJlc2VudGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgYXMgRW52aXJvbm1lbnRQYXlsb2FkIH0gZnJvbSBcIi4uLy4uL3Bsb3AvZ2VuZXJhdG9ycy9lbnZpcm9ubWVudC9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGlFbnYgfSBmcm9tIFwiLi4vZW52LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdsb2JhbE9wdGlvbnMgfSBmcm9tIFwiLi4vZ2xvYmFsLW9wdGlvbnMuanNcIjtcblxuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblJlc3VsdCxcbiAgQXV0aG9yaXphdGlvblNlcnZpY2UsXG4gIHJlcXVlc3RBdXRob3JpemF0aW9uSW5wdXRTY2hlbWEsXG59IGZyb20gXCIuLi8uLi8uLi9kb21haW4vYXV0aG9yaXphdGlvbi5qc1wiO1xuaW1wb3J0IHsgR2l0SHViQXV0aEZhY3RvcnkgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RlcGVuZGVuY2llcy5qc1wiO1xuaW1wb3J0IHsgZW52aXJvbm1lbnRTaG9ydCB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZW52aXJvbm1lbnQuanNcIjtcbmltcG9ydCB7IHR5cGUgR2l0SHViU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5pbXBvcnQgeyBpc0F6dXJlTG9jYXRpb24sIGxvY2F0aW9uU2hvcnQgfSBmcm9tIFwiLi4vLi4vYXp1cmUvbG9jYXRpb25zLmpzXCI7XG5pbXBvcnQge1xuICBjb2xsZWN0RGVwbG95bWVudEVudmlyb25tZW50UGF5bG9hZCxcbiAgZ2V0UGxvcEluc3RhbmNlLFxuICBydW5EZXBsb3ltZW50RW52aXJvbm1lbnRBY3Rpb25zLFxufSBmcm9tIFwiLi4vLi4vcGxvcC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYXNFcnJvciwgcmVwb3J0Q29tbWFuZEVycm9yIH0gZnJvbSBcIi4uL2NvbW1hbmQtZXJyb3JzLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVDb21tYW5kUHJlc2VudGVyLFxuICByZXNvbHZlT3V0cHV0TW9kZSxcbn0gZnJvbSBcIi4uL3ByZXNlbnRlcnMvaW5kZXguanNcIjtcbmltcG9ydCB7IHJ1bkFkZEVudmlyb25tZW50UHJlY29uZGl0aW9ucyB9IGZyb20gXCIuL2luaXQuanNcIjtcblxuLyoqXG4gKiBBdXRob3JpemUgYSBDbG91ZCBBY2NvdW50IChBenVyZSBTdWJzY3JpcHRpb24sIEFXUyBBY2NvdW50LCAuLi4pLCBjcmVhdGluZyBhIFB1bGwgUmVxdWVzdCBmb3IgZWFjaCBhY2NvdW50IHRoYXQgcmVxdWlyZXMgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhvcml6ZUNsb3VkQWNjb3VudHMgPVxuICAoYXV0aG9yaXphdGlvblNlcnZpY2U6IEF1dGhvcml6YXRpb25TZXJ2aWNlKSA9PlxuICAoXG4gICAgZW52UGF5bG9hZDogRW52aXJvbm1lbnRQYXlsb2FkLFxuICApOiBSZXN1bHRBc3luYzxBdXRob3JpemF0aW9uUmVzdWx0W10sIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgYWNjb3VudHNUb0luaXRpYWxpemUgPVxuICAgICAgZW52UGF5bG9hZC5pbml0Py5jbG91ZEFjY291bnRzVG9Jbml0aWFsaXplID8/IFtdO1xuXG4gICAgaWYgKGFjY291bnRzVG9Jbml0aWFsaXplLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9rQXN5bmMoW10pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJkeC1jbGlcIiwgXCJhZGQtZW52aXJvbm1lbnRcIl0pO1xuICAgIGNvbnN0IHsgbmFtZSwgcHJlZml4IH0gPSBlbnZQYXlsb2FkLmVudjtcbiAgICBjb25zdCBlbnZTaG9ydCA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG5cbiAgICBjb25zdCByZXF1ZXN0QWxsID0gYXN5bmMgKCk6IFByb21pc2U8QXV0aG9yaXphdGlvblJlc3VsdFtdPiA9PiB7XG4gICAgICBjb25zdCByZXN1bHRzOiBBdXRob3JpemF0aW9uUmVzdWx0W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzVG9Jbml0aWFsaXplKSB7XG4gICAgICAgIGlmICghaXNBenVyZUxvY2F0aW9uKGFjY291bnQuZGVmYXVsdExvY2F0aW9uKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgXCJTa2lwcGluZyBhdXRob3JpemF0aW9uIGZvciB7YWNjb3VudH06IHVuc3VwcG9ydGVkIGxvY2F0aW9uXCIsXG4gICAgICAgICAgICB7IGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jU2hvcnQgPSBsb2NhdGlvblNob3J0W2FjY291bnQuZGVmYXVsdExvY2F0aW9uXTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSByZXF1ZXN0QXV0aG9yaXphdGlvbklucHV0U2NoZW1hLnNhZmVQYXJzZSh7XG4gICAgICAgICAgYm9vdHN0cmFwSWRlbnRpdHlJZDogYCR7cHJlZml4fS0ke2VudlNob3J0fS0ke2xvY1Nob3J0fS1ib290c3RyYXAtaWQtMDFgLFxuICAgICAgICAgIGVudlNob3J0LFxuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICByZXBvTmFtZTogZW52UGF5bG9hZC5naXRodWIucmVwbyxcbiAgICAgICAgICByZXBvT3duZXI6IGVudlBheWxvYWQuZ2l0aHViLm93bmVyLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbk5hbWU6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghaW5wdXQuc3VjY2Vzcykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwiU2tpcHBpbmcgYXV0aG9yaXphdGlvbiBmb3Ige2FjY291bnR9OiBpbnZhbGlkIGlucHV0XCIsIHtcbiAgICAgICAgICAgIGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRob3JpemF0aW9uU2VydmljZS5yZXF1ZXN0QXV0aG9yaXphdGlvbihcbiAgICAgICAgICBpbnB1dC5kYXRhLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlc3VsdC5tYXRjaChcbiAgICAgICAgICAoYXV0aFJlc3VsdCkgPT4gcmVzdWx0cy5wdXNoKGF1dGhSZXN1bHQpLFxuICAgICAgICAgIChlcnJvcikgPT5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQXV0aG9yaXphdGlvbiByZXF1ZXN0IGZhaWxlZCBmb3Ige2FjY291bnR9OiB7ZXJyb3J9XCIsIHtcbiAgICAgICAgICAgICAgYWNjb3VudDogYWNjb3VudC5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShyZXF1ZXN0QWxsKCksICgpID0+IFtdKS5vckVsc2UoKCkgPT5cbiAgICAgIG9rQXN5bmMoW10pLFxuICAgICk7XG4gIH07XG5cbnR5cGUgQWRkUmVzdWx0ID0ge1xuICBhdXRob3JpemF0aW9uUHJzOiBBdXRob3JpemF0aW9uUmVzdWx0W107XG59O1xuXG5jb25zdCBkaXNwbGF5U3VtbWFyeSA9IChyZXN1bHQ6IEFkZFJlc3VsdCkgPT4ge1xuICBjb25zdCB7IGF1dGhvcml6YXRpb25QcnMgfSA9IHJlc3VsdDtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZChcIlxcbkNsb3VkIGVudmlyb25tZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVwiKSk7XG5cbiAgbGV0IHN0ZXAgPSAxO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKFwiXFxuTmV4dCBTdGVwczpcIikpO1xuICBjb25zdCBwcnNXaXRoVXJsID0gYXV0aG9yaXphdGlvblBycy5maWx0ZXIoXG4gICAgKHByKTogcHIgaXMgQXV0aG9yaXphdGlvblJlc3VsdCAmIHsgdXJsOiBzdHJpbmcgfSA9PiBwci51cmwgIT0gbnVsbCxcbiAgKTtcbiAgaWYgKHByc1dpdGhVcmwubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGAke3N0ZXArK30uIFJldmlldyB0aGUgQXp1cmUgYXV0aG9yaXphdGlvbiBQdWxsIFJlcXVlc3Qocyk6YCk7XG4gICAgZm9yIChjb25zdCBhdXRoUHIgb2YgcHJzV2l0aFVybCkge1xuICAgICAgY29uc29sZS5sb2coYCAgIC0gJHtjaGFsay51bmRlcmxpbmUoYXV0aFByLnVybCl9YCk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUubG9nKFxuICAgIGAke3N0ZXB9LiBWaXNpdCAke2NoYWxrLnVuZGVybGluZShcImh0dHBzOi8vZHgucGFnb3BhLml0L2dldHRpbmctc3RhcnRlZFwiKX0gdG8gZGVwbG95IHlvdXIgZmlyc3QgcHJvamVjdFxcbmAsXG4gICk7XG59O1xuXG4vKipcbiAqIFJvdXRlcyB0aGUgc3VjY2Vzc2Z1bCBvdXRjb21lIHRocm91Z2ggdGhlIHByZXNlbnRlcjogSlNPTiBtb2RlIGVtaXRzIHRoZVxuICogc3RydWN0dXJlZCBlbnZlbG9wZSB3aGlsZSB0ZXh0IG1vZGUgcmVuZGVycyB0aGUgaHVtYW4tcmVhZGFibGUgc3VtbWFyeS5cbiAqL1xuY29uc3QgcmVwb3J0U3VtbWFyeSA9XG4gIChwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIsIG91dHB1dE1vZGU6IFwianNvblwiIHwgXCJ0ZXh0XCIpID0+XG4gIChyZXN1bHQ6IEFkZFJlc3VsdCk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRNb2RlID09PSBcImpzb25cIikge1xuICAgICAgcHJlc2VudGVyLnJlcG9ydFJlc3VsdChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNwbGF5U3VtbWFyeShyZXN1bHQpO1xuICAgIH1cbiAgfTtcblxuY29uc3QgdHJhY2tTdGVwID0gPFQsIEU+KFxuICBwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIsXG4gIG5hbWU6IHN0cmluZyxcbiAgdGFzazogKCkgPT4gUHJvbWlzZTxUPixcbiAgbWFwRXJyb3I6IChjYXVzZTogdW5rbm93bikgPT4gRSxcbik6IFJlc3VsdEFzeW5jPFQsIEU+ID0+XG4gIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKHByZXNlbnRlci50cmFja1N0ZXAobmFtZSwgdGFzayksIG1hcEVycm9yKTtcblxuY29uc3QgYWRkRW52aXJvbm1lbnRBY3Rpb24gPSAoXG4gIGF1dGhvcml6YXRpb25TZXJ2aWNlOiBBdXRob3JpemF0aW9uU2VydmljZSxcbiAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZSxcbiAgcHJlc2VudGVyOiBDb21tYW5kUHJlc2VudGVyLFxuKTogUmVzdWx0QXN5bmM8QWRkUmVzdWx0LCBFcnJvcj4gPT5cbiAgcnVuQWRkRW52aXJvbm1lbnRQcmVjb25kaXRpb25zKHByZXNlbnRlcilcbiAgICAuYW5kVGhlbigoKSA9PlxuICAgICAgdHJhY2tTdGVwKFxuICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgIFwiSW5pdGlhbGl6aW5nIGVudmlyb25tZW50IGdlbmVyYXRvci4uLlwiLFxuICAgICAgICBnZXRQbG9wSW5zdGFuY2UsXG4gICAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwbG9wXCIpLFxuICAgICAgKSxcbiAgICApXG4gICAgLmFuZFRoZW4oKHBsb3ApID0+XG4gICAgICAvLyBUaGUgcHJvbXB0IHBoYXNlIG11c3QgcnVuIG91dHNpZGUgdHJhY2tTdGVwOiBpbiB0ZXh0IG1vZGUgdHJhY2tTdGVwXG4gICAgICAvLyByZW5kZXJzIGEgc3Bpbm5lciB0aGF0IG9jY3VwaWVzIHRoZSBUVFkgYW5kIGhpZGVzIHRoZSBwcm9tcHRzLlxuICAgICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIGNvbGxlY3REZXBsb3ltZW50RW52aXJvbm1lbnRQYXlsb2FkKHBsb3AsIGdpdEh1YlNlcnZpY2UpLFxuICAgICAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIHJ1biB0aGUgZGVwbG95bWVudCBlbnZpcm9ubWVudCBnZW5lcmF0b3JcIiksXG4gICAgICApLFxuICAgIClcbiAgICAuYW5kVGhlbigoeyBnZW5lcmF0b3IsIHBheWxvYWQgfSkgPT5cbiAgICAgIHRyYWNrU3RlcChcbiAgICAgICAgcHJlc2VudGVyLFxuICAgICAgICBcIkNyZWF0aW5nIGVudmlyb25tZW50Li4uXCIsXG4gICAgICAgICgpID0+IHJ1bkRlcGxveW1lbnRFbnZpcm9ubWVudEFjdGlvbnMoZ2VuZXJhdG9yLCBwYXlsb2FkKSxcbiAgICAgICAgYXNFcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgdGhlIGRlcGxveW1lbnQgZW52aXJvbm1lbnRcIiksXG4gICAgICApLFxuICAgIClcbiAgICAuYW5kVGhlbigocGF5bG9hZCkgPT5cbiAgICAgIGF1dGhvcml6ZUNsb3VkQWNjb3VudHMoYXV0aG9yaXphdGlvblNlcnZpY2UpKHBheWxvYWQpLm1hcChcbiAgICAgICAgKGF1dGhvcml6YXRpb25QcnMpID0+ICh7XG4gICAgICAgICAgYXV0aG9yaXphdGlvblBycyxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG5cbmV4cG9ydCBjb25zdCBtYWtlQWRkQ29tbWFuZCA9IChcbiAgcmVxdWlyZUdpdEh1YkF1dGg6IEdpdEh1YkF1dGhGYWN0b3J5LFxuICBlbnY6IENsaUVudixcbik6IENvbW1hbmQgPT5cbiAgbmV3IENvbW1hbmQoKVxuICAgIC5uYW1lKFwiYWRkXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQWRkIGEgbmV3IGNvbXBvbmVudCB0byB5b3VyIHdvcmtzcGFjZVwiKVxuICAgIC5hZGRDb21tYW5kKFxuICAgICAgbmV3IENvbW1hbmQoXCJlbnZpcm9ubWVudFwiKVxuICAgICAgICAuZGVzY3JpcHRpb24oXCJBZGQgYSBuZXcgZGVwbG95bWVudCBlbnZpcm9ubWVudFwiKVxuICAgICAgICAuYWN0aW9uKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgICAgICBjb25zdCBvdXRwdXRNb2RlID0gcmVzb2x2ZU91dHB1dE1vZGUoZW52LCBvdXRwdXQpO1xuICAgICAgICAgIGNvbnN0IHByZXNlbnRlciA9IGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIob3V0cHV0TW9kZSk7XG5cbiAgICAgICAgICBhd2FpdCByZXF1aXJlR2l0SHViQXV0aCgpXG4gICAgICAgICAgICAuYW5kVGhlbigoeyBhdXRob3JpemF0aW9uU2VydmljZSwgZ2l0SHViU2VydmljZSB9KSA9PlxuICAgICAgICAgICAgICBhZGRFbnZpcm9ubWVudEFjdGlvbihcbiAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXRjaChcbiAgICAgICAgICAgICAgcmVwb3J0U3VtbWFyeShwcmVzZW50ZXIsIG91dHB1dE1vZGUpLFxuICAgICAgICAgICAgICByZXBvcnRDb21tYW5kRXJyb3IodGhpcywgcHJlc2VudGVyLCBvdXRwdXRNb2RlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICk7XG4iXX0=
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9hZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQjs7Ozs7OztHQU9HO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFVM0IsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBQ2pCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUVMLGVBQWUsRUFDZixhQUFhLEdBQ2QsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDL0UsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxlQUFlLEVBQ2YsK0JBQStCLEdBQ2hDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTNELE1BQU0saUJBQWlCLEdBQUcsQ0FDeEIsS0FBYSxFQUNiLFdBQXFCLEVBQUUsRUFDYixFQUFFLENBQUMs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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuLyoqXG4gKiBBZGQgY29tbWFuZCAtIFNjYWZmb2xkIG5ldyBjb21wb25lbnRzIGludG8gZXhpc3Rpbmcgd29ya3NwYWNlcy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBgZHggYWRkYCBjb21tYW5kIGFuZCBrZWVwcyB0aGUgQ0xJLXNwZWNpZmljIGZsYWdcbiAqIHBhcnNpbmcvdmFsaWRhdGlvbiBjbG9zZSB0byB0aGUgQ29tbWFuZGVyIGFkYXB0ZXIuIEl0IHR1cm5zIHN1cHBvcnRlZCBmbGFnc1xuICogaW50byBwcmVmaWxsZWQgYW5zd2VycyBmb3IgdGhlIHBsb3AgZ2VuZXJhdG9yIHNvIHRoZSBjb21tYW5kIGNhbiBydW4gd2l0aCBhXG4gKiBtaXggb2Ygbm9uLWludGVyYWN0aXZlIGlucHV0cyBhbmQgZ3VpZGVkIHByb21wdHMuXG4gKi9cbmltcG9ydCB7IENvbW1hbmQsIE9wdGlvbiB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IG9rQXN5bmMsIFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kL3Y0XCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZFByZXNlbnRlciB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vY29tbWFuZC1wcmVzZW50ZXIuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgSW5pdGlhbEFuc3dlcnMgYXMgRGVwbG95bWVudEVudmlyb25tZW50SW5pdGlhbEFuc3dlcnMsXG4gIFBheWxvYWQgYXMgRW52aXJvbm1lbnRQYXlsb2FkLFxufSBmcm9tIFwiLi4vLi4vcGxvcC9nZW5lcmF0b3JzL2Vudmlyb25tZW50L2luZGV4LmpzXCI7XG5pbXBvcnQgdHlwZSB7IENsaUVudiB9IGZyb20gXCIuLi9lbnYuanNcIjtcbmltcG9ydCB0eXBlIHsgR2xvYmFsT3B0aW9ucyB9IGZyb20gXCIuLi9nbG9iYWwtb3B0aW9ucy5qc1wiO1xuXG5pbXBvcnQge1xuICBBdXRob3JpemF0aW9uUmVzdWx0LFxuICBBdXRob3JpemF0aW9uU2VydmljZSxcbiAgcmVxdWVzdEF1dGhvcml6YXRpb25JbnB1dFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9hdXRob3JpemF0aW9uLmpzXCI7XG5pbXBvcnQgeyBHaXRIdWJBdXRoRmFjdG9yeSB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZGVwZW5kZW5jaWVzLmpzXCI7XG5pbXBvcnQge1xuICBlbnZpcm9ubWVudFNjaGVtYSxcbiAgZW52aXJvbm1lbnRTaG9ydCxcbn0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9lbnZpcm9ubWVudC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBHaXRIdWJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9naXRodWIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQXp1cmVMb2NhdGlvbixcbiAgaXNBenVyZUxvY2F0aW9uLFxuICBsb2NhdGlvblNob3J0LFxufSBmcm9tIFwiLi4vLi4vYXp1cmUvbG9jYXRpb25zLmpzXCI7XG5pbXBvcnQgeyB3b3Jrc3BhY2VTY2hlbWEgfSBmcm9tIFwiLi4vLi4vcGxvcC9nZW5lcmF0b3JzL2Vudmlyb25tZW50L3Byb21wdHMuanNcIjtcbmltcG9ydCB7XG4gIGNvbGxlY3REZXBsb3ltZW50RW52aXJvbm1lbnRQYXlsb2FkLFxuICBnZXRQbG9wSW5zdGFuY2UsXG4gIHJ1bkRlcGxveW1lbnRFbnZpcm9ubWVudEFjdGlvbnMsXG59IGZyb20gXCIuLi8uLi9wbG9wL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBhc0Vycm9yLCByZXBvcnRDb21tYW5kRXJyb3IgfSBmcm9tIFwiLi4vY29tbWFuZC1lcnJvcnMuanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUNvbW1hbmRQcmVzZW50ZXIsXG4gIHJlc29sdmVPdXRwdXRNb2RlLFxufSBmcm9tIFwiLi4vcHJlc2VudGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgcnVuQWRkRW52aXJvbm1lbnRQcmVjb25kaXRpb25zIH0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuXG5jb25zdCBhcHBlbmRPcHRpb25WYWx1ZSA9IChcbiAgdmFsdWU6IHN0cmluZyxcbiAgcHJldmlvdXM6IHN0cmluZ1tdID0gW10sXG4pOiBzdHJpbmdbXSA9PiBbLi4ucHJldmlvdXMsIHZhbHVlXTtcblxuY29uc3QgbG9jYXRpb25PcHRpb25TY2hlbWEgPSB6XG4gIC5zdHJpbmcoKVxuICAudHJpbSgpXG4gIC50cmFuc2Zvcm0oKHZhbHVlLCBjdHgpID0+IHtcbiAgICBjb25zdCBbcmF3QWNjb3VudElkLCAuLi5yYXdMb2NhdGlvblBhcnRzXSA9IHZhbHVlLnNwbGl0KFwiPVwiKTtcbiAgICBjb25zdCBhY2NvdW50SWQgPSByYXdBY2NvdW50SWQ/LnRyaW0oKTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHJhd0xvY2F0aW9uUGFydHMuam9pbihcIj1cIikudHJpbSgpO1xuXG4gICAgaWYgKCFhY2NvdW50SWQgfHwgcmF3TG9jYXRpb25QYXJ0cy5sZW5ndGggPT09IDAgfHwgbG9jYXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgIG1lc3NhZ2U6IFwiTG9jYXRpb24gbXVzdCB1c2UgdGhlIGZvcm1hdCA8c3Vic2NyaXB0aW9uLWlkPXJlZ2lvbj4uXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgIH1cblxuICAgIGlmICghaXNBenVyZUxvY2F0aW9uKGxvY2F0aW9uKSkge1xuICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICBtZXNzYWdlOiBgVW5zdXBwb3J0ZWQgQXp1cmUgbG9jYXRpb24gXCIke2xvY2F0aW9ufVwiLmAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgIH1cblxuICAgIHJldHVybiB7IGFjY291bnRJZCwgbG9jYXRpb24gfTtcbiAgfSk7XG5cbmNvbnN0IGFkZEVudmlyb25tZW50Q29tbWFuZE9wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGFjY291bnQ6IHpcbiAgICAgIC5hcnJheSh6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgXCJDbG91ZCBhY2NvdW50IGlkIGNhbm5vdCBiZSBlbXB0eVwiKSlcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIGJ1c2luZXNzVW5pdDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgICAubWluKDEsIFwiQnVzaW5lc3MgdW5pdCBjYW5ub3QgYmUgZW1wdHlcIilcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIGNsaWVudElkOiB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgXCJDbGllbnQgaWQgY2Fubm90IGJlIGVtcHR5XCIpLm9wdGlvbmFsKCksXG4gICAgZG9tYWluOiB3b3Jrc3BhY2VTY2hlbWEuc2hhcGUuZG9tYWluLm9wdGlvbmFsKCksXG4gICAgaW5zdGFsbGF0aW9uSWQ6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgICAgLm1pbigxLCBcIkluc3RhbGxhdGlvbiBpZCBjYW5ub3QgYmUgZW1wdHlcIilcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIGxvY2F0aW9uOiB6LmFycmF5KGxvY2F0aW9uT3B0aW9uU2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIG1hbmFnZW1lbnRUZWFtOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5taW4oMSwgXCJNYW5hZ2VtZW50IHRlYW0gY2Fubm90IGJlIGVtcHR5XCIpXG4gICAgICAub3B0aW9uYWwoKSxcbiAgICBuYW1lOiBlbnZpcm9ubWVudFNjaGVtYS5zaGFwZS5uYW1lLm9wdGlvbmFsKCksXG4gICAgcHJlZml4OiBlbnZpcm9ubWVudFNjaGVtYS5zaGFwZS5wcmVmaXgub3B0aW9uYWwoKSxcbiAgICBwcml2YXRlS2V5UGF0aDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgICAubWluKDEsIFwiUHJpdmF0ZSBrZXkgcGF0aCBjYW5ub3QgYmUgZW1wdHlcIilcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIHJ1bm5lckFwcElkOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5taW4oMSwgXCJSdW5uZXIgYXBwIGlkIGNhbm5vdCBiZSBlbXB0eVwiKVxuICAgICAgLm9wdGlvbmFsKCksXG4gICAgeWVzOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3VwZXJSZWZpbmUoKHZhbHVlLCBjdHgpID0+IHtcbiAgICBpZiAodmFsdWUubG9jYXRpb24gJiYgIXZhbHVlLmFjY291bnQ/Lmxlbmd0aCkge1xuICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICBtZXNzYWdlOiBcIkxvY2F0aW9uIG1hcHBpbmdzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIC0tYWNjb3VudCBmbGFnLlwiLFxuICAgICAgICBwYXRoOiBbXCJsb2NhdGlvblwiXSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5hY2NvdW50ICYmIHZhbHVlLmxvY2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEFjY291bnRzID0gbmV3IFNldCh2YWx1ZS5hY2NvdW50KTtcbiAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiB2YWx1ZS5sb2NhdGlvbikge1xuICAgICAgICBpZiAoIXNlbGVjdGVkQWNjb3VudHMuaGFzKG1hcHBpbmcuYWNjb3VudElkKSkge1xuICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICBtZXNzYWdlOiBgTG9jYXRpb24gbWFwcGluZyByZWZlcmVuY2VzIHVua25vd24gYWNjb3VudCBcIiR7bWFwcGluZy5hY2NvdW50SWR9XCIuYCxcbiAgICAgICAgICAgIHBhdGg6IFtcImxvY2F0aW9uXCJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuZXhwb3J0IHR5cGUgQWRkRW52aXJvbm1lbnRDb21tYW5kT3B0aW9ucyA9IHouaW5mZXI8XG4gIHR5cGVvZiBhZGRFbnZpcm9ubWVudENvbW1hbmRPcHRpb25zU2NoZW1hXG4+O1xuXG5leHBvcnQgY29uc3QgcGFyc2VBZGRFbnZpcm9ubWVudENvbW1hbmRPcHRpb25zID0gKFxuICBpbnB1dDogdW5rbm93bixcbik6IEFkZEVudmlyb25tZW50Q29tbWFuZE9wdGlvbnMgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhZGRFbnZpcm9ubWVudENvbW1hbmRPcHRpb25zU2NoZW1hLnNhZmVQYXJzZShpbnB1dCk7XG4gIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBhZGQgZW52aXJvbm1lbnQgY29tbWFuZCBvcHRpb25zOlxcbiR7ei5wcmV0dGlmeUVycm9yKHJlc3VsdC5lcnJvcil9YCxcbiAgICAgIHtcbiAgICAgICAgY2F1c2U6IHJlc3VsdC5lcnJvcixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQuZGF0YTtcbn07XG5cbmNvbnN0IGJ1aWxkQmFzZUVudmlyb25tZW50SW5pdGlhbEFuc3dlcnMgPSAoXG4gIG9wdGlvbnM6IEFkZEVudmlyb25tZW50Q29tbWFuZE9wdGlvbnMsXG4pOiBEZXBsb3ltZW50RW52aXJvbm1lbnRJbml0aWFsQW5zd2VycyA9PiB7XG4gIGNvbnN0IGVudiA9IHtcbiAgICAuLi4ob3B0aW9ucy5uYW1lICYmIHsgbmFtZTogb3B0aW9ucy5uYW1lIH0pLFxuICAgIC4uLihvcHRpb25zLnByZWZpeCAmJiB7IHByZWZpeDogb3B0aW9ucy5wcmVmaXggfSksXG4gICAgLi4uKG9wdGlvbnMuYWNjb3VudD8ubGVuZ3RoICYmIHtcbiAgICAgIGNsb3VkQWNjb3VudElkczogQXJyYXkuZnJvbShuZXcgU2V0KG9wdGlvbnMuYWNjb3VudCkpLFxuICAgIH0pLFxuICAgIC4uLihvcHRpb25zLmxvY2F0aW9uPy5sZW5ndGggJiYge1xuICAgICAgbG9jYXRpb25zOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIG9wdGlvbnMubG9jYXRpb24ubWFwKCh7IGFjY291bnRJZCwgbG9jYXRpb24gfSkgPT4gW1xuICAgICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgICBsb2NhdGlvbiBhcyBBenVyZUxvY2F0aW9uLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgfSksXG4gIH07XG5cbiAgY29uc3QgdGFncyA9IHtcbiAgICAuLi4ob3B0aW9ucy5idXNpbmVzc1VuaXQgJiYgeyBCdXNpbmVzc1VuaXQ6IG9wdGlvbnMuYnVzaW5lc3NVbml0IH0pLFxuICAgIC4uLihvcHRpb25zLm1hbmFnZW1lbnRUZWFtICYmIHsgTWFuYWdlbWVudFRlYW06IG9wdGlvbnMubWFuYWdlbWVudFRlYW0gfSksXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oT2JqZWN0LmtleXMoZW52KS5sZW5ndGggPiAwICYmIHsgZW52IH0pLFxuICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwICYmIHsgdGFncyB9KSxcbiAgICAuLi4ob3B0aW9ucy5kb21haW4gJiYgeyB3b3Jrc3BhY2U6IHsgZG9tYWluOiBvcHRpb25zLmRvbWFpbiB9IH0pLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVudmlyb25tZW50SW5pdGlhbEFuc3dlcnMgPSBhc3luYyAoXG4gIG9wdGlvbnM6IEFkZEVudmlyb25tZW50Q29tbWFuZE9wdGlvbnMsXG4pOiBQcm9taXNlPERlcGxveW1lbnRFbnZpcm9ubWVudEluaXRpYWxBbnN3ZXJzPiA9PiB7XG4gIGNvbnN0IGluaXRpYWxBbnN3ZXJzID0gYnVpbGRCYXNlRW52aXJvbm1lbnRJbml0aWFsQW5zd2VycyhvcHRpb25zKTtcbiAgY29uc3QgcHJpdmF0ZUtleSA9XG4gICAgb3B0aW9ucy5wcml2YXRlS2V5UGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBhd2FpdCByZWFkRmlsZShvcHRpb25zLnByaXZhdGVLZXlQYXRoLCBcInV0ZjhcIikuY2F0Y2goKGNhdXNlKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkIHByaXZhdGUga2V5IGZpbGUgYXQgXCIke29wdGlvbnMucHJpdmF0ZUtleVBhdGh9XCIuYCxcbiAgICAgICAgICAgIHsgY2F1c2UgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAvLyBGYWlsIGZhc3Qgb24gYW4gZW1wdHkgKG9yIHdoaXRlc3BhY2Utb25seSkga2V5IGZpbGU6IHRoZSBmaWxlIGNvbnRlbnRzIGFyZVxuICAvLyBuZXZlciB0cmltbWVkLCBzbyBhbiBlbXB0eSB2YWx1ZSB3b3VsZCBvdGhlcndpc2Ugc2tpcCB0aGUgcmVjb3ZlcnkgcHJvbXB0XG4gIC8vIGFuZCBzdXJmYWNlIGFzIGFuIG9wYXF1ZSBzY2hlbWEgZXJyb3IgKG9yIGEgc2lsZW50bHkgaW52YWxpZCBrZXkpIGxhdGVyLlxuICBpZiAocHJpdmF0ZUtleSAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVLZXkudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBQcml2YXRlIGtleSBmaWxlIGF0IFwiJHtvcHRpb25zLnByaXZhdGVLZXlQYXRofVwiIGlzIGVtcHR5LmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFByZWZpbGwgcnVubmVyLWFwcCBjcmVkZW50aWFscyBvbmx5IHdoZW4gYXQgbGVhc3Qgb25lIGNyZWRlbnRpYWwgZmxhZyB3YXNcbiAgLy8gcHJvdmlkZWQuIFVuc3BlY2lmaWVkIGZpZWxkcyBzdGF5IGB1bmRlZmluZWRgIG9uIHB1cnBvc2Ugc28gdGhlIGdlbmVyYXRvclxuICAvLyBwcm9tcHRzIGZvciB0aGUgbWlzc2luZyBwaWVjZXMgYW5kIHZhbGlkYXRlcyB0aGUgY29tcGxldGUgc2V0IGxhdGVyLiBXaXRoXG4gIC8vIG5vIGNyZWRlbnRpYWwgZmxhZyBhdCBhbGwsIGxlYXZlIHRoaXMgYHVuZGVmaW5lZGAgdG8ga2VlcCBpbml0aWFsaXphdGlvblxuICAvLyBmdWxseSBpbnRlcmFjdGl2ZS5cbiAgY29uc3QgcnVubmVyQXBwQ3JlZGVudGlhbHMgPVxuICAgIG9wdGlvbnMucnVubmVyQXBwSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgIG9wdGlvbnMuY2xpZW50SWQgPT09IHVuZGVmaW5lZCAmJlxuICAgIG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgIHByaXZhdGVLZXkgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDoge1xuICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgIGlkOiBvcHRpb25zLnJ1bm5lckFwcElkLFxuICAgICAgICAgIGluc3RhbGxhdGlvbklkOiBvcHRpb25zLmluc3RhbGxhdGlvbklkLFxuICAgICAgICAgIGtleTogcHJpdmF0ZUtleSxcbiAgICAgICAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLmluaXRpYWxBbnN3ZXJzLFxuICAgIC4uLigob3B0aW9ucy55ZXMgfHwgcnVubmVyQXBwQ3JlZGVudGlhbHMpICYmIHtcbiAgICAgIGluaXQ6IHtcbiAgICAgICAgLi4uKG9wdGlvbnMueWVzICYmIHsgY29uZmlybTogdHJ1ZSB9KSxcbiAgICAgICAgLi4uKHJ1bm5lckFwcENyZWRlbnRpYWxzICYmIHsgcnVubmVyQXBwQ3JlZGVudGlhbHMgfSksXG4gICAgICB9LFxuICAgIH0pLFxuICB9O1xufTtcblxuLyoqXG4gKiBBdXRob3JpemUgYSBDbG91ZCBBY2NvdW50IChBenVyZSBTdWJzY3JpcHRpb24sIEFXUyBBY2NvdW50LCAuLi4pLCBjcmVhdGluZyBhIFB1bGwgUmVxdWVzdCBmb3IgZWFjaCBhY2NvdW50IHRoYXQgcmVxdWlyZXMgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhvcml6ZUNsb3VkQWNjb3VudHMgPVxuICAoYXV0aG9yaXphdGlvblNlcnZpY2U6IEF1dGhvcml6YXRpb25TZXJ2aWNlKSA9PlxuICAoXG4gICAgZW52UGF5bG9hZDogRW52aXJvbm1lbnRQYXlsb2FkLFxuICApOiBSZXN1bHRBc3luYzxBdXRob3JpemF0aW9uUmVzdWx0W10sIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgYWNjb3VudHNUb0luaXRpYWxpemUgPVxuICAgICAgZW52UGF5bG9hZC5pbml0Py5jbG91ZEFjY291bnRzVG9Jbml0aWFsaXplID8/IFtdO1xuXG4gICAgaWYgKGFjY291bnRzVG9Jbml0aWFsaXplLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9rQXN5bmMoW10pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJkeC1jbGlcIiwgXCJhZGQtZW52aXJvbm1lbnRcIl0pO1xuICAgIGNvbnN0IHsgbmFtZSwgcHJlZml4IH0gPSBlbnZQYXlsb2FkLmVudjtcbiAgICBjb25zdCBlbnZTaG9ydCA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG5cbiAgICBjb25zdCByZXF1ZXN0QWxsID0gYXN5bmMgKCk6IFByb21pc2U8QXV0aG9yaXphdGlvblJlc3VsdFtdPiA9PiB7XG4gICAgICBjb25zdCByZXN1bHRzOiBBdXRob3JpemF0aW9uUmVzdWx0W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzVG9Jbml0aWFsaXplKSB7XG4gICAgICAgIGlmICghaXNBenVyZUxvY2F0aW9uKGFjY291bnQuZGVmYXVsdExvY2F0aW9uKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgXCJTa2lwcGluZyBhdXRob3JpemF0aW9uIGZvciB7YWNjb3VudH06IHVuc3VwcG9ydGVkIGxvY2F0aW9uXCIsXG4gICAgICAgICAgICB7IGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jU2hvcnQgPSBsb2NhdGlvblNob3J0W2FjY291bnQuZGVmYXVsdExvY2F0aW9uXTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSByZXF1ZXN0QXV0aG9yaXphdGlvbklucHV0U2NoZW1hLnNhZmVQYXJzZSh7XG4gICAgICAgICAgYm9vdHN0cmFwSWRlbnRpdHlJZDogYCR7cHJlZml4fS0ke2VudlNob3J0fS0ke2xvY1Nob3J0fS1ib290c3RyYXAtaWQtMDFgLFxuICAgICAgICAgIGVudlNob3J0LFxuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICByZXBvTmFtZTogZW52UGF5bG9hZC5naXRodWIucmVwbyxcbiAgICAgICAgICByZXBvT3duZXI6IGVudlBheWxvYWQuZ2l0aHViLm93bmVyLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbk5hbWU6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghaW5wdXQuc3VjY2Vzcykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwiU2tpcHBpbmcgYXV0aG9yaXphdGlvbiBmb3Ige2FjY291bnR9OiBpbnZhbGlkIGlucHV0XCIsIHtcbiAgICAgICAgICAgIGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRob3JpemF0aW9uU2VydmljZS5yZXF1ZXN0QXV0aG9yaXphdGlvbihcbiAgICAgICAgICBpbnB1dC5kYXRhLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlc3VsdC5tYXRjaChcbiAgICAgICAgICAoYXV0aFJlc3VsdCkgPT4gcmVzdWx0cy5wdXNoKGF1dGhSZXN1bHQpLFxuICAgICAgICAgIChlcnJvcikgPT5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQXV0aG9yaXphdGlvbiByZXF1ZXN0IGZhaWxlZCBmb3Ige2FjY291bnR9OiB7ZXJyb3J9XCIsIHtcbiAgICAgICAgICAgICAgYWNjb3VudDogYWNjb3VudC5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfTtcblxuICAgIHJldHVybiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShyZXF1ZXN0QWxsKCksICgpID0+IFtdKS5vckVsc2UoKCkgPT5cbiAgICAgIG9rQXN5bmMoW10pLFxuICAgICk7XG4gIH07XG5cbnR5cGUgQWRkUmVzdWx0ID0ge1xuICBhdXRob3JpemF0aW9uUHJzOiBBdXRob3JpemF0aW9uUmVzdWx0W107XG4gIHBheWxvYWQ6IEVudmlyb25tZW50UGF5bG9hZDtcbn07XG5cbmNvbnN0IGRpc3BsYXlTdW1tYXJ5ID0gKHJlc3VsdDogQWRkUmVzdWx0KSA9PiB7XG4gIGNvbnN0IHsgYXV0aG9yaXphdGlvblBycyB9ID0gcmVzdWx0O1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKFwiXFxuQ2xvdWQgZW52aXJvbm1lbnQgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpKTtcblxuICBsZXQgc3RlcCA9IDE7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoXCJcXG5OZXh0IFN0ZXBzOlwiKSk7XG4gIGNvbnN0IHByc1dpdGhVcmwgPSBhdXRob3JpemF0aW9uUHJzLmZpbHRlcihcbiAgICAocHIpOiBwciBpcyBBdXRob3JpemF0aW9uUmVzdWx0ICYgeyB1cmw6IHN0cmluZyB9ID0+IHByLnVybCAhPSBudWxsLFxuICApO1xuICBpZiAocHJzV2l0aFVybC5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coYCR7c3RlcCsrfS4gUmV2aWV3IHRoZSBBenVyZSBhdXRob3JpemF0aW9uIFB1bGwgUmVxdWVzdChzKTpgKTtcbiAgICBmb3IgKGNvbnN0IGF1dGhQciBvZiBwcnNXaXRoVXJsKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAgLSAke2NoYWxrLnVuZGVybGluZShhdXRoUHIudXJsKX1gKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5sb2coXG4gICAgYCR7c3RlcH0uIFZpc2l0ICR7Y2hhbGsudW5kZXJsaW5lKFwiaHR0cHM6Ly9keC5wYWdvcGEuaXQvZ2V0dGluZy1zdGFydGVkXCIpfSB0byBkZXBsb3kgeW91ciBmaXJzdCBwcm9qZWN0XFxuYCxcbiAgKTtcbn07XG5cbi8qKlxuICogUm91dGVzIHRoZSBzdWNjZXNzZnVsIG91dGNvbWUgdGhyb3VnaCB0aGUgcHJlc2VudGVyOiBKU09OIG1vZGUgZW1pdHMgdGhlXG4gKiBzdHJ1Y3R1cmVkIGVudmVsb3BlIHdoaWxlIHRleHQgbW9kZSByZW5kZXJzIHRoZSBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5LlxuICovXG5jb25zdCByZXBvcnRTdW1tYXJ5ID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlciwgb3V0cHV0TW9kZTogXCJqc29uXCIgfCBcInRleHRcIikgPT5cbiAgKHJlc3VsdDogQWRkUmVzdWx0KTogdm9pZCA9PiB7XG4gICAgaWYgKG91dHB1dE1vZGUgPT09IFwianNvblwiKSB7XG4gICAgICBwcmVzZW50ZXIucmVwb3J0UmVzdWx0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BsYXlTdW1tYXJ5KHJlc3VsdCk7XG4gICAgfVxuICB9O1xuXG5jb25zdCB0cmFja1N0ZXAgPSA8VCwgRT4oXG4gIHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcixcbiAgbmFtZTogc3RyaW5nLFxuICB0YXNrOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXBFcnJvcjogKGNhdXNlOiB1bmtub3duKSA9PiBFLFxuKTogUmVzdWx0QXN5bmM8VCwgRT4gPT5cbiAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocHJlc2VudGVyLnRyYWNrU3RlcChuYW1lLCB0YXNrKSwgbWFwRXJyb3IpO1xuXG5jb25zdCBhZGRFbnZpcm9ubWVudEFjdGlvbiA9IChcbiAgYXV0aG9yaXphdGlvblNlcnZpY2U6IEF1dGhvcml6YXRpb25TZXJ2aWNlLFxuICBnaXRIdWJTZXJ2aWNlOiBHaXRIdWJTZXJ2aWNlLFxuICBwcmVzZW50ZXI6IENvbW1hbmRQcmVzZW50ZXIsXG4gIGluaXRpYWxBbnN3ZXJzOiBEZXBsb3ltZW50RW52aXJvbm1lbnRJbml0aWFsQW5zd2VycyA9IHt9LFxuKTogUmVzdWx0QXN5bmM8QWRkUmVzdWx0LCBFcnJvcj4gPT5cbiAgcnVuQWRkRW52aXJvbm1lbnRQcmVjb25kaXRpb25zKHByZXNlbnRlcilcbiAgICAuYW5kVGhlbigoKSA9PlxuICAgICAgdHJhY2tTdGVwKFxuICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgIFwiSW5pdGlhbGl6aW5nIGVudmlyb25tZW50IGdlbmVyYXRvci4uLlwiLFxuICAgICAgICBnZXRQbG9wSW5zdGFuY2UsXG4gICAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwbG9wXCIpLFxuICAgICAgKSxcbiAgICApXG4gICAgLmFuZFRoZW4oKHBsb3ApID0+XG4gICAgICAvLyBUaGUgcHJvbXB0IHBoYXNlIG11c3QgcnVuIG91dHNpZGUgdHJhY2tTdGVwOiBpbiB0ZXh0IG1vZGUgdHJhY2tTdGVwXG4gICAgICAvLyByZW5kZXJzIGEgc3Bpbm5lciB0aGF0IG9jY3VwaWVzIHRoZSBUVFkgYW5kIGhpZGVzIHRoZSBwcm9tcHRzLlxuICAgICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgIGNvbGxlY3REZXBsb3ltZW50RW52aXJvbm1lbnRQYXlsb2FkKFxuICAgICAgICAgIHBsb3AsXG4gICAgICAgICAgZ2l0SHViU2VydmljZSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgaW5pdGlhbEFuc3dlcnMsXG4gICAgICAgICksXG4gICAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gcnVuIHRoZSBkZXBsb3ltZW50IGVudmlyb25tZW50IGdlbmVyYXRvclwiKSxcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUaGVuKCh7IGdlbmVyYXRvciwgcGF5bG9hZCB9KSA9PlxuICAgICAgdHJhY2tTdGVwKFxuICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgIFwiQ3JlYXRpbmcgZW52aXJvbm1lbnQuLi5cIixcbiAgICAgICAgKCkgPT4gcnVuRGVwbG95bWVudEVudmlyb25tZW50QWN0aW9ucyhnZW5lcmF0b3IsIHBheWxvYWQpLFxuICAgICAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgZGVwbG95bWVudCBlbnZpcm9ubWVudFwiKSxcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUaGVuKChwYXlsb2FkKSA9PlxuICAgICAgYXV0aG9yaXplQ2xvdWRBY2NvdW50cyhhdXRob3JpemF0aW9uU2VydmljZSkocGF5bG9hZCkubWFwKFxuICAgICAgICAoYXV0aG9yaXphdGlvblBycykgPT4gKHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uUHJzLFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuXG5leHBvcnQgY29uc3QgbWFrZUFkZENvbW1hbmQgPSAoXG4gIHJlcXVpcmVHaXRIdWJBdXRoOiBHaXRIdWJBdXRoRmFjdG9yeSxcbiAgZW52OiBDbGlFbnYsXG4pOiBDb21tYW5kID0+XG4gIG5ldyBDb21tYW5kKClcbiAgICAubmFtZShcImFkZFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkFkZCBhIG5ldyBjb21wb25lbnQgdG8geW91ciB3b3Jrc3BhY2VcIilcbiAgICAuYWRkQ29tbWFuZChcbiAgICAgIG5ldyBDb21tYW5kKFwiZW52aXJvbm1lbnRcIilcbiAgICAgICAgLmRlc2NyaXB0aW9uKFwiQWRkIGEgbmV3IGRlcGxveW1lbnQgZW52aXJvbm1lbnRcIilcbiAgICAgICAgLmFkZE9wdGlvbihcbiAgICAgICAgICBuZXcgT3B0aW9uKFwiLS1uYW1lIDxuYW1lPlwiLCBcIkVudmlyb25tZW50IG5hbWVcIikuY2hvaWNlcyhbXG4gICAgICAgICAgICBcImRldlwiLFxuICAgICAgICAgICAgXCJ1YXRcIixcbiAgICAgICAgICAgIFwicHJvZFwiLFxuICAgICAgICAgIF0pLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcbiAgICAgICAgICAgIFwiLS1hY2NvdW50IDxzdWJzY3JpcHRpb24taWQ+XCIsXG4gICAgICAgICAgICBcIkNsb3VkIGFjY291bnQgc3Vic2NyaXB0aW9uIGlkXCIsXG4gICAgICAgICAgKS5hcmdQYXJzZXIoYXBwZW5kT3B0aW9uVmFsdWUpLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcbiAgICAgICAgICAgIFwiLS1sb2NhdGlvbiA8c3Vic2NyaXB0aW9uLWlkPXJlZ2lvbj5cIixcbiAgICAgICAgICAgIFwiRGVmYXVsdCBBenVyZSBsb2NhdGlvbiBmb3IgYSBzZWxlY3RlZCBhY2NvdW50XCIsXG4gICAgICAgICAgKS5hcmdQYXJzZXIoYXBwZW5kT3B0aW9uVmFsdWUpLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbihcIi0tcHJlZml4IDxwcmVmaXg+XCIsIFwiRW52aXJvbm1lbnQgcHJlZml4XCIpKVxuICAgICAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oXCItLWRvbWFpbiA8ZG9tYWluPlwiLCBcIldvcmtzcGFjZSBkb21haW5cIikpXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcIi0tYnVzaW5lc3MtdW5pdCA8YnVzaW5lc3MtdW5pdD5cIiwgXCJCdXNpbmVzcyB1bml0IHRhZ1wiKSxcbiAgICAgICAgKVxuICAgICAgICAuYWRkT3B0aW9uKFxuICAgICAgICAgIG5ldyBPcHRpb24oXG4gICAgICAgICAgICBcIi0tbWFuYWdlbWVudC10ZWFtIDxtYW5hZ2VtZW50LXRlYW0+XCIsXG4gICAgICAgICAgICBcIk1hbmFnZW1lbnQgdGVhbSB0YWdcIixcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcbiAgICAgICAgICAgIFwiLXksIC0teWVzXCIsXG4gICAgICAgICAgICBcIkNvbmZpcm0gZW52aXJvbm1lbnQgaW5pdGlhbGl6YXRpb24gd2l0aG91dCBwcm9tcHRpbmdcIixcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5hZGRPcHRpb24oXG4gICAgICAgICAgbmV3IE9wdGlvbihcIi0tcnVubmVyLWFwcC1pZCA8cnVubmVyLWFwcC1pZD5cIiwgXCJHaXRIdWIgUnVubmVyIEFwcCBJRFwiKSxcbiAgICAgICAgKVxuICAgICAgICAuYWRkT3B0aW9uKFxuICAgICAgICAgIG5ldyBPcHRpb24oXCItLWNsaWVudC1pZCA8Y2xpZW50LWlkPlwiLCBcIkdpdEh1YiBSdW5uZXIgQXBwIENsaWVudCBJRFwiKSxcbiAgICAgICAgKVxuICAgICAgICAuYWRkT3B0aW9uKFxuICAgICAgICAgIG5ldyBPcHRpb24oXG4gICAgICAgICAgICBcIi0taW5zdGFsbGF0aW9uLWlkIDxpbnN0YWxsYXRpb24taWQ+XCIsXG4gICAgICAgICAgICBcIkdpdEh1YiBSdW5uZXIgQXBwIEluc3RhbGxhdGlvbiBJRFwiLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLmFkZE9wdGlvbihcbiAgICAgICAgICBuZXcgT3B0aW9uKFxuICAgICAgICAgICAgXCItLXByaXZhdGUta2V5LXBhdGggPHByaXZhdGUta2V5LXBhdGg+XCIsXG4gICAgICAgICAgICBcIlBhdGggdG8gYSBsb2NhbCBHaXRIdWIgUnVubmVyIEFwcCBwcml2YXRlIGtleSBmaWxlXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAuYWN0aW9uKGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IHRoaXMub3B0c1dpdGhHbG9iYWxzPEdsb2JhbE9wdGlvbnM+KCk7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0TW9kZSA9IHJlc29sdmVPdXRwdXRNb2RlKGVudiwgb3V0cHV0KTtcbiAgICAgICAgICBjb25zdCBwcmVzZW50ZXIgPSBjcmVhdGVDb21tYW5kUHJlc2VudGVyKG91dHB1dE1vZGUpO1xuXG4gICAgICAgICAgYXdhaXQgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+XG4gICAgICAgICAgICAgIHBhcnNlQWRkRW52aXJvbm1lbnRDb21tYW5kT3B0aW9ucyhvcHRpb25zKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAoY2F1c2UpID0+XG4gICAgICAgICAgICAgIGNhdXNlIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICA/IGNhdXNlXG4gICAgICAgICAgICAgICAgOiBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgYWRkIGVudmlyb25tZW50IGNvbW1hbmQgb3B0aW9uc1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLmFuZFRoZW4oKGFkZEVudmlyb25tZW50T3B0aW9ucykgPT5cbiAgICAgICAgICAgICAgUmVzdWx0QXN5bmMuZnJvbVByb21pc2UoXG4gICAgICAgICAgICAgICAgZ2V0RW52aXJvbm1lbnRJbml0aWFsQW5zd2VycyhhZGRFbnZpcm9ubWVudE9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgICAgIGNhdXNlIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgPyBjYXVzZVxuICAgICAgICAgICAgICAgICAgICA6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgYWRkIGVudmlyb25tZW50IGluaXRpYWwgYW5zd2Vyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKS5hbmRUaGVuKChpbml0aWFsQW5zd2VycykgPT5cbiAgICAgICAgICAgICAgICByZXF1aXJlR2l0SHViQXV0aCgpLmFuZFRoZW4oXG4gICAgICAgICAgICAgICAgICAoeyBhdXRob3JpemF0aW9uU2VydmljZSwgZ2l0SHViU2VydmljZSB9KSA9PlxuICAgICAgICAgICAgICAgICAgICBhZGRFbnZpcm9ubWVudEFjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQW5zd2VycyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hdGNoKFxuICAgICAgICAgICAgICByZXBvcnRTdW1tYXJ5KHByZXNlbnRlciwgb3V0cHV0TW9kZSksXG4gICAgICAgICAgICAgIHJlcG9ydENvbW1hbmRFcnJvcih0aGlzLCBwcmVzZW50ZXIsIG91dHB1dE1vZGUpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgKTtcbiJdfQ==
|