@pagopa/dx-cli 0.25.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/dist/adapters/azure/cloud-account-service.js +138 -92
- package/dist/adapters/azure/locations.d.ts +5 -1
- package/dist/adapters/azure/locations.js +1 -1
- package/dist/adapters/commander/commands/init.js +64 -15
- package/dist/adapters/github/github-repo.js +20 -2
- package/dist/domain/environment.d.ts +6 -1
- package/dist/domain/environment.js +1 -1
- package/package.json +23 -23
- package/templates/environment/workflow/_release-terraform-apply-bootstrapper-{{env.name}}.yaml.hbs +145 -2
|
@@ -16,7 +16,7 @@ import { setTimeout as sleep } from "node:timers/promises";
|
|
|
16
16
|
import { z } from "zod/v4";
|
|
17
17
|
import { environmentShort, } from "../../domain/environment.js";
|
|
18
18
|
import { terraformBackendSchema, } from "../../domain/remote-backend.js";
|
|
19
|
-
import { isAzureLocation, locations, locationShort } from "./locations.js";
|
|
19
|
+
import { isAzureLocation, locations, locationShort, } from "./locations.js";
|
|
20
20
|
// We are only interested in these properties for now;
|
|
21
21
|
// the actual result structure contains the full cloud resource object
|
|
22
22
|
export const resourceGraphDataSchema = z.object({
|
|
@@ -38,6 +38,7 @@ const builtInRoleDefinitionIds = {
|
|
|
38
38
|
contributor: "b24988ac-6180-42a0-ab88-20f7382dd24c",
|
|
39
39
|
keyVaultSecretsOfficer: "b86a8fe4-44ce-4948-aee5-eccb2c155cd7",
|
|
40
40
|
owner: "8e3af657-a8ff-443c-a75c-2fe8c4bcb635",
|
|
41
|
+
reader: "acdd72a7-3385-48ef-bd42-f606fba81ae7",
|
|
41
42
|
roleBasedAccessControlAdministrator: "f58310d9-a9f6-439a-9e8d-f62e7b41a168",
|
|
42
43
|
storageBlobDataContributor: "ba92f5b4-2d11-453d-a403-e96b0029c9fe",
|
|
43
44
|
};
|
|
@@ -47,6 +48,11 @@ const bootstrapIdentityRoleDefinitionIds = [
|
|
|
47
48
|
builtInRoleDefinitionIds.contributor,
|
|
48
49
|
builtInRoleDefinitionIds.storageBlobDataContributor,
|
|
49
50
|
];
|
|
51
|
+
const bootstrapCiIdentityRoleDefinitionIds = [
|
|
52
|
+
// Plan needs read access for refresh and blob access for Terraform backend locks/state.
|
|
53
|
+
builtInRoleDefinitionIds.reader,
|
|
54
|
+
builtInRoleDefinitionIds.storageBlobDataContributor,
|
|
55
|
+
];
|
|
50
56
|
const keyVaultDnsErrorSchema = z.object({
|
|
51
57
|
code: z.enum(["EAI_AGAIN", "ENOTFOUND"]),
|
|
52
58
|
});
|
|
@@ -185,49 +191,57 @@ export class AzureCloudAccountService {
|
|
|
185
191
|
logger.debug("Created resource group {resourceGroupName} in subscription {subscriptionId}", { resourceGroupName, subscriptionId: cloudAccount.id });
|
|
186
192
|
try {
|
|
187
193
|
const identityName = `${prefix}-${short.env}-${short.location}-bootstrap-id-01`;
|
|
194
|
+
const ciIdentityName = `${prefix}-${short.env}-${short.location}-bootstrap-ci-id-01`;
|
|
188
195
|
const msiClient = new ManagedServiceIdentityClient(this.#credential, cloudAccount.id);
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
196
|
+
const [cdIdentity, ciIdentity] = await Promise.all([
|
|
197
|
+
this.#createBootstrapperIdentity({
|
|
198
|
+
cloudAccountId: cloudAccount.id,
|
|
199
|
+
identityName,
|
|
200
|
+
msiClient,
|
|
201
|
+
parameters,
|
|
202
|
+
resourceGroupName,
|
|
203
|
+
}),
|
|
204
|
+
this.#createBootstrapperIdentity({
|
|
205
|
+
cloudAccountId: cloudAccount.id,
|
|
206
|
+
identityName: ciIdentityName,
|
|
207
|
+
msiClient,
|
|
208
|
+
parameters,
|
|
209
|
+
resourceGroupName,
|
|
210
|
+
}),
|
|
211
|
+
]);
|
|
195
212
|
const authorizationManagementClient = new AuthorizationManagementClient(this.#credential, cloudAccount.id);
|
|
196
213
|
const subscriptionClient = new SubscriptionClient(this.#credential);
|
|
197
214
|
const subscription = await subscriptionClient.subscriptions.get(cloudAccount.id);
|
|
198
215
|
assert.ok(subscription.tenantId, "Subscription tenant ID is undefined");
|
|
199
216
|
const tenantId = subscription.tenantId;
|
|
200
217
|
const subscriptionScope = `/subscriptions/${cloudAccount.id}`;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
identityName,
|
|
223
|
-
subscriptionId: cloudAccount.id,
|
|
224
|
-
});
|
|
225
|
-
await this.#storeBootstrapperEnvironmentSecrets({
|
|
218
|
+
await Promise.all([
|
|
219
|
+
this.#assignBootstrapperRoles({
|
|
220
|
+
authorizationManagementClient,
|
|
221
|
+
cloudAccountId: cloudAccount.id,
|
|
222
|
+
identity: cdIdentity,
|
|
223
|
+
roleDefinitionIds: bootstrapIdentityRoleDefinitionIds,
|
|
224
|
+
scope: subscriptionScope,
|
|
225
|
+
}),
|
|
226
|
+
this.#assignBootstrapperRoles({
|
|
227
|
+
authorizationManagementClient,
|
|
228
|
+
cloudAccountId: cloudAccount.id,
|
|
229
|
+
identity: ciIdentity,
|
|
230
|
+
roleDefinitionIds: bootstrapCiIdentityRoleDefinitionIds,
|
|
231
|
+
scope: subscriptionScope,
|
|
232
|
+
}),
|
|
233
|
+
]);
|
|
234
|
+
await this.#configureBootstrapperGitHubEnvironments({
|
|
235
|
+
cdIdentityClientId: cdIdentity.clientId,
|
|
236
|
+
cdIdentityName: cdIdentity.name,
|
|
237
|
+
ciIdentityClientId: ciIdentity.clientId,
|
|
238
|
+
ciIdentityName: ciIdentity.name,
|
|
226
239
|
cloudAccountId: cloudAccount.id,
|
|
227
240
|
github,
|
|
228
|
-
githubEnvironmentName,
|
|
229
241
|
gitHubService,
|
|
230
|
-
|
|
242
|
+
msiClient,
|
|
243
|
+
name,
|
|
244
|
+
resourceGroupName,
|
|
231
245
|
runnerAppCredentials,
|
|
232
246
|
tenantId,
|
|
233
247
|
});
|
|
@@ -251,12 +265,7 @@ export class AzureCloudAccountService {
|
|
|
251
265
|
// Cleanup resource group if initialization fails
|
|
252
266
|
await resourceManagementClient.resourceGroups.beginDeleteAndWait(resourceGroupName);
|
|
253
267
|
logger.debug("Deleted resource group {resourceGroupName} in subscription {subscriptionId} due to initialization failure", { resourceGroupName, subscriptionId: cloudAccount.id });
|
|
254
|
-
|
|
255
|
-
logger.error(cause.message);
|
|
256
|
-
}
|
|
257
|
-
throw new Error(`Error during the initialization of the cloud account`, {
|
|
258
|
-
cause,
|
|
259
|
-
});
|
|
268
|
+
throw new Error("Failed to initialize cloud account", { cause });
|
|
260
269
|
}
|
|
261
270
|
}
|
|
262
271
|
async isInitialized(cloudAccountId, { name, prefix }) {
|
|
@@ -355,6 +364,65 @@ export class AzureCloudAccountService {
|
|
|
355
364
|
}));
|
|
356
365
|
return results.every(Boolean);
|
|
357
366
|
}
|
|
367
|
+
async #assignBootstrapperRoles({ authorizationManagementClient, cloudAccountId, identity, roleDefinitionIds, scope, }) {
|
|
368
|
+
const logger = getLogger(["gen", "env"]);
|
|
369
|
+
await Promise.all(roleDefinitionIds.map((roleDefinitionId) => authorizationManagementClient.roleAssignments.create(scope, this.#createRoleAssignmentName(scope, identity.principalId, roleDefinitionId), {
|
|
370
|
+
principalId: identity.principalId,
|
|
371
|
+
principalType: "ServicePrincipal",
|
|
372
|
+
roleDefinitionId: this.#createRoleDefinitionResourceId(cloudAccountId, roleDefinitionId),
|
|
373
|
+
})));
|
|
374
|
+
logger.debug("Assigned bootstrap roles to identity {identityName} in subscription {subscriptionId}", { identityName: identity.name, subscriptionId: cloudAccountId });
|
|
375
|
+
}
|
|
376
|
+
async #configureBootstrapperGitHubEnvironments({ cdIdentityClientId, cdIdentityName, ciIdentityClientId, ciIdentityName, cloudAccountId, github, gitHubService, msiClient, name, resourceGroupName, runnerAppCredentials, tenantId, }) {
|
|
377
|
+
const logger = getLogger(["gen", "env"]);
|
|
378
|
+
const cdEnvironmentName = `bootstrapper-${name}-cd`;
|
|
379
|
+
const ciEnvironmentName = `bootstrapper-${name}-ci`;
|
|
380
|
+
const environmentIdentities = [
|
|
381
|
+
{
|
|
382
|
+
environmentName: cdEnvironmentName,
|
|
383
|
+
identityClientId: cdIdentityClientId,
|
|
384
|
+
identityName: cdIdentityName,
|
|
385
|
+
runnerAppCredentials,
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
environmentName: ciEnvironmentName,
|
|
389
|
+
identityClientId: ciIdentityClientId,
|
|
390
|
+
identityName: ciIdentityName,
|
|
391
|
+
},
|
|
392
|
+
];
|
|
393
|
+
// Include a repository-derived suffix so different repositories can share
|
|
394
|
+
// the same bootstrap identity without overwriting each other's OIDC trust.
|
|
395
|
+
await Promise.all(environmentIdentities.map(({ environmentName, identityName }) => msiClient.federatedIdentityCredentials.createOrUpdate(resourceGroupName, identityName, this.#createFederatedCredentialName({
|
|
396
|
+
github,
|
|
397
|
+
githubEnvironmentName: environmentName,
|
|
398
|
+
}), {
|
|
399
|
+
audiences: ["api://AzureADTokenExchange"],
|
|
400
|
+
issuer: "https://token.actions.githubusercontent.com",
|
|
401
|
+
subject: `repo:${github.owner}/${github.repo}:environment:${environmentName}`,
|
|
402
|
+
})));
|
|
403
|
+
logger.debug("Configured bootstrapper federated identity credentials in subscription {subscriptionId}", { subscriptionId: cloudAccountId });
|
|
404
|
+
await Promise.all(environmentIdentities.map(({ environmentName, identityClientId, runnerAppCredentials }) => this.#storeBootstrapperEnvironmentSecrets({
|
|
405
|
+
cloudAccountId,
|
|
406
|
+
github,
|
|
407
|
+
githubEnvironmentName: environmentName,
|
|
408
|
+
gitHubService,
|
|
409
|
+
identityClientId,
|
|
410
|
+
runnerAppCredentials,
|
|
411
|
+
tenantId,
|
|
412
|
+
})));
|
|
413
|
+
}
|
|
414
|
+
async #createBootstrapperIdentity({ cloudAccountId, identityName, msiClient, parameters, resourceGroupName, }) {
|
|
415
|
+
const logger = getLogger(["gen", "env"]);
|
|
416
|
+
const identity = await msiClient.userAssignedIdentities.createOrUpdate(resourceGroupName, identityName, parameters);
|
|
417
|
+
assert.ok(identity.principalId, "Managed identity principal ID is undefined");
|
|
418
|
+
assert.ok(identity.clientId, "Managed identity client ID is undefined");
|
|
419
|
+
logger.debug("Created identity {identityName} in subscription {subscriptionId}", { identityName, subscriptionId: cloudAccountId });
|
|
420
|
+
return {
|
|
421
|
+
clientId: identity.clientId,
|
|
422
|
+
name: identityName,
|
|
423
|
+
principalId: identity.principalId,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
358
426
|
async #createCommonKeyVault({ cloudAccount, name, prefix, resourceGroupName, shortEnv, shortLocation, tags, tenantId, }) {
|
|
359
427
|
const logger = getLogger(["gen", "env"]);
|
|
360
428
|
const kvClient = new KeyVaultManagementClient(this.#credential, cloudAccount.id);
|
|
@@ -447,57 +515,35 @@ export class AzureCloudAccountService {
|
|
|
447
515
|
}
|
|
448
516
|
async #storeBootstrapperEnvironmentSecrets({ cloudAccountId, github, githubEnvironmentName, gitHubService, identityClientId, runnerAppCredentials, tenantId, }) {
|
|
449
517
|
const logger = getLogger(["gen", "env"]);
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
gitHubService.createOrUpdateEnvironmentSecret({
|
|
480
|
-
environmentName: githubEnvironmentName,
|
|
481
|
-
owner: github.owner,
|
|
482
|
-
repo: github.repo,
|
|
483
|
-
secretName: "GH_APP_CLIENT_ID",
|
|
484
|
-
secretValue: runnerAppCredentials.clientId,
|
|
485
|
-
}),
|
|
486
|
-
gitHubService.createOrUpdateEnvironmentSecret({
|
|
487
|
-
environmentName: githubEnvironmentName,
|
|
488
|
-
owner: github.owner,
|
|
489
|
-
repo: github.repo,
|
|
490
|
-
secretName: "GH_APP_INSTALLATION_ID",
|
|
491
|
-
secretValue: runnerAppCredentials.installationId,
|
|
492
|
-
}),
|
|
493
|
-
gitHubService.createOrUpdateEnvironmentSecret({
|
|
494
|
-
environmentName: githubEnvironmentName,
|
|
495
|
-
owner: github.owner,
|
|
496
|
-
repo: github.repo,
|
|
497
|
-
secretName: "GH_APP_KEY",
|
|
498
|
-
secretValue: runnerAppCredentials.key.trimEnd(),
|
|
499
|
-
}),
|
|
500
|
-
]);
|
|
518
|
+
const commonSecrets = [
|
|
519
|
+
{ secretName: "ARM_CLIENT_ID", secretValue: identityClientId },
|
|
520
|
+
{ secretName: "ARM_TENANT_ID", secretValue: tenantId },
|
|
521
|
+
{ secretName: "ARM_SUBSCRIPTION_ID", secretValue: cloudAccountId },
|
|
522
|
+
];
|
|
523
|
+
const releaseSecrets = runnerAppCredentials
|
|
524
|
+
? [
|
|
525
|
+
{ secretName: "GH_APP_ID", secretValue: runnerAppCredentials.id },
|
|
526
|
+
{
|
|
527
|
+
secretName: "GH_APP_CLIENT_ID",
|
|
528
|
+
secretValue: runnerAppCredentials.clientId,
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
secretName: "GH_APP_INSTALLATION_ID",
|
|
532
|
+
secretValue: runnerAppCredentials.installationId,
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
secretName: "GH_APP_KEY",
|
|
536
|
+
secretValue: runnerAppCredentials.key.trimEnd(),
|
|
537
|
+
},
|
|
538
|
+
]
|
|
539
|
+
: [];
|
|
540
|
+
await Promise.all([...commonSecrets, ...releaseSecrets].map(({ secretName, secretValue }) => gitHubService.createOrUpdateEnvironmentSecret({
|
|
541
|
+
environmentName: githubEnvironmentName,
|
|
542
|
+
owner: github.owner,
|
|
543
|
+
repo: github.repo,
|
|
544
|
+
secretName,
|
|
545
|
+
secretValue,
|
|
546
|
+
})));
|
|
501
547
|
logger.debug("Set GitHub environment secrets for {environmentName}", {
|
|
502
548
|
environmentName: githubEnvironmentName,
|
|
503
549
|
subscriptionId: cloudAccountId,
|
|
@@ -538,4 +584,4 @@ export class AzureCloudAccountService {
|
|
|
538
584
|
}
|
|
539
585
|
}
|
|
540
586
|
}
|
|
541
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtYWNjb3VudC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2Nsb3VkLWFjY291bnQtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU0zQixPQUFPLEVBRUwsZ0JBQWdCLEdBQ2pCLE1BQU0sNkJBQTZCLENBQUM7QUFNckMsT0FBTyxFQUVMLHNCQUFzQixHQUN2QixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNFLHNEQUFzRDtBQUN0RCxzRUFBc0U7QUFDdEUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDaEIsYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ2YsQ0FBQyxDQUFDO0FBRUgsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ2YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxrQ0FBa0MsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xELGlCQUFpQixFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUM7Q0FDL0MsQ0FBQyxDQUFDO0FBRUgsTUFBTSx3QkFBd0IsR0FBRztJQUMvQixXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELHNCQUFzQixFQUFFLHNDQUFzQztJQUM5RCxLQUFLLEVBQUUsc0NBQXNDO0lBQzdDLG1DQUFtQyxFQUFFLHNDQUFzQztJQUMzRSwwQkFBMEIsRUFBRSxzQ0FBc0M7Q0FDMUQsQ0FBQztBQUVYLE1BQU0sa0NBQWtDLEdBQUc7SUFDekMsc0hBQXNIO0lBQ3RILHdCQUF3QixDQUFDLG1DQUFtQztJQUM1RCx3QkFBd0IsQ0FBQyxXQUFXO0lBQ3BDLHdCQUF3QixDQUFDLDBCQUEwQjtDQUMzQyxDQUFDO0FBRVgsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3RDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUNILE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO0FBRTVDLE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsV0FBVyxDQUFrQjtJQUM3QiwwQkFBMEIsR0FBRztRQUMzQixtQkFBbUI7UUFDbkIsNEJBQTRCO1FBQzVCLHlCQUF5QjtRQUN6QixlQUFlO1FBQ2YseUJBQXlCO1FBQ3pCLDBCQUEwQjtRQUMxQixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLDZCQUE2QjtRQUM3QiwwQkFBMEI7UUFDMUIsMkJBQTJCO1FBQzNCLG9CQUFvQjtRQUNwQixzQkFBc0I7UUFDdEIsZUFBZTtRQUNmLG1CQUFtQjtRQUNuQixlQUFlO0tBQ1AsQ0FBQztJQUNYLG9CQUFvQixDQUFzQjtJQUUxQyxZQUFZLFVBQTJCO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLGNBQWtDLEVBQ2xDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBaUI7UUFFL0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsMkRBQTJEO1FBQzNELDRGQUE0RjtRQUM1RixrRkFBa0Y7UUFDbEYsTUFBTSxZQUFZLEdBQUcsR0FBRyxNQUFNLEdBQUcsUUFBUSxJQUFJLFlBQVksNkJBQTZCLENBQUM7UUFDdkYsTUFBTSxLQUFLLEdBQUc7OzRDQUUwQixZQUFZO2FBQzNDLENBQUM7UUFDVixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUM7WUFDdkQsS0FBSztZQUNMLGFBQWEsRUFBRSxDQUFDLGNBQWMsQ0FBQztTQUNoQyxDQUFDLENBQUM7UUFDSCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVFLHNGQUFzRjtRQUN0RixJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsNkJBQTZCO2dCQUM3QixNQUFNLGtCQUFrQixHQUN0QixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDN0Isc0VBQXNFO29CQUN0RSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztnQkFDRCxPQUFPLGtCQUFrQixDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sc0JBQXNCLENBQUMsS0FBSyxDQUFDO1lBQ2xDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhO1lBQ25ELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQzNDLGNBQWMsRUFBRSxjQUFjO1lBQzlCLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsNkJBQTZCLENBQ2pDLGNBQWtDO1FBRWxDLElBQUksQ0FBQztZQUNILGlEQUFpRDtZQUNqRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBRTdELDRDQUE0QztZQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLDZCQUE2QixDQUNsRCxJQUFJLENBQUMsV0FBVyxFQUNoQixjQUFjLENBQ2YsQ0FBQztZQUVGLE1BQU0sYUFBYSxHQUFHO2dCQUNwQix3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsUUFBUTtnQkFDeEMsd0JBQXdCLENBQUMsMEJBQTBCLEVBQUUsZ0NBQWdDO2dCQUNyRix3QkFBd0IsQ0FBQyxzQkFBc0IsRUFBRSw0QkFBNEI7YUFDOUUsQ0FBQztZQUVGLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixjQUFjLEVBQUUsQ0FBQztZQUVqRCx1RUFBdUU7WUFDdkUsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBRXBELElBQUksS0FBSyxFQUFFLE1BQU0sVUFBVSxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUNwRSxLQUFLLENBQ04sRUFBRSxDQUFDO2dCQUNGLGtFQUFrRTtnQkFDbEUsSUFDRSxVQUFVLENBQUMsV0FBVztvQkFDdEIsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQzNDLENBQUM7b0JBQ0QsdURBQXVEO29CQUN2RCwwRkFBMEY7b0JBQzFGLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2hFLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQ2QseUJBQXlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUMzQyxDQUFDO2dCQUNILENBQUM7Z0JBRUQsNERBQTREO2dCQUM1RCxJQUNFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUNuQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQzVDLEVBQ0QsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztZQUVELDBDQUEwQztZQUMxQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FDdkQseUJBQXlCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUM1QyxDQUFDO1lBRUYsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsdUVBQXVFO1lBQ3ZFLElBQ0UsS0FBSztnQkFDTCxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUN6QixZQUFZLElBQUksS0FBSztnQkFDckIsS0FBSyxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQ3hCLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0Qsd0JBQXdCO1lBQ3hCLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLFlBQTBCLEVBQzFCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBaUIsRUFDL0Isb0JBQTBDLEVBQzFDLE1BQWtCLEVBQ2xCLGFBQTRCLEVBQzVCLE9BQStCLEVBQUU7UUFFakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxFQUFFLENBQ1AsZUFBZSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFDN0MseUVBQXlFLENBQzFFLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV6QyxxRUFBcUU7UUFDckUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSx3QkFBd0IsQ0FDM0QsSUFBSSxDQUFDLFdBQVcsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FDaEIsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFHO1lBQ1osR0FBRyxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQztZQUMzQixRQUFRLEVBQUUsYUFBYSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7U0FDdEQsQ0FBQztRQUVGLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxlQUFlLENBQUM7UUFFbEYsTUFBTSxVQUFVLEdBQUc7WUFDakIsUUFBUSxFQUFFLFlBQVksQ0FBQyxlQUFlO1lBQ3RDLElBQUksRUFBRTtnQkFDSixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLEdBQUcsSUFBSTthQUNSO1NBQ0YsQ0FBQztRQUVGLE1BQU0sd0JBQXdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FDMUQsaUJBQWlCLEVBQ2pCLFVBQVUsQ0FDWCxDQUFDO1FBRUYsTUFBTSxDQUFDLEtBQUssQ0FDViw2RUFBNkUsRUFDN0UsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUN2RCxDQUFDO1FBRUYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUcsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxrQkFBa0IsQ0FBQztZQUVoRixNQUFNLFNBQVMsR0FBRyxJQUFJLDRCQUE0QixDQUNoRCxJQUFJLENBQUMsV0FBVyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUNoQixDQUFDO1lBRUYsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUNwRSxpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFVBQVUsQ0FDWCxDQUFDO1lBRUYsTUFBTSxDQUFDLEVBQUUsQ0FDUCxRQUFRLENBQUMsV0FBVyxFQUNwQiw0Q0FBNEMsQ0FDN0MsQ0FBQztZQUNGLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUNqRCxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUseUNBQXlDLENBQUMsQ0FBQztZQUN4RSxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFFM0MsTUFBTSxDQUFDLEtBQUssQ0FDVixrRUFBa0UsRUFDbEUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FDbEQsQ0FBQztZQUVGLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSw2QkFBNkIsQ0FDckUsSUFBSSxDQUFDLFdBQVcsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FDaEIsQ0FBQztZQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUM3RCxZQUFZLENBQUMsRUFBRSxDQUNoQixDQUFDO1lBQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUN2QyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7WUFFOUQsaUhBQWlIO1lBQ2pILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixrQ0FBa0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQzFELDZCQUE2QixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQ2xELGlCQUFpQixFQUNqQixJQUFJLENBQUMseUJBQXlCLENBQzVCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsZ0JBQWdCLENBQ2pCLEVBQ0Q7Z0JBQ0UsV0FBVyxFQUFFLG1CQUFtQjtnQkFDaEMsYUFBYSxFQUFFLGtCQUFrQjtnQkFDakMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLCtCQUErQixDQUNwRCxZQUFZLENBQUMsRUFBRSxFQUNmLGdCQUFnQixDQUNqQjthQUNGLENBQ0YsQ0FDRixDQUNGLENBQUM7WUFFRixNQUFNLENBQUMsS0FBSyxDQUNWLHNGQUFzRixFQUN0RixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUNsRCxDQUFDO1lBRUYsTUFBTSxxQkFBcUIsR0FBRyxnQkFBZ0IsSUFBSSxLQUFLLENBQUM7WUFDeEQsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUM7Z0JBQ2xFLE1BQU07Z0JBQ04scUJBQXFCO2FBQ3RCLENBQUMsQ0FBQztZQUVILDBFQUEwRTtZQUMxRSwyRUFBMkU7WUFDM0UsTUFBTSxTQUFTLENBQUMsNEJBQTRCLENBQUMsY0FBYyxDQUN6RCxpQkFBaUIsRUFDakIsWUFBWSxFQUNaLHVCQUF1QixFQUN2QjtnQkFDRSxTQUFTLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztnQkFDekMsTUFBTSxFQUFFLDZDQUE2QztnQkFDckQsT0FBTyxFQUFFLFFBQVEsTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxnQkFBZ0IscUJBQXFCLEVBQUU7YUFDcEYsQ0FDRixDQUFDO1lBRUYsTUFBTSxDQUFDLEtBQUssQ0FDVix3SEFBd0gsRUFDeEg7Z0JBQ0UsY0FBYyxFQUFFLHVCQUF1QjtnQkFDdkMsWUFBWTtnQkFDWixjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUU7YUFDaEMsQ0FDRixDQUFDO1lBRUYsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUM7Z0JBQzlDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDL0IsTUFBTTtnQkFDTixxQkFBcUI7Z0JBQ3JCLGFBQWE7Z0JBQ2IsZ0JBQWdCO2dCQUNoQixvQkFBb0I7Z0JBQ3BCLFFBQVE7YUFDVCxDQUFDLENBQUM7WUFFSCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztnQkFDcEQsWUFBWTtnQkFDWixJQUFJO2dCQUNKLE1BQU07Z0JBQ04saUJBQWlCO2dCQUNqQixRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUc7Z0JBQ25CLGFBQWEsRUFBRSxLQUFLLENBQUMsUUFBUTtnQkFDN0IsSUFBSTtnQkFDSixRQUFRO2FBQ1QsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUM7Z0JBQ2hDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDL0IsWUFBWTtnQkFDWixvQkFBb0I7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixpREFBaUQ7WUFDakQsTUFBTSx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQzlELGlCQUFpQixDQUNsQixDQUFDO1lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FDViwyR0FBMkcsRUFDM0csRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUN2RCxDQUFDO1lBQ0YsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxFQUFFO2dCQUN0RSxLQUFLO2FBQ04sQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUNqQixjQUFrQyxFQUNsQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQWlCO1FBRS9CLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxNQUFNLElBQUksUUFBUSxLQUFLLFlBQVksa0NBQWtDLENBQUM7UUFDdEcsTUFBTSxhQUFhLEdBQUc7OzRDQUVrQixvQkFBb0I7YUFDbkQsQ0FBQztRQUVWLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxNQUFNLElBQUksUUFBUSxLQUFLLFlBQVksK0JBQStCLENBQUM7UUFDbkcsTUFBTSxhQUFhLEdBQUc7OzRDQUVrQixvQkFBb0I7YUFDbkQsQ0FBQztRQUVWLE1BQU0sQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixDQUFDLEdBQzVELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDO2dCQUNsQyxLQUFLLEVBQUUsYUFBYTtnQkFDcEIsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2hDLENBQUM7WUFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDO2dCQUNsQyxLQUFLLEVBQUUsYUFBYTtnQkFDcEIsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2hDLENBQUM7WUFDRixJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDO1NBQzdDLENBQUMsQ0FBQztRQUVMLE1BQU0sV0FBVyxHQUNmLGNBQWMsQ0FBQyxZQUFZLEdBQUcsQ0FBQztZQUMvQixjQUFjLENBQUMsWUFBWSxHQUFHLENBQUM7WUFDL0Isc0JBQXNCLENBQUM7UUFFekIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFekMsTUFBTSxDQUFDLEtBQUssQ0FBQywwREFBMEQsRUFBRTtZQUN2RSxXQUFXO1lBQ1gsY0FBYyxFQUFFLGNBQWM7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyx5QkFBeUIsQ0FDN0IsWUFBMEIsRUFDMUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFpQixFQUMvQixPQUErQixFQUFFO1FBRWpDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsRUFBRSxDQUNQLGVBQWUsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEVBQzdDLHlFQUF5RSxDQUMxRSxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFekMsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLHdCQUF3QixDQUMzRCxJQUFJLENBQUMsV0FBVyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUNoQixDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUc7WUFDWixHQUFHLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQzNCLFFBQVEsRUFBRSxhQUFhLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztTQUN0RCxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUc7WUFDakIsUUFBUSxFQUFFLFlBQVksQ0FBQyxlQUFlO1lBQ3RDLElBQUksRUFBRTtnQkFDSixXQUFXLEVBQUUsSUFBSTtnQkFDakIsR0FBRyxJQUFJO2FBQ1I7U0FDRixDQUFDO1FBRUYsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLGdCQUFnQixDQUFDO1FBRW5GLE1BQU0sd0JBQXdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FDMUQsaUJBQWlCLEVBQ2pCLFVBQVUsQ0FDWCxDQUFDO1FBRUYsTUFBTSxDQUFDLEtBQUssQ0FDViw2RUFBNkUsRUFDN0UsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUN2RCxDQUFDO1FBRUYsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLHVCQUF1QixDQUN6RCxJQUFJLENBQUMsV0FBVyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUNoQixDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQ2xCLE1BQU0sdUJBQXVCLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUM5RCxpQkFBaUIsRUFDakIsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxhQUFhLEVBQ25EO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsR0FBRyxFQUFFO2dCQUNILElBQUksRUFBRSxjQUFjO2dCQUNwQixJQUFJLEVBQUUsVUFBVTthQUNqQjtZQUNELEdBQUcsVUFBVTtTQUNkLENBQ0YsQ0FBQztRQUVKLE1BQU0sQ0FBQyxFQUFFLENBQ1AsY0FBYyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFDckMsNENBQTRDLENBQzdDLENBQUM7UUFFRixNQUFNLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUVwRSxNQUFNLENBQUMsS0FBSyxDQUNWLCtFQUErRSxFQUMvRTtZQUNFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxJQUFJO1lBQ3ZDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtTQUNoQyxDQUNGLENBQUM7UUFDRixNQUFNLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLENBQzdDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQ3JDLElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQUM7UUFFRixNQUFNLGVBQWUsR0FDbkIsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUM7WUFDSCxNQUFNLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLDBEQUEwRDtZQUMxRCwrREFBK0Q7WUFDL0QsTUFBTSx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQzlELGlCQUFpQixDQUNsQixDQUFDO1lBQ0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsRUFBRTtnQkFDakUsS0FBSyxFQUFFLENBQUM7YUFDVCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7WUFDbEMsaUJBQWlCO1lBQ2pCLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxJQUFJO1lBQ3ZDLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFBRTtZQUMvQixJQUFJLEVBQUUsU0FBUztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLGNBQXNCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksd0JBQXdCLENBQ3pDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLGNBQWMsQ0FDZixDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sUUFBUSxDQUFDLGlCQUFpQixLQUFLLFlBQVksQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFDMUIsWUFBWSxFQUNaLElBQUksRUFDSixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixhQUFhLEVBQ2IsSUFBSSxFQUNKLFFBQVEsR0FVVDtRQUNDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sUUFBUSxHQUFHLElBQUksd0JBQXdCLENBQzNDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQ2hCLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxHQUFHLE1BQU0sSUFBSSxRQUFRLElBQUksYUFBYSxlQUFlLENBQUM7UUFDM0UsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLEtBQUssR0FBRyxDQUFDO1FBRWxELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztZQUN6RCxJQUFJLEVBQUUsWUFBWTtZQUNsQixJQUFJLEVBQUUsMkJBQTJCO1NBQ2xDLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FDOUMsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWjtZQUNFLFFBQVEsRUFBRSxZQUFZLENBQUMsZUFBZTtZQUN0QyxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDeEQsd0JBQXdCLEVBQUUsSUFBSTtnQkFDOUIscUJBQXFCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDbEUsdUJBQXVCLEVBQUUsSUFBSTtnQkFDN0IsR0FBRyxFQUFFO29CQUNILE1BQU0sRUFBRSxHQUFHO29CQUNYLElBQUksRUFBRSxVQUFVO2lCQUNqQjtnQkFDRCx5QkFBeUIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxRQUFRO2FBQ1Q7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLEdBQUcsSUFBSTthQUNSO1NBQ0YsQ0FDRixDQUFDO1FBRUYsTUFBTSxDQUFDLEtBQUssQ0FDVixtRUFBbUUsRUFDbkUsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FDbEQsQ0FBQztRQUVGLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxFQUM3QixNQUFNLEVBQ04scUJBQXFCLEdBSXRCO1FBQ0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFL0QsT0FBTyxHQUFHLFFBQVEsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCx5QkFBeUIsQ0FDdkIsS0FBYSxFQUNiLFdBQW1CLEVBQ25CLGdCQUF3QjtRQUV4QixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO2FBQzlCLE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxXQUFXLElBQUksZ0JBQWdCLEVBQUUsQ0FBQzthQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakIsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQzNELEVBQUUsRUFDRixFQUFFLENBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCwrQkFBK0IsQ0FDN0IsY0FBc0IsRUFDdEIsZ0JBQXdCO1FBRXhCLE9BQU8sa0JBQWtCLGNBQWMsc0RBQXNELGdCQUFnQixFQUFFLENBQUM7SUFDbEgsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUI7UUFDM0IsMEVBQTBFO1FBQzFFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDOUIsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxDQUFDO29CQUNILE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQ25ELHNDQUFzQyxDQUN2QyxDQUFDO29CQUNGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxDQUNGLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLEVBQ3hELElBQUksQ0FDTCxDQUFDO3dCQUNGLE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxLQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsMEJBQTBCO1FBQzFCLE1BQU0sVUFBVSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0RCxNQUFNLEVBQUUsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUUzQixrRUFBa0U7UUFDbEUsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLElBQUksUUFBUSxHQUF1QixtQ0FBbUMsQ0FBQztRQUV2RSxPQUFPLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxRCxNQUFNLFFBQVEsR0FBRyxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkUsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxRQUFRLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxjQUFzQjtRQUM3QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksd0JBQXdCLENBQ3pDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLGNBQWMsQ0FDZixDQUFDO1FBRUYsTUFBTSxDQUFDLElBQUksQ0FDVCx5RUFBeUUsRUFDekUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FDbEUsQ0FBQztRQUVGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUN0RCxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLENBQUMsSUFBSSxDQUNULG9FQUFvRSxFQUNwRSxFQUFFLGNBQWMsRUFBRSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxFQUN6QyxjQUFjLEVBQ2QsTUFBTSxFQUNOLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixRQUFRLEdBU1Q7UUFDQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV6QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDaEIsYUFBYSxDQUFDLCtCQUErQixDQUFDO2dCQUM1QyxlQUFlLEVBQUUscUJBQXFCO2dCQUN0QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsVUFBVSxFQUFFLGVBQWU7Z0JBQzNCLFdBQVcsRUFBRSxnQkFBZ0I7YUFDOUIsQ0FBQztZQUNGLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQztnQkFDNUMsZUFBZSxFQUFFLHFCQUFxQjtnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFVBQVUsRUFBRSxlQUFlO2dCQUMzQixXQUFXLEVBQUUsUUFBUTthQUN0QixDQUFDO1lBQ0YsYUFBYSxDQUFDLCtCQUErQixDQUFDO2dCQUM1QyxlQUFlLEVBQUUscUJBQXFCO2dCQUN0QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsVUFBVSxFQUFFLHFCQUFxQjtnQkFDakMsV0FBVyxFQUFFLGNBQWM7YUFDNUIsQ0FBQztZQUNGLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQztnQkFDNUMsZUFBZSxFQUFFLHFCQUFxQjtnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFVBQVUsRUFBRSxXQUFXO2dCQUN2QixXQUFXLEVBQUUsb0JBQW9CLENBQUMsRUFBRTthQUNyQyxDQUFDO1lBQ0YsYUFBYSxDQUFDLCtCQUErQixDQUFDO2dCQUM1QyxlQUFlLEVBQUUscUJBQXFCO2dCQUN0QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsV0FBVyxFQUFFLG9CQUFvQixDQUFDLFFBQVE7YUFDM0MsQ0FBQztZQUNGLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQztnQkFDNUMsZUFBZSxFQUFFLHFCQUFxQjtnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFVBQVUsRUFBRSx3QkFBd0I7Z0JBQ3BDLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxjQUFjO2FBQ2pELENBQUM7WUFDRixhQUFhLENBQUMsK0JBQStCLENBQUM7Z0JBQzVDLGVBQWUsRUFBRSxxQkFBcUI7Z0JBQ3RDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixVQUFVLEVBQUUsWUFBWTtnQkFDeEIsV0FBVyxFQUFFLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7YUFDaEQsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxLQUFLLENBQUMsc0RBQXNELEVBQUU7WUFDbkUsZUFBZSxFQUFFLHFCQUFxQjtZQUN0QyxjQUFjLEVBQUUsY0FBYztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUFDLEVBQzNCLGNBQWMsRUFDZCxZQUFZLEVBQ1osb0JBQW9CLEdBS3JCO1FBQ0MsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFekMsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUM7WUFDdkMsY0FBYztZQUNkLFlBQVk7U0FDYixDQUFDLENBQUM7UUFFSCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FDbkMsV0FBVyxZQUFZLG1CQUFtQixFQUMxQyxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO1FBRUYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2hCLFlBQVksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLFlBQVksQ0FBQyxTQUFTLENBQ3BCLG1DQUFtQyxFQUNuQyxvQkFBb0IsQ0FBQyxjQUFjLENBQ3BDO1lBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FDcEIsdUJBQXVCLEVBQ3ZCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDbkM7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsS0FBSyxDQUNWLDhFQUE4RSxFQUM5RSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQ2pELENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQ2xDLGNBQWMsRUFDZCxZQUFZLEdBSWI7UUFDQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxHQUFHLFlBQVksa0JBQWtCLENBQUM7UUFFbkQsNkVBQTZFO1FBQzdFLHdFQUF3RTtRQUN4RSxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksMkJBQTJCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN4RSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZCLE9BQU87WUFDVCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUNFLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU87b0JBQ2hELE9BQU8sS0FBSywyQkFBMkIsRUFDdkMsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHVCQUF1QixRQUFRLHFCQUFxQixFQUNwRCxFQUFFLEtBQUssRUFBRSxDQUNWLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxNQUFNLENBQUMsS0FBSyxDQUNWLGlHQUFpRyxFQUNqRyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQzdDLENBQUM7Z0JBQ0YsTUFBTSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVG9rZW5DcmVkZW50aWFsIH0gZnJvbSBcIkBhenVyZS9pZGVudGl0eVwiO1xuXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLWF1dGhvcml6YXRpb25cIjtcbmltcG9ydCB7IEtleVZhdWx0TWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLWtleXZhdWx0XCI7XG5pbXBvcnQgeyBNYW5hZ2VkU2VydmljZUlkZW50aXR5Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tbXNpXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYXBoQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VncmFwaFwiO1xuaW1wb3J0IHsgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25DbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1yZXNvdXJjZXMtc3Vic2NyaXB0aW9uc1wiO1xuaW1wb3J0IHsgU3RvcmFnZU1hbmFnZW1lbnRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1zdG9yYWdlXCI7XG5pbXBvcnQgeyBTZWNyZXRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2tleXZhdWx0LXNlY3JldHNcIjtcbmltcG9ydCB7IEJsb2JTZXJ2aWNlQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9zdG9yYWdlLWJsb2JcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQG1pY3Jvc29mdC9taWNyb3NvZnQtZ3JhcGgtY2xpZW50XCI7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0L3N0cmljdFwiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbG9va3VwIH0gZnJvbSBcIm5vZGU6ZG5zL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNsZWVwIH0gZnJvbSBcIm5vZGU6dGltZXJzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZC92NFwiO1xuXG5pbXBvcnQge1xuICBDbG91ZEFjY291bnQsXG4gIHR5cGUgQ2xvdWRBY2NvdW50U2VydmljZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9jbG91ZC1hY2NvdW50LmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudmlyb25tZW50SWQsXG4gIGVudmlyb25tZW50U2hvcnQsXG59IGZyb20gXCIuLi8uLi9kb21haW4vZW52aXJvbm1lbnQuanNcIjtcbmltcG9ydCB7IHR5cGUgR2l0SHViUmVwbyB9IGZyb20gXCIuLi8uLi9kb21haW4vZ2l0aHViLXJlcG8uanNcIjtcbmltcG9ydCB7XG4gIEdpdEh1YkFwcENyZWRlbnRpYWxzLFxuICB0eXBlIEdpdEh1YlNlcnZpY2UsXG59IGZyb20gXCIuLi8uLi9kb21haW4vZ2l0aHViLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIFRlcnJhZm9ybUJhY2tlbmQsXG4gIHRlcnJhZm9ybUJhY2tlbmRTY2hlbWEsXG59IGZyb20gXCIuLi8uLi9kb21haW4vcmVtb3RlLWJhY2tlbmQuanNcIjtcbmltcG9ydCB7IGlzQXp1cmVMb2NhdGlvbiwgbG9jYXRpb25zLCBsb2NhdGlvblNob3J0IH0gZnJvbSBcIi4vbG9jYXRpb25zLmpzXCI7XG5cbi8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlc2UgcHJvcGVydGllcyBmb3Igbm93O1xuLy8gdGhlIGFjdHVhbCByZXN1bHQgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBmdWxsIGNsb3VkIHJlc291cmNlIG9iamVjdFxuZXhwb3J0IGNvbnN0IHJlc291cmNlR3JhcGhEYXRhU2NoZW1hID0gei5vYmplY3Qoe1xuICBsb2NhdGlvbjogei5lbnVtKGxvY2F0aW9ucyksXG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIHJlc291cmNlR3JvdXA6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhVc2VyUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxufSk7XG5cbmNvbnN0IGdyYXBoR3JvdXBNZW1iZXJzaGlwSXRlbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhHcm91cE1lbWJlcnNoaXBSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgXCJAb2RhdGEubmV4dExpbmtcIjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB2YWx1ZTogei5hcnJheShncmFwaEdyb3VwTWVtYmVyc2hpcEl0ZW1TY2hlbWEpLFxufSk7XG5cbmNvbnN0IGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcyA9IHtcbiAgY29udHJpYnV0b3I6IFwiYjI0OTg4YWMtNjE4MC00MmEwLWFiODgtMjBmNzM4MmRkMjRjXCIsXG4gIGtleVZhdWx0U2VjcmV0c09mZmljZXI6IFwiYjg2YThmZTQtNDRjZS00OTQ4LWFlZTUtZWNjYjJjMTU1Y2Q3XCIsXG4gIG93bmVyOiBcIjhlM2FmNjU3LWE4ZmYtNDQzYy1hNzVjLTJmZThjNGJjYjYzNVwiLFxuICByb2xlQmFzZWRBY2Nlc3NDb250cm9sQWRtaW5pc3RyYXRvcjogXCJmNTgzMTBkOS1hOWY2LTQzOWEtOWU4ZC1mNjJlN2I0MWExNjhcIixcbiAgc3RvcmFnZUJsb2JEYXRhQ29udHJpYnV0b3I6IFwiYmE5MmY1YjQtMmQxMS00NTNkLWE0MDMtZTk2YjAwMjljOWZlXCIsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBib290c3RyYXBJZGVudGl0eVJvbGVEZWZpbml0aW9uSWRzID0gW1xuICAvLyBUaGVzZSByb2xlcyBsZXQgdGhlIGJvb3RzdHJhcCBpZGVudGl0eSBydW4gdGhlIGJvb3RzdHJhcHBlciBtb2R1bGUgZnJvbSBHaXRIdWIgQWN0aW9ucyB3aXRob3V0IGV4dHJhIG1hbnVhbCBncmFudHMuXG4gIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5yb2xlQmFzZWRBY2Nlc3NDb250cm9sQWRtaW5pc3RyYXRvcixcbiAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLmNvbnRyaWJ1dG9yLFxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuc3RvcmFnZUJsb2JEYXRhQ29udHJpYnV0b3IsXG5dIGFzIGNvbnN0O1xuXG5jb25zdCBrZXlWYXVsdERuc0Vycm9yU2NoZW1hID0gei5vYmplY3Qoe1xuICBjb2RlOiB6LmVudW0oW1wiRUFJX0FHQUlOXCIsIFwiRU5PVEZPVU5EXCJdKSxcbn0pO1xuY29uc3Qga2V5VmF1bHREbnNSZWFkeU1heEF0dGVtcHRzID0gMzA7XG5jb25zdCBrZXlWYXVsdERuc1JlYWR5UmV0cnlEZWxheU1zID0gMTBfMDAwO1xuXG5leHBvcnQgY2xhc3MgQXp1cmVDbG91ZEFjY291bnRTZXJ2aWNlIGltcGxlbWVudHMgQ2xvdWRBY2NvdW50U2VydmljZSB7XG4gICNjcmVkZW50aWFsOiBUb2tlbkNyZWRlbnRpYWw7XG4gICNyZXF1aXJlZFJlc291cmNlUHJvdmlkZXJzID0gW1xuICAgIFwiTWljcm9zb2Z0LkFkdmlzb3JcIixcbiAgICBcIk1pY3Jvc29mdC5BbGVydHNNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuQXBpTWFuYWdlbWVudFwiLFxuICAgIFwiTWljcm9zb2Z0LkFwcFwiLFxuICAgIFwiTWljcm9zb2Z0LkF1dGhvcml6YXRpb25cIixcbiAgICBcIk1pY3Jvc29mdC5BenVyZVRlcnJhZm9ybVwiLFxuICAgIFwiTWljcm9zb2Z0LkNhY2hlXCIsXG4gICAgXCJNaWNyb3NvZnQuQ2RuXCIsXG4gICAgXCJNaWNyb3NvZnQuQ29udGFpbmVySW5zdGFuY2VcIixcbiAgICBcIk1pY3Jvc29mdC5Db3N0TWFuYWdlbWVudFwiLFxuICAgIFwiTWljcm9zb2Z0LkRCZm9yUG9zdGdyZVNRTFwiLFxuICAgIFwiTWljcm9zb2Z0LktleVZhdWx0XCIsXG4gICAgXCJNaWNyb3NvZnQuU2VydmljZUJ1c1wiLFxuICAgIFwiTWljcm9zb2Z0LlNxbFwiLFxuICAgIFwiTWljcm9zb2Z0LlN0b3JhZ2VcIixcbiAgICBcIk1pY3Jvc29mdC5XZWJcIixcbiAgXSBhcyBjb25zdDtcbiAgI3Jlc291cmNlR3JhcGhDbGllbnQ6IFJlc291cmNlR3JhcGhDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY3JlZGVudGlhbDogVG9rZW5DcmVkZW50aWFsKSB7XG4gICAgdGhpcy4jcmVzb3VyY2VHcmFwaENsaWVudCA9IG5ldyBSZXNvdXJjZUdyYXBoQ2xpZW50KGNyZWRlbnRpYWwpO1xuICAgIHRoaXMuI2NyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGVycmFmb3JtQmFja2VuZChcbiAgICBjbG91ZEFjY291bnRJZDogQ2xvdWRBY2NvdW50W1wiaWRcIl0sXG4gICAgeyBuYW1lLCBwcmVmaXggfTogRW52aXJvbm1lbnRJZCxcbiAgKTogUHJvbWlzZTxUZXJyYWZvcm1CYWNrZW5kIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYWxsTG9jYXRpb25zID0gT2JqZWN0LnZhbHVlcyhsb2NhdGlvblNob3J0KS5qb2luKFwifFwiKTtcbiAgICBjb25zdCBzaG9ydEVudiA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG4gICAgLy8gQ2hlY2sgaWYgYSBzdG9yYWdlIGFjY291bnQgd2l0aCB0aGUgZXhwZWN0ZWQgbmFtZSBleGlzdHNcbiAgICAvLyAkcHJlZml4ICsgZW52aXJvbm1lbnQgc2hvcnQgKyBsb2NhdGlvbiArIFwidGZzdGF0ZXN0XCIgKyBzdWZmaXggKGUuZy4sIFwiZHhwaXRudGZzdGF0ZXN0MDFcIilcbiAgICAvLyBpdCBjYW4gcmV0dXJuIG11bHRpcGxlIHJlc3VsdHMgKGUuZy4gZm9yIGRpZmZlcmVudCBsb2NhdGlvbiBvciBpbnN0YW5jZSBudW1iZXIpXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fSR7c2hvcnRFbnZ9KCR7YWxsTG9jYXRpb25zfSl0ZnN0YXRlc3QoMFsxLTldfFsxLTldXFxcXGQpYDtcbiAgICBjb25zdCBxdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5zdG9yYWdlL3N0b3JhZ2VhY2NvdW50cydcbiAgICAgICAgICAgICB8IHdoZXJlIG5hbWUgbWF0Y2hlcyByZWdleCBAJyR7cmVzb3VyY2VOYW1lfSdcbiAgICAgICAgICAgIGA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcmVzb3VyY2VHcmFwaENsaWVudC5yZXNvdXJjZXMoe1xuICAgICAgcXVlcnksXG4gICAgICBzdWJzY3JpcHRpb25zOiBbY2xvdWRBY2NvdW50SWRdLFxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQudG90YWxSZWNvcmRzID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdG9yYWdlQWNjb3VudHMgPSB6LmFycmF5KHJlc291cmNlR3JhcGhEYXRhU2NoZW1hKS5wYXJzZShyZXN1bHQuZGF0YSk7XG4gICAgLy8gb24gbXVsdGlwbGUgcmVzdWx0cywgcmFuayBzdG9yYWdlIGFjY291bnRzIGJ5IGxvY2F0aW9uIHByaW9yaXR5IGFuZCBpbnN0YW5jZSBudW1iZXJcbiAgICBpZiAoc3RvcmFnZUFjY291bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0b3JhZ2VBY2NvdW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIGNvbXBhcmUgbG9jYXRpb25zIHByaW9yaXR5XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uQ29tcGFyaXNvbiA9XG4gICAgICAgICAgbG9jYXRpb25zLmluZGV4T2YoYS5sb2NhdGlvbikgLSBsb2NhdGlvbnMuaW5kZXhPZihiLmxvY2F0aW9uKTtcbiAgICAgICAgaWYgKGxvY2F0aW9uQ29tcGFyaXNvbiA9PT0gMCkge1xuICAgICAgICAgIC8vIHNhbWUgbG9jYXRpb24sIGNvbXBhcmUgYnkgbmFtZSAodG8gZ2V0IHRoZSBoaWdoZXN0IGluc3RhbmNlIG51bWJlcilcbiAgICAgICAgICByZXR1cm4gYi5uYW1lLmxvY2FsZUNvbXBhcmUoYS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYXRpb25Db21wYXJpc29uO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXJyYWZvcm1CYWNrZW5kU2NoZW1hLnBhcnNlKHtcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdG9yYWdlQWNjb3VudHNbMF0ucmVzb3VyY2VHcm91cCxcbiAgICAgIHN0b3JhZ2VBY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnRzWzBdLm5hbWUsXG4gICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQsXG4gICAgICB0eXBlOiBcImF6dXJlcm1cIixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGhhc1VzZXJQZXJtaXNzaW9uVG9Jbml0aWFsaXplKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEFsbCBwcmluY2lwYWwgSURzIHRvIGNoZWNrICh1c2VyICsgYWxsIGdyb3VwcylcbiAgICAgIGNvbnN0IGFsbFByaW5jaXBhbElkcyA9IGF3YWl0IHRoaXMuI2dldEN1cnJlbnRQcmluY2lwYWxJZHMoKTtcblxuICAgICAgLy8gR2V0IHJvbGUgYXNzaWdubWVudHMgZm9yIHRoZSBzdWJzY3JpcHRpb25cbiAgICAgIGNvbnN0IGF1dGhDbGllbnQgPSBuZXcgQXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQoXG4gICAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICAgIGNsb3VkQWNjb3VudElkLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVxdWlyZWRSb2xlcyA9IFtcbiAgICAgICAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLm93bmVyLCAvLyBPd25lclxuICAgICAgICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuc3RvcmFnZUJsb2JEYXRhQ29udHJpYnV0b3IsIC8vIFN0b3JhZ2UgQmxvYiBEYXRhIENvbnRyaWJ1dG9yXG4gICAgICAgIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5rZXlWYXVsdFNlY3JldHNPZmZpY2VyLCAvLyBLZXkgVmF1bHQgU2VjcmV0cyBPZmZpY2VyXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBzY29wZSA9IGAvc3Vic2NyaXB0aW9ucy8ke2Nsb3VkQWNjb3VudElkfWA7XG5cbiAgICAgIC8vIENvbGxlY3QgYWxsIHJvbGUgZGVmaW5pdGlvbiBJRHMgYXNzaWduZWQgdG8gdGhlIHVzZXIgb3IgdGhlaXIgZ3JvdXBzXG4gICAgICBjb25zdCBhc3NpZ25lZFJvbGVEZWZpbml0aW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgYXNzaWdubWVudCBvZiBhdXRoQ2xpZW50LnJvbGVBc3NpZ25tZW50cy5saXN0Rm9yU2NvcGUoXG4gICAgICAgIHNjb3BlLFxuICAgICAgKSkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGFzc2lnbm1lbnQgaXMgZm9yIHRoZSB1c2VyIG9yIGFueSBvZiB0aGVpciBncm91cHNcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFzc2lnbm1lbnQucHJpbmNpcGFsSWQgJiZcbiAgICAgICAgICBhbGxQcmluY2lwYWxJZHMuaGFzKGFzc2lnbm1lbnQucHJpbmNpcGFsSWQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEV4dHJhY3Qgcm9sZSBkZWZpbml0aW9uIElEIGZyb20gdGhlIGZ1bGwgcmVzb3VyY2UgSURcbiAgICAgICAgICAvLyBGb3JtYXQ6IC9zdWJzY3JpcHRpb25zL3tzdWJ9L3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMve3JvbGVJZH1cbiAgICAgICAgICBjb25zdCByb2xlRGVmSWQgPSBhc3NpZ25tZW50LnJvbGVEZWZpbml0aW9uSWQ/LnNwbGl0KFwiL1wiKS5wb3AoKTtcbiAgICAgICAgICBpZiAocm9sZURlZklkKSB7XG4gICAgICAgICAgICBhc3NpZ25lZFJvbGVEZWZpbml0aW9uSWRzLmFkZChyb2xlRGVmSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3J0LWNpcmN1aXQ6IHN0b3AgaWYgYWxsIHJlcXVpcmVkIHJvbGVzIGhhdmUgYmVlbiBmb3VuZFxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWlyZWRSb2xlcy5ldmVyeSgocmVxdWlyZWRSb2xlKSA9PlxuICAgICAgICAgICAgYXNzaWduZWRSb2xlRGVmaW5pdGlvbklkcy5oYXMocmVxdWlyZWRSb2xlKSxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFsbCByZXF1aXJlZCByb2xlcyBhcmUgcHJlc2VudFxuICAgICAgY29uc3QgaGFzQWxsUm9sZXMgPSByZXF1aXJlZFJvbGVzLmV2ZXJ5KChyZXF1aXJlZFJvbGUpID0+XG4gICAgICAgIGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMuaGFzKHJlcXVpcmVkUm9sZSksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gaGFzQWxsUm9sZXM7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIEhhbmRsZSBhdXRob3JpemF0aW9uIGVycm9ycyAoNDAzIEZvcmJpZGRlbikgLSB1c2VyIGxhY2tzIHBlcm1pc3Npb25zXG4gICAgICBpZiAoXG4gICAgICAgIGVycm9yICYmXG4gICAgICAgIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInN0YXR1c0NvZGVcIiBpbiBlcnJvciAmJlxuICAgICAgICBlcnJvci5zdGF0dXNDb2RlID09PSA0MDNcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoXG4gICAgY2xvdWRBY2NvdW50OiBDbG91ZEFjY291bnQsXG4gICAgeyBuYW1lLCBwcmVmaXggfTogRW52aXJvbm1lbnRJZCxcbiAgICBydW5uZXJBcHBDcmVkZW50aWFsczogR2l0SHViQXBwQ3JlZGVudGlhbHMsXG4gICAgZ2l0aHViOiBHaXRIdWJSZXBvLFxuICAgIGdpdEh1YlNlcnZpY2U6IEdpdEh1YlNlcnZpY2UsXG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnQuZXF1YWwoY2xvdWRBY2NvdW50LmNzcCwgXCJhenVyZVwiLCBcIkNsb3VkIGFjY291bnQgbXVzdCBiZSBBenVyZVwiKTtcbiAgICBhc3NlcnQub2soXG4gICAgICBpc0F6dXJlTG9jYXRpb24oY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbiksXG4gICAgICBcIlRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBjbG91ZCBhY2NvdW50IGlzIG5vdCBhIHZhbGlkIEF6dXJlIGxvY2F0aW9uXCIsXG4gICAgKTtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgLy8gUmVnaXN0ZXIgcmVxdWlyZWQgcmVzb3VyY2UgcHJvdmlkZXJzIGJlZm9yZSBjcmVhdGluZyBhbnkgcmVzb3VyY2VzXG4gICAgYXdhaXQgdGhpcy4jcmVnaXN0ZXJQcm92aWRlcnMoY2xvdWRBY2NvdW50LmlkKTtcblxuICAgIGNvbnN0IHJlc291cmNlTWFuYWdlbWVudENsaWVudCA9IG5ldyBSZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzaG9ydCA9IHtcbiAgICAgIGVudjogZW52aXJvbm1lbnRTaG9ydFtuYW1lXSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblNob3J0W2Nsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb25dLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNvdXJjZUdyb3VwTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydC5lbnZ9LSR7c2hvcnQubG9jYXRpb259LWNvbW1vbi1yZy0wMWA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgbG9jYXRpb246IGNsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb24sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIENyZWF0ZWRCeTogXCJEWCBDTElcIixcbiAgICAgICAgRW52aXJvbm1lbnQ6IG5hbWUsXG4gICAgICAgIC4uLnRhZ3MsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCByZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQucmVzb3VyY2VHcm91cHMuY3JlYXRlT3JVcGRhdGUoXG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCByZXNvdXJjZSBncm91cCB7cmVzb3VyY2VHcm91cE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IHJlc291cmNlR3JvdXBOYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkIH0sXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpZGVudGl0eU5hbWUgPSBgJHtwcmVmaXh9LSR7c2hvcnQuZW52fS0ke3Nob3J0LmxvY2F0aW9ufS1ib290c3RyYXAtaWQtMDFgO1xuXG4gICAgICBjb25zdCBtc2lDbGllbnQgPSBuZXcgTWFuYWdlZFNlcnZpY2VJZGVudGl0eUNsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBtc2lDbGllbnQudXNlckFzc2lnbmVkSWRlbnRpdGllcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIGlkZW50aXR5TmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5vayhcbiAgICAgICAgaWRlbnRpdHkucHJpbmNpcGFsSWQsXG4gICAgICAgIFwiTWFuYWdlZCBpZGVudGl0eSBwcmluY2lwYWwgSUQgaXMgdW5kZWZpbmVkXCIsXG4gICAgICApO1xuICAgICAgY29uc3QgaWRlbnRpdHlQcmluY2lwYWxJZCA9IGlkZW50aXR5LnByaW5jaXBhbElkO1xuICAgICAgYXNzZXJ0Lm9rKGlkZW50aXR5LmNsaWVudElkLCBcIk1hbmFnZWQgaWRlbnRpdHkgY2xpZW50IElEIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGNvbnN0IGlkZW50aXR5Q2xpZW50SWQgPSBpZGVudGl0eS5jbGllbnRJZDtcblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBcIkNyZWF0ZWQgaWRlbnRpdHkge2lkZW50aXR5TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgICAgeyBpZGVudGl0eU5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGF1dGhvcml6YXRpb25NYW5hZ2VtZW50Q2xpZW50ID0gbmV3IEF1dGhvcml6YXRpb25NYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgICApO1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uQ2xpZW50ID0gbmV3IFN1YnNjcmlwdGlvbkNsaWVudCh0aGlzLiNjcmVkZW50aWFsKTtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGF3YWl0IHN1YnNjcmlwdGlvbkNsaWVudC5zdWJzY3JpcHRpb25zLmdldChcbiAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgKTtcbiAgICAgIGFzc2VydC5vayhzdWJzY3JpcHRpb24udGVuYW50SWQsIFwiU3Vic2NyaXB0aW9uIHRlbmFudCBJRCBpcyB1bmRlZmluZWRcIik7XG4gICAgICBjb25zdCB0ZW5hbnRJZCA9IHN1YnNjcmlwdGlvbi50ZW5hbnRJZDtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvblNjb3BlID0gYC9zdWJzY3JpcHRpb25zLyR7Y2xvdWRBY2NvdW50LmlkfWA7XG5cbiAgICAgIC8vIEdyYW50IHRoZSBib290c3RyYXAgaWRlbnRpdHkgdGhlIEF6dXJlIHBlcm1pc3Npb25zIGl0IG5lZWRzIHRvIG9wZXJhdGUgYXV0b25vbW91c2x5IGluIHRoZSBib290c3RyYXAgd29ya2Zsb3cuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgYm9vdHN0cmFwSWRlbnRpdHlSb2xlRGVmaW5pdGlvbklkcy5tYXAoKHJvbGVEZWZpbml0aW9uSWQpID0+XG4gICAgICAgICAgYXV0aG9yaXphdGlvbk1hbmFnZW1lbnRDbGllbnQucm9sZUFzc2lnbm1lbnRzLmNyZWF0ZShcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvblNjb3BlLFxuICAgICAgICAgICAgdGhpcy4jY3JlYXRlUm9sZUFzc2lnbm1lbnROYW1lKFxuICAgICAgICAgICAgICBzdWJzY3JpcHRpb25TY29wZSxcbiAgICAgICAgICAgICAgaWRlbnRpdHlQcmluY2lwYWxJZCxcbiAgICAgICAgICAgICAgcm9sZURlZmluaXRpb25JZCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHByaW5jaXBhbElkOiBpZGVudGl0eVByaW5jaXBhbElkLFxuICAgICAgICAgICAgICBwcmluY2lwYWxUeXBlOiBcIlNlcnZpY2VQcmluY2lwYWxcIixcbiAgICAgICAgICAgICAgcm9sZURlZmluaXRpb25JZDogdGhpcy4jY3JlYXRlUm9sZURlZmluaXRpb25SZXNvdXJjZUlkKFxuICAgICAgICAgICAgICAgIGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAgICAgICAgICByb2xlRGVmaW5pdGlvbklkLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBcIkFzc2lnbmVkIGJvb3RzdHJhcCByb2xlcyB0byBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgICB7IGlkZW50aXR5TmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZ2l0aHViRW52aXJvbm1lbnROYW1lID0gYGJvb3RzdHJhcHBlci0ke25hbWV9LWNkYDtcbiAgICAgIGNvbnN0IGZlZGVyYXRlZENyZWRlbnRpYWxOYW1lID0gdGhpcy4jY3JlYXRlRmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUoe1xuICAgICAgICBnaXRodWIsXG4gICAgICAgIGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbmNsdWRlIGEgcmVwb3NpdG9yeS1kZXJpdmVkIHN1ZmZpeCBzbyBkaWZmZXJlbnQgcmVwb3NpdG9yaWVzIGNhbiBzaGFyZVxuICAgICAgLy8gdGhlIHNhbWUgYm9vdHN0cmFwIGlkZW50aXR5IHdpdGhvdXQgb3ZlcndyaXRpbmcgZWFjaCBvdGhlcidzIE9JREMgdHJ1c3QuXG4gICAgICBhd2FpdCBtc2lDbGllbnQuZmVkZXJhdGVkSWRlbnRpdHlDcmVkZW50aWFscy5jcmVhdGVPclVwZGF0ZShcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIGlkZW50aXR5TmFtZSxcbiAgICAgICAgZmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICBhdWRpZW5jZXM6IFtcImFwaTovL0F6dXJlQURUb2tlbkV4Y2hhbmdlXCJdLFxuICAgICAgICAgIGlzc3VlcjogXCJodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tXCIsXG4gICAgICAgICAgc3ViamVjdDogYHJlcG86JHtnaXRodWIub3duZXJ9LyR7Z2l0aHViLnJlcG99OmVudmlyb25tZW50OiR7Z2l0aHViRW52aXJvbm1lbnROYW1lfWAsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIFwiQ29uZmlndXJlZCBmZWRlcmF0ZWQgaWRlbnRpdHkgY3JlZGVudGlhbCB7Y3JlZGVudGlhbE5hbWV9IGZvciBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgICB7XG4gICAgICAgICAgY3JlZGVudGlhbE5hbWU6IGZlZGVyYXRlZENyZWRlbnRpYWxOYW1lLFxuICAgICAgICAgIGlkZW50aXR5TmFtZSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgdGhpcy4jc3RvcmVCb290c3RyYXBwZXJFbnZpcm9ubWVudFNlY3JldHMoe1xuICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICBnaXRodWIsXG4gICAgICAgIGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgZ2l0SHViU2VydmljZSxcbiAgICAgICAgaWRlbnRpdHlDbGllbnRJZCxcbiAgICAgICAgcnVubmVyQXBwQ3JlZGVudGlhbHMsXG4gICAgICAgIHRlbmFudElkLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGtleVZhdWx0TmFtZSA9IGF3YWl0IHRoaXMuI2NyZWF0ZUNvbW1vbktleVZhdWx0KHtcbiAgICAgICAgY2xvdWRBY2NvdW50LFxuICAgICAgICBuYW1lLFxuICAgICAgICBwcmVmaXgsXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICBzaG9ydEVudjogc2hvcnQuZW52LFxuICAgICAgICBzaG9ydExvY2F0aW9uOiBzaG9ydC5sb2NhdGlvbixcbiAgICAgICAgdGFncyxcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhpcy4jc3RvcmVSdW5uZXJBcHBTZWNyZXRzKHtcbiAgICAgICAgY2xvdWRBY2NvdW50SWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAga2V5VmF1bHROYW1lLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAvLyBDbGVhbnVwIHJlc291cmNlIGdyb3VwIGlmIGluaXRpYWxpemF0aW9uIGZhaWxzXG4gICAgICBhd2FpdCByZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQucmVzb3VyY2VHcm91cHMuYmVnaW5EZWxldGVBbmRXYWl0KFxuICAgICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgICk7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIFwiRGVsZXRlZCByZXNvdXJjZSBncm91cCB7cmVzb3VyY2VHcm91cE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9IGR1ZSB0byBpbml0aWFsaXphdGlvbiBmYWlsdXJlXCIsXG4gICAgICAgIHsgcmVzb3VyY2VHcm91cE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICAgICk7XG4gICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoY2F1c2UubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsb3VkIGFjY291bnRgLCB7XG4gICAgICAgIGNhdXNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNJbml0aWFsaXplZChcbiAgICBjbG91ZEFjY291bnRJZDogQ2xvdWRBY2NvdW50W1wiaWRcIl0sXG4gICAgeyBuYW1lLCBwcmVmaXggfTogRW52aXJvbm1lbnRJZCxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYWxsTG9jYXRpb25zID0gT2JqZWN0LnZhbHVlcyhsb2NhdGlvblNob3J0KS5qb2luKFwifFwiKTtcbiAgICBjb25zdCBzaG9ydEVudiA9IGVudmlyb25tZW50U2hvcnRbbmFtZV07XG5cbiAgICBjb25zdCBpZGVudGl0eVJlc291cmNlTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydEVudn0tKCR7YWxsTG9jYXRpb25zfSktYm9vdHN0cmFwLWlkLSgwWzEtOV18WzEtOV1cXFxcZClgO1xuICAgIGNvbnN0IGlkZW50aXR5UXVlcnkgPSBgcmVzb3VyY2VzXG4gICAgICAgICAgICAgfCB3aGVyZSB0eXBlID09ICdtaWNyb3NvZnQubWFuYWdlZGlkZW50aXR5L3VzZXJhc3NpZ25lZGlkZW50aXRpZXMnXG4gICAgICAgICAgICAgfCB3aGVyZSBuYW1lIG1hdGNoZXMgcmVnZXggQCcke2lkZW50aXR5UmVzb3VyY2VOYW1lfSdcbiAgICAgICAgICAgIGA7XG5cbiAgICBjb25zdCBrZXlWYXVsdFJlc291cmNlTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydEVudn0tKCR7YWxsTG9jYXRpb25zfSktY29tbW9uLWt2LSgwWzEtOV18WzEtOV1cXFxcZClgO1xuICAgIGNvbnN0IGtleVZhdWx0UXVlcnkgPSBgcmVzb3VyY2VzXG4gICAgICAgICAgICAgfCB3aGVyZSB0eXBlID09ICdtaWNyb3NvZnQua2V5dmF1bHQvdmF1bHRzJ1xuICAgICAgICAgICAgIHwgd2hlcmUgbmFtZSBtYXRjaGVzIHJlZ2V4IEAnJHtrZXlWYXVsdFJlc291cmNlTmFtZX0nXG4gICAgICAgICAgICBgO1xuXG4gICAgY29uc3QgW2lkZW50aXR5UmVzdWx0LCBrZXlWYXVsdFJlc3VsdCwgYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZF0gPVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50LnJlc291cmNlcyh7XG4gICAgICAgICAgcXVlcnk6IGlkZW50aXR5UXVlcnksXG4gICAgICAgICAgc3Vic2NyaXB0aW9uczogW2Nsb3VkQWNjb3VudElkXSxcbiAgICAgICAgfSksXG4gICAgICAgIHRoaXMuI3Jlc291cmNlR3JhcGhDbGllbnQucmVzb3VyY2VzKHtcbiAgICAgICAgICBxdWVyeToga2V5VmF1bHRRdWVyeSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25zOiBbY2xvdWRBY2NvdW50SWRdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4jYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZChjbG91ZEFjY291bnRJZCksXG4gICAgICBdKTtcblxuICAgIGNvbnN0IGluaXRpYWxpemVkID1cbiAgICAgIGlkZW50aXR5UmVzdWx0LnRvdGFsUmVjb3JkcyA+IDAgJiZcbiAgICAgIGtleVZhdWx0UmVzdWx0LnRvdGFsUmVjb3JkcyA+IDAgJiZcbiAgICAgIGFyZVByb3ZpZGVyc1JlZ2lzdGVyZWQ7XG5cbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcInN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9IGluaXRpYWxpemVkOiB7aW5pdGlhbGl6ZWR9XCIsIHtcbiAgICAgIGluaXRpYWxpemVkLFxuICAgICAgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudElkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluaXRpYWxpemVkO1xuICB9XG5cbiAgYXN5bmMgcHJvdmlzaW9uVGVycmFmb3JtQmFja2VuZChcbiAgICBjbG91ZEFjY291bnQ6IENsb3VkQWNjb3VudCxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICAgIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgKTogUHJvbWlzZTxUZXJyYWZvcm1CYWNrZW5kPiB7XG4gICAgYXNzZXJ0LmVxdWFsKGNsb3VkQWNjb3VudC5jc3AsIFwiYXp1cmVcIiwgXCJDbG91ZCBhY2NvdW50IG11c3QgYmUgQXp1cmVcIik7XG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgaXNBenVyZUxvY2F0aW9uKGNsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb24pLFxuICAgICAgXCJUaGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgY2xvdWQgYWNjb3VudCBpcyBub3QgYSB2YWxpZCBBenVyZSBsb2NhdGlvblwiLFxuICAgICk7XG5cbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGNvbnN0IHJlc291cmNlTWFuYWdlbWVudENsaWVudCA9IG5ldyBSZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzaG9ydCA9IHtcbiAgICAgIGVudjogZW52aXJvbm1lbnRTaG9ydFtuYW1lXSxcbiAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblNob3J0W2Nsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb25dLFxuICAgIH07XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgbG9jYXRpb246IGNsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb24sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIEVudmlyb25tZW50OiBuYW1lLFxuICAgICAgICAuLi50YWdzLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzb3VyY2VHcm91cE5hbWUgPSBgJHtwcmVmaXh9LSR7c2hvcnQuZW52fS0ke3Nob3J0LmxvY2F0aW9ufS10ZnN0YXRlLXJnLTAxYDtcblxuICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgcmVzb3VyY2VHcm91cE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgc3RvcmFnZU1hbmFnZW1lbnRDbGllbnQgPSBuZXcgU3RvcmFnZU1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdG9yYWdlQWNjb3VudCA9XG4gICAgICBhd2FpdCBzdG9yYWdlTWFuYWdlbWVudENsaWVudC5zdG9yYWdlQWNjb3VudHMuYmVnaW5DcmVhdGVBbmRXYWl0KFxuICAgICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgICAgYCR7cHJlZml4fSR7c2hvcnQuZW52fSR7c2hvcnQubG9jYXRpb259dGZzdGF0ZXN0MDFgLFxuICAgICAgICB7XG4gICAgICAgICAga2luZDogXCJTdG9yYWdlVjJcIixcbiAgICAgICAgICBza3U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RhbmRhcmRfTFJTXCIsXG4gICAgICAgICAgICB0aWVyOiBcIlN0YW5kYXJkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgIGFzc2VydC5vayhcbiAgICAgIHN0b3JhZ2VBY2NvdW50LnByaW1hcnlFbmRwb2ludHM/LmJsb2IsXG4gICAgICBcIlN0b3JhZ2UgYWNjb3VudCBibG9iIGVuZHBvaW50IGlzIHVuZGVmaW5lZFwiLFxuICAgICk7XG5cbiAgICBhc3NlcnQub2soc3RvcmFnZUFjY291bnQubmFtZSwgXCJTdG9yYWdlIGFjY291bnQgbmFtZSBpcyB1bmRlZmluZWRcIik7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQgc3RvcmFnZSBhY2NvdW50IHtzdG9yYWdlQWNjb3VudE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7XG4gICAgICAgIHN0b3JhZ2VBY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnQubmFtZSxcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBibG9iU2VydmljZUNsaWVudCA9IG5ldyBCbG9iU2VydmljZUNsaWVudChcbiAgICAgIHN0b3JhZ2VBY2NvdW50LnByaW1hcnlFbmRwb2ludHM/LmJsb2IsXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICk7XG5cbiAgICBjb25zdCBjb250YWluZXJDbGllbnQgPVxuICAgICAgYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwidGVycmFmb3JtLXN0YXRlXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbnRhaW5lckNsaWVudC5jcmVhdGUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBDbGVhbnVwIHJlc291cmNlIGdyb3VwIGlmIGJsb2IgY29udGFpbmVyIGNyZWF0aW9uIGZhaWxzXG4gICAgICAvLyByZXNvdXJjZSBncm91cCBkZWxldGlvbiBhbHNvIGRlbGV0ZXMgYWxsIGNvbnRhaW5lZCByZXNvdXJjZXNcbiAgICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5iZWdpbkRlbGV0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiB0aGUgYmxvYiBjb250YWluZXJgLCB7XG4gICAgICAgIGNhdXNlOiBlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlcnJhZm9ybUJhY2tlbmRTY2hlbWEucGFyc2Uoe1xuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICBzdG9yYWdlQWNjb3VudE5hbWU6IHN0b3JhZ2VBY2NvdW50Lm5hbWUsXG4gICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgdHlwZTogXCJhenVyZXJtXCIsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyAjYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZChzdWJzY3JpcHRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMubWFwKGFzeW5jIChuYW1lc3BhY2UpID0+IHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBhd2FpdCBjbGllbnQucHJvdmlkZXJzLmdldChuYW1lc3BhY2UpO1xuICAgICAgICByZXR1cm4gcHJvdmlkZXIucmVnaXN0cmF0aW9uU3RhdGUgPT09IFwiUmVnaXN0ZXJlZFwiO1xuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeShCb29sZWFuKTtcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVDb21tb25LZXlWYXVsdCh7XG4gICAgY2xvdWRBY2NvdW50LFxuICAgIG5hbWUsXG4gICAgcHJlZml4LFxuICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgIHNob3J0RW52LFxuICAgIHNob3J0TG9jYXRpb24sXG4gICAgdGFncyxcbiAgICB0ZW5hbnRJZCxcbiAgfToge1xuICAgIGNsb3VkQWNjb3VudDogQ2xvdWRBY2NvdW50O1xuICAgIG5hbWU6IEVudmlyb25tZW50SWRbXCJuYW1lXCJdO1xuICAgIHByZWZpeDogc3RyaW5nO1xuICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdHJpbmc7XG4gICAgc2hvcnRFbnY6IHN0cmluZztcbiAgICBzaG9ydExvY2F0aW9uOiBzdHJpbmc7XG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGNvbnN0IGt2Q2xpZW50ID0gbmV3IEtleVZhdWx0TWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IGtleVZhdWx0TmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydEVudn0tJHtzaG9ydExvY2F0aW9ufS1jb21tb24ta3YtMDFgO1xuICAgIGNvbnN0IHNlY3JldHNQcm90ZWN0aW9uRW5hYmxlZCA9IHNob3J0RW52ID09PSBcInBcIjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGt2Q2xpZW50LnZhdWx0cy5jaGVja05hbWVBdmFpbGFiaWxpdHkoe1xuICAgICAgbmFtZToga2V5VmF1bHROYW1lLFxuICAgICAgdHlwZTogXCJNaWNyb3NvZnQuS2V5VmF1bHQvdmF1bHRzXCIsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBrdkNsaWVudC52YXVsdHMuYmVnaW5DcmVhdGVPclVwZGF0ZUFuZFdhaXQoXG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIGtleVZhdWx0TmFtZSxcbiAgICAgIHtcbiAgICAgICAgbG9jYXRpb246IGNsb3VkQWNjb3VudC5kZWZhdWx0TG9jYXRpb24sXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBjcmVhdGVNb2RlOiByZXN1bHQubmFtZUF2YWlsYWJsZSA/IFwiZGVmYXVsdFwiIDogXCJyZWNvdmVyXCIsXG4gICAgICAgICAgZW5hYmxlZEZvckRpc2tFbmNyeXB0aW9uOiB0cnVlLFxuICAgICAgICAgIGVuYWJsZVB1cmdlUHJvdGVjdGlvbjogc2VjcmV0c1Byb3RlY3Rpb25FbmFibGVkID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbmFibGVSYmFjQXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAgICAgICAgICBza3U6IHtcbiAgICAgICAgICAgIGZhbWlseTogXCJBXCIsXG4gICAgICAgICAgICBuYW1lOiBcInN0YW5kYXJkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb2Z0RGVsZXRlUmV0ZW50aW9uSW5EYXlzOiBzZWNyZXRzUHJvdGVjdGlvbkVuYWJsZWQgPyAxNCA6IDcsXG4gICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgIH0sXG4gICAgICAgIHRhZ3M6IHtcbiAgICAgICAgICBFbnZpcm9ubWVudDogbmFtZSxcbiAgICAgICAgICAuLi50YWdzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIGtleSB2YXVsdCB7a2V5VmF1bHROYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBrZXlWYXVsdE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGtleVZhdWx0TmFtZTtcbiAgfVxuXG4gICNjcmVhdGVGZWRlcmF0ZWRDcmVkZW50aWFsTmFtZSh7XG4gICAgZ2l0aHViLFxuICAgIGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgfToge1xuICAgIGdpdGh1YjogR2l0SHViUmVwbztcbiAgICBnaXRodWJFbnZpcm9ubWVudE5hbWU6IHN0cmluZztcbiAgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVwb05hbWUgPSBnaXRodWIucmVwby5yZXBsYWNlQWxsKC9bXmEtekEtWjAtOS1dL2csIFwiLVwiKTtcblxuICAgIHJldHVybiBgJHtyZXBvTmFtZX0tJHtnaXRodWJFbnZpcm9ubWVudE5hbWV9YDtcbiAgfVxuXG4gICNjcmVhdGVSb2xlQXNzaWdubWVudE5hbWUoXG4gICAgc2NvcGU6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHJvbGVEZWZpbml0aW9uSWQ6IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShgJHtzY29wZX06JHtwcmluY2lwYWxJZH06JHtyb2xlRGVmaW5pdGlvbklkfWApXG4gICAgICAuZGlnZXN0KFwiaGV4XCIpO1xuXG4gICAgcmV0dXJuIGAke2hhc2guc2xpY2UoMCwgOCl9LSR7aGFzaC5zbGljZSg4LCAxMil9LSR7aGFzaC5zbGljZShcbiAgICAgIDEyLFxuICAgICAgMTYsXG4gICAgKX0tJHtoYXNoLnNsaWNlKDE2LCAyMCl9LSR7aGFzaC5zbGljZSgyMCwgMzIpfWA7XG4gIH1cblxuICAjY3JlYXRlUm9sZURlZmluaXRpb25SZXNvdXJjZUlkKFxuICAgIHN1YnNjcmlwdGlvbklkOiBzdHJpbmcsXG4gICAgcm9sZURlZmluaXRpb25JZDogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBgL3N1YnNjcmlwdGlvbnMvJHtzdWJzY3JpcHRpb25JZH0vcHJvdmlkZXJzL01pY3Jvc29mdC5BdXRob3JpemF0aW9uL3JvbGVEZWZpbml0aW9ucy8ke3JvbGVEZWZpbml0aW9uSWR9YDtcbiAgfVxuXG4gIGFzeW5jICNnZXRDdXJyZW50UHJpbmNpcGFsSWRzKCk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgICAvLyBDcmVhdGUgR3JhcGggY2xpZW50IHdpdGggY3VzdG9tIGF1dGggcHJvdmlkZXIgdGhhdCBmZXRjaGVzIGZyZXNoIHRva2Vuc1xuICAgIGNvbnN0IGdyYXBoQ2xpZW50ID0gQ2xpZW50LmluaXQoe1xuICAgICAgYXV0aFByb3ZpZGVyOiBhc3luYyAoZG9uZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHRva2VuUmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjcmVkZW50aWFsLmdldFRva2VuKFxuICAgICAgICAgICAgXCJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20vLmRlZmF1bHRcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgICAgICAgZG9uZShcbiAgICAgICAgICAgICAgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGFjcXVpcmUgdG9rZW4gZm9yIE1pY3Jvc29mdCBHcmFwaFwiKSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvbmUobnVsbCwgdG9rZW5SZXNwb25zZS50b2tlbik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZG9uZShlcnJvciBhcyBFcnJvciwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBHZXQgY3VycmVudCB1c2VyJ3MgaW5mb1xuICAgIGNvbnN0IG1lUmVzcG9uc2UgPSBhd2FpdCBncmFwaENsaWVudC5hcGkoXCIvbWVcIikuZ2V0KCk7XG4gICAgY29uc3QgbWUgPSBncmFwaFVzZXJSZXNwb25zZVNjaGVtYS5wYXJzZShtZVJlc3BvbnNlKTtcbiAgICBjb25zdCB1c2VyT2JqZWN0SWQgPSBtZS5pZDtcblxuICAgIC8vIEdldCBhbGwgZ3JvdXAgbWVtYmVyc2hpcHMgKHRyYW5zaXRpdmUgLSBpbmNsdWRlcyBuZXN0ZWQgZ3JvdXBzKVxuICAgIGNvbnN0IGdyb3VwSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBuZXh0TGluazogc3RyaW5nIHwgdW5kZWZpbmVkID0gXCIvbWUvdHJhbnNpdGl2ZU1lbWJlck9mPyRzZWxlY3Q9aWRcIjtcblxuICAgIHdoaWxlIChuZXh0TGluaykge1xuICAgICAgY29uc3QgcmF3UmVzcG9uc2UgPSBhd2FpdCBncmFwaENsaWVudC5hcGkobmV4dExpbmspLmdldCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBncmFwaEdyb3VwTWVtYmVyc2hpcFJlc3BvbnNlU2NoZW1hLnBhcnNlKHJhd1Jlc3BvbnNlKTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXNwb25zZS52YWx1ZSkge1xuICAgICAgICBncm91cElkcy5wdXNoKGl0ZW0uaWQpO1xuICAgICAgfVxuICAgICAgbmV4dExpbmsgPSByZXNwb25zZVtcIkBvZGF0YS5uZXh0TGlua1wiXTtcbiAgICB9XG5cbiAgICAvLyBBbGwgcHJpbmNpcGFsIElEcyB0byBjaGVjayAodXNlciArIGFsbCBncm91cHMpXG4gICAgY29uc3QgYWxsUHJpbmNpcGFsSWRzID0gbmV3IFNldChbdXNlck9iamVjdElkLCAuLi5ncm91cElkc10pO1xuICAgIHJldHVybiBhbGxQcmluY2lwYWxJZHM7XG4gIH1cblxuICBhc3luYyAjcmVnaXN0ZXJQcm92aWRlcnMoc3Vic2NyaXB0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJkeC1jbGlcIiwgXCJyZWdpc3Rlci1wcm92aWRlcnNcIl0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBSZXNvdXJjZU1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgc3Vic2NyaXB0aW9uSWQsXG4gICAgKTtcblxuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgXCJSZWdpc3RlcmluZyB7Y291bnR9IHJlc291cmNlIHByb3ZpZGVycyBvbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBjb3VudDogdGhpcy4jcmVxdWlyZWRSZXNvdXJjZVByb3ZpZGVycy5sZW5ndGgsIHN1YnNjcmlwdGlvbklkIH0sXG4gICAgKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy4jcmVxdWlyZWRSZXNvdXJjZVByb3ZpZGVycy5tYXAoYXN5bmMgKG5hbWVzcGFjZSkgPT4ge1xuICAgICAgICBhd2FpdCBjbGllbnQucHJvdmlkZXJzLnJlZ2lzdGVyKG5hbWVzcGFjZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIlJlZ2lzdGVyZWQgcHJvdmlkZXIge25hbWVzcGFjZX1cIiwgeyBuYW1lc3BhY2UgfSk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBcIkFsbCByZXNvdXJjZSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBvbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBzdWJzY3JpcHRpb25JZCB9LFxuICAgICk7XG4gIH1cblxuICBhc3luYyAjc3RvcmVCb290c3RyYXBwZXJFbnZpcm9ubWVudFNlY3JldHMoe1xuICAgIGNsb3VkQWNjb3VudElkLFxuICAgIGdpdGh1YixcbiAgICBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgZ2l0SHViU2VydmljZSxcbiAgICBpZGVudGl0eUNsaWVudElkLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICAgIHRlbmFudElkLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50SWQ6IHN0cmluZztcbiAgICBnaXRodWI6IEdpdEh1YlJlcG87XG4gICAgZ2l0aHViRW52aXJvbm1lbnROYW1lOiBzdHJpbmc7XG4gICAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZTtcbiAgICBpZGVudGl0eUNsaWVudElkOiBzdHJpbmc7XG4gICAgcnVubmVyQXBwQ3JlZGVudGlhbHM6IEdpdEh1YkFwcENyZWRlbnRpYWxzO1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJBUk1fQ0xJRU5UX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBpZGVudGl0eUNsaWVudElkLFxuICAgICAgfSksXG4gICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgb3duZXI6IGdpdGh1Yi5vd25lcixcbiAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgIHNlY3JldE5hbWU6IFwiQVJNX1RFTkFOVF9JRFwiLFxuICAgICAgICBzZWNyZXRWYWx1ZTogdGVuYW50SWQsXG4gICAgICB9KSxcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJBUk1fU1VCU0NSSVBUSU9OX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBjbG91ZEFjY291bnRJZCxcbiAgICAgIH0pLFxuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkdIX0FQUF9JRFwiLFxuICAgICAgICBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMuaWQsXG4gICAgICB9KSxcbiAgICAgIGdpdEh1YlNlcnZpY2UuY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldCh7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICBvd25lcjogZ2l0aHViLm93bmVyLFxuICAgICAgICByZXBvOiBnaXRodWIucmVwbyxcbiAgICAgICAgc2VjcmV0TmFtZTogXCJHSF9BUFBfQ0xJRU5UX0lEXCIsXG4gICAgICAgIHNlY3JldFZhbHVlOiBydW5uZXJBcHBDcmVkZW50aWFscy5jbGllbnRJZCxcbiAgICAgIH0pLFxuICAgICAgZ2l0SHViU2VydmljZS5jcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0KHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgIHJlcG86IGdpdGh1Yi5yZXBvLFxuICAgICAgICBzZWNyZXROYW1lOiBcIkdIX0FQUF9JTlNUQUxMQVRJT05fSURcIixcbiAgICAgICAgc2VjcmV0VmFsdWU6IHJ1bm5lckFwcENyZWRlbnRpYWxzLmluc3RhbGxhdGlvbklkLFxuICAgICAgfSksXG4gICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgICAgb3duZXI6IGdpdGh1Yi5vd25lcixcbiAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgIHNlY3JldE5hbWU6IFwiR0hfQVBQX0tFWVwiLFxuICAgICAgICBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMua2V5LnRyaW1FbmQoKSxcbiAgICAgIH0pLFxuICAgIF0pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFwiU2V0IEdpdEh1YiBlbnZpcm9ubWVudCBzZWNyZXRzIGZvciB7ZW52aXJvbm1lbnROYW1lfVwiLCB7XG4gICAgICBlbnZpcm9ubWVudE5hbWU6IGdpdGh1YkVudmlyb25tZW50TmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jICNzdG9yZVJ1bm5lckFwcFNlY3JldHMoe1xuICAgIGNsb3VkQWNjb3VudElkLFxuICAgIGtleVZhdWx0TmFtZSxcbiAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgfToge1xuICAgIGNsb3VkQWNjb3VudElkOiBzdHJpbmc7XG4gICAga2V5VmF1bHROYW1lOiBzdHJpbmc7XG4gICAgcnVubmVyQXBwQ3JlZGVudGlhbHM6IEdpdEh1YkFwcENyZWRlbnRpYWxzO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG5cbiAgICBhd2FpdCB0aGlzLiN3YWl0Rm9yS2V5VmF1bHREbnNSZXNvbHV0aW9uKHtcbiAgICAgIGNsb3VkQWNjb3VudElkLFxuICAgICAga2V5VmF1bHROYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VjcmV0Q2xpZW50ID0gbmV3IFNlY3JldENsaWVudChcbiAgICAgIGBodHRwczovLyR7a2V5VmF1bHROYW1lfS52YXVsdC5henVyZS5uZXQvYCxcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHNlY3JldENsaWVudC5zZXRTZWNyZXQoXCJnaXRodWItcnVubmVyLWFwcC1pZFwiLCBydW5uZXJBcHBDcmVkZW50aWFscy5pZCksXG4gICAgICBzZWNyZXRDbGllbnQuc2V0U2VjcmV0KFxuICAgICAgICBcImdpdGh1Yi1ydW5uZXItYXBwLWluc3RhbGxhdGlvbi1pZFwiLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscy5pbnN0YWxsYXRpb25JZCxcbiAgICAgICksXG4gICAgICBzZWNyZXRDbGllbnQuc2V0U2VjcmV0KFxuICAgICAgICBcImdpdGh1Yi1ydW5uZXItYXBwLWtleVwiLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscy5rZXkudHJpbUVuZCgpLCAvLyBzdHJpcCB0cmFpbGluZyBuZXdsaW5lcyBmcm9tIFBFTSBrZXlzXG4gICAgICApLFxuICAgIF0pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIHNlY3JldHMgaW4ga2V5IHZhdWx0IHtrZXlWYXVsdE5hbWV9IGluIHN1YnNjcmlwdGlvbiB7c3Vic2NyaXB0aW9uSWR9XCIsXG4gICAgICB7IGtleVZhdWx0TmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudElkIH0sXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jICN3YWl0Rm9yS2V5VmF1bHREbnNSZXNvbHV0aW9uKHtcbiAgICBjbG91ZEFjY291bnRJZCxcbiAgICBrZXlWYXVsdE5hbWUsXG4gIH06IHtcbiAgICBjbG91ZEFjY291bnRJZDogQ2xvdWRBY2NvdW50W1wiaWRcIl07XG4gICAga2V5VmF1bHROYW1lOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcbiAgICBjb25zdCBob3N0bmFtZSA9IGAke2tleVZhdWx0TmFtZX0udmF1bHQuYXp1cmUubmV0YDtcblxuICAgIC8vIEF6dXJlIGNhbiByZXBvcnQgdGhlIHZhdWx0IGFzIGNyZWF0ZWQgYmVmb3JlIGl0cyBwdWJsaWMgRE5TIG5hbWUgaXMgcmVhZHkuXG4gICAgLy8gV2FpdCBoZXJlIHNvIHdyaXRpbmcgcnVubmVyIGFwcCBzZWNyZXRzIGRvZXMgbm90IGZhaWwgd2l0aCBFTk9URk9VTkQuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0ga2V5VmF1bHREbnNSZWFkeU1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGxvb2t1cChob3N0bmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAha2V5VmF1bHREbnNFcnJvclNjaGVtYS5zYWZlUGFyc2UoY2F1c2UpLnN1Y2Nlc3MgfHxcbiAgICAgICAgICBhdHRlbXB0ID09PSBrZXlWYXVsdERuc1JlYWR5TWF4QXR0ZW1wdHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEtleSB2YXVsdCBlbmRwb2ludCAnJHtob3N0bmFtZX0nIGlzIG5vdCByZXNvbHZhYmxlYCxcbiAgICAgICAgICAgIHsgY2F1c2UgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIFwiV2FpdGluZyBmb3Iga2V5IHZhdWx0IGVuZHBvaW50IHtob3N0bmFtZX0gdG8gYmVjb21lIHJlc29sdmFibGUgaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgICAgICB7IGhvc3RuYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQgfSxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoa2V5VmF1bHREbnNSZWFkeVJldHJ5RGVsYXlNcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
587
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtYWNjb3VudC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2F6dXJlL2Nsb3VkLWFjY291bnQtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU0zQixPQUFPLEVBRUwsZ0JBQWdCLEdBRWpCLE1BQU0sNkJBQTZCLENB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QUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxHQUFHLFlBQVksa0JBQWtCLENBQUM7UUFFbkQsNkVBQTZFO1FBQzdFLHdFQUF3RTtRQUN4RSxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksMkJBQTJCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN4RSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZCLE9BQU87WUFDVCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUNFLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU87b0JBQ2hELE9BQU8sS0FBSywyQkFBMkIsRUFDdkMsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHVCQUF1QixRQUFRLHFCQUFxQixFQUNwRCxFQUFFLEtBQUssRUFBRSxDQUNWLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxNQUFNLENBQUMsS0FBSyxDQUNWLGlHQUFpRyxFQUNqRyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQzdDLENBQUM7Z0JBQ0YsTUFBTSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVG9rZW5DcmVkZW50aWFsIH0gZnJvbSBcIkBhenVyZS9pZGVudGl0eVwiO1xuXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLWF1dGhvcml6YXRpb25cIjtcbmltcG9ydCB7IEtleVZhdWx0TWFuYWdlbWVudENsaWVudCB9IGZyb20gXCJAYXp1cmUvYXJtLWtleXZhdWx0XCI7XG5pbXBvcnQgeyBNYW5hZ2VkU2VydmljZUlkZW50aXR5Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tbXNpXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYXBoQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VncmFwaFwiO1xuaW1wb3J0IHsgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50IH0gZnJvbSBcIkBhenVyZS9hcm0tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25DbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1yZXNvdXJjZXMtc3Vic2NyaXB0aW9uc1wiO1xuaW1wb3J0IHsgU3RvcmFnZU1hbmFnZW1lbnRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2FybS1zdG9yYWdlXCI7XG5pbXBvcnQgeyBTZWNyZXRDbGllbnQgfSBmcm9tIFwiQGF6dXJlL2tleXZhdWx0LXNlY3JldHNcIjtcbmltcG9ydCB7IEJsb2JTZXJ2aWNlQ2xpZW50IH0gZnJvbSBcIkBhenVyZS9zdG9yYWdlLWJsb2JcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiQG1pY3Jvc29mdC9taWNyb3NvZnQtZ3JhcGgtY2xpZW50XCI7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0L3N0cmljdFwiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbG9va3VwIH0gZnJvbSBcIm5vZGU6ZG5zL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNsZWVwIH0gZnJvbSBcIm5vZGU6dGltZXJzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZC92NFwiO1xuXG5pbXBvcnQge1xuICBDbG91ZEFjY291bnQsXG4gIHR5cGUgQ2xvdWRBY2NvdW50U2VydmljZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9jbG91ZC1hY2NvdW50LmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudmlyb25tZW50SWQsXG4gIGVudmlyb25tZW50U2hvcnQsXG4gIEVudmlyb25tZW50U2hvcnRWYWx1ZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9lbnZpcm9ubWVudC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBHaXRIdWJSZXBvIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9naXRodWItcmVwby5qc1wiO1xuaW1wb3J0IHtcbiAgR2l0SHViQXBwQ3JlZGVudGlhbHMsXG4gIHR5cGUgR2l0SHViU2VydmljZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9naXRodWIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVycmFmb3JtQmFja2VuZCxcbiAgdGVycmFmb3JtQmFja2VuZFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9yZW1vdGUtYmFja2VuZC5qc1wiO1xuaW1wb3J0IHtcbiAgaXNBenVyZUxvY2F0aW9uLFxuICBsb2NhdGlvbnMsXG4gIGxvY2F0aW9uU2hvcnQsXG4gIExvY2F0aW9uU2hvcnRWYWx1ZSxcbn0gZnJvbSBcIi4vbG9jYXRpb25zLmpzXCI7XG5cbi8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlc2UgcHJvcGVydGllcyBmb3Igbm93O1xuLy8gdGhlIGFjdHVhbCByZXN1bHQgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBmdWxsIGNsb3VkIHJlc291cmNlIG9iamVjdFxuZXhwb3J0IGNvbnN0IHJlc291cmNlR3JhcGhEYXRhU2NoZW1hID0gei5vYmplY3Qoe1xuICBsb2NhdGlvbjogei5lbnVtKGxvY2F0aW9ucyksXG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIHJlc291cmNlR3JvdXA6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhVc2VyUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxufSk7XG5cbmNvbnN0IGdyYXBoR3JvdXBNZW1iZXJzaGlwSXRlbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgZ3JhcGhHcm91cE1lbWJlcnNoaXBSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgXCJAb2RhdGEubmV4dExpbmtcIjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB2YWx1ZTogei5hcnJheShncmFwaEdyb3VwTWVtYmVyc2hpcEl0ZW1TY2hlbWEpLFxufSk7XG5cbmNvbnN0IGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcyA9IHtcbiAgY29udHJpYnV0b3I6IFwiYjI0OTg4YWMtNjE4MC00MmEwLWFiODgtMjBmNzM4MmRkMjRjXCIsXG4gIGtleVZhdWx0U2VjcmV0c09mZmljZXI6IFwiYjg2YThmZTQtNDRjZS00OTQ4LWFlZTUtZWNjYjJjMTU1Y2Q3XCIsXG4gIG93bmVyOiBcIjhlM2FmNjU3LWE4ZmYtNDQzYy1hNzVjLTJmZThjNGJjYjYzNVwiLFxuICByZWFkZXI6IFwiYWNkZDcyYTctMzM4NS00OGVmLWJkNDItZjYwNmZiYTgxYWU3XCIsXG4gIHJvbGVCYXNlZEFjY2Vzc0NvbnRyb2xBZG1pbmlzdHJhdG9yOiBcImY1ODMxMGQ5LWE5ZjYtNDM5YS05ZThkLWY2MmU3YjQxYTE2OFwiLFxuICBzdG9yYWdlQmxvYkRhdGFDb250cmlidXRvcjogXCJiYTkyZjViNC0yZDExLTQ1M2QtYTQwMy1lOTZiMDAyOWM5ZmVcIixcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJvb3RzdHJhcElkZW50aXR5Um9sZURlZmluaXRpb25JZHMgPSBbXG4gIC8vIFRoZXNlIHJvbGVzIGxldCB0aGUgYm9vdHN0cmFwIGlkZW50aXR5IHJ1biB0aGUgYm9vdHN0cmFwcGVyIG1vZHVsZSBmcm9tIEdpdEh1YiBBY3Rpb25zIHdpdGhvdXQgZXh0cmEgbWFudWFsIGdyYW50cy5cbiAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLnJvbGVCYXNlZEFjY2Vzc0NvbnRyb2xBZG1pbmlzdHJhdG9yLFxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuY29udHJpYnV0b3IsXG4gIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5zdG9yYWdlQmxvYkRhdGFDb250cmlidXRvcixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IGJvb3RzdHJhcENpSWRlbnRpdHlSb2xlRGVmaW5pdGlvbklkcyA9IFtcbiAgLy8gUGxhbiBuZWVkcyByZWFkIGFjY2VzcyBmb3IgcmVmcmVzaCBhbmQgYmxvYiBhY2Nlc3MgZm9yIFRlcnJhZm9ybSBiYWNrZW5kIGxvY2tzL3N0YXRlLlxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMucmVhZGVyLFxuICBidWlsdEluUm9sZURlZmluaXRpb25JZHMuc3RvcmFnZUJsb2JEYXRhQ29udHJpYnV0b3IsXG5dIGFzIGNvbnN0O1xuXG50eXBlIEJvb3RzdHJhcHBlcklkZW50aXR5ID0ge1xuICBjbGllbnRJZDogc3RyaW5nO1xuICBuYW1lOiBCb290c3RyYXBwZXJJZGVudGl0eU5hbWU7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG59O1xuXG50eXBlIEJvb3RzdHJhcHBlcklkZW50aXR5TmFtZSA9XG4gIHwgYCR7c3RyaW5nfS0ke0Vudmlyb25tZW50U2hvcnRWYWx1ZX0tJHtMb2NhdGlvblNob3J0VmFsdWV9LWJvb3RzdHJhcC1jaS1pZC0ke3N0cmluZ31gXG4gIHwgYCR7c3RyaW5nfS0ke0Vudmlyb25tZW50U2hvcnRWYWx1ZX0tJHtMb2NhdGlvblNob3J0VmFsdWV9LWJvb3RzdHJhcC1pZC0ke3N0cmluZ31gO1xuXG50eXBlIEJvb3RzdHJhcHBlcklkZW50aXR5UGFyYW1ldGVycyA9IHtcbiAgbG9jYXRpb246IHN0cmluZztcbiAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmNvbnN0IGtleVZhdWx0RG5zRXJyb3JTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGNvZGU6IHouZW51bShbXCJFQUlfQUdBSU5cIiwgXCJFTk9URk9VTkRcIl0pLFxufSk7XG5jb25zdCBrZXlWYXVsdERuc1JlYWR5TWF4QXR0ZW1wdHMgPSAzMDtcbmNvbnN0IGtleVZhdWx0RG5zUmVhZHlSZXRyeURlbGF5TXMgPSAxMF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBBenVyZUNsb3VkQWNjb3VudFNlcnZpY2UgaW1wbGVtZW50cyBDbG91ZEFjY291bnRTZXJ2aWNlIHtcbiAgI2NyZWRlbnRpYWw6IFRva2VuQ3JlZGVudGlhbDtcbiAgI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMgPSBbXG4gICAgXCJNaWNyb3NvZnQuQWR2aXNvclwiLFxuICAgIFwiTWljcm9zb2Z0LkFsZXJ0c01hbmFnZW1lbnRcIixcbiAgICBcIk1pY3Jvc29mdC5BcGlNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuQXBwXCIsXG4gICAgXCJNaWNyb3NvZnQuQXV0aG9yaXphdGlvblwiLFxuICAgIFwiTWljcm9zb2Z0LkF6dXJlVGVycmFmb3JtXCIsXG4gICAgXCJNaWNyb3NvZnQuQ2FjaGVcIixcbiAgICBcIk1pY3Jvc29mdC5DZG5cIixcbiAgICBcIk1pY3Jvc29mdC5Db250YWluZXJJbnN0YW5jZVwiLFxuICAgIFwiTWljcm9zb2Z0LkNvc3RNYW5hZ2VtZW50XCIsXG4gICAgXCJNaWNyb3NvZnQuREJmb3JQb3N0Z3JlU1FMXCIsXG4gICAgXCJNaWNyb3NvZnQuS2V5VmF1bHRcIixcbiAgICBcIk1pY3Jvc29mdC5TZXJ2aWNlQnVzXCIsXG4gICAgXCJNaWNyb3NvZnQuU3FsXCIsXG4gICAgXCJNaWNyb3NvZnQuU3RvcmFnZVwiLFxuICAgIFwiTWljcm9zb2Z0LldlYlwiLFxuICBdIGFzIGNvbnN0O1xuICAjcmVzb3VyY2VHcmFwaENsaWVudDogUmVzb3VyY2VHcmFwaENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjcmVkZW50aWFsOiBUb2tlbkNyZWRlbnRpYWwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50ID0gbmV3IFJlc291cmNlR3JhcGhDbGllbnQoY3JlZGVudGlhbCk7XG4gICAgdGhpcy4jY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XG4gIH1cblxuICBhc3luYyBnZXRUZXJyYWZvcm1CYWNrZW5kKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICApOiBQcm9taXNlPFRlcnJhZm9ybUJhY2tlbmQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBhbGxMb2NhdGlvbnMgPSBPYmplY3QudmFsdWVzKGxvY2F0aW9uU2hvcnQpLmpvaW4oXCJ8XCIpO1xuICAgIGNvbnN0IHNob3J0RW52ID0gZW52aXJvbm1lbnRTaG9ydFtuYW1lXTtcbiAgICAvLyBDaGVjayBpZiBhIHN0b3JhZ2UgYWNjb3VudCB3aXRoIHRoZSBleHBlY3RlZCBuYW1lIGV4aXN0c1xuICAgIC8vICRwcmVmaXggKyBlbnZpcm9ubWVudCBzaG9ydCArIGxvY2F0aW9uICsgXCJ0ZnN0YXRlc3RcIiArIHN1ZmZpeCAoZS5nLiwgXCJkeHBpdG50ZnN0YXRlc3QwMVwiKVxuICAgIC8vIGl0IGNhbiByZXR1cm4gbXVsdGlwbGUgcmVzdWx0cyAoZS5nLiBmb3IgZGlmZmVyZW50IGxvY2F0aW9uIG9yIGluc3RhbmNlIG51bWJlcilcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBgJHtwcmVmaXh9JHtzaG9ydEVudn0oJHthbGxMb2NhdGlvbnN9KXRmc3RhdGVzdCgwWzEtOV18WzEtOV1cXFxcZClgO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYHJlc291cmNlc1xuICAgICAgICAgICAgIHwgd2hlcmUgdHlwZSA9PSAnbWljcm9zb2Z0LnN0b3JhZ2Uvc3RvcmFnZWFjY291bnRzJ1xuICAgICAgICAgICAgIHwgd2hlcmUgbmFtZSBtYXRjaGVzIHJlZ2V4IEAnJHtyZXNvdXJjZU5hbWV9J1xuICAgICAgICAgICAgYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNyZXNvdXJjZUdyYXBoQ2xpZW50LnJlc291cmNlcyh7XG4gICAgICBxdWVyeSxcbiAgICAgIHN1YnNjcmlwdGlvbnM6IFtjbG91ZEFjY291bnRJZF0sXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC50b3RhbFJlY29yZHMgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JhZ2VBY2NvdW50cyA9IHouYXJyYXkocmVzb3VyY2VHcmFwaERhdGFTY2hlbWEpLnBhcnNlKHJlc3VsdC5kYXRhKTtcbiAgICAvLyBvbiBtdWx0aXBsZSByZXN1bHRzLCByYW5rIHN0b3JhZ2UgYWNjb3VudHMgYnkgbG9jYXRpb24gcHJpb3JpdHkgYW5kIGluc3RhbmNlIG51bWJlclxuICAgIGlmIChzdG9yYWdlQWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgICAgc3RvcmFnZUFjY291bnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gY29tcGFyZSBsb2NhdGlvbnMgcHJpb3JpdHlcbiAgICAgICAgY29uc3QgbG9jYXRpb25Db21wYXJpc29uID1cbiAgICAgICAgICBsb2NhdGlvbnMuaW5kZXhPZihhLmxvY2F0aW9uKSAtIGxvY2F0aW9ucy5pbmRleE9mKGIubG9jYXRpb24pO1xuICAgICAgICBpZiAobG9jYXRpb25Db21wYXJpc29uID09PSAwKSB7XG4gICAgICAgICAgLy8gc2FtZSBsb2NhdGlvbiwgY29tcGFyZSBieSBuYW1lICh0byBnZXQgdGhlIGhpZ2hlc3QgaW5zdGFuY2UgbnVtYmVyKVxuICAgICAgICAgIHJldHVybiBiLm5hbWUubG9jYWxlQ29tcGFyZShhLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhdGlvbkNvbXBhcmlzb247XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRlcnJhZm9ybUJhY2tlbmRTY2hlbWEucGFyc2Uoe1xuICAgICAgcmVzb3VyY2VHcm91cE5hbWU6IHN0b3JhZ2VBY2NvdW50c1swXS5yZXNvdXJjZUdyb3VwLFxuICAgICAgc3RvcmFnZUFjY291bnROYW1lOiBzdG9yYWdlQWNjb3VudHNbMF0ubmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCxcbiAgICAgIHR5cGU6IFwiYXp1cmVybVwiLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaGFzVXNlclBlcm1pc3Npb25Ub0luaXRpYWxpemUoXG4gICAgY2xvdWRBY2NvdW50SWQ6IENsb3VkQWNjb3VudFtcImlkXCJdLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQWxsIHByaW5jaXBhbCBJRHMgdG8gY2hlY2sgKHVzZXIgKyBhbGwgZ3JvdXBzKVxuICAgICAgY29uc3QgYWxsUHJpbmNpcGFsSWRzID0gYXdhaXQgdGhpcy4jZ2V0Q3VycmVudFByaW5jaXBhbElkcygpO1xuXG4gICAgICAvLyBHZXQgcm9sZSBhc3NpZ25tZW50cyBmb3IgdGhlIHN1YnNjcmlwdGlvblxuICAgICAgY29uc3QgYXV0aENsaWVudCA9IG5ldyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gW1xuICAgICAgICBidWlsdEluUm9sZURlZmluaXRpb25JZHMub3duZXIsIC8vIE93bmVyXG4gICAgICAgIGJ1aWx0SW5Sb2xlRGVmaW5pdGlvbklkcy5zdG9yYWdlQmxvYkRhdGFDb250cmlidXRvciwgLy8gU3RvcmFnZSBCbG9iIERhdGEgQ29udHJpYnV0b3JcbiAgICAgICAgYnVpbHRJblJvbGVEZWZpbml0aW9uSWRzLmtleVZhdWx0U2VjcmV0c09mZmljZXIsIC8vIEtleSBWYXVsdCBTZWNyZXRzIE9mZmljZXJcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gYC9zdWJzY3JpcHRpb25zLyR7Y2xvdWRBY2NvdW50SWR9YDtcblxuICAgICAgLy8gQ29sbGVjdCBhbGwgcm9sZSBkZWZpbml0aW9uIElEcyBhc3NpZ25lZCB0byB0aGUgdXNlciBvciB0aGVpciBncm91cHNcbiAgICAgIGNvbnN0IGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBhc3NpZ25tZW50IG9mIGF1dGhDbGllbnQucm9sZUFzc2lnbm1lbnRzLmxpc3RGb3JTY29wZShcbiAgICAgICAgc2NvcGUsXG4gICAgICApKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgYXNzaWdubWVudCBpcyBmb3IgdGhlIHVzZXIgb3IgYW55IG9mIHRoZWlyIGdyb3Vwc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYXNzaWdubWVudC5wcmluY2lwYWxJZCAmJlxuICAgICAgICAgIGFsbFByaW5jaXBhbElkcy5oYXMoYXNzaWdubWVudC5wcmluY2lwYWxJZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCByb2xlIGRlZmluaXRpb24gSUQgZnJvbSB0aGUgZnVsbCByZXNvdXJjZSBJRFxuICAgICAgICAgIC8vIEZvcm1hdDogL3N1YnNjcmlwdGlvbnMve3N1Yn0vcHJvdmlkZXJzL01pY3Jvc29mdC5BdXRob3JpemF0aW9uL3JvbGVEZWZpbml0aW9ucy97cm9sZUlkfVxuICAgICAgICAgIGNvbnN0IHJvbGVEZWZJZCA9IGFzc2lnbm1lbnQucm9sZURlZmluaXRpb25JZD8uc3BsaXQoXCIvXCIpLnBvcCgpO1xuICAgICAgICAgIGlmIChyb2xlRGVmSWQpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkUm9sZURlZmluaXRpb25JZHMuYWRkKHJvbGVEZWZJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQtY2lyY3VpdDogc3RvcCBpZiBhbGwgcmVxdWlyZWQgcm9sZXMgaGF2ZSBiZWVuIGZvdW5kXG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXF1aXJlZFJvbGVzLmV2ZXJ5KChyZXF1aXJlZFJvbGUpID0+XG4gICAgICAgICAgICBhc3NpZ25lZFJvbGVEZWZpbml0aW9uSWRzLmhhcyhyZXF1aXJlZFJvbGUpLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgYWxsIHJlcXVpcmVkIHJvbGVzIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBoYXNBbGxSb2xlcyA9IHJlcXVpcmVkUm9sZXMuZXZlcnkoKHJlcXVpcmVkUm9sZSkgPT5cbiAgICAgICAgYXNzaWduZWRSb2xlRGVmaW5pdGlvbklkcy5oYXMocmVxdWlyZWRSb2xlKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBoYXNBbGxSb2xlcztcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gSGFuZGxlIGF1dGhvcml6YXRpb24gZXJyb3JzICg0MDMgRm9yYmlkZGVuKSAtIHVzZXIgbGFja3MgcGVybWlzc2lvbnNcbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3IgJiZcbiAgICAgICAgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIFwic3RhdHVzQ29kZVwiIGluIGVycm9yICYmXG4gICAgICAgIGVycm9yLnN0YXR1c0NvZGUgPT09IDQwM1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlLXRocm93IG90aGVyIGVycm9yc1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZShcbiAgICBjbG91ZEFjY291bnQ6IENsb3VkQWNjb3VudCxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzOiBHaXRIdWJBcHBDcmVkZW50aWFscyxcbiAgICBnaXRodWI6IEdpdEh1YlJlcG8sXG4gICAgZ2l0SHViU2VydmljZTogR2l0SHViU2VydmljZSxcbiAgICB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydC5lcXVhbChjbG91ZEFjY291bnQuY3NwLCBcImF6dXJlXCIsIFwiQ2xvdWQgYWNjb3VudCBtdXN0IGJlIEF6dXJlXCIpO1xuICAgIGFzc2VydC5vayhcbiAgICAgIGlzQXp1cmVMb2NhdGlvbihjbG91ZEFjY291bnQuZGVmYXVsdExvY2F0aW9uKSxcbiAgICAgIFwiVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGNsb3VkIGFjY291bnQgaXMgbm90IGEgdmFsaWQgQXp1cmUgbG9jYXRpb25cIixcbiAgICApO1xuXG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG5cbiAgICAvLyBSZWdpc3RlciByZXF1aXJlZCByZXNvdXJjZSBwcm92aWRlcnMgYmVmb3JlIGNyZWF0aW5nIGFueSByZXNvdXJjZXNcbiAgICBhd2FpdCB0aGlzLiNyZWdpc3RlclByb3ZpZGVycyhjbG91ZEFjY291bnQuaWQpO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHNob3J0ID0ge1xuICAgICAgZW52OiBlbnZpcm9ubWVudFNob3J0W25hbWVdLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU2hvcnRbY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbl0sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc291cmNlR3JvdXBOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0LmVudn0tJHtzaG9ydC5sb2NhdGlvbn0tY29tbW9uLXJnLTAxYDtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgQ3JlYXRlZEJ5OiBcIkRYIENMSVwiLFxuICAgICAgICBFbnZpcm9ubWVudDogbmFtZSxcbiAgICAgICAgLi4udGFncyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJDcmVhdGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgcmVzb3VyY2VHcm91cE5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQgfSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlkZW50aXR5TmFtZTogQm9vdHN0cmFwcGVySWRlbnRpdHlOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0LmVudn0tJHtzaG9ydC5sb2NhdGlvbn0tYm9vdHN0cmFwLWlkLTAxYDtcbiAgICAgIGNvbnN0IGNpSWRlbnRpdHlOYW1lOiBCb290c3RyYXBwZXJJZGVudGl0eU5hbWUgPSBgJHtwcmVmaXh9LSR7c2hvcnQuZW52fS0ke3Nob3J0LmxvY2F0aW9ufS1ib290c3RyYXAtY2ktaWQtMDFgO1xuXG4gICAgICBjb25zdCBtc2lDbGllbnQgPSBuZXcgTWFuYWdlZFNlcnZpY2VJZGVudGl0eUNsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgW2NkSWRlbnRpdHksIGNpSWRlbnRpdHldID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLiNjcmVhdGVCb290c3RyYXBwZXJJZGVudGl0eSh7XG4gICAgICAgICAgY2xvdWRBY2NvdW50SWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAgICBpZGVudGl0eU5hbWUsXG4gICAgICAgICAgbXNpQ2xpZW50LFxuICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiNjcmVhdGVCb290c3RyYXBwZXJJZGVudGl0eSh7XG4gICAgICAgICAgY2xvdWRBY2NvdW50SWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAgICBpZGVudGl0eU5hbWU6IGNpSWRlbnRpdHlOYW1lLFxuICAgICAgICAgIG1zaUNsaWVudCxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCA9IG5ldyBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudChcbiAgICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbkNsaWVudCA9IG5ldyBTdWJzY3JpcHRpb25DbGllbnQodGhpcy4jY3JlZGVudGlhbCk7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBhd2FpdCBzdWJzY3JpcHRpb25DbGllbnQuc3Vic2NyaXB0aW9ucy5nZXQoXG4gICAgICAgIGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICk7XG4gICAgICBhc3NlcnQub2soc3Vic2NyaXB0aW9uLnRlbmFudElkLCBcIlN1YnNjcmlwdGlvbiB0ZW5hbnQgSUQgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgY29uc3QgdGVuYW50SWQgPSBzdWJzY3JpcHRpb24udGVuYW50SWQ7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb25TY29wZSA9IGAvc3Vic2NyaXB0aW9ucy8ke2Nsb3VkQWNjb3VudC5pZH1gO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuI2Fzc2lnbkJvb3RzdHJhcHBlclJvbGVzKHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCxcbiAgICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICAgIGlkZW50aXR5OiBjZElkZW50aXR5LFxuICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWRzOiBib290c3RyYXBJZGVudGl0eVJvbGVEZWZpbml0aW9uSWRzLFxuICAgICAgICAgIHNjb3BlOiBzdWJzY3JpcHRpb25TY29wZSxcbiAgICAgICAgfSksXG4gICAgICAgIHRoaXMuI2Fzc2lnbkJvb3RzdHJhcHBlclJvbGVzKHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCxcbiAgICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICAgIGlkZW50aXR5OiBjaUlkZW50aXR5LFxuICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWRzOiBib290c3RyYXBDaUlkZW50aXR5Um9sZURlZmluaXRpb25JZHMsXG4gICAgICAgICAgc2NvcGU6IHN1YnNjcmlwdGlvblNjb3BlLFxuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICBhd2FpdCB0aGlzLiNjb25maWd1cmVCb290c3RyYXBwZXJHaXRIdWJFbnZpcm9ubWVudHMoe1xuICAgICAgICBjZElkZW50aXR5Q2xpZW50SWQ6IGNkSWRlbnRpdHkuY2xpZW50SWQsXG4gICAgICAgIGNkSWRlbnRpdHlOYW1lOiBjZElkZW50aXR5Lm5hbWUsXG4gICAgICAgIGNpSWRlbnRpdHlDbGllbnRJZDogY2lJZGVudGl0eS5jbGllbnRJZCxcbiAgICAgICAgY2lJZGVudGl0eU5hbWU6IGNpSWRlbnRpdHkubmFtZSxcbiAgICAgICAgY2xvdWRBY2NvdW50SWQ6IGNsb3VkQWNjb3VudC5pZCxcbiAgICAgICAgZ2l0aHViLFxuICAgICAgICBnaXRIdWJTZXJ2aWNlLFxuICAgICAgICBtc2lDbGllbnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qga2V5VmF1bHROYW1lID0gYXdhaXQgdGhpcy4jY3JlYXRlQ29tbW9uS2V5VmF1bHQoe1xuICAgICAgICBjbG91ZEFjY291bnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICAgIHNob3J0RW52OiBzaG9ydC5lbnYsXG4gICAgICAgIHNob3J0TG9jYXRpb246IHNob3J0LmxvY2F0aW9uLFxuICAgICAgICB0YWdzLFxuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLiNzdG9yZVJ1bm5lckFwcFNlY3JldHMoe1xuICAgICAgICBjbG91ZEFjY291bnRJZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgICBrZXlWYXVsdE5hbWUsXG4gICAgICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIC8vIENsZWFudXAgcmVzb3VyY2UgZ3JvdXAgaWYgaW5pdGlhbGl6YXRpb24gZmFpbHNcbiAgICAgIGF3YWl0IHJlc291cmNlTWFuYWdlbWVudENsaWVudC5yZXNvdXJjZUdyb3Vwcy5iZWdpbkRlbGV0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgXCJEZWxldGVkIHJlc291cmNlIGdyb3VwIHtyZXNvdXJjZUdyb3VwTmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH0gZHVlIHRvIGluaXRpYWxpemF0aW9uIGZhaWx1cmVcIixcbiAgICAgICAgeyByZXNvdXJjZUdyb3VwTmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNsb3VkIGFjY291bnRcIiwgeyBjYXVzZSB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc0luaXRpYWxpemVkKFxuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXSxcbiAgICB7IG5hbWUsIHByZWZpeCB9OiBFbnZpcm9ubWVudElkLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhbGxMb2NhdGlvbnMgPSBPYmplY3QudmFsdWVzKGxvY2F0aW9uU2hvcnQpLmpvaW4oXCJ8XCIpO1xuICAgIGNvbnN0IHNob3J0RW52ID0gZW52aXJvbm1lbnRTaG9ydFtuYW1lXTtcblxuICAgIGNvbnN0IGlkZW50aXR5UmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0oJHthbGxMb2NhdGlvbnN9KS1ib290c3RyYXAtaWQtKDBbMS05XXxbMS05XVxcXFxkKWA7XG4gICAgY29uc3QgaWRlbnRpdHlRdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5tYW5hZ2VkaWRlbnRpdHkvdXNlcmFzc2lnbmVkaWRlbnRpdGllcydcbiAgICAgICAgICAgICB8IHdoZXJlIG5hbWUgbWF0Y2hlcyByZWdleCBAJyR7aWRlbnRpdHlSZXNvdXJjZU5hbWV9J1xuICAgICAgICAgICAgYDtcblxuICAgIGNvbnN0IGtleVZhdWx0UmVzb3VyY2VOYW1lID0gYCR7cHJlZml4fS0ke3Nob3J0RW52fS0oJHthbGxMb2NhdGlvbnN9KS1jb21tb24ta3YtKDBbMS05XXxbMS05XVxcXFxkKWA7XG4gICAgY29uc3Qga2V5VmF1bHRRdWVyeSA9IGByZXNvdXJjZXNcbiAgICAgICAgICAgICB8IHdoZXJlIHR5cGUgPT0gJ21pY3Jvc29mdC5rZXl2YXVsdC92YXVsdHMnXG4gICAgICAgICAgICAgfCB3aGVyZSBuYW1lIG1hdGNoZXMgcmVnZXggQCcke2tleVZhdWx0UmVzb3VyY2VOYW1lfSdcbiAgICAgICAgICAgIGA7XG5cbiAgICBjb25zdCBbaWRlbnRpdHlSZXN1bHQsIGtleVZhdWx0UmVzdWx0LCBhcmVQcm92aWRlcnNSZWdpc3RlcmVkXSA9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuI3Jlc291cmNlR3JhcGhDbGllbnQucmVzb3VyY2VzKHtcbiAgICAgICAgICBxdWVyeTogaWRlbnRpdHlRdWVyeSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25zOiBbY2xvdWRBY2NvdW50SWRdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4jcmVzb3VyY2VHcmFwaENsaWVudC5yZXNvdXJjZXMoe1xuICAgICAgICAgIHF1ZXJ5OiBrZXlWYXVsdFF1ZXJ5LFxuICAgICAgICAgIHN1YnNjcmlwdGlvbnM6IFtjbG91ZEFjY291bnRJZF0sXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiNhcmVQcm92aWRlcnNSZWdpc3RlcmVkKGNsb3VkQWNjb3VudElkKSxcbiAgICAgIF0pO1xuXG4gICAgY29uc3QgaW5pdGlhbGl6ZWQgPVxuICAgICAgaWRlbnRpdHlSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxuICAgICAga2V5VmF1bHRSZXN1bHQudG90YWxSZWNvcmRzID4gMCAmJlxuICAgICAgYXJlUHJvdmlkZXJzUmVnaXN0ZXJlZDtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFwic3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH0gaW5pdGlhbGl6ZWQ6IHtpbml0aWFsaXplZH1cIiwge1xuICAgICAgaW5pdGlhbGl6ZWQsXG4gICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBhc3luYyBwcm92aXNpb25UZXJyYWZvcm1CYWNrZW5kKFxuICAgIGNsb3VkQWNjb3VudDogQ2xvdWRBY2NvdW50LFxuICAgIHsgbmFtZSwgcHJlZml4IH06IEVudmlyb25tZW50SWQsXG4gICAgdGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICApOiBQcm9taXNlPFRlcnJhZm9ybUJhY2tlbmQ+IHtcbiAgICBhc3NlcnQuZXF1YWwoY2xvdWRBY2NvdW50LmNzcCwgXCJhenVyZVwiLCBcIkNsb3VkIGFjY291bnQgbXVzdCBiZSBBenVyZVwiKTtcbiAgICBhc3NlcnQub2soXG4gICAgICBpc0F6dXJlTG9jYXRpb24oY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbiksXG4gICAgICBcIlRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBjbG91ZCBhY2NvdW50IGlzIG5vdCBhIHZhbGlkIEF6dXJlIGxvY2F0aW9uXCIsXG4gICAgKTtcblxuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50ID0gbmV3IFJlc291cmNlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHNob3J0ID0ge1xuICAgICAgZW52OiBlbnZpcm9ubWVudFNob3J0W25hbWVdLFxuICAgICAgbG9jYXRpb246IGxvY2F0aW9uU2hvcnRbY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbl0sXG4gICAgfTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBsb2NhdGlvbjogY2xvdWRBY2NvdW50LmRlZmF1bHRMb2NhdGlvbixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgRW52aXJvbm1lbnQ6IG5hbWUsXG4gICAgICAgIC4uLnRhZ3MsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXNvdXJjZUdyb3VwTmFtZSA9IGAke3ByZWZpeH0tJHtzaG9ydC5lbnZ9LSR7c2hvcnQubG9jYXRpb259LXRmc3RhdGUtcmctMDFgO1xuXG4gICAgYXdhaXQgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50LnJlc291cmNlR3JvdXBzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICBwYXJhbWV0ZXJzLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQgcmVzb3VyY2UgZ3JvdXAge3Jlc291cmNlR3JvdXBOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyByZXNvdXJjZUdyb3VwTmFtZSwgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudC5pZCB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdG9yYWdlTWFuYWdlbWVudENsaWVudCA9IG5ldyBTdG9yYWdlTWFuYWdlbWVudENsaWVudChcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgICBjbG91ZEFjY291bnQuaWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN0b3JhZ2VBY2NvdW50ID1cbiAgICAgIGF3YWl0IHN0b3JhZ2VNYW5hZ2VtZW50Q2xpZW50LnN0b3JhZ2VBY2NvdW50cy5iZWdpbkNyZWF0ZUFuZFdhaXQoXG4gICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICBgJHtwcmVmaXh9JHtzaG9ydC5lbnZ9JHtzaG9ydC5sb2NhdGlvbn10ZnN0YXRlc3QwMWAsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBcIlN0b3JhZ2VWMlwiLFxuICAgICAgICAgIHNrdToge1xuICAgICAgICAgICAgbmFtZTogXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgIHRpZXI6IFwiU3RhbmRhcmRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgc3RvcmFnZUFjY291bnQucHJpbWFyeUVuZHBvaW50cz8uYmxvYixcbiAgICAgIFwiU3RvcmFnZSBhY2NvdW50IGJsb2IgZW5kcG9pbnQgaXMgdW5kZWZpbmVkXCIsXG4gICAgKTtcblxuICAgIGFzc2VydC5vayhzdG9yYWdlQWNjb3VudC5uYW1lLCBcIlN0b3JhZ2UgYWNjb3VudCBuYW1lIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBzdG9yYWdlIGFjY291bnQge3N0b3JhZ2VBY2NvdW50TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHtcbiAgICAgICAgc3RvcmFnZUFjY291bnROYW1lOiBzdG9yYWdlQWNjb3VudC5uYW1lLFxuICAgICAgICBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGJsb2JTZXJ2aWNlQ2xpZW50ID0gbmV3IEJsb2JTZXJ2aWNlQ2xpZW50KFxuICAgICAgc3RvcmFnZUFjY291bnQucHJpbWFyeUVuZHBvaW50cz8uYmxvYixcbiAgICAgIHRoaXMuI2NyZWRlbnRpYWwsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9XG4gICAgICBibG9iU2VydmljZUNsaWVudC5nZXRDb250YWluZXJDbGllbnQoXCJ0ZXJyYWZvcm0tc3RhdGVcIik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29udGFpbmVyQ2xpZW50LmNyZWF0ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENsZWFudXAgcmVzb3VyY2UgZ3JvdXAgaWYgYmxvYiBjb250YWluZXIgY3JlYXRpb24gZmFpbHNcbiAgICAgIC8vIHJlc291cmNlIGdyb3VwIGRlbGV0aW9uIGFsc28gZGVsZXRlcyBhbGwgY29udGFpbmVkIHJlc291cmNlc1xuICAgICAgYXdhaXQgcmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50LnJlc291cmNlR3JvdXBzLmJlZ2luRGVsZXRlQW5kV2FpdChcbiAgICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBibG9iIGNvbnRhaW5lcmAsIHtcbiAgICAgICAgY2F1c2U6IGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVycmFmb3JtQmFja2VuZFNjaGVtYS5wYXJzZSh7XG4gICAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIHN0b3JhZ2VBY2NvdW50TmFtZTogc3RvcmFnZUFjY291bnQubmFtZSxcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnQuaWQsXG4gICAgICB0eXBlOiBcImF6dXJlcm1cIixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jICNhcmVQcm92aWRlcnNSZWdpc3RlcmVkKHN1YnNjcmlwdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy4jcmVxdWlyZWRSZXNvdXJjZVByb3ZpZGVycy5tYXAoYXN5bmMgKG5hbWVzcGFjZSkgPT4ge1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IGF3YWl0IGNsaWVudC5wcm92aWRlcnMuZ2V0KG5hbWVzcGFjZSk7XG4gICAgICAgIHJldHVybiBwcm92aWRlci5yZWdpc3RyYXRpb25TdGF0ZSA9PT0gXCJSZWdpc3RlcmVkXCI7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KEJvb2xlYW4pO1xuICB9XG5cbiAgYXN5bmMgI2Fzc2lnbkJvb3RzdHJhcHBlclJvbGVzKHtcbiAgICBhdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudCxcbiAgICBjbG91ZEFjY291bnRJZCxcbiAgICBpZGVudGl0eSxcbiAgICByb2xlRGVmaW5pdGlvbklkcyxcbiAgICBzY29wZSxcbiAgfToge1xuICAgIGF1dGhvcml6YXRpb25NYW5hZ2VtZW50Q2xpZW50OiBBdXRob3JpemF0aW9uTWFuYWdlbWVudENsaWVudDtcbiAgICBjbG91ZEFjY291bnRJZDogc3RyaW5nO1xuICAgIGlkZW50aXR5OiBCb290c3RyYXBwZXJJZGVudGl0eTtcbiAgICByb2xlRGVmaW5pdGlvbklkczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgc2NvcGU6IHN0cmluZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByb2xlRGVmaW5pdGlvbklkcy5tYXAoKHJvbGVEZWZpbml0aW9uSWQpID0+XG4gICAgICAgIGF1dGhvcml6YXRpb25NYW5hZ2VtZW50Q2xpZW50LnJvbGVBc3NpZ25tZW50cy5jcmVhdGUoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgdGhpcy4jY3JlYXRlUm9sZUFzc2lnbm1lbnROYW1lKFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBpZGVudGl0eS5wcmluY2lwYWxJZCxcbiAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmluY2lwYWxJZDogaWRlbnRpdHkucHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBwcmluY2lwYWxUeXBlOiBcIlNlcnZpY2VQcmluY2lwYWxcIixcbiAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQ6IHRoaXMuI2NyZWF0ZVJvbGVEZWZpbml0aW9uUmVzb3VyY2VJZChcbiAgICAgICAgICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICAgICAgICAgIHJvbGVEZWZpbml0aW9uSWQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkFzc2lnbmVkIGJvb3RzdHJhcCByb2xlcyB0byBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBpZGVudGl0eU5hbWU6IGlkZW50aXR5Lm5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCB9LFxuICAgICk7XG4gIH1cblxuICBhc3luYyAjY29uZmlndXJlQm9vdHN0cmFwcGVyR2l0SHViRW52aXJvbm1lbnRzKHtcbiAgICBjZElkZW50aXR5Q2xpZW50SWQsXG4gICAgY2RJZGVudGl0eU5hbWUsXG4gICAgY2lJZGVudGl0eUNsaWVudElkLFxuICAgIGNpSWRlbnRpdHlOYW1lLFxuICAgIGNsb3VkQWNjb3VudElkLFxuICAgIGdpdGh1YixcbiAgICBnaXRIdWJTZXJ2aWNlLFxuICAgIG1zaUNsaWVudCxcbiAgICBuYW1lLFxuICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICAgIHRlbmFudElkLFxuICB9OiB7XG4gICAgY2RJZGVudGl0eUNsaWVudElkOiBzdHJpbmc7XG4gICAgY2RJZGVudGl0eU5hbWU6IHN0cmluZztcbiAgICBjaUlkZW50aXR5Q2xpZW50SWQ6IHN0cmluZztcbiAgICBjaUlkZW50aXR5TmFtZTogc3RyaW5nO1xuICAgIGNsb3VkQWNjb3VudElkOiBzdHJpbmc7XG4gICAgZ2l0aHViOiBHaXRIdWJSZXBvO1xuICAgIGdpdEh1YlNlcnZpY2U6IEdpdEh1YlNlcnZpY2U7XG4gICAgbXNpQ2xpZW50OiBNYW5hZ2VkU2VydmljZUlkZW50aXR5Q2xpZW50O1xuICAgIG5hbWU6IEVudmlyb25tZW50SWRbXCJuYW1lXCJdO1xuICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdHJpbmc7XG4gICAgcnVubmVyQXBwQ3JlZGVudGlhbHM6IEdpdEh1YkFwcENyZWRlbnRpYWxzO1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcbiAgICBjb25zdCBjZEVudmlyb25tZW50TmFtZSA9IGBib290c3RyYXBwZXItJHtuYW1lfS1jZGA7XG4gICAgY29uc3QgY2lFbnZpcm9ubWVudE5hbWUgPSBgYm9vdHN0cmFwcGVyLSR7bmFtZX0tY2lgO1xuICAgIGNvbnN0IGVudmlyb25tZW50SWRlbnRpdGllcyA9IFtcbiAgICAgIHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBjZEVudmlyb25tZW50TmFtZSxcbiAgICAgICAgaWRlbnRpdHlDbGllbnRJZDogY2RJZGVudGl0eUNsaWVudElkLFxuICAgICAgICBpZGVudGl0eU5hbWU6IGNkSWRlbnRpdHlOYW1lLFxuICAgICAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGVudmlyb25tZW50TmFtZTogY2lFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIGlkZW50aXR5Q2xpZW50SWQ6IGNpSWRlbnRpdHlDbGllbnRJZCxcbiAgICAgICAgaWRlbnRpdHlOYW1lOiBjaUlkZW50aXR5TmFtZSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIEluY2x1ZGUgYSByZXBvc2l0b3J5LWRlcml2ZWQgc3VmZml4IHNvIGRpZmZlcmVudCByZXBvc2l0b3JpZXMgY2FuIHNoYXJlXG4gICAgLy8gdGhlIHNhbWUgYm9vdHN0cmFwIGlkZW50aXR5IHdpdGhvdXQgb3ZlcndyaXRpbmcgZWFjaCBvdGhlcidzIE9JREMgdHJ1c3QuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBlbnZpcm9ubWVudElkZW50aXRpZXMubWFwKCh7IGVudmlyb25tZW50TmFtZSwgaWRlbnRpdHlOYW1lIH0pID0+XG4gICAgICAgIG1zaUNsaWVudC5mZWRlcmF0ZWRJZGVudGl0eUNyZWRlbnRpYWxzLmNyZWF0ZU9yVXBkYXRlKFxuICAgICAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgICAgIGlkZW50aXR5TmFtZSxcbiAgICAgICAgICB0aGlzLiNjcmVhdGVGZWRlcmF0ZWRDcmVkZW50aWFsTmFtZSh7XG4gICAgICAgICAgICBnaXRodWIsXG4gICAgICAgICAgICBnaXRodWJFbnZpcm9ubWVudE5hbWU6IGVudmlyb25tZW50TmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhdWRpZW5jZXM6IFtcImFwaTovL0F6dXJlQURUb2tlbkV4Y2hhbmdlXCJdLFxuICAgICAgICAgICAgaXNzdWVyOiBcImh0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgICAgICAgIHN1YmplY3Q6IGByZXBvOiR7Z2l0aHViLm93bmVyfS8ke2dpdGh1Yi5yZXBvfTplbnZpcm9ubWVudDoke2Vudmlyb25tZW50TmFtZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNvbmZpZ3VyZWQgYm9vdHN0cmFwcGVyIGZlZGVyYXRlZCBpZGVudGl0eSBjcmVkZW50aWFscyBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQgfSxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBlbnZpcm9ubWVudElkZW50aXRpZXMubWFwKFxuICAgICAgICAoeyBlbnZpcm9ubWVudE5hbWUsIGlkZW50aXR5Q2xpZW50SWQsIHJ1bm5lckFwcENyZWRlbnRpYWxzIH0pID0+XG4gICAgICAgICAgdGhpcy4jc3RvcmVCb290c3RyYXBwZXJFbnZpcm9ubWVudFNlY3JldHMoe1xuICAgICAgICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICAgICAgICBnaXRodWIsXG4gICAgICAgICAgICBnaXRodWJFbnZpcm9ubWVudE5hbWU6IGVudmlyb25tZW50TmFtZSxcbiAgICAgICAgICAgIGdpdEh1YlNlcnZpY2UsXG4gICAgICAgICAgICBpZGVudGl0eUNsaWVudElkLFxuICAgICAgICAgICAgcnVubmVyQXBwQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVCb290c3RyYXBwZXJJZGVudGl0eSh7XG4gICAgY2xvdWRBY2NvdW50SWQsXG4gICAgaWRlbnRpdHlOYW1lLFxuICAgIG1zaUNsaWVudCxcbiAgICBwYXJhbWV0ZXJzLFxuICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50SWQ6IHN0cmluZztcbiAgICBpZGVudGl0eU5hbWU6IEJvb3RzdHJhcHBlcklkZW50aXR5TmFtZTtcbiAgICBtc2lDbGllbnQ6IE1hbmFnZWRTZXJ2aWNlSWRlbnRpdHlDbGllbnQ7XG4gICAgcGFyYW1ldGVyczogQm9vdHN0cmFwcGVySWRlbnRpdHlQYXJhbWV0ZXJzO1xuICAgIHJlc291cmNlR3JvdXBOYW1lOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEJvb3RzdHJhcHBlcklkZW50aXR5PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBtc2lDbGllbnQudXNlckFzc2lnbmVkSWRlbnRpdGllcy5jcmVhdGVPclVwZGF0ZShcbiAgICAgIHJlc291cmNlR3JvdXBOYW1lLFxuICAgICAgaWRlbnRpdHlOYW1lLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICApO1xuXG4gICAgYXNzZXJ0Lm9rKFxuICAgICAgaWRlbnRpdHkucHJpbmNpcGFsSWQsXG4gICAgICBcIk1hbmFnZWQgaWRlbnRpdHkgcHJpbmNpcGFsIElEIGlzIHVuZGVmaW5lZFwiLFxuICAgICk7XG4gICAgYXNzZXJ0Lm9rKGlkZW50aXR5LmNsaWVudElkLCBcIk1hbmFnZWQgaWRlbnRpdHkgY2xpZW50IElEIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBpZGVudGl0eSB7aWRlbnRpdHlOYW1lfSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgeyBpZGVudGl0eU5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCB9LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IGlkZW50aXR5LmNsaWVudElkLFxuICAgICAgbmFtZTogaWRlbnRpdHlOYW1lLFxuICAgICAgcHJpbmNpcGFsSWQ6IGlkZW50aXR5LnByaW5jaXBhbElkLFxuICAgIH07XG4gIH1cblxuICBhc3luYyAjY3JlYXRlQ29tbW9uS2V5VmF1bHQoe1xuICAgIGNsb3VkQWNjb3VudCxcbiAgICBuYW1lLFxuICAgIHByZWZpeCxcbiAgICByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICBzaG9ydEVudixcbiAgICBzaG9ydExvY2F0aW9uLFxuICAgIHRhZ3MsXG4gICAgdGVuYW50SWQsXG4gIH06IHtcbiAgICBjbG91ZEFjY291bnQ6IENsb3VkQWNjb3VudDtcbiAgICBuYW1lOiBFbnZpcm9ubWVudElkW1wibmFtZVwiXTtcbiAgICBwcmVmaXg6IHN0cmluZztcbiAgICByZXNvdXJjZUdyb3VwTmFtZTogc3RyaW5nO1xuICAgIHNob3J0RW52OiBzdHJpbmc7XG4gICAgc2hvcnRMb2NhdGlvbjogc3RyaW5nO1xuICAgIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcImdlblwiLCBcImVudlwiXSk7XG5cbiAgICBjb25zdCBrdkNsaWVudCA9IG5ldyBLZXlWYXVsdE1hbmFnZW1lbnRDbGllbnQoXG4gICAgICB0aGlzLiNjcmVkZW50aWFsLFxuICAgICAgY2xvdWRBY2NvdW50LmlkLFxuICAgICk7XG5cbiAgICBjb25zdCBrZXlWYXVsdE5hbWUgPSBgJHtwcmVmaXh9LSR7c2hvcnRFbnZ9LSR7c2hvcnRMb2NhdGlvbn0tY29tbW9uLWt2LTAxYDtcbiAgICBjb25zdCBzZWNyZXRzUHJvdGVjdGlvbkVuYWJsZWQgPSBzaG9ydEVudiA9PT0gXCJwXCI7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrdkNsaWVudC52YXVsdHMuY2hlY2tOYW1lQXZhaWxhYmlsaXR5KHtcbiAgICAgIG5hbWU6IGtleVZhdWx0TmFtZSxcbiAgICAgIHR5cGU6IFwiTWljcm9zb2Z0LktleVZhdWx0L3ZhdWx0c1wiLFxuICAgIH0pO1xuXG4gICAgYXdhaXQga3ZDbGllbnQudmF1bHRzLmJlZ2luQ3JlYXRlT3JVcGRhdGVBbmRXYWl0KFxuICAgICAgcmVzb3VyY2VHcm91cE5hbWUsXG4gICAgICBrZXlWYXVsdE5hbWUsXG4gICAgICB7XG4gICAgICAgIGxvY2F0aW9uOiBjbG91ZEFjY291bnQuZGVmYXVsdExvY2F0aW9uLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgY3JlYXRlTW9kZTogcmVzdWx0Lm5hbWVBdmFpbGFibGUgPyBcImRlZmF1bHRcIiA6IFwicmVjb3ZlclwiLFxuICAgICAgICAgIGVuYWJsZWRGb3JEaXNrRW5jcnlwdGlvbjogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVQdXJnZVByb3RlY3Rpb246IHNlY3JldHNQcm90ZWN0aW9uRW5hYmxlZCA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZW5hYmxlUmJhY0F1dGhvcml6YXRpb246IHRydWUsXG4gICAgICAgICAgc2t1OiB7XG4gICAgICAgICAgICBmYW1pbHk6IFwiQVwiLFxuICAgICAgICAgICAgbmFtZTogXCJzdGFuZGFyZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc29mdERlbGV0ZVJldGVudGlvbkluRGF5czogc2VjcmV0c1Byb3RlY3Rpb25FbmFibGVkID8gMTQgOiA3LFxuICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICB9LFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgRW52aXJvbm1lbnQ6IG5hbWUsXG4gICAgICAgICAgLi4udGFncyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiQ3JlYXRlZCBrZXkgdmF1bHQge2tleVZhdWx0TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsga2V5VmF1bHROYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50LmlkIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBrZXlWYXVsdE5hbWU7XG4gIH1cblxuICAjY3JlYXRlRmVkZXJhdGVkQ3JlZGVudGlhbE5hbWUoe1xuICAgIGdpdGh1YixcbiAgICBnaXRodWJFbnZpcm9ubWVudE5hbWUsXG4gIH06IHtcbiAgICBnaXRodWI6IEdpdEh1YlJlcG87XG4gICAgZ2l0aHViRW52aXJvbm1lbnROYW1lOiBzdHJpbmc7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlcG9OYW1lID0gZ2l0aHViLnJlcG8ucmVwbGFjZUFsbCgvW15hLXpBLVowLTktXS9nLCBcIi1cIik7XG5cbiAgICByZXR1cm4gYCR7cmVwb05hbWV9LSR7Z2l0aHViRW52aXJvbm1lbnROYW1lfWA7XG4gIH1cblxuICAjY3JlYXRlUm9sZUFzc2lnbm1lbnROYW1lKFxuICAgIHNjb3BlOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICByb2xlRGVmaW5pdGlvbklkOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAgIC51cGRhdGUoYCR7c2NvcGV9OiR7cHJpbmNpcGFsSWR9OiR7cm9sZURlZmluaXRpb25JZH1gKVxuICAgICAgLmRpZ2VzdChcImhleFwiKTtcblxuICAgIHJldHVybiBgJHtoYXNoLnNsaWNlKDAsIDgpfS0ke2hhc2guc2xpY2UoOCwgMTIpfS0ke2hhc2guc2xpY2UoXG4gICAgICAxMixcbiAgICAgIDE2LFxuICAgICl9LSR7aGFzaC5zbGljZSgxNiwgMjApfS0ke2hhc2guc2xpY2UoMjAsIDMyKX1gO1xuICB9XG5cbiAgI2NyZWF0ZVJvbGVEZWZpbml0aW9uUmVzb3VyY2VJZChcbiAgICBzdWJzY3JpcHRpb25JZDogc3RyaW5nLFxuICAgIHJvbGVEZWZpbml0aW9uSWQ6IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9zdWJzY3JpcHRpb25zLyR7c3Vic2NyaXB0aW9uSWR9L3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9yb2xlRGVmaW5pdGlvbnMvJHtyb2xlRGVmaW5pdGlvbklkfWA7XG4gIH1cblxuICBhc3luYyAjZ2V0Q3VycmVudFByaW5jaXBhbElkcygpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gICAgLy8gQ3JlYXRlIEdyYXBoIGNsaWVudCB3aXRoIGN1c3RvbSBhdXRoIHByb3ZpZGVyIHRoYXQgZmV0Y2hlcyBmcmVzaCB0b2tlbnNcbiAgICBjb25zdCBncmFwaENsaWVudCA9IENsaWVudC5pbml0KHtcbiAgICAgIGF1dGhQcm92aWRlcjogYXN5bmMgKGRvbmUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgdGhpcy4jY3JlZGVudGlhbC5nZXRUb2tlbihcbiAgICAgICAgICAgIFwiaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tLy5kZWZhdWx0XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGRvbmUoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcIkZhaWxlZCB0byBhY3F1aXJlIHRva2VuIGZvciBNaWNyb3NvZnQgR3JhcGhcIiksXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb25lKG51bGwsIHRva2VuUmVzcG9uc2UudG9rZW4pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGRvbmUoZXJyb3IgYXMgRXJyb3IsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gR2V0IGN1cnJlbnQgdXNlcidzIGluZm9cbiAgICBjb25zdCBtZVJlc3BvbnNlID0gYXdhaXQgZ3JhcGhDbGllbnQuYXBpKFwiL21lXCIpLmdldCgpO1xuICAgIGNvbnN0IG1lID0gZ3JhcGhVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UobWVSZXNwb25zZSk7XG4gICAgY29uc3QgdXNlck9iamVjdElkID0gbWUuaWQ7XG5cbiAgICAvLyBHZXQgYWxsIGdyb3VwIG1lbWJlcnNoaXBzICh0cmFuc2l0aXZlIC0gaW5jbHVkZXMgbmVzdGVkIGdyb3VwcylcbiAgICBjb25zdCBncm91cElkczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbmV4dExpbms6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFwiL21lL3RyYW5zaXRpdmVNZW1iZXJPZj8kc2VsZWN0PWlkXCI7XG5cbiAgICB3aGlsZSAobmV4dExpbmspIHtcbiAgICAgIGNvbnN0IHJhd1Jlc3BvbnNlID0gYXdhaXQgZ3JhcGhDbGllbnQuYXBpKG5leHRMaW5rKS5nZXQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gZ3JhcGhHcm91cE1lbWJlcnNoaXBSZXNwb25zZVNjaGVtYS5wYXJzZShyYXdSZXNwb25zZSk7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVzcG9uc2UudmFsdWUpIHtcbiAgICAgICAgZ3JvdXBJZHMucHVzaChpdGVtLmlkKTtcbiAgICAgIH1cbiAgICAgIG5leHRMaW5rID0gcmVzcG9uc2VbXCJAb2RhdGEubmV4dExpbmtcIl07XG4gICAgfVxuXG4gICAgLy8gQWxsIHByaW5jaXBhbCBJRHMgdG8gY2hlY2sgKHVzZXIgKyBhbGwgZ3JvdXBzKVxuICAgIGNvbnN0IGFsbFByaW5jaXBhbElkcyA9IG5ldyBTZXQoW3VzZXJPYmplY3RJZCwgLi4uZ3JvdXBJZHNdKTtcbiAgICByZXR1cm4gYWxsUHJpbmNpcGFsSWRzO1xuICB9XG5cbiAgYXN5bmMgI3JlZ2lzdGVyUHJvdmlkZXJzKHN1YnNjcmlwdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZHgtY2xpXCIsIFwicmVnaXN0ZXItcHJvdmlkZXJzXCJdKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUmVzb3VyY2VNYW5hZ2VtZW50Q2xpZW50KFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICk7XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIFwiUmVnaXN0ZXJpbmcge2NvdW50fSByZXNvdXJjZSBwcm92aWRlcnMgb24gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgY291bnQ6IHRoaXMuI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMubGVuZ3RoLCBzdWJzY3JpcHRpb25JZCB9LFxuICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuI3JlcXVpcmVkUmVzb3VyY2VQcm92aWRlcnMubWFwKGFzeW5jIChuYW1lc3BhY2UpID0+IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnByb3ZpZGVycy5yZWdpc3RlcihuYW1lc3BhY2UpO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJSZWdpc3RlcmVkIHByb3ZpZGVyIHtuYW1lc3BhY2V9XCIsIHsgbmFtZXNwYWNlIH0pO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgXCJBbGwgcmVzb3VyY2UgcHJvdmlkZXJzIHJlZ2lzdGVyZWQgb24gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsgc3Vic2NyaXB0aW9uSWQgfSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgI3N0b3JlQm9vdHN0cmFwcGVyRW52aXJvbm1lbnRTZWNyZXRzKHtcbiAgICBjbG91ZEFjY291bnRJZCxcbiAgICBnaXRodWIsXG4gICAgZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgIGdpdEh1YlNlcnZpY2UsXG4gICAgaWRlbnRpdHlDbGllbnRJZCxcbiAgICBydW5uZXJBcHBDcmVkZW50aWFscyxcbiAgICB0ZW5hbnRJZCxcbiAgfToge1xuICAgIGNsb3VkQWNjb3VudElkOiBzdHJpbmc7XG4gICAgZ2l0aHViOiBHaXRIdWJSZXBvO1xuICAgIGdpdGh1YkVudmlyb25tZW50TmFtZTogc3RyaW5nO1xuICAgIGdpdEh1YlNlcnZpY2U6IEdpdEh1YlNlcnZpY2U7XG4gICAgaWRlbnRpdHlDbGllbnRJZDogc3RyaW5nO1xuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzPzogR2l0SHViQXBwQ3JlZGVudGlhbHM7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuXG4gICAgY29uc3QgY29tbW9uU2VjcmV0cyA9IFtcbiAgICAgIHsgc2VjcmV0TmFtZTogXCJBUk1fQ0xJRU5UX0lEXCIsIHNlY3JldFZhbHVlOiBpZGVudGl0eUNsaWVudElkIH0sXG4gICAgICB7IHNlY3JldE5hbWU6IFwiQVJNX1RFTkFOVF9JRFwiLCBzZWNyZXRWYWx1ZTogdGVuYW50SWQgfSxcbiAgICAgIHsgc2VjcmV0TmFtZTogXCJBUk1fU1VCU0NSSVBUSU9OX0lEXCIsIHNlY3JldFZhbHVlOiBjbG91ZEFjY291bnRJZCB9LFxuICAgIF07XG4gICAgY29uc3QgcmVsZWFzZVNlY3JldHMgPSBydW5uZXJBcHBDcmVkZW50aWFsc1xuICAgICAgPyBbXG4gICAgICAgICAgeyBzZWNyZXROYW1lOiBcIkdIX0FQUF9JRFwiLCBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMuaWQgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZWNyZXROYW1lOiBcIkdIX0FQUF9DTElFTlRfSURcIixcbiAgICAgICAgICAgIHNlY3JldFZhbHVlOiBydW5uZXJBcHBDcmVkZW50aWFscy5jbGllbnRJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IFwiR0hfQVBQX0lOU1RBTExBVElPTl9JRFwiLFxuICAgICAgICAgICAgc2VjcmV0VmFsdWU6IHJ1bm5lckFwcENyZWRlbnRpYWxzLmluc3RhbGxhdGlvbklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VjcmV0TmFtZTogXCJHSF9BUFBfS0VZXCIsXG4gICAgICAgICAgICBzZWNyZXRWYWx1ZTogcnVubmVyQXBwQ3JlZGVudGlhbHMua2V5LnRyaW1FbmQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBbLi4uY29tbW9uU2VjcmV0cywgLi4ucmVsZWFzZVNlY3JldHNdLm1hcCgoeyBzZWNyZXROYW1lLCBzZWNyZXRWYWx1ZSB9KSA9PlxuICAgICAgICBnaXRIdWJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlRW52aXJvbm1lbnRTZWNyZXQoe1xuICAgICAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgICAgIG93bmVyOiBnaXRodWIub3duZXIsXG4gICAgICAgICAgcmVwbzogZ2l0aHViLnJlcG8sXG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICBzZWNyZXRWYWx1ZSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoXCJTZXQgR2l0SHViIGVudmlyb25tZW50IHNlY3JldHMgZm9yIHtlbnZpcm9ubWVudE5hbWV9XCIsIHtcbiAgICAgIGVudmlyb25tZW50TmFtZTogZ2l0aHViRW52aXJvbm1lbnROYW1lLFxuICAgICAgc3Vic2NyaXB0aW9uSWQ6IGNsb3VkQWNjb3VudElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgI3N0b3JlUnVubmVyQXBwU2VjcmV0cyh7XG4gICAgY2xvdWRBY2NvdW50SWQsXG4gICAga2V5VmF1bHROYW1lLFxuICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLFxuICB9OiB7XG4gICAgY2xvdWRBY2NvdW50SWQ6IHN0cmluZztcbiAgICBrZXlWYXVsdE5hbWU6IHN0cmluZztcbiAgICBydW5uZXJBcHBDcmVkZW50aWFsczogR2l0SHViQXBwQ3JlZGVudGlhbHM7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wiZ2VuXCIsIFwiZW52XCJdKTtcblxuICAgIGF3YWl0IHRoaXMuI3dhaXRGb3JLZXlWYXVsdERuc1Jlc29sdXRpb24oe1xuICAgICAgY2xvdWRBY2NvdW50SWQsXG4gICAgICBrZXlWYXVsdE5hbWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWNyZXRDbGllbnQgPSBuZXcgU2VjcmV0Q2xpZW50KFxuICAgICAgYGh0dHBzOi8vJHtrZXlWYXVsdE5hbWV9LnZhdWx0LmF6dXJlLm5ldC9gLFxuICAgICAgdGhpcy4jY3JlZGVudGlhbCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgc2VjcmV0Q2xpZW50LnNldFNlY3JldChcImdpdGh1Yi1ydW5uZXItYXBwLWlkXCIsIHJ1bm5lckFwcENyZWRlbnRpYWxzLmlkKSxcbiAgICAgIHNlY3JldENsaWVudC5zZXRTZWNyZXQoXG4gICAgICAgIFwiZ2l0aHViLXJ1bm5lci1hcHAtaW5zdGFsbGF0aW9uLWlkXCIsXG4gICAgICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLmluc3RhbGxhdGlvbklkLFxuICAgICAgKSxcbiAgICAgIHNlY3JldENsaWVudC5zZXRTZWNyZXQoXG4gICAgICAgIFwiZ2l0aHViLXJ1bm5lci1hcHAta2V5XCIsXG4gICAgICAgIHJ1bm5lckFwcENyZWRlbnRpYWxzLmtleS50cmltRW5kKCksIC8vIHN0cmlwIHRyYWlsaW5nIG5ld2xpbmVzIGZyb20gUEVNIGtleXNcbiAgICAgICksXG4gICAgXSk7XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkNyZWF0ZWQgc2VjcmV0cyBpbiBrZXkgdmF1bHQge2tleVZhdWx0TmFtZX0gaW4gc3Vic2NyaXB0aW9uIHtzdWJzY3JpcHRpb25JZH1cIixcbiAgICAgIHsga2V5VmF1bHROYW1lLCBzdWJzY3JpcHRpb25JZDogY2xvdWRBY2NvdW50SWQgfSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgI3dhaXRGb3JLZXlWYXVsdERuc1Jlc29sdXRpb24oe1xuICAgIGNsb3VkQWNjb3VudElkLFxuICAgIGtleVZhdWx0TmFtZSxcbiAgfToge1xuICAgIGNsb3VkQWNjb3VudElkOiBDbG91ZEFjY291bnRbXCJpZFwiXTtcbiAgICBrZXlWYXVsdE5hbWU6IHN0cmluZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJnZW5cIiwgXCJlbnZcIl0pO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gYCR7a2V5VmF1bHROYW1lfS52YXVsdC5henVyZS5uZXRgO1xuXG4gICAgLy8gQXp1cmUgY2FuIHJlcG9ydCB0aGUgdmF1bHQgYXMgY3JlYXRlZCBiZWZvcmUgaXRzIHB1YmxpYyBETlMgbmFtZSBpcyByZWFkeS5cbiAgICAvLyBXYWl0IGhlcmUgc28gd3JpdGluZyBydW5uZXIgYXBwIHNlY3JldHMgZG9lcyBub3QgZmFpbCB3aXRoIEVOT1RGT1VORC5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBrZXlWYXVsdERuc1JlYWR5TWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbG9va3VwKGhvc3RuYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFrZXlWYXVsdERuc0Vycm9yU2NoZW1hLnNhZmVQYXJzZShjYXVzZSkuc3VjY2VzcyB8fFxuICAgICAgICAgIGF0dGVtcHQgPT09IGtleVZhdWx0RG5zUmVhZHlNYXhBdHRlbXB0c1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgS2V5IHZhdWx0IGVuZHBvaW50ICcke2hvc3RuYW1lfScgaXMgbm90IHJlc29sdmFibGVgLFxuICAgICAgICAgICAgeyBjYXVzZSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgXCJXYWl0aW5nIGZvciBrZXkgdmF1bHQgZW5kcG9pbnQge2hvc3RuYW1lfSB0byBiZWNvbWUgcmVzb2x2YWJsZSBpbiBzdWJzY3JpcHRpb24ge3N1YnNjcmlwdGlvbklkfVwiLFxuICAgICAgICAgIHsgaG9zdG5hbWUsIHN1YnNjcmlwdGlvbklkOiBjbG91ZEFjY291bnRJZCB9LFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChrZXlWYXVsdERuc1JlYWR5UmV0cnlEZWxheU1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -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[];
|