@pagopa/dx-cli 0.23.5 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/README.md +14 -0
  2. package/bin/index.js +13 -3
  3. package/dist/adapters/azure/cloud-account-service.js +32 -1
  4. package/dist/adapters/azure-monitor/instrumentation.d.ts +26 -0
  5. package/dist/adapters/azure-monitor/instrumentation.js +84 -0
  6. package/dist/adapters/azure-monitor/telemetry.d.ts +19 -0
  7. package/dist/adapters/azure-monitor/telemetry.js +28 -0
  8. package/dist/adapters/commander/commands/add.d.ts +32 -7
  9. package/dist/adapters/commander/commands/add.js +198 -15
  10. package/dist/adapters/commander/commands/doctor.js +4 -1
  11. package/dist/adapters/octokit/index.d.ts +12 -0
  12. package/dist/adapters/octokit/index.js +26 -2
  13. package/dist/adapters/pagopa-technology/azure-authorization.js +11 -11
  14. package/dist/adapters/plop/actions/setup-pnpm.js +5 -1
  15. package/dist/adapters/plop/actions/sync-repository-environments.d.ts +15 -0
  16. package/dist/adapters/plop/actions/sync-repository-environments.js +98 -0
  17. package/dist/adapters/plop/generators/environment/actions.js +4 -1
  18. package/dist/adapters/plop/generators/environment/index.d.ts +3 -3
  19. package/dist/adapters/plop/generators/environment/index.js +6 -3
  20. package/dist/adapters/plop/generators/environment/prompts.d.ts +38 -0
  21. package/dist/adapters/plop/generators/environment/prompts.js +236 -91
  22. package/dist/adapters/plop/index.d.ts +3 -3
  23. package/dist/adapters/plop/index.js +5 -5
  24. package/dist/domain/authorization.d.ts +1 -0
  25. package/dist/domain/authorization.js +5 -4
  26. package/dist/index.js +132 -8
  27. package/package.json +11 -3
  28. package/templates/monorepo/.pre-commit-config.yaml.hbs +0 -8
@@ -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 which allows developers to scaffold
7
- * new components into their existing workspace following DevEx guidelines.
8
- *
9
- * Currently supported components:
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
  */
@@ -42,6 +199,7 @@ export const authorizeCloudAccounts = (authorizationService) => (envPayload) =>
42
199
  envShort,
43
200
  prefix,
44
201
  repoName: envPayload.github.repo,
202
+ repoOwner: envPayload.github.owner,
45
203
  subscriptionName: account.displayName,
46
204
  });
47
205
  if (!input.success) {
@@ -87,27 +245,52 @@ const reportSummary = (presenter, outputMode) => (result) => {
87
245
  }
88
246
  };
89
247
  const trackStep = (presenter, name, task, mapError) => ResultAsync.fromPromise(presenter.trackStep(name, task), mapError);
90
- const addEnvironmentAction = (authorizationService, gitHubService, presenter) => runAddEnvironmentPreconditions(presenter)
248
+ const addEnvironmentAction = (authorizationService, gitHubService, presenter, initialAnswers = {}) => runAddEnvironmentPreconditions(presenter)
91
249
  .andThen(() => trackStep(presenter, "Initializing environment generator...", getPlopInstance, asError("Failed to initialize plop")))
92
250
  .andThen((plop) =>
93
251
  // The prompt phase must run outside trackStep: in text mode trackStep
94
252
  // renders a spinner that occupies the TTY and hides the prompts.
95
- 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")))
96
254
  .andThen(({ generator, payload }) => trackStep(presenter, "Creating environment...", () => runDeploymentEnvironmentActions(generator, payload), asError("Failed to create the deployment environment")))
97
255
  .andThen((payload) => authorizeCloudAccounts(authorizationService)(payload).map((authorizationPrs) => ({
98
256
  authorizationPrs,
257
+ payload,
99
258
  })));
100
259
  export const makeAddCommand = (requireGitHubAuth, env) => new Command()
101
260
  .name("add")
102
261
  .description("Add a new component to your workspace")
103
262
  .addCommand(new Command("environment")
104
263
  .description("Add a new deployment environment")
105
- .action(async function () {
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) {
106
281
  const { output } = this.optsWithGlobals();
107
282
  const outputMode = resolveOutputMode(env, output);
108
283
  const presenter = createCommandPresenter(outputMode);
109
- await requireGitHubAuth()
110
- .andThen(({ authorizationService, gitHubService }) => addEnvironmentAction(authorizationService, gitHubService, presenter))
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))))
111
294
  .match(reportSummary(presenter, outputMode), reportCommandError(this, presenter, outputMode));
112
295
  }));
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9hZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQjs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFPbEQsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUUsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxlQUFlLEVBQ2YsK0JBQStCLEdBQ2hDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTNEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQ2pDLENBQUMsb0JBQTBDLEVBQUUsRUFBRSxDQUMvQyxDQUNFLFVBQThCLEVBQ2EsRUFBRTtJQUM3QyxNQUFNLG9CQUFvQixHQUN4QixVQUFVLENBQUMsSUFBSSxFQUFFLHlCQUF5QixJQUFJLEVBQUUsQ0FBQztJQUVuRCxJQUFJLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxP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QU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXJELE1BQU0saUJBQWlCLEVBQUU7U0FDdEIsT0FBTyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQ25ELG9CQUFvQixDQUNsQixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLFNBQVMsQ0FDVixDQUNGO1NBQ0EsS0FBSyxDQUNKLGFBQWEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQ3BDLGtCQUFrQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQ2hELENBQUM7QUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbi8qKlxuICogQWRkIGNvbW1hbmQgLSBTY2FmZm9sZCBuZXcgY29tcG9uZW50cyBpbnRvIGV4aXN0aW5nIHdvcmtzcGFjZXNcbiAqXG4gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBgZHggYWRkYCBjb21tYW5kIHdoaWNoIGFsbG93cyBkZXZlbG9wZXJzIHRvIHNjYWZmb2xkXG4gKiBuZXcgY29tcG9uZW50cyBpbnRvIHRoZWlyIGV4aXN0aW5nIHdvcmtzcGFjZSBmb2xsb3dpbmcgRGV2RXggZ3VpZGVsaW5lcy5cbiAqXG4gKiBDdXJyZW50bHkgc3VwcG9ydGVkIGNvbXBvbmVudHM6XG4gKiAtIGVudmlyb25tZW50OiBBZGQgYSBuZXcgZGVwbG95bWVudCBlbnZpcm9ubWVudCB0byB0aGUgcHJvamVjdFxuICovXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgb2tBc3luYywgUmVzdWx0QXN5bmMgfSBmcm9tIFwibmV2ZXJ0aHJvd1wiO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRQcmVzZW50ZXIgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2NvbW1hbmQtcHJlc2VudGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgYXMgRW52aXJvbm1lbnRQYXlsb2FkIH0gZnJvbSBcIi4uLy4uL3Bsb3AvZ2VuZXJhdG9ycy9lbnZpcm9ubWVudC9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGlFbnYgfSBmcm9tIFwiLi4vZW52LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdsb2JhbE9wdGlvbnMgfSBmcm9tIFwiLi4vZ2xvYmFsLW9wdGlvbnMuanNcIjtcblxuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblJlc3VsdCxcbiAgQXV0aG9yaXphdGlvblNlcnZpY2UsXG4gIHJlcXVlc3RBdXRob3JpemF0aW9uSW5wdXRTY2hlbWEsXG59IGZyb20gXCIuLi8uLi8uLi9kb21haW4vYXV0aG9yaXphdGlvbi5qc1wiO1xuaW1wb3J0IHsgR2l0SHViQXV0aEZhY3RvcnkgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RlcGVuZGVuY2llcy5qc1wiO1xuaW1wb3J0IHsgZW52aXJvbm1lbnRTaG9ydCB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZW52aXJvbm1lbnQuanNcIjtcbmltcG9ydCB7IHR5cGUgR2l0SHViU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5pbXBvcnQgeyBpc0F6dXJlTG9jYXRpb24sIGxvY2F0aW9uU2hvcnQgfSBmcm9tIFwiLi4vLi4vYXp1cmUvbG9jYXRpb25zLmpzXCI7XG5pbXBvcnQge1xuICBjb2xsZWN0RGVwbG95bWVudEVudmlyb25tZW50UGF5bG9hZCxcbiAgZ2V0UGxvcEluc3RhbmNlLFxuICBydW5EZXBsb3ltZW50RW52aXJvbm1lbnRBY3Rpb25zLFxufSBmcm9tIFwiLi4vLi4vcGxvcC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYXNFcnJvciwgcmVwb3J0Q29tbWFuZEVycm9yIH0gZnJvbSBcIi4uL2NvbW1hbmQtZXJyb3JzLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVDb21tYW5kUHJlc2VudGVyLFxuICByZXNvbHZlT3V0cHV0TW9kZSxcbn0gZnJvbSBcIi4uL3ByZXNlbnRlcnMvaW5kZXguanNcIjtcbmltcG9ydCB7IHJ1bkFkZEVudmlyb25tZW50UHJlY29uZGl0aW9ucyB9IGZyb20gXCIuL2luaXQuanNcIjtcblxuLyoqXG4gKiBBdXRob3JpemUgYSBDbG91ZCBBY2NvdW50IChBenVyZSBTdWJzY3JpcHRpb24sIEFXUyBBY2NvdW50LCAuLi4pLCBjcmVhdGluZyBhIFB1bGwgUmVxdWVzdCBmb3IgZWFjaCBhY2NvdW50IHRoYXQgcmVxdWlyZXMgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhvcml6ZUNsb3VkQWNjb3VudHMgPVxuICAoYXV0aG9yaXphdGlvblNlcnZpY2U6IEF1dGhvcml6YXRpb25TZXJ2aWNlKSA9PlxuICAoXG4gICAgZW52UGF5bG9hZDogRW52aXJvbm1lbnRQYXlsb2FkLFxuICApOiBSZXN1bHRBc3luYzxBdXRob3JpemF0aW9uUmVzdWx0W10sIG5ldmVyPiA9PiB7XG4gICAgY29uc3QgYWNjb3VudHNUb0luaXRpYWxpemUgPVxuICAgICAgZW52UGF5bG9hZC5pbml0Py5jbG91ZEFjY291bnRzVG9Jbml0aWFsaXplID8/IFtdO1xuXG4gICAgaWYgKGFjY291bnRzVG9Jbml0aWFsaXplLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9rQXN5bmMoW10pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJkeC1jbGlcIiwgXCJhZGQtZW52aXJvbm1lbnRcIl0pO1xuICAgIGNvbnN0IHsgbmFtZSwgcHJlZml4IH0gPSBlbnZQYXlsb2FkLmVudjtcbiAgICBjb25zdCBlbnZTaG9ydCA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG5cbiAgICBjb25zdCByZXF1ZXN0QWxsID0gYXN5bmMgKCk6IFByb21pc2U8QXV0aG9yaXphdGlvblJlc3VsdFtdPiA9PiB7XG4gICAgICBjb25zdCByZXN1bHRzOiBBdXRob3JpemF0aW9uUmVzdWx0W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhY2NvdW50IG9mIGFjY291bnRzVG9Jbml0aWFsaXplKSB7XG4gICAgICAgIGlmICghaXNBenVyZUxvY2F0aW9uKGFjY291bnQuZGVmYXVsdExvY2F0aW9uKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgXCJTa2lwcGluZyBhdXRob3JpemF0aW9uIGZvciB7YWNjb3VudH06IHVuc3VwcG9ydGVkIGxvY2F0aW9uXCIsXG4gICAgICAgICAgICB7IGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jU2hvcnQgPSBsb2NhdGlvblNob3J0W2FjY291bnQuZGVmYXVsdExvY2F0aW9uXTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSByZXF1ZXN0QXV0aG9yaXphdGlvbklucHV0U2NoZW1hLnNhZmVQYXJzZSh7XG4gICAgICAgICAgYm9vdHN0cmFwSWRlbnRpdHlJZDogYCR7cHJlZml4fS0ke2VudlNob3J0fS0ke2xvY1Nob3J0fS1ib290c3RyYXAtaWQtMDFgLFxuICAgICAgICAgIGVudlNob3J0LFxuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICByZXBvTmFtZTogZW52UGF5bG9hZC5naXRodWIucmVwbyxcbiAgICAgICAgICBzdWJzY3JpcHRpb25OYW1lOiBhY2NvdW50LmRpc3BsYXlOYW1lLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWlucHV0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihcIlNraXBwaW5nIGF1dGhvcml6YXRpb24gZm9yIHthY2NvdW50fTogaW52YWxpZCBpbnB1dFwiLCB7XG4gICAgICAgICAgICBhY2NvdW50OiBhY2NvdW50LmRpc3BsYXlOYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXV0aG9yaXphdGlvblNlcnZpY2UucmVxdWVzdEF1dGhvcml6YXRpb24oXG4gICAgICAgICAgaW5wdXQuZGF0YSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXN1bHQubWF0Y2goXG4gICAgICAgICAgKGF1dGhSZXN1bHQpID0+IHJlc3VsdHMucHVzaChhdXRoUmVzdWx0KSxcbiAgICAgICAgICAoZXJyb3IpID0+XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkF1dGhvcml6YXRpb24gcmVxdWVzdCBmYWlsZWQgZm9yIHthY2NvdW50fToge2Vycm9yfVwiLCB7XG4gICAgICAgICAgICAgIGFjY291bnQ6IGFjY291bnQuZGlzcGxheU5hbWUsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG5cbiAgICByZXR1cm4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocmVxdWVzdEFsbCgpLCAoKSA9PiBbXSkub3JFbHNlKCgpID0+XG4gICAgICBva0FzeW5jKFtdKSxcbiAgICApO1xuICB9O1xuXG50eXBlIEFkZFJlc3VsdCA9IHtcbiAgYXV0aG9yaXphdGlvblByczogQXV0aG9yaXphdGlvblJlc3VsdFtdO1xufTtcblxuY29uc3QgZGlzcGxheVN1bW1hcnkgPSAocmVzdWx0OiBBZGRSZXN1bHQpID0+IHtcbiAgY29uc3QgeyBhdXRob3JpemF0aW9uUHJzIH0gPSByZXN1bHQ7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoXCJcXG5DbG91ZCBlbnZpcm9ubWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFcIikpO1xuXG4gIGxldCBzdGVwID0gMTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZChcIlxcbk5leHQgU3RlcHM6XCIpKTtcbiAgY29uc3QgcHJzV2l0aFVybCA9IGF1dGhvcml6YXRpb25QcnMuZmlsdGVyKFxuICAgIChwcik6IHByIGlzIEF1dGhvcml6YXRpb25SZXN1bHQgJiB7IHVybDogc3RyaW5nIH0gPT4gcHIudXJsICE9IG51bGwsXG4gICk7XG4gIGlmIChwcnNXaXRoVXJsLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhgJHtzdGVwKyt9LiBSZXZpZXcgdGhlIEF6dXJlIGF1dGhvcml6YXRpb24gUHVsbCBSZXF1ZXN0KHMpOmApO1xuICAgIGZvciAoY29uc3QgYXV0aFByIG9mIHByc1dpdGhVcmwpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICAtICR7Y2hhbGsudW5kZXJsaW5lKGF1dGhQci51cmwpfWApO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmxvZyhcbiAgICBgJHtzdGVwfS4gVmlzaXQgJHtjaGFsay51bmRlcmxpbmUoXCJodHRwczovL2R4LnBhZ29wYS5pdC9nZXR0aW5nLXN0YXJ0ZWRcIil9IHRvIGRlcGxveSB5b3VyIGZpcnN0IHByb2plY3RcXG5gLFxuICApO1xufTtcblxuLyoqXG4gKiBSb3V0ZXMgdGhlIHN1Y2Nlc3NmdWwgb3V0Y29tZSB0aHJvdWdoIHRoZSBwcmVzZW50ZXI6IEpTT04gbW9kZSBlbWl0cyB0aGVcbiAqIHN0cnVjdHVyZWQgZW52ZWxvcGUgd2hpbGUgdGV4dCBtb2RlIHJlbmRlcnMgdGhlIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkuXG4gKi9cbmNvbnN0IHJlcG9ydFN1bW1hcnkgPVxuICAocHJlc2VudGVyOiBDb21tYW5kUHJlc2VudGVyLCBvdXRwdXRNb2RlOiBcImpzb25cIiB8IFwidGV4dFwiKSA9PlxuICAocmVzdWx0OiBBZGRSZXN1bHQpOiB2b2lkID0+IHtcbiAgICBpZiAob3V0cHV0TW9kZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgIHByZXNlbnRlci5yZXBvcnRSZXN1bHQocmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzcGxheVN1bW1hcnkocmVzdWx0KTtcbiAgICB9XG4gIH07XG5cbmNvbnN0IHRyYWNrU3RlcCA9IDxULCBFPihcbiAgcHJlc2VudGVyOiBDb21tYW5kUHJlc2VudGVyLFxuICBuYW1lOiBzdHJpbmcsXG4gIHRhc2s6ICgpID0+IFByb21pc2U8VD4sXG4gIG1hcEVycm9yOiAoY2F1c2U6IHVua25vd24pID0+IEUsXG4pOiBSZXN1bHRBc3luYzxULCBFPiA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShwcmVzZW50ZXIudHJhY2tTdGVwKG5hbWUsIHRhc2spLCBtYXBFcnJvcik7XG5cbmNvbnN0IGFkZEVudmlyb25tZW50QWN0aW9uID0gKFxuICBhdXRob3JpemF0aW9uU2VydmljZTogQXV0aG9yaXphdGlvblNlcnZpY2UsXG4gIGdpdEh1YlNlcnZpY2U6IEdpdEh1YlNlcnZpY2UsXG4gIHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlcixcbik6IFJlc3VsdEFzeW5jPEFkZFJlc3VsdCwgRXJyb3I+ID0+XG4gIHJ1bkFkZEVudmlyb25tZW50UHJlY29uZGl0aW9ucyhwcmVzZW50ZXIpXG4gICAgLmFuZFRoZW4oKCkgPT5cbiAgICAgIHRyYWNrU3RlcChcbiAgICAgICAgcHJlc2VudGVyLFxuICAgICAgICBcIkluaXRpYWxpemluZyBlbnZpcm9ubWVudCBnZW5lcmF0b3IuLi5cIixcbiAgICAgICAgZ2V0UGxvcEluc3RhbmNlLFxuICAgICAgICBhc0Vycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgcGxvcFwiKSxcbiAgICAgICksXG4gICAgKVxuICAgIC5hbmRUaGVuKChwbG9wKSA9PlxuICAgICAgLy8gVGhlIHByb21wdCBwaGFzZSBtdXN0IHJ1biBvdXRzaWRlIHRyYWNrU3RlcDogaW4gdGV4dCBtb2RlIHRyYWNrU3RlcFxuICAgICAgLy8gcmVuZGVycyBhIHNwaW5uZXIgdGhhdCBvY2N1cGllcyB0aGUgVFRZIGFuZCBoaWRlcyB0aGUgcHJvbXB0cy5cbiAgICAgIFJlc3VsdEFzeW5jLmZyb21Qcm9taXNlKFxuICAgICAgICBjb2xsZWN0RGVwbG95bWVudEVudmlyb25tZW50UGF5bG9hZChwbG9wLCBnaXRIdWJTZXJ2aWNlKSxcbiAgICAgICAgYXNFcnJvcihcIkZhaWxlZCB0byBydW4gdGhlIGRlcGxveW1lbnQgZW52aXJvbm1lbnQgZ2VuZXJhdG9yXCIpLFxuICAgICAgKSxcbiAgICApXG4gICAgLmFuZFRoZW4oKHsgZ2VuZXJhdG9yLCBwYXlsb2FkIH0pID0+XG4gICAgICB0cmFja1N0ZXAoXG4gICAgICAgIHByZXNlbnRlcixcbiAgICAgICAgXCJDcmVhdGluZyBlbnZpcm9ubWVudC4uLlwiLFxuICAgICAgICAoKSA9PiBydW5EZXBsb3ltZW50RW52aXJvbm1lbnRBY3Rpb25zKGdlbmVyYXRvciwgcGF5bG9hZCksXG4gICAgICAgIGFzRXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBkZXBsb3ltZW50IGVudmlyb25tZW50XCIpLFxuICAgICAgKSxcbiAgICApXG4gICAgLmFuZFRoZW4oKHBheWxvYWQpID0+XG4gICAgICBhdXRob3JpemVDbG91ZEFjY291bnRzKGF1dGhvcml6YXRpb25TZXJ2aWNlKShwYXlsb2FkKS5tYXAoXG4gICAgICAgIChhdXRob3JpemF0aW9uUHJzKSA9PiAoe1xuICAgICAgICAgIGF1dGhvcml6YXRpb25QcnMsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuXG5leHBvcnQgY29uc3QgbWFrZUFkZENvbW1hbmQgPSAoXG4gIHJlcXVpcmVHaXRIdWJBdXRoOiBHaXRIdWJBdXRoRmFjdG9yeSxcbiAgZW52OiBDbGlFbnYsXG4pOiBDb21tYW5kID0+XG4gIG5ldyBDb21tYW5kKClcbiAgICAubmFtZShcImFkZFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkFkZCBhIG5ldyBjb21wb25lbnQgdG8geW91ciB3b3Jrc3BhY2VcIilcbiAgICAuYWRkQ29tbWFuZChcbiAgICAgIG5ldyBDb21tYW5kKFwiZW52aXJvbm1lbnRcIilcbiAgICAgICAgLmRlc2NyaXB0aW9uKFwiQWRkIGEgbmV3IGRlcGxveW1lbnQgZW52aXJvbm1lbnRcIilcbiAgICAgICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IHRoaXMub3B0c1dpdGhHbG9iYWxzPEdsb2JhbE9wdGlvbnM+KCk7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0TW9kZSA9IHJlc29sdmVPdXRwdXRNb2RlKGVudiwgb3V0cHV0KTtcbiAgICAgICAgICBjb25zdCBwcmVzZW50ZXIgPSBjcmVhdGVDb21tYW5kUHJlc2VudGVyKG91dHB1dE1vZGUpO1xuXG4gICAgICAgICAgYXdhaXQgcmVxdWlyZUdpdEh1YkF1dGgoKVxuICAgICAgICAgICAgLmFuZFRoZW4oKHsgYXV0aG9yaXphdGlvblNlcnZpY2UsIGdpdEh1YlNlcnZpY2UgfSkgPT5cbiAgICAgICAgICAgICAgYWRkRW52aXJvbm1lbnRBY3Rpb24oXG4gICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgZ2l0SHViU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcmVzZW50ZXIsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgIHJlcG9ydFN1bW1hcnkocHJlc2VudGVyLCBvdXRwdXRNb2RlKSxcbiAgICAgICAgICAgICAgcmVwb3J0Q29tbWFuZEVycm9yKHRoaXMsIHByZXNlbnRlciwgb3V0cHV0TW9kZSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICApO1xuIl19
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==
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import chalk from "chalk";
11
11
  import { Command } from "commander";
12
+ import process from "node:process";
12
13
  import { runDoctor } from "../../../domain/doctor.js";
13
14
  import { createCommandPresenter, resolveOutputMode, } from "../presenters/index.js";
14
15
  const formatCheck = (check) => check.isValid
@@ -28,6 +29,8 @@ export const makeDoctorCommand = (dependencies, config, env) => new Command()
28
29
  const presenter = createCommandPresenter(outputMode);
29
30
  const result = await runDoctor(dependencies, config);
30
31
  reportDoctorResult(presenter, outputMode)(result);
32
+ // Use process.exitCode instead of process.exit() so that the finally
33
+ // block in runCli() can flush telemetry before the process terminates.
31
34
  process.exitCode = result.hasErrors ? 1 : 0;
32
35
  });
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9kb2N0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixpQkFBaUIsR0FDbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQXNCLEVBQVUsRUFBRSxDQUNyRCxLQUFLLENBQUMsT0FBTztJQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFM0MsTUFBTSxrQkFBa0IsR0FDdEIsQ0FBQyxTQUEyQixFQUFFLFVBQTJCLEVBQUUsRUFBRSxDQUM3RCxDQUFDLE1BQW9CLEVBQVEsRUFBRTtJQUM3QixTQUFTLENBQUMsWUFBWSxDQUNwQixVQUFVLEtBQUssTUFBTTtRQUNuQixDQUFDLENBQUMsTUFBTTtRQUNSLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzlDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixZQUEwQixFQUMxQixNQUFjLEVBQ2QsR0FBVyxFQUNGLEVBQUUsQ0FDWCxJQUFJLE9BQU8sRUFBRTtLQUNWLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDZCxXQUFXLENBQ1YsK0RBQStELENBQ2hFO0tBQ0EsTUFBTSxDQUFDLEtBQUs7SUFDWCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBaUIsQ0FBQztJQUN6RCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXJELGtCQUFrQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVsRCxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgZG9jdG9yYCBDb21tYW5kZXIgY29tbWFuZC5cbiAqXG4gKiBWZXJpZmllcyB0aGUgcmVwb3NpdG9yeSBzZXR1cCBhbmQgcm91dGVzIHRoZSBvdXRjb21lIHRocm91Z2ggdGhlIHNoYXJlZFxuICogQ29tbWFuZFByZXNlbnRlciBwb3J0LiBKU09OIG1vZGUgZW1pdHMgdGhlIHN0cnVjdHVyZWQgcmVzdWx0OyB0ZXh0IG1vZGUgZW1pdHNcbiAqIGEgaHVtYW4tcmVhZGFibGUgcGVyLWNoZWNrIHN1bW1hcnkuIFRoZSBleGl0IGNvZGUgcmVmbGVjdHMgd2hldGhlciBhbnkgY2hlY2tcbiAqIGZhaWxlZCwgbWlycm9yaW5nIHRoZSBsaW50ZXIgY29udmVudGlvbiAoYSBzdWNjZXNzZnVsIHJ1biBjYW4gc3RpbGwgcmVwb3J0XG4gKiBwcm9ibGVtcykuXG4gKi9cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZFByZXNlbnRlciB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vY29tbWFuZC1wcmVzZW50ZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgRGVwZW5kZW5jaWVzIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9kZXBlbmRlbmNpZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgRG9jdG9yUmVzdWx0IH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9kb2N0b3IuanNcIjtcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGlvbkNoZWNrIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi92YWxpZGF0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENsaUVudiB9IGZyb20gXCIuLi9lbnYuanNcIjtcbmltcG9ydCB0eXBlIHsgR2xvYmFsT3B0aW9ucyB9IGZyb20gXCIuLi9nbG9iYWwtb3B0aW9ucy5qc1wiO1xuXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgeyBydW5Eb2N0b3IgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RvY3Rvci5qc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ29tbWFuZFByZXNlbnRlcixcbiAgcmVzb2x2ZU91dHB1dE1vZGUsXG59IGZyb20gXCIuLi9wcmVzZW50ZXJzL2luZGV4LmpzXCI7XG5cbmNvbnN0IGZvcm1hdENoZWNrID0gKGNoZWNrOiBWYWxpZGF0aW9uQ2hlY2spOiBzdHJpbmcgPT5cbiAgY2hlY2suaXNWYWxpZFxuICAgID8gY2hhbGsuZ3JlZW4oYOKchSAke2NoZWNrLnN1Y2Nlc3NNZXNzYWdlfWApXG4gICAgOiBjaGFsay5yZWQoYOKdjCAke2NoZWNrLmVycm9yTWVzc2FnZX1gKTtcblxuY29uc3QgcmVwb3J0RG9jdG9yUmVzdWx0ID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlciwgb3V0cHV0TW9kZTogXCJqc29uXCIgfCBcInRleHRcIikgPT5cbiAgKHJlc3VsdDogRG9jdG9yUmVzdWx0KTogdm9pZCA9PiB7XG4gICAgcHJlc2VudGVyLnJlcG9ydFJlc3VsdChcbiAgICAgIG91dHB1dE1vZGUgPT09IFwianNvblwiXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogcmVzdWx0LmNoZWNrcy5tYXAoZm9ybWF0Q2hlY2spLmpvaW4oXCJcXG5cIiksXG4gICAgKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IG1ha2VEb2N0b3JDb21tYW5kID0gKFxuICBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY2llcyxcbiAgY29uZmlnOiBDb25maWcsXG4gIGVudjogQ2xpRW52LFxuKTogQ29tbWFuZCA9PlxuICBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUoXCJkb2N0b3JcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIlZlcmlmeSB0aGUgcmVwb3NpdG9yeSBzZXR1cCBhY2NvcmRpbmcgdG8gdGhlIERldkV4IGd1aWRlbGluZXNcIixcbiAgICApXG4gICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgIGNvbnN0IG91dHB1dE1vZGUgPSByZXNvbHZlT3V0cHV0TW9kZShlbnYsIG91dHB1dCk7XG4gICAgICBjb25zdCBwcmVzZW50ZXIgPSBjcmVhdGVDb21tYW5kUHJlc2VudGVyKG91dHB1dE1vZGUpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Eb2N0b3IoZGVwZW5kZW5jaWVzLCBjb25maWcpO1xuXG4gICAgICByZXBvcnREb2N0b3JSZXN1bHQocHJlc2VudGVyLCBvdXRwdXRNb2RlKShyZXN1bHQpO1xuXG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmVzdWx0Lmhhc0Vycm9ycyA/IDEgOiAwO1xuICAgIH0pO1xuIl19
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2NvbW1hbmRlci9jb21tYW5kcy9kb2N0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFVbkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFzQixFQUFVLEVBQUUsQ0FDckQsS0FBSyxDQUFDLE9BQU87SUFDWCxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBRTNDLE1BQU0sa0JBQWtCLEdBQ3RCLENBQUMsU0FBMkIsRUFBRSxVQUEyQixFQUFFLEVBQUUsQ0FDN0QsQ0FBQyxNQUFvQixFQUFRLEVBQUU7SUFDN0IsU0FBUyxDQUFDLFlBQVksQ0FDcEIsVUFBVSxLQUFLLE1BQU07UUFDbkIsQ0FBQyxDQUFDLE1BQU07UUFDUixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5QyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUosTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsWUFBMEIsRUFDMUIsTUFBYyxFQUNkLEdBQVcsRUFDRixFQUFFLENBQ1gsSUFBSSxPQUFPLEVBQUU7S0FDVixJQUFJLENBQUMsUUFBUSxDQUFDO0tBQ2QsV0FBVyxDQUNWLCtEQUErRCxDQUNoRTtLQUNBLE1BQU0sQ0FBQyxLQUFLO0lBQ1gsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQWlCLENBQUM7SUFDekQsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVyRCxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbEQscUVBQXFFO0lBQ3JFLHVFQUF1RTtJQUN2RSxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgZG9jdG9yYCBDb21tYW5kZXIgY29tbWFuZC5cbiAqXG4gKiBWZXJpZmllcyB0aGUgcmVwb3NpdG9yeSBzZXR1cCBhbmQgcm91dGVzIHRoZSBvdXRjb21lIHRocm91Z2ggdGhlIHNoYXJlZFxuICogQ29tbWFuZFByZXNlbnRlciBwb3J0LiBKU09OIG1vZGUgZW1pdHMgdGhlIHN0cnVjdHVyZWQgcmVzdWx0OyB0ZXh0IG1vZGUgZW1pdHNcbiAqIGEgaHVtYW4tcmVhZGFibGUgcGVyLWNoZWNrIHN1bW1hcnkuIFRoZSBleGl0IGNvZGUgcmVmbGVjdHMgd2hldGhlciBhbnkgY2hlY2tcbiAqIGZhaWxlZCwgbWlycm9yaW5nIHRoZSBsaW50ZXIgY29udmVudGlvbiAoYSBzdWNjZXNzZnVsIHJ1biBjYW4gc3RpbGwgcmVwb3J0XG4gKiBwcm9ibGVtcykuXG4gKi9cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZFByZXNlbnRlciB9IGZyb20gXCIuLi8uLi8uLi9kb21haW4vY29tbWFuZC1wcmVzZW50ZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgRGVwZW5kZW5jaWVzIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9kZXBlbmRlbmNpZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgRG9jdG9yUmVzdWx0IH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi9kb2N0b3IuanNcIjtcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGlvbkNoZWNrIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpbi92YWxpZGF0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENsaUVudiB9IGZyb20gXCIuLi9lbnYuanNcIjtcbmltcG9ydCB0eXBlIHsgR2xvYmFsT3B0aW9ucyB9IGZyb20gXCIuLi9nbG9iYWwtb3B0aW9ucy5qc1wiO1xuXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgeyBydW5Eb2N0b3IgfSBmcm9tIFwiLi4vLi4vLi4vZG9tYWluL2RvY3Rvci5qc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ29tbWFuZFByZXNlbnRlcixcbiAgcmVzb2x2ZU91dHB1dE1vZGUsXG59IGZyb20gXCIuLi9wcmVzZW50ZXJzL2luZGV4LmpzXCI7XG5cbmNvbnN0IGZvcm1hdENoZWNrID0gKGNoZWNrOiBWYWxpZGF0aW9uQ2hlY2spOiBzdHJpbmcgPT5cbiAgY2hlY2suaXNWYWxpZFxuICAgID8gY2hhbGsuZ3JlZW4oYOKchSAke2NoZWNrLnN1Y2Nlc3NNZXNzYWdlfWApXG4gICAgOiBjaGFsay5yZWQoYOKdjCAke2NoZWNrLmVycm9yTWVzc2FnZX1gKTtcblxuY29uc3QgcmVwb3J0RG9jdG9yUmVzdWx0ID1cbiAgKHByZXNlbnRlcjogQ29tbWFuZFByZXNlbnRlciwgb3V0cHV0TW9kZTogXCJqc29uXCIgfCBcInRleHRcIikgPT5cbiAgKHJlc3VsdDogRG9jdG9yUmVzdWx0KTogdm9pZCA9PiB7XG4gICAgcHJlc2VudGVyLnJlcG9ydFJlc3VsdChcbiAgICAgIG91dHB1dE1vZGUgPT09IFwianNvblwiXG4gICAgICAgID8gcmVzdWx0XG4gICAgICAgIDogcmVzdWx0LmNoZWNrcy5tYXAoZm9ybWF0Q2hlY2spLmpvaW4oXCJcXG5cIiksXG4gICAgKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IG1ha2VEb2N0b3JDb21tYW5kID0gKFxuICBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY2llcyxcbiAgY29uZmlnOiBDb25maWcsXG4gIGVudjogQ2xpRW52LFxuKTogQ29tbWFuZCA9PlxuICBuZXcgQ29tbWFuZCgpXG4gICAgLm5hbWUoXCJkb2N0b3JcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIlZlcmlmeSB0aGUgcmVwb3NpdG9yeSBzZXR1cCBhY2NvcmRpbmcgdG8gdGhlIERldkV4IGd1aWRlbGluZXNcIixcbiAgICApXG4gICAgLmFjdGlvbihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IG91dHB1dCB9ID0gdGhpcy5vcHRzV2l0aEdsb2JhbHM8R2xvYmFsT3B0aW9ucz4oKTtcbiAgICAgIGNvbnN0IG91dHB1dE1vZGUgPSByZXNvbHZlT3V0cHV0TW9kZShlbnYsIG91dHB1dCk7XG4gICAgICBjb25zdCBwcmVzZW50ZXIgPSBjcmVhdGVDb21tYW5kUHJlc2VudGVyKG91dHB1dE1vZGUpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Eb2N0b3IoZGVwZW5kZW5jaWVzLCBjb25maWcpO1xuXG4gICAgICByZXBvcnREb2N0b3JSZXN1bHQocHJlc2VudGVyLCBvdXRwdXRNb2RlKShyZXN1bHQpO1xuXG4gICAgICAvLyBVc2UgcHJvY2Vzcy5leGl0Q29kZSBpbnN0ZWFkIG9mIHByb2Nlc3MuZXhpdCgpIHNvIHRoYXQgdGhlIGZpbmFsbHlcbiAgICAgIC8vIGJsb2NrIGluIHJ1bkNsaSgpIGNhbiBmbHVzaCB0ZWxlbWV0cnkgYmVmb3JlIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMuXG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmVzdWx0Lmhhc0Vycm9ycyA/IDEgOiAwO1xuICAgIH0pO1xuIl19
@@ -24,6 +24,18 @@ export declare class OctokitGitHubService implements GitHubService {
24
24
  updateFile(params: UpdateFileParams): Promise<void>;
25
25
  }
26
26
  export declare const getGitHubPAT: () => Promise<string | undefined>;
27
+ /**
28
+ * Returns true when the authenticated user is an active member of the PagoPA
29
+ * GitHub organization.
30
+ *
31
+ * Fails closed: any error (network failure, missing `read:org` scope, 403/404)
32
+ * resolves to `false` so telemetry stays disabled when membership cannot be
33
+ * confirmed.
34
+ *
35
+ * @param octokit injectable client, primarily for testing; defaults to a client
36
+ * authenticated with the supplied token.
37
+ */
38
+ export declare const isPagopaOrgMember: (token: string, octokit?: Octokit) => Promise<boolean>;
27
39
  export declare const fetchLatestTag: ({ client, owner, repo }: GitHubReleaseParam) => ResultAsync<import("semver").SemVer | null, Error>;
28
40
  export declare const fetchLatestRelease: ({ client, owner, repo, }: GitHubReleaseParam) => ResultAsync<import("semver").SemVer | null, Error>;
29
41
  export {};
@@ -1,7 +1,7 @@
1
1
  import { $ } from "execa";
2
2
  import sodium from "libsodium-wrappers";
3
3
  import { ResultAsync } from "neverthrow";
4
- import { RequestError } from "octokit";
4
+ import { Octokit, RequestError } from "octokit";
5
5
  import semverParse from "semver/functions/parse.js";
6
6
  import semverSort from "semver/functions/sort.js";
7
7
  import { FileNotFoundError, PullRequest, Repository, RepositoryNotFoundError, } from "../../domain/github.js";
@@ -157,6 +157,30 @@ export const getGitHubPAT = async () => {
157
157
  }
158
158
  return undefined;
159
159
  };
160
+ /** GitHub organization whose members are allowed to emit CLI telemetry. */
161
+ const PAGOPA_ORG = "pagopa";
162
+ /**
163
+ * Returns true when the authenticated user is an active member of the PagoPA
164
+ * GitHub organization.
165
+ *
166
+ * Fails closed: any error (network failure, missing `read:org` scope, 403/404)
167
+ * resolves to `false` so telemetry stays disabled when membership cannot be
168
+ * confirmed.
169
+ *
170
+ * @param octokit injectable client, primarily for testing; defaults to a client
171
+ * authenticated with the supplied token.
172
+ */
173
+ export const isPagopaOrgMember = async (token, octokit = new Octokit({ auth: token })) => {
174
+ try {
175
+ const { data } = await octokit.rest.orgs.getMembershipForAuthenticatedUser({
176
+ org: PAGOPA_ORG,
177
+ });
178
+ return data.state === "active";
179
+ }
180
+ catch {
181
+ return false;
182
+ }
183
+ };
160
184
  export const fetchLatestTag = ({ client, owner, repo }) => ResultAsync.fromPromise(
161
185
  // Get repository tags
162
186
  client.request("GET /repos/{owner}/{repo}/tags", {
@@ -176,4 +200,4 @@ client.request("GET /repos/{owner}/{repo}/releases/latest", {
176
200
  owner,
177
201
  repo,
178
202
  }), () => new Error(`Failed to fetch latest release for ${owner}/${repo}`)).map(({ data }) => semverParse(data.tag_name));
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvb2N0b2tpdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFXLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoRCxPQUFPLFdBQVcsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLFVBQVUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRCxPQUFPLEVBSUwsaUJBQWlCLEVBR2pCLFdBQVcsRUFDWCxVQUFVLEVBQ1YsdUJBQXVCLEdBRXhCLE1BQU0sd0JBQXdCLENBQUM7QUFRaEMsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixRQUFRLENBQUM7SUFFVCxZQUFZLE9BQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQTBCO1FBQzNDLElBQUksQ0FBQztZQUNILG1DQUFtQztZQUNuQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDNUQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixHQUFHLEVBQUUsU0FBUyxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUM5QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7YUFDbEIsQ0FBQyxDQUFDO1lBRUgsd0JBQXdCO1lBQ3hCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztnQkFDckMsS0FBSyxFQUFFLE1BQU0sQ0FB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QUMxQyxNQUFNLENBQUMsT0FBTyxDQUFDLDJDQUEyQyxFQUFFO0lBQzFELEtBQUs7SUFDTCxJQUFJO0NBQ0wsQ0FBQyxFQUNGLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLHNDQUFzQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsQ0FDdkUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyAkIH0gZnJvbSBcImV4ZWNhXCI7XG5pbXBvcnQgc29kaXVtIGZyb20gXCJsaWJzb2RpdW0td3JhcHBlcnNcIjtcbmltcG9ydCB7IFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IE9jdG9raXQsIFJlcXVlc3RFcnJvciB9IGZyb20gXCJvY3Rva2l0XCI7XG5pbXBvcnQgc2VtdmVyUGFyc2UgZnJvbSBcInNlbXZlci9mdW5jdGlvbnMvcGFyc2UuanNcIjtcbmltcG9ydCBzZW12ZXJTb3J0IGZyb20gXCJzZW12ZXIvZnVuY3Rpb25zL3NvcnQuanNcIjtcblxuaW1wb3J0IHtcbiAgQ3JlYXRlQnJhbmNoUGFyYW1zLFxuICBDcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0UGFyYW1zLFxuICBGaWxlQ29udGVudCxcbiAgRmlsZU5vdEZvdW5kRXJyb3IsXG4gIEdldEZpbGVDb250ZW50UGFyYW1zLFxuICBHaXRIdWJTZXJ2aWNlLFxuICBQdWxsUmVxdWVzdCxcbiAgUmVwb3NpdG9yeSxcbiAgUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IsXG4gIFVwZGF0ZUZpbGVQYXJhbXMsXG59IGZyb20gXCIuLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5cbnR5cGUgR2l0SHViUmVsZWFzZVBhcmFtID0ge1xuICBjbGllbnQ6IE9jdG9raXQ7XG4gIG93bmVyOiBzdHJpbmc7XG4gIHJlcG86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBPY3Rva2l0R2l0SHViU2VydmljZSBpbXBsZW1lbnRzIEdpdEh1YlNlcnZpY2Uge1xuICAjb2N0b2tpdDtcblxuICBjb25zdHJ1Y3RvcihvY3Rva2l0OiBPY3Rva2l0KSB7XG4gICAgdGhpcy4jb2N0b2tpdCA9IG9jdG9raXQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCcmFuY2gocGFyYW1zOiBDcmVhdGVCcmFuY2hQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IHRoZSBTSEEgb2YgdGhlIHNvdXJjZSBicmFuY2hcbiAgICAgIGNvbnN0IHsgZGF0YTogcmVmRGF0YSB9ID0gYXdhaXQgdGhpcy4jb2N0b2tpdC5yZXN0LmdpdC5nZXRSZWYoe1xuICAgICAgICBvd25lcjogcGFyYW1zLm93bmVyLFxuICAgICAgICByZWY6IGBoZWFkcy8ke3BhcmFtcy5mcm9tUmVmfWAsXG4gICAgICAgIHJlcG86IHBhcmFtcy5yZXBvLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGJyYW5jaFxuICAgICAgYXdhaXQgdGhpcy4jb2N0b2tpdC5yZXN0LmdpdC5jcmVhdGVSZWYoe1xuICAgICAgICBvd25lcjogcGFyYW1zLm93bmVyLFxuICAgICAgICByZWY6IGByZWZzL2hlYWRzLyR7cGFyYW1zLmJyYW5jaE5hbWV9YCxcbiAgICAgICAgcmVwbzogcGFyYW1zLnJlcG8sXG4gICAgICAgIHNoYTogcmVmRGF0YS5vYmplY3Quc2hhLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBicmFuY2g6ICR7cGFyYW1zLmJyYW5jaE5hbWV9YCwge1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KFxuICAgIHBhcmFtczogQ3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldFBhcmFtcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdpdEh1YiByZXF1aXJlcyBlbnZpcm9ubWVudCBzZWNyZXRzIHRvIGJlIGVuY3J5cHRlZCBjbGllbnQtc2lkZSB3aXRoIGxpYnNvZGl1bS5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgZXhpc3RzIGJlZm9yZSByZXNvbHZpbmcgaXRzIHB1YmxpYyBrZXkgYW5kIHN0b3Jpbmcgc2VjcmV0cy5cbiAgICAgIGF3YWl0IHRoaXMuI29jdG9raXQucmVxdWVzdChcbiAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIixcbiAgICAgICAge1xuICAgICAgICAgIGVudmlyb25tZW50X25hbWU6IHBhcmFtcy5lbnZpcm9ubWVudE5hbWUsXG4gICAgICAgICAgb3duZXI6IHBhcmFtcy5vd25lcixcbiAgICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHsgZGF0YTogcHVibGljS2V5RGF0YSB9ID1cbiAgICAgICAgYXdhaXQgdGhpcy4jb2N0b2tpdC5yZXN0LmFjdGlvbnMuZ2V0RW52aXJvbm1lbnRQdWJsaWNLZXkoe1xuICAgICAgICAgIGVudmlyb25tZW50X25hbWU6IHBhcmFtcy5lbnZpcm9ubWVudE5hbWUsXG4gICAgICAgICAgb3duZXI6IHBhcmFtcy5vd25lcixcbiAgICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHB1YmxpY0tleUJ5dGVzID0gc29kaXVtLmZyb21fYmFzZTY0KFxuICAgICAgICBwdWJsaWNLZXlEYXRhLmtleSxcbiAgICAgICAgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZWNyZXRCeXRlcyA9IHNvZGl1bS5mcm9tX3N0cmluZyhwYXJhbXMuc2VjcmV0VmFsdWUpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKFxuICAgICAgICBzZWNyZXRCeXRlcyxcbiAgICAgICAgcHVibGljS2V5Qnl0ZXMsXG4gICAgICApO1xuICAgICAgY29uc3QgZW5jcnlwdGVkVmFsdWUgPSBzb2RpdW0udG9fYmFzZTY0KFxuICAgICAgICBlbmNyeXB0ZWRCeXRlcyxcbiAgICAgICAgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCxcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IHRoaXMuI29jdG9raXQucmVzdC5hY3Rpb25zLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY3J5cHRlZFZhbHVlLFxuICAgICAgICBlbnZpcm9ubWVudF9uYW1lOiBwYXJhbXMuZW52aXJvbm1lbnROYW1lLFxuICAgICAgICBrZXlfaWQ6IHB1YmxpY0tleURhdGEua2V5X2lkLFxuICAgICAgICBvd25lcjogcGFyYW1zLm93bmVyLFxuICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgc2VjcmV0X25hbWU6IHBhcmFtcy5zZWNyZXROYW1lLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgb3IgdXBkYXRlIHNlY3JldCAke3BhcmFtcy5zZWNyZXROYW1lfSBpbiBlbnZpcm9ubWVudCAke3BhcmFtcy5lbnZpcm9ubWVudE5hbWV9YCxcbiAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHVsbFJlcXVlc3QocGFyYW1zOiB7XG4gICAgYmFzZTogc3RyaW5nO1xuICAgIGJvZHk6IHN0cmluZztcbiAgICBoZWFkOiBzdHJpbmc7XG4gICAgb3duZXI6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgfSk6IFByb21pc2U8UHVsbFJlcXVlc3Q+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLiNvY3Rva2l0LnJlc3QucHVsbHMuY3JlYXRlKHtcbiAgICAgICAgYmFzZTogcGFyYW1zLmJhc2UsXG4gICAgICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICAgICAgICBoZWFkOiBwYXJhbXMuaGVhZCxcbiAgICAgICAgb3duZXI6IHBhcmFtcy5vd25lcixcbiAgICAgICAgcmVwbzogcGFyYW1zLnJlcG8sXG4gICAgICAgIHRpdGxlOiBwYXJhbXMudGl0bGUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUHVsbFJlcXVlc3QoZGF0YS5odG1sX3VybCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgcHVsbCByZXF1ZXN0IGluICR7cGFyYW1zLm93bmVyfS8ke3BhcmFtcy5yZXBvfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEZpbGVDb250ZW50KHBhcmFtczogR2V0RmlsZUNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPEZpbGVDb250ZW50PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy4jb2N0b2tpdC5yZXN0LnJlcG9zLmdldENvbnRlbnQoe1xuICAgICAgICBvd25lcjogcGFyYW1zLm93bmVyLFxuICAgICAgICBwYXRoOiBwYXJhbXMucGF0aCxcbiAgICAgICAgcmVmOiBwYXJhbXMucmVmLFxuICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHaXRIdWIgQVBJIHJldHVybnMgYW4gYXJyYXkgZm9yIGRpcmVjdG9yaWVzLCBzaW5nbGUgb2JqZWN0IGZvciBmaWxlc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS50eXBlICE9PSBcImZpbGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJHtwYXJhbXMucGF0aH0gaXMgbm90IGEgZmlsZWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ZW50ID0gQnVmZmVyLmZyb20oZGF0YS5jb250ZW50LCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIHsgY29udGVudCwgc2hhOiBkYXRhLnNoYSB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZXF1ZXN0RXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEVycm9yKHBhcmFtcy5wYXRoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBmaWxlIGNvbnRlbnQ6ICR7cGFyYW1zLnBhdGh9YCwge1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRSZXBvc2l0b3J5KG93bmVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVwb3NpdG9yeT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuI29jdG9raXQucmVzdC5yZXBvcy5nZXQoe1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbzogbmFtZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBSZXBvc2l0b3J5KGRhdGEubmFtZSwgZGF0YS5vd25lci5sb2dpbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJlcXVlc3RFcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3Iob3duZXIsIG5hbWUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggcmVwb3NpdG9yeSAke293bmVyfS8ke25hbWV9YCwge1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVGaWxlKHBhcmFtczogVXBkYXRlRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLiNvY3Rva2l0LnJlc3QucmVwb3MuY3JlYXRlT3JVcGRhdGVGaWxlQ29udGVudHMoe1xuICAgICAgICBicmFuY2g6IHBhcmFtcy5icmFuY2gsXG4gICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKHBhcmFtcy5jb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIG93bmVyOiBwYXJhbXMub3duZXIsXG4gICAgICAgIHBhdGg6IHBhcmFtcy5wYXRoLFxuICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgc2hhOiBwYXJhbXMuc2hhLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSBmaWxlOiAke3BhcmFtcy5wYXRofWAsIHtcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEZvbGxvdyB0aGUgc2FtZSBvcmRlciBvZiBwcmVjZWRlbmNlIG9mIGdoIGNsaVxuLy8gaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS9tYW51YWwvZ2hfaGVscF9lbnZpcm9ubWVudFxuZXhwb3J0IGNvbnN0IGdldEdpdEh1YlBBVCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4ge1xuICBpZiAocHJvY2Vzcy5lbnYuR0hfVE9LRU4pIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfVE9LRU47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTikge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgJCh7IHJlamVjdDogZmFsc2UgfSlgZ2ggYXV0aCB0b2tlbmA7XG4gIGlmICghcmVzdWx0LmZhaWxlZCAmJiByZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICByZXR1cm4gcmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCBmZXRjaExhdGVzdFRhZyA9ICh7IGNsaWVudCwgb3duZXIsIHJlcG8gfTogR2l0SHViUmVsZWFzZVBhcmFtKSA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAvLyBHZXQgcmVwb3NpdG9yeSB0YWdzXG4gICAgY2xpZW50LnJlcXVlc3QoXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3NcIiwge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgIH0pLFxuICAgICgpID0+IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIHRhZ3MgZm9yICR7b3duZXJ9LyR7cmVwb31gKSxcbiAgKVxuICAgIC5tYXAoKHsgZGF0YSB9KSA9PiBkYXRhLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpKVxuICAgIC8vIEZpbHRlciBvdXQgdGFncyB0aGF0IGFyZSBub3QgdmFsaWQgc2VtdmVyXG4gICAgLm1hcCgodGFncykgPT5cbiAgICAgIHRhZ3MubWFwKCh0YWcpID0+IHNlbXZlclBhcnNlKHRhZykpLmZpbHRlcigodGFnKSA9PiB0YWcgIT09IG51bGwpLFxuICAgIClcbiAgICAvLyBTb3J0IHRhZ3MgaW4gYXNjZW5kaW5nIG9yZGVyXG4gICAgLm1hcChzZW12ZXJTb3J0KVxuICAgIC8vIEdldCB0aGUgbGF0ZXN0IHRhZ1xuICAgIC5tYXAoKHRhZ3MpID0+IHRhZ3MucG9wKCkgPz8gbnVsbCk7XG5cbmV4cG9ydCBjb25zdCBmZXRjaExhdGVzdFJlbGVhc2UgPSAoe1xuICBjbGllbnQsXG4gIG93bmVyLFxuICByZXBvLFxufTogR2l0SHViUmVsZWFzZVBhcmFtKSA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAvLyBHZXQgdGhlIGxhdGVzdCByZWxlYXNlIGZvciBhIHJlcG9zaXRvcnlcbiAgICBjbGllbnQucmVxdWVzdChcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0XCIsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICB9KSxcbiAgICAoKSA9PiBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBsYXRlc3QgcmVsZWFzZSBmb3IgJHtvd25lcn0vJHtyZXBvfWApLFxuICApLm1hcCgoeyBkYXRhIH0pID0+IHNlbXZlclBhcnNlKGRhdGEudGFnX25hbWUpKTtcbiJdfQ==
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvb2N0b2tpdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDaEQsT0FBTyxXQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxVQUFVLE1BQU0sMEJBQTBCLENBQUM7QUFFbEQsT0FBTyxFQUlMLGlCQUFpQixFQUdqQixXQUFXLEVBQ1gsVUFBVSxFQUNWLHVCQUF1QixHQUV4QixNQUFNLHdCQUF3QixDQUFDO0FBUWhDLE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsUUFBUSxDQUFDO0lBRVQsWUFBWSxPQUFnQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUEwQjtRQUMzQyxJQUFJLENBQUM7WUFDSCxtQ0FBbUM7WUFDbkMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQzVELEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsR0FBRyxFQUFFLFNBQVMsTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDOUIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ2xCLENBQUMsQ0FBQztZQUVILHdCQUF3QjtZQUN4QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7Z0JBQ3JDLEtBQUssRUFB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O0tBQzNDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQ2xFO0lBQ0QsK0JBQStCO0tBQzlCLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDaEIscUJBQXFCO0tBQ3BCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsRUFDakMsTUFBTSxFQUNOLEtBQUssRUFDTCxJQUFJLEdBQ2UsRUFBRSxFQUFFLENBQ3ZCLFdBQVcsQ0FBQyxXQUFXO0FBQ3JCLDBDQUEwQztBQUMxQyxNQUFNLENBQUMsT0FBTyxDQUFDLDJDQUEyQyxFQUFFO0lBQzFELEtBQUs7SUFDTCxJQUFJO0NBQ0wsQ0FBQyxFQUNGLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLHNDQUFzQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsQ0FDdkUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyAkIH0gZnJvbSBcImV4ZWNhXCI7XG5pbXBvcnQgc29kaXVtIGZyb20gXCJsaWJzb2RpdW0td3JhcHBlcnNcIjtcbmltcG9ydCB7IFJlc3VsdEFzeW5jIH0gZnJvbSBcIm5ldmVydGhyb3dcIjtcbmltcG9ydCB7IE9jdG9raXQsIFJlcXVlc3RFcnJvciB9IGZyb20gXCJvY3Rva2l0XCI7XG5pbXBvcnQgc2VtdmVyUGFyc2UgZnJvbSBcInNlbXZlci9mdW5jdGlvbnMvcGFyc2UuanNcIjtcbmltcG9ydCBzZW12ZXJTb3J0IGZyb20gXCJzZW12ZXIvZnVuY3Rpb25zL3NvcnQuanNcIjtcblxuaW1wb3J0IHtcbiAgQ3JlYXRlQnJhbmNoUGFyYW1zLFxuICBDcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0UGFyYW1zLFxuICBGaWxlQ29udGVudCxcbiAgRmlsZU5vdEZvdW5kRXJyb3IsXG4gIEdldEZpbGVDb250ZW50UGFyYW1zLFxuICBHaXRIdWJTZXJ2aWNlLFxuICBQdWxsUmVxdWVzdCxcbiAgUmVwb3NpdG9yeSxcbiAgUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IsXG4gIFVwZGF0ZUZpbGVQYXJhbXMsXG59IGZyb20gXCIuLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5cbnR5cGUgR2l0SHViUmVsZWFzZVBhcmFtID0ge1xuICBjbGllbnQ6IE9jdG9raXQ7XG4gIG93bmVyOiBzdHJpbmc7XG4gIHJlcG86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBPY3Rva2l0R2l0SHViU2VydmljZSBpbXBsZW1lbnRzIEdpdEh1YlNlcnZpY2Uge1xuICAjb2N0b2tpdDtcblxuICBjb25zdHJ1Y3RvcihvY3Rva2l0OiBPY3Rva2l0KSB7XG4gICAgdGhpcy4jb2N0b2tpdCA9IG9jdG9raXQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCcmFuY2gocGFyYW1zOiBDcmVhdGVCcmFuY2hQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IHRoZSBTSEEgb2YgdGhlIHNvdXJjZSBicmFuY2hcbiAgICAgIGNvbnN0IHsgZGF0YTogcmVmRGF0YSB9ID0gYXdhaXQgdGhpcy4jb2N0b2tpdC5yZXN0LmdpdC5nZXRSZWYoe1xuICAgICAgICBvd25lcjogcGFyYW1zLm93bmVyLFxuICAgICAgICByZWY6IGBoZWFkcy8ke3BhcmFtcy5mcm9tUmVmfWAsXG4gICAgICAgIHJlcG86IHBhcmFtcy5yZXBvLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGJyYW5jaFxuICAgICAgYXdhaXQgdGhpcy4jb2N0b2tpdC5yZXN0LmdpdC5jcmVhdGVSZWYoe1xuICAgICAgICBvd25lcjogcGFyYW1zLm93bmVyLFxuICAgICAgICByZWY6IGByZWZzL2hlYWRzLyR7cGFyYW1zLmJyYW5jaE5hbWV9YCxcbiAgICAgICAgcmVwbzogcGFyYW1zLnJlcG8sXG4gICAgICAgIHNoYTogcmVmRGF0YS5vYmplY3Quc2hhLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBicmFuY2g6ICR7cGFyYW1zLmJyYW5jaE5hbWV9YCwge1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KFxuICAgIHBhcmFtczogQ3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldFBhcmFtcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdpdEh1YiByZXF1aXJlcyBlbnZpcm9ubWVudCBzZWNyZXRzIHRvIGJlIGVuY3J5cHRlZCBjbGllbnQtc2lkZSB3aXRoIGxpYnNvZGl1bS5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgZXhpc3RzIGJlZm9yZSByZXNvbHZpbmcgaXRzIHB1YmxpYyBrZXkgYW5kIHN0b3Jpbmcgc2VjcmV0cy5cbiAgICAgIGF3YWl0IHRoaXMuI29jdG9raXQucmVxdWVzdChcbiAgICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIixcbiAgICAgICAge1xuICAgICAgICAgIGVudmlyb25tZW50X25hbWU6IHBhcmFtcy5lbnZpcm9ubWVudE5hbWUsXG4gICAgICAgICAgb3duZXI6IHBhcmFtcy5vd25lcixcbiAgICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHsgZGF0YTogcHVibGljS2V5RGF0YSB9ID1cbiAgICAgICAgYXdhaXQgdGhpcy4jb2N0b2tpdC5yZXN0LmFjdGlvbnMuZ2V0RW52aXJvbm1lbnRQdWJsaWNLZXkoe1xuICAgICAgICAgIGVudmlyb25tZW50X25hbWU6IHBhcmFtcy5lbnZpcm9ubWVudE5hbWUsXG4gICAgICAgICAgb3duZXI6IHBhcmFtcy5vd25lcixcbiAgICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHB1YmxpY0tleUJ5dGVzID0gc29kaXVtLmZyb21fYmFzZTY0KFxuICAgICAgICBwdWJsaWNLZXlEYXRhLmtleSxcbiAgICAgICAgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZWNyZXRCeXRlcyA9IHNvZGl1bS5mcm9tX3N0cmluZyhwYXJhbXMuc2VjcmV0VmFsdWUpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKFxuICAgICAgICBzZWNyZXRCeXRlcyxcbiAgICAgICAgcHVibGljS2V5Qnl0ZXMsXG4gICAgICApO1xuICAgICAgY29uc3QgZW5jcnlwdGVkVmFsdWUgPSBzb2RpdW0udG9fYmFzZTY0KFxuICAgICAgICBlbmNyeXB0ZWRCeXRlcyxcbiAgICAgICAgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCxcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IHRoaXMuI29jdG9raXQucmVzdC5hY3Rpb25zLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY3J5cHRlZFZhbHVlLFxuICAgICAgICBlbnZpcm9ubWVudF9uYW1lOiBwYXJhbXMuZW52aXJvbm1lbnROYW1lLFxuICAgICAgICBrZXlfaWQ6IHB1YmxpY0tleURhdGEua2V5X2lkLFxuICAgICAgICBvd25lcjogcGFyYW1zLm93bmVyLFxuICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgc2VjcmV0X25hbWU6IHBhcmFtcy5zZWNyZXROYW1lLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgb3IgdXBkYXRlIHNlY3JldCAke3BhcmFtcy5zZWNyZXROYW1lfSBpbiBlbnZpcm9ubWVudCAke3BhcmFtcy5lbnZpcm9ubWVudE5hbWV9YCxcbiAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHVsbFJlcXVlc3QocGFyYW1zOiB7XG4gICAgYmFzZTogc3RyaW5nO1xuICAgIGJvZHk6IHN0cmluZztcbiAgICBoZWFkOiBzdHJpbmc7XG4gICAgb3duZXI6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgfSk6IFByb21pc2U8UHVsbFJlcXVlc3Q+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLiNvY3Rva2l0LnJlc3QucHVsbHMuY3JlYXRlKHtcbiAgICAgICAgYmFzZTogcGFyYW1zLmJhc2UsXG4gICAgICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICAgICAgICBoZWFkOiBwYXJhbXMuaGVhZCxcbiAgICAgICAgb3duZXI6IHBhcmFtcy5vd25lcixcbiAgICAgICAgcmVwbzogcGFyYW1zLnJlcG8sXG4gICAgICAgIHRpdGxlOiBwYXJhbXMudGl0bGUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUHVsbFJlcXVlc3QoZGF0YS5odG1sX3VybCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgcHVsbCByZXF1ZXN0IGluICR7cGFyYW1zLm93bmVyfS8ke3BhcmFtcy5yZXBvfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEZpbGVDb250ZW50KHBhcmFtczogR2V0RmlsZUNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPEZpbGVDb250ZW50PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy4jb2N0b2tpdC5yZXN0LnJlcG9zLmdldENvbnRlbnQoe1xuICAgICAgICBvd25lcjogcGFyYW1zLm93bmVyLFxuICAgICAgICBwYXRoOiBwYXJhbXMucGF0aCxcbiAgICAgICAgcmVmOiBwYXJhbXMucmVmLFxuICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHaXRIdWIgQVBJIHJldHVybnMgYW4gYXJyYXkgZm9yIGRpcmVjdG9yaWVzLCBzaW5nbGUgb2JqZWN0IGZvciBmaWxlc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS50eXBlICE9PSBcImZpbGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJHtwYXJhbXMucGF0aH0gaXMgbm90IGEgZmlsZWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ZW50ID0gQnVmZmVyLmZyb20oZGF0YS5jb250ZW50LCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIHsgY29udGVudCwgc2hhOiBkYXRhLnNoYSB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZXF1ZXN0RXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEVycm9yKHBhcmFtcy5wYXRoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBmaWxlIGNvbnRlbnQ6ICR7cGFyYW1zLnBhdGh9YCwge1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRSZXBvc2l0b3J5KG93bmVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVwb3NpdG9yeT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuI29jdG9raXQucmVzdC5yZXBvcy5nZXQoe1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbzogbmFtZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBSZXBvc2l0b3J5KGRhdGEubmFtZSwgZGF0YS5vd25lci5sb2dpbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJlcXVlc3RFcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3Iob3duZXIsIG5hbWUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggcmVwb3NpdG9yeSAke293bmVyfS8ke25hbWV9YCwge1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVGaWxlKHBhcmFtczogVXBkYXRlRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLiNvY3Rva2l0LnJlc3QucmVwb3MuY3JlYXRlT3JVcGRhdGVGaWxlQ29udGVudHMoe1xuICAgICAgICBicmFuY2g6IHBhcmFtcy5icmFuY2gsXG4gICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5mcm9tKHBhcmFtcy5jb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIG93bmVyOiBwYXJhbXMub3duZXIsXG4gICAgICAgIHBhdGg6IHBhcmFtcy5wYXRoLFxuICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgc2hhOiBwYXJhbXMuc2hhLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSBmaWxlOiAke3BhcmFtcy5wYXRofWAsIHtcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEZvbGxvdyB0aGUgc2FtZSBvcmRlciBvZiBwcmVjZWRlbmNlIG9mIGdoIGNsaVxuLy8gaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS9tYW51YWwvZ2hfaGVscF9lbnZpcm9ubWVudFxuZXhwb3J0IGNvbnN0IGdldEdpdEh1YlBBVCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4ge1xuICBpZiAocHJvY2Vzcy5lbnYuR0hfVE9LRU4pIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfVE9LRU47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTikge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgJCh7IHJlamVjdDogZmFsc2UgfSlgZ2ggYXV0aCB0b2tlbmA7XG4gIGlmICghcmVzdWx0LmZhaWxlZCAmJiByZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICByZXR1cm4gcmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKiBHaXRIdWIgb3JnYW5pemF0aW9uIHdob3NlIG1lbWJlcnMgYXJlIGFsbG93ZWQgdG8gZW1pdCBDTEkgdGVsZW1ldHJ5LiAqL1xuY29uc3QgUEFHT1BBX09SRyA9IFwicGFnb3BhXCI7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIGF1dGhlbnRpY2F0ZWQgdXNlciBpcyBhbiBhY3RpdmUgbWVtYmVyIG9mIHRoZSBQYWdvUEFcbiAqIEdpdEh1YiBvcmdhbml6YXRpb24uXG4gKlxuICogRmFpbHMgY2xvc2VkOiBhbnkgZXJyb3IgKG5ldHdvcmsgZmFpbHVyZSwgbWlzc2luZyBgcmVhZDpvcmdgIHNjb3BlLCA0MDMvNDA0KVxuICogcmVzb2x2ZXMgdG8gYGZhbHNlYCBzbyB0ZWxlbWV0cnkgc3RheXMgZGlzYWJsZWQgd2hlbiBtZW1iZXJzaGlwIGNhbm5vdCBiZVxuICogY29uZmlybWVkLlxuICpcbiAqIEBwYXJhbSBvY3Rva2l0IGluamVjdGFibGUgY2xpZW50LCBwcmltYXJpbHkgZm9yIHRlc3Rpbmc7IGRlZmF1bHRzIHRvIGEgY2xpZW50XG4gKiBhdXRoZW50aWNhdGVkIHdpdGggdGhlIHN1cHBsaWVkIHRva2VuLlxuICovXG5leHBvcnQgY29uc3QgaXNQYWdvcGFPcmdNZW1iZXIgPSBhc3luYyAoXG4gIHRva2VuOiBzdHJpbmcsXG4gIG9jdG9raXQ6IE9jdG9raXQgPSBuZXcgT2N0b2tpdCh7IGF1dGg6IHRva2VuIH0pLFxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBvY3Rva2l0LnJlc3Qub3Jncy5nZXRNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXIoe1xuICAgICAgb3JnOiBQQUdPUEFfT1JHLFxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhLnN0YXRlID09PSBcImFjdGl2ZVwiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBmZXRjaExhdGVzdFRhZyA9ICh7IGNsaWVudCwgb3duZXIsIHJlcG8gfTogR2l0SHViUmVsZWFzZVBhcmFtKSA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAvLyBHZXQgcmVwb3NpdG9yeSB0YWdzXG4gICAgY2xpZW50LnJlcXVlc3QoXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3NcIiwge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgIH0pLFxuICAgICgpID0+IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIHRhZ3MgZm9yICR7b3duZXJ9LyR7cmVwb31gKSxcbiAgKVxuICAgIC5tYXAoKHsgZGF0YSB9KSA9PiBkYXRhLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpKVxuICAgIC8vIEZpbHRlciBvdXQgdGFncyB0aGF0IGFyZSBub3QgdmFsaWQgc2VtdmVyXG4gICAgLm1hcCgodGFncykgPT5cbiAgICAgIHRhZ3MubWFwKCh0YWcpID0+IHNlbXZlclBhcnNlKHRhZykpLmZpbHRlcigodGFnKSA9PiB0YWcgIT09IG51bGwpLFxuICAgIClcbiAgICAvLyBTb3J0IHRhZ3MgaW4gYXNjZW5kaW5nIG9yZGVyXG4gICAgLm1hcChzZW12ZXJTb3J0KVxuICAgIC8vIEdldCB0aGUgbGF0ZXN0IHRhZ1xuICAgIC5tYXAoKHRhZ3MpID0+IHRhZ3MucG9wKCkgPz8gbnVsbCk7XG5cbmV4cG9ydCBjb25zdCBmZXRjaExhdGVzdFJlbGVhc2UgPSAoe1xuICBjbGllbnQsXG4gIG93bmVyLFxuICByZXBvLFxufTogR2l0SHViUmVsZWFzZVBhcmFtKSA9PlxuICBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShcbiAgICAvLyBHZXQgdGhlIGxhdGVzdCByZWxlYXNlIGZvciBhIHJlcG9zaXRvcnlcbiAgICBjbGllbnQucmVxdWVzdChcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0XCIsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICB9KSxcbiAgICAoKSA9PiBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBsYXRlc3QgcmVsZWFzZSBmb3IgJHtvd25lcn0vJHtyZXBvfWApLFxuICApLm1hcCgoeyBkYXRhIH0pID0+IHNlbXZlclBhcnNlKGRhdGEudGFnX25hbWUpKTtcbiJdfQ==