@fjall/components-infrastructure 0.88.4 → 0.89.2
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/LICENSE +21 -0
- package/dist/lib/config/aws/disasterRecovery.js +28 -7
- package/dist/lib/patterns/aws/compute.d.ts +6 -716
- package/dist/lib/patterns/aws/compute.js +24 -427
- package/dist/lib/patterns/aws/computeEc2.d.ts +67 -0
- package/dist/lib/patterns/aws/computeEc2.js +46 -0
- package/dist/lib/patterns/aws/computeEcs.d.ts +446 -0
- package/dist/lib/patterns/aws/computeEcs.js +246 -0
- package/dist/lib/patterns/aws/computeLambda.d.ts +220 -0
- package/dist/lib/patterns/aws/computeLambda.js +147 -0
- package/dist/lib/patterns/aws/domainDelegation.d.ts +8 -0
- package/dist/lib/patterns/aws/domainDelegation.js +54 -0
- package/dist/lib/patterns/aws/domainFactory.d.ts +8 -0
- package/dist/lib/patterns/aws/domainFactory.js +23 -0
- package/dist/lib/patterns/aws/index.d.ts +3 -0
- package/dist/lib/patterns/aws/index.js +5 -1
- package/dist/lib/patterns/aws/interfaces/domain.d.ts +2 -0
- package/dist/lib/patterns/aws/interfaces/domain.js +6 -0
- package/dist/lib/patterns/aws/interfaces/index.d.ts +1 -0
- package/dist/lib/patterns/aws/interfaces/index.js +1 -1
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +3 -0
- package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
- package/dist/lib/patterns/aws/payload.js +11 -1
- package/dist/lib/resources/aws/compute/ecs.d.ts +14 -2
- package/dist/lib/resources/aws/compute/ecs.js +69 -24
- package/dist/lib/resources/aws/networking/domain.d.ts +13 -0
- package/dist/lib/resources/aws/networking/domain.js +102 -0
- package/dist/lib/resources/aws/networking/domainCertificate.d.ts +13 -0
- package/dist/lib/resources/aws/networking/domainCertificate.js +28 -0
- package/dist/lib/resources/aws/networking/hostedZone.js +3 -6
- package/dist/lib/resources/aws/networking/index.d.ts +2 -0
- package/dist/lib/resources/aws/networking/index.js +3 -1
- package/dist/lib/utils/capitaliseString.d.ts +1 -18
- package/dist/lib/utils/capitaliseString.js +8 -37
- package/dist/lib/utils/dnsRecords.d.ts +4 -0
- package/dist/lib/utils/dnsRecords.js +108 -0
- package/dist/lib/utils/domainTypes.d.ts +37 -0
- package/dist/lib/utils/domainTypes.js +10 -0
- package/dist/lib/utils/env.js +23 -29
- package/dist/lib/utils/getConfig.js +42 -16
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/package.json +4 -3
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isEc2Compute = exports.isLambdaCompute = exports.isEcsCompute = exports.isCompute = exports.
|
|
3
|
+
exports.isEc2Compute = exports.isLambdaCompute = exports.isEcsCompute = exports.isCompute = exports.ComputeFactory = exports.COMPUTE_DEFAULTS = exports.COMPUTE_TYPE_CONFIG = exports.Ec2Compute = exports.InvokeMode = exports.HttpMethod = exports.Architecture = exports.resolveLambdaDeployment = exports.LambdaCompute = exports.resolveScalingConfig = exports.buildContainerConfigs = exports.validateEcsProps = exports.ScalingType = exports.getEcsCapacityProviderConfig = exports.ECS_CAPACITY_PROVIDER_CONFIG = exports.EcsCompute = void 0;
|
|
4
4
|
exports.getComputeTypeConfig = getComputeTypeConfig;
|
|
5
|
-
exports.getEcsCapacityProviderConfig = getEcsCapacityProviderConfig;
|
|
6
|
-
exports.buildContainerConfigs = buildContainerConfigs;
|
|
7
|
-
exports.resolveScalingConfig = resolveScalingConfig;
|
|
8
|
-
exports.resolveLambdaDeployment = resolveLambdaDeployment;
|
|
9
|
-
const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
|
|
10
|
-
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
11
5
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
12
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
13
|
-
const constructs_1 = require("constructs");
|
|
14
|
-
// Import type-safe interfaces
|
|
15
6
|
const compute_js_1 = require("./interfaces/compute.js");
|
|
16
7
|
Object.defineProperty(exports, "isCompute", { enumerable: true, get: function () { return compute_js_1.isCompute; } });
|
|
17
8
|
Object.defineProperty(exports, "isEcsCompute", { enumerable: true, get: function () { return compute_js_1.isEcsCompute; } });
|
|
18
9
|
Object.defineProperty(exports, "isLambdaCompute", { enumerable: true, get: function () { return compute_js_1.isLambdaCompute; } });
|
|
19
10
|
Object.defineProperty(exports, "isEc2Compute", { enumerable: true, get: function () { return compute_js_1.isEc2Compute; } });
|
|
20
|
-
const connections_js_1 = require("../../utils/connections.js");
|
|
21
11
|
const validationLogger_js_1 = require("../../utils/validationLogger.js");
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
12
|
+
// Import and re-export from per-pattern files
|
|
13
|
+
const computeEcs_js_1 = require("./computeEcs.js");
|
|
14
|
+
Object.defineProperty(exports, "EcsCompute", { enumerable: true, get: function () { return computeEcs_js_1.EcsCompute; } });
|
|
15
|
+
Object.defineProperty(exports, "ECS_CAPACITY_PROVIDER_CONFIG", { enumerable: true, get: function () { return computeEcs_js_1.ECS_CAPACITY_PROVIDER_CONFIG; } });
|
|
16
|
+
Object.defineProperty(exports, "getEcsCapacityProviderConfig", { enumerable: true, get: function () { return computeEcs_js_1.getEcsCapacityProviderConfig; } });
|
|
17
|
+
Object.defineProperty(exports, "ScalingType", { enumerable: true, get: function () { return computeEcs_js_1.ScalingType; } });
|
|
18
|
+
Object.defineProperty(exports, "validateEcsProps", { enumerable: true, get: function () { return computeEcs_js_1.validateEcsProps; } });
|
|
19
|
+
Object.defineProperty(exports, "buildContainerConfigs", { enumerable: true, get: function () { return computeEcs_js_1.buildContainerConfigs; } });
|
|
20
|
+
Object.defineProperty(exports, "resolveScalingConfig", { enumerable: true, get: function () { return computeEcs_js_1.resolveScalingConfig; } });
|
|
21
|
+
const computeLambda_js_1 = require("./computeLambda.js");
|
|
22
|
+
Object.defineProperty(exports, "LambdaCompute", { enumerable: true, get: function () { return computeLambda_js_1.LambdaCompute; } });
|
|
23
|
+
Object.defineProperty(exports, "resolveLambdaDeployment", { enumerable: true, get: function () { return computeLambda_js_1.resolveLambdaDeployment; } });
|
|
24
|
+
Object.defineProperty(exports, "Architecture", { enumerable: true, get: function () { return computeLambda_js_1.Architecture; } });
|
|
25
|
+
Object.defineProperty(exports, "HttpMethod", { enumerable: true, get: function () { return computeLambda_js_1.HttpMethod; } });
|
|
26
|
+
Object.defineProperty(exports, "InvokeMode", { enumerable: true, get: function () { return computeLambda_js_1.InvokeMode; } });
|
|
27
|
+
const computeEc2_js_1 = require("./computeEc2.js");
|
|
28
|
+
Object.defineProperty(exports, "Ec2Compute", { enumerable: true, get: function () { return computeEc2_js_1.Ec2Compute; } });
|
|
26
29
|
exports.COMPUTE_TYPE_CONFIG = {
|
|
27
30
|
ecs: {
|
|
28
31
|
defaultPort: 80,
|
|
@@ -40,20 +43,6 @@ exports.COMPUTE_TYPE_CONFIG = {
|
|
|
40
43
|
requiresVpc: false
|
|
41
44
|
}
|
|
42
45
|
};
|
|
43
|
-
exports.ECS_CAPACITY_PROVIDER_CONFIG = {
|
|
44
|
-
FARGATE: {
|
|
45
|
-
usesSpot: false,
|
|
46
|
-
usesEc2Instances: false
|
|
47
|
-
},
|
|
48
|
-
FARGATE_SPOT: {
|
|
49
|
-
usesSpot: true,
|
|
50
|
-
usesEc2Instances: false
|
|
51
|
-
},
|
|
52
|
-
EC2: {
|
|
53
|
-
usesSpot: false,
|
|
54
|
-
usesEc2Instances: true
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
46
|
/**
|
|
58
47
|
* Default values for compute resource configuration.
|
|
59
48
|
* Centralised constants to ensure consistency across the codebase.
|
|
@@ -73,20 +62,12 @@ exports.COMPUTE_DEFAULTS = {
|
|
|
73
62
|
LAMBDA: {
|
|
74
63
|
HANDLER: "index.handler",
|
|
75
64
|
RUNTIME: aws_lambda_1.Runtime.NODEJS_22_X,
|
|
76
|
-
ARCHITECTURE:
|
|
65
|
+
ARCHITECTURE: computeLambda_js_1.Architecture.ARM_64
|
|
77
66
|
}
|
|
78
67
|
};
|
|
79
68
|
function getComputeTypeConfig(type) {
|
|
80
69
|
return exports.COMPUTE_TYPE_CONFIG[type];
|
|
81
70
|
}
|
|
82
|
-
function getEcsCapacityProviderConfig(provider) {
|
|
83
|
-
return exports.ECS_CAPACITY_PROVIDER_CONFIG[provider];
|
|
84
|
-
}
|
|
85
|
-
// Re-export Lambda types from CDK for user convenience
|
|
86
|
-
var aws_lambda_2 = require("aws-cdk-lib/aws-lambda");
|
|
87
|
-
Object.defineProperty(exports, "Architecture", { enumerable: true, get: function () { return aws_lambda_2.Architecture; } });
|
|
88
|
-
Object.defineProperty(exports, "HttpMethod", { enumerable: true, get: function () { return aws_lambda_2.HttpMethod; } });
|
|
89
|
-
Object.defineProperty(exports, "InvokeMode", { enumerable: true, get: function () { return aws_lambda_2.InvokeMode; } });
|
|
90
71
|
/**
|
|
91
72
|
* Validates compute props and logs warnings for ignored or misconfigured options.
|
|
92
73
|
* These checks help catch issues when props come from dynamic sources where
|
|
@@ -101,142 +82,8 @@ function validateComputeProps(props) {
|
|
|
101
82
|
(0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["ssh", "userData", "machineImage"], "ec2", "EC2 compute");
|
|
102
83
|
// ECS-specific validation - type narrowing handled by discriminated union
|
|
103
84
|
if (props.type === "ecs") {
|
|
104
|
-
validateEcsProps(props);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Validates ECS-specific props.
|
|
109
|
-
* Extracted for clarity and detail parity with database/network patterns.
|
|
110
|
-
*/
|
|
111
|
-
function validateEcsProps(props) {
|
|
112
|
-
// Validate services array exists and is not empty
|
|
113
|
-
if (!props.services || props.services.length === 0) {
|
|
114
|
-
throw new Error("At least one service must be specified in 'services' array.");
|
|
115
|
-
}
|
|
116
|
-
// Validate unique service names
|
|
117
|
-
const serviceNames = props.services.map((s) => s.name);
|
|
118
|
-
const duplicateNames = serviceNames.filter((name, index) => serviceNames.indexOf(name) !== index);
|
|
119
|
-
if (duplicateNames.length > 0) {
|
|
120
|
-
throw new Error(`Duplicate service names: ${[...new Set(duplicateNames)].join(", ")}`);
|
|
121
|
-
}
|
|
122
|
-
// Validate service name format
|
|
123
|
-
const invalidNames = props.services.filter((s) => !/^[a-zA-Z][a-zA-Z0-9-]*$/.test(s.name));
|
|
124
|
-
if (invalidNames.length > 0) {
|
|
125
|
-
throw new Error(`Invalid service names: ${invalidNames.map((s) => s.name).join(", ")}. ` +
|
|
126
|
-
"Service names must start with a letter and contain only letters, numbers, and hyphens.");
|
|
127
|
-
}
|
|
128
|
-
// Validate routing when multiple services have ports
|
|
129
|
-
const servicesWithPorts = props.services.filter((s) => s.containers?.some((c) => c.port));
|
|
130
|
-
if (servicesWithPorts.length > 1) {
|
|
131
|
-
const missingRouting = servicesWithPorts.filter((s) => {
|
|
132
|
-
const rules = Array.isArray(s.routing)
|
|
133
|
-
? s.routing
|
|
134
|
-
: s.routing
|
|
135
|
-
? [s.routing]
|
|
136
|
-
: [];
|
|
137
|
-
return !rules.some((r) => r.path || r.host);
|
|
138
|
-
});
|
|
139
|
-
if (missingRouting.length > 0) {
|
|
140
|
-
throw new Error(`Services with ports require routing config when cluster has multiple services: ` +
|
|
141
|
-
`${missingRouting.map((s) => s.name).join(", ")}. ` +
|
|
142
|
-
"Add routing: { path: '/...' } or routing: { host: '...' } to each service.");
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Validate each service's containers
|
|
146
|
-
for (const service of props.services) {
|
|
147
|
-
if (service.containers && service.containers.length > 0) {
|
|
148
|
-
// Check for duplicate container names within service (only named containers)
|
|
149
|
-
const containerNames = service.containers
|
|
150
|
-
.filter((c) => c.name)
|
|
151
|
-
.map((c) => c.name);
|
|
152
|
-
const duplicateContainerNames = containerNames.filter((name, index) => containerNames.indexOf(name) !== index);
|
|
153
|
-
if (duplicateContainerNames.length > 0) {
|
|
154
|
-
throw new Error(`Service '${service.name}': Duplicate container names: ` +
|
|
155
|
-
`${[...new Set(duplicateContainerNames)].join(", ")}`);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
if (service.capacityProvider === "EC2" && !service.ec2Config) {
|
|
159
|
-
throw new Error(`Service '${service.name}' uses EC2 capacity provider but no ec2Config is defined. ` +
|
|
160
|
-
"Provide ec2Config on the service.");
|
|
161
|
-
}
|
|
162
|
-
// Warn if service ec2Config is defined but capacityProvider is not EC2
|
|
163
|
-
if (service.ec2Config && service.capacityProvider !== "EC2") {
|
|
164
|
-
validationLogger_js_1.FjallLogger.warn(`Service '${service.name}' has ec2Config but capacityProvider is not 'EC2'. ` +
|
|
165
|
-
"The ec2Config will be ignored unless capacityProvider is set to 'EC2'.");
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Build container configurations for an ECS service.
|
|
171
|
-
* Converts user-facing EcsContainerConfig to internal EcsClusterProps format.
|
|
172
|
-
* @internal Exported for testing only
|
|
173
|
-
*/
|
|
174
|
-
function buildContainerConfigs(service) {
|
|
175
|
-
if (service.containers && service.containers.length > 0) {
|
|
176
|
-
return service.containers.map((c, index) => ({
|
|
177
|
-
name: c.name || `${service.name}Container${index > 0 ? index : ""}`,
|
|
178
|
-
image: c.image,
|
|
179
|
-
port: c.port,
|
|
180
|
-
environment: c.environment,
|
|
181
|
-
secrets: c.secrets,
|
|
182
|
-
secretsImport: c.secretsImport,
|
|
183
|
-
command: c.command,
|
|
184
|
-
entryPoint: c.entryPoint,
|
|
185
|
-
essential: c.essential,
|
|
186
|
-
healthCheck: c.healthCheck
|
|
187
|
-
}));
|
|
188
|
-
}
|
|
189
|
-
// Default container (no port = worker)
|
|
190
|
-
return [{ name: `${service.name}Container` }];
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Resolve scaling configuration from service props.
|
|
194
|
-
* Handles the three cases: explicit config, disabled (false), or default (undefined).
|
|
195
|
-
* @internal Exported for testing only
|
|
196
|
-
*/
|
|
197
|
-
function resolveScalingConfig(scaling) {
|
|
198
|
-
if (scaling === false) {
|
|
199
|
-
return {
|
|
200
|
-
scalingType: undefined,
|
|
201
|
-
minCapacity: undefined,
|
|
202
|
-
maxCapacity: undefined
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
if (scaling === undefined) {
|
|
206
|
-
return {
|
|
207
|
-
scalingType: ecs_1.ScalingType.CPU,
|
|
208
|
-
minCapacity: undefined,
|
|
209
|
-
maxCapacity: undefined
|
|
210
|
-
};
|
|
85
|
+
(0, computeEcs_js_1.validateEcsProps)(props);
|
|
211
86
|
}
|
|
212
|
-
return {
|
|
213
|
-
scalingType: scaling.scalingType ?? ecs_1.ScalingType.CPU,
|
|
214
|
-
minCapacity: scaling.minCapacity,
|
|
215
|
-
maxCapacity: scaling.maxCapacity
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Resolve Lambda deployment configuration from props.
|
|
220
|
-
* Handles container vs code deployment types.
|
|
221
|
-
*/
|
|
222
|
-
function resolveLambdaDeployment(props) {
|
|
223
|
-
if (props.deployment === "container") {
|
|
224
|
-
if (!(props.ecrRepository instanceof aws_ecr_1.Repository)) {
|
|
225
|
-
throw new Error("ecrRepository must be a Repository instance for Lambda compute type");
|
|
226
|
-
}
|
|
227
|
-
return {
|
|
228
|
-
code: aws_lambda_1.Code.fromEcrImage(props.ecrRepository, {
|
|
229
|
-
tagOrDigest: exports.COMPUTE_DEFAULTS.ECS.IMAGE_TAG
|
|
230
|
-
}),
|
|
231
|
-
handler: aws_lambda_1.Handler.FROM_IMAGE,
|
|
232
|
-
runtime: aws_lambda_1.Runtime.FROM_IMAGE
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
return {
|
|
236
|
-
code: props.code,
|
|
237
|
-
handler: props.handler || exports.COMPUTE_DEFAULTS.LAMBDA.HANDLER,
|
|
238
|
-
runtime: props.runtime || exports.COMPUTE_DEFAULTS.LAMBDA.RUNTIME
|
|
239
|
-
};
|
|
240
87
|
}
|
|
241
88
|
/**
|
|
242
89
|
* Factory for creating compute resources with type-safe return types.
|
|
@@ -337,7 +184,7 @@ class ComputeFactory {
|
|
|
337
184
|
`/${appName}/${clusterName}/${service.name}`;
|
|
338
185
|
collector.addService(manifestService);
|
|
339
186
|
}
|
|
340
|
-
return new EcsCompute(scope, id, computeProps);
|
|
187
|
+
return new computeEcs_js_1.EcsCompute(scope, id, computeProps);
|
|
341
188
|
}
|
|
342
189
|
case "lambda": {
|
|
343
190
|
// Add appName to props for Lambda (needed for secrets path derivation)
|
|
@@ -359,10 +206,10 @@ class ComputeFactory {
|
|
|
359
206
|
manifestLambda.secrets = lambdaComputeProps.secrets;
|
|
360
207
|
}
|
|
361
208
|
collector.addLambda(manifestLambda);
|
|
362
|
-
return new LambdaCompute(scope, id, lambdaComputeProps);
|
|
209
|
+
return new computeLambda_js_1.LambdaCompute(scope, id, lambdaComputeProps);
|
|
363
210
|
}
|
|
364
211
|
case "ec2":
|
|
365
|
-
return new Ec2Compute(scope, id, computeProps);
|
|
212
|
+
return new computeEc2_js_1.Ec2Compute(scope, id, computeProps);
|
|
366
213
|
default: {
|
|
367
214
|
const _exhaustive = computeProps;
|
|
368
215
|
throw new Error(`Unsupported compute type: ${String(_exhaustive.type)}`);
|
|
@@ -372,254 +219,4 @@ class ComputeFactory {
|
|
|
372
219
|
}
|
|
373
220
|
}
|
|
374
221
|
exports.ComputeFactory = ComputeFactory;
|
|
375
|
-
/**
|
|
376
|
-
* ECS compute wrapper implementing IEcsCompute.
|
|
377
|
-
* Provides type-safe access to ECS-specific resources.
|
|
378
|
-
*/
|
|
379
|
-
class EcsCompute extends constructs_1.Construct {
|
|
380
|
-
constructor(scope, id, props) {
|
|
381
|
-
super(scope, id);
|
|
382
|
-
this.computeType = "ecs";
|
|
383
|
-
// Transform EcsServiceConfig[] to EcsServiceProps[] for EcsCluster
|
|
384
|
-
const services = props.services.map((service) => {
|
|
385
|
-
const containers = buildContainerConfigs(service);
|
|
386
|
-
const { scalingType, minCapacity, maxCapacity } = resolveScalingConfig(service.scaling);
|
|
387
|
-
return {
|
|
388
|
-
name: service.name,
|
|
389
|
-
image: service.image,
|
|
390
|
-
containers,
|
|
391
|
-
cpu: service.cpu,
|
|
392
|
-
memoryLimitMiB: service.memoryLimitMiB,
|
|
393
|
-
desiredCount: service.desiredCount,
|
|
394
|
-
scalingType,
|
|
395
|
-
minCapacity,
|
|
396
|
-
maxCapacity,
|
|
397
|
-
routing: service.routing,
|
|
398
|
-
taskRoleInlinePolicies: service.taskRoleInlinePolicies,
|
|
399
|
-
taskRoleManagedPolicies: service.taskRoleManagedPolicies,
|
|
400
|
-
connections: service.connections,
|
|
401
|
-
capacityProvider: service.capacityProvider,
|
|
402
|
-
ec2Config: service.ec2Config,
|
|
403
|
-
ssmSecretsPath: service.ssmSecretsPath,
|
|
404
|
-
dockerTarget: service.dockerTarget
|
|
405
|
-
};
|
|
406
|
-
});
|
|
407
|
-
// Build cluster config
|
|
408
|
-
const cluster = props.cluster
|
|
409
|
-
? {
|
|
410
|
-
domain: props.cluster.domain,
|
|
411
|
-
loadBalancer: props.cluster.loadBalancer,
|
|
412
|
-
directAccess: props.cluster.directAccess,
|
|
413
|
-
domainConfig: props.cluster.domainConfig
|
|
414
|
-
}
|
|
415
|
-
: undefined;
|
|
416
|
-
const ecsProps = {
|
|
417
|
-
clusterName: id,
|
|
418
|
-
appName: props.appName,
|
|
419
|
-
vpc: props.vpc,
|
|
420
|
-
ecrRepository: props.ecrRepository || exports.COMPUTE_DEFAULTS.ECS.FALLBACK_IMAGE,
|
|
421
|
-
cluster,
|
|
422
|
-
services
|
|
423
|
-
};
|
|
424
|
-
this.ecsCluster = new ecs_1.default(scope, `${id}Ecs`, ecsProps);
|
|
425
|
-
this.connections = this.ecsCluster.connections;
|
|
426
|
-
}
|
|
427
|
-
/** Get the ECS cluster. */
|
|
428
|
-
getCluster() {
|
|
429
|
-
return this.ecsCluster.getCluster();
|
|
430
|
-
}
|
|
431
|
-
/** Get the Application Load Balancer if one was created. */
|
|
432
|
-
getLoadBalancer() {
|
|
433
|
-
return this.ecsCluster.getLoadBalancer();
|
|
434
|
-
}
|
|
435
|
-
/** Get a specific service by name. */
|
|
436
|
-
getService(name) {
|
|
437
|
-
return this.ecsCluster.getService(name);
|
|
438
|
-
}
|
|
439
|
-
/** Get all services in the cluster. */
|
|
440
|
-
getAllServices() {
|
|
441
|
-
const servicesMap = this.ecsCluster.getServices();
|
|
442
|
-
return Array.from(servicesMap.values());
|
|
443
|
-
}
|
|
444
|
-
/** Get the security group for the cluster. */
|
|
445
|
-
getSecurityGroup() {
|
|
446
|
-
// Return the first security group from connections
|
|
447
|
-
const securityGroups = this.connections.securityGroups;
|
|
448
|
-
if (securityGroups.length === 0) {
|
|
449
|
-
throw new Error("No security groups found for ECS cluster");
|
|
450
|
-
}
|
|
451
|
-
return securityGroups[0];
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Get the ALB listener if this is an ECS compute with ALB.
|
|
455
|
-
*/
|
|
456
|
-
getListener() {
|
|
457
|
-
return this.ecsCluster.getListener();
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Get the underlying ECS cluster construct.
|
|
461
|
-
*/
|
|
462
|
-
getEcsCluster() {
|
|
463
|
-
return this.ecsCluster;
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* Grants ecs:ExecuteCommand permission for ECS services.
|
|
467
|
-
* Uses wildcard resource because ecs:ExecuteCommand targets task ARNs
|
|
468
|
-
* which are not known until runtime (tasks are ephemeral).
|
|
469
|
-
*/
|
|
470
|
-
grantExecuteCommand(grantee) {
|
|
471
|
-
return aws_iam_1.Grant.addToPrincipal({
|
|
472
|
-
grantee,
|
|
473
|
-
actions: ["ecs:ExecuteCommand"],
|
|
474
|
-
resourceArns: ["*"]
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
exports.EcsCompute = EcsCompute;
|
|
479
|
-
/**
|
|
480
|
-
* Lambda compute wrapper implementing ILambdaCompute.
|
|
481
|
-
* Provides type-safe access to Lambda-specific resources.
|
|
482
|
-
*/
|
|
483
|
-
class LambdaCompute extends constructs_1.Construct {
|
|
484
|
-
constructor(scope, id, props) {
|
|
485
|
-
super(scope, id);
|
|
486
|
-
this.computeType = "lambda";
|
|
487
|
-
const { code, handler, runtime } = resolveLambdaDeployment(props);
|
|
488
|
-
// Convert presence-based functionUrl config to legacy boolean format
|
|
489
|
-
const functionUrlConfig = props.functionUrl;
|
|
490
|
-
const enableFunctionUrl = functionUrlConfig !== undefined && functionUrlConfig !== false;
|
|
491
|
-
const functionUrlAuthType = enableFunctionUrl && typeof functionUrlConfig === "object"
|
|
492
|
-
? functionUrlConfig.authType
|
|
493
|
-
: undefined;
|
|
494
|
-
const functionUrlCors = enableFunctionUrl && typeof functionUrlConfig === "object"
|
|
495
|
-
? functionUrlConfig.cors
|
|
496
|
-
: undefined;
|
|
497
|
-
const functionUrlInvokeMode = enableFunctionUrl && typeof functionUrlConfig === "object"
|
|
498
|
-
? functionUrlConfig.invokeMode
|
|
499
|
-
: undefined;
|
|
500
|
-
const lambdaProps = {
|
|
501
|
-
code,
|
|
502
|
-
vpc: props.vpc,
|
|
503
|
-
handler,
|
|
504
|
-
runtime,
|
|
505
|
-
architecture: props.architecture ?? exports.COMPUTE_DEFAULTS.LAMBDA.ARCHITECTURE,
|
|
506
|
-
timeout: props.timeout,
|
|
507
|
-
memorySize: props.memorySize,
|
|
508
|
-
lambdaDescription: props.description,
|
|
509
|
-
roleDescription: props.roleDescription,
|
|
510
|
-
inlinePolicy: props.inlinePolicy || [],
|
|
511
|
-
enableFunctionUrl,
|
|
512
|
-
functionUrlAuthType,
|
|
513
|
-
functionUrlCors,
|
|
514
|
-
functionUrlInvokeMode,
|
|
515
|
-
scheduleExpression: props.scheduleExpression,
|
|
516
|
-
ephemeralStorageSize: props.ephemeralStorageSize,
|
|
517
|
-
secrets: props.secrets,
|
|
518
|
-
ssmSecretsPath: props.ssmSecretsPath,
|
|
519
|
-
secretsImport: props.secretsImport,
|
|
520
|
-
environment: props.environment,
|
|
521
|
-
appName: props.appName,
|
|
522
|
-
functionName: id
|
|
523
|
-
};
|
|
524
|
-
this.lambdaFunction = new lambda_1.LambdaFunction(scope, `${id}Lambda`, lambdaProps);
|
|
525
|
-
// CDK's Function.connections getter throws for non-VPC Lambdas, so only
|
|
526
|
-
// access it when a VPC is configured. Non-VPC Lambdas get an empty
|
|
527
|
-
// Connections object to satisfy the IConnectable interface.
|
|
528
|
-
this.connections = props.vpc
|
|
529
|
-
? this.lambdaFunction.connections
|
|
530
|
-
: new aws_ec2_1.Connections();
|
|
531
|
-
// Process connections using the unified connector interface
|
|
532
|
-
if (props.connections && props.connections.length > 0) {
|
|
533
|
-
if (!props.vpc) {
|
|
534
|
-
throw new Error(`Lambda '${id}' has connections configured but no VPC. ` +
|
|
535
|
-
"A VPC is required for security group connections.");
|
|
536
|
-
}
|
|
537
|
-
try {
|
|
538
|
-
(0, connections_js_1.processConnections)(props.connections, this.lambdaFunction, // IGrantable (execution role)
|
|
539
|
-
this.lambdaFunction // IConnectable (security group)
|
|
540
|
-
);
|
|
541
|
-
}
|
|
542
|
-
catch (error) {
|
|
543
|
-
throw new Error(`Failed to process connections for Lambda '${id}': ${error instanceof Error ? error.message : String(error)}`);
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
/**
|
|
548
|
-
* Get a Lambda function by name.
|
|
549
|
-
* Since we only have one function, name is ignored.
|
|
550
|
-
*/
|
|
551
|
-
getFunction(_name) {
|
|
552
|
-
return this.lambdaFunction;
|
|
553
|
-
}
|
|
554
|
-
/** Get all Lambda functions. */
|
|
555
|
-
getAllFunctions() {
|
|
556
|
-
return [this.lambdaFunction];
|
|
557
|
-
}
|
|
558
|
-
/**
|
|
559
|
-
* Get the function URL for a Lambda function.
|
|
560
|
-
*/
|
|
561
|
-
getFunctionUrl(_name) {
|
|
562
|
-
return this.lambdaFunction.getFunctionUrl();
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* Grant invoke permissions to a grantee.
|
|
566
|
-
*/
|
|
567
|
-
grantInvoke(grantee, _functionName) {
|
|
568
|
-
return this.lambdaFunction.grantInvoke(grantee);
|
|
569
|
-
}
|
|
570
|
-
/**
|
|
571
|
-
* Get the security group for VPC-enabled Lambda functions.
|
|
572
|
-
* Returns undefined if the Lambda is not VPC-enabled.
|
|
573
|
-
*/
|
|
574
|
-
getSecurityGroup() {
|
|
575
|
-
const securityGroups = this.connections.securityGroups;
|
|
576
|
-
return securityGroups.length > 0 ? securityGroups[0] : undefined;
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* Get the underlying Lambda function construct.
|
|
580
|
-
*/
|
|
581
|
-
getLambdaFunction() {
|
|
582
|
-
return this.lambdaFunction;
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
exports.LambdaCompute = LambdaCompute;
|
|
586
|
-
/**
|
|
587
|
-
* EC2 compute wrapper implementing IEc2Compute.
|
|
588
|
-
* Provides type-safe access to EC2-specific resources.
|
|
589
|
-
*/
|
|
590
|
-
class Ec2Compute extends constructs_1.Construct {
|
|
591
|
-
constructor(scope, id, props) {
|
|
592
|
-
super(scope, id);
|
|
593
|
-
this.computeType = "ec2";
|
|
594
|
-
const enableSSH = props.ssh !== undefined && props.ssh !== false;
|
|
595
|
-
const ec2Props = {
|
|
596
|
-
serviceName: `${id}Service`,
|
|
597
|
-
instanceType: props.instanceType || exports.COMPUTE_DEFAULTS.EC2.INSTANCE_TYPE,
|
|
598
|
-
enableSSH,
|
|
599
|
-
userData: props.userData,
|
|
600
|
-
machineImage: props.machineImage,
|
|
601
|
-
minCapacity: props.minCapacity || exports.COMPUTE_DEFAULTS.EC2.MIN_CAPACITY,
|
|
602
|
-
maxCapacity: props.maxCapacity || exports.COMPUTE_DEFAULTS.EC2.MAX_CAPACITY,
|
|
603
|
-
vpc: props.vpc,
|
|
604
|
-
spotCapacityPercentage: props.spotCapacityPercentage
|
|
605
|
-
};
|
|
606
|
-
this.ec2Instance = new ec2_1.Ec2Instance(scope, `${id}Ec2`, ec2Props);
|
|
607
|
-
this.connections = this.ec2Instance.connections;
|
|
608
|
-
}
|
|
609
|
-
/** Get the Auto Scaling Group. */
|
|
610
|
-
getAutoScalingGroup() {
|
|
611
|
-
return this.ec2Instance.getAutoScalingGroup();
|
|
612
|
-
}
|
|
613
|
-
/** Get the security group. */
|
|
614
|
-
getSecurityGroup() {
|
|
615
|
-
return this.ec2Instance.asgSecurityGroup;
|
|
616
|
-
}
|
|
617
|
-
/**
|
|
618
|
-
* Get the underlying EC2 instance construct.
|
|
619
|
-
*/
|
|
620
|
-
getEc2Instance() {
|
|
621
|
-
return this.ec2Instance;
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
exports.Ec2Compute = Ec2Compute;
|
|
625
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtS0Esb0RBRUM7QUFFRCxvRUFJQztBQW93QkQsc0RBbUJDO0FBaUJELG9EQXNCQztBQWVELDBEQXNCQztBQXpnQ0QsaURBQWlEO0FBQ2pELGlEQU02QjtBQUM3Qix1REFTZ0M7QUFDaEMsaURBTTZCO0FBTzdCLDJDQUF1QztBQUV2Qyw4QkFBOEI7QUFDOUIsd0RBU2lDO0FBaThDeEIsMEZBcjhDUCxzQkFBUyxPQXE4Q087QUFBRSw2RkFwOENsQix5QkFBWSxPQW84Q2tCO0FBQUUsZ0dBbjhDaEMsNEJBQWUsT0FtOENnQztBQUFFLDZGQWw4Q2pELHlCQUFZLE9BazhDaUQ7QUEvN0MvRCwrREFBZ0U7QUFHaEUseUVBR3lDO0FBTXpDLHlEQU15QztBQVFoQyw0RkFaUCxpQkFBVyxPQVlPO0FBUHBCLHlEQUE4RDtBQUM5RCwrREFBb0U7QUF3QnZELFFBQUEsbUJBQW1CLEdBQTJDO0lBQ3pFLEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELFdBQVcsRUFBRSxJQUFJO0tBQ2xCO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsV0FBVyxFQUFFLEVBQUU7UUFDZixjQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7UUFDbEQsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRCxNQUFNLEVBQUU7UUFDTixXQUFXLEVBQUUsQ0FBQztRQUNkLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxXQUFXLEVBQUUsS0FBSztLQUNuQjtDQUNGLENBQUM7QUFZVyxRQUFBLDRC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V0FBVyxFQUFFLEdBQUcsRUFBRSxTQUFTO1lBQzNCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhO1lBQ3RFLFNBQVM7WUFDVCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxZQUFZO1lBQ25FLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLHdCQUFnQixDQUFDLEdBQUcsQ0FBQyxZQUFZO1lBQ25FLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxzQkFBc0I7U0FDckQsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxpQkFBVyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7SUFDbEQsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUEzQ0QsZ0NBMkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBSZXBvc2l0b3J5SW1hZ2UsXG4gIHR5cGUgSUNsdXN0ZXIsXG4gIHR5cGUgSUJhc2VTZXJ2aWNlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICB0eXBlIElWcGMsXG4gIHR5cGUgVXNlckRhdGEsXG4gIHR5cGUgSU1hY2hpbmVJbWFnZSxcbiAgdHlwZSBJU2VjdXJpdHlHcm91cFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtcbiAgQ29kZSxcbiAgUnVudGltZSxcbiAgSGFuZGxlcixcbiAgQXJjaGl0ZWN0dXJlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9ucyxcbiAgdHlwZSBJRnVuY3Rpb24sXG4gIHR5cGUgSW52b2tlTW9kZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBQb2xpY3lTdGF0ZW1lbnQsXG4gIHR5cGUgUG9saWN5RG9jdW1lbnQsXG4gIHR5cGUgSU1hbmFnZWRQb2xpY3ksXG4gIHR5cGUgSUdyYW50YWJsZSxcbiAgR3JhbnRcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIHR5cGUgSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLFxuICB0eXBlIEFwcGxpY2F0aW9uTGlzdGVuZXJcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQgeyB0eXBlIElBdXRvU2NhbGluZ0dyb3VwIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hdXRvc2NhbGluZ1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vLyBJbXBvcnQgdHlwZS1zYWZlIGludGVyZmFjZXNcbmltcG9ydCB7XG4gIHR5cGUgSUVjc0NvbXB1dGUsXG4gIHR5cGUgSUxhbWJkYUNvbXB1dGUsXG4gIHR5cGUgSUVjMkNvbXB1dGUsXG4gIHR5cGUgQW55Q29tcHV0ZSxcbiAgaXNDb21wdXRlLFxuICBpc0Vjc0NvbXB1dGUsXG4gIGlzTGFtYmRhQ29tcHV0ZSxcbiAgaXNFYzJDb21wdXRlXG59IGZyb20gXCIuL2ludGVyZmFjZXMvY29tcHV0ZS5qc1wiO1xuaW1wb3J0IHsgdHlwZSBDb25uZWN0aW9uU3BlYyB9IGZyb20gXCIuL2ludGVyZmFjZXMvY29ubmVjdG9yLmpzXCI7XG5pbXBvcnQgeyBwcm9jZXNzQ29ubmVjdGlvbnMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29ubmVjdGlvbnMuanNcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7XG4gIEZqYWxsTG9nZ2VyLFxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlci5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBNYW5pZmVzdFNlcnZpY2UsXG4gIHR5cGUgTWFuaWZlc3RMYW1iZGFcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL21hbmlmZXN0V3JpdGVyLmpzXCI7XG5cbmltcG9ydCBFY3NDbHVzdGVyLCB7XG4gIHR5cGUgRWNzQ2x1c3RlclByb3BzLFxuICBTY2FsaW5nVHlwZSxcbiAgdHlwZSBEb21haW5Db25maWcsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgdHlwZSBFYzJDYXBhY2l0eUNvbmZpZ1xufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc1wiO1xuaW1wb3J0IHsgRWMySW5zdGFuY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2VjMlwiO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2xhbWJkYVwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbmV4cG9ydCB0eXBlIENvbXB1dGVUeXBlID0gXCJlY3NcIiB8IFwiZWMyXCIgfCBcImxhbWJkYVwiO1xuXG4vLyBSZS1leHBvcnQgZnJvbSBlY3MudHMgdG8gbWFpbnRhaW4gc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuZXhwb3J0IHsgU2NhbGluZ1R5cGUgfTtcbmV4cG9ydCB0eXBlIHsgRWNzQ2FwYWNpdHlQcm92aWRlciwgRWMyQ2FwYWNpdHlDb25maWcgfTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGRlZmF1bHRzIGZvciBlYWNoIGNvbXB1dGUgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlVHlwZUNvbmZpZyB7XG4gIC8qKiBEZWZhdWx0IHBvcnQgZm9yIHRoZSBjb21wdXRlIHR5cGUuIEVDUzogODAsIEVDMjogMjIsIExhbWJkYTogMCAobm8gcG9ydCkgKi9cbiAgZGVmYXVsdFBvcnQ6IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgc2NhbGluZyBsaW1pdHMgKi9cbiAgZGVmYXVsdFNjYWxpbmc6IHtcbiAgICBtaW5DYXBhY2l0eTogbnVtYmVyO1xuICAgIG1heENhcGFjaXR5OiBudW1iZXI7XG4gIH07XG4gIC8qKiBXaGV0aGVyIHRoaXMgY29tcHV0ZSB0eXBlIHJlcXVpcmVzIGEgVlBDICovXG4gIHJlcXVpcmVzVnBjOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQ09NUFVURV9UWVBFX0NPTkZJRzogUmVjb3JkPENvbXB1dGVUeXBlLCBDb21wdXRlVHlwZUNvbmZpZz4gPSB7XG4gIGVjczoge1xuICAgIGRlZmF1bHRQb3J0OiA4MCxcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDUgfSxcbiAgICByZXF1aXJlc1ZwYzogdHJ1ZVxuICB9LFxuICBlYzI6IHtcbiAgICBkZWZhdWx0UG9ydDogMjIsXG4gICAgZGVmYXVsdFNjYWxpbmc6IHsgbWluQ2FwYWNpdHk6IDIsIG1heENhcGFjaXR5OiAzIH0sXG4gICAgcmVxdWlyZXNWcGM6IHRydWVcbiAgfSxcbiAgbGFtYmRhOiB7XG4gICAgZGVmYXVsdFBvcnQ6IDAsXG4gICAgZGVmYXVsdFNjYWxpbmc6IHsgbWluQ2FwYWNpdHk6IDAsIG1heENhcGFjaXR5OiAxMDAgfSxcbiAgICByZXF1aXJlc1ZwYzogZmFsc2VcbiAgfVxufTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBFQ1MgY2FwYWNpdHkgcHJvdmlkZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcge1xuICAvKiogV2hldGhlciB0aGlzIHVzZXMgU3BvdCBwcmljaW5nICovXG4gIHVzZXNTcG90OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGlzIHJ1bnMgb24gRUMyIGluc3RhbmNlcyAodnMgc2VydmVybGVzcyBGYXJnYXRlKSAqL1xuICB1c2VzRWMySW5zdGFuY2VzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJRzogUmVjb3JkPFxuICBFY3NDYXBhY2l0eVByb3ZpZGVyLFxuICBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnXG4+ID0ge1xuICBGQVJHQVRFOiB7XG4gICAgdXNlc1Nwb3Q6IGZhbHNlLFxuICAgIHVzZXNFYzJJbnN0YW5jZXM6IGZhbHNlXG4gIH0sXG4gIEZBUkdBVEVfU1BPVDoge1xuICAgIHVzZXNTcG90OiB0cnVlLFxuICAgIHVzZXNFYzJJbnN0YW5jZXM6IGZhbHNlXG4gIH0sXG4gIEVDMjoge1xuICAgIHVzZXNTcG90OiBmYWxzZSxcbiAgICB1c2VzRWMySW5zdGFuY2VzOiB0cnVlXG4gIH1cbn07XG5cbi8qKlxuICogRGVmYXVsdCB2YWx1ZXMgZm9yIGNvbXB1dGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAqIENlbnRyYWxpc2VkIGNvbnN0YW50cyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYWNyb3NzIHRoZSBjb2RlYmFzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTVBVVEVfREVGQVVMVFMgPSB7XG4gIEVDMjoge1xuICAgIElOU1RBTkNFX1RZUEU6IFwidDRnLm1pY3JvXCIsXG4gICAgTUlOX0NBUEFDSVRZOiAxLFxuICAgIE1BWF9DQVBBQ0lUWTogMVxuICB9LFxuICBFQ1M6IHtcbiAgICAvKiogQVdTIHNhbXBsZSBpbWFnZSB1c2VkIHdoZW4gbm8gRUNSIHJlcG9zaXRvcnkgaXMgcHJvdmlkZWQgKi9cbiAgICBGQUxMQkFDS19JTUFHRTogXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIixcbiAgICAvKiogRGVmYXVsdCB0YWcgZm9yIEVDUiBpbWFnZXMgKi9cbiAgICBJTUFHRV9UQUc6IFwibGF0ZXN0XCJcbiAgfSxcbiAgTEFNQkRBOiB7XG4gICAgSEFORExFUjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgUlVOVElNRTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICBBUkNISVRFQ1RVUkU6IEFyY2hpdGVjdHVyZS5BUk1fNjRcbiAgfVxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXB1dGVUeXBlQ29uZmlnKHR5cGU6IENvbXB1dGVUeXBlKTogQ29tcHV0ZVR5cGVDb25maWcge1xuICByZXR1cm4gQ09NUFVURV9UWVBFX0NPTkZJR1t0eXBlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVjc0NhcGFjaXR5UHJvdmlkZXJDb25maWcoXG4gIHByb3ZpZGVyOiBFY3NDYXBhY2l0eVByb3ZpZGVyXG4pOiBFY3NDYXBhY2l0eVByb3ZpZGVyQ29uZmlnIHtcbiAgcmV0dXJuIEVDU19DQVBBQ0lUWV9QUk9WSURFUl9DT05GSUdbcHJvdmlkZXJdO1xufVxuXG4vLyBSZS1leHBvcnQgTGFtYmRhIHR5cGVzIGZyb20gQ0RLIGZvciB1c2VyIGNvbnZlbmllbmNlXG5leHBvcnQge1xuICBBcmNoaXRlY3R1cmUsXG4gIEh0dHBNZXRob2QsXG4gIEludm9rZU1vZGUsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgY29udGFpbmVyIGluIGFuIEVDUyB0YXNrLlxuICpcbiAqIEZvciBzaW5nbGUtY29udGFpbmVyIHNlcnZpY2VzLCBgbmFtZWAgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIGAke3NlcnZpY2VOYW1lfUNvbnRhaW5lcmAuXG4gKiBGb3IgbXVsdGktY29udGFpbmVyIHRhc2tzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBgcG9ydGAgaXMgdGhlICoqcHJpbWFyeSBjb250YWluZXIqKlxuICogdGhhdCByZWNlaXZlcyBsb2FkIGJhbGFuY2VyIHRyYWZmaWMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpbmdsZSBjb250YWluZXIgKG5hbWUgYXV0by1nZW5lcmF0ZWQpXG4gKiBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLWNvbnRhaW5lciB3aXRoIHNpZGVjYXJzXG4gKiBjb250YWluZXJzOiBbXG4gKiAgIHsgbmFtZTogXCJhcHBcIiwgcG9ydDogMzAwMCB9LCAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWFyeSAtIHJlY2VpdmVzIEFMQiB0cmFmZmljXG4gKiAgIHsgbmFtZTogXCJkYXRhZG9nXCIsIGltYWdlOiBcImRhdGFkb2cvYWdlbnRcIiB9ICAgICAvLyBTaWRlY2FyIC0gbW9uaXRvcmluZ1xuICogXVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc0NvbnRhaW5lckNvbmZpZyB7XG4gIC8qKiBDb250YWluZXIgbmFtZS4gT3B0aW9uYWwgZm9yIHNpbmdsZS1jb250YWluZXIgc2VydmljZXMuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb250YWluZXIgaW1hZ2UuIE9wdGlvbnM6XG4gICAqIC0gT21pdDogVXNlcyBhcHAncyBkZWZhdWx0IEVDUiByZXBvc2l0b3J5IChwcmltYXJ5IGNvbnRhaW5lciBvbmx5KVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuICAvKipcbiAgICogUG9ydCB0aGUgY29udGFpbmVyIGxpc3RlbnMgb24uXG4gICAqIFRoZSBmaXJzdCBjb250YWluZXIgd2l0aCBhIHBvcnQgYmVjb21lcyB0aGUgKipwcmltYXJ5IGNvbnRhaW5lcioqXG4gICAqIGFuZCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGxvYWQgYmFsYW5jZXIuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzICovXG4gIGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIFNlY3JldHMgZnJvbSBBV1MgU1NNIFBhcmFtZXRlciBTdG9yZS5cbiAgICogQXJyYXkgb2Ygc2VjcmV0IG5hbWVzIHRoYXQgd2lsbCBiZSBmZXRjaGVkIGZyb20gdGhlIHNlcnZpY2UncyBTU00gbmFtZXNwYWNlLlxuICAgKiBUaGUgbmFtZXNwYWNlIHBhdGggaXMgYXV0by1kZXRlcm1pbmVkIGZyb20gYXBwL2NsdXN0ZXIvc2VydmljZSBuYW1lcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2VjcmV0cyBhdCAvbXlhcHAvYXBpLWNsdXN0ZXIvdXNlcnMvQVBJX0tFWSBhbmQgL215YXBwL2FwaS1jbHVzdGVyL3VzZXJzL0RCX1BBU1NXT1JEXG4gICAqIHNlY3JldHM6IFtcIkFQSV9LRVlcIiwgXCJEQl9QQVNTV09SRFwiXVxuICAgKi9cbiAgc2VjcmV0cz86IHN0cmluZ1tdO1xuICAvKiogU2VjcmV0cyBpbXBvcnRlZCBmcm9tIG90aGVyIENESyByZXNvdXJjZXMgKEFXUyBTZWNyZXRzIE1hbmFnZXIpICovXG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuICAvKiogQ29tbWFuZCB0byBydW4gaW4gdGhlIGNvbnRhaW5lciAqL1xuICBjb21tYW5kPzogc3RyaW5nW107XG4gIC8qKiBFbnRyeSBwb2ludCBmb3IgdGhlIGNvbnRhaW5lciAqL1xuICBlbnRyeVBvaW50Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgY29udGFpbmVyIGlzIGVzc2VudGlhbC5cbiAgICogSWYgYW4gZXNzZW50aWFsIGNvbnRhaW5lciBzdG9wcywgYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHRhc2sgc3RvcC5cbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgZXNzZW50aWFsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEhlYWx0aCBjaGVjayBjb25maWd1cmF0aW9uLlxuICAgKiBEZWZhdWx0OiBGb3IgcHJpbWFyeSBjb250YWluZXIgd2l0aCBwb3J0LCB1c2VzIGN1cmwgaGVhbHRoIGNoZWNrLlxuICAgKi9cbiAgaGVhbHRoQ2hlY2s/OiB7XG4gICAgY29tbWFuZDogc3RyaW5nW107XG4gICAgaW50ZXJ2YWw/OiBudW1iZXI7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICByZXRyaWVzPzogbnVtYmVyO1xuICAgIHN0YXJ0UGVyaW9kPzogbnVtYmVyO1xuICB9O1xufVxuXG4vKipcbiAqIEVDUyBzY2FsaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiAtIE9taXQ6IGVuYWJsZWQgd2l0aCBkZWZhdWx0c1xuICogLSBge31gOiBlbmFibGVkIHdpdGggZGVmYXVsdHNcbiAqIC0gYHsgbWluQ2FwYWNpdHk6IDIsIG1heENhcGFjaXR5OiAxMCB9YDogY3VzdG9tIHNjYWxpbmdcbiAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1NjYWxpbmdDb25maWcge1xuICBtaW5DYXBhY2l0eT86IG51bWJlcjtcbiAgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIHNjYWxpbmdUeXBlPzogU2NhbGluZ1R5cGU7XG59XG5cbi8qKlxuICogQ2x1c3Rlci1sZXZlbCBjb25maWd1cmF0aW9uLlxuICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWNzQ2x1c3RlckNvbmZpZyB7XG4gIC8qKlxuICAgKiBEb21haW4gZm9yIEhUVFBTIGFjY2Vzcy5cbiAgICogLSBPbWl0OiBBTEIgY3JlYXRlZCB3aXRoIGRlZmF1bHQgRE5TICgqLmVsYi5hbWF6b25hd3MuY29tKVxuICAgKiAtIFNwZWNpZmllZDogQ3JlYXRlcyBBQ00gY2VydGlmaWNhdGUgKyBSb3V0ZTUzIEROUyBBIHJlY29yZFxuICAgKi9cbiAgZG9tYWluPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMb2FkIGJhbGFuY2VyIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdCBvciBcInB1YmxpY1wiOiBJbnRlcm5ldC1mYWNpbmcgQUxCIChkZWZhdWx0KVxuICAgKiAtIFwiaW50ZXJuYWxcIjogVlBDLW9ubHkgQUxCXG4gICAqIC0gZmFsc2U6IE5vIEFMQiAoZm9yIHdvcmtlcnMvYmFja2dyb3VuZCBwcm9jZXNzb3JzKVxuICAgKi9cbiAgbG9hZEJhbGFuY2VyPzogZmFsc2UgfCBcInB1YmxpY1wiIHwgXCJpbnRlcm5hbFwiO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgZGlyZWN0IEVDMiBhY2Nlc3Mgd2l0aG91dCBBTEIuXG4gICAqIFVzZXMgaG9zdCBuZXR3b3JrIG1vZGUgZm9yIHByZWRpY3RhYmxlIHBvcnRzLlxuICAgKiBBY2Nlc3MgdmlhIEVDMiBwdWJsaWMgSVAgYXQgY29udGFpbmVyIHBvcnQuXG4gICAqL1xuICBkaXJlY3RBY2Nlc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZHZhbmNlZCBkb21haW4gY29uZmlndXJhdGlvbiBmb3Igcm91dGluZyBwb2xpY2llcyAobGF0ZW5jeSwgd2VpZ2h0ZWQsIGdlbykuXG4gICAqIE9ubHkgdXNlZCB3aGVuIGRvbWFpbiBpcyBzcGVjaWZpZWQuXG4gICAqIEFsbG93cyBmb3IgbXVsdGktcmVnaW9uIGRlcGxveW1lbnRzIHdpdGggYWR2YW5jZWQgRE5TIHJvdXRpbmcuXG4gICAqL1xuICBkb21haW5Db25maWc/OiBEb21haW5Db25maWc7XG59XG5cbi8qKlxuICogUm91dGluZyBjb25maWd1cmF0aW9uIGZvciBwYXRoL2hvc3QtYmFzZWQgcm91dGluZyBvbiB0aGUgQUxCLlxuICogUmVxdWlyZWQgd2hlbiBjbHVzdGVyIGhhcyBtdWx0aXBsZSBzZXJ2aWNlcyB3aXRoIHBvcnRzLlxuICogT3B0aW9uYWwgZm9yIHNpbmdsZSBzZXJ2aWNlIChnZXRzIGFsbCB0cmFmZmljIGF1dG9tYXRpY2FsbHkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1JvdXRpbmdDb25maWcge1xuICAvKipcbiAgICogUGF0aCBwYXR0ZXJuIGZvciByb3V0aW5nIChlLmcuLCBcIi9hcGkvKlwiLCBcIi91c2Vycy8qXCIpLlxuICAgKiBVc2VzIEFMQiBwYXRoLWJhc2VkIHJvdXRpbmcuXG4gICAqL1xuICBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3N0IGhlYWRlciBmb3Igcm91dGluZyAoZS5nLiwgXCJhcGkuZXhhbXBsZS5jb21cIikuXG4gICAqIFVzZXMgQUxCIGhvc3QtYmFzZWQgcm91dGluZy5cbiAgICovXG4gIGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IGZvciB0aGlzIHJvdXRpbmcgcnVsZSAoMS01MDAwMCkuXG4gICAqIExvd2VyIG51bWJlciA9IGhpZ2hlciBwcmlvcml0eS5cbiAgICogQXV0by1hc3NpZ25lZCBpZiBvbWl0dGVkLlxuICAgKi9cbiAgcHJpb3JpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhlYWx0aCBjaGVjayBwYXRoIGZvciB0aGlzIHNlcnZpY2UncyB0YXJnZXQgZ3JvdXAuXG4gICAqIERlZmF1bHQ6IFwiL1wiXG4gICAqL1xuICBoZWFsdGhDaGVja1BhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzZXJ2aWNlIGluIGFuIEVDUyBjbHVzdGVyLlxuICogRWFjaCBzZXJ2aWNlIGdldHMgaXRzIG93biB0YXNrIGRlZmluaXRpb24sIHNjYWxpbmcgY29uZmlnLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW1wbGUgc2VydmljZVxuICogeyBuYW1lOiBcImFwaVwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2VydmljZSB3aXRoIHJvdXRpbmcgKGZvciBtdWx0aS1zZXJ2aWNlIGNsdXN0ZXJzKVxuICogeyBuYW1lOiBcInVzZXJzXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IHsgcGF0aDogXCIvdXNlcnMvKlwiLCBwcmlvcml0eTogMTAwIH0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXJ2aWNlIHdpdGggbXVsdGlwbGUgcm91dGluZyBydWxlcyAoc2FtZSB0YXJnZXQgZ3JvdXApXG4gKiB7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0sIHJvdXRpbmc6IFtcbiAqICAgeyBwYXRoOiBcIi9hcGkvdjIvKlwiLCBwcmlvcml0eTogNTAgfSxcbiAqICAgeyBwYXRoOiBcIi8qXCIsIHByaW9yaXR5OiAyMDAgfSxcbiAqIF19XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNlcnZpY2Ugd2l0aCBzaWRlY2Fyc1xuICoge1xuICogICBuYW1lOiBcImFwaVwiLFxuICogICBjb250YWluZXJzOiBbXG4gKiAgICAgeyBuYW1lOiBcImFwcFwiLCBwb3J0OiAzMDAwIH0sXG4gKiAgICAgeyBuYW1lOiBcImRhdGFkb2dcIiwgaW1hZ2U6IFwiZGF0YWRvZy9hZ2VudFwiIH1cbiAqICAgXVxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjc1NlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBuYW1lICh1bmlxdWUgd2l0aGluIGNsdXN0ZXIpICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29udGFpbmVyIGltYWdlIGZvciB0aGlzIHNlcnZpY2UgKGFwcGxpZXMgdG8gZmlyc3QgY29udGFpbmVyIHdpdGhvdXQgZXhwbGljaXQgaW1hZ2UpLlxuICAgKiAtIE9taXQ6IFVzZXMgYXBwJ3MgZGVmYXVsdCBFQ1IgcmVwb3NpdG9yeVxuICAgKiAtIHN0cmluZzogRUNSIHJlcG9zaXRvcnkgbmFtZSBvciBwdWJsaWMgaW1hZ2UgVVJMXG4gICAqIC0gUmVwb3NpdG9yeTogQ0RLIEVDUiBSZXBvc2l0b3J5IGNvbnN0cnVjdFxuICAgKi9cbiAgaW1hZ2U/OiBzdHJpbmcgfCBSZXBvc2l0b3J5O1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgY29uZmlndXJhdGlvbihzKSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKiBGb3Igc2luZ2xlLWNvbnRhaW5lciBzZXJ2aWNlcywgY29udGFpbmVyIG5hbWUgaXMgb3B0aW9uYWwgYW5kIGF1dG8tZ2VuZXJhdGVkLlxuICAgKiBGb3IgbXVsdGktY29udGFpbmVyIHNlcnZpY2VzLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0IGlzIHRoZSBwcmltYXJ5IGNvbnRhaW5lci5cbiAgICovXG4gIGNvbnRhaW5lcnM/OiBFY3NDb250YWluZXJDb25maWdbXTtcblxuICAvKipcbiAgICogUm91dGluZyBydWxlcyBmb3IgdGhpcyBzZXJ2aWNlIG9uIHRoZSBjbHVzdGVyJ3MgQUxCLlxuICAgKiBSZXF1aXJlZCB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzIHdpdGggcG9ydHMuXG4gICAqIE9wdGlvbmFsIGZvciBzaW5nbGUgc2VydmljZSAoZ2V0cyAvKiBhdXRvbWF0aWNhbGx5KS5cbiAgICogQ2FuIGJlIGEgc2luZ2xlIHJ1bGUgb3IgYW4gYXJyYXkgb2YgcnVsZXMgcG9pbnRpbmcgdG8gdGhlIHNhbWUgdGFyZ2V0IGdyb3VwLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBNdWx0aXBsZSByb3V0ZXMgZm9yIHRoZSBzYW1lIHNlcnZpY2VcbiAgICogcm91dGluZzogW1xuICAgKiAgIHsgcGF0aDogXCIvYXBpL3YyLypcIiwgcHJpb3JpdHk6IDUwIH0sXG4gICAqICAgeyBwYXRoOiBcIi8qXCIsIHByaW9yaXR5OiAyMDAgfSxcbiAgICogXVxuICAgKi9cbiAgcm91dGluZz86IEVjc1JvdXRpbmdDb25maWcgfCBFY3NSb3V0aW5nQ29uZmlnW107XG5cbiAgLyoqIENQVSB1bml0cyBmb3IgdGhpcyBzZXJ2aWNlJ3MgdGFza3MgKDI1Ni00MDk2KSAqL1xuICBjcHU/OiBudW1iZXI7XG5cbiAgLyoqIE1lbW9yeSBpbiBNaUIgZm9yIHRoaXMgc2VydmljZSdzIHRhc2tzICg1MTItMzA3MjApICovXG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuXG4gIC8qKiBEZXNpcmVkIG51bWJlciBvZiB0YXNrcy4gRGVmYXVsdDogMiAqL1xuICBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNjYWxpbmcgY29uZmlndXJhdGlvbi5cbiAgICogLSBPbWl0OiBlbmFibGVkIHdpdGggZGVmYXVsdHNcbiAgICogLSBmYWxzZTogZGlzYWJsZWRcbiAgICovXG4gIHNjYWxpbmc/OiBFY3NTY2FsaW5nQ29uZmlnIHwgZmFsc2U7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gRG9ja2VyZmlsZSBmb3IgYnVpbGRpbmcgdGhpcyBzZXJ2aWNlJ3MgaW1hZ2UuXG4gICAqIE1ldGFkYXRhIGZvciBDTEkgYnVpbGQgcHJvY2Vzcywgbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogRG9ja2VyIGJ1aWxkIHRhcmdldCBzdGFnZSBmb3IgbXVsdGktc3RhZ2UgRG9ja2VyZmlsZXMuXG4gICAqIFdoZW4gc3BlY2lmaWVkLCB0aGUgQ0xJIGJ1aWxkcyB3aXRoIGAtLXRhcmdldCA8ZG9ja2VyVGFyZ2V0PmAuXG4gICAqIFRoZSBpbWFnZSB0YWcgc3VmZml4IGlzIGFsc28gdXBkYXRlZDogYDxzZXJ2aWNlPi08dGFyZ2V0Pi1sYXRlc3RgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBEb2NrZXJmaWxlOiBGUk9NIG5vZGUgQVMgYmFzZSAuLi4gRlJPTSBiYXNlIEFTIGFwaSAuLi4gRlJPTSBiYXNlIEFTIHdvcmtlclxuICAgKiB7IG5hbWU6IFwiYXBpXCIsIGRvY2tlclRhcmdldDogXCJhcGlcIiB9ICAgLy8gYnVpbGRzOiBteWFwcC1hcGktYXBpLWxhdGVzdFxuICAgKiB7IG5hbWU6IFwid29ya2VyXCIsIGRvY2tlclRhcmdldDogXCJ3b3JrZXJcIiB9ICAvLyBidWlsZHM6IG15YXBwLXdvcmtlci13b3JrZXItbGF0ZXN0XG4gICAqL1xuICBkb2NrZXJUYXJnZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgaW5saW5lIHBvbGljaWVzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrIHJvbGUuXG4gICAqIEFkZGVkIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBFQ1MgRXhlYyBwZXJtaXNzaW9ucy5cbiAgICogVXNlIGZvciBzZXJ2aWNlLXNwZWNpZmljIEFXUyBwZXJtaXNzaW9ucyAoUzMsIER5bmFtb0RCLCBTUVMsIGV0Yy4pLlxuICAgKi9cbiAgdGFza1JvbGVJbmxpbmVQb2xpY2llcz86IFJlY29yZDxzdHJpbmcsIFBvbGljeURvY3VtZW50PjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBtYW5hZ2VkIHBvbGljaWVzIGZvciB0aGlzIHNlcnZpY2UncyB0YXNrIHJvbGUuXG4gICAqIEFkZGVkIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBFQ1MgRXhlYyBwZXJtaXNzaW9ucy5cbiAgICovXG4gIHRhc2tSb2xlTWFuYWdlZFBvbGljaWVzPzogSU1hbmFnZWRQb2xpY3lbXTtcblxuICAvKipcbiAgICogUmVzb3VyY2VzIHRoaXMgc2VydmljZSBuZWVkcyB0byBjb25uZWN0IHRvIChlLmcuLCBkYXRhYmFzZXMsIFMzIGJ1Y2tldHMsIFNRUyBxdWV1ZXMpLlxuICAgKiBDcmVhdGVzIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIGZvciBJQ29ubmVjdGFibGUgcmVzb3VyY2VzIGFuZCBJQU0gZ3JhbnRzIGZvciBJQU0gcmVzb3VyY2VzLlxuICAgKiBGb2xsb3dzIGxlYXN0LXByaXZpbGVnZSAtIG9ubHkgdGhpcyBzZXJ2aWNlIGdldHMgYWNjZXNzLCBub3QgYWxsIHNlcnZpY2VzIGluIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBTdXBwb3J0czpcbiAgICogLSBJQ29ubmVjdGFibGU6IFNlY3VyaXR5IGdyb3VwIHJlc291cmNlcyAoUkRTLCBFQ1MsIGV0Yy4pXG4gICAqIC0gSVN0b3JhZ2VDb25uZWN0b3I6IFMzIGJ1Y2tldHMgKElBTSBncmFudHMpXG4gICAqIC0gSUR5bmFtb0RCQ29ubmVjdG9yOiBEeW5hbW9EQiB0YWJsZXMgKElBTSBncmFudHMpXG4gICAqIC0gSVF1ZXVlQ29ubmVjdG9yOiBTUVMgcXVldWVzIChJQU0gZ3JhbnRzKVxuICAgKiAtIENvbm5lY3Rpb25Db25maWc6IEV4cGxpY2l0IGFjY2VzcyBsZXZlbCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNpbXBsZSBjb25uZWN0aW9ucyAoZGVmYXVsdCBwZXJtaXNzaW9ucylcbiAgICogY29ubmVjdGlvbnM6IFtkYXRhYmFzZSwgYnVja2V0LCBjYWNoZSwgcXVldWVdXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEV4cGxpY2l0IGFjY2VzcyBsZXZlbHNcbiAgICogY29ubmVjdGlvbnM6IFtcbiAgICogICBkYXRhYmFzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSBncm91cCAoUkRTKVxuICAgKiAgIHsgcmVzb3VyY2U6IGNhY2hlLCBhY2Nlc3M6IFwicmVhZFwiIH0sICAgLy8gUmVhZC1vbmx5IER5bmFtb0RCXG4gICAqICAgeyByZXNvdXJjZTogYnVja2V0LCBhY2Nlc3M6IFwid3JpdGVcIiB9LCAvLyBXcml0ZS1vbmx5IFMzXG4gICAqICAgeyByZXNvdXJjZTogcXVldWUsIGFjY2VzczogXCJjb25zdW1lXCIgfSAvLyBDb25zdW1lLW9ubHkgU1FTXG4gICAqIF1cbiAgICovXG4gIGNvbm5lY3Rpb25zPzogQ29ubmVjdGlvblNwZWNbXTtcblxuICAvKipcbiAgICogQ2FwYWNpdHkgcHJvdmlkZXIgZm9yIHRoaXMgc2VydmljZS4gUkVRVUlSRUQuXG4gICAqIEVhY2ggc2VydmljZSBzcGVjaWZpZXMgaXRzIG93biBjYXBhY2l0eSBwcm92aWRlci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gTWl4ZWQgRkFSR0FURSBhbmQgRUMyIHNlcnZpY2VzIGluIHNhbWUgY2x1c3RlclxuICAgKiB7XG4gICAqICAgc2VydmljZXM6IFtcbiAgICogICAgIHsgbmFtZTogXCJhcGlcIiwgY2FwYWNpdHlQcm92aWRlcjogXCJGQVJHQVRFXCIgfSxcbiAgICogICAgIHsgbmFtZTogXCJ3b3JrZXJcIiwgY2FwYWNpdHlQcm92aWRlcjogXCJFQzJcIiwgZWMyQ29uZmlnOiB7IGluc3RhbmNlVHlwZTogXCJ0NGcubWljcm9cIiB9IH1cbiAgICogICBdXG4gICAqIH1cbiAgICovXG4gIGNhcGFjaXR5UHJvdmlkZXI6IEVjc0NhcGFjaXR5UHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIEVDMiBjYXBhY2l0eSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqIE9ubHkgdXNlZCB3aGVuIHNlcnZpY2UgY2FwYWNpdHlQcm92aWRlciBpcyBcIkVDMlwiLlxuICAgKiBTZXJ2aWNlcyB3aXRoIG1hdGNoaW5nIGVjMkNvbmZpZyBzaGFyZSBhbiBBU0cgZm9yIGVmZmljaWVuY3kuXG4gICAqL1xuICBlYzJDb25maWc/OiBFYzJDYXBhY2l0eUNvbmZpZztcblxuICAvKipcbiAgICogU1NNIFBhcmFtZXRlciBTdG9yZSBwYXRoIGZvciBzZWNyZXRzLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBzZWNyZXRzIGFyZSBmZXRjaGVkIGZyb20gLzxhcHA+LzxjbHVzdGVyPi88c2VydmljZT4uXG4gICAqIFVzZSB0aGlzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbnZlbnRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE92ZXJyaWRlIGRlZmF1bHQgcGF0aFxuICAgKiBzc21TZWNyZXRzUGF0aDogXCIvY3VzdG9tL3BhdGgvdG8vc2VjcmV0c1wiXG4gICAqL1xuICBzc21TZWNyZXRzUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTU0ggYWNjZXNzIGNvbmZpZ3VyYXRpb24gZm9yIEVDMiBpbnN0YW5jZXMuXG4gKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICogLSBge31gOiBlbmFibGVkIHdpdGggYXV0by1nZW5lcmF0ZWQga2V5XG4gKiAtIGB7IGtleU5hbWU6IFwibXkta2V5XCIgfWA6IGVuYWJsZWQgd2l0aCBleGlzdGluZyBrZXlcbiAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzaENvbmZpZyB7XG4gIC8qKiBTU0gga2V5IHBhaXIgbmFtZSAqL1xuICBrZXlOYW1lPzogc3RyaW5nO1xuICAvKiogQWxsb3dlZCBDSURSIGJsb2NrcyBmb3IgU1NIIGFjY2VzcyAqL1xuICBhbGxvd2VkQ2lkcnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgZnVuY3Rpb24gVVJMIGNvbmZpZ3VyYXRpb24uXG4gKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICogLSBge31gOiBlbmFibGVkIHdpdGggSUFNIGF1dGhcbiAqIC0gYHsgYXV0aFR5cGU6IFwiTk9ORVwiLCBjb3JzOiB7Li4ufSB9YDogcHVibGljIHdpdGggQ09SU1xuICogLSBgZmFsc2VgOiBleHBsaWNpdGx5IGRpc2FibGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25VcmxDb25maWcge1xuICAvKiogQXV0aGVudGljYXRpb24gdHlwZS4gRGVmYXVsdDogQVdTX0lBTSAqL1xuICBhdXRoVHlwZT86IEZ1bmN0aW9uVXJsQXV0aFR5cGU7XG4gIC8qKiBDT1JTIGNvbmZpZ3VyYXRpb24gKi9cbiAgY29ycz86IEZ1bmN0aW9uVXJsQ29yc09wdGlvbnM7XG4gIC8qKiBJbnZva2UgbW9kZS4gVXNlIFJFU1BPTlNFX1NUUkVBTSBmb3IgTGFtYmRhIHN0cmVhbWluZy4gRGVmYXVsdDogQlVGRkVSRUQgKi9cbiAgaW52b2tlTW9kZT86IEludm9rZU1vZGU7XG59XG5cbmludGVyZmFjZSBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBFQ1MgY29tcHV0ZSBjb25maWd1cmF0aW9uLlxuICogQ3JlYXRlcyBhbiBFQ1MgY2x1c3RlciB3aXRoIG9uZSBvciBtb3JlIHNlcnZpY2VzIHNoYXJpbmcgYSBsb2FkIGJhbGFuY2VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW5nbGUgc2VydmljZVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXZWJBcHBcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcHAuZXhhbXBsZS5jb21cIiB9LFxuICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJ3ZWJcIiwgY29udGFpbmVyczogW3sgcG9ydDogMzAwMCB9XSB9XVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNdWx0aS1zZXJ2aWNlIGNsdXN0ZXIgd2l0aCByb3V0aW5nXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaUNsdXN0ZXJcIiwge1xuICogICB0eXBlOiBcImVjc1wiLFxuICogICBjbHVzdGVyOiB7IGRvbWFpbjogXCJhcGkuZXhhbXBsZS5jb21cIiB9LFxuICogICBzZXJ2aWNlczogW1xuICogICAgIHsgbmFtZTogXCJ1c2Vyc1wiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dLCByb3V0aW5nOiB7IHBhdGg6IFwiL3VzZXJzLypcIiB9IH0sXG4gKiAgICAgeyBuYW1lOiBcIm9yZGVyc1wiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAxIH1dLCByb3V0aW5nOiB7IHBhdGg6IFwiL29yZGVycy8qXCIgfSB9XG4gKiAgIF1cbiAqIH0pKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSW50ZXJuYWwgd29ya2VycyAobm8gQUxCKVxuICogYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXb3JrZXJzXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBsb2FkQmFsYW5jZXI6IGZhbHNlIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcInByb2Nlc3NvclwiIH0sIHsgbmFtZTogXCJlbWFpbGVyXCIgfV1cbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFY3NDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlY3NcIjtcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gbmFtZSBmb3IgU1NNIHNlY3JldHMgbmFtZXNwYWNlLlxuICAgKiBXaGVuIGNvbnRhaW5lcnMgdXNlIHNlY3JldHMsIHRoZSBwYXRoIGlzIGRlcml2ZWQgYXM6IC88YXBwTmFtZT4vPGNsdXN0ZXJOYW1lPi88c2VydmljZU5hbWU+XG4gICAqIEF1dG8tZGVyaXZlZCBmcm9tIEFwcC5nZXROYW1lKCkgaWYgbm90IHNwZWNpZmllZC5cbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgY29uZmlndXJhdGlvbi5cbiAgICogQ29udHJvbHMgdGhlIHNoYXJlZCBBTEIgZm9yIGFsbCBzZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIC0gT21pdDogQUxCIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IHNldHRpbmdzXG4gICAqIC0gYHsgZG9tYWluOiBcIi4uLlwiIH1gOiBBTEIgd2l0aCBIVFRQUyArIEROU1xuICAgKiAtIGB7IGxvYWRCYWxhbmNlcjogZmFsc2UgfWA6IE5vIEFMQiAoaW50ZXJuYWwgd29ya2VycylcbiAgICovXG4gIGNsdXN0ZXI/OiBFY3NDbHVzdGVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlcyBpbiB0aGlzIGNsdXN0ZXIuXG4gICAqIEVhY2ggc2VydmljZSBnZXRzIGl0cyBvd24gdGFzayBkZWZpbml0aW9uLCBzY2FsaW5nLCBhbmQgdGFyZ2V0IGdyb3VwLlxuICAgKiBFYWNoIHNlcnZpY2UgTVVTVCBzcGVjaWZ5IGl0cyBvd24gY2FwYWNpdHlQcm92aWRlci5cbiAgICogQWxsIHNlcnZpY2VzIHNoYXJlIHRoZSBjbHVzdGVyJ3MgQUxCICh1bmxlc3MgZGlzYWJsZWQpLlxuICAgKi9cbiAgc2VydmljZXM6IEVjc1NlcnZpY2VDb25maWdbXTtcblxuICAvKipcbiAgICogRUNSIHJlcG9zaXRvcnkgZm9yIGFsbCBzZXJ2aWNlcyAoZGVmYXVsdCBpbWFnZSkuXG4gICAqIEluZGl2aWR1YWwgc2VydmljZXMgY2FuIG92ZXJyaWRlIHdpdGggdGhlaXIgb3duIGBpbWFnZWAgcHJvcGVydHkuXG4gICAqL1xuICBlY3JSZXBvc2l0b3J5PzogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZTtcblxuICAvKipcbiAgICogUGF0aCB0byBEb2NrZXJmaWxlIGZvciBidWlsZGluZyBjdXN0b20gaW1hZ2UuXG4gICAqIE5vdGU6IFRoaXMgaXMgbWV0YWRhdGEgZm9yIHRoZSBDTEkgYnVpbGQgcHJvY2VzcyxcbiAgICogbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFYzJDb21wdXRlUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJlYzJcIjtcblxuICAvKiogRUMyIGluc3RhbmNlIHR5cGUuIERlZmF1bHQ6IFwidDRnLm1pY3JvXCIgKi9cbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTU0ggYWNjZXNzIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT21pdDogZGlzYWJsZWQgKGRlZmF1bHQpXG4gICAqIC0gYHt9YDogZW5hYmxlZCB3aXRoIGRlZmF1bHRzXG4gICAqIC0gYGZhbHNlYDogZXhwbGljaXRseSBkaXNhYmxlZFxuICAgKi9cbiAgc3NoPzogU3NoQ29uZmlnIHwgZmFsc2U7XG4gIC8qKiBVc2VyIGRhdGEgc2NyaXB0ICovXG4gIHVzZXJEYXRhPzogVXNlckRhdGE7XG4gIC8qKiBNYWNoaW5lIGltYWdlIChBTUkpICovXG4gIG1hY2hpbmVJbWFnZT86IElNYWNoaW5lSW1hZ2U7XG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDEgKi9cbiAgbWluQ2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMuIERlZmF1bHQ6IDEgKi9cbiAgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQZXJjZW50YWdlIG9mIGNhcGFjaXR5IHRvIHJ1biBvbiBTcG90IGluc3RhbmNlcyAoMC0xMDApLlxuICAgKiAtIE9taXQgb3IgMDogQWxsIE9uLURlbWFuZCBpbnN0YW5jZXMgKGRlZmF1bHQpXG4gICAqIC0gMTAwOiBBbGwgU3BvdCBpbnN0YW5jZXNcbiAgICogLSA1MDogSGFsZiBTcG90LCBoYWxmIE9uLURlbWFuZFxuICAgKlxuICAgKiBTcG90IGluc3RhbmNlcyBjYW4gcmVkdWNlIGNvc3RzIGJ5IHVwIHRvIDkwJSBidXQgbWF5IGJlIGludGVycnVwdGVkLlxuICAgKiBVc2UgZm9yIGZhdWx0LXRvbGVyYW50IHdvcmtsb2Fkcy5cbiAgICovXG4gIHNwb3RDYXBhY2l0eVBlcmNlbnRhZ2U/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQmFzZSBMYW1iZGEgY29uZmlndXJhdGlvbiBzaGFyZWQgYnkgYm90aCBjb250YWluZXIgYW5kIGNvZGUgZGVwbG95bWVudHMuXG4gKi9cbmludGVyZmFjZSBCYXNlTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlQ29tcHV0ZVByb3BzIHtcbiAgdHlwZTogXCJsYW1iZGFcIjtcbiAgLyoqIFRpbWVvdXQgaW4gc2Vjb25kcy4gRGVmYXVsdDogMyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogTWVtb3J5IHNpemUgaW4gTUIuIERlZmF1bHQ6IDEyOCAqL1xuICBtZW1vcnlTaXplPzogbnVtYmVyO1xuICBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IG51bWJlcjtcbiAgLyoqIENQVSBhcmNoaXRlY3R1cmUuIERlZmF1bHQ6IHg4Nl82NC4gVXNlIEFyY2hpdGVjdHVyZS5BUk1fNjQgZm9yIEdyYXZpdG9uMi4gKi9cbiAgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuICAvKiogTGFtYmRhIGZ1bmN0aW9uIGRlc2NyaXB0aW9uICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogSUFNIHJvbGUgZGVzY3JpcHRpb24gKi9cbiAgcm9sZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8vIElubGluZSBwb2xpY2llcyAtIHJvdXRlZCB0byBleGVjdXRpb24gcm9sZSBmb3IgRUNTLCB0YXNrIHJvbGUgZm9yIExhbWJkYVxuICAvKiogSW5saW5lIElBTSBwb2xpY3kgc3RhdGVtZW50cyAqL1xuICBpbmxpbmVQb2xpY3k/OiBQb2xpY3lTdGF0ZW1lbnRbXTtcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIFVSTCBjb25maWd1cmF0aW9uLlxuICAgKiAtIE9taXQ6IGRpc2FibGVkIChkZWZhdWx0KVxuICAgKiAtIGB7fWA6IGVuYWJsZWQgd2l0aCBJQU0gYXV0aFxuICAgKiAtIGB7IGF1dGhUeXBlOiBcIk5PTkVcIiB9YDogcHVibGljIGFjY2Vzc1xuICAgKiAtIGBmYWxzZWA6IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uVXJsPzogRnVuY3Rpb25VcmxDb25maWcgfCBmYWxzZTtcbiAgLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyAqL1xuICBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFNlY3JldHMgZnJvbSBBV1MgU1NNIFBhcmFtZXRlciBTdG9yZS5cbiAgICogQXJyYXkgb2Ygc2VjcmV0IG5hbWVzIHRoYXQgd2lsbCBiZSBmZXRjaGVkIGZyb20gdGhlIExhbWJkYSdzIFNTTSBuYW1lc3BhY2UuXG4gICAqIFRoZSBuYW1lc3BhY2UgcGF0aCBpcyBhdXRvLWRldGVybWluZWQgYXM6IC88YXBwTmFtZT4vbGFtYmRhLzxmdW5jdGlvbk5hbWU+XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHNlY3JldHM6IFtcIkFQSV9LRVlcIiwgXCJTVFJJUEVfU0VDUkVUXCJdXG4gICAqL1xuICBzZWNyZXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGF0aCBmb3Igc2VjcmV0cy5cbiAgICogSWYgc2VjcmV0cyBhcmUgZGVmaW5lZCwgdGhpcyBwYXRoIGlzIHVzZWQgYXMgdGhlIGJhc2UgcGF0aC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgdXNlczogLzxhcHBOYW1lPi9sYW1iZGEvPGZ1bmN0aW9uTmFtZT5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc3NtU2VjcmV0c1BhdGg6IFwiL215YXBwL2N1c3RvbS9wYXRoXCJcbiAgICovXG4gIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWNyZXRzIGltcG9ydGVkIGZyb20gb3RoZXIgQ0RLIHJlc291cmNlcyAoQVdTIFNlY3JldHMgTWFuYWdlcikuXG4gICAqIFVzZWQgZm9yIENESy1tYW5hZ2VkIHNlY3JldHMgbGlrZSBkYXRhYmFzZSBjcmVkZW50aWFscy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogc2VjcmV0c0ltcG9ydDoge1xuICAgKiAgIERBVEFCQVNFX1VTRVJOQU1FOiBkYXRhYmFzZS5nZXRDcmVkZW50aWFscygpLmdldEltcG9ydChcInVzZXJuYW1lXCIpLFxuICAgKiAgIERBVEFCQVNFX1BBU1NXT1JEOiBkYXRhYmFzZS5nZXRDcmVkZW50aWFscygpLmdldEltcG9ydChcInBhc3N3b3JkXCIpXG4gICAqIH1cbiAgICovXG4gIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+O1xuXG4gIC8qKlxuICAgKiBBcHBsaWNhdGlvbiBuYW1lIGZvciBTU00gc2VjcmV0cyBwYXRoIGRlcml2YXRpb24uXG4gICAqIEF1dG8tZGVyaXZlZCBmcm9tIEFwcCBpbnN0YW5jZSB3aGVuIHVzaW5nIENvbXB1dGVGYWN0b3J5LlxuICAgKiBPbmx5IHNwZWNpZnkgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcy5cbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlcyB0aGlzIExhbWJkYSBuZWVkcyB0byBjb25uZWN0IHRvIChlLmcuLCBkYXRhYmFzZXMsIFMzIGJ1Y2tldHMsIFNRUyBxdWV1ZXMpLlxuICAgKiBDcmVhdGVzIHNlY3VyaXR5IGdyb3VwIHJ1bGVzIGZvciBJQ29ubmVjdGFibGUgcmVzb3VyY2VzIGFuZCBJQU0gZ3JhbnRzIGZvciBJQU0gcmVzb3VyY2VzLlxuICAgKlxuICAgKiBTdXBwb3J0czpcbiAgICogLSBJQ29ubmVjdGFibGU6IFNlY3VyaXR5IGdyb3VwIHJlc291cmNlcyAoUkRTLCBFQ1MsIGV0Yy4pXG4gICAqIC0gSVN0b3JhZ2VDb25uZWN0b3I6IFMzIGJ1Y2tldHMgKElBTSBncmFudHMpXG4gICAqIC0gSUR5bmFtb0RCQ29ubmVjdG9yOiBEeW5hbW9EQiB0YWJsZXMgKElBTSBncmFudHMpXG4gICAqIC0gSVF1ZXVlQ29ubmVjdG9yOiBTUVMgcXVldWVzIChJQU0gZ3JhbnRzKVxuICAgKiAtIENvbm5lY3Rpb25Db25maWc6IEV4cGxpY2l0IGFjY2VzcyBsZXZlbCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbm5lY3Rpb25zOiBbXG4gICAqICAgZGF0YWJhc2UsXG4gICAqICAgeyByZXNvdXJjZTogcXVldWUsIGFjY2VzczogXCJzZW5kXCIgfVxuICAgKiBdXG4gICAqL1xuICBjb25uZWN0aW9ucz86IENvbm5lY3Rpb25TcGVjW107XG5cbiAgLyoqXG4gICAqIEV2ZW50QnJpZGdlIHNjaGVkdWxlIGV4cHJlc3Npb24gZm9yIHNjaGVkdWxlZCBMYW1iZGEgaW52b2NhdGlvbnMuXG4gICAqIFVzZXMgY3JvbiBvciByYXRlIHN5bnRheDogXCJyYXRlKDEgaG91cilcIiBvciBcImNyb24oMCAxMiAqICogPyAqKVwiLlxuICAgKi9cbiAgc2NoZWR1bGVFeHByZXNzaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnRhaW5lci1iYXNlZCBMYW1iZGEgdXNpbmcgRUNSIGltYWdlLlxuICpcbiAqIFVzZXMgRG9ja2VyIGltYWdlIGZyb20gRUNSIHJlcG9zaXRvcnkuIEhhbmRsZXIgYW5kIHJ1bnRpbWUgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IHNldCB0byBGUk9NX0lNQUdFLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkltYWdlTGFtYmRhXCIsIHtcbiAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAqICAgZGVwbG95bWVudDogXCJjb250YWluZXJcIixcbiAqICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29udGFpbmVyLWJhc2VkIGRlcGxveW1lbnQgdXNpbmcgRUNSIGltYWdlICovXG4gIGRlcGxveW1lbnQ6IFwiY29udGFpbmVyXCI7XG4gIC8qKiBFQ1IgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBMYW1iZGEgY29udGFpbmVyIGltYWdlICovXG4gIGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG59XG5cbi8qKlxuICogQ29kZS1iYXNlZCBMYW1iZGEgdXNpbmcgaW5saW5lIGNvZGUgb3IgUzMuXG4gKlxuICogVXNlcyB0cmFkaXRpb25hbCBMYW1iZGEgZGVwbG95bWVudCB3aXRoIGNvZGUsIGhhbmRsZXIsIGFuZCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkNvZGVMYW1iZGFcIiwge1xuICogICB0eXBlOiBcImxhbWJkYVwiLFxuICogICBkZXBsb3ltZW50OiBcImNvZGVcIixcbiAqICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXCIuL2xhbWJkYVwiKSxcbiAqICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gKiAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1hcbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlTGFtYmRhUHJvcHMgZXh0ZW5kcyBCYXNlTGFtYmRhUHJvcHMge1xuICAvKiogQ29kZS1iYXNlZCBkZXBsb3ltZW50ICovXG4gIGRlcGxveW1lbnQ6IFwiY29kZVwiO1xuICAvKiogTGFtYmRhIGNvZGUgKGZyb20gYXNzZXQsIFMzLCBvciBpbmxpbmUpICovXG4gIGNvZGU6IENvZGU7XG4gIC8qKiBIYW5kbGVyIGZ1bmN0aW9uLiBEZWZhdWx0OiBcImluZGV4LmhhbmRsZXJcIiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogTGFtYmRhIHJ1bnRpbWUuIERlZmF1bHQ6IE5PREVKU18yMl9YICovXG4gIHJ1bnRpbWU/OiBSdW50aW1lO1xufVxuXG4vKipcbiAqIExhbWJkYSBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBlbnN1cmluZyB0eXBlLXNhZmUgTGFtYmRhIGNvbmZpZ3VyYXRpb246XG4gKiAtIGBkZXBsb3ltZW50OiBcImNvbnRhaW5lclwiYCByZXF1aXJlcyBgZWNyUmVwb3NpdG9yeWBcbiAqIC0gYGRlcGxveW1lbnQ6IFwiY29kZVwiYCByZXF1aXJlcyBgY29kZWAgYW5kIGFsbG93cyBgaGFuZGxlcmAvYHJ1bnRpbWVgXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnRhaW5lci1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb250YWluZXJcIiwgZWNyUmVwb3NpdG9yeTogZWNyIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29kZS1iYXNlZCBMYW1iZGFcbiAqIHsgdHlwZTogXCJsYW1iZGFcIiwgZGVwbG95bWVudDogXCJjb2RlXCIsIGNvZGU6IENvZGUuZnJvbUFzc2V0KFwiLi9sYW1iZGFcIikgfVxuICovXG5leHBvcnQgdHlwZSBMYW1iZGFDb21wdXRlUHJvcHMgPSBDb250YWluZXJMYW1iZGFQcm9wcyB8IENvZGVMYW1iZGFQcm9wcztcblxuLy8gVHlwZS1zYWZlIHByb3BzIHdpdGggbGl0ZXJhbCBkaXNjcmltaW5hdG9ycyBmb3IgZmFjdG9yeSBvdmVybG9hZHNcbmV4cG9ydCB0eXBlIElFY3NDb21wdXRlUHJvcHMgPSBFY3NDb21wdXRlUHJvcHM7XG5leHBvcnQgdHlwZSBJTGFtYmRhQ29tcHV0ZVByb3BzID0gTGFtYmRhQ29tcHV0ZVByb3BzO1xuZXhwb3J0IHR5cGUgSUVjMkNvbXB1dGVQcm9wcyA9IEVjMkNvbXB1dGVQcm9wcztcblxuZXhwb3J0IHR5cGUgSUNvbXB1dGVQcm9wcyA9XG4gIHwgSUVjc0NvbXB1dGVQcm9wc1xuICB8IElMYW1iZGFDb21wdXRlUHJvcHNcbiAgfCBJRWMyQ29tcHV0ZVByb3BzO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBjb21wdXRlIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBpZ25vcmVkIG9yIG1pc2NvbmZpZ3VyZWQgb3B0aW9ucy5cbiAqIFRoZXNlIGNoZWNrcyBoZWxwIGNhdGNoIGlzc3VlcyB3aGVuIHByb3BzIGNvbWUgZnJvbSBkeW5hbWljIHNvdXJjZXMgd2hlcmVcbiAqIFR5cGVTY3JpcHQncyBjb21waWxlLXRpbWUgY2hlY2tzIG1heSBub3QgYXBwbHkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHV0ZVByb3BzKHByb3BzOiBJQ29tcHV0ZVByb3BzKTogdm9pZCB7XG4gIC8vIEVDUy1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1FQ1MgY29tcHV0ZVxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wcyxcbiAgICBbXCJjYXBhY2l0eVByb3ZpZGVyXCIsIFwiZWMyQ29uZmlnXCIsIFwic2VydmljZXNcIiwgXCJjbHVzdGVyXCJdLFxuICAgIFwiZWNzXCIsXG4gICAgXCJFQ1MgY29tcHV0ZVwiXG4gICk7XG5cbiAgLy8gTGFtYmRhLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUxhbWJkYSBjb21wdXRlXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcImZ1bmN0aW9uVXJsXCIsIFwiaGFuZGxlclwiLCBcInJ1bnRpbWVcIl0sXG4gICAgXCJsYW1iZGFcIixcbiAgICBcIkxhbWJkYSBjb21wdXRlXCJcbiAgKTtcblxuICAvLyBFQzItc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tRUMyIGNvbXB1dGVcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHMsXG4gICAgW1wic3NoXCIsIFwidXNlckRhdGFcIiwgXCJtYWNoaW5lSW1hZ2VcIl0sXG4gICAgXCJlYzJcIixcbiAgICBcIkVDMiBjb21wdXRlXCJcbiAgKTtcblxuICAvLyBFQ1Mtc3BlY2lmaWMgdmFsaWRhdGlvbiAtIHR5cGUgbmFycm93aW5nIGhhbmRsZWQgYnkgZGlzY3JpbWluYXRlZCB1bmlvblxuICBpZiAocHJvcHMudHlwZSA9PT0gXCJlY3NcIikge1xuICAgIHZhbGlkYXRlRWNzUHJvcHMocHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIEVDUy1zcGVjaWZpYyBwcm9wcy5cbiAqIEV4dHJhY3RlZCBmb3IgY2xhcml0eSBhbmQgZGV0YWlsIHBhcml0eSB3aXRoIGRhdGFiYXNlL25ldHdvcmsgcGF0dGVybnMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRWNzUHJvcHMocHJvcHM6IEVjc0NvbXB1dGVQcm9wcyk6IHZvaWQge1xuICAvLyBWYWxpZGF0ZSBzZXJ2aWNlcyBhcnJheSBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eVxuICBpZiAoIXByb3BzLnNlcnZpY2VzIHx8IHByb3BzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQXQgbGVhc3Qgb25lIHNlcnZpY2UgbXVzdCBiZSBzcGVjaWZpZWQgaW4gJ3NlcnZpY2VzJyBhcnJheS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB1bmlxdWUgc2VydmljZSBuYW1lc1xuICBjb25zdCBzZXJ2aWNlTmFtZXMgPSBwcm9wcy5zZXJ2aWNlcy5tYXAoKHMpID0+IHMubmFtZSk7XG4gIGNvbnN0IGR1cGxpY2F0ZU5hbWVzID0gc2VydmljZU5hbWVzLmZpbHRlcihcbiAgICAobmFtZSwgaW5kZXgpID0+IHNlcnZpY2VOYW1lcy5pbmRleE9mKG5hbWUpICE9PSBpbmRleFxuICApO1xuICBpZiAoZHVwbGljYXRlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEdXBsaWNhdGUgc2VydmljZSBuYW1lczogJHtbLi4ubmV3IFNldChkdXBsaWNhdGVOYW1lcyldLmpvaW4oXCIsIFwiKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHNlcnZpY2UgbmFtZSBmb3JtYXRcbiAgY29uc3QgaW52YWxpZE5hbWVzID0gcHJvcHMuc2VydmljZXMuZmlsdGVyKFxuICAgIChzKSA9PiAhL15bYS16QS1aXVthLXpBLVowLTktXSokLy50ZXN0KHMubmFtZSlcbiAgKTtcbiAgaWYgKGludmFsaWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgc2VydmljZSBuYW1lczogJHtpbnZhbGlkTmFtZXMubWFwKChzKSA9PiBzLm5hbWUpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBcIlNlcnZpY2UgbmFtZXMgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIGh5cGhlbnMuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgcm91dGluZyB3aGVuIG11bHRpcGxlIHNlcnZpY2VzIGhhdmUgcG9ydHNcbiAgY29uc3Qgc2VydmljZXNXaXRoUG9ydHMgPSBwcm9wcy5zZXJ2aWNlcy5maWx0ZXIoKHMpID0+XG4gICAgcy5jb250YWluZXJzPy5zb21lKChjKSA9PiBjLnBvcnQpXG4gICk7XG5cbiAgaWYgKHNlcnZpY2VzV2l0aFBvcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBtaXNzaW5nUm91dGluZyA9IHNlcnZpY2VzV2l0aFBvcnRzLmZpbHRlcigocykgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBBcnJheS5pc0FycmF5KHMucm91dGluZylcbiAgICAgICAgPyBzLnJvdXRpbmdcbiAgICAgICAgOiBzLnJvdXRpbmdcbiAgICAgICAgICA/IFtzLnJvdXRpbmddXG4gICAgICAgICAgOiBbXTtcbiAgICAgIHJldHVybiAhcnVsZXMuc29tZSgocikgPT4gci5wYXRoIHx8IHIuaG9zdCk7XG4gICAgfSk7XG4gICAgaWYgKG1pc3NpbmdSb3V0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNlcnZpY2VzIHdpdGggcG9ydHMgcmVxdWlyZSByb3V0aW5nIGNvbmZpZyB3aGVuIGNsdXN0ZXIgaGFzIG11bHRpcGxlIHNlcnZpY2VzOiBgICtcbiAgICAgICAgICBgJHttaXNzaW5nUm91dGluZy5tYXAoKHMpID0+IHMubmFtZSkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJBZGQgcm91dGluZzogeyBwYXRoOiAnLy4uLicgfSBvciByb3V0aW5nOiB7IGhvc3Q6ICcuLi4nIH0gdG8gZWFjaCBzZXJ2aWNlLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGVhY2ggc2VydmljZSdzIGNvbnRhaW5lcnNcbiAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHByb3BzLnNlcnZpY2VzKSB7XG4gICAgaWYgKHNlcnZpY2UuY29udGFpbmVycyAmJiBzZXJ2aWNlLmNvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb250YWluZXIgbmFtZXMgd2l0aGluIHNlcnZpY2UgKG9ubHkgbmFtZWQgY29udGFpbmVycylcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWVzID0gc2VydmljZS5jb250YWluZXJzXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMubmFtZSlcbiAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzID0gY29udGFpbmVyTmFtZXMuZmlsdGVyKFxuICAgICAgICAobmFtZSwgaW5kZXgpID0+IGNvbnRhaW5lck5hbWVzLmluZGV4T2YobmFtZSkgIT09IGluZGV4XG4gICAgICApO1xuICAgICAgaWYgKGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nOiBEdXBsaWNhdGUgY29udGFpbmVyIG5hbWVzOiBgICtcbiAgICAgICAgICAgIGAke1suLi5uZXcgU2V0KGR1cGxpY2F0ZUNvbnRhaW5lck5hbWVzKV0uam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyID09PSBcIkVDMlwiICYmICFzZXJ2aWNlLmVjMkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyB1c2VzIEVDMiBjYXBhY2l0eSBwcm92aWRlciBidXQgbm8gZWMyQ29uZmlnIGlzIGRlZmluZWQuIGAgK1xuICAgICAgICAgIFwiUHJvdmlkZSBlYzJDb25maWcgb24gdGhlIHNlcnZpY2UuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FybiBpZiBzZXJ2aWNlIGVjMkNvbmZpZyBpcyBkZWZpbmVkIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCBFQzJcbiAgICBpZiAoc2VydmljZS5lYzJDb25maWcgJiYgc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyICE9PSBcIkVDMlwiKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBgU2VydmljZSAnJHtzZXJ2aWNlLm5hbWV9JyBoYXMgZWMyQ29uZmlnIGJ1dCBjYXBhY2l0eVByb3ZpZGVyIGlzIG5vdCAnRUMyJy4gYCArXG4gICAgICAgICAgXCJUaGUgZWMyQ29uZmlnIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgY2FwYWNpdHlQcm92aWRlciBpcyBzZXQgdG8gJ0VDMicuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgY29udGFpbmVyIGNvbmZpZ3VyYXRpb25zIGZvciBhbiBFQ1Mgc2VydmljZS5cbiAqIENvbnZlcnRzIHVzZXItZmFjaW5nIEVjc0NvbnRhaW5lckNvbmZpZyB0byBpbnRlcm5hbCBFY3NDbHVzdGVyUHJvcHMgZm9ybWF0LlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29udGFpbmVyQ29uZmlncyhcbiAgc2VydmljZTogRWNzU2VydmljZUNvbmZpZ1xuKTogRWNzQ2x1c3RlclByb3BzW1wic2VydmljZXNcIl1bbnVtYmVyXVtcImNvbnRhaW5lcnNcIl0ge1xuICBpZiAoc2VydmljZS5jb250YWluZXJzICYmIHNlcnZpY2UuY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHNlcnZpY2UuY29udGFpbmVycy5tYXAoKGMsIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogYy5uYW1lIHx8IGAke3NlcnZpY2UubmFtZX1Db250YWluZXIke2luZGV4ID4gMCA/IGluZGV4IDogXCJcIn1gLFxuICAgICAgaW1hZ2U6IGMuaW1hZ2UsXG4gICAgICBwb3J0OiBjLnBvcnQsXG4gICAgICBlbnZpcm9ubWVudDogYy5lbnZpcm9ubWVudCxcbiAgICAgIHNlY3JldHM6IGMuc2VjcmV0cyxcbiAgICAgIHNlY3JldHNJbXBvcnQ6IGMuc2VjcmV0c0ltcG9ydCxcbiAgICAgIGNvbW1hbmQ6IGMuY29tbWFuZCxcbiAgICAgIGVudHJ5UG9pbnQ6IGMuZW50cnlQb2ludCxcbiAgICAgIGVzc2VudGlhbDogYy5lc3NlbnRpYWwsXG4gICAgICBoZWFsdGhDaGVjazogYy5oZWFsdGhDaGVja1xuICAgIH0pKTtcbiAgfVxuICAvLyBEZWZhdWx0IGNvbnRhaW5lciAobm8gcG9ydCA9IHdvcmtlcilcbiAgcmV0dXJuIFt7IG5hbWU6IGAke3NlcnZpY2UubmFtZX1Db250YWluZXJgIH1dO1xufVxuXG4vKipcbiAqIFJlc29sdmVkIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmb3IgYW4gRUNTIHNlcnZpY2UuXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIHNjYWxpbmdUeXBlOiBTY2FsaW5nVHlwZSB8IHVuZGVmaW5lZDtcbiAgbWluQ2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbWF4Q2FwYWNpdHk6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHNjYWxpbmcgY29uZmlndXJhdGlvbiBmcm9tIHNlcnZpY2UgcHJvcHMuXG4gKiBIYW5kbGVzIHRoZSB0aHJlZSBjYXNlczogZXhwbGljaXQgY29uZmlnLCBkaXNhYmxlZCAoZmFsc2UpLCBvciBkZWZhdWx0ICh1bmRlZmluZWQpLlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTY2FsaW5nQ29uZmlnKFxuICBzY2FsaW5nOiBFY3NTY2FsaW5nQ29uZmlnIHwgZmFsc2UgfCB1bmRlZmluZWRcbik6IFJlc29sdmVkU2NhbGluZ0NvbmZpZyB7XG4gIGlmIChzY2FsaW5nID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2FsaW5nVHlwZTogdW5kZWZpbmVkLFxuICAgICAgbWluQ2FwYWNpdHk6IHVuZGVmaW5lZCxcbiAgICAgIG1heENhcGFjaXR5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIGlmIChzY2FsaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlLkNQVSxcbiAgICAgIG1pbkNhcGFjaXR5OiB1bmRlZmluZWQsXG4gICAgICBtYXhDYXBhY2l0eTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjYWxpbmdUeXBlOiBzY2FsaW5nLnNjYWxpbmdUeXBlID8/IFNjYWxpbmdUeXBlLkNQVSxcbiAgICBtaW5DYXBhY2l0eTogc2NhbGluZy5taW5DYXBhY2l0eSxcbiAgICBtYXhDYXBhY2l0eTogc2NhbGluZy5tYXhDYXBhY2l0eVxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVkIExhbWJkYSBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRMYW1iZGFEZXBsb3ltZW50IHtcbiAgY29kZTogQ29kZTtcbiAgaGFuZGxlcjogc3RyaW5nO1xuICBydW50aW1lOiBSdW50aW1lO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFtYmRhIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiBmcm9tIHByb3BzLlxuICogSGFuZGxlcyBjb250YWluZXIgdnMgY29kZSBkZXBsb3ltZW50IHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxhbWJkYURlcGxveW1lbnQoXG4gIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzXG4pOiBSZXNvbHZlZExhbWJkYURlcGxveW1lbnQge1xuICBpZiAocHJvcHMuZGVwbG95bWVudCA9PT0gXCJjb250YWluZXJcIikge1xuICAgIGlmICghKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImVjclJlcG9zaXRvcnkgbXVzdCBiZSBhIFJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIExhbWJkYSBjb21wdXRlIHR5cGVcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUVjckltYWdlKHByb3BzLmVjclJlcG9zaXRvcnksIHtcbiAgICAgICAgdGFnT3JEaWdlc3Q6IENPTVBVVEVfREVGQVVMVFMuRUNTLklNQUdFX1RBR1xuICAgICAgfSksXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyLkZST01fSU1BR0UsXG4gICAgICBydW50aW1lOiBSdW50aW1lLkZST01fSU1BR0VcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgY29kZTogcHJvcHMuY29kZSxcbiAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyIHx8IENPTVBVVEVfREVGQVVMVFMuTEFNQkRBLkhBTkRMRVIsXG4gICAgcnVudGltZTogcHJvcHMucnVudGltZSB8fCBDT01QVVRFX0RFRkFVTFRTLkxBTUJEQS5SVU5USU1FXG4gIH07XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgY29tcHV0ZSByZXNvdXJjZXMgd2l0aCB0eXBlLXNhZmUgcmV0dXJuIHR5cGVzLlxuICpcbiAqIFRoZSBmYWN0b3J5IHVzZXMgb3ZlcmxvYWRzIHRvIGluZmVyIHRoZSBzcGVjaWZpYyBjb21wdXRlIHR5cGUgZnJvbSBwcm9wcyxcbiAqIGVuc3VyaW5nIFR5cGVTY3JpcHQgcHJvdmlkZXMgb25seSB0aGUgcmVsZXZhbnQgbWV0aG9kcyBmb3IgZWFjaCBjb21wdXRlIHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVDUyBjb21wdXRlIC0gcmV0dXJucyBFY3NDb21wdXRlIHdpdGggRUNTLXNwZWNpZmljIG1ldGhvZHNcbiAqIGNvbnN0IGVjcyA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiV2ViQXBwXCIsIHtcbiAqICAgdHlwZTogXCJlY3NcIixcbiAqICAgY2x1c3RlcjogeyBkb21haW46IFwiYXBwLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwid2ViXCIsIGNvbnRhaW5lcnM6IFt7IHBvcnQ6IDMwMDAgfV0gfV1cbiAqIH0pKTtcbiAqIGVjcy5nZXRMb2FkQmFsYW5jZXIoKTsgLy8gQXZhaWxhYmxlIG9uIEVjc0NvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTGFtYmRhIGNvbXB1dGUgLSByZXR1cm5zIExhbWJkYUNvbXB1dGUgd2l0aCBMYW1iZGEtc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgbGFtYmRhID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJGblwiLCB7XG4gKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gKiAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICogICBjb2RlOiBDb2RlLmZyb21Bc3NldChcIi4vbGFtYmRhXCIpXG4gKiB9KSk7XG4gKiBsYW1iZGEuZ2V0RnVuY3Rpb25VcmwoKTsgLy8gQXZhaWxhYmxlIG9uIExhbWJkYUNvbXB1dGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRUMyIGNvbXB1dGUgLSByZXR1cm5zIEVjMkNvbXB1dGUgd2l0aCBFQzItc3BlY2lmaWMgbWV0aG9kc1xuICogY29uc3QgZWMyID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJJbnN0YW5jZVwiLCB7XG4gKiAgIHR5cGU6IFwiZWMyXCIsXG4gKiAgIGluc3RhbmNlVHlwZTogXCJ0NGcubWljcm9cIlxuICogfSkpO1xuICogZWMyLmdldEF1dG9TY2FsaW5nR3JvdXAoKTsgLy8gQXZhaWxhYmxlIG9uIEVjMkNvbXB1dGVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXB1dGVGYWN0b3J5IHtcbiAgLy8gT3ZlcmxvYWQ6IEVDUyBwcm9wcyByZXR1cm5zIEVjc0NvbXB1dGVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElFY3NDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBFY3NDb21wdXRlO1xuICAvLyBPdmVybG9hZDogTGFtYmRhIHByb3BzIHJldHVybnMgTGFtYmRhQ29tcHV0ZVxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUxhbWJkYUNvbXB1dGVQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IExhbWJkYUNvbXB1dGU7XG4gIC8vIE92ZXJsb2FkOiBFQzIgcHJvcHMgcmV0dXJucyBFYzJDb21wdXRlXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJRWMyQ29tcHV0ZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gRWMyQ29tcHV0ZTtcbiAgLy8gSW1wbGVtZW50YXRpb24gc2lnbmF0dXJlXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJQ29tcHV0ZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gQW55Q29tcHV0ZSB7XG4gICAgcmV0dXJuIChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCk6IEFueUNvbXB1dGUgPT4ge1xuICAgICAgdmFsaWRhdGVDb21wdXRlUHJvcHMocHJvcHMpO1xuXG4gICAgICAvLyBBdXRvLWRlcml2ZSBhcHBOYW1lIGZyb20gQXBwIGluc3RhbmNlIGZvciBFQ1MgY29tcHV0ZVxuICAgICAgY29uc3QgdHlwZUNvbmZpZyA9IENPTVBVVEVfVFlQRV9DT05GSUdbcHJvcHMudHlwZV07XG4gICAgICBjb25zdCBuZWVkc1ZwYyA9XG4gICAgICAgIHR5cGVDb25maWcucmVxdWlyZXNWcGMgfHxcbiAgICAgICAgKFwiY29ubmVjdGlvbnNcIiBpbiBwcm9wcyAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocHJvcHMuY29ubmVjdGlvbnMpICYmXG4gICAgICAgICAgcHJvcHMuY29ubmVjdGlvbnMubGVuZ3RoID4gMCk7XG4gICAgICBsZXQgY29tcHV0ZVByb3BzOiBJQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiBuZWVkc1ZwYyA/IGFwcC5nZXRWcGMoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlY3JSZXBvc2l0b3J5OiBhcHAuZ2V0RGVmYXVsdENvbnRhaW5lclJlZ2lzdHJ5KClcbiAgICAgICAgfSxcbiAgICAgICAgLi4ucHJvcHNcbiAgICAgIH07XG5cbiAgICAgIGlmIChjb21wdXRlUHJvcHMudHlwZSA9PT0gXCJlY3NcIikge1xuICAgICAgICBjb21wdXRlUHJvcHMgPSB7XG4gICAgICAgICAgLi4uY29tcHV0ZVByb3BzLFxuICAgICAgICAgIGFwcE5hbWU6IGNvbXB1dGVQcm9wcy5hcHBOYW1lID8/IGFwcC5nZXROYW1lKClcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNwZWNpZmljIGNvbXB1dGUgY2xhc3MgYmFzZWQgb24gdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICBzd2l0Y2ggKGNvbXB1dGVQcm9wcy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJlY3NcIjoge1xuICAgICAgICAgIC8vIFJlZ2lzdGVyIEVDUyBzZXJ2aWNlcyB3aXRoIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgQ0xJIGRpc2NvdmVyeVxuICAgICAgICAgIGNvbnN0IGNvbGxlY3RvciA9IGFwcC5nZXRNYW5pZmVzdENvbGxlY3RvcigpO1xuICAgICAgICAgIGNvbnN0IGNsdXN0ZXJOYW1lID0gaWQ7XG4gICAgICAgICAgY29uc3QgYXBwTmFtZSA9IGNvbXB1dGVQcm9wcy5hcHBOYW1lID8/IGFwcC5nZXROYW1lKCk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2YgY29tcHV0ZVByb3BzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBtYW5pZmVzdFNlcnZpY2U6IE1hbmlmZXN0U2VydmljZSA9IHtcbiAgICAgICAgICAgICAgbmFtZTogc2VydmljZS5uYW1lLFxuICAgICAgICAgICAgICBjbHVzdGVyTmFtZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gSW5jbHVkZSBkb2NrZXJmaWxlUGF0aCBpZiBzcGVjaWZpZWQgKG1ldGFkYXRhIGZvciBDTEkpXG4gICAgICAgICAgICBpZiAoc2VydmljZS5kb2NrZXJmaWxlUGF0aCkge1xuICAgICAgICAgICAgICBtYW5pZmVzdFNlcnZpY2UuZG9ja2VyZmlsZVBhdGggPSBzZXJ2aWNlLmRvY2tlcmZpbGVQYXRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmNsdWRlIGRvY2tlclRhcmdldCBpZiBzcGVjaWZpZWQgKG1ldGFkYXRhIGZvciBDTEkpXG4gICAgICAgICAgICBpZiAoc2VydmljZS5kb2NrZXJUYXJnZXQpIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLmRvY2tlclRhcmdldCA9IHNlcnZpY2UuZG9ja2VyVGFyZ2V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5kIGNvbnRhaW5lciBwb3J0IGZyb20gZmlyc3QgY29udGFpbmVyIHdpdGggYSBwb3J0XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJXaXRoUG9ydCA9IHNlcnZpY2UuY29udGFpbmVycz8uZmluZChcbiAgICAgICAgICAgICAgKGMpID0+IGMucG9ydCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lcldpdGhQb3J0Py5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLmNvbnRhaW5lclBvcnQgPSBjb250YWluZXJXaXRoUG9ydC5wb3J0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZ2dyZWdhdGUgc2VjcmV0cyBmcm9tIGFsbCBjb250YWluZXJzIChkZWR1cGxpY2F0ZWQpXG4gICAgICAgICAgICBjb25zdCBhbGxTZWNyZXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBzZXJ2aWNlLmNvbnRhaW5lcnMgPz8gW10pIHtcbiAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5zZWNyZXRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzZWNyZXQgb2YgY29udGFpbmVyLnNlY3JldHMpIHtcbiAgICAgICAgICAgICAgICAgIGFsbFNlY3JldHMuYWRkKHNlY3JldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWxsU2VjcmV0cy5zaXplID4gMCkge1xuICAgICAgICAgICAgICBtYW5pZmVzdFNlcnZpY2Uuc2VjcmV0cyA9IEFycmF5LmZyb20oYWxsU2VjcmV0cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgc3NtU2VjcmV0c1BhdGggKGV4cGxpY2l0IG9yIGRlcml2ZWQpXG4gICAgICAgICAgICBtYW5pZmVzdFNlcnZpY2Uuc3NtU2VjcmV0c1BhdGggPVxuICAgICAgICAgICAgICBzZXJ2aWNlLnNzbVNlY3JldHNQYXRoID8/XG4gICAgICAgICAgICAgIGAvJHthcHBOYW1lfS8ke2NsdXN0ZXJOYW1lfS8ke3NlcnZpY2UubmFtZX1gO1xuXG4gICAgICAgICAgICBjb2xsZWN0b3IuYWRkU2VydmljZShtYW5pZmVzdFNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IEVjc0NvbXB1dGUoc2NvcGUsIGlkLCBjb21wdXRlUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJsYW1iZGFcIjoge1xuICAgICAgICAgIC8vIEFkZCBhcHBOYW1lIHRvIHByb3BzIGZvciBMYW1iZGEgKG5lZWRlZCBmb3Igc2VjcmV0cyBwYXRoIGRlcml2YXRpb24pXG4gICAgICAgICAgY29uc3QgbGFtYmRhQ29tcHV0ZVByb3BzID0ge1xuICAgICAgICAgICAgLi4uY29tcHV0ZVByb3BzLFxuICAgICAgICAgICAgYXBwTmFtZTogYXBwLmdldE5hbWUoKVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBBbHdheXMgcmVnaXN0ZXIgTGFtYmRhIHdpdGggbWFuaWZlc3QgY29sbGVjdG9yIGZvciBDTEkgZGlzY292ZXJ5XG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBMYW1iZGFzIGFyZSBkaXNjb3ZlcmFibGUgZm9yIHNlY3JldHMgbWFuYWdlbWVudCxcbiAgICAgICAgICAvLyBldmVuIHRob3NlIHRoYXQgZG9uJ3QgY3VycmVudGx5IGhhdmUgc2VjcmV0cyBjb25maWd1cmVkXG4gICAgICAgICAgY29uc3QgY29sbGVjdG9yID0gYXBwLmdldE1hbmlmZXN0Q29sbGVjdG9yKCk7XG4gICAgICAgICAgY29uc3QgbWFuaWZlc3RMYW1iZGE6IE1hbmlmZXN0TGFtYmRhID0ge1xuICAgICAgICAgICAgbmFtZTogaWQsXG4gICAgICAgICAgICBzc21TZWNyZXRzUGF0aDpcbiAgICAgICAgICAgICAgbGFtYmRhQ29tcHV0ZVByb3BzLnNzbVNlY3JldHNQYXRoIHx8XG4gICAgICAgICAgICAgIGAvJHtsYW1iZGFDb21wdXRlUHJvcHMuYXBwTmFtZX0vbGFtYmRhLyR7aWR9YFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGFtYmRhQ29tcHV0ZVByb3BzLnNlY3JldHMgJiZcbiAgICAgICAgICAgIGxhbWJkYUNvbXB1dGVQcm9wcy5zZWNyZXRzLmxlbmd0aCA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hbmlmZXN0TGFtYmRhLnNlY3JldHMgPSBsYW1iZGFDb21wdXRlUHJvcHMuc2VjcmV0cztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29sbGVjdG9yLmFkZExhbWJkYShtYW5pZmVzdExhbWJkYSk7XG5cbiAgICAgICAgICByZXR1cm4gbmV3IExhbWJkYUNvbXB1dGUoc2NvcGUsIGlkLCBsYW1iZGFDb21wdXRlUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJlYzJcIjpcbiAgICAgICAgICByZXR1cm4gbmV3IEVjMkNvbXB1dGUoc2NvcGUsIGlkLCBjb21wdXRlUHJvcHMpO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gY29tcHV0ZVByb3BzO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBjb21wdXRlIHR5cGU6ICR7U3RyaW5nKChfZXhoYXVzdGl2ZSBhcyBJQ29tcHV0ZVByb3BzKS50eXBlKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBFQ1MgY29tcHV0ZSB3cmFwcGVyIGltcGxlbWVudGluZyBJRWNzQ29tcHV0ZS5cbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBhY2Nlc3MgdG8gRUNTLXNwZWNpZmljIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEVjc0NvbXB1dGUgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJRWNzQ29tcHV0ZSB7XG4gIHB1YmxpYyByZWFkb25seSBjb21wdXRlVHlwZSA9IFwiZWNzXCIgYXMgY29uc3Q7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlY3NDbHVzdGVyOiBFY3NDbHVzdGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJRWNzQ29tcHV0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIFRyYW5zZm9ybSBFY3NTZXJ2aWNlQ29uZmlnW10gdG8gRWNzU2VydmljZVByb3BzW10gZm9yIEVjc0NsdXN0ZXJcbiAgICBjb25zdCBzZXJ2aWNlczogRWNzQ2x1c3RlclByb3BzW1wic2VydmljZXNcIl0gPSBwcm9wcy5zZXJ2aWNlcy5tYXAoXG4gICAgICAoc2VydmljZSkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXJzID0gYnVpbGRDb250YWluZXJDb25maWdzKHNlcnZpY2UpO1xuICAgICAgICBjb25zdCB7IHNjYWxpbmdUeXBlLCBtaW5DYXBhY2l0eSwgbWF4Q2FwYWNpdHkgfSA9IHJlc29sdmVTY2FsaW5nQ29uZmlnKFxuICAgICAgICAgIHNlcnZpY2Uuc2NhbGluZ1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogc2VydmljZS5uYW1lLFxuICAgICAgICAgIGltYWdlOiBzZXJ2aWNlLmltYWdlLFxuICAgICAgICAgIGNvbnRhaW5lcnMsXG4gICAgICAgICAgY3B1OiBzZXJ2aWNlLmNwdSxcbiAgICAgICAgICBtZW1vcnlMaW1pdE1pQjogc2VydmljZS5tZW1vcnlMaW1pdE1pQixcbiAgICAgICAgICBkZXNpcmVkQ291bnQ6IHNlcnZpY2UuZGVzaXJlZENvdW50LFxuICAgICAgICAgIHNjYWxpbmdUeXBlLFxuICAgICAgICAgIG1pbkNhcGFjaXR5LFxuICAgICAgICAgIG1heENhcGFjaXR5LFxuICAgICAgICAgIHJvdXRpbmc6IHNlcnZpY2Uucm91dGluZyxcbiAgICAgICAgICB0YXNrUm9sZUlubGluZVBvbGljaWVzOiBzZXJ2aWNlLnRhc2tSb2xlSW5saW5lUG9saWNpZXMsXG4gICAgICAgICAgdGFza1JvbGVNYW5hZ2VkUG9saWNpZXM6IHNlcnZpY2UudGFza1JvbGVNYW5hZ2VkUG9saWNpZXMsXG4gICAgICAgICAgY29ubmVjdGlvbnM6IHNlcnZpY2UuY29ubmVjdGlvbnMsXG4gICAgICAgICAgY2FwYWNpdHlQcm92aWRlcjogc2VydmljZS5jYXBhY2l0eVByb3ZpZGVyLFxuICAgICAgICAgIGVjMkNvbmZpZzogc2VydmljZS5lYzJDb25maWcsXG4gICAgICAgICAgc3NtU2VjcmV0c1BhdGg6IHNlcnZpY2Uuc3NtU2VjcmV0c1BhdGgsXG4gICAgICAgICAgZG9ja2VyVGFyZ2V0OiBzZXJ2aWNlLmRvY2tlclRhcmdldFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBCdWlsZCBjbHVzdGVyIGNvbmZpZ1xuICAgIGNvbnN0IGNsdXN0ZXI6IEVjc0NsdXN0ZXJQcm9wc1tcImNsdXN0ZXJcIl0gPSBwcm9wcy5jbHVzdGVyXG4gICAgICA/IHtcbiAgICAgICAgICBkb21haW46IHByb3BzLmNsdXN0ZXIuZG9tYWluLFxuICAgICAgICAgIGxvYWRCYWxhbmNlcjogcHJvcHMuY2x1c3Rlci5sb2FkQmFsYW5jZXIsXG4gICAgICAgICAgZGlyZWN0QWNjZXNzOiBwcm9wcy5jbHVzdGVyLmRpcmVjdEFjY2VzcyxcbiAgICAgICAgICBkb21haW5Db25maWc6IHByb3BzLmNsdXN0ZXIuZG9tYWluQ29uZmlnXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZWNzUHJvcHM6IEVjc0NsdXN0ZXJQcm9wcyA9IHtcbiAgICAgIGNsdXN0ZXJOYW1lOiBpZCxcbiAgICAgIGFwcE5hbWU6IHByb3BzLmFwcE5hbWUsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGVjclJlcG9zaXRvcnk6IHByb3BzLmVjclJlcG9zaXRvcnkgfHwgQ09NUFVURV9ERUZBVUxUUy5FQ1MuRkFMTEJBQ0tfSU1BR0UsXG4gICAgICBjbHVzdGVyLFxuICAgICAgc2VydmljZXNcbiAgICB9O1xuXG4gICAgdGhpcy5lY3NDbHVzdGVyID0gbmV3IEVjc0NsdXN0ZXIoc2NvcGUsIGAke2lkfUVjc2AsIGVjc1Byb3BzKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5lY3NDbHVzdGVyLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgRUNTIGNsdXN0ZXIuICovXG4gIGdldENsdXN0ZXIoKTogSUNsdXN0ZXIge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXIuZ2V0Q2x1c3RlcigpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlciBpZiBvbmUgd2FzIGNyZWF0ZWQuICovXG4gIGdldExvYWRCYWxhbmNlcigpOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXIuZ2V0TG9hZEJhbGFuY2VyKCk7XG4gIH1cblxuICAvKiogR2V0IGEgc3BlY2lmaWMgc2VydmljZSBieSBuYW1lLiAqL1xuICBnZXRTZXJ2aWNlKG5hbWU6IHN0cmluZyk6IElCYXNlU2VydmljZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWNzQ2x1c3Rlci5nZXRTZXJ2aWNlKG5hbWUpO1xuICB9XG5cbiAgLyoqIEdldCBhbGwgc2VydmljZXMgaW4gdGhlIGNsdXN0ZXIuICovXG4gIGdldEFsbFNlcnZpY2VzKCk6IElCYXNlU2VydmljZVtdIHtcbiAgICBjb25zdCBzZXJ2aWNlc01hcCA9IHRoaXMuZWNzQ2x1c3Rlci5nZXRTZXJ2aWNlcygpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHNlcnZpY2VzTWFwLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNlY3VyaXR5IGdyb3VwIGZvciB0aGUgY2x1c3Rlci4gKi9cbiAgZ2V0U2VjdXJpdHlHcm91cCgpOiBJU2VjdXJpdHlHcm91cCB7XG4gICAgLy8gUmV0dXJuIHRoZSBmaXJzdCBzZWN1cml0eSBncm91cCBmcm9tIGNvbm5lY3Rpb25zXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cHMgPSB0aGlzLmNvbm5lY3Rpb25zLnNlY3VyaXR5R3JvdXBzO1xuICAgIGlmIChzZWN1cml0eUdyb3Vwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNlY3VyaXR5IGdyb3VwcyBmb3VuZCBmb3IgRUNTIGNsdXN0ZXJcIik7XG4gICAgfVxuICAgIHJldHVybiBzZWN1cml0eUdyb3Vwc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEFMQiBsaXN0ZW5lciBpZiB0aGlzIGlzIGFuIEVDUyBjb21wdXRlIHdpdGggQUxCLlxuICAgKi9cbiAgZ2V0TGlzdGVuZXIoKTogQXBwbGljYXRpb25MaXN0ZW5lciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWNzQ2x1c3Rlci5nZXRMaXN0ZW5lcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBFQ1MgY2x1c3RlciBjb25zdHJ1Y3QuXG4gICAqL1xuICBnZXRFY3NDbHVzdGVyKCk6IEVjc0NsdXN0ZXIge1xuICAgIHJldHVybiB0aGlzLmVjc0NsdXN0ZXI7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIGVjczpFeGVjdXRlQ29tbWFuZCBwZXJtaXNzaW9uIGZvciBFQ1Mgc2VydmljZXMuXG4gICAqIFVzZXMgd2lsZGNhcmQgcmVzb3VyY2UgYmVjYXVzZSBlY3M6RXhlY3V0ZUNvbW1hbmQgdGFyZ2V0cyB0YXNrIEFSTnNcbiAgICogd2hpY2ggYXJlIG5vdCBrbm93biB1bnRpbCBydW50aW1lICh0YXNrcyBhcmUgZXBoZW1lcmFsKS5cbiAgICovXG4gIGdyYW50RXhlY3V0ZUNvbW1hbmQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFtcImVjczpFeGVjdXRlQ29tbWFuZFwiXSxcbiAgICAgIHJlc291cmNlQXJuczogW1wiKlwiXVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTGFtYmRhIGNvbXB1dGUgd3JhcHBlciBpbXBsZW1lbnRpbmcgSUxhbWJkYUNvbXB1dGUuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIExhbWJkYS1zcGVjaWZpYyByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFDb21wdXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUxhbWJkYUNvbXB1dGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHV0ZVR5cGUgPSBcImxhbWJkYVwiIGFzIGNvbnN0O1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb246IExhbWJkYUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJTGFtYmRhQ29tcHV0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgaGFuZGxlciwgcnVudGltZSB9ID0gcmVzb2x2ZUxhbWJkYURlcGxveW1lbnQocHJvcHMpO1xuXG4gICAgLy8gQ29udmVydCBwcmVzZW5jZS1iYXNlZCBmdW5jdGlvblVybCBjb25maWcgdG8gbGVnYWN5IGJvb2xlYW4gZm9ybWF0XG4gICAgY29uc3QgZnVuY3Rpb25VcmxDb25maWcgPSBwcm9wcy5mdW5jdGlvblVybDtcbiAgICBjb25zdCBlbmFibGVGdW5jdGlvblVybCA9XG4gICAgICBmdW5jdGlvblVybENvbmZpZyAhPT0gdW5kZWZpbmVkICYmIGZ1bmN0aW9uVXJsQ29uZmlnICE9PSBmYWxzZTtcbiAgICBjb25zdCBmdW5jdGlvblVybEF1dGhUeXBlID1cbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsICYmIHR5cGVvZiBmdW5jdGlvblVybENvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IGZ1bmN0aW9uVXJsQ29uZmlnLmF1dGhUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZ1bmN0aW9uVXJsQ29ycyA9XG4gICAgICBlbmFibGVGdW5jdGlvblVybCAmJiB0eXBlb2YgZnVuY3Rpb25VcmxDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBmdW5jdGlvblVybENvbmZpZy5jb3JzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZ1bmN0aW9uVXJsSW52b2tlTW9kZSA9XG4gICAgICBlbmFibGVGdW5jdGlvblVybCAmJiB0eXBlb2YgZnVuY3Rpb25VcmxDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBmdW5jdGlvblVybENvbmZpZy5pbnZva2VNb2RlXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbGFtYmRhUHJvcHMgPSB7XG4gICAgICBjb2RlLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBoYW5kbGVyLFxuICAgICAgcnVudGltZSxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlID8/IENPTVBVVEVfREVGQVVMVFMuTEFNQkRBLkFSQ0hJVEVDVFVSRSxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplLFxuICAgICAgbGFtYmRhRGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcm9sZURlc2NyaXB0aW9uOiBwcm9wcy5yb2xlRGVzY3JpcHRpb24sXG4gICAgICBpbmxpbmVQb2xpY3k6IHByb3BzLmlubGluZVBvbGljeSB8fCBbXSxcbiAgICAgIGVuYWJsZUZ1bmN0aW9uVXJsLFxuICAgICAgZnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgICAgIGZ1bmN0aW9uVXJsQ29ycyxcbiAgICAgIGZ1bmN0aW9uVXJsSW52b2tlTW9kZSxcbiAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogcHJvcHMuc2NoZWR1bGVFeHByZXNzaW9uLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemU6IHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplLFxuICAgICAgc2VjcmV0czogcHJvcHMuc2VjcmV0cyxcbiAgICAgIHNzbVNlY3JldHNQYXRoOiBwcm9wcy5zc21TZWNyZXRzUGF0aCxcbiAgICAgIHNlY3JldHNJbXBvcnQ6IHByb3BzLnNlY3JldHNJbXBvcnQsXG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICBhcHBOYW1lOiBwcm9wcy5hcHBOYW1lLFxuICAgICAgZnVuY3Rpb25OYW1lOiBpZFxuICAgIH07XG5cbiAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gbmV3IExhbWJkYUZ1bmN0aW9uKHNjb3BlLCBgJHtpZH1MYW1iZGFgLCBsYW1iZGFQcm9wcyk7XG5cbiAgICAvLyBDREsncyBGdW5jdGlvbi5jb25uZWN0aW9ucyBnZXR0ZXIgdGhyb3dzIGZvciBub24tVlBDIExhbWJkYXMsIHNvIG9ubHlcbiAgICAvLyBhY2Nlc3MgaXQgd2hlbiBhIFZQQyBpcyBjb25maWd1cmVkLiBOb24tVlBDIExhbWJkYXMgZ2V0IGFuIGVtcHR5XG4gICAgLy8gQ29ubmVjdGlvbnMgb2JqZWN0IHRvIHNhdGlzZnkgdGhlIElDb25uZWN0YWJsZSBpbnRlcmZhY2UuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHByb3BzLnZwY1xuICAgICAgPyB0aGlzLmxhbWJkYUZ1bmN0aW9uLmNvbm5lY3Rpb25zXG4gICAgICA6IG5ldyBDb25uZWN0aW9ucygpO1xuXG4gICAgLy8gUHJvY2VzcyBjb25uZWN0aW9ucyB1c2luZyB0aGUgdW5pZmllZCBjb25uZWN0b3IgaW50ZXJmYWNlXG4gICAgaWYgKHByb3BzLmNvbm5lY3Rpb25zICYmIHByb3BzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghcHJvcHMudnBjKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTGFtYmRhICcke2lkfScgaGFzIGNvbm5lY3Rpb25zIGNvbmZpZ3VyZWQgYnV0IG5vIFZQQy4gYCArXG4gICAgICAgICAgICBcIkEgVlBDIGlzIHJlcXVpcmVkIGZvciBzZWN1cml0eSBncm91cCBjb25uZWN0aW9ucy5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvY2Vzc0Nvbm5lY3Rpb25zKFxuICAgICAgICAgIHByb3BzLmNvbm5lY3Rpb25zLFxuICAgICAgICAgIHRoaXMubGFtYmRhRnVuY3Rpb24sIC8vIElHcmFudGFibGUgKGV4ZWN1dGlvbiByb2xlKVxuICAgICAgICAgIHRoaXMubGFtYmRhRnVuY3Rpb24gLy8gSUNvbm5lY3RhYmxlIChzZWN1cml0eSBncm91cClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHByb2Nlc3MgY29ubmVjdGlvbnMgZm9yIExhbWJkYSAnJHtpZH0nOiAke1xuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgTGFtYmRhIGZ1bmN0aW9uIGJ5IG5hbWUuXG4gICAqIFNpbmNlIHdlIG9ubHkgaGF2ZSBvbmUgZnVuY3Rpb24sIG5hbWUgaXMgaWdub3JlZC5cbiAgICovXG4gIGdldEZ1bmN0aW9uKF9uYW1lPzogc3RyaW5nKTogSUZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIExhbWJkYSBmdW5jdGlvbnMuICovXG4gIGdldEFsbEZ1bmN0aW9ucygpOiBJRnVuY3Rpb25bXSB7XG4gICAgcmV0dXJuIFt0aGlzLmxhbWJkYUZ1bmN0aW9uXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZ1bmN0aW9uIFVSTCBmb3IgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBnZXRGdW5jdGlvblVybChfbmFtZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhRnVuY3Rpb24uZ2V0RnVuY3Rpb25VcmwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBpbnZva2UgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlLlxuICAgKi9cbiAgZ3JhbnRJbnZva2UoZ3JhbnRlZTogSUdyYW50YWJsZSwgX2Z1bmN0aW9uTmFtZT86IHN0cmluZyk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFGdW5jdGlvbi5ncmFudEludm9rZShncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY3VyaXR5IGdyb3VwIGZvciBWUEMtZW5hYmxlZCBMYW1iZGEgZnVuY3Rpb25zLlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgTGFtYmRhIGlzIG5vdCBWUEMtZW5hYmxlZC5cbiAgICovXG4gIGdldFNlY3VyaXR5R3JvdXAoKTogSVNlY3VyaXR5R3JvdXAgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gdGhpcy5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3VwcztcbiAgICByZXR1cm4gc2VjdXJpdHlHcm91cHMubGVuZ3RoID4gMCA/IHNlY3VyaXR5R3JvdXBzWzBdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBMYW1iZGEgZnVuY3Rpb24gY29uc3RydWN0LlxuICAgKi9cbiAgZ2V0TGFtYmRhRnVuY3Rpb24oKTogTGFtYmRhRnVuY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmxhbWJkYUZ1bmN0aW9uO1xuICB9XG59XG5cbi8qKlxuICogRUMyIGNvbXB1dGUgd3JhcHBlciBpbXBsZW1lbnRpbmcgSUVjMkNvbXB1dGUuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIEVDMi1zcGVjaWZpYyByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFYzJDb21wdXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUVjMkNvbXB1dGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHV0ZVR5cGUgPSBcImVjMlwiIGFzIGNvbnN0O1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWMySW5zdGFuY2U6IEVjMkluc3RhbmNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJRWMyQ29tcHV0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGVuYWJsZVNTSCA9IHByb3BzLnNzaCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLnNzaCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBlYzJQcm9wcyA9IHtcbiAgICAgIHNlcnZpY2VOYW1lOiBgJHtpZH1TZXJ2aWNlYCxcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlIHx8IENPTVBVVEVfREVGQVVMVFMuRUMyLklOU1RBTkNFX1RZUEUsXG4gICAgICBlbmFibGVTU0gsXG4gICAgICB1c2VyRGF0YTogcHJvcHMudXNlckRhdGEsXG4gICAgICBtYWNoaW5lSW1hZ2U6IHByb3BzLm1hY2hpbmVJbWFnZSxcbiAgICAgIG1pbkNhcGFjaXR5OiBwcm9wcy5taW5DYXBhY2l0eSB8fCBDT01QVVRFX0RFRkFVTFRTLkVDMi5NSU5fQ0FQQUNJVFksXG4gICAgICBtYXhDYXBhY2l0eTogcHJvcHMubWF4Q2FwYWNpdHkgfHwgQ09NUFVURV9ERUZBVUxUUy5FQzIuTUFYX0NBUEFDSVRZLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBzcG90Q2FwYWNpdHlQZXJjZW50YWdlOiBwcm9wcy5zcG90Q2FwYWNpdHlQZXJjZW50YWdlXG4gICAgfTtcblxuICAgIHRoaXMuZWMySW5zdGFuY2UgPSBuZXcgRWMySW5zdGFuY2Uoc2NvcGUsIGAke2lkfUVjMmAsIGVjMlByb3BzKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5lYzJJbnN0YW5jZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIEF1dG8gU2NhbGluZyBHcm91cC4gKi9cbiAgZ2V0QXV0b1NjYWxpbmdHcm91cCgpOiBJQXV0b1NjYWxpbmdHcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZWMySW5zdGFuY2UuZ2V0QXV0b1NjYWxpbmdHcm91cCgpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgc2VjdXJpdHkgZ3JvdXAuICovXG4gIGdldFNlY3VyaXR5R3JvdXAoKTogSVNlY3VyaXR5R3JvdXAge1xuICAgIHJldHVybiB0aGlzLmVjMkluc3RhbmNlLmFzZ1NlY3VyaXR5R3JvdXA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIEVDMiBpbnN0YW5jZSBjb25zdHJ1Y3QuXG4gICAqL1xuICBnZXRFYzJJbnN0YW5jZSgpOiBFYzJJbnN0YW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuZWMySW5zdGFuY2U7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGUgZ3VhcmRzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHsgaXNDb21wdXRlLCBpc0Vjc0NvbXB1dGUsIGlzTGFtYmRhQ29tcHV0ZSwgaXNFYzJDb21wdXRlIH07XG5leHBvcnQgdHlwZSB7IElFY3NDb21wdXRlLCBJTGFtYmRhQ29tcHV0ZSwgSUVjMkNvbXB1dGUsIEFueUNvbXB1dGUgfTtcbiJdfQ==
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErSkEsb0RBRUM7QUFqS0QsdURBQWlEO0FBSWpELHdEQVNpQztBQWlYeEIsMEZBclhQLHNCQUFTLE9BcVhPO0FBQUUsNkZBcFhsQix5QkFBWSxPQW9Ya0I7QUFBRSxnR0FuWGhDLDRCQUFlLE9BbVhnQztBQUFFLDZGQWxYakQseUJBQVksT0FrWGlEO0FBaFgvRCx5RUFBMEU7QUFRMUUsOENBQThDO0FBQzlDLG1EQWtCeUI7QUF5QnZCLDJGQTFDQSwwQkFBVSxPQTBDQTtBQVFWLDZHQTFDQSw0Q0FBNEIsT0EwQ0E7QUFDNUIsNkdBMUNBLDRDQUE0QixPQTBDQTtBQUM1Qiw0RkExQ0EsMkJBQVcsT0EwQ0E7QUFHWCxpR0ExQ0EsZ0NBQWdCLE9BMENBO0FBQ2hCLHNHQTFDQSxxQ0FBcUIsT0EwQ0E7QUFFckIscUdBMUNBLG9DQUFvQixPQTBDQTtBQXZDdEIseURBWTRCO0FBNkIxQiw4RkF4Q0EsZ0NBQWEsT0F3Q0E7QUFNYix3R0F4Q0EsMENBQXVCLE9Bd0NBO0FBQ3ZCLDZGQXhDQSwrQkFBWSxPQXdDQTtBQUNaLDJGQXhDQSw2QkFBVSxPQXdDQTtBQUNWLDJGQXhDQSw2QkFBVSxPQXdDQTtBQXBDWixtREFJeUI7QUFtQ3ZCLDJGQXRDQSwwQkFBVSxPQXNDQTtBQXNCQyxRQUFBLG1CQUFtQixHQUEyQztJQUN6RSxHQUFHLEVBQUU7UUFDSCxXQUFXLEVBQUUsRUFBRTtRQUNmLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtRQUNsRCxXQUFXLEVBQUUsSUFBSTtLQUNsQjtJQUNELEdBQUcsRUFBRTtRQUNILFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUs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QUFDLGNBQWM7NEJBQ2pDLElBQUksa0JBQWtCLENBQUMsT0FBTyxXQUFXLEVBQUUsRUFBRTtxQkFDaEQsQ0FBQztvQkFDRixJQUNFLGtCQUFrQixDQUFDLE9BQU87d0JBQzFCLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNyQyxDQUFDO3dCQUNELGNBQWMsQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO29CQUN0RCxDQUFDO29CQUNELFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBRXBDLE9BQU8sSUFBSSxnQ0FBYSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztnQkFDRCxLQUFLLEtBQUs7b0JBQ1IsT0FBTyxJQUFJLDBCQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDakQsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDUixNQUFNLFdBQVcsR0FBVSxZQUFZLENBQUM7b0JBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkJBQTZCLE1BQU0sQ0FBRSxXQUE2QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQzNFLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUExSUQsd0NBMElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUnVudGltZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5cbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW1wb3J0IHtcbiAgdHlwZSBJRWNzQ29tcHV0ZSxcbiAgdHlwZSBJTGFtYmRhQ29tcHV0ZSxcbiAgdHlwZSBJRWMyQ29tcHV0ZSxcbiAgdHlwZSBBbnlDb21wdXRlLFxuICBpc0NvbXB1dGUsXG4gIGlzRWNzQ29tcHV0ZSxcbiAgaXNMYW1iZGFDb21wdXRlLFxuICBpc0VjMkNvbXB1dGVcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9jb21wdXRlLmpzXCI7XG5pbXBvcnQgeyB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZCB9IGZyb20gXCIuLi8uLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIE1hbmlmZXN0U2VydmljZSxcbiAgdHlwZSBNYW5pZmVzdExhbWJkYVxufSBmcm9tIFwiLi4vLi4vdXRpbHMvbWFuaWZlc3RXcml0ZXIuanNcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcblxuLy8gSW1wb3J0IGFuZCByZS1leHBvcnQgZnJvbSBwZXItcGF0dGVybiBmaWxlc1xuaW1wb3J0IHtcbiAgRWNzQ29tcHV0ZSxcbiAgdHlwZSBFY3NDb21wdXRlUHJvcHMsXG4gIHR5cGUgRWNzU2VydmljZUNvbmZpZyxcbiAgdHlwZSBFY3NDb250YWluZXJDb25maWcsXG4gIHR5cGUgRWNzU2NhbGluZ0NvbmZpZyxcbiAgdHlwZSBFY3NDbHVzdGVyQ29uZmlnLFxuICB0eXBlIEVjc1JvdXRpbmdDb25maWcsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyxcbiAgRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJRyxcbiAgZ2V0RWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyxcbiAgU2NhbGluZ1R5cGUsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgdHlwZSBFYzJDYXBhY2l0eUNvbmZpZyxcbiAgdmFsaWRhdGVFY3NQcm9wcyxcbiAgYnVpbGRDb250YWluZXJDb25maWdzLFxuICB0eXBlIFJlc29sdmVkU2NhbGluZ0NvbmZpZyxcbiAgcmVzb2x2ZVNjYWxpbmdDb25maWdcbn0gZnJvbSBcIi4vY29tcHV0ZUVjcy5qc1wiO1xuXG5pbXBvcnQge1xuICBMYW1iZGFDb21wdXRlLFxuICB0eXBlIExhbWJkYUNvbXB1dGVQcm9wcyxcbiAgdHlwZSBDb250YWluZXJMYW1iZGFQcm9wcyxcbiAgdHlwZSBDb2RlTGFtYmRhUHJvcHMsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb25maWcsXG4gIHR5cGUgUmVzb2x2ZWRMYW1iZGFEZXBsb3ltZW50LFxuICByZXNvbHZlTGFtYmRhRGVwbG95bWVudCxcbiAgQXJjaGl0ZWN0dXJlLFxuICBIdHRwTWV0aG9kLFxuICBJbnZva2VNb2RlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQ29yc09wdGlvbnNcbn0gZnJvbSBcIi4vY29tcHV0ZUxhbWJkYS5qc1wiO1xuXG5pbXBvcnQge1xuICBFYzJDb21wdXRlLFxuICB0eXBlIEVjMkNvbXB1dGVQcm9wcyxcbiAgdHlwZSBTc2hDb25maWdcbn0gZnJvbSBcIi4vY29tcHV0ZUVjMi5qc1wiO1xuXG4vLyBSZS1leHBvcnQgZXZlcnl0aGluZyBmcm9tIHBlci1wYXR0ZXJuIGZpbGVzXG5leHBvcnQge1xuICAvLyBFQ1NcbiAgRWNzQ29tcHV0ZSxcbiAgdHlwZSBFY3NDb21wdXRlUHJvcHMsXG4gIHR5cGUgRWNzU2VydmljZUNvbmZpZyxcbiAgdHlwZSBFY3NDb250YWluZXJDb25maWcsXG4gIHR5cGUgRWNzU2NhbGluZ0NvbmZpZyxcbiAgdHlwZSBFY3NDbHVzdGVyQ29uZmlnLFxuICB0eXBlIEVjc1JvdXRpbmdDb25maWcsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyxcbiAgRUNTX0NBUEFDSVRZX1BST1ZJREVSX0NPTkZJRyxcbiAgZ2V0RWNzQ2FwYWNpdHlQcm92aWRlckNvbmZpZyxcbiAgU2NhbGluZ1R5cGUsXG4gIHR5cGUgRWNzQ2FwYWNpdHlQcm92aWRlcixcbiAgdHlwZSBFYzJDYXBhY2l0eUNvbmZpZyxcbiAgdmFsaWRhdGVFY3NQcm9wcyxcbiAgYnVpbGRDb250YWluZXJDb25maWdzLFxuICB0eXBlIFJlc29sdmVkU2NhbGluZ0NvbmZpZyxcbiAgcmVzb2x2ZVNjYWxpbmdDb25maWcsXG4gIC8vIExhbWJkYVxuICBMYW1iZGFDb21wdXRlLFxuICB0eXBlIExhbWJkYUNvbXB1dGVQcm9wcyxcbiAgdHlwZSBDb250YWluZXJMYW1iZGFQcm9wcyxcbiAgdHlwZSBDb2RlTGFtYmRhUHJvcHMsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb25maWcsXG4gIHR5cGUgUmVzb2x2ZWRMYW1iZGFEZXBsb3ltZW50LFxuICByZXNvbHZlTGFtYmRhRGVwbG95bWVudCxcbiAgQXJjaGl0ZWN0dXJlLFxuICBIdHRwTWV0aG9kLFxuICBJbnZva2VNb2RlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQ29yc09wdGlvbnMsXG4gIC8vIEVDMlxuICBFYzJDb21wdXRlLFxuICB0eXBlIEVjMkNvbXB1dGVQcm9wcyxcbiAgdHlwZSBTc2hDb25maWdcbn07XG5cbmV4cG9ydCB0eXBlIENvbXB1dGVUeXBlID0gXCJlY3NcIiB8IFwiZWMyXCIgfCBcImxhbWJkYVwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZGVmYXVsdHMgZm9yIGVhY2ggY29tcHV0ZSB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVUeXBlQ29uZmlnIHtcbiAgLyoqIERlZmF1bHQgcG9ydCBmb3IgdGhlIGNvbXB1dGUgdHlwZS4gRUNTOiA4MCwgRUMyOiAyMiwgTGFtYmRhOiAwIChubyBwb3J0KSAqL1xuICBkZWZhdWx0UG9ydDogbnVtYmVyO1xuICAvKiogRGVmYXVsdCBzY2FsaW5nIGxpbWl0cyAqL1xuICBkZWZhdWx0U2NhbGluZzoge1xuICAgIG1pbkNhcGFjaXR5OiBudW1iZXI7XG4gICAgbWF4Q2FwYWNpdHk6IG51bWJlcjtcbiAgfTtcbiAgLyoqIFdoZXRoZXIgdGhpcyBjb21wdXRlIHR5cGUgcmVxdWlyZXMgYSBWUEMgKi9cbiAgcmVxdWlyZXNWcGM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBDT01QVVRFX1RZUEVfQ09ORklHOiBSZWNvcmQ8Q29tcHV0ZVR5cGUsIENvbXB1dGVUeXBlQ29uZmlnPiA9IHtcbiAgZWNzOiB7XG4gICAgZGVmYXVsdFBvcnQ6IDgwLFxuICAgIGRlZmF1bHRTY2FsaW5nOiB7IG1pbkNhcGFjaXR5OiAyLCBtYXhDYXBhY2l0eTogNSB9LFxuICAgIHJlcXVpcmVzVnBjOiB0cnVlXG4gIH0sXG4gIGVjMjoge1xuICAgIGRlZmF1bHRQb3J0OiAyMixcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMiwgbWF4Q2FwYWNpdHk6IDMgfSxcbiAgICByZXF1aXJlc1ZwYzogdHJ1ZVxuICB9LFxuICBsYW1iZGE6IHtcbiAgICBkZWZhdWx0UG9ydDogMCxcbiAgICBkZWZhdWx0U2NhbGluZzogeyBtaW5DYXBhY2l0eTogMCwgbWF4Q2FwYWNpdHk6IDEwMCB9LFxuICAgIHJlcXVpcmVzVnBjOiBmYWxzZVxuICB9XG59O1xuXG4vKipcbiAqIERlZmF1bHQgdmFsdWVzIGZvciBjb21wdXRlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBDZW50cmFsaXNlZCBjb25zdGFudHMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QVVRFX0RFRkFVTFRTID0ge1xuICBFQzI6IHtcbiAgICBJTlNUQU5DRV9UWVBFOiBcInQ0Zy5taWNyb1wiLFxuICAgIE1JTl9DQVBBQ0lUWTogMSxcbiAgICBNQVhfQ0FQQUNJVFk6IDFcbiAgfSxcbiAgRUNTOiB7XG4gICAgLyoqIEFXUyBzYW1wbGUgaW1hZ2UgdXNlZCB3aGVuIG5vIEVDUiByZXBvc2l0b3J5IGlzIHByb3ZpZGVkICovXG4gICAgRkFMTEJBQ0tfSU1BR0U6IFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIsXG4gICAgLyoqIERlZmF1bHQgdGFnIGZvciBFQ1IgaW1hZ2VzICovXG4gICAgSU1BR0VfVEFHOiBcImxhdGVzdFwiXG4gIH0sXG4gIExBTUJEQToge1xuICAgIEhBTkRMRVI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgIFJVTlRJTUU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgQVJDSElURUNUVVJFOiBBcmNoaXRlY3R1cmUuQVJNXzY0XG4gIH1cbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wdXRlVHlwZUNvbmZpZyh0eXBlOiBDb21wdXRlVHlwZSk6IENvbXB1dGVUeXBlQ29uZmlnIHtcbiAgcmV0dXJuIENPTVBVVEVfVFlQRV9DT05GSUdbdHlwZV07XG59XG5cbi8vIFR5cGUtc2FmZSBwcm9wcyB3aXRoIGxpdGVyYWwgZGlzY3JpbWluYXRvcnMgZm9yIGZhY3Rvcnkgb3ZlcmxvYWRzXG5leHBvcnQgdHlwZSBJRWNzQ29tcHV0ZVByb3BzID0gRWNzQ29tcHV0ZVByb3BzO1xuZXhwb3J0IHR5cGUgSUxhbWJkYUNvbXB1dGVQcm9wcyA9IExhbWJkYUNvbXB1dGVQcm9wcztcbmV4cG9ydCB0eXBlIElFYzJDb21wdXRlUHJvcHMgPSBFYzJDb21wdXRlUHJvcHM7XG5cbmV4cG9ydCB0eXBlIElDb21wdXRlUHJvcHMgPVxuICB8IElFY3NDb21wdXRlUHJvcHNcbiAgfCBJTGFtYmRhQ29tcHV0ZVByb3BzXG4gIHwgSUVjMkNvbXB1dGVQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgY29tcHV0ZSBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgaWdub3JlZCBvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKiBUaGVzZSBjaGVja3MgaGVscCBjYXRjaCBpc3N1ZXMgd2hlbiBwcm9wcyBjb21lIGZyb20gZHluYW1pYyBzb3VyY2VzIHdoZXJlXG4gKiBUeXBlU2NyaXB0J3MgY29tcGlsZS10aW1lIGNoZWNrcyBtYXkgbm90IGFwcGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbXB1dGVQcm9wcyhwcm9wczogSUNvbXB1dGVQcm9wcyk6IHZvaWQge1xuICAvLyBFQ1Mtc3BlY2lmaWMgb3B0aW9ucyBvbiBub24tRUNTIGNvbXB1dGVcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHMsXG4gICAgW1wiY2FwYWNpdHlQcm92aWRlclwiLCBcImVjMkNvbmZpZ1wiLCBcInNlcnZpY2VzXCIsIFwiY2x1c3RlclwiXSxcbiAgICBcImVjc1wiLFxuICAgIFwiRUNTIGNvbXB1dGVcIlxuICApO1xuXG4gIC8vIExhbWJkYS1zcGVjaWZpYyBvcHRpb25zIG9uIG5vbi1MYW1iZGEgY29tcHV0ZVxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wcyxcbiAgICBbXCJmdW5jdGlvblVybFwiLCBcImhhbmRsZXJcIiwgXCJydW50aW1lXCJdLFxuICAgIFwibGFtYmRhXCIsXG4gICAgXCJMYW1iZGEgY29tcHV0ZVwiXG4gICk7XG5cbiAgLy8gRUMyLXNwZWNpZmljIG9wdGlvbnMgb24gbm9uLUVDMiBjb21wdXRlXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcInNzaFwiLCBcInVzZXJEYXRhXCIsIFwibWFjaGluZUltYWdlXCJdLFxuICAgIFwiZWMyXCIsXG4gICAgXCJFQzIgY29tcHV0ZVwiXG4gICk7XG5cbiAgLy8gRUNTLXNwZWNpZmljIHZhbGlkYXRpb24gLSB0eXBlIG5hcnJvd2luZyBoYW5kbGVkIGJ5IGRpc2NyaW1pbmF0ZWQgdW5pb25cbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiZWNzXCIpIHtcbiAgICB2YWxpZGF0ZUVjc1Byb3BzKHByb3BzKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGNvbXB1dGUgcmVzb3VyY2VzIHdpdGggdHlwZS1zYWZlIHJldHVybiB0eXBlcy5cbiAqXG4gKiBUaGUgZmFjdG9yeSB1c2VzIG92ZXJsb2FkcyB0byBpbmZlciB0aGUgc3BlY2lmaWMgY29tcHV0ZSB0eXBlIGZyb20gcHJvcHMsXG4gKiBlbnN1cmluZyBUeXBlU2NyaXB0IHByb3ZpZGVzIG9ubHkgdGhlIHJlbGV2YW50IG1ldGhvZHMgZm9yIGVhY2ggY29tcHV0ZSB0eXBlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFQ1MgY29tcHV0ZSAtIHJldHVybnMgRWNzQ29tcHV0ZSB3aXRoIEVDUy1zcGVjaWZpYyBtZXRob2RzXG4gKiBjb25zdCBlY3MgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldlYkFwcFwiLCB7XG4gKiAgIHR5cGU6IFwiZWNzXCIsXG4gKiAgIGNsdXN0ZXI6IHsgZG9tYWluOiBcImFwcC5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIHNlcnZpY2VzOiBbeyBuYW1lOiBcIndlYlwiLCBjb250YWluZXJzOiBbeyBwb3J0OiAzMDAwIH1dIH1dXG4gKiB9KSk7XG4gKiBlY3MuZ2V0TG9hZEJhbGFuY2VyKCk7IC8vIEF2YWlsYWJsZSBvbiBFY3NDb21wdXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIExhbWJkYSBjb21wdXRlIC0gcmV0dXJucyBMYW1iZGFDb21wdXRlIHdpdGggTGFtYmRhLXNwZWNpZmljIG1ldGhvZHNcbiAqIGNvbnN0IGxhbWJkYSA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiRm5cIiwge1xuICogICB0eXBlOiBcImxhbWJkYVwiLFxuICogICBkZXBsb3ltZW50OiBcImNvZGVcIixcbiAqICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXCIuL2xhbWJkYVwiKVxuICogfSkpO1xuICogbGFtYmRhLmdldEZ1bmN0aW9uVXJsKCk7IC8vIEF2YWlsYWJsZSBvbiBMYW1iZGFDb21wdXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVDMiBjb21wdXRlIC0gcmV0dXJucyBFYzJDb21wdXRlIHdpdGggRUMyLXNwZWNpZmljIG1ldGhvZHNcbiAqIGNvbnN0IGVjMiA9IGFwcC5hZGRDb21wdXRlKENvbXB1dGVGYWN0b3J5LmJ1aWxkKFwiSW5zdGFuY2VcIiwge1xuICogICB0eXBlOiBcImVjMlwiLFxuICogICBpbnN0YW5jZVR5cGU6IFwidDRnLm1pY3JvXCJcbiAqIH0pKTtcbiAqIGVjMi5nZXRBdXRvU2NhbGluZ0dyb3VwKCk7IC8vIEF2YWlsYWJsZSBvbiBFYzJDb21wdXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wdXRlRmFjdG9yeSB7XG4gIC8vIE92ZXJsb2FkOiBFQ1MgcHJvcHMgcmV0dXJucyBFY3NDb21wdXRlXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJRWNzQ29tcHV0ZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gRWNzQ29tcHV0ZTtcbiAgLy8gT3ZlcmxvYWQ6IExhbWJkYSBwcm9wcyByZXR1cm5zIExhbWJkYUNvbXB1dGVcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElMYW1iZGFDb21wdXRlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBMYW1iZGFDb21wdXRlO1xuICAvLyBPdmVybG9hZDogRUMyIHByb3BzIHJldHVybnMgRWMyQ29tcHV0ZVxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUVjMkNvbXB1dGVQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEVjMkNvbXB1dGU7XG4gIC8vIEltcGxlbWVudGF0aW9uIHNpZ25hdHVyZVxuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUNvbXB1dGVQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEFueUNvbXB1dGUge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpOiBBbnlDb21wdXRlID0+IHtcbiAgICAgIHZhbGlkYXRlQ29tcHV0ZVByb3BzKHByb3BzKTtcblxuICAgICAgLy8gQXV0by1kZXJpdmUgYXBwTmFtZSBmcm9tIEFwcCBpbnN0YW5jZSBmb3IgRUNTIGNvbXB1dGVcbiAgICAgIGNvbnN0IHR5cGVDb25maWcgPSBDT01QVVRFX1RZUEVfQ09ORklHW3Byb3BzLnR5cGVdO1xuICAgICAgY29uc3QgbmVlZHNWcGMgPVxuICAgICAgICB0eXBlQ29uZmlnLnJlcXVpcmVzVnBjIHx8XG4gICAgICAgIChcImNvbm5lY3Rpb25zXCIgaW4gcHJvcHMgJiZcbiAgICAgICAgICBBcnJheS5pc0FycmF5KHByb3BzLmNvbm5lY3Rpb25zKSAmJlxuICAgICAgICAgIHByb3BzLmNvbm5lY3Rpb25zLmxlbmd0aCA+IDApO1xuICAgICAgbGV0IGNvbXB1dGVQcm9wczogSUNvbXB1dGVQcm9wcyA9IHtcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogbmVlZHNWcGMgPyBhcHAuZ2V0VnBjKCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZWNyUmVwb3NpdG9yeTogYXBwLmdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnByb3BzXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29tcHV0ZVByb3BzLnR5cGUgPT09IFwiZWNzXCIpIHtcbiAgICAgICAgY29tcHV0ZVByb3BzID0ge1xuICAgICAgICAgIC4uLmNvbXB1dGVQcm9wcyxcbiAgICAgICAgICBhcHBOYW1lOiBjb21wdXRlUHJvcHMuYXBwTmFtZSA/PyBhcHAuZ2V0TmFtZSgpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBzcGVjaWZpYyBjb21wdXRlIGNsYXNzIGJhc2VkIG9uIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgc3dpdGNoIChjb21wdXRlUHJvcHMudHlwZSkge1xuICAgICAgICBjYXNlIFwiZWNzXCI6IHtcbiAgICAgICAgICAvLyBSZWdpc3RlciBFQ1Mgc2VydmljZXMgd2l0aCBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIENMSSBkaXNjb3ZlcnlcbiAgICAgICAgICBjb25zdCBjb2xsZWN0b3IgPSBhcHAuZ2V0TWFuaWZlc3RDb2xsZWN0b3IoKTtcbiAgICAgICAgICBjb25zdCBjbHVzdGVyTmFtZSA9IGlkO1xuICAgICAgICAgIGNvbnN0IGFwcE5hbWUgPSBjb21wdXRlUHJvcHMuYXBwTmFtZSA/PyBhcHAuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIGNvbXB1dGVQcm9wcy5zZXJ2aWNlcykge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RTZXJ2aWNlOiBNYW5pZmVzdFNlcnZpY2UgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHNlcnZpY2UubmFtZSxcbiAgICAgICAgICAgICAgY2x1c3Rlck5hbWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgZG9ja2VyZmlsZVBhdGggaWYgc3BlY2lmaWVkIChtZXRhZGF0YSBmb3IgQ0xJKVxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZG9ja2VyZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLmRvY2tlcmZpbGVQYXRoID0gc2VydmljZS5kb2NrZXJmaWxlUGF0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5jbHVkZSBkb2NrZXJUYXJnZXQgaWYgc3BlY2lmaWVkIChtZXRhZGF0YSBmb3IgQ0xJKVxuICAgICAgICAgICAgaWYgKHNlcnZpY2UuZG9ja2VyVGFyZ2V0KSB7XG4gICAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5kb2NrZXJUYXJnZXQgPSBzZXJ2aWNlLmRvY2tlclRhcmdldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluZCBjb250YWluZXIgcG9ydCBmcm9tIGZpcnN0IGNvbnRhaW5lciB3aXRoIGEgcG9ydFxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyV2l0aFBvcnQgPSBzZXJ2aWNlLmNvbnRhaW5lcnM/LmZpbmQoXG4gICAgICAgICAgICAgIChjKSA9PiBjLnBvcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJXaXRoUG9ydD8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIG1hbmlmZXN0U2VydmljZS5jb250YWluZXJQb3J0ID0gY29udGFpbmVyV2l0aFBvcnQucG9ydDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWdncmVnYXRlIHNlY3JldHMgZnJvbSBhbGwgY29udGFpbmVycyAoZGVkdXBsaWNhdGVkKVxuICAgICAgICAgICAgY29uc3QgYWxsU2VjcmV0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2Ygc2VydmljZS5jb250YWluZXJzID8/IFtdKSB7XG4gICAgICAgICAgICAgIGlmIChjb250YWluZXIuc2VjcmV0cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VjcmV0IG9mIGNvbnRhaW5lci5zZWNyZXRzKSB7XG4gICAgICAgICAgICAgICAgICBhbGxTZWNyZXRzLmFkZChzZWNyZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbFNlY3JldHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLnNlY3JldHMgPSBBcnJheS5mcm9tKGFsbFNlY3JldHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmNsdWRlIHNzbVNlY3JldHNQYXRoIChleHBsaWNpdCBvciBkZXJpdmVkKVxuICAgICAgICAgICAgbWFuaWZlc3RTZXJ2aWNlLnNzbVNlY3JldHNQYXRoID1cbiAgICAgICAgICAgICAgc2VydmljZS5zc21TZWNyZXRzUGF0aCA/P1xuICAgICAgICAgICAgICBgLyR7YXBwTmFtZX0vJHtjbHVzdGVyTmFtZX0vJHtzZXJ2aWNlLm5hbWV9YDtcblxuICAgICAgICAgICAgY29sbGVjdG9yLmFkZFNlcnZpY2UobWFuaWZlc3RTZXJ2aWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBFY3NDb21wdXRlKHNjb3BlLCBpZCwgY29tcHV0ZVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwibGFtYmRhXCI6IHtcbiAgICAgICAgICAvLyBBZGQgYXBwTmFtZSB0byBwcm9wcyBmb3IgTGFtYmRhIChuZWVkZWQgZm9yIHNlY3JldHMgcGF0aCBkZXJpdmF0aW9uKVxuICAgICAgICAgIGNvbnN0IGxhbWJkYUNvbXB1dGVQcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmNvbXB1dGVQcm9wcyxcbiAgICAgICAgICAgIGFwcE5hbWU6IGFwcC5nZXROYW1lKClcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQWx3YXlzIHJlZ2lzdGVyIExhbWJkYSB3aXRoIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgQ0xJIGRpc2NvdmVyeVxuICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgTGFtYmRhcyBhcmUgZGlzY292ZXJhYmxlIGZvciBzZWNyZXRzIG1hbmFnZW1lbnQsXG4gICAgICAgICAgLy8gZXZlbiB0aG9zZSB0aGF0IGRvbid0IGN1cnJlbnRseSBoYXZlIHNlY3JldHMgY29uZmlndXJlZFxuICAgICAgICAgIGNvbnN0IGNvbGxlY3RvciA9IGFwcC5nZXRNYW5pZmVzdENvbGxlY3RvcigpO1xuICAgICAgICAgIGNvbnN0IG1hbmlmZXN0TGFtYmRhOiBNYW5pZmVzdExhbWJkYSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGlkLFxuICAgICAgICAgICAgc3NtU2VjcmV0c1BhdGg6XG4gICAgICAgICAgICAgIGxhbWJkYUNvbXB1dGVQcm9wcy5zc21TZWNyZXRzUGF0aCB8fFxuICAgICAgICAgICAgICBgLyR7bGFtYmRhQ29tcHV0ZVByb3BzLmFwcE5hbWV9L2xhbWJkYS8ke2lkfWBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxhbWJkYUNvbXB1dGVQcm9wcy5zZWNyZXRzICYmXG4gICAgICAgICAgICBsYW1iZGFDb21wdXRlUHJvcHMuc2VjcmV0cy5sZW5ndGggPiAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtYW5pZmVzdExhbWJkYS5zZWNyZXRzID0gbGFtYmRhQ29tcHV0ZVByb3BzLnNlY3JldHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbGxlY3Rvci5hZGRMYW1iZGEobWFuaWZlc3RMYW1iZGEpO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBMYW1iZGFDb21wdXRlKHNjb3BlLCBpZCwgbGFtYmRhQ29tcHV0ZVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZWMyXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBFYzJDb21wdXRlKHNjb3BlLCBpZCwgY29tcHV0ZVByb3BzKTtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IGNvbXB1dGVQcm9wcztcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgY29tcHV0ZSB0eXBlOiAke1N0cmluZygoX2V4aGF1c3RpdmUgYXMgSUNvbXB1dGVQcm9wcykudHlwZSl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0eXBlIGd1YXJkcyBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB7IGlzQ29tcHV0ZSwgaXNFY3NDb21wdXRlLCBpc0xhbWJkYUNvbXB1dGUsIGlzRWMyQ29tcHV0ZSB9O1xuZXhwb3J0IHR5cGUgeyBJRWNzQ29tcHV0ZSwgSUxhbWJkYUNvbXB1dGUsIElFYzJDb21wdXRlLCBBbnlDb21wdXRlIH07XG4iXX0=
|