aws-cdk 2.1002.0 → 2.1004.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_LICENSES +2 -9
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/api/aws-auth/account-cache.js +3 -3
- package/lib/api/aws-auth/credential-plugins.js +4 -4
- package/lib/api/aws-auth/sdk-logger.d.ts +3 -3
- package/lib/api/aws-auth/sdk-logger.js +7 -12
- package/lib/api/aws-auth/sdk-provider.js +3 -3
- package/lib/api/aws-auth/sdk.js +3 -3
- package/lib/api/aws-auth/user-agent.js +3 -3
- package/lib/api/bootstrap/bootstrap-environment.d.ts +3 -3
- package/lib/api/bootstrap/bootstrap-environment.js +13 -14
- package/lib/api/bootstrap/bootstrap-template.yaml +14 -1
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +4 -4
- package/lib/api/bootstrap/deploy-bootstrap.js +11 -11
- package/lib/api/cxapp/cloud-assembly.d.ts +1 -16
- package/lib/api/cxapp/cloud-assembly.js +3 -3
- package/lib/api/cxapp/exec.js +3 -3
- package/lib/api/deployments/asset-publishing.d.ts +5 -5
- package/lib/api/deployments/asset-publishing.js +7 -8
- package/lib/api/deployments/assets.d.ts +2 -2
- package/lib/api/deployments/assets.js +9 -9
- package/lib/api/deployments/checks.d.ts +2 -2
- package/lib/api/deployments/checks.js +4 -4
- package/lib/api/deployments/cloudformation.d.ts +7 -7
- package/lib/api/deployments/cloudformation.js +30 -31
- package/lib/api/deployments/deploy-stack.d.ts +3 -5
- package/lib/api/deployments/deploy-stack.js +55 -58
- package/lib/api/deployments/deployments.d.ts +9 -8
- package/lib/api/deployments/deployments.js +27 -31
- package/lib/api/deployments/hotswap-deployments.d.ts +2 -2
- package/lib/api/deployments/hotswap-deployments.js +14 -14
- package/lib/api/deployments/nested-stack-helpers.js +3 -3
- package/lib/api/environment/environment-access.d.ts +3 -4
- package/lib/api/environment/environment-access.js +7 -8
- package/lib/api/environment/environment-resources.d.ts +5 -5
- package/lib/api/environment/environment-resources.js +13 -13
- package/lib/api/garbage-collection/garbage-collector.d.ts +3 -4
- package/lib/api/garbage-collection/garbage-collector.js +37 -38
- package/lib/api/garbage-collection/progress-printer.d.ts +3 -4
- package/lib/api/garbage-collection/progress-printer.js +5 -6
- package/lib/api/garbage-collection/stack-refresh.d.ts +3 -3
- package/lib/api/garbage-collection/stack-refresh.js +7 -7
- package/lib/api/logs/find-cloudwatch-logs.d.ts +2 -2
- package/lib/api/logs/find-cloudwatch-logs.js +6 -6
- package/lib/api/logs/logs-monitor.d.ts +27 -4
- package/lib/api/logs/logs-monitor.js +53 -32
- package/lib/api/resource-import/importer.d.ts +3 -5
- package/lib/api/resource-import/importer.js +12 -13
- package/lib/api/resource-import/migrator.d.ts +3 -5
- package/lib/api/resource-import/migrator.js +8 -10
- package/lib/api/settings.js +2 -2
- package/lib/api/stack-events/stack-activity-monitor.d.ts +5 -63
- package/lib/api/stack-events/stack-activity-monitor.js +7 -8
- package/lib/api/stack-events/stack-event-poller.js +3 -3
- package/lib/api/stack-events/stack-progress-monitor.d.ts +1 -14
- package/lib/api/stack-events/stack-progress-monitor.js +4 -4
- package/lib/api/toolkit-info.d.ts +2 -2
- package/lib/api/toolkit-info.js +5 -5
- package/lib/api/util/placeholders.d.ts +1 -1
- package/lib/api/util/placeholders.js +1 -1
- package/lib/api/util/template-body-parameter.js +4 -5
- package/lib/api/work-graph/work-graph-builder.d.ts +3 -4
- package/lib/api/work-graph/work-graph-builder.js +10 -11
- package/lib/api/work-graph/work-graph.d.ts +3 -8
- package/lib/api/work-graph/work-graph.js +8 -9
- package/lib/cli/activity-printer/base.d.ts +3 -4
- package/lib/cli/activity-printer/base.js +6 -5
- package/lib/cli/activity-printer/current.js +1 -1
- package/lib/cli/activity-printer/history.d.ts +1 -1
- package/lib/cli/activity-printer/history.js +1 -1
- package/lib/cli/cdk-toolkit.d.ts +0 -6
- package/lib/cli/cdk-toolkit.js +30 -40
- package/lib/cli/cli.d.ts +0 -1
- package/lib/cli/cli.js +6 -8
- package/lib/cli/messages.d.ts +11 -9
- package/lib/cli/messages.js +7 -14
- package/lib/cli/root-dir.d.ts +10 -0
- package/lib/cli/root-dir.js +23 -0
- package/lib/cli/version.js +6 -5
- package/lib/commands/migrate.js +3 -3
- package/lib/context-providers/cc-api-provider.js +5 -5
- package/lib/context-providers/index.js +3 -3
- package/lib/index.js +6962 -6363
- package/lib/init-hooks.js +3 -3
- package/lib/init-templates/.init-version.json +1 -1
- package/lib/init.js +8 -9
- package/lib/legacy-exports-source.d.ts +2 -5
- package/lib/legacy-exports-source.js +7 -10
- package/lib/list-stacks.d.ts +1 -2
- package/lib/list-stacks.js +1 -2
- package/lib/logging.d.ts +3 -1
- package/lib/logging.js +2 -1
- package/lib/notices.js +6 -7
- package/lib/toolkit/cli-io-host.d.ts +37 -125
- package/lib/toolkit/cli-io-host.js +44 -74
- package/lib/util.d.ts +1 -0
- package/lib/util.js +18 -0
- package/package.json +8 -15
- package/lib/util/archive.d.ts +0 -1
- package/lib/util/archive.js +0 -86
- package/lib/util/arrays.d.ts +0 -14
- package/lib/util/arrays.js +0 -36
- package/lib/util/bool.d.ts +0 -7
- package/lib/util/bool.js +0 -13
- package/lib/util/bytes.d.ts +0 -8
- package/lib/util/bytes.js +0 -21
- package/lib/util/cloudformation.d.ts +0 -16
- package/lib/util/cloudformation.js +0 -36
- package/lib/util/content-hash.d.ts +0 -5
- package/lib/util/content-hash.js +0 -43
- package/lib/util/directories.d.ts +0 -23
- package/lib/util/directories.js +0 -58
- package/lib/util/format-error.d.ts +0 -9
- package/lib/util/format-error.js +0 -22
- package/lib/util/index.d.ts +0 -15
- package/lib/util/index.js +0 -32
- package/lib/util/json.d.ts +0 -48
- package/lib/util/json.js +0 -68
- package/lib/util/objects.d.ts +0 -52
- package/lib/util/objects.js +0 -183
- package/lib/util/parallel.d.ts +0 -6
- package/lib/util/parallel.js +0 -48
- package/lib/util/serialize.d.ts +0 -27
- package/lib/util/serialize.js +0 -86
- package/lib/util/string-manipulation.d.ts +0 -14
- package/lib/util/string-manipulation.js +0 -39
- package/lib/util/type-brands.d.ts +0 -39
- package/lib/util/type-brands.js +0 -38
- package/lib/util/types.d.ts +0 -27
- package/lib/util/types.js +0 -25
- package/lib/util/version-range.d.ts +0 -2
- package/lib/util/version-range.js +0 -36
- package/lib/util/yaml-cfn.d.ts +0 -15
- package/lib/util/yaml-cfn.js +0 -58
|
@@ -13,12 +13,12 @@ const cloudformation_1 = require("./cloudformation");
|
|
|
13
13
|
const hotswap_deployments_1 = require("./hotswap-deployments");
|
|
14
14
|
const messages_1 = require("../../cli/messages");
|
|
15
15
|
const error_1 = require("../../toolkit/error");
|
|
16
|
-
const
|
|
16
|
+
const util_2 = require("../../util");
|
|
17
17
|
const evaluate_cloudformation_template_1 = require("../evaluate-cloudformation-template");
|
|
18
18
|
const common_1 = require("../hotswap/common");
|
|
19
19
|
const stack_events_1 = require("../stack-events");
|
|
20
20
|
const template_body_parameter_1 = require("../util/template-body-parameter");
|
|
21
|
-
async function deployStack(options,
|
|
21
|
+
async function deployStack(options, ioHelper) {
|
|
22
22
|
var _a, _b;
|
|
23
23
|
const stackArtifact = options.stack;
|
|
24
24
|
const stackEnv = options.resolvedEnvironment;
|
|
@@ -27,9 +27,9 @@ async function deployStack(options, { ioHost, action }) {
|
|
|
27
27
|
const deployName = options.deployName || stackArtifact.stackName;
|
|
28
28
|
let cloudFormationStack = await cloudformation_1.CloudFormationStack.lookup(cfn, deployName);
|
|
29
29
|
if (cloudFormationStack.stackStatus.isCreationFailure) {
|
|
30
|
-
await
|
|
30
|
+
await ioHelper.notify((0, messages_1.debug)(`Found existing stack ${deployName} that had previously failed creation. Deleting it before attempting to re-create it.`));
|
|
31
31
|
await cfn.deleteStack({ StackName: deployName });
|
|
32
|
-
const deletedStack = await (0, cloudformation_1.waitForStackDelete)(cfn,
|
|
32
|
+
const deletedStack = await (0, cloudformation_1.waitForStackDelete)(cfn, ioHelper, deployName);
|
|
33
33
|
if (deletedStack && deletedStack.stackStatus.name !== 'DELETE_COMPLETE') {
|
|
34
34
|
throw new error_1.ToolkitError(`Failed deleting stack ${deployName} that had previously failed creation (current state: ${deletedStack.stackStatus})`);
|
|
35
35
|
}
|
|
@@ -42,7 +42,7 @@ async function deployStack(options, { ioHost, action }) {
|
|
|
42
42
|
// an ad-hoc asset manifest, while passing their locations via template
|
|
43
43
|
// parameters.
|
|
44
44
|
const legacyAssets = new asset_manifest_builder_1.AssetManifestBuilder();
|
|
45
|
-
const assetParams = await (0, assets_1.addMetadataAssetsToManifest)(
|
|
45
|
+
const assetParams = await (0, assets_1.addMetadataAssetsToManifest)(ioHelper, stackArtifact, legacyAssets, options.envResources, options.reuseAssets);
|
|
46
46
|
const finalParameterValues = { ...options.parameters, ...assetParams };
|
|
47
47
|
const templateParams = cloudformation_1.TemplateParameters.fromTemplate(stackArtifact.template);
|
|
48
48
|
const stackParams = options.usePreviousParameters
|
|
@@ -50,12 +50,12 @@ async function deployStack(options, { ioHost, action }) {
|
|
|
50
50
|
: templateParams.supplyAll(finalParameterValues);
|
|
51
51
|
const hotswapMode = (_a = options.hotswap) !== null && _a !== void 0 ? _a : common_1.HotswapMode.FULL_DEPLOYMENT;
|
|
52
52
|
const hotswapPropertyOverrides = (_b = options.hotswapPropertyOverrides) !== null && _b !== void 0 ? _b : new common_1.HotswapPropertyOverrides();
|
|
53
|
-
if (await canSkipDeploy(options, cloudFormationStack, stackParams.hasChanges(cloudFormationStack.parameters),
|
|
54
|
-
await
|
|
53
|
+
if (await canSkipDeploy(options, cloudFormationStack, stackParams.hasChanges(cloudFormationStack.parameters), ioHelper)) {
|
|
54
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: skipping deployment (use --force to override)`));
|
|
55
55
|
// if we can skip deployment and we are performing a hotswap, let the user know
|
|
56
56
|
// that no hotswap deployment happened
|
|
57
57
|
if (hotswapMode !== common_1.HotswapMode.FULL_DEPLOYMENT) {
|
|
58
|
-
await
|
|
58
|
+
await ioHelper.notify((0, messages_1.info)((0, util_1.format)(`\n ${common_1.ICON} %s\n`, chalk.bold('hotswap deployment skipped - no changes were detected (use --force to override)'))));
|
|
59
59
|
}
|
|
60
60
|
return {
|
|
61
61
|
type: 'did-deploy-stack',
|
|
@@ -65,7 +65,7 @@ async function deployStack(options, { ioHost, action }) {
|
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
else {
|
|
68
|
-
await
|
|
68
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: deploying...`));
|
|
69
69
|
}
|
|
70
70
|
const bodyParameter = await (0, template_body_parameter_1.makeBodyParameter)(stackArtifact, options.resolvedEnvironment, legacyAssets, options.envResources, options.overrideTemplate);
|
|
71
71
|
let bootstrapStackName;
|
|
@@ -73,29 +73,29 @@ async function deployStack(options, { ioHost, action }) {
|
|
|
73
73
|
bootstrapStackName = (await options.envResources.lookupToolkit()).stackName;
|
|
74
74
|
}
|
|
75
75
|
catch (e) {
|
|
76
|
-
await
|
|
76
|
+
await ioHelper.notify((0, messages_1.debug)(`Could not determine the bootstrap stack name: ${e}`));
|
|
77
77
|
}
|
|
78
78
|
await (0, asset_publishing_1.publishAssets)(legacyAssets.toManifest(stackArtifact.assembly.directory), options.sdkProvider, stackEnv, {
|
|
79
79
|
parallel: options.assetParallelism,
|
|
80
|
-
allowCrossAccount: await (0, checks_1.determineAllowCrossAccountAssetPublishing)(options.sdk,
|
|
81
|
-
},
|
|
80
|
+
allowCrossAccount: await (0, checks_1.determineAllowCrossAccountAssetPublishing)(options.sdk, ioHelper, bootstrapStackName),
|
|
81
|
+
}, ioHelper);
|
|
82
82
|
if (hotswapMode !== common_1.HotswapMode.FULL_DEPLOYMENT) {
|
|
83
83
|
// attempt to short-circuit the deployment if possible
|
|
84
84
|
try {
|
|
85
|
-
const hotswapDeploymentResult = await (0, hotswap_deployments_1.tryHotswapDeployment)(options.sdkProvider,
|
|
85
|
+
const hotswapDeploymentResult = await (0, hotswap_deployments_1.tryHotswapDeployment)(options.sdkProvider, ioHelper, stackParams.values, cloudFormationStack, stackArtifact, hotswapMode, hotswapPropertyOverrides);
|
|
86
86
|
if (hotswapDeploymentResult) {
|
|
87
87
|
return hotswapDeploymentResult;
|
|
88
88
|
}
|
|
89
|
-
await
|
|
89
|
+
await ioHelper.notify((0, messages_1.info)((0, util_1.format)('Could not perform a hotswap deployment, as the stack %s contains non-Asset changes', stackArtifact.displayName)));
|
|
90
90
|
}
|
|
91
91
|
catch (e) {
|
|
92
92
|
if (!(e instanceof evaluate_cloudformation_template_1.CfnEvaluationException)) {
|
|
93
93
|
throw e;
|
|
94
94
|
}
|
|
95
|
-
await
|
|
95
|
+
await ioHelper.notify((0, messages_1.info)((0, util_1.format)('Could not perform a hotswap deployment, because the CloudFormation template could not be resolved: %s', (0, util_2.formatErrorMessage)(e))));
|
|
96
96
|
}
|
|
97
97
|
if (hotswapMode === common_1.HotswapMode.FALL_BACK) {
|
|
98
|
-
await
|
|
98
|
+
await ioHelper.notify((0, messages_1.info)('Falling back to doing a full deployment'));
|
|
99
99
|
options.sdk.appendCustomUserAgent('cdk-hotswap/fallback');
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
@@ -108,22 +108,21 @@ async function deployStack(options, { ioHost, action }) {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
// could not short-circuit the deployment, perform a full CFN deploy instead
|
|
111
|
-
const fullDeployment = new FullCloudFormationDeployment(options, cloudFormationStack, stackArtifact, stackParams, bodyParameter,
|
|
111
|
+
const fullDeployment = new FullCloudFormationDeployment(options, cloudFormationStack, stackArtifact, stackParams, bodyParameter, ioHelper);
|
|
112
112
|
return fullDeployment.performDeployment();
|
|
113
113
|
}
|
|
114
114
|
/**
|
|
115
115
|
* This class shares state and functionality between the different full deployment modes
|
|
116
116
|
*/
|
|
117
117
|
class FullCloudFormationDeployment {
|
|
118
|
-
constructor(options, cloudFormationStack, stackArtifact, stackParams, bodyParameter,
|
|
118
|
+
constructor(options, cloudFormationStack, stackArtifact, stackParams, bodyParameter, ioHelper) {
|
|
119
119
|
var _a;
|
|
120
120
|
this.options = options;
|
|
121
121
|
this.cloudFormationStack = cloudFormationStack;
|
|
122
122
|
this.stackArtifact = stackArtifact;
|
|
123
123
|
this.stackParams = stackParams;
|
|
124
124
|
this.bodyParameter = bodyParameter;
|
|
125
|
-
this.
|
|
126
|
-
this.action = action;
|
|
125
|
+
this.ioHelper = ioHelper;
|
|
127
126
|
this.cfn = options.sdk.cloudFormation();
|
|
128
127
|
this.stackName = (_a = options.deployName) !== null && _a !== void 0 ? _a : stackArtifact.stackName;
|
|
129
128
|
this.update = cloudFormationStack.exists && cloudFormationStack.stackStatus.name !== 'REVIEW_IN_PROGRESS';
|
|
@@ -153,16 +152,16 @@ class FullCloudFormationDeployment {
|
|
|
153
152
|
const changeSetDescription = await this.createChangeSet(changeSetName, execute, importExistingResources);
|
|
154
153
|
await this.updateTerminationProtection();
|
|
155
154
|
if ((0, cloudformation_1.changeSetHasNoChanges)(changeSetDescription)) {
|
|
156
|
-
await this.
|
|
155
|
+
await this.ioHelper.notify((0, messages_1.debug)((0, util_1.format)('No changes are to be performed on %s.', this.stackName)));
|
|
157
156
|
if (execute) {
|
|
158
|
-
await this.
|
|
157
|
+
await this.ioHelper.notify((0, messages_1.debug)((0, util_1.format)('Deleting empty change set %s', changeSetDescription.ChangeSetId)));
|
|
159
158
|
await this.cfn.deleteChangeSet({
|
|
160
159
|
StackName: this.stackName,
|
|
161
160
|
ChangeSetName: changeSetName,
|
|
162
161
|
});
|
|
163
162
|
}
|
|
164
163
|
if (this.options.force) {
|
|
165
|
-
await this.
|
|
164
|
+
await this.ioHelper.notify((0, messages_1.warn)([
|
|
166
165
|
'You used the --force flag, but CloudFormation reported that the deployment would not make any changes.',
|
|
167
166
|
'According to CloudFormation, all resources are already up-to-date with the state in your CDK app.',
|
|
168
167
|
'',
|
|
@@ -178,7 +177,7 @@ class FullCloudFormationDeployment {
|
|
|
178
177
|
};
|
|
179
178
|
}
|
|
180
179
|
if (!execute) {
|
|
181
|
-
await this.
|
|
180
|
+
await this.ioHelper.notify((0, messages_1.info)((0, util_1.format)('Changeset %s created and waiting in review for manual execution (--no-execute)', changeSetDescription.ChangeSetId)));
|
|
182
181
|
return {
|
|
183
182
|
type: 'did-deploy-stack',
|
|
184
183
|
noOp: false,
|
|
@@ -203,8 +202,8 @@ class FullCloudFormationDeployment {
|
|
|
203
202
|
}
|
|
204
203
|
async createChangeSet(changeSetName, willExecute, importExistingResources) {
|
|
205
204
|
await this.cleanupOldChangeset(changeSetName);
|
|
206
|
-
await this.
|
|
207
|
-
await this.
|
|
205
|
+
await this.ioHelper.notify((0, messages_1.debug)(`Attempting to create ChangeSet with name ${changeSetName} to ${this.verb} stack ${this.stackName}`));
|
|
206
|
+
await this.ioHelper.notify((0, messages_1.info)((0, util_1.format)('%s: creating CloudFormation changeset...', chalk.bold(this.stackName))));
|
|
208
207
|
const changeSet = await this.cfn.createChangeSet({
|
|
209
208
|
StackName: this.stackName,
|
|
210
209
|
ChangeSetName: changeSetName,
|
|
@@ -215,22 +214,22 @@ class FullCloudFormationDeployment {
|
|
|
215
214
|
ImportExistingResources: importExistingResources,
|
|
216
215
|
...this.commonPrepareOptions(),
|
|
217
216
|
});
|
|
218
|
-
await this.
|
|
217
|
+
await this.ioHelper.notify((0, messages_1.debug)((0, util_1.format)('Initiated creation of changeset: %s; waiting for it to finish creating...', changeSet.Id)));
|
|
219
218
|
// Fetching all pages if we'll execute, so we can have the correct change count when monitoring.
|
|
220
|
-
return (0, cloudformation_1.waitForChangeSet)(this.cfn,
|
|
219
|
+
return (0, cloudformation_1.waitForChangeSet)(this.cfn, this.ioHelper, this.stackName, changeSetName, {
|
|
221
220
|
fetchAll: willExecute,
|
|
222
221
|
});
|
|
223
222
|
}
|
|
224
223
|
async executeChangeSet(changeSet) {
|
|
225
224
|
var _a;
|
|
226
|
-
await this.
|
|
225
|
+
await this.ioHelper.notify((0, messages_1.debug)((0, util_1.format)('Initiating execution of changeset %s on stack %s', changeSet.ChangeSetId, this.stackName)));
|
|
227
226
|
await this.cfn.executeChangeSet({
|
|
228
227
|
StackName: this.stackName,
|
|
229
228
|
ChangeSetName: changeSet.ChangeSetName,
|
|
230
229
|
ClientRequestToken: `exec${this.uuid}`,
|
|
231
230
|
...this.commonExecuteOptions(),
|
|
232
231
|
});
|
|
233
|
-
await this.
|
|
232
|
+
await this.ioHelper.notify((0, messages_1.debug)((0, util_1.format)('Execution of changeset %s on stack %s has started; waiting for the update to complete...', changeSet.ChangeSetId, this.stackName)));
|
|
234
233
|
// +1 for the extra event emitted from updates.
|
|
235
234
|
const changeSetLength = ((_a = changeSet.Changes) !== null && _a !== void 0 ? _a : []).length + (this.update ? 1 : 0);
|
|
236
235
|
return this.monitorDeployment(changeSet.CreationTime, changeSetLength);
|
|
@@ -239,7 +238,7 @@ class FullCloudFormationDeployment {
|
|
|
239
238
|
if (this.cloudFormationStack.exists) {
|
|
240
239
|
// Delete any existing change sets generated by CDK since change set names must be unique.
|
|
241
240
|
// The delete request is successful as long as the stack exists (even if the change set does not exist).
|
|
242
|
-
await this.
|
|
241
|
+
await this.ioHelper.notify((0, messages_1.debug)(`Removing existing change set with name ${changeSetName} if it exists`));
|
|
243
242
|
await this.cfn.deleteChangeSet({
|
|
244
243
|
StackName: this.stackName,
|
|
245
244
|
ChangeSetName: changeSetName,
|
|
@@ -251,17 +250,17 @@ class FullCloudFormationDeployment {
|
|
|
251
250
|
// Update termination protection only if it has changed.
|
|
252
251
|
const terminationProtection = (_a = this.stackArtifact.terminationProtection) !== null && _a !== void 0 ? _a : false;
|
|
253
252
|
if (!!this.cloudFormationStack.terminationProtection !== terminationProtection) {
|
|
254
|
-
await this.
|
|
253
|
+
await this.ioHelper.notify((0, messages_1.debug)((0, util_1.format)('Updating termination protection from %s to %s for stack %s', this.cloudFormationStack.terminationProtection, terminationProtection, this.stackName)));
|
|
255
254
|
await this.cfn.updateTerminationProtection({
|
|
256
255
|
StackName: this.stackName,
|
|
257
256
|
EnableTerminationProtection: terminationProtection,
|
|
258
257
|
});
|
|
259
|
-
await this.
|
|
258
|
+
await this.ioHelper.notify((0, messages_1.debug)((0, util_1.format)('Termination protection updated to %s for stack %s', terminationProtection, this.stackName)));
|
|
260
259
|
}
|
|
261
260
|
}
|
|
262
261
|
async directDeployment() {
|
|
263
262
|
var _a;
|
|
264
|
-
await this.
|
|
263
|
+
await this.ioHelper.notify((0, messages_1.info)((0, util_1.format)('%s: %s stack...', chalk.bold(this.stackName), this.update ? 'updating' : 'creating')));
|
|
265
264
|
const startTime = new Date();
|
|
266
265
|
if (this.update) {
|
|
267
266
|
await this.updateTerminationProtection();
|
|
@@ -275,7 +274,7 @@ class FullCloudFormationDeployment {
|
|
|
275
274
|
}
|
|
276
275
|
catch (err) {
|
|
277
276
|
if (err.message === 'No updates are to be performed.') {
|
|
278
|
-
await this.
|
|
277
|
+
await this.ioHelper.notify((0, messages_1.debug)((0, util_1.format)('No updates are to be performed for stack %s', this.stackName)));
|
|
279
278
|
return {
|
|
280
279
|
type: 'did-deploy-stack',
|
|
281
280
|
noOp: true,
|
|
@@ -306,14 +305,13 @@ class FullCloudFormationDeployment {
|
|
|
306
305
|
stack: this.stackArtifact,
|
|
307
306
|
stackName: this.stackName,
|
|
308
307
|
resourcesTotal: expectedChanges,
|
|
309
|
-
|
|
310
|
-
action: this.action,
|
|
308
|
+
ioHelper: this.ioHelper,
|
|
311
309
|
changeSetCreationTime: startTime,
|
|
312
310
|
});
|
|
313
311
|
await monitor.start();
|
|
314
312
|
let finalState = this.cloudFormationStack;
|
|
315
313
|
try {
|
|
316
|
-
const successStack = await (0, cloudformation_1.waitForStackDeploy)(this.cfn,
|
|
314
|
+
const successStack = await (0, cloudformation_1.waitForStackDeploy)(this.cfn, this.ioHelper, this.stackName);
|
|
317
315
|
// This shouldn't really happen, but catch it anyway. You never know.
|
|
318
316
|
if (!successStack) {
|
|
319
317
|
throw new error_1.ToolkitError('Stack deploy failed (the stack disappeared while we were deploying it)');
|
|
@@ -321,12 +319,12 @@ class FullCloudFormationDeployment {
|
|
|
321
319
|
finalState = successStack;
|
|
322
320
|
}
|
|
323
321
|
catch (e) {
|
|
324
|
-
throw new error_1.ToolkitError(suffixWithErrors((0,
|
|
322
|
+
throw new error_1.ToolkitError(suffixWithErrors((0, util_2.formatErrorMessage)(e), monitor.errors));
|
|
325
323
|
}
|
|
326
324
|
finally {
|
|
327
325
|
await monitor.stop();
|
|
328
326
|
}
|
|
329
|
-
(0, messages_1.debug)(
|
|
327
|
+
(0, messages_1.debug)((0, util_1.format)('Stack %s has completed updating', this.stackName));
|
|
330
328
|
return {
|
|
331
329
|
type: 'did-deploy-stack',
|
|
332
330
|
noOp: false,
|
|
@@ -362,7 +360,7 @@ class FullCloudFormationDeployment {
|
|
|
362
360
|
};
|
|
363
361
|
}
|
|
364
362
|
}
|
|
365
|
-
async function destroyStack(options,
|
|
363
|
+
async function destroyStack(options, ioHelper) {
|
|
366
364
|
const deployName = options.deployName || options.stack.stackName;
|
|
367
365
|
const cfn = options.sdk.cloudFormation();
|
|
368
366
|
const currentStack = await cloudformation_1.CloudFormationStack.lookup(cfn, deployName);
|
|
@@ -373,19 +371,18 @@ async function destroyStack(options, { ioHost, action }) {
|
|
|
373
371
|
cfn,
|
|
374
372
|
stack: options.stack,
|
|
375
373
|
stackName: deployName,
|
|
376
|
-
|
|
377
|
-
action,
|
|
374
|
+
ioHelper: ioHelper,
|
|
378
375
|
});
|
|
379
376
|
await monitor.start();
|
|
380
377
|
try {
|
|
381
378
|
await cfn.deleteStack({ StackName: deployName, RoleARN: options.roleArn });
|
|
382
|
-
const destroyedStack = await (0, cloudformation_1.waitForStackDelete)(cfn,
|
|
379
|
+
const destroyedStack = await (0, cloudformation_1.waitForStackDelete)(cfn, ioHelper, deployName);
|
|
383
380
|
if (destroyedStack && destroyedStack.stackStatus.name !== 'DELETE_COMPLETE') {
|
|
384
381
|
throw new error_1.ToolkitError(`Failed to destroy ${deployName}: ${destroyedStack.stackStatus}`);
|
|
385
382
|
}
|
|
386
383
|
}
|
|
387
384
|
catch (e) {
|
|
388
|
-
throw new error_1.ToolkitError(suffixWithErrors((0,
|
|
385
|
+
throw new error_1.ToolkitError(suffixWithErrors((0, util_2.formatErrorMessage)(e), monitor.errors));
|
|
389
386
|
}
|
|
390
387
|
finally {
|
|
391
388
|
if (monitor) {
|
|
@@ -402,59 +399,59 @@ async function destroyStack(options, { ioHost, action }) {
|
|
|
402
399
|
* updated, and the deployment will take a long time to in effect not
|
|
403
400
|
* do anything.
|
|
404
401
|
*/
|
|
405
|
-
async function canSkipDeploy(deployStackOptions, cloudFormationStack, parameterChanges,
|
|
402
|
+
async function canSkipDeploy(deployStackOptions, cloudFormationStack, parameterChanges, ioHelper) {
|
|
406
403
|
var _a, _b, _c;
|
|
407
404
|
const deployName = deployStackOptions.deployName || deployStackOptions.stack.stackName;
|
|
408
|
-
await
|
|
405
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: checking if we can skip deploy`));
|
|
409
406
|
// Forced deploy
|
|
410
407
|
if (deployStackOptions.force) {
|
|
411
|
-
await
|
|
408
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: forced deployment`));
|
|
412
409
|
return false;
|
|
413
410
|
}
|
|
414
411
|
// Creating changeset only (default true), never skip
|
|
415
412
|
if (((_a = deployStackOptions.deploymentMethod) === null || _a === void 0 ? void 0 : _a.method) === 'change-set' &&
|
|
416
413
|
deployStackOptions.deploymentMethod.execute === false) {
|
|
417
|
-
await
|
|
414
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: --no-execute, always creating change set`));
|
|
418
415
|
return false;
|
|
419
416
|
}
|
|
420
417
|
// No existing stack
|
|
421
418
|
if (!cloudFormationStack.exists) {
|
|
422
|
-
await
|
|
419
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: no existing stack`));
|
|
423
420
|
return false;
|
|
424
421
|
}
|
|
425
422
|
// Template has changed (assets taken into account here)
|
|
426
423
|
if (JSON.stringify(deployStackOptions.stack.template) !== JSON.stringify(await cloudFormationStack.template())) {
|
|
427
|
-
await
|
|
424
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: template has changed`));
|
|
428
425
|
return false;
|
|
429
426
|
}
|
|
430
427
|
// Tags have changed
|
|
431
428
|
if (!compareTags(cloudFormationStack.tags, (_b = deployStackOptions.tags) !== null && _b !== void 0 ? _b : [])) {
|
|
432
|
-
await
|
|
429
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: tags have changed`));
|
|
433
430
|
return false;
|
|
434
431
|
}
|
|
435
432
|
// Notification arns have changed
|
|
436
433
|
if (!arrayEquals(cloudFormationStack.notificationArns, (_c = deployStackOptions.notificationArns) !== null && _c !== void 0 ? _c : [])) {
|
|
437
|
-
await
|
|
434
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: notification arns have changed`));
|
|
438
435
|
return false;
|
|
439
436
|
}
|
|
440
437
|
// Termination protection has been updated
|
|
441
438
|
if (!!deployStackOptions.stack.terminationProtection !== !!cloudFormationStack.terminationProtection) {
|
|
442
|
-
await
|
|
439
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: termination protection has been updated`));
|
|
443
440
|
return false;
|
|
444
441
|
}
|
|
445
442
|
// Parameters have changed
|
|
446
443
|
if (parameterChanges) {
|
|
447
444
|
if (parameterChanges === 'ssm') {
|
|
448
|
-
await
|
|
445
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: some parameters come from SSM so we have to assume they may have changed`));
|
|
449
446
|
}
|
|
450
447
|
else {
|
|
451
|
-
await
|
|
448
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: parameters have changed`));
|
|
452
449
|
}
|
|
453
450
|
return false;
|
|
454
451
|
}
|
|
455
452
|
// Existing stack is in a failed state
|
|
456
453
|
if (cloudFormationStack.stackStatus.isFailure) {
|
|
457
|
-
await
|
|
454
|
+
await ioHelper.notify((0, messages_1.debug)(`${deployName}: stack is in a failure state`));
|
|
458
455
|
return false;
|
|
459
456
|
}
|
|
460
457
|
// We can skip deploy
|
|
@@ -489,4 +486,4 @@ function hasReplacement(cs) {
|
|
|
489
486
|
return a === 'ReplaceAndDelete' || a === 'ReplaceAndRetain' || a === 'ReplaceAndSnapshot';
|
|
490
487
|
});
|
|
491
488
|
}
|
|
492
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95LXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMk1BLGtDQTZJQztBQXNVRCxvQ0E4QkM7QUE1ckJELCtCQUE4QjtBQVU5QiwrQkFBK0I7QUFDL0IsNkJBQTZCO0FBQzdCLHFFQUFnRTtBQUNoRSx5REFBbUQ7QUFDbkQscUNBQXVEO0FBQ3ZELHFDQUFxRTtBQUNyRSxxREFVMEI7QUFHMUIsK0RBQTZEO0FBQzdELGlEQUF1RDtBQUV2RCwrQ0FBbUQ7QUFDbkQsMERBQTZEO0FBRzdELDBGQUE2RTtBQUM3RSw4Q0FBZ0Y7QUFDaEYsa0RBQXVEO0FBRXZELDZFQUFnRztBQW1LekYsS0FBSyxVQUFVLFdBQVcsQ0FBQyxPQUEyQixFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBZTs7SUFDNUYsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUVwQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7SUFFN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDakUsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLG9DQUFtQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFNUUsSUFBSSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBQSxnQkFBSyxFQUFDLE1BQU0sRUFDOUIsd0JBQXdCLFVBQVUsc0ZBQXNGLENBQ3pILENBQUMsQ0FBQztRQUNILE1BQU0s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Q0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLE1BQWlCO0lBQ3RELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsQ0FBUSxFQUFFLENBQVE7SUFDckMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3BGLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxFQUFrQzs7SUFDeEQsT0FBTyxDQUFDLE1BQUEsRUFBRSxDQUFDLE9BQU8sbUNBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFOztRQUNqQyxNQUFNLENBQUMsR0FBRyxNQUFBLENBQUMsQ0FBQyxjQUFjLDBDQUFFLFlBQVksQ0FBQztRQUN6QyxPQUFPLENBQUMsS0FBSyxrQkFBa0IsSUFBSSxDQUFDLEtBQUssa0JBQWtCLElBQUksQ0FBQyxLQUFLLG9CQUFvQixDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB0eXBlIHtcbiAgQ3JlYXRlQ2hhbmdlU2V0Q29tbWFuZElucHV0LFxuICBDcmVhdGVTdGFja0NvbW1hbmRJbnB1dCxcbiAgRGVzY3JpYmVDaGFuZ2VTZXRDb21tYW5kT3V0cHV0LFxuICBFeGVjdXRlQ2hhbmdlU2V0Q29tbWFuZElucHV0LFxuICBVcGRhdGVTdGFja0NvbW1hbmRJbnB1dCxcbiAgVGFnLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgdXVpZCBmcm9tICd1dWlkJztcbmltcG9ydCB7IEFzc2V0TWFuaWZlc3RCdWlsZGVyIH0gZnJvbSAnLi9hc3NldC1tYW5pZmVzdC1idWlsZGVyJztcbmltcG9ydCB7IHB1Ymxpc2hBc3NldHMgfSBmcm9tICcuL2Fzc2V0LXB1Ymxpc2hpbmcnO1xuaW1wb3J0IHsgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0IH0gZnJvbSAnLi9hc3NldHMnO1xuaW1wb3J0IHsgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgfSBmcm9tICcuL2NoZWNrcyc7XG5pbXBvcnQge1xuICBjaGFuZ2VTZXRIYXNOb0NoYW5nZXMsXG4gIENsb3VkRm9ybWF0aW9uU3RhY2ssXG4gIFRlbXBsYXRlUGFyYW1ldGVycyxcbiAgd2FpdEZvckNoYW5nZVNldCxcbiAgd2FpdEZvclN0YWNrRGVwbG95LFxuICB3YWl0Rm9yU3RhY2tEZWxldGUsXG4gIFBhcmFtZXRlclZhbHVlcyxcbiAgUGFyYW1ldGVyQ2hhbmdlcyxcbiAgUmVzb3VyY2VzVG9JbXBvcnQsXG59IGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgQ2hhbmdlU2V0RGVwbG95bWVudE1ldGhvZCwgRGVwbG95bWVudE1ldGhvZCB9IGZyb20gJy4vZGVwbG95bWVudC1tZXRob2QnO1xuaW1wb3J0IHsgRGVwbG95U3RhY2tSZXN1bHQsIFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB9IGZyb20gJy4vZGVwbG95bWVudC1yZXN1bHQnO1xuaW1wb3J0IHsgdHJ5SG90c3dhcERlcGxveW1lbnQgfSBmcm9tICcuL2hvdHN3YXAtZGVwbG95bWVudHMnO1xuaW1wb3J0IHsgZGVidWcsIGluZm8sIHdhcm4gfSBmcm9tICcuLi8uLi9jbGkvbWVzc2FnZXMnO1xuaW1wb3J0IHsgSUlvSG9zdCwgSW9NZXNzYWdpbmcsIFRvb2xraXRBY3Rpb24gfSBmcm9tICcuLi8uLi90b29sa2l0L2NsaS1pby1ob3N0JztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvZXJyb3InO1xuaW1wb3J0IHsgZm9ybWF0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdXRpbC9mb3JtYXQtZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBTREssIFNka1Byb3ZpZGVyLCBJQ2xvdWRGb3JtYXRpb25DbGllbnQgfSBmcm9tICcuLi9hd3MtYXV0aCc7XG5pbXBvcnQgdHlwZSB7IEVudmlyb25tZW50UmVzb3VyY2VzIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbiB9IGZyb20gJy4uL2V2YWx1YXRlLWNsb3VkZm9ybWF0aW9uLXRlbXBsYXRlJztcbmltcG9ydCB7IEhvdHN3YXBNb2RlLCBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsIElDT04gfSBmcm9tICcuLi9ob3Rzd2FwL2NvbW1vbic7XG5pbXBvcnQgeyBTdGFja0FjdGl2aXR5TW9uaXRvciB9IGZyb20gJy4uL3N0YWNrLWV2ZW50cyc7XG5pbXBvcnQgeyBTdHJpbmdXaXRob3V0UGxhY2Vob2xkZXJzIH0gZnJvbSAnLi4vdXRpbC9wbGFjZWhvbGRlcnMnO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZUJvZHlQYXJhbWV0ZXIsIG1ha2VCb2R5UGFyYW1ldGVyIH0gZnJvbSAnLi4vdXRpbC90ZW1wbGF0ZS1ib2R5LXBhcmFtZXRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95U3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBiZSBkZXBsb3llZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IHRvIGRlcGxveSB0aGlzIHN0YWNrIGluXG4gICAqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBvbiB0aGUgc3RhY2sgYXJ0aWZhY3QgbWF5IGJlIHVucmVzb2x2ZWQsIHRoaXMgb25lXG4gICAqIG11c3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZEVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogVGhlIFNESyB0byB1c2UgZm9yIGRlcGxveWluZyB0aGUgc3RhY2tcbiAgICpcbiAgICogU2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSBjb3JyZWN0IHJvbGUgd2l0aCB3aGljaFxuICAgKiBzdGFjayBvcGVyYXRpb25zIHNob3VsZCBiZSBwZXJmb3JtZWQuXG4gICAqL1xuICByZWFkb25seSBzZGs6IFNESztcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIChzZWVkZWQgd2l0aCBkZWZhdWx0IGNyZWRlbnRpYWxzKVxuICAgKlxuICAgKiBXaWxsIGJlIHVzZWQgdG86XG4gICAqXG4gICAqIC0gUHVibGlzaCBhc3NldHMsIGVpdGhlciBsZWdhY3kgYXNzZXRzIG9yIGxhcmdlIENGTiB0ZW1wbGF0ZXNcbiAgICogICB0aGF0IGFyZW4ndCB0aGVtc2VsdmVzIGFzc2V0cyBmcm9tIGEgbWFuaWZlc3QuIChOZWVkcyBhbiBTREtcbiAgICogICBQcm92aWRlciBiZWNhdXNlIHRoZSBmaWxlIHB1Ymxpc2hpbmcgcm9sZSBpcyBkZWNsYXJlZCBhcyBwYXJ0XG4gICAqICAgb2YgdGhlIGFzc2V0KS5cbiAgICogLSBIb3Rzd2FwXG4gICAqL1xuICByZWFkb25seSBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBib290c3RyYXAgc3RhY2sgZm91bmQgaW4gdGhlIHRhcmdldCBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgZW52UmVzb3VyY2VzOiBFbnZpcm9ubWVudFJlc291cmNlcztcblxuICAvKipcbiAgICogUm9sZSB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIHRvIGV4ZWN1dGUgdGhlIGNoYW5nZSBzZXRcbiAgICpcbiAgICogVG8gb2J0YWluIGEgYFN0cmluZ1dpdGhvdXRQbGFjZWhvbGRlcnNgLCBydW4gYSByZWd1bGFyXG4gICAqIHN0cmluZyB0aG91Z2ggYFRhcmdldEVudmlyb25tZW50LnJlcGxhY2VQbGFjZWhvbGRlcnNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGV4ZWN1dGlvbiByb2xlOyBDbG91ZEZvcm1hdGlvbiBlaXRoZXIgdXNlcyB0aGUgcm9sZSBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoXG4gICAqIHRoZSBzdGFjaywgb3Igb3RoZXJ3aXNlIHVzZXMgY3VycmVudCBBV1MgY3JlZGVudGlhbHMuXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogU3RyaW5nV2l0aG91dFBsYWNlaG9sZGVycztcblxuICAvKipcbiAgICogTm90aWZpY2F0aW9uIEFSTnMgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiB0byBub3RpZnkgd2hlbiB0aGUgY2hhbmdlIHNldCBoYXMgY29tcGxldGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uQXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYW1lIHRvIGRlcGxveSB0aGUgc3RhY2sgdW5kZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOYW1lIGZyb20gYXNzZW1ibHlcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXNzZXQgSURzIHdoaWNoIHNob3VsZG4ndCBiZSBidWlsdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEJ1aWxkIGFsbCBhc3NldHNcbiAgICovXG4gIHJlYWRvbmx5IHJldXNlQXNzZXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRhZ3MgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiB0byBhZGQgdG8gc3RhY2tcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogVGFnW107XG5cbiAgLyoqXG4gICAqIFdoYXQgZGVwbG95bWVudCBtZXRob2QgdG8gdXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ2hhbmdlIHNldCB3aXRoIGRlZmF1bHRzXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50TWV0aG9kPzogRGVwbG95bWVudE1ldGhvZDtcblxuICAvKipcbiAgICogVGhlIGNvbGxlY3Rpb24gb2YgZXh0cmEgcGFyYW1ldGVyc1xuICAgKiAoaW4gYWRkaXRpb24gdG8gdGhvc2UgdXNlZCBmb3IgYXNzZXRzKVxuICAgKiB0byBwYXNzIHRvIHRoZSBkZXBsb3llZCB0ZW1wbGF0ZS5cbiAgICogTm90ZSB0aGF0IHBhcmFtZXRlcnMgd2l0aCBgdW5kZWZpbmVkYCBvciBlbXB0eSB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkLFxuICAgKiBhbmQgbm90IHBhc3NlZCB0byB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVycz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gIC8qKlxuICAgKiBVc2UgcHJldmlvdXMgdmFsdWVzIGZvciB1bnNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIElmIG5vdCBzZXQsIGFsbCBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIGZvciBldmVyeSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVwbG95IGV2ZW4gaWYgdGhlIGRlcGxveWVkIHRlbXBsYXRlIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHdlIGFyZSBhYm91dCB0byBkZXBsb3kuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGZhaWxlZCBkZXBsb3ltZW50c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByb2xsYmFjaz86IGJvb2xlYW47XG5cbiAgLypcbiAgICogV2hldGhlciB0byBwZXJmb3JtIGEgJ2hvdHN3YXAnIGRlcGxveW1lbnQuXG4gICAqIEEgJ2hvdHN3YXAnIGRlcGxveW1lbnQgd2lsbCBhdHRlbXB0IHRvIHNob3J0LWNpcmN1aXQgQ2xvdWRGb3JtYXRpb25cbiAgICogYW5kIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgcmVzb3VyY2VzIGxpa2UgTGFtYmRhIGZ1bmN0aW9ucyBkaXJlY3RseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgSG90c3dhcE1vZGUuRlVMTF9ERVBMT1lNRU5UYCBmb3IgcmVndWxhciBkZXBsb3ltZW50cywgYEhvdHN3YXBNb2RlLkhPVFNXQVBfT05MWWAgZm9yICd3YXRjaCcgZGVwbG95bWVudHNcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXA/OiBIb3Rzd2FwTW9kZTtcblxuICAvKipcbiAgICogRXh0cmEgcHJvcGVydGllcyB0aGF0IGNvbmZpZ3VyZSBob3Rzd2FwIGJlaGF2aW9yXG4gICAqL1xuICByZWFkb25seSBob3Rzd2FwUHJvcGVydHlPdmVycmlkZXM/OiBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBleHRyYSBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSBVc2VyLUFnZW50IGhlYWRlciB3aGVuIHBlcmZvcm1pbmcgQVdTIFNESyBjYWxscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub3RoaW5nIGV4dHJhIGlzIGFwcGVuZGVkIHRvIHRoZSBVc2VyLUFnZW50IGhlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFVc2VyQWdlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHNldCwgY2hhbmdlIHNldCBvZiB0eXBlIElNUE9SVCB3aWxsIGJlIGNyZWF0ZWQsIGFuZCByZXNvdXJjZXNUb0ltcG9ydFxuICAgKiBwYXNzZWQgdG8gaXQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZXNUb0ltcG9ydD86IFJlc291cmNlc1RvSW1wb3J0O1xuXG4gIC8qKlxuICAgKiBJZiBwcmVzZW50LCB1c2UgdGhpcyBnaXZlbiB0ZW1wbGF0ZSBpbnN0ZWFkIG9mIHRoZSBzdG9yZWQgb25lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVXNlIHRoZSBzdG9yZWQgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlVGVtcGxhdGU/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYnVpbGQvcHVibGlzaCBhc3NldHMgaW4gcGFyYWxsZWxcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZSBUbyByZW1haW4gYmFja3dhcmQgY29tcGF0aWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0UGFyYWxsZWxpc20/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVwbG95U3RhY2sob3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zLCB7IGlvSG9zdCwgYWN0aW9uIH06IElvTWVzc2FnaW5nKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICBjb25zdCBzdGFja0FydGlmYWN0ID0gb3B0aW9ucy5zdGFjaztcblxuICBjb25zdCBzdGFja0VudiA9IG9wdGlvbnMucmVzb2x2ZWRFbnZpcm9ubWVudDtcblxuICBvcHRpb25zLnNkay5hcHBlbmRDdXN0b21Vc2VyQWdlbnQob3B0aW9ucy5leHRyYVVzZXJBZ2VudCk7XG4gIGNvbnN0IGNmbiA9IG9wdGlvbnMuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gIGNvbnN0IGRlcGxveU5hbWUgPSBvcHRpb25zLmRlcGxveU5hbWUgfHwgc3RhY2tBcnRpZmFjdC5zdGFja05hbWU7XG4gIGxldCBjbG91ZEZvcm1hdGlvblN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoY2ZuLCBkZXBsb3lOYW1lKTtcblxuICBpZiAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5pc0NyZWF0aW9uRmFpbHVyZSkge1xuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoYWN0aW9uLFxuICAgICAgYEZvdW5kIGV4aXN0aW5nIHN0YWNrICR7ZGVwbG95TmFtZX0gdGhhdCBoYWQgcHJldmlvdXNseSBmYWlsZWQgY3JlYXRpb24uIERlbGV0aW5nIGl0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlLWNyZWF0ZSBpdC5gLFxuICAgICkpO1xuICAgIGF3YWl0IGNmbi5kZWxldGVTdGFjayh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSB9KTtcbiAgICBjb25zdCBkZWxldGVkU3RhY2sgPSBhd2FpdCB3YWl0Rm9yU3RhY2tEZWxldGUoY2ZuLCB7IGlvSG9zdCwgYWN0aW9uIH0sIGRlcGxveU5hbWUpO1xuICAgIGlmIChkZWxldGVkU3RhY2sgJiYgZGVsZXRlZFN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgIT09ICdERUxFVEVfQ09NUExFVEUnKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICBgRmFpbGVkIGRlbGV0aW5nIHN0YWNrICR7ZGVwbG95TmFtZX0gdGhhdCBoYWQgcHJldmlvdXNseSBmYWlsZWQgY3JlYXRpb24gKGN1cnJlbnQgc3RhdGU6ICR7ZGVsZXRlZFN0YWNrLnN0YWNrU3RhdHVzfSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVXBkYXRlIHZhcmlhYmxlIHRvIG1hcmsgdGhhdCB0aGUgc3RhY2sgZG9lcyBub3QgZXhpc3QgYW55bW9yZSwgYnV0IGF2b2lkXG4gICAgLy8gZG9pbmcgYW4gYWN0dWFsIGxvb2t1cCBpbiBDbG91ZEZvcm1hdGlvbiAod2hpY2ggd291bGQgYmUgc2lsbHkgdG8gZG8gaWZcbiAgICAvLyB3ZSBqdXN0IGRlbGV0ZWQgaXQpLlxuICAgIGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBDbG91ZEZvcm1hdGlvblN0YWNrLmRvZXNOb3RFeGlzdChjZm4sIGRlcGxveU5hbWUpO1xuICB9XG5cbiAgLy8gRGV0ZWN0IFwibGVnYWN5XCIgYXNzZXRzICh3aGljaCByZW1haW4gaW4gdGhlIG1ldGFkYXRhKSBhbmQgcHVibGlzaCB0aGVtIHZpYVxuICAvLyBhbiBhZC1ob2MgYXNzZXQgbWFuaWZlc3QsIHdoaWxlIHBhc3NpbmcgdGhlaXIgbG9jYXRpb25zIHZpYSB0ZW1wbGF0ZVxuICAvLyBwYXJhbWV0ZXJzLlxuICBjb25zdCBsZWdhY3lBc3NldHMgPSBuZXcgQXNzZXRNYW5pZmVzdEJ1aWxkZXIoKTtcbiAgY29uc3QgYXNzZXRQYXJhbXMgPSBhd2FpdCBhZGRNZXRhZGF0YUFzc2V0c1RvTWFuaWZlc3QoXG4gICAgeyBpb0hvc3QsIGFjdGlvbiB9LFxuICAgIHN0YWNrQXJ0aWZhY3QsXG4gICAgbGVnYWN5QXNzZXRzLFxuICAgIG9wdGlvbnMuZW52UmVzb3VyY2VzLFxuICAgIG9wdGlvbnMucmV1c2VBc3NldHMsXG4gICk7XG5cbiAgY29uc3QgZmluYWxQYXJhbWV0ZXJWYWx1ZXMgPSB7IC4uLm9wdGlvbnMucGFyYW1ldGVycywgLi4uYXNzZXRQYXJhbXMgfTtcblxuICBjb25zdCB0ZW1wbGF0ZVBhcmFtcyA9IFRlbXBsYXRlUGFyYW1ldGVycy5mcm9tVGVtcGxhdGUoc3RhY2tBcnRpZmFjdC50ZW1wbGF0ZSk7XG4gIGNvbnN0IHN0YWNrUGFyYW1zID0gb3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnNcbiAgICA/IHRlbXBsYXRlUGFyYW1zLnVwZGF0ZUV4aXN0aW5nKGZpbmFsUGFyYW1ldGVyVmFsdWVzLCBjbG91ZEZvcm1hdGlvblN0YWNrLnBhcmFtZXRlcnMpXG4gICAgOiB0ZW1wbGF0ZVBhcmFtcy5zdXBwbHlBbGwoZmluYWxQYXJhbWV0ZXJWYWx1ZXMpO1xuXG4gIGNvbnN0IGhvdHN3YXBNb2RlID0gb3B0aW9ucy5ob3Rzd2FwID8/IEhvdHN3YXBNb2RlLkZVTExfREVQTE9ZTUVOVDtcbiAgY29uc3QgaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzID0gb3B0aW9ucy5ob3Rzd2FwUHJvcGVydHlPdmVycmlkZXMgPz8gbmV3IEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcygpO1xuXG4gIGlmIChhd2FpdCBjYW5Ta2lwRGVwbG95KG9wdGlvbnMsIGNsb3VkRm9ybWF0aW9uU3RhY2ssIHN0YWNrUGFyYW1zLmhhc0NoYW5nZXMoY2xvdWRGb3JtYXRpb25TdGFjay5wYXJhbWV0ZXJzKSwgeyBpb0hvc3QsIGFjdGlvbiB9KSkge1xuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoYWN0aW9uLCBgJHtkZXBsb3lOYW1lfTogc2tpcHBpbmcgZGVwbG95bWVudCAodXNlIC0tZm9yY2UgdG8gb3ZlcnJpZGUpYCkpO1xuICAgIC8vIGlmIHdlIGNhbiBza2lwIGRlcGxveW1lbnQgYW5kIHdlIGFyZSBwZXJmb3JtaW5nIGEgaG90c3dhcCwgbGV0IHRoZSB1c2VyIGtub3dcbiAgICAvLyB0aGF0IG5vIGhvdHN3YXAgZGVwbG95bWVudCBoYXBwZW5lZFxuICAgIGlmIChob3Rzd2FwTW9kZSAhPT0gSG90c3dhcE1vZGUuRlVMTF9ERVBMT1lNRU5UKSB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYWN0aW9uLFxuICAgICAgICBmb3JtYXQoXG4gICAgICAgICAgYFxcbiAke0lDT059ICVzXFxuYCxcbiAgICAgICAgICBjaGFsay5ib2xkKCdob3Rzd2FwIGRlcGxveW1lbnQgc2tpcHBlZCAtIG5vIGNoYW5nZXMgd2VyZSBkZXRlY3RlZCAodXNlIC0tZm9yY2UgdG8gb3ZlcnJpZGUpJyksXG4gICAgICAgICksXG4gICAgICApKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdkaWQtZGVwbG95LXN0YWNrJyxcbiAgICAgIG5vT3A6IHRydWUsXG4gICAgICBvdXRwdXRzOiBjbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShkZWJ1ZyhhY3Rpb24sIGAke2RlcGxveU5hbWV9OiBkZXBsb3lpbmcuLi5gKSk7XG4gIH1cblxuICBjb25zdCBib2R5UGFyYW1ldGVyID0gYXdhaXQgbWFrZUJvZHlQYXJhbWV0ZXIoXG4gICAgc3RhY2tBcnRpZmFjdCxcbiAgICBvcHRpb25zLnJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgbGVnYWN5QXNzZXRzLFxuICAgIG9wdGlvbnMuZW52UmVzb3VyY2VzLFxuICAgIG9wdGlvbnMub3ZlcnJpZGVUZW1wbGF0ZSxcbiAgKTtcbiAgbGV0IGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGJvb3RzdHJhcFN0YWNrTmFtZSA9IChhd2FpdCBvcHRpb25zLmVudlJlc291cmNlcy5sb29rdXBUb29sa2l0KCkpLnN0YWNrTmFtZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoYWN0aW9uLCBgQ291bGQgbm90IGRldGVybWluZSB0aGUgYm9vdHN0cmFwIHN0YWNrIG5hbWU6ICR7ZX1gKSk7XG4gIH1cbiAgYXdhaXQgcHVibGlzaEFzc2V0cyhsZWdhY3lBc3NldHMudG9NYW5pZmVzdChzdGFja0FydGlmYWN0LmFzc2VtYmx5LmRpcmVjdG9yeSksIG9wdGlvbnMuc2RrUHJvdmlkZXIsIHN0YWNrRW52LCB7XG4gICAgcGFyYWxsZWw6IG9wdGlvbnMuYXNzZXRQYXJhbGxlbGlzbSxcbiAgICBhbGxvd0Nyb3NzQWNjb3VudDogYXdhaXQgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcob3B0aW9ucy5zZGssIHsgaW9Ib3N0LCBhY3Rpb24gfSwgYm9vdHN0cmFwU3RhY2tOYW1lKSxcbiAgfSwgeyBpb0hvc3QsIGFjdGlvbiB9KTtcblxuICBpZiAoaG90c3dhcE1vZGUgIT09IEhvdHN3YXBNb2RlLkZVTExfREVQTE9ZTUVOVCkge1xuICAgIC8vIGF0dGVtcHQgdG8gc2hvcnQtY2lyY3VpdCB0aGUgZGVwbG95bWVudCBpZiBwb3NzaWJsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBob3Rzd2FwRGVwbG95bWVudFJlc3VsdCA9IGF3YWl0IHRyeUhvdHN3YXBEZXBsb3ltZW50KFxuICAgICAgICBvcHRpb25zLnNka1Byb3ZpZGVyLFxuICAgICAgICB7IGlvSG9zdCwgYWN0aW9uIH0sXG4gICAgICAgIHN0YWNrUGFyYW1zLnZhbHVlcyxcbiAgICAgICAgY2xvdWRGb3JtYXRpb25TdGFjayxcbiAgICAgICAgc3RhY2tBcnRpZmFjdCxcbiAgICAgICAgaG90c3dhcE1vZGUsIGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyxcbiAgICAgICk7XG4gICAgICBpZiAoaG90c3dhcERlcGxveW1lbnRSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGhvdHN3YXBEZXBsb3ltZW50UmVzdWx0O1xuICAgICAgfVxuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGFjdGlvbiwgZm9ybWF0KFxuICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gYSBob3Rzd2FwIGRlcGxveW1lbnQsIGFzIHRoZSBzdGFjayAlcyBjb250YWlucyBub24tQXNzZXQgY2hhbmdlcycsXG4gICAgICAgIHN0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWUsXG4gICAgICApKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENmbkV2YWx1YXRpb25FeGNlcHRpb24pKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGluZm8oYWN0aW9uLCBmb3JtYXQoXG4gICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSBhIGhvdHN3YXAgZGVwbG95bWVudCwgYmVjYXVzZSB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgY291bGQgbm90IGJlIHJlc29sdmVkOiAlcycsXG4gICAgICAgIGZvcm1hdEVycm9yTWVzc2FnZShlKSxcbiAgICAgICkpKTtcbiAgICB9XG5cbiAgICBpZiAoaG90c3dhcE1vZGUgPT09IEhvdHN3YXBNb2RlLkZBTExfQkFDSykge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShpbmZvKGFjdGlvbiwgJ0ZhbGxpbmcgYmFjayB0byBkb2luZyBhIGZ1bGwgZGVwbG95bWVudCcpKTtcbiAgICAgIG9wdGlvbnMuc2RrLmFwcGVuZEN1c3RvbVVzZXJBZ2VudCgnY2RrLWhvdHN3YXAvZmFsbGJhY2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2RpZC1kZXBsb3ktc3RhY2snLFxuICAgICAgICBub09wOiB0cnVlLFxuICAgICAgICBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLFxuICAgICAgICBvdXRwdXRzOiBjbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvdWxkIG5vdCBzaG9ydC1jaXJjdWl0IHRoZSBkZXBsb3ltZW50LCBwZXJmb3JtIGEgZnVsbCBDRk4gZGVwbG95IGluc3RlYWRcbiAgY29uc3QgZnVsbERlcGxveW1lbnQgPSBuZXcgRnVsbENsb3VkRm9ybWF0aW9uRGVwbG95bWVudChcbiAgICBvcHRpb25zLFxuICAgIGNsb3VkRm9ybWF0aW9uU3RhY2ssXG4gICAgc3RhY2tBcnRpZmFjdCxcbiAgICBzdGFja1BhcmFtcyxcbiAgICBib2R5UGFyYW1ldGVyLFxuICAgIGlvSG9zdCxcbiAgICBhY3Rpb24sXG4gICk7XG4gIHJldHVybiBmdWxsRGVwbG95bWVudC5wZXJmb3JtRGVwbG95bWVudCgpO1xufVxuXG50eXBlIENvbW1vblByZXBhcmVPcHRpb25zID0ga2V5b2YgQ3JlYXRlU3RhY2tDb21tYW5kSW5wdXQgJlxua2V5b2YgVXBkYXRlU3RhY2tDb21tYW5kSW5wdXQgJlxua2V5b2YgQ3JlYXRlQ2hhbmdlU2V0Q29tbWFuZElucHV0O1xudHlwZSBDb21tb25FeGVjdXRlT3B0aW9ucyA9IGtleW9mIENyZWF0ZVN0YWNrQ29tbWFuZElucHV0ICZcbmtleW9mIFVwZGF0ZVN0YWNrQ29tbWFuZElucHV0ICZcbmtleW9mIEV4ZWN1dGVDaGFuZ2VTZXRDb21tYW5kSW5wdXQ7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBzaGFyZXMgc3RhdGUgYW5kIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiB0aGUgZGlmZmVyZW50IGZ1bGwgZGVwbG95bWVudCBtb2Rlc1xuICovXG5jbGFzcyBGdWxsQ2xvdWRGb3JtYXRpb25EZXBsb3ltZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjZm46IElDbG91ZEZvcm1hdGlvbkNsaWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1cGRhdGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyYjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHV1aWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERlcGxveVN0YWNrT3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uU3RhY2s6IENsb3VkRm9ybWF0aW9uU3RhY2ssXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFja1BhcmFtczogUGFyYW1ldGVyVmFsdWVzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYm9keVBhcmFtZXRlcjogVGVtcGxhdGVCb2R5UGFyYW1ldGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW9Ib3N0OiBJSW9Ib3N0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uOiBUb29sa2l0QWN0aW9uLFxuICApIHtcbiAgICB0aGlzLmNmbiA9IG9wdGlvbnMuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgdGhpcy5zdGFja05hbWUgPSBvcHRpb25zLmRlcGxveU5hbWUgPz8gc3RhY2tBcnRpZmFjdC5zdGFja05hbWU7XG5cbiAgICB0aGlzLnVwZGF0ZSA9IGNsb3VkRm9ybWF0aW9uU3RhY2suZXhpc3RzICYmIGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMubmFtZSAhPT0gJ1JFVklFV19JTl9QUk9HUkVTUyc7XG4gICAgdGhpcy52ZXJiID0gdGhpcy51cGRhdGUgPyAndXBkYXRlJyA6ICdjcmVhdGUnO1xuICAgIHRoaXMudXVpZCA9IHV1aWQudjQoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtRGVwbG95bWVudCgpOiBQcm9taXNlPERlcGxveVN0YWNrUmVzdWx0PiB7XG4gICAgY29uc3QgZGVwbG95bWVudE1ldGhvZCA9IHRoaXMub3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kID8/IHtcbiAgICAgIG1ldGhvZDogJ2NoYW5nZS1zZXQnLFxuICAgIH07XG5cbiAgICBpZiAoZGVwbG95bWVudE1ldGhvZC5tZXRob2QgPT09ICdkaXJlY3QnICYmIHRoaXMub3B0aW9ucy5yZXNvdXJjZXNUb0ltcG9ydCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignSW1wb3J0aW5nIHJlc291cmNlcyByZXF1aXJlcyBhIGNoYW5nZXNldCBkZXBsb3ltZW50Jyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChkZXBsb3ltZW50TWV0aG9kLm1ldGhvZCkge1xuICAgICAgY2FzZSAnY2hhbmdlLXNldCc6XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZVNldERlcGxveW1lbnQoZGVwbG95bWVudE1ldGhvZCk7XG5cbiAgICAgIGNhc2UgJ2RpcmVjdCc6XG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdERlcGxveW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoYW5nZVNldERlcGxveW1lbnQoZGVwbG95bWVudE1ldGhvZDogQ2hhbmdlU2V0RGVwbG95bWVudE1ldGhvZCk6IFByb21pc2U8RGVwbG95U3RhY2tSZXN1bHQ+IHtcbiAgICBjb25zdCBjaGFuZ2VTZXROYW1lID0gZGVwbG95bWVudE1ldGhvZC5jaGFuZ2VTZXROYW1lID8/ICdjZGstZGVwbG95LWNoYW5nZS1zZXQnO1xuICAgIGNvbnN0IGV4ZWN1dGUgPSBkZXBsb3ltZW50TWV0aG9kLmV4ZWN1dGUgPz8gdHJ1ZTtcbiAgICBjb25zdCBpbXBvcnRFeGlzdGluZ1Jlc291cmNlcyA9IGRlcGxveW1lbnRNZXRob2QuaW1wb3J0RXhpc3RpbmdSZXNvdXJjZXMgPz8gZmFsc2U7XG4gICAgY29uc3QgY2hhbmdlU2V0RGVzY3JpcHRpb24gPSBhd2FpdCB0aGlzLmNyZWF0ZUNoYW5nZVNldChjaGFuZ2VTZXROYW1lLCBleGVjdXRlLCBpbXBvcnRFeGlzdGluZ1Jlc291cmNlcyk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVUZXJtaW5hdGlvblByb3RlY3Rpb24oKTtcblxuICAgIGlmIChjaGFuZ2VTZXRIYXNOb0NoYW5nZXMoY2hhbmdlU2V0RGVzY3JpcHRpb24pKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGZvcm1hdCgnTm8gY2hhbmdlcyBhcmUgdG8gYmUgcGVyZm9ybWVkIG9uICVzLicsIHRoaXMuc3RhY2tOYW1lKSkpO1xuICAgICAgaWYgKGV4ZWN1dGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBmb3JtYXQoJ0RlbGV0aW5nIGVtcHR5IGNoYW5nZSBzZXQgJXMnLCBjaGFuZ2VTZXREZXNjcmlwdGlvbi5DaGFuZ2VTZXRJZCkpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jZm4uZGVsZXRlQ2hhbmdlU2V0KHtcbiAgICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICAgIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZvcmNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeSh3YXJuKFxuICAgICAgICAgIHRoaXMuYWN0aW9uLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdZb3UgdXNlZCB0aGUgLS1mb3JjZSBmbGFnLCBidXQgQ2xvdWRGb3JtYXRpb24gcmVwb3J0ZWQgdGhhdCB0aGUgZGVwbG95bWVudCB3b3VsZCBub3QgbWFrZSBhbnkgY2hhbmdlcy4nLFxuICAgICAgICAgICAgJ0FjY29yZGluZyB0byBDbG91ZEZvcm1hdGlvbiwgYWxsIHJlc291cmNlcyBhcmUgYWxyZWFkeSB1cC10by1kYXRlIHdpdGggdGhlIHN0YXRlIGluIHlvdXIgQ0RLIGFwcC4nLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAnWW91IGNhbm5vdCB1c2UgdGhlIC0tZm9yY2UgZmxhZyB0byBnZXQgcmlkIG9mIGNoYW5nZXMgeW91IG1hZGUgaW4gdGhlIGNvbnNvbGUuIFRyeSB1c2luZycsXG4gICAgICAgICAgICAnQ2xvdWRGb3JtYXRpb24gZHJpZnQgZGV0ZWN0aW9uIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL3VzaW5nLWNmbi1zdGFjay1kcmlmdC5odG1sJyxcbiAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICApKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2RpZC1kZXBsb3ktc3RhY2snLFxuICAgICAgICBub09wOiB0cnVlLFxuICAgICAgICBvdXRwdXRzOiB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2sub3V0cHV0cyxcbiAgICAgICAgc3RhY2tBcm46IGNoYW5nZVNldERlc2NyaXB0aW9uLlN0YWNrSWQhLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWV4ZWN1dGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShpbmZvKHRoaXMuYWN0aW9uLCBmb3JtYXQoXG4gICAgICAgICdDaGFuZ2VzZXQgJXMgY3JlYXRlZCBhbmQgd2FpdGluZyBpbiByZXZpZXcgZm9yIG1hbnVhbCBleGVjdXRpb24gKC0tbm8tZXhlY3V0ZSknLFxuICAgICAgICBjaGFuZ2VTZXREZXNjcmlwdGlvbi5DaGFuZ2VTZXRJZCxcbiAgICAgICkpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdkaWQtZGVwbG95LXN0YWNrJyxcbiAgICAgICAgbm9PcDogZmFsc2UsXG4gICAgICAgIG91dHB1dHM6IHRoaXMuY2xvdWRGb3JtYXRpb25TdGFjay5vdXRwdXRzLFxuICAgICAgICBzdGFja0FybjogY2hhbmdlU2V0RGVzY3JpcHRpb24uU3RhY2tJZCEsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSByZXBsYWNlbWVudHMgaW4gdGhlIGNoYW5nZXNldCwgY2hlY2sgdGhlIHJvbGxiYWNrIGZsYWcgYW5kIHN0YWNrIHN0YXR1c1xuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gaGFzUmVwbGFjZW1lbnQoY2hhbmdlU2V0RGVzY3JpcHRpb24pO1xuICAgIGNvbnN0IGlzUGF1c2VkRmFpbFN0YXRlID0gdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLmlzUm9sbGJhY2thYmxlO1xuICAgIGNvbnN0IHJvbGxiYWNrID0gdGhpcy5vcHRpb25zLnJvbGxiYWNrID8/IHRydWU7XG4gICAgaWYgKGlzUGF1c2VkRmFpbFN0YXRlICYmIHJlcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbHBhdXNlZC1uZWVkLXJvbGxiYWNrLWZpcnN0JywgcmVhc29uOiAncmVwbGFjZW1lbnQnLCBzdGF0dXM6IHRoaXMuY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5uYW1lIH07XG4gICAgfVxuICAgIGlmIChpc1BhdXNlZEZhaWxTdGF0ZSAmJiByb2xsYmFjaykge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxwYXVzZWQtbmVlZC1yb2xsYmFjay1maXJzdCcsIHJlYXNvbjogJ25vdC1ub3JvbGxiYWNrJywgc3RhdHVzOiB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMubmFtZSB9O1xuICAgIH1cbiAgICBpZiAoIXJvbGxiYWNrICYmIHJlcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAncmVwbGFjZW1lbnQtcmVxdWlyZXMtcm9sbGJhY2snIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUNoYW5nZVNldChjaGFuZ2VTZXREZXNjcmlwdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNoYW5nZVNldChjaGFuZ2VTZXROYW1lOiBzdHJpbmcsIHdpbGxFeGVjdXRlOiBib29sZWFuLCBpbXBvcnRFeGlzdGluZ1Jlc291cmNlczogYm9vbGVhbikge1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cE9sZENoYW5nZXNldChjaGFuZ2VTZXROYW1lKTtcblxuICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYEF0dGVtcHRpbmcgdG8gY3JlYXRlIENoYW5nZVNldCB3aXRoIG5hbWUgJHtjaGFuZ2VTZXROYW1lfSB0byAke3RoaXMudmVyYn0gc3RhY2sgJHt0aGlzLnN0YWNrTmFtZX1gKSk7XG4gICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGluZm8odGhpcy5hY3Rpb24sIGZvcm1hdCgnJXM6IGNyZWF0aW5nIENsb3VkRm9ybWF0aW9uIGNoYW5nZXNldC4uLicsIGNoYWxrLmJvbGQodGhpcy5zdGFja05hbWUpKSkpO1xuICAgIGNvbnN0IGNoYW5nZVNldCA9IGF3YWl0IHRoaXMuY2ZuLmNyZWF0ZUNoYW5nZVNldCh7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSxcbiAgICAgIENoYW5nZVNldFR5cGU6IHRoaXMub3B0aW9ucy5yZXNvdXJjZXNUb0ltcG9ydCA/ICdJTVBPUlQnIDogdGhpcy51cGRhdGUgPyAnVVBEQVRFJyA6ICdDUkVBVEUnLFxuICAgICAgUmVzb3VyY2VzVG9JbXBvcnQ6IHRoaXMub3B0aW9ucy5yZXNvdXJjZXNUb0ltcG9ydCxcbiAgICAgIERlc2NyaXB0aW9uOiBgQ0RLIENoYW5nZXNldCBmb3IgZXhlY3V0aW9uICR7dGhpcy51dWlkfWAsXG4gICAgICBDbGllbnRUb2tlbjogYGNyZWF0ZSR7dGhpcy51dWlkfWAsXG4gICAgICBJbXBvcnRFeGlzdGluZ1Jlc291cmNlczogaW1wb3J0RXhpc3RpbmdSZXNvdXJjZXMsXG4gICAgICAuLi50aGlzLmNvbW1vblByZXBhcmVPcHRpb25zKCksXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGZvcm1hdCgnSW5pdGlhdGVkIGNyZWF0aW9uIG9mIGNoYW5nZXNldDogJXM7IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaCBjcmVhdGluZy4uLicsIGNoYW5nZVNldC5JZCkpKTtcbiAgICAvLyBGZXRjaGluZyBhbGwgcGFnZXMgaWYgd2UnbGwgZXhlY3V0ZSwgc28gd2UgY2FuIGhhdmUgdGhlIGNvcnJlY3QgY2hhbmdlIGNvdW50IHdoZW4gbW9uaXRvcmluZy5cbiAgICByZXR1cm4gd2FpdEZvckNoYW5nZVNldCh0aGlzLmNmbiwgeyBpb0hvc3Q6IHRoaXMuaW9Ib3N0LCBhY3Rpb246IHRoaXMuYWN0aW9uIH0sIHRoaXMuc3RhY2tOYW1lLCBjaGFuZ2VTZXROYW1lLCB7XG4gICAgICBmZXRjaEFsbDogd2lsbEV4ZWN1dGUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDaGFuZ2VTZXQoY2hhbmdlU2V0OiBEZXNjcmliZUNoYW5nZVNldENvbW1hbmRPdXRwdXQpOiBQcm9taXNlPFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgZm9ybWF0KCdJbml0aWF0aW5nIGV4ZWN1dGlvbiBvZiBjaGFuZ2VzZXQgJXMgb24gc3RhY2sgJXMnLCBjaGFuZ2VTZXQuQ2hhbmdlU2V0SWQsIHRoaXMuc3RhY2tOYW1lKSkpO1xuXG4gICAgYXdhaXQgdGhpcy5jZm4uZXhlY3V0ZUNoYW5nZVNldCh7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0LkNoYW5nZVNldE5hbWUhLFxuICAgICAgQ2xpZW50UmVxdWVzdFRva2VuOiBgZXhlYyR7dGhpcy51dWlkfWAsXG4gICAgICAuLi50aGlzLmNvbW1vbkV4ZWN1dGVPcHRpb25zKCksXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcoXG4gICAgICB0aGlzLmFjdGlvbixcbiAgICAgIGZvcm1hdChcbiAgICAgICAgJ0V4ZWN1dGlvbiBvZiBjaGFuZ2VzZXQgJXMgb24gc3RhY2sgJXMgaGFzIHN0YXJ0ZWQ7IHdhaXRpbmcgZm9yIHRoZSB1cGRhdGUgdG8gY29tcGxldGUuLi4nLFxuICAgICAgICBjaGFuZ2VTZXQuQ2hhbmdlU2V0SWQsXG4gICAgICAgIHRoaXMuc3RhY2tOYW1lLFxuICAgICAgKSxcbiAgICApKTtcblxuICAgIC8vICsxIGZvciB0aGUgZXh0cmEgZXZlbnQgZW1pdHRlZCBmcm9tIHVwZGF0ZXMuXG4gICAgY29uc3QgY2hhbmdlU2V0TGVuZ3RoOiBudW1iZXIgPSAoY2hhbmdlU2V0LkNoYW5nZXMgPz8gW10pLmxlbmd0aCArICh0aGlzLnVwZGF0ZSA/IDEgOiAwKTtcbiAgICByZXR1cm4gdGhpcy5tb25pdG9yRGVwbG95bWVudChjaGFuZ2VTZXQuQ3JlYXRpb25UaW1lISwgY2hhbmdlU2V0TGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cE9sZENoYW5nZXNldChjaGFuZ2VTZXROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cykge1xuICAgICAgLy8gRGVsZXRlIGFueSBleGlzdGluZyBjaGFuZ2Ugc2V0cyBnZW5lcmF0ZWQgYnkgQ0RLIHNpbmNlIGNoYW5nZSBzZXQgbmFtZXMgbXVzdCBiZSB1bmlxdWUuXG4gICAgICAvLyBUaGUgZGVsZXRlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCBhcyBsb25nIGFzIHRoZSBzdGFjayBleGlzdHMgKGV2ZW4gaWYgdGhlIGNoYW5nZSBzZXQgZG9lcyBub3QgZXhpc3QpLlxuICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgUmVtb3ZpbmcgZXhpc3RpbmcgY2hhbmdlIHNldCB3aXRoIG5hbWUgJHtjaGFuZ2VTZXROYW1lfSBpZiBpdCBleGlzdHNgKSk7XG4gICAgICBhd2FpdCB0aGlzLmNmbi5kZWxldGVDaGFuZ2VTZXQoe1xuICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICBDaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXROYW1lLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVUZXJtaW5hdGlvblByb3RlY3Rpb24oKSB7XG4gICAgLy8gVXBkYXRlIHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gb25seSBpZiBpdCBoYXMgY2hhbmdlZC5cbiAgICBjb25zdCB0ZXJtaW5hdGlvblByb3RlY3Rpb24gPSB0aGlzLnN0YWNrQXJ0aWZhY3QudGVybWluYXRpb25Qcm90ZWN0aW9uID8/IGZhbHNlO1xuICAgIGlmICghIXRoaXMuY2xvdWRGb3JtYXRpb25TdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24gIT09IHRlcm1pbmF0aW9uUHJvdGVjdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKFxuICAgICAgICB0aGlzLmFjdGlvbixcbiAgICAgICAgZm9ybWF0IChcbiAgICAgICAgICAnVXBkYXRpbmcgdGVybWluYXRpb24gcHJvdGVjdGlvbiBmcm9tICVzIHRvICVzIGZvciBzdGFjayAlcycsXG4gICAgICAgICAgdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLnRlcm1pbmF0aW9uUHJvdGVjdGlvbixcbiAgICAgICAgICB0ZXJtaW5hdGlvblByb3RlY3Rpb24sXG4gICAgICAgICAgdGhpcy5zdGFja05hbWUsXG4gICAgICAgICksXG4gICAgICApKTtcbiAgICAgIGF3YWl0IHRoaXMuY2ZuLnVwZGF0ZVRlcm1pbmF0aW9uUHJvdGVjdGlvbih7XG4gICAgICAgIFN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICAgIEVuYWJsZVRlcm1pbmF0aW9uUHJvdGVjdGlvbjogdGVybWluYXRpb25Qcm90ZWN0aW9uLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGZvcm1hdCgnVGVybWluYXRpb24gcHJvdGVjdGlvbiB1cGRhdGVkIHRvICVzIGZvciBzdGFjayAlcycsIHRlcm1pbmF0aW9uUHJvdGVjdGlvbiwgdGhpcy5zdGFja05hbWUpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXJlY3REZXBsb3ltZW50KCk6IFByb21pc2U8U3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGluZm8odGhpcy5hY3Rpb24sIGZvcm1hdCgnJXM6ICVzIHN0YWNrLi4uJywgY2hhbGsuYm9sZCh0aGlzLnN0YWNrTmFtZSksIHRoaXMudXBkYXRlID8gJ3VwZGF0aW5nJyA6ICdjcmVhdGluZycpKSk7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKHRoaXMudXBkYXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVRlcm1pbmF0aW9uUHJvdGVjdGlvbigpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNmbi51cGRhdGVTdGFjayh7XG4gICAgICAgICAgU3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgICAgICBDbGllbnRSZXF1ZXN0VG9rZW46IGB1cGRhdGUke3RoaXMudXVpZH1gLFxuICAgICAgICAgIC4uLnRoaXMuY29tbW9uUHJlcGFyZU9wdGlvbnMoKSxcbiAgICAgICAgICAuLi50aGlzLmNvbW1vbkV4ZWN1dGVPcHRpb25zKCksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5tZXNzYWdlID09PSAnTm8gdXBkYXRlcyBhcmUgdG8gYmUgcGVyZm9ybWVkLicpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGZvcm1hdCgnTm8gdXBkYXRlcyBhcmUgdG8gYmUgcGVyZm9ybWVkIGZvciBzdGFjayAlcycsIHRoaXMuc3RhY2tOYW1lKSkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZGlkLWRlcGxveS1zdGFjaycsXG4gICAgICAgICAgICBub09wOiB0cnVlLFxuICAgICAgICAgICAgb3V0cHV0czogdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICAgICAgICBzdGFja0FybjogdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm1vbml0b3JEZXBsb3ltZW50KHN0YXJ0VGltZSwgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB3ZSBjYW4gc2V0IHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gZHVyaW5nIGNyZWF0ZVxuICAgICAgY29uc3QgdGVybWluYXRpb25Qcm90ZWN0aW9uID0gdGhpcy5zdGFja0FydGlmYWN0LnRlcm1pbmF0aW9uUHJvdGVjdGlvbiA/PyBmYWxzZTtcblxuICAgICAgYXdhaXQgdGhpcy5jZm4uY3JlYXRlU3RhY2soe1xuICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICBDbGllbnRSZXF1ZXN0VG9rZW46IGBjcmVhdGUke3RoaXMudXVpZH1gLFxuICAgICAgICAuLi4odGVybWluYXRpb25Qcm90ZWN0aW9uID8geyBFbmFibGVUZXJtaW5hdGlvblByb3RlY3Rpb246IHRydWUgfSA6IHVuZGVmaW5lZCksXG4gICAgICAgIC4uLnRoaXMuY29tbW9uUHJlcGFyZU9wdGlvbnMoKSxcbiAgICAgICAgLi4udGhpcy5jb21tb25FeGVjdXRlT3B0aW9ucygpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLm1vbml0b3JEZXBsb3ltZW50KHN0YXJ0VGltZSwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1vbml0b3JEZXBsb3ltZW50KHN0YXJ0VGltZTogRGF0ZSwgZXhwZWN0ZWRDaGFuZ2VzOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IG1vbml0b3IgPSBuZXcgU3RhY2tBY3Rpdml0eU1vbml0b3Ioe1xuICAgICAgY2ZuOiB0aGlzLmNmbixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrQXJ0aWZhY3QsXG4gICAgICBzdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgcmVzb3VyY2VzVG90YWw6IGV4cGVjdGVkQ2hhbmdlcyxcbiAgICAgIGlvSG9zdDogdGhpcy5pb0hvc3QsXG4gICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLFxuICAgICAgY2hhbmdlU2V0Q3JlYXRpb25UaW1lOiBzdGFydFRpbWUsXG4gICAgfSk7XG4gICAgYXdhaXQgbW9uaXRvci5zdGFydCgpO1xuXG4gICAgbGV0IGZpbmFsU3RhdGUgPSB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2s7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3NTdGFjayA9IGF3YWl0IHdhaXRGb3JTdGFja0RlcGxveSh0aGlzLmNmbiwgeyBpb0hvc3Q6IHRoaXMuaW9Ib3N0LCBhY3Rpb246IHRoaXMuYWN0aW9uIH0sIHRoaXMuc3RhY2tOYW1lKTtcblxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiwgYnV0IGNhdGNoIGl0IGFueXdheS4gWW91IG5ldmVyIGtub3cuXG4gICAgICBpZiAoIXN1Y2Nlc3NTdGFjaykge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdTdGFjayBkZXBsb3kgZmFpbGVkICh0aGUgc3RhY2sgZGlzYXBwZWFyZWQgd2hpbGUgd2Ugd2VyZSBkZXBsb3lpbmcgaXQpJyk7XG4gICAgICB9XG4gICAgICBmaW5hbFN0YXRlID0gc3VjY2Vzc1N0YWNrO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihzdWZmaXhXaXRoRXJyb3JzKGZvcm1hdEVycm9yTWVzc2FnZShlKSwgbW9uaXRvci5lcnJvcnMpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgbW9uaXRvci5zdG9wKCk7XG4gICAgfVxuICAgIGRlYnVnKHRoaXMuYWN0aW9uLCBmb3JtYXQoJ1N0YWNrICVzIGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcnLCB0aGlzLnN0YWNrTmFtZSkpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZGlkLWRlcGxveS1zdGFjaycsXG4gICAgICBub09wOiBmYWxzZSxcbiAgICAgIG91dHB1dHM6IGZpbmFsU3RhdGUub3V0cHV0cyxcbiAgICAgIHN0YWNrQXJuOiBmaW5hbFN0YXRlLnN0YWNrSWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9wdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gQ3JlYXRlU3RhY2ssIFVwZGF0ZVN0YWNrIGFuZCBDcmVhdGVDaGFuZ2VTZXRcbiAgICovXG4gIHByaXZhdGUgY29tbW9uUHJlcGFyZU9wdGlvbnMoKTogUGFydGlhbDxQaWNrPFVwZGF0ZVN0YWNrQ29tbWFuZElucHV0LCBDb21tb25QcmVwYXJlT3B0aW9ucz4+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQ2FwYWJpbGl0aWVzOiBbJ0NBUEFCSUxJVFlfSUFNJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJywgJ0NBUEFCSUxJVFlfQVVUT19FWFBBTkQnXSxcbiAgICAgIE5vdGlmaWNhdGlvbkFSTnM6IHRoaXMub3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgUGFyYW1ldGVyczogdGhpcy5zdGFja1BhcmFtcy5hcGlQYXJhbWV0ZXJzLFxuICAgICAgUm9sZUFSTjogdGhpcy5vcHRpb25zLnJvbGVBcm4sXG4gICAgICBUZW1wbGF0ZUJvZHk6IHRoaXMuYm9keVBhcmFtZXRlci5UZW1wbGF0ZUJvZHksXG4gICAgICBUZW1wbGF0ZVVSTDogdGhpcy5ib2R5UGFyYW1ldGVyLlRlbXBsYXRlVVJMLFxuICAgICAgVGFnczogdGhpcy5vcHRpb25zLnRhZ3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9wdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gVXBkYXRlU3RhY2sgYW5kIENyZWF0ZUNoYW5nZVNldFxuICAgKlxuICAgKiBCZSBjYXJlZnVsIG5vdCB0byBhZGQgaW4ga2V5cyBmb3Igb3B0aW9ucyB0aGF0IGFyZW4ndCB1c2VkLCBhcyB0aGUgZmVhdHVyZXMgbWF5IG5vdCBoYXZlIGJlZW5cbiAgICogZGVwbG95ZWQgZXZlcnl3aGVyZSB5ZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbW1vbkV4ZWN1dGVPcHRpb25zKCk6IFBhcnRpYWw8UGljazxVcGRhdGVTdGFja0NvbW1hbmRJbnB1dCwgQ29tbW9uRXhlY3V0ZU9wdGlvbnM+PiB7XG4gICAgY29uc3Qgc2hvdWxkRGlzYWJsZVJvbGxiYWNrID0gdGhpcy5vcHRpb25zLnJvbGxiYWNrID09PSBmYWxzZTtcblxuICAgIHJldHVybiB7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgLi4uKHNob3VsZERpc2FibGVSb2xsYmFjayA/IHsgRGlzYWJsZVJvbGxiYWNrOiB0cnVlIH0gOiB1bmRlZmluZWQpLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXN0cm95U3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBiZSBkZXN0cm95ZWRcbiAgICovXG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgc2RrOiBTREs7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG4gIHF1aWV0PzogYm9vbGVhbjtcbiAgY2k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVzdHJveVN0YWNrKG9wdGlvbnM6IERlc3Ryb3lTdGFja09wdGlvbnMsIHsgaW9Ib3N0LCBhY3Rpb24gfTogSW9NZXNzYWdpbmcpIHtcbiAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuZGVwbG95TmFtZSB8fCBvcHRpb25zLnN0YWNrLnN0YWNrTmFtZTtcbiAgY29uc3QgY2ZuID0gb3B0aW9ucy5zZGsuY2xvdWRGb3JtYXRpb24oKTtcblxuICBjb25zdCBjdXJyZW50U3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuICBpZiAoIWN1cnJlbnRTdGFjay5leGlzdHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbW9uaXRvciA9IG5ldyBTdGFja0FjdGl2aXR5TW9uaXRvcih7XG4gICAgY2ZuLFxuICAgIHN0YWNrOiBvcHRpb25zLnN0YWNrLFxuICAgIHN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICBpb0hvc3QsXG4gICAgYWN0aW9uLFxuICB9KTtcbiAgYXdhaXQgbW9uaXRvci5zdGFydCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY2ZuLmRlbGV0ZVN0YWNrKHsgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLCBSb2xlQVJOOiBvcHRpb25zLnJvbGVBcm4gfSk7XG4gICAgY29uc3QgZGVzdHJveWVkU3RhY2sgPSBhd2FpdCB3YWl0Rm9yU3RhY2tEZWxldGUoY2ZuLCB7IGlvSG9zdCwgYWN0aW9uIH0sIGRlcGxveU5hbWUpO1xuICAgIGlmIChkZXN0cm95ZWRTdGFjayAmJiBkZXN0cm95ZWRTdGFjay5zdGFja1N0YXR1cy5uYW1lICE9PSAnREVMRVRFX0NPTVBMRVRFJykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgRmFpbGVkIHRvIGRlc3Ryb3kgJHtkZXBsb3lOYW1lfTogJHtkZXN0cm95ZWRTdGFjay5zdGFja1N0YXR1c31gKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3Ioc3VmZml4V2l0aEVycm9ycyhmb3JtYXRFcnJvck1lc3NhZ2UoZSksIG1vbml0b3IuZXJyb3JzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG1vbml0b3IpIHtcbiAgICAgIGF3YWl0IG1vbml0b3Iuc3RvcCgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHdlIGNhbiBza2lwIGRlcGxveW1lbnRcbiAqXG4gKiBXZSBkbyB0aGlzIGluIGEgY29tcGxpY2F0ZWQgd2F5IGJ5IHByZXByb2Nlc3NpbmcgKGluc3RlYWQgb2YganVzdFxuICogbG9va2luZyBhdCB0aGUgY2hhbmdlc2V0KSwgYmVjYXVzZSBpZiB0aGVyZSBhcmUgbmVzdGVkIHN0YWNrcyBpbnZvbHZlZFxuICogdGhlIGNoYW5nZXNldCB3aWxsIGFsd2F5cyBzaG93IHRoZSBuZXN0ZWQgc3RhY2tzIGFzIG5lZWRpbmcgdG8gYmVcbiAqIHVwZGF0ZWQsIGFuZCB0aGUgZGVwbG95bWVudCB3aWxsIHRha2UgYSBsb25nIHRpbWUgdG8gaW4gZWZmZWN0IG5vdFxuICogZG8gYW55dGhpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhblNraXBEZXBsb3koXG4gIGRlcGxveVN0YWNrT3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zLFxuICBjbG91ZEZvcm1hdGlvblN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrLFxuICBwYXJhbWV0ZXJDaGFuZ2VzOiBQYXJhbWV0ZXJDaGFuZ2VzLFxuICB7IGlvSG9zdCwgYWN0aW9uIH06IElvTWVzc2FnaW5nLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlcGxveU5hbWUgPSBkZXBsb3lTdGFja09wdGlvbnMuZGVwbG95TmFtZSB8fCBkZXBsb3lTdGFja09wdGlvbnMuc3RhY2suc3RhY2tOYW1lO1xuICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKGFjdGlvbiwgYCR7ZGVwbG95TmFtZX06IGNoZWNraW5nIGlmIHdlIGNhbiBza2lwIGRlcGxveWApKTtcblxuICAvLyBGb3JjZWQgZGVwbG95XG4gIGlmIChkZXBsb3lTdGFja09wdGlvbnMuZm9yY2UpIHtcbiAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKGFjdGlvbiwgYCR7ZGVwbG95TmFtZX06IGZvcmNlZCBkZXBsb3ltZW50YCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENyZWF0aW5nIGNoYW5nZXNldCBvbmx5IChkZWZhdWx0IHRydWUpLCBuZXZlciBza2lwXG4gIGlmIChcbiAgICBkZXBsb3lTdGFja09wdGlvbnMuZGVwbG95bWVudE1ldGhvZD8ubWV0aG9kID09PSAnY2hhbmdlLXNldCcgJiZcbiAgICBkZXBsb3lTdGFja09wdGlvbnMuZGVwbG95bWVudE1ldGhvZC5leGVjdXRlID09PSBmYWxzZVxuICApIHtcbiAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKGFjdGlvbiwgYCR7ZGVwbG95TmFtZX06IC0tbm8tZXhlY3V0ZSwgYWx3YXlzIGNyZWF0aW5nIGNoYW5nZSBzZXRgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gTm8gZXhpc3Rpbmcgc3RhY2tcbiAgaWYgKCFjbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cykge1xuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoYWN0aW9uLCBgJHtkZXBsb3lOYW1lfTogbm8gZXhpc3Rpbmcgc3RhY2tgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGVtcGxhdGUgaGFzIGNoYW5nZWQgKGFzc2V0cyB0YWtlbiBpbnRvIGFjY291bnQgaGVyZSlcbiAgaWYgKEpTT04uc3RyaW5naWZ5KGRlcGxveVN0YWNrT3B0aW9ucy5zdGFjay50ZW1wbGF0ZSkgIT09IEpTT04uc3RyaW5naWZ5KGF3YWl0IGNsb3VkRm9ybWF0aW9uU3RhY2sudGVtcGxhdGUoKSkpIHtcbiAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKGFjdGlvbiwgYCR7ZGVwbG95TmFtZX06IHRlbXBsYXRlIGhhcyBjaGFuZ2VkYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRhZ3MgaGF2ZSBjaGFuZ2VkXG4gIGlmICghY29tcGFyZVRhZ3MoY2xvdWRGb3JtYXRpb25TdGFjay50YWdzLCBkZXBsb3lTdGFja09wdGlvbnMudGFncyA/PyBbXSkpIHtcbiAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKGFjdGlvbiwgYCR7ZGVwbG95TmFtZX06IHRhZ3MgaGF2ZSBjaGFuZ2VkYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbiBhcm5zIGhhdmUgY2hhbmdlZFxuICBpZiAoIWFycmF5RXF1YWxzKGNsb3VkRm9ybWF0aW9uU3RhY2subm90aWZpY2F0aW9uQXJucywgZGVwbG95U3RhY2tPcHRpb25zLm5vdGlmaWNhdGlvbkFybnMgPz8gW10pKSB7XG4gICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShkZWJ1ZyhhY3Rpb24sIGAke2RlcGxveU5hbWV9OiBub3RpZmljYXRpb24gYXJucyBoYXZlIGNoYW5nZWRgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGVybWluYXRpb24gcHJvdGVjdGlvbiBoYXMgYmVlbiB1cGRhdGVkXG4gIGlmICghIWRlcGxveVN0YWNrT3B0aW9ucy5zdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24gIT09ICEhY2xvdWRGb3JtYXRpb25TdGFjay50ZXJtaW5hdGlvblByb3RlY3Rpb24pIHtcbiAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KGRlYnVnKGFjdGlvbiwgYCR7ZGVwbG95TmFtZX06IHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gaGFzIGJlZW4gdXBkYXRlZGApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBQYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZFxuICBpZiAocGFyYW1ldGVyQ2hhbmdlcykge1xuICAgIGlmIChwYXJhbWV0ZXJDaGFuZ2VzID09PSAnc3NtJykge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShkZWJ1ZyhhY3Rpb24sIGAke2RlcGxveU5hbWV9OiBzb21lIHBhcmFtZXRlcnMgY29tZSBmcm9tIFNTTSBzbyB3ZSBoYXZlIHRvIGFzc3VtZSB0aGV5IG1heSBoYXZlIGNoYW5nZWRgKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoYWN0aW9uLCBgJHtkZXBsb3lOYW1lfTogcGFyYW1ldGVycyBoYXZlIGNoYW5nZWRgKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEV4aXN0aW5nIHN0YWNrIGlzIGluIGEgZmFpbGVkIHN0YXRlXG4gIGlmIChjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLmlzRmFpbHVyZSkge1xuICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoZGVidWcoYWN0aW9uLCBgJHtkZXBsb3lOYW1lfTogc3RhY2sgaXMgaW4gYSBmYWlsdXJlIHN0YXRlYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFdlIGNhbiBza2lwIGRlcGxveVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gbGlzdCBvZiB0YWdzLCByZXR1cm5zIHRydWUgaWYgaWRlbnRpY2FsLlxuICovXG5mdW5jdGlvbiBjb21wYXJlVGFncyhhOiBUYWdbXSwgYjogVGFnW10pOiBib29sZWFuIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgYVRhZyBvZiBhKSB7XG4gICAgY29uc3QgYlRhZyA9IGIuZmluZCgodGFnKSA9PiB0YWcuS2V5ID09PSBhVGFnLktleSk7XG5cbiAgICBpZiAoIWJUYWcgfHwgYlRhZy5WYWx1ZSAhPT0gYVRhZy5WYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzdWZmaXhXaXRoRXJyb3JzKG1zZzogc3RyaW5nLCBlcnJvcnM/OiBzdHJpbmdbXSkge1xuICByZXR1cm4gZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwID8gYCR7bXNnfTogJHtlcnJvcnMuam9pbignLCAnKX1gIDogbXNnO1xufVxuXG5mdW5jdGlvbiBhcnJheUVxdWFscyhhOiBhbnlbXSwgYjogYW55W10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0pID0+IGIuaW5jbHVkZXMoaXRlbSkpICYmIGIuZXZlcnkoKGl0ZW0pID0+IGEuaW5jbHVkZXMoaXRlbSkpO1xufVxuXG5mdW5jdGlvbiBoYXNSZXBsYWNlbWVudChjczogRGVzY3JpYmVDaGFuZ2VTZXRDb21tYW5kT3V0cHV0KSB7XG4gIHJldHVybiAoY3MuQ2hhbmdlcyA/PyBbXSkuc29tZShjID0+IHtcbiAgICBjb25zdCBhID0gYy5SZXNvdXJjZUNoYW5nZT8uUG9saWN5QWN0aW9uO1xuICAgIHJldHVybiBhID09PSAnUmVwbGFjZUFuZERlbGV0ZScgfHwgYSA9PT0gJ1JlcGxhY2VBbmRSZXRhaW4nIHx8IGEgPT09ICdSZXBsYWNlQW5kU25hcHNob3QnO1xuICB9KTtcbn1cbiJdfQ==
|
|
489
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95LXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMk1BLGtDQTRJQztBQStURCxvQ0E2QkM7QUFuckJELCtCQUE4QjtBQVU5QiwrQkFBK0I7QUFDL0IsNkJBQTZCO0FBQzdCLHFFQUFnRTtBQUNoRSx5REFBbUQ7QUFDbkQscUNBQXVEO0FBQ3ZELHFDQUFxRTtBQUNyRSxxREFVMEI7QUFHMUIsK0RBQTZEO0FBRTdELGlEQUF1RDtBQUN2RCwrQ0FBbUQ7QUFDbkQscUNBQWdEO0FBR2hELDBGQUE2RTtBQUM3RSw4Q0FBZ0Y7QUFDaEYsa0RBQXVEO0FBRXZELDZFQUFnRztBQW1LekYsS0FBSyxVQUFVLFdBQVcsQ0FBQyxPQUEyQixFQUFFLFFBQWtCOztJQUMvRSxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBRXBDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztJQUU3QyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNqRSxJQUFJLG1CQUFtQixHQUFHLE1BQU0sb0NBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUU1RSxJQUFJLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGdCQUFLLEVBQ3pCLHdCQUF3QixVQUFVLHNGQUFzRixDQUN6SCxDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFT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QztZQUN2QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsTUFBaUI7SUFDdEQsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzVFLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxDQUFRLEVBQUUsQ0FBUTtJQUNyQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEYsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEVBQWtDOztJQUN4RCxPQUFPLENBQUMsTUFBQSxFQUFFLENBQUMsT0FBTyxtQ0FBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7O1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLE1BQUEsQ0FBQyxDQUFDLGNBQWMsMENBQUUsWUFBWSxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxLQUFLLGtCQUFrQixJQUFJLENBQUMsS0FBSyxrQkFBa0IsSUFBSSxDQUFDLEtBQUssb0JBQW9CLENBQUM7SUFDNUYsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUge1xuICBDcmVhdGVDaGFuZ2VTZXRDb21tYW5kSW5wdXQsXG4gIENyZWF0ZVN0YWNrQ29tbWFuZElucHV0LFxuICBEZXNjcmliZUNoYW5nZVNldENvbW1hbmRPdXRwdXQsXG4gIEV4ZWN1dGVDaGFuZ2VTZXRDb21tYW5kSW5wdXQsXG4gIFVwZGF0ZVN0YWNrQ29tbWFuZElucHV0LFxuICBUYWcsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgQXNzZXRNYW5pZmVzdEJ1aWxkZXIgfSBmcm9tICcuL2Fzc2V0LW1hbmlmZXN0LWJ1aWxkZXInO1xuaW1wb3J0IHsgcHVibGlzaEFzc2V0cyB9IGZyb20gJy4vYXNzZXQtcHVibGlzaGluZyc7XG5pbXBvcnQgeyBhZGRNZXRhZGF0YUFzc2V0c1RvTWFuaWZlc3QgfSBmcm9tICcuL2Fzc2V0cyc7XG5pbXBvcnQgeyBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyB9IGZyb20gJy4vY2hlY2tzJztcbmltcG9ydCB7XG4gIGNoYW5nZVNldEhhc05vQ2hhbmdlcyxcbiAgQ2xvdWRGb3JtYXRpb25TdGFjayxcbiAgVGVtcGxhdGVQYXJhbWV0ZXJzLFxuICB3YWl0Rm9yQ2hhbmdlU2V0LFxuICB3YWl0Rm9yU3RhY2tEZXBsb3ksXG4gIHdhaXRGb3JTdGFja0RlbGV0ZSxcbiAgUGFyYW1ldGVyVmFsdWVzLFxuICBQYXJhbWV0ZXJDaGFuZ2VzLFxuICBSZXNvdXJjZXNUb0ltcG9ydCxcbn0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBDaGFuZ2VTZXREZXBsb3ltZW50TWV0aG9kLCBEZXBsb3ltZW50TWV0aG9kIH0gZnJvbSAnLi9kZXBsb3ltZW50LW1ldGhvZCc7XG5pbXBvcnQgeyBEZXBsb3lTdGFja1Jlc3VsdCwgU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi9kZXBsb3ltZW50LXJlc3VsdCc7XG5pbXBvcnQgeyB0cnlIb3Rzd2FwRGVwbG95bWVudCB9IGZyb20gJy4vaG90c3dhcC1kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBJb0hlbHBlciB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9pby9wcml2YXRlJztcbmltcG9ydCB7IGRlYnVnLCBpbmZvLCB3YXJuIH0gZnJvbSAnLi4vLi4vY2xpL21lc3NhZ2VzJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvZXJyb3InO1xuaW1wb3J0IHsgZm9ybWF0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IFNESywgU2RrUHJvdmlkZXIsIElDbG91ZEZvcm1hdGlvbkNsaWVudCB9IGZyb20gJy4uL2F3cy1hdXRoJztcbmltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnRSZXNvdXJjZXMgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uIH0gZnJvbSAnLi4vZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUnO1xuaW1wb3J0IHsgSG90c3dhcE1vZGUsIEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcywgSUNPTiB9IGZyb20gJy4uL2hvdHN3YXAvY29tbW9uJztcbmltcG9ydCB7IFN0YWNrQWN0aXZpdHlNb25pdG9yIH0gZnJvbSAnLi4vc3RhY2stZXZlbnRzJztcbmltcG9ydCB7IFN0cmluZ1dpdGhvdXRQbGFjZWhvbGRlcnMgfSBmcm9tICcuLi91dGlsL3BsYWNlaG9sZGVycyc7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlQm9keVBhcmFtZXRlciwgbWFrZUJvZHlQYXJhbWV0ZXIgfSBmcm9tICcuLi91dGlsL3RlbXBsYXRlLWJvZHktcGFyYW1ldGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHN0YWNrIHRvIGJlIGRlcGxveWVkXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgdG8gZGVwbG95IHRoaXMgc3RhY2sgaW5cbiAgICpcbiAgICogVGhlIGVudmlyb25tZW50IG9uIHRoZSBzdGFjayBhcnRpZmFjdCBtYXkgYmUgdW5yZXNvbHZlZCwgdGhpcyBvbmVcbiAgICogbXVzdCBiZSByZXNvbHZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkRW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgU0RLIHRvIHVzZSBmb3IgZGVwbG95aW5nIHRoZSBzdGFja1xuICAgKlxuICAgKiBTaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIGNvcnJlY3Qgcm9sZSB3aXRoIHdoaWNoXG4gICAqIHN0YWNrIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHBlcmZvcm1lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNkazogU0RLO1xuXG4gIC8qKlxuICAgKiBTREsgcHJvdmlkZXIgKHNlZWRlZCB3aXRoIGRlZmF1bHQgY3JlZGVudGlhbHMpXG4gICAqXG4gICAqIFdpbGwgYmUgdXNlZCB0bzpcbiAgICpcbiAgICogLSBQdWJsaXNoIGFzc2V0cywgZWl0aGVyIGxlZ2FjeSBhc3NldHMgb3IgbGFyZ2UgQ0ZOIHRlbXBsYXRlc1xuICAgKiAgIHRoYXQgYXJlbid0IHRoZW1zZWx2ZXMgYXNzZXRzIGZyb20gYSBtYW5pZmVzdC4gKE5lZWRzIGFuIFNES1xuICAgKiAgIFByb3ZpZGVyIGJlY2F1c2UgdGhlIGZpbGUgcHVibGlzaGluZyByb2xlIGlzIGRlY2xhcmVkIGFzIHBhcnRcbiAgICogICBvZiB0aGUgYXNzZXQpLlxuICAgKiAtIEhvdHN3YXBcbiAgICovXG4gIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJvb3RzdHJhcCBzdGFjayBmb3VuZCBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50XG4gICAqL1xuICByZWFkb25seSBlbnZSZXNvdXJjZXM6IEVudmlyb25tZW50UmVzb3VyY2VzO1xuXG4gIC8qKlxuICAgKiBSb2xlIHRvIHBhc3MgdG8gQ2xvdWRGb3JtYXRpb24gdG8gZXhlY3V0ZSB0aGUgY2hhbmdlIHNldFxuICAgKlxuICAgKiBUbyBvYnRhaW4gYSBgU3RyaW5nV2l0aG91dFBsYWNlaG9sZGVyc2AsIHJ1biBhIHJlZ3VsYXJcbiAgICogc3RyaW5nIHRob3VnaCBgVGFyZ2V0RW52aXJvbm1lbnQucmVwbGFjZVBsYWNlaG9sZGVyc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZXhlY3V0aW9uIHJvbGU7IENsb3VkRm9ybWF0aW9uIGVpdGhlciB1c2VzIHRoZSByb2xlIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGhcbiAgICogdGhlIHN0YWNrLCBvciBvdGhlcndpc2UgdXNlcyBjdXJyZW50IEFXUyBjcmVkZW50aWFscy5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBTdHJpbmdXaXRob3V0UGxhY2Vob2xkZXJzO1xuXG4gIC8qKlxuICAgKiBOb3RpZmljYXRpb24gQVJOcyB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIHRvIG5vdGlmeSB3aGVuIHRoZSBjaGFuZ2Ugc2V0IGhhcyBjb21wbGV0ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Bcm5zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE5hbWUgdG8gZGVwbG95IHRoZSBzdGFjayB1bmRlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5hbWUgZnJvbSBhc3NlbWJseVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiBhc3NldCBJRHMgd2hpY2ggc2hvdWxkbid0IGJlIGJ1aWx0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnVpbGQgYWxsIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmV1c2VBc3NldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGFncyB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIHRvIGFkZCB0byBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBUYWdbXTtcblxuICAvKipcbiAgICogV2hhdCBkZXBsb3ltZW50IG1ldGhvZCB0byB1c2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDaGFuZ2Ugc2V0IHdpdGggZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRNZXRob2Q/OiBEZXBsb3ltZW50TWV0aG9kO1xuXG4gIC8qKlxuICAgKiBUaGUgY29sbGVjdGlvbiBvZiBleHRyYSBwYXJhbWV0ZXJzXG4gICAqIChpbiBhZGRpdGlvbiB0byB0aG9zZSB1c2VkIGZvciBhc3NldHMpXG4gICAqIHRvIHBhc3MgdG8gdGhlIGRlcGxveWVkIHRlbXBsYXRlLlxuICAgKiBOb3RlIHRoYXQgcGFyYW1ldGVycyB3aXRoIGB1bmRlZmluZWRgIG9yIGVtcHR5IHZhbHVlcyB3aWxsIGJlIGlnbm9yZWQsXG4gICAqIGFuZCBub3QgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgLyoqXG4gICAqIFVzZSBwcmV2aW91cyB2YWx1ZXMgZm9yIHVuc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICpcbiAgICogSWYgbm90IHNldCwgYWxsIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB1c2VQcmV2aW91c1BhcmFtZXRlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXBsb3kgZXZlbiBpZiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGRlcGxveS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUm9sbGJhY2sgZmFpbGVkIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKlxuICAgKiBXaGV0aGVyIHRvIHBlcmZvcm0gYSAnaG90c3dhcCcgZGVwbG95bWVudC5cbiAgICogQSAnaG90c3dhcCcgZGVwbG95bWVudCB3aWxsIGF0dGVtcHQgdG8gc2hvcnQtY2lyY3VpdCBDbG91ZEZvcm1hdGlvblxuICAgKiBhbmQgdXBkYXRlIHRoZSBhZmZlY3RlZCByZXNvdXJjZXMgbGlrZSBMYW1iZGEgZnVuY3Rpb25zIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlRgIGZvciByZWd1bGFyIGRlcGxveW1lbnRzLCBgSG90c3dhcE1vZGUuSE9UU1dBUF9PTkxZYCBmb3IgJ3dhdGNoJyBkZXBsb3ltZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgaG90c3dhcD86IEhvdHN3YXBNb2RlO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwcm9wZXJ0aWVzIHRoYXQgY29uZmlndXJlIGhvdHN3YXAgYmVoYXZpb3JcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcz86IEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcztcblxuICAvKipcbiAgICogVGhlIGV4dHJhIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyIHdoZW4gcGVyZm9ybWluZyBBV1MgU0RLIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdGhpbmcgZXh0cmEgaXMgYXBwZW5kZWQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBleHRyYVVzZXJBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgc2V0LCBjaGFuZ2Ugc2V0IG9mIHR5cGUgSU1QT1JUIHdpbGwgYmUgY3JlYXRlZCwgYW5kIHJlc291cmNlc1RvSW1wb3J0XG4gICAqIHBhc3NlZCB0byBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlc1RvSW1wb3J0PzogUmVzb3VyY2VzVG9JbXBvcnQ7XG5cbiAgLyoqXG4gICAqIElmIHByZXNlbnQsIHVzZSB0aGlzIGdpdmVuIHRlbXBsYXRlIGluc3RlYWQgb2YgdGhlIHN0b3JlZCBvbmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgdGhlIHN0b3JlZCB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVUZW1wbGF0ZT86IGFueTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBidWlsZC9wdWJsaXNoIGFzc2V0cyBpbiBwYXJhbGxlbFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQYXJhbGxlbGlzbT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXBsb3lTdGFjayhvcHRpb25zOiBEZXBsb3lTdGFja09wdGlvbnMsIGlvSGVscGVyOiBJb0hlbHBlcik6IFByb21pc2U8RGVwbG95U3RhY2tSZXN1bHQ+IHtcbiAgY29uc3Qgc3RhY2tBcnRpZmFjdCA9IG9wdGlvbnMuc3RhY2s7XG5cbiAgY29uc3Qgc3RhY2tFbnYgPSBvcHRpb25zLnJlc29sdmVkRW52aXJvbm1lbnQ7XG5cbiAgb3B0aW9ucy5zZGsuYXBwZW5kQ3VzdG9tVXNlckFnZW50KG9wdGlvbnMuZXh0cmFVc2VyQWdlbnQpO1xuICBjb25zdCBjZm4gPSBvcHRpb25zLnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICBjb25zdCBkZXBsb3lOYW1lID0gb3B0aW9ucy5kZXBsb3lOYW1lIHx8IHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lO1xuICBsZXQgY2xvdWRGb3JtYXRpb25TdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKGNmbiwgZGVwbG95TmFtZSk7XG5cbiAgaWYgKGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMuaXNDcmVhdGlvbkZhaWx1cmUpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoZGVidWcoXG4gICAgICBgRm91bmQgZXhpc3Rpbmcgc3RhY2sgJHtkZXBsb3lOYW1lfSB0aGF0IGhhZCBwcmV2aW91c2x5IGZhaWxlZCBjcmVhdGlvbi4gRGVsZXRpbmcgaXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmUtY3JlYXRlIGl0LmAsXG4gICAgKSk7XG4gICAgYXdhaXQgY2ZuLmRlbGV0ZVN0YWNrKHsgU3RhY2tOYW1lOiBkZXBsb3lOYW1lIH0pO1xuICAgIGNvbnN0IGRlbGV0ZWRTdGFjayA9IGF3YWl0IHdhaXRGb3JTdGFja0RlbGV0ZShjZm4sIGlvSGVscGVyLCBkZXBsb3lOYW1lKTtcbiAgICBpZiAoZGVsZXRlZFN0YWNrICYmIGRlbGV0ZWRTdGFjay5zdGFja1N0YXR1cy5uYW1lICE9PSAnREVMRVRFX0NPTVBMRVRFJykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgYEZhaWxlZCBkZWxldGluZyBzdGFjayAke2RlcGxveU5hbWV9IHRoYXQgaGFkIHByZXZpb3VzbHkgZmFpbGVkIGNyZWF0aW9uIChjdXJyZW50IHN0YXRlOiAke2RlbGV0ZWRTdGFjay5zdGFja1N0YXR1c30pYCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB0byBtYXJrIHRoYXQgdGhlIHN0YWNrIGRvZXMgbm90IGV4aXN0IGFueW1vcmUsIGJ1dCBhdm9pZFxuICAgIC8vIGRvaW5nIGFuIGFjdHVhbCBsb29rdXAgaW4gQ2xvdWRGb3JtYXRpb24gKHdoaWNoIHdvdWxkIGJlIHNpbGx5IHRvIGRvIGlmXG4gICAgLy8gd2UganVzdCBkZWxldGVkIGl0KS5cbiAgICBjbG91ZEZvcm1hdGlvblN0YWNrID0gQ2xvdWRGb3JtYXRpb25TdGFjay5kb2VzTm90RXhpc3QoY2ZuLCBkZXBsb3lOYW1lKTtcbiAgfVxuXG4gIC8vIERldGVjdCBcImxlZ2FjeVwiIGFzc2V0cyAod2hpY2ggcmVtYWluIGluIHRoZSBtZXRhZGF0YSkgYW5kIHB1Ymxpc2ggdGhlbSB2aWFcbiAgLy8gYW4gYWQtaG9jIGFzc2V0IG1hbmlmZXN0LCB3aGlsZSBwYXNzaW5nIHRoZWlyIGxvY2F0aW9ucyB2aWEgdGVtcGxhdGVcbiAgLy8gcGFyYW1ldGVycy5cbiAgY29uc3QgbGVnYWN5QXNzZXRzID0gbmV3IEFzc2V0TWFuaWZlc3RCdWlsZGVyKCk7XG4gIGNvbnN0IGFzc2V0UGFyYW1zID0gYXdhaXQgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0KFxuICAgIGlvSGVscGVyLFxuICAgIHN0YWNrQXJ0aWZhY3QsXG4gICAgbGVnYWN5QXNzZXRzLFxuICAgIG9wdGlvbnMuZW52UmVzb3VyY2VzLFxuICAgIG9wdGlvbnMucmV1c2VBc3NldHMsXG4gICk7XG5cbiAgY29uc3QgZmluYWxQYXJhbWV0ZXJWYWx1ZXMgPSB7IC4uLm9wdGlvbnMucGFyYW1ldGVycywgLi4uYXNzZXRQYXJhbXMgfTtcblxuICBjb25zdCB0ZW1wbGF0ZVBhcmFtcyA9IFRlbXBsYXRlUGFyYW1ldGVycy5mcm9tVGVtcGxhdGUoc3RhY2tBcnRpZmFjdC50ZW1wbGF0ZSk7XG4gIGNvbnN0IHN0YWNrUGFyYW1zID0gb3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnNcbiAgICA/IHRlbXBsYXRlUGFyYW1zLnVwZGF0ZUV4aXN0aW5nKGZpbmFsUGFyYW1ldGVyVmFsdWVzLCBjbG91ZEZvcm1hdGlvblN0YWNrLnBhcmFtZXRlcnMpXG4gICAgOiB0ZW1wbGF0ZVBhcmFtcy5zdXBwbHlBbGwoZmluYWxQYXJhbWV0ZXJWYWx1ZXMpO1xuXG4gIGNvbnN0IGhvdHN3YXBNb2RlID0gb3B0aW9ucy5ob3Rzd2FwID8/IEhvdHN3YXBNb2RlLkZVTExfREVQTE9ZTUVOVDtcbiAgY29uc3QgaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzID0gb3B0aW9ucy5ob3Rzd2FwUHJvcGVydHlPdmVycmlkZXMgPz8gbmV3IEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcygpO1xuXG4gIGlmIChhd2FpdCBjYW5Ta2lwRGVwbG95KG9wdGlvbnMsIGNsb3VkRm9ybWF0aW9uU3RhY2ssIHN0YWNrUGFyYW1zLmhhc0NoYW5nZXMoY2xvdWRGb3JtYXRpb25TdGFjay5wYXJhbWV0ZXJzKSwgaW9IZWxwZXIpKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2RlcGxveU5hbWV9OiBza2lwcGluZyBkZXBsb3ltZW50ICh1c2UgLS1mb3JjZSB0byBvdmVycmlkZSlgKSk7XG4gICAgLy8gaWYgd2UgY2FuIHNraXAgZGVwbG95bWVudCBhbmQgd2UgYXJlIHBlcmZvcm1pbmcgYSBob3Rzd2FwLCBsZXQgdGhlIHVzZXIga25vd1xuICAgIC8vIHRoYXQgbm8gaG90c3dhcCBkZXBsb3ltZW50IGhhcHBlbmVkXG4gICAgaWYgKGhvdHN3YXBNb2RlICE9PSBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShpbmZvKFxuICAgICAgICBmb3JtYXQoXG4gICAgICAgICAgYFxcbiAke0lDT059ICVzXFxuYCxcbiAgICAgICAgICBjaGFsay5ib2xkKCdob3Rzd2FwIGRlcGxveW1lbnQgc2tpcHBlZCAtIG5vIGNoYW5nZXMgd2VyZSBkZXRlY3RlZCAodXNlIC0tZm9yY2UgdG8gb3ZlcnJpZGUpJyksXG4gICAgICAgICksXG4gICAgICApKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdkaWQtZGVwbG95LXN0YWNrJyxcbiAgICAgIG5vT3A6IHRydWUsXG4gICAgICBvdXRwdXRzOiBjbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2RlcGxveU5hbWV9OiBkZXBsb3lpbmcuLi5gKSk7XG4gIH1cblxuICBjb25zdCBib2R5UGFyYW1ldGVyID0gYXdhaXQgbWFrZUJvZHlQYXJhbWV0ZXIoXG4gICAgc3RhY2tBcnRpZmFjdCxcbiAgICBvcHRpb25zLnJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgbGVnYWN5QXNzZXRzLFxuICAgIG9wdGlvbnMuZW52UmVzb3VyY2VzLFxuICAgIG9wdGlvbnMub3ZlcnJpZGVUZW1wbGF0ZSxcbiAgKTtcbiAgbGV0IGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGJvb3RzdHJhcFN0YWNrTmFtZSA9IChhd2FpdCBvcHRpb25zLmVudlJlc291cmNlcy5sb29rdXBUb29sa2l0KCkpLnN0YWNrTmFtZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgQ291bGQgbm90IGRldGVybWluZSB0aGUgYm9vdHN0cmFwIHN0YWNrIG5hbWU6ICR7ZX1gKSk7XG4gIH1cbiAgYXdhaXQgcHVibGlzaEFzc2V0cyhsZWdhY3lBc3NldHMudG9NYW5pZmVzdChzdGFja0FydGlmYWN0LmFzc2VtYmx5LmRpcmVjdG9yeSksIG9wdGlvbnMuc2RrUHJvdmlkZXIsIHN0YWNrRW52LCB7XG4gICAgcGFyYWxsZWw6IG9wdGlvbnMuYXNzZXRQYXJhbGxlbGlzbSxcbiAgICBhbGxvd0Nyb3NzQWNjb3VudDogYXdhaXQgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcob3B0aW9ucy5zZGssIGlvSGVscGVyLCBib290c3RyYXBTdGFja05hbWUpLFxuICB9LCBpb0hlbHBlcik7XG5cbiAgaWYgKGhvdHN3YXBNb2RlICE9PSBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQpIHtcbiAgICAvLyBhdHRlbXB0IHRvIHNob3J0LWNpcmN1aXQgdGhlIGRlcGxveW1lbnQgaWYgcG9zc2libGVcbiAgICB0cnkge1xuICAgICAgY29uc3QgaG90c3dhcERlcGxveW1lbnRSZXN1bHQgPSBhd2FpdCB0cnlIb3Rzd2FwRGVwbG95bWVudChcbiAgICAgICAgb3B0aW9ucy5zZGtQcm92aWRlcixcbiAgICAgICAgaW9IZWxwZXIsXG4gICAgICAgIHN0YWNrUGFyYW1zLnZhbHVlcyxcbiAgICAgICAgY2xvdWRGb3JtYXRpb25TdGFjayxcbiAgICAgICAgc3RhY2tBcnRpZmFjdCxcbiAgICAgICAgaG90c3dhcE1vZGUsIGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyxcbiAgICAgICk7XG4gICAgICBpZiAoaG90c3dhcERlcGxveW1lbnRSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGhvdHN3YXBEZXBsb3ltZW50UmVzdWx0O1xuICAgICAgfVxuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGluZm8oZm9ybWF0KFxuICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gYSBob3Rzd2FwIGRlcGxveW1lbnQsIGFzIHRoZSBzdGFjayAlcyBjb250YWlucyBub24tQXNzZXQgY2hhbmdlcycsXG4gICAgICAgIHN0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWUsXG4gICAgICApKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENmbkV2YWx1YXRpb25FeGNlcHRpb24pKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoaW5mbyhmb3JtYXQoXG4gICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSBhIGhvdHN3YXAgZGVwbG95bWVudCwgYmVjYXVzZSB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgY291bGQgbm90IGJlIHJlc29sdmVkOiAlcycsXG4gICAgICAgIGZvcm1hdEVycm9yTWVzc2FnZShlKSxcbiAgICAgICkpKTtcbiAgICB9XG5cbiAgICBpZiAoaG90c3dhcE1vZGUgPT09IEhvdHN3YXBNb2RlLkZBTExfQkFDSykge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGluZm8oJ0ZhbGxpbmcgYmFjayB0byBkb2luZyBhIGZ1bGwgZGVwbG95bWVudCcpKTtcbiAgICAgIG9wdGlvbnMuc2RrLmFwcGVuZEN1c3RvbVVzZXJBZ2VudCgnY2RrLWhvdHN3YXAvZmFsbGJhY2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2RpZC1kZXBsb3ktc3RhY2snLFxuICAgICAgICBub09wOiB0cnVlLFxuICAgICAgICBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLFxuICAgICAgICBvdXRwdXRzOiBjbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvdWxkIG5vdCBzaG9ydC1jaXJjdWl0IHRoZSBkZXBsb3ltZW50LCBwZXJmb3JtIGEgZnVsbCBDRk4gZGVwbG95IGluc3RlYWRcbiAgY29uc3QgZnVsbERlcGxveW1lbnQgPSBuZXcgRnVsbENsb3VkRm9ybWF0aW9uRGVwbG95bWVudChcbiAgICBvcHRpb25zLFxuICAgIGNsb3VkRm9ybWF0aW9uU3RhY2ssXG4gICAgc3RhY2tBcnRpZmFjdCxcbiAgICBzdGFja1BhcmFtcyxcbiAgICBib2R5UGFyYW1ldGVyLFxuICAgIGlvSGVscGVyLFxuICApO1xuICByZXR1cm4gZnVsbERlcGxveW1lbnQucGVyZm9ybURlcGxveW1lbnQoKTtcbn1cblxudHlwZSBDb21tb25QcmVwYXJlT3B0aW9ucyA9IGtleW9mIENyZWF0ZVN0YWNrQ29tbWFuZElucHV0ICZcbmtleW9mIFVwZGF0ZVN0YWNrQ29tbWFuZElucHV0ICZcbmtleW9mIENyZWF0ZUNoYW5nZVNldENvbW1hbmRJbnB1dDtcbnR5cGUgQ29tbW9uRXhlY3V0ZU9wdGlvbnMgPSBrZXlvZiBDcmVhdGVTdGFja0NvbW1hbmRJbnB1dCAmXG5rZXlvZiBVcGRhdGVTdGFja0NvbW1hbmRJbnB1dCAmXG5rZXlvZiBFeGVjdXRlQ2hhbmdlU2V0Q29tbWFuZElucHV0O1xuXG4vKipcbiAqIFRoaXMgY2xhc3Mgc2hhcmVzIHN0YXRlIGFuZCBmdW5jdGlvbmFsaXR5IGJldHdlZW4gdGhlIGRpZmZlcmVudCBmdWxsIGRlcGxveW1lbnQgbW9kZXNcbiAqL1xuY2xhc3MgRnVsbENsb3VkRm9ybWF0aW9uRGVwbG95bWVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2ZuOiBJQ2xvdWRGb3JtYXRpb25DbGllbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1dWlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZXBsb3lTdGFja09wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbG91ZEZvcm1hdGlvblN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tQYXJhbXM6IFBhcmFtZXRlclZhbHVlcyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvZHlQYXJhbWV0ZXI6IFRlbXBsYXRlQm9keVBhcmFtZXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcixcbiAgKSB7XG4gICAgdGhpcy5jZm4gPSBvcHRpb25zLnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICAgIHRoaXMuc3RhY2tOYW1lID0gb3B0aW9ucy5kZXBsb3lOYW1lID8/IHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lO1xuXG4gICAgdGhpcy51cGRhdGUgPSBjbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cyAmJiBjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgIT09ICdSRVZJRVdfSU5fUFJPR1JFU1MnO1xuICAgIHRoaXMudmVyYiA9IHRoaXMudXBkYXRlID8gJ3VwZGF0ZScgOiAnY3JlYXRlJztcbiAgICB0aGlzLnV1aWQgPSB1dWlkLnY0KCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybURlcGxveW1lbnQoKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IGRlcGxveW1lbnRNZXRob2QgPSB0aGlzLm9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCA/PyB7XG4gICAgICBtZXRob2Q6ICdjaGFuZ2Utc2V0JyxcbiAgICB9O1xuXG4gICAgaWYgKGRlcGxveW1lbnRNZXRob2QubWV0aG9kID09PSAnZGlyZWN0JyAmJiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzVG9JbXBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0ltcG9ydGluZyByZXNvdXJjZXMgcmVxdWlyZXMgYSBjaGFuZ2VzZXQgZGVwbG95bWVudCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZGVwbG95bWVudE1ldGhvZC5tZXRob2QpIHtcbiAgICAgIGNhc2UgJ2NoYW5nZS1zZXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VTZXREZXBsb3ltZW50KGRlcGxveW1lbnRNZXRob2QpO1xuXG4gICAgICBjYXNlICdkaXJlY3QnOlxuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3REZXBsb3ltZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2VTZXREZXBsb3ltZW50KGRlcGxveW1lbnRNZXRob2Q6IENoYW5nZVNldERlcGxveW1lbnRNZXRob2QpOiBQcm9taXNlPERlcGxveVN0YWNrUmVzdWx0PiB7XG4gICAgY29uc3QgY2hhbmdlU2V0TmFtZSA9IGRlcGxveW1lbnRNZXRob2QuY2hhbmdlU2V0TmFtZSA/PyAnY2RrLWRlcGxveS1jaGFuZ2Utc2V0JztcbiAgICBjb25zdCBleGVjdXRlID0gZGVwbG95bWVudE1ldGhvZC5leGVjdXRlID8/IHRydWU7XG4gICAgY29uc3QgaW1wb3J0RXhpc3RpbmdSZXNvdXJjZXMgPSBkZXBsb3ltZW50TWV0aG9kLmltcG9ydEV4aXN0aW5nUmVzb3VyY2VzID8/IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZVNldERlc2NyaXB0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDaGFuZ2VTZXQoY2hhbmdlU2V0TmFtZSwgZXhlY3V0ZSwgaW1wb3J0RXhpc3RpbmdSZXNvdXJjZXMpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlVGVybWluYXRpb25Qcm90ZWN0aW9uKCk7XG5cbiAgICBpZiAoY2hhbmdlU2V0SGFzTm9DaGFuZ2VzKGNoYW5nZVNldERlc2NyaXB0aW9uKSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoZm9ybWF0KCdObyBjaGFuZ2VzIGFyZSB0byBiZSBwZXJmb3JtZWQgb24gJXMuJywgdGhpcy5zdGFja05hbWUpKSk7XG4gICAgICBpZiAoZXhlY3V0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1Zyhmb3JtYXQoJ0RlbGV0aW5nIGVtcHR5IGNoYW5nZSBzZXQgJXMnLCBjaGFuZ2VTZXREZXNjcmlwdGlvbi5DaGFuZ2VTZXRJZCkpKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jZm4uZGVsZXRlQ2hhbmdlU2V0KHtcbiAgICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICAgIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZvcmNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KHdhcm4oXG4gICAgICAgICAgW1xuICAgICAgICAgICAgJ1lvdSB1c2VkIHRoZSAtLWZvcmNlIGZsYWcsIGJ1dCBDbG91ZEZvcm1hdGlvbiByZXBvcnRlZCB0aGF0IHRoZSBkZXBsb3ltZW50IHdvdWxkIG5vdCBtYWtlIGFueSBjaGFuZ2VzLicsXG4gICAgICAgICAgICAnQWNjb3JkaW5nIHRvIENsb3VkRm9ybWF0aW9uLCBhbGwgcmVzb3VyY2VzIGFyZSBhbHJlYWR5IHVwLXRvLWRhdGUgd2l0aCB0aGUgc3RhdGUgaW4geW91ciBDREsgYXBwLicsXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICdZb3UgY2Fubm90IHVzZSB0aGUgLS1mb3JjZSBmbGFnIHRvIGdldCByaWQgb2YgY2hhbmdlcyB5b3UgbWFkZSBpbiB0aGUgY29uc29sZS4gVHJ5IHVzaW5nJyxcbiAgICAgICAgICAgICdDbG91ZEZvcm1hdGlvbiBkcmlmdCBkZXRlY3Rpb24gaW5zdGVhZDogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvdXNpbmctY2ZuLXN0YWNrLWRyaWZ0Lmh0bWwnLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZGlkLWRlcGxveS1zdGFjaycsXG4gICAgICAgIG5vT3A6IHRydWUsXG4gICAgICAgIG91dHB1dHM6IHRoaXMuY2xvdWRGb3JtYXRpb25TdGFjay5vdXRwdXRzLFxuICAgICAgICBzdGFja0FybjogY2hhbmdlU2V0RGVzY3JpcHRpb24uU3RhY2tJZCEsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghZXhlY3V0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoaW5mbyhmb3JtYXQoXG4gICAgICAgICdDaGFuZ2VzZXQgJXMgY3JlYXRlZCBhbmQgd2FpdGluZyBpbiByZXZpZXcgZm9yIG1hbnVhbCBleGVjdXRpb24gKC0tbm8tZXhlY3V0ZSknLFxuICAgICAgICBjaGFuZ2VTZXREZXNjcmlwdGlvbi5DaGFuZ2VTZXRJZCxcbiAgICAgICkpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdkaWQtZGVwbG95LXN0YWNrJyxcbiAgICAgICAgbm9PcDogZmFsc2UsXG4gICAgICAgIG91dHB1dHM6IHRoaXMuY2xvdWRGb3JtYXRpb25TdGFjay5vdXRwdXRzLFxuICAgICAgICBzdGFja0FybjogY2hhbmdlU2V0RGVzY3JpcHRpb24uU3RhY2tJZCEsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSByZXBsYWNlbWVudHMgaW4gdGhlIGNoYW5nZXNldCwgY2hlY2sgdGhlIHJvbGxiYWNrIGZsYWcgYW5kIHN0YWNrIHN0YXR1c1xuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gaGFzUmVwbGFjZW1lbnQoY2hhbmdlU2V0RGVzY3JpcHRpb24pO1xuICAgIGNvbnN0IGlzUGF1c2VkRmFpbFN0YXRlID0gdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLmlzUm9sbGJhY2thYmxlO1xuICAgIGNvbnN0IHJvbGxiYWNrID0gdGhpcy5vcHRpb25zLnJvbGxiYWNrID8/IHRydWU7XG4gICAgaWYgKGlzUGF1c2VkRmFpbFN0YXRlICYmIHJlcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbHBhdXNlZC1uZWVkLXJvbGxiYWNrLWZpcnN0JywgcmVhc29uOiAncmVwbGFjZW1lbnQnLCBzdGF0dXM6IHRoaXMuY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5uYW1lIH07XG4gICAgfVxuICAgIGlmIChpc1BhdXNlZEZhaWxTdGF0ZSAmJiByb2xsYmFjaykge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxwYXVzZWQtbmVlZC1yb2xsYmFjay1maXJzdCcsIHJlYXNvbjogJ25vdC1ub3JvbGxiYWNrJywgc3RhdHVzOiB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMubmFtZSB9O1xuICAgIH1cbiAgICBpZiAoIXJvbGxiYWNrICYmIHJlcGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAncmVwbGFjZW1lbnQtcmVxdWlyZXMtcm9sbGJhY2snIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUNoYW5nZVNldChjaGFuZ2VTZXREZXNjcmlwdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNoYW5nZVNldChjaGFuZ2VTZXROYW1lOiBzdHJpbmcsIHdpbGxFeGVjdXRlOiBib29sZWFuLCBpbXBvcnRFeGlzdGluZ1Jlc291cmNlczogYm9vbGVhbikge1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cE9sZENoYW5nZXNldChjaGFuZ2VTZXROYW1lKTtcblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGBBdHRlbXB0aW5nIHRvIGNyZWF0ZSBDaGFuZ2VTZXQgd2l0aCBuYW1lICR7Y2hhbmdlU2V0TmFtZX0gdG8gJHt0aGlzLnZlcmJ9IHN0YWNrICR7dGhpcy5zdGFja05hbWV9YCkpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGluZm8oZm9ybWF0KCclczogY3JlYXRpbmcgQ2xvdWRGb3JtYXRpb24gY2hhbmdlc2V0Li4uJywgY2hhbGsuYm9sZCh0aGlzLnN0YWNrTmFtZSkpKSk7XG4gICAgY29uc3QgY2hhbmdlU2V0ID0gYXdhaXQgdGhpcy5jZm4uY3JlYXRlQ2hhbmdlU2V0KHtcbiAgICAgIFN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICBDaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXROYW1lLFxuICAgICAgQ2hhbmdlU2V0VHlwZTogdGhpcy5vcHRpb25zLnJlc291cmNlc1RvSW1wb3J0ID8gJ0lNUE9SVCcgOiB0aGlzLnVwZGF0ZSA/ICdVUERBVEUnIDogJ0NSRUFURScsXG4gICAgICBSZXNvdXJjZXNUb0ltcG9ydDogdGhpcy5vcHRpb25zLnJlc291cmNlc1RvSW1wb3J0LFxuICAgICAgRGVzY3JpcHRpb246IGBDREsgQ2hhbmdlc2V0IGZvciBleGVjdXRpb24gJHt0aGlzLnV1aWR9YCxcbiAgICAgIENsaWVudFRva2VuOiBgY3JlYXRlJHt0aGlzLnV1aWR9YCxcbiAgICAgIEltcG9ydEV4aXN0aW5nUmVzb3VyY2VzOiBpbXBvcnRFeGlzdGluZ1Jlc291cmNlcyxcbiAgICAgIC4uLnRoaXMuY29tbW9uUHJlcGFyZU9wdGlvbnMoKSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGZvcm1hdCgnSW5pdGlhdGVkIGNyZWF0aW9uIG9mIGNoYW5nZXNldDogJXM7IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaCBjcmVhdGluZy4uLicsIGNoYW5nZVNldC5JZCkpKTtcbiAgICAvLyBGZXRjaGluZyBhbGwgcGFnZXMgaWYgd2UnbGwgZXhlY3V0ZSwgc28gd2UgY2FuIGhhdmUgdGhlIGNvcnJlY3QgY2hhbmdlIGNvdW50IHdoZW4gbW9uaXRvcmluZy5cbiAgICByZXR1cm4gd2FpdEZvckNoYW5nZVNldCh0aGlzLmNmbiwgdGhpcy5pb0hlbHBlciwgdGhpcy5zdGFja05hbWUsIGNoYW5nZVNldE5hbWUsIHtcbiAgICAgIGZldGNoQWxsOiB3aWxsRXhlY3V0ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNoYW5nZVNldChjaGFuZ2VTZXQ6IERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZE91dHB1dCk6IFByb21pc2U8U3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoZm9ybWF0KCdJbml0aWF0aW5nIGV4ZWN1dGlvbiBvZiBjaGFuZ2VzZXQgJXMgb24gc3RhY2sgJXMnLCBjaGFuZ2VTZXQuQ2hhbmdlU2V0SWQsIHRoaXMuc3RhY2tOYW1lKSkpO1xuXG4gICAgYXdhaXQgdGhpcy5jZm4uZXhlY3V0ZUNoYW5nZVNldCh7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0LkNoYW5nZVNldE5hbWUhLFxuICAgICAgQ2xpZW50UmVxdWVzdFRva2VuOiBgZXhlYyR7dGhpcy51dWlkfWAsXG4gICAgICAuLi50aGlzLmNvbW1vbkV4ZWN1dGVPcHRpb25zKCksXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShkZWJ1ZyhcbiAgICAgIGZvcm1hdChcbiAgICAgICAgJ0V4ZWN1dGlvbiBvZiBjaGFuZ2VzZXQgJXMgb24gc3RhY2sgJXMgaGFzIHN0YXJ0ZWQ7IHdhaXRpbmcgZm9yIHRoZSB1cGRhdGUgdG8gY29tcGxldGUuLi4nLFxuICAgICAgICBjaGFuZ2VTZXQuQ2hhbmdlU2V0SWQsXG4gICAgICAgIHRoaXMuc3RhY2tOYW1lLFxuICAgICAgKSxcbiAgICApKTtcblxuICAgIC8vICsxIGZvciB0aGUgZXh0cmEgZXZlbnQgZW1pdHRlZCBmcm9tIHVwZGF0ZXMuXG4gICAgY29uc3QgY2hhbmdlU2V0TGVuZ3RoOiBudW1iZXIgPSAoY2hhbmdlU2V0LkNoYW5nZXMgPz8gW10pLmxlbmd0aCArICh0aGlzLnVwZGF0ZSA/IDEgOiAwKTtcbiAgICByZXR1cm4gdGhpcy5tb25pdG9yRGVwbG95bWVudChjaGFuZ2VTZXQuQ3JlYXRpb25UaW1lISwgY2hhbmdlU2V0TGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cE9sZENoYW5nZXNldChjaGFuZ2VTZXROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cykge1xuICAgICAgLy8gRGVsZXRlIGFueSBleGlzdGluZyBjaGFuZ2Ugc2V0cyBnZW5lcmF0ZWQgYnkgQ0RLIHNpbmNlIGNoYW5nZSBzZXQgbmFtZXMgbXVzdCBiZSB1bmlxdWUuXG4gICAgICAvLyBUaGUgZGVsZXRlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCBhcyBsb25nIGFzIHRoZSBzdGFjayBleGlzdHMgKGV2ZW4gaWYgdGhlIGNoYW5nZSBzZXQgZG9lcyBub3QgZXhpc3QpLlxuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoYFJlbW92aW5nIGV4aXN0aW5nIGNoYW5nZSBzZXQgd2l0aCBuYW1lICR7Y2hhbmdlU2V0TmFtZX0gaWYgaXQgZXhpc3RzYCkpO1xuICAgICAgYXdhaXQgdGhpcy5jZm4uZGVsZXRlQ2hhbmdlU2V0KHtcbiAgICAgICAgU3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVGVybWluYXRpb25Qcm90ZWN0aW9uKCkge1xuICAgIC8vIFVwZGF0ZSB0ZXJtaW5hdGlvbiBwcm90ZWN0aW9uIG9ubHkgaWYgaXQgaGFzIGNoYW5nZWQuXG4gICAgY29uc3QgdGVybWluYXRpb25Qcm90ZWN0aW9uID0gdGhpcy5zdGFja0FydGlmYWN0LnRlcm1pbmF0aW9uUHJvdGVjdGlvbiA/PyBmYWxzZTtcbiAgICBpZiAoISF0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uICE9PSB0ZXJtaW5hdGlvblByb3RlY3Rpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKFxuICAgICAgICBmb3JtYXQgKFxuICAgICAgICAgICdVcGRhdGluZyB0ZXJtaW5hdGlvbiBwcm90ZWN0aW9uIGZyb20gJXMgdG8gJXMgZm9yIHN0YWNrICVzJyxcbiAgICAgICAgICB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uLFxuICAgICAgICAgIHRlcm1pbmF0aW9uUHJvdGVjdGlvbixcbiAgICAgICAgICB0aGlzLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICkpO1xuICAgICAgYXdhaXQgdGhpcy5jZm4udXBkYXRlVGVybWluYXRpb25Qcm90ZWN0aW9uKHtcbiAgICAgICAgU3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgICAgRW5hYmxlVGVybWluYXRpb25Qcm90ZWN0aW9uOiB0ZXJtaW5hdGlvblByb3RlY3Rpb24sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KGRlYnVnKGZvcm1hdCgnVGVybWluYXRpb24gcHJvdGVjdGlvbiB1cGRhdGVkIHRvICVzIGZvciBzdGFjayAlcycsIHRlcm1pbmF0aW9uUHJvdGVjdGlvbiwgdGhpcy5zdGFja05hbWUpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXJlY3REZXBsb3ltZW50KCk6IFByb21pc2U8U3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoaW5mbyhmb3JtYXQoJyVzOiAlcyBzdGFjay4uLicsIGNoYWxrLmJvbGQodGhpcy5zdGFja05hbWUpLCB0aGlzLnVwZGF0ZSA/ICd1cGRhdGluZycgOiAnY3JlYXRpbmcnKSkpO1xuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcblxuICAgIGlmICh0aGlzLnVwZGF0ZSkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVUZXJtaW5hdGlvblByb3RlY3Rpb24oKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jZm4udXBkYXRlU3RhY2soe1xuICAgICAgICAgIFN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICAgICAgQ2xpZW50UmVxdWVzdFRva2VuOiBgdXBkYXRlJHt0aGlzLnV1aWR9YCxcbiAgICAgICAgICAuLi50aGlzLmNvbW1vblByZXBhcmVPcHRpb25zKCksXG4gICAgICAgICAgLi4udGhpcy5jb21tb25FeGVjdXRlT3B0aW9ucygpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ05vIHVwZGF0ZXMgYXJlIHRvIGJlIHBlcmZvcm1lZC4nKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoZGVidWcoZm9ybWF0KCdObyB1cGRhdGVzIGFyZSB0byBiZSBwZXJmb3JtZWQgZm9yIHN0YWNrICVzJywgdGhpcy5zdGFja05hbWUpKSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdkaWQtZGVwbG95LXN0YWNrJyxcbiAgICAgICAgICAgIG5vT3A6IHRydWUsXG4gICAgICAgICAgICBvdXRwdXRzOiB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2sub3V0cHV0cyxcbiAgICAgICAgICAgIHN0YWNrQXJuOiB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tJZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMubW9uaXRvckRlcGxveW1lbnQoc3RhcnRUaW1lLCB1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUYWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHdlIGNhbiBzZXQgdGVybWluYXRpb24gcHJvdGVjdGlvbiBkdXJpbmcgY3JlYXRlXG4gICAgICBjb25zdCB0ZXJtaW5hdGlvblByb3RlY3Rpb24gPSB0aGlzLnN0YWNrQXJ0aWZhY3QudGVybWluYXRpb25Qcm90ZWN0aW9uID8/IGZhbHNlO1xuXG4gICAgICBhd2FpdCB0aGlzLmNmbi5jcmVhdGVTdGFjayh7XG4gICAgICAgIFN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogYGNyZWF0ZSR7dGhpcy51dWlkfWAsXG4gICAgICAgIC4uLih0ZXJtaW5hdGlvblByb3RlY3Rpb24gPyB7IEVuYWJsZVRlcm1pbmF0aW9uUHJvdGVjdGlvbjogdHJ1ZSB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgLi4udGhpcy5jb21tb25QcmVwYXJlT3B0aW9ucygpLFxuICAgICAgICAuLi50aGlzLmNvbW1vbkV4ZWN1dGVPcHRpb25zKCksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRoaXMubW9uaXRvckRlcGxveW1lbnQoc3RhcnRUaW1lLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbW9uaXRvckRlcGxveW1lbnQoc3RhcnRUaW1lOiBEYXRlLCBleHBlY3RlZENoYW5nZXM6IG51bWJlciB8IHVuZGVmaW5lZCk6IFByb21pc2U8U3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0PiB7XG4gICAgY29uc3QgbW9uaXRvciA9IG5ldyBTdGFja0FjdGl2aXR5TW9uaXRvcih7XG4gICAgICBjZm46IHRoaXMuY2ZuLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2tBcnRpZmFjdCxcbiAgICAgIHN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICByZXNvdXJjZXNUb3RhbDogZXhwZWN0ZWRDaGFuZ2VzLFxuICAgICAgaW9IZWxwZXI6IHRoaXMuaW9IZWxwZXIsXG4gICAgICBjaGFuZ2VTZXRDcmVhdGlvblRpbWU6IHN0YXJ0VGltZSxcbiAgICB9KTtcbiAgICBhd2FpdCBtb25pdG9yLnN0YXJ0KCk7XG5cbiAgICBsZXQgZmluYWxTdGF0ZSA9IHRoaXMuY2xvdWRGb3JtYXRpb25TdGFjaztcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VjY2Vzc1N0YWNrID0gYXdhaXQgd2FpdEZvclN0YWNrRGVwbG95KHRoaXMuY2ZuLCB0aGlzLmlvSGVscGVyLCB0aGlzLnN0YWNrTmFtZSk7XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4sIGJ1dCBjYXRjaCBpdCBhbnl3YXkuIFlvdSBuZXZlciBrbm93LlxuICAgICAgaWYgKCFzdWNjZXNzU3RhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignU3RhY2sgZGVwbG95IGZhaWxlZCAodGhlIHN0YWNrIGRpc2FwcGVhcmVkIHdoaWxlIHdlIHdlcmUgZGVwbG95aW5nIGl0KScpO1xuICAgICAgfVxuICAgICAgZmluYWxTdGF0ZSA9IHN1Y2Nlc3NTdGFjaztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3Ioc3VmZml4V2l0aEVycm9ycyhmb3JtYXRFcnJvck1lc3NhZ2UoZSksIG1vbml0b3IuZXJyb3JzKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IG1vbml0b3Iuc3RvcCgpO1xuICAgIH1cbiAgICBkZWJ1Zyhmb3JtYXQoJ1N0YWNrICVzIGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcnLCB0aGlzLnN0YWNrTmFtZSkpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZGlkLWRlcGxveS1zdGFjaycsXG4gICAgICBub09wOiBmYWxzZSxcbiAgICAgIG91dHB1dHM6IGZpbmFsU3RhdGUub3V0cHV0cyxcbiAgICAgIHN0YWNrQXJuOiBmaW5hbFN0YXRlLnN0YWNrSWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9wdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gQ3JlYXRlU3RhY2ssIFVwZGF0ZVN0YWNrIGFuZCBDcmVhdGVDaGFuZ2VTZXRcbiAgICovXG4gIHByaXZhdGUgY29tbW9uUHJlcGFyZU9wdGlvbnMoKTogUGFydGlhbDxQaWNrPFVwZGF0ZVN0YWNrQ29tbWFuZElucHV0LCBDb21tb25QcmVwYXJlT3B0aW9ucz4+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQ2FwYWJpbGl0aWVzOiBbJ0NBUEFCSUxJVFlfSUFNJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJywgJ0NBUEFCSUxJVFlfQVVUT19FWFBBTkQnXSxcbiAgICAgIE5vdGlmaWNhdGlvbkFSTnM6IHRoaXMub3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgUGFyYW1ldGVyczogdGhpcy5zdGFja1BhcmFtcy5hcGlQYXJhbWV0ZXJzLFxuICAgICAgUm9sZUFSTjogdGhpcy5vcHRpb25zLnJvbGVBcm4sXG4gICAgICBUZW1wbGF0ZUJvZHk6IHRoaXMuYm9keVBhcmFtZXRlci5UZW1wbGF0ZUJvZHksXG4gICAgICBUZW1wbGF0ZVVSTDogdGhpcy5ib2R5UGFyYW1ldGVyLlRlbXBsYXRlVVJMLFxuICAgICAgVGFnczogdGhpcy5vcHRpb25zLnRhZ3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9wdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gVXBkYXRlU3RhY2sgYW5kIENyZWF0ZUNoYW5nZVNldFxuICAgKlxuICAgKiBCZSBjYXJlZnVsIG5vdCB0byBhZGQgaW4ga2V5cyBmb3Igb3B0aW9ucyB0aGF0IGFyZW4ndCB1c2VkLCBhcyB0aGUgZmVhdHVyZXMgbWF5IG5vdCBoYXZlIGJlZW5cbiAgICogZGVwbG95ZWQgZXZlcnl3aGVyZSB5ZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbW1vbkV4ZWN1dGVPcHRpb25zKCk6IFBhcnRpYWw8UGljazxVcGRhdGVTdGFja0NvbW1hbmRJbnB1dCwgQ29tbW9uRXhlY3V0ZU9wdGlvbnM+PiB7XG4gICAgY29uc3Qgc2hvdWxkRGlzYWJsZVJvbGxiYWNrID0gdGhpcy5vcHRpb25zLnJvbGxiYWNrID09PSBmYWxzZTtcblxuICAgIHJldHVybiB7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgLi4uKHNob3VsZERpc2FibGVSb2xsYmFjayA/IHsgRGlzYWJsZVJvbGxiYWNrOiB0cnVlIH0gOiB1bmRlZmluZWQpLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXN0cm95U3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBiZSBkZXN0cm95ZWRcbiAgICovXG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgc2RrOiBTREs7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXN0cm95U3RhY2sob3B0aW9uczogRGVzdHJveVN0YWNrT3B0aW9ucywgaW9IZWxwZXI6IElvSGVscGVyKSB7XG4gIGNvbnN0IGRlcGxveU5hbWUgPSBvcHRpb25zLmRlcGxveU5hbWUgfHwgb3B0aW9ucy5zdGFjay5zdGFja05hbWU7XG4gIGNvbnN0IGNmbiA9IG9wdGlvbnMuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG5cbiAgY29uc3QgY3VycmVudFN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoY2ZuLCBkZXBsb3lOYW1lKTtcbiAgaWYgKCFjdXJyZW50U3RhY2suZXhpc3RzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG1vbml0b3IgPSBuZXcgU3RhY2tBY3Rpdml0eU1vbml0b3Ioe1xuICAgIGNmbixcbiAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICBzdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgaW9IZWxwZXI6IGlvSGVscGVyLFxuICB9KTtcbiAgYXdhaXQgbW9uaXRvci5zdGFydCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY2ZuLmRlbGV0ZVN0YWNrKHsgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLCBSb2xlQVJOOiBvcHRpb25zLnJvbGVBcm4gfSk7XG4gICAgY29uc3QgZGVzdHJveWVkU3RhY2sgPSBhd2FpdCB3YWl0Rm9yU3RhY2tEZWxldGUoY2ZuLCBpb0hlbHBlciwgZGVwbG95TmFtZSk7XG4gICAgaWYgKGRlc3Ryb3llZFN0YWNrICYmIGRlc3Ryb3llZFN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgIT09ICdERUxFVEVfQ09NUExFVEUnKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gZGVzdHJveSAke2RlcGxveU5hbWV9OiAke2Rlc3Ryb3llZFN0YWNrLnN0YWNrU3RhdHVzfWApO1xuICAgIH1cbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihzdWZmaXhXaXRoRXJyb3JzKGZvcm1hdEVycm9yTWVzc2FnZShlKSwgbW9uaXRvci5lcnJvcnMpKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAobW9uaXRvcikge1xuICAgICAgYXdhaXQgbW9uaXRvci5zdG9wKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgd2UgY2FuIHNraXAgZGVwbG95bWVudFxuICpcbiAqIFdlIGRvIHRoaXMgaW4gYSBjb21wbGljYXRlZCB3YXkgYnkgcHJlcHJvY2Vzc2luZyAoaW5zdGVhZCBvZiBqdXN0XG4gKiBsb29raW5nIGF0IHRoZSBjaGFuZ2VzZXQpLCBiZWNhdXNlIGlmIHRoZXJlIGFyZSBuZXN0ZWQgc3RhY2tzIGludm9sdmVkXG4gKiB0aGUgY2hhbmdlc2V0IHdpbGwgYWx3YXlzIHNob3cgdGhlIG5lc3RlZCBzdGFja3MgYXMgbmVlZGluZyB0byBiZVxuICogdXBkYXRlZCwgYW5kIHRoZSBkZXBsb3ltZW50IHdpbGwgdGFrZSBhIGxvbmcgdGltZSB0byBpbiBlZmZlY3Qgbm90XG4gKiBkbyBhbnl0aGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FuU2tpcERlcGxveShcbiAgZGVwbG95U3RhY2tPcHRpb25zOiBEZXBsb3lTdGFja09wdGlvbnMsXG4gIGNsb3VkRm9ybWF0aW9uU3RhY2s6IENsb3VkRm9ybWF0aW9uU3RhY2ssXG4gIHBhcmFtZXRlckNoYW5nZXM6IFBhcmFtZXRlckNoYW5nZXMsXG4gIGlvSGVscGVyOiBJb0hlbHBlcixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZXBsb3lOYW1lID0gZGVwbG95U3RhY2tPcHRpb25zLmRlcGxveU5hbWUgfHwgZGVwbG95U3RhY2tPcHRpb25zLnN0YWNrLnN0YWNrTmFtZTtcbiAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2RlcGxveU5hbWV9OiBjaGVja2luZyBpZiB3ZSBjYW4gc2tpcCBkZXBsb3lgKSk7XG5cbiAgLy8gRm9yY2VkIGRlcGxveVxuICBpZiAoZGVwbG95U3RhY2tPcHRpb25zLmZvcmNlKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2RlcGxveU5hbWV9OiBmb3JjZWQgZGVwbG95bWVudGApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDcmVhdGluZyBjaGFuZ2VzZXQgb25seSAoZGVmYXVsdCB0cnVlKSwgbmV2ZXIgc2tpcFxuICBpZiAoXG4gICAgZGVwbG95U3RhY2tPcHRpb25zLmRlcGxveW1lbnRNZXRob2Q/Lm1ldGhvZCA9PT0gJ2NoYW5nZS1zZXQnICYmXG4gICAgZGVwbG95U3RhY2tPcHRpb25zLmRlcGxveW1lbnRNZXRob2QuZXhlY3V0ZSA9PT0gZmFsc2VcbiAgKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2RlcGxveU5hbWV9OiAtLW5vLWV4ZWN1dGUsIGFsd2F5cyBjcmVhdGluZyBjaGFuZ2Ugc2V0YCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIE5vIGV4aXN0aW5nIHN0YWNrXG4gIGlmICghY2xvdWRGb3JtYXRpb25TdGFjay5leGlzdHMpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoZGVidWcoYCR7ZGVwbG95TmFtZX06IG5vIGV4aXN0aW5nIHN0YWNrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlbXBsYXRlIGhhcyBjaGFuZ2VkIChhc3NldHMgdGFrZW4gaW50byBhY2NvdW50IGhlcmUpXG4gIGlmIChKU09OLnN0cmluZ2lmeShkZXBsb3lTdGFja09wdGlvbnMuc3RhY2sudGVtcGxhdGUpICE9PSBKU09OLnN0cmluZ2lmeShhd2FpdCBjbG91ZEZvcm1hdGlvblN0YWNrLnRlbXBsYXRlKCkpKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2RlcGxveU5hbWV9OiB0ZW1wbGF0ZSBoYXMgY2hhbmdlZGApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUYWdzIGhhdmUgY2hhbmdlZFxuICBpZiAoIWNvbXBhcmVUYWdzKGNsb3VkRm9ybWF0aW9uU3RhY2sudGFncywgZGVwbG95U3RhY2tPcHRpb25zLnRhZ3MgPz8gW10pKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2RlcGxveU5hbWV9OiB0YWdzIGhhdmUgY2hhbmdlZGApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBOb3RpZmljYXRpb24gYXJucyBoYXZlIGNoYW5nZWRcbiAgaWYgKCFhcnJheUVxdWFscyhjbG91ZEZvcm1hdGlvblN0YWNrLm5vdGlmaWNhdGlvbkFybnMsIGRlcGxveVN0YWNrT3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zID8/IFtdKSkge1xuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogbm90aWZpY2F0aW9uIGFybnMgaGF2ZSBjaGFuZ2VkYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlcm1pbmF0aW9uIHByb3RlY3Rpb24gaGFzIGJlZW4gdXBkYXRlZFxuICBpZiAoISFkZXBsb3lTdGFja09wdGlvbnMuc3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uICE9PSAhIWNsb3VkRm9ybWF0aW9uU3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KGRlYnVnKGAke2RlcGxveU5hbWV9OiB0ZXJtaW5hdGlvbiBwcm90ZWN0aW9uIGhhcyBiZWVuIHVwZGF0ZWRgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gUGFyYW1ldGVycyBoYXZlIGNoYW5nZWRcbiAgaWYgKHBhcmFtZXRlckNoYW5nZXMpIHtcbiAgICBpZiAocGFyYW1ldGVyQ2hhbmdlcyA9PT0gJ3NzbScpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogc29tZSBwYXJhbWV0ZXJzIGNvbWUgZnJvbSBTU00gc28gd2UgaGF2ZSB0byBhc3N1bWUgdGhleSBtYXkgaGF2ZSBjaGFuZ2VkYCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoZGVidWcoYCR7ZGVwbG95TmFtZX06IHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkYCkpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFeGlzdGluZyBzdGFjayBpcyBpbiBhIGZhaWxlZCBzdGF0ZVxuICBpZiAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5pc0ZhaWx1cmUpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoZGVidWcoYCR7ZGVwbG95TmFtZX06IHN0YWNrIGlzIGluIGEgZmFpbHVyZSBzdGF0ZWApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBXZSBjYW4gc2tpcCBkZXBsb3lcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGxpc3Qgb2YgdGFncywgcmV0dXJucyB0cnVlIGlmIGlkZW50aWNhbC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZVRhZ3MoYTogVGFnW10sIGI6IFRhZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGFUYWcgb2YgYSkge1xuICAgIGNvbnN0IGJUYWcgPSBiLmZpbmQoKHRhZykgPT4gdGFnLktleSA9PT0gYVRhZy5LZXkpO1xuXG4gICAgaWYgKCFiVGFnIHx8IGJUYWcuVmFsdWUgIT09IGFUYWcuVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc3VmZml4V2l0aEVycm9ycyhtc2c6IHN0cmluZywgZXJyb3JzPzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCA/IGAke21zZ306ICR7ZXJyb3JzLmpvaW4oJywgJyl9YCA6IG1zZztcbn1cblxuZnVuY3Rpb24gYXJyYXlFcXVhbHMoYTogYW55W10sIGI6IGFueVtdKTogYm9vbGVhbiB7XG4gIHJldHVybiBhLmV2ZXJ5KChpdGVtKSA9PiBiLmluY2x1ZGVzKGl0ZW0pKSAmJiBiLmV2ZXJ5KChpdGVtKSA9PiBhLmluY2x1ZGVzKGl0ZW0pKTtcbn1cblxuZnVuY3Rpb24gaGFzUmVwbGFjZW1lbnQoY3M6IERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZE91dHB1dCkge1xuICByZXR1cm4gKGNzLkNoYW5nZXMgPz8gW10pLnNvbWUoYyA9PiB7XG4gICAgY29uc3QgYSA9IGMuUmVzb3VyY2VDaGFuZ2U/LlBvbGljeUFjdGlvbjtcbiAgICByZXR1cm4gYSA9PT0gJ1JlcGxhY2VBbmREZWxldGUnIHx8IGEgPT09ICdSZXBsYWNlQW5kUmV0YWluJyB8fCBhID09PSAnUmVwbGFjZUFuZFNuYXBzaG90JztcbiAgfSk7XG59XG4iXX0=
|