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