@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,11 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isGlobalAuroraDatabase = exports.isInstanceDatabase = exports.isAuroraDatabase = exports.isDynamoDBDatabase = exports.isRelationalDatabase = exports.RelationalDatabase = exports.DynamoDBDatabase = exports.DatabaseFactory = exports.USE_CMK = exports.AWS_MANAGED = exports.
|
|
3
|
+
exports.isGlobalAuroraDatabase = exports.isInstanceDatabase = exports.isAuroraDatabase = exports.isDynamoDBDatabase = exports.isRelationalDatabase = exports.RelationalDatabase = exports.DynamoDBDatabase = exports.DatabaseFactory = exports.DATABASE_ENGINE_CONFIG = exports.USE_CMK = exports.AWS_MANAGED = exports.isCMKRequested = exports.isAwsManagedKey = void 0;
|
|
4
4
|
exports.getAuroraClusterEngine = getAuroraClusterEngine;
|
|
5
5
|
exports.getInstanceEngine = getInstanceEngine;
|
|
6
6
|
exports.getEngineConfig = getEngineConfig;
|
|
7
|
-
exports.isAwsManagedKey = isAwsManagedKey;
|
|
8
|
-
exports.isCMKRequested = isCMKRequested;
|
|
9
7
|
const constructs_1 = require("constructs");
|
|
10
8
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
11
9
|
const database_1 = require("../../resources/aws/database");
|
|
@@ -15,7 +13,12 @@ const validationLogger_js_1 = require("../../utils/validationLogger.js");
|
|
|
15
13
|
const capitaliseString_js_1 = require("../../utils/capitaliseString.js");
|
|
16
14
|
const aws_rds_1 = require("aws-cdk-lib/aws-rds");
|
|
17
15
|
const aws_cdk_lib_2 = require("aws-cdk-lib");
|
|
18
|
-
|
|
16
|
+
var databaseTypes_1 = require("../../utils/databaseTypes");
|
|
17
|
+
Object.defineProperty(exports, "isAwsManagedKey", { enumerable: true, get: function () { return databaseTypes_1.isAwsManagedKey; } });
|
|
18
|
+
Object.defineProperty(exports, "isCMKRequested", { enumerable: true, get: function () { return databaseTypes_1.isCMKRequested; } });
|
|
19
|
+
Object.defineProperty(exports, "AWS_MANAGED", { enumerable: true, get: function () { return databaseTypes_1.AWS_MANAGED; } });
|
|
20
|
+
Object.defineProperty(exports, "USE_CMK", { enumerable: true, get: function () { return databaseTypes_1.USE_CMK; } });
|
|
21
|
+
exports.DATABASE_ENGINE_CONFIG = Object.freeze({
|
|
19
22
|
postgresql: {
|
|
20
23
|
aurora: { version: "16.6", majorVersion: "16" },
|
|
21
24
|
instance: { version: "17.5", majorVersion: "17" },
|
|
@@ -31,7 +34,7 @@ exports.DATABASE_ENGINE_CONFIG = {
|
|
|
31
34
|
sslParameters: { require_secure_transport: "ON" },
|
|
32
35
|
rotationAppName: "SecretsManagerRDSMySQLRotationMultiUser"
|
|
33
36
|
}
|
|
34
|
-
};
|
|
37
|
+
});
|
|
35
38
|
const AURORA_ENGINE_FACTORIES = {
|
|
36
39
|
postgresql: () => {
|
|
37
40
|
const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.postgresql.aurora;
|
|
@@ -74,34 +77,6 @@ function getEngineConfig(engine) {
|
|
|
74
77
|
rotationAppName: config.rotationAppName
|
|
75
78
|
};
|
|
76
79
|
}
|
|
77
|
-
// Type guard to check if the encryption key spec is AWS managed.
|
|
78
|
-
function isAwsManagedKey(spec) {
|
|
79
|
-
return (spec !== undefined &&
|
|
80
|
-
typeof spec === "object" &&
|
|
81
|
-
"awsManaged" in spec &&
|
|
82
|
-
spec.awsManaged === true);
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Type guard to check if CMK is explicitly requested.
|
|
86
|
-
*/
|
|
87
|
-
function isCMKRequested(spec) {
|
|
88
|
-
return (spec !== undefined &&
|
|
89
|
-
typeof spec === "object" &&
|
|
90
|
-
"useCMK" in spec &&
|
|
91
|
-
spec.useCMK === true);
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Convenience constant for specifying AWS managed encryption (the default).
|
|
95
|
-
* @example
|
|
96
|
-
* encryption: { storageKey: AWS_MANAGED }
|
|
97
|
-
*/
|
|
98
|
-
exports.AWS_MANAGED = { awsManaged: true };
|
|
99
|
-
/**
|
|
100
|
-
* Convenience constant for explicitly requesting CMK.
|
|
101
|
-
* @example
|
|
102
|
-
* encryption: { storageKey: USE_CMK }
|
|
103
|
-
*/
|
|
104
|
-
exports.USE_CMK = { useCMK: true };
|
|
105
80
|
/**
|
|
106
81
|
* Validates DynamoDB props and logs warnings for misconfigured options.
|
|
107
82
|
*/
|
|
@@ -277,7 +252,9 @@ class RelationalDatabase extends constructs_1.Construct {
|
|
|
277
252
|
this.id = id;
|
|
278
253
|
this.scope = scope;
|
|
279
254
|
this.databaseType = props.type;
|
|
280
|
-
|
|
255
|
+
if (!props.vpc) {
|
|
256
|
+
throw new Error("VPC is required for relational database");
|
|
257
|
+
}
|
|
281
258
|
this.vpc = props.vpc;
|
|
282
259
|
this._databaseName = props.databaseName;
|
|
283
260
|
this.addDatabase(props);
|
|
@@ -323,7 +300,7 @@ class RelationalDatabase extends constructs_1.Construct {
|
|
|
323
300
|
monitoringInterval: props.monitoringInterval,
|
|
324
301
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow,
|
|
325
302
|
port: props.port,
|
|
326
|
-
|
|
303
|
+
databaseInsights: props.databaseInsights,
|
|
327
304
|
deletionProtection: props.deletionProtection,
|
|
328
305
|
snapshotIdentifier: props.snapshotIdentifier,
|
|
329
306
|
snapshotUsername: props.snapshotUsername,
|
|
@@ -360,7 +337,7 @@ class RelationalDatabase extends constructs_1.Construct {
|
|
|
360
337
|
monitoringInterval: props.monitoringInterval,
|
|
361
338
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow,
|
|
362
339
|
port: props.port,
|
|
363
|
-
|
|
340
|
+
databaseInsights: props.databaseInsights,
|
|
364
341
|
deletionProtection: props.deletionProtection,
|
|
365
342
|
snapshotIdentifier: props.snapshotIdentifier,
|
|
366
343
|
snapshotUsername: props.snapshotUsername
|
|
@@ -386,7 +363,7 @@ class RelationalDatabase extends constructs_1.Construct {
|
|
|
386
363
|
backupRetention: props.backupRetention !== undefined
|
|
387
364
|
? aws_cdk_lib_2.Duration.days(props.backupRetention)
|
|
388
365
|
: undefined,
|
|
389
|
-
|
|
366
|
+
databaseInsights: props.databaseInsights,
|
|
390
367
|
proxy: props.proxy,
|
|
391
368
|
readReplica: props.readReplica,
|
|
392
369
|
credentials: props.credentials,
|
|
@@ -458,4 +435,4 @@ Object.defineProperty(exports, "isDynamoDBDatabase", { enumerable: true, get: fu
|
|
|
458
435
|
Object.defineProperty(exports, "isAuroraDatabase", { enumerable: true, get: function () { return database_js_1.isAuroraDatabase; } });
|
|
459
436
|
Object.defineProperty(exports, "isInstanceDatabase", { enumerable: true, get: function () { return database_js_1.isInstanceDatabase; } });
|
|
460
437
|
Object.defineProperty(exports, "isGlobalAuroraDatabase", { enumerable: true, get: function () { return database_js_1.isGlobalAuroraDatabase; } });
|
|
461
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXFIQSx3REFFQztBQUVELDhDQUVDO0FBRUQsMENBT0M7QUFrREQsMENBU0M7QUFLRCx3Q0FTQztBQTdNRCwyQ0FBdUM7QUFDdkMsNkNBQStDO0FBRy9DLDJEQUFzRTtBQUN0RSxrRkFBK0U7QUFDL0Usb0VBSytDO0FBQy9DLHlFQUd5QztBQUN6Qyx5RUFBK0Q7QUFxQi9ELGlEQVM2QjtBQUM3Qiw2Q0FBdUM7QUFXMUIsUUFBQSxzQkFBc0IsR0FTL0I7SUFDRixVQUFVLEVBQUU7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUU7UUFDL0MsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSxVQUFVO1FBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDdkMsZUFBZSxFQUFFLDhDQUE4QztLQUNoRTtJQUNELEtBQUssRUFBRTtRQUNMLHdFQUF3RTtRQUN4RSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtRQUN0RSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7UUFDbkQsZUFBZSxFQUFFLE9BQU87UUFDeEIsYUFBYSxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSx5Q0FBeUM7S0FDM0Q7Q0FDRixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBaUQ7SUFDNUUsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUNmLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsOEJBQXNCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUMzRSxPQUFPLCtCQUFxQixDQUFDLGNBQWMsQ0FBQztZQUMxQyxPQUFPLEVBQUUscUNBQTJCLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7U0FDL0QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDVixNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLDhCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDdEUsT0FBTywrQkFBcUIsQ0FBQyxXQUFXLENBQUM7WUFDdkMsT0FBTyxFQUFFLGtDQUF3QixDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDO1NBQzVELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFDO0FBRUYsTUFBTSx5QkFBeUIsR0FDN0I7SUFDRSxVQUFVLEVBQUUsR0FBRyxFQUFFO1FBQ2YsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FDN0IsOEJBQXNCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUM3QyxPQUFPLGdDQUFzQixDQUFDLFFBQVEsQ0FBQztZQUNyQyxPQUFPLEVBQUUsK0JBQXFCLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7U0FDekQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDVixNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLDhCQUFzQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDeEUsT0FBTyxnQ0FBc0IsQ0FBQyxLQUFLLENBQUM7WUFDbEMsT0FBTyxFQUFFLDRCQUFrQixDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFDO0FBRUosU0FBZ0Isc0JBQXNCLENBQUMsTUFBc0I7SUFDM0QsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxNQUFzQjtJQUN0RCxPQUFPLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxNQUFzQjtJQUNwRCxNQUFNLE1BQU0sR0FBRyw4QkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxPQUFPO1FBQ0wsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlO1FBQ3ZDLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtRQUNuQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFpREQsaUVBQWlFO0FBQ2pFLFNBQWdCLGVBQWUsQ0FDN0IsSUFBbUM7SUFFbkMsT0FBTyxDQUNMLElBQUksS0FBSyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFDeEIsWUFBWSxJQUFJLElBQUk7UUFDbkIsSUFBc0IsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUM1QyxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsY0FBYyxDQUM1QixJQUFtQztJQUVuQyxPQUFPLENBQ0wsSUFBSSxLQUFLLFNBQVM7UUFDbEIsT0FBTyxJQUFJLEtBQUssUUFBUTtRQUN4QixRQUFRLElBQUksSUFBSTtRQUNmLElBQWlDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FDbkQsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ1UsUUFBQSxXQUFXLEdBQWtCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBVyxDQUFDO0FBRXhFOzs7O0dBSUc7QUFDVSxRQUFBLE9BQU8sR0FBNkIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFXLENBQUM7QUFnSzNFOztHQUVHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxLQUE0QjtJQUN6RCxnQ0FBZ0M7SUFDaEMsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2hELGlDQUFXLENBQUMsSUFBSSxDQUNkLDJEQUEyRDtnQkFDekQsK0VBQStFLENBQ2xGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELDZDQUE2QztJQUM3QyxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDeEMsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QyxpQ0FBVyxDQUFDLElBQUksQ0FDZCxnRUFBZ0U7Z0JBQzlELHdEQUF3RCxDQUMzRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxxRUFBcUU7SUFDckUsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQ2xELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDL0MsSUFDRSxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxpQkFBaUI7Z0JBQzNDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUN6QyxDQUFDO2dCQUNELGlDQUFXLENBQUMsSUFBSSxDQUNkLFFBQVEsR0FBRyxDQUFDLFNBQVMsMENBQTBDO29CQUM3RCxzREFBc0QsQ0FDekQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUywrQkFBK0IsQ0FDdEMsS0FBK0I7SUFFL0Isc0NBQXNDO0lBQ3RDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxjQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FDYixrREFBa0Q7WUFDaEQsbUVBQW1FLENBQ3RFLENBQUM7SUFDSixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLElBQUEsNkNBQXVCLEVBQ3JCLEtBQUssRUFDTCxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsRUFDOUMsVUFBVSxFQUNWLG1CQUFtQixDQUNwQixDQUFDO0lBRUYsa0NBQWtDO0lBQ2xDLElBQUEsNkNBQXVCLEVBQ3JCLEtBQUssRUFDTCxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsRUFDeEMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLEVBQzFCLGlCQUFpQixDQUNsQixDQUFDO0lBRUYsb0RBQW9EO0lBQ3BELElBQUEsNkNBQXVCLEVBQ3JCLEtBQUssRUFDTCxDQUFDLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSw2QkFBNkIsQ0FBQyxFQUNwRSxjQUFjLEVBQ2QsdUJBQXVCLENBQ3hCLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxLQUFxQjtJQUNsRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDOUIscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztTQUFNLENBQUM7UUFDTiwrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBYSxlQUFlO0lBaUIxQixNQUFNLENBQUMsS0FBSyxDQUNWLEVBQVUsRUFDVixLQUFxQjtRQUVyQixPQUFPLENBQUMsR0FBUSxFQUFFLEtBQWdCLEVBQWUsRUFBRTtZQUNqRCxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxNQUFNLGFBQWEsR0FBNkI7Z0JBQzlDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN4QixHQUFHLEtBQUs7YUFDVCxDQUFDO1lBQ0YsT0FBTyxJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBbkNELDBDQW1DQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLGdCQUNYLFNBQVEsc0JBQVM7SUFTakIsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBUEgsaUJBQVksR0FBRyxVQUFtQixDQUFDO1FBQ25DLGtCQUFhLEdBQUcsVUFBbUIsQ0FBQztRQU9sRCxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUViLE1BQU0sVUFBVSxHQUF1QjtZQUNyQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxzQkFBc0I7WUFDcEQsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM5QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM5QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksd0JBQWEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFtQjtRQUMvQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxjQUFjLENBQUMsT0FBbUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBbUI7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQW1CO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFtQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQWpFRCw0Q0FpRUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxrQkFDWCxTQUFRLHNCQUFTO0lBY2pCLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDdkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQVJILGtCQUFhLEdBQUcsWUFBcUIsQ0FBQztRQVNwRCxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMvQixnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBK0I7UUFDekMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsS0FBSyxRQUFRO2dCQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU07WUFDUixLQUFLLGNBQWM7Z0JBQ2pCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVCLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsTUFBTTtZQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1IsTUFBTSxXQUFXLEdBQVUsS0FBSyxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUNiLDhCQUE4QixNQUFNLENBQUUsV0FBd0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN2RixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sU0FBUyxDQUFDLEtBQTBCO1FBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUV2RSxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxjQUFjLElBQUksWUFBWSxDQUFDO1FBQ3BFLE1BQU0sY0FBYyxHQUNsQixLQUFLLENBQUMsTUFBTSxJQUFJLHNCQUFzQixDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDakUsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFN0QsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM3QixpQ0FBVyxDQUFDLElBQUksQ0FDZCxvQkFBb0IsS0FBSyxDQUFDLFlBQVksNkNBQTZDO2dCQUNqRixrRUFBa0UsQ0FDckUsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksb0JBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxLQUFLLEVBQUU7WUFDOUQsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLFlBQVk7WUFDWixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztZQUNsQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtZQUN0QyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO1lBQzVDLDBCQUEwQixFQUFFLEtBQUssQ0FBQywwQkFBMEI7WUFDNUQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDOUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtZQUM1QyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO1lBQzVDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3BDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0I7WUFDNUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDN0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBZ0M7UUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFFMUUsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUMsY0FBYyxJQUFJLFlBQVksQ0FBQztRQUNwRSxNQUFNLGNBQWMsR0FDbEIsS0FBSyxDQUFDLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxpQ0FBZSxDQUNqQyxJQUFJLEVBQ0osR0FBRyxLQUFLLENBQUMsWUFBWSxXQUFXLEVBQ2hDO1lBQ0UsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNsQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyx1QkFBdUI7WUFDdEQsTUFBTSxFQUFFLGNBQWM7WUFDdEIsWUFBWTtZQUNaLDJCQUEyQixFQUFFLEtBQUssQ0FBQywyQkFBMkI7WUFDOUQsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDdEMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtZQUM1QywwQkFBMEIsRUFBRSxLQUFLLENBQUMsMEJBQTBCO1lBQzVELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1lBQzlDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0I7WUFDNUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtZQUM1QyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1NBQ3pDLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDN0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBNEI7UUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxZQUFZLENBQUM7UUFDcEUsTUFBTSxjQUFjLEdBQ2xCLEtBQUssQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM1RCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksc0JBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxLQUFLLEVBQUU7WUFDaEUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixNQUFNLEVBQUUsY0FBYztZQUN0QixZQUFZO1lBQ1osT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLGVBQWUsRUFDYixLQUFLLENBQUMsZUFBZSxLQUFLLFNBQVM7Z0JBQ2pDLENBQUMsQ0FBQyxzQkFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO2dCQUN0QyxDQUFDLENBQUMsU0FBUztZQUNmLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDOUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0I7WUFDNUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtZQUM1QyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO1lBQzVDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQStCO1FBQ3hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDakQsTUFBTSxTQUFTLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzNDLHNGQUFzRjtRQUN0RixNQUFNLFVBQVUsR0FBRyxJQUFBLGtDQUFZLEVBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXBELElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxVQUFVLFVBQVUsRUFBRTtZQUMzQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEdBQUcsVUFBVSxVQUFVO1lBQ3hDLFVBQVUsRUFBRSxHQUFHLFNBQVMsR0FBRyxVQUFVLFVBQVU7WUFDL0MsS0FBSyxFQUFFLFFBQVE7WUFDZixXQUFXLEVBQUUseUJBQXlCLEtBQUssQ0FBQyxZQUFZLEVBQUU7U0FDM0QsQ0FBQyxDQUFDO1FBRUgsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxHQUFHLFVBQVUsTUFBTSxFQUFFO1lBQ3ZDLEdBQUcsRUFBRSxHQUFHLFNBQVMsR0FBRyxVQUFVLE1BQU07WUFDcEMsVUFBVSxFQUFFLEdBQUcsU0FBUyxHQUFHLFVBQVUsTUFBTTtZQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUU7WUFDbEMsV0FBVyxFQUFFLHFCQUFxQixLQUFLLENBQUMsWUFBWSxFQUFFO1NBQ3ZELENBQUMsQ0FBQztRQUVILElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxVQUFVLGNBQWMsRUFBRTtZQUMvQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEdBQUcsVUFBVSxjQUFjO1lBQzVDLFVBQVUsRUFBRSxHQUFHLFNBQVMsR0FBRyxVQUFVLGNBQWM7WUFDbkQsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ3pCLFdBQVcsRUFBRSxxQkFBcUIsS0FBSyxDQUFDLFlBQVksRUFBRTtTQUN2RCxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25ELElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxVQUFVLFdBQVcsRUFBRTtZQUM1QyxHQUFHLEVBQUUsR0FBRyxTQUFTLEdBQUcsVUFBVSxXQUFXO1lBQ3pDLFVBQVUsRUFBRSxHQUFHLFNBQVMsR0FBRyxVQUFVLFdBQVc7WUFDaEQsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUztZQUNuQyxXQUFXLEVBQUUsdUNBQXVDLEtBQUssQ0FBQyxZQUFZLEVBQUU7U0FDekUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxPQUFxQjtRQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRjtBQWhPRCxnREFnT0M7QUFTRCw0QkFBNEI7QUFDNUIsd0RBV2tDO0FBTGhDLG1IQUFBLG9CQUFvQixPQUFBO0FBQ3BCLGlIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLGlIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHFIQUFBLHNCQUFzQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENmbk91dHB1dCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IFJkc0F1cm9yYSwgUmRzSW5zdGFuY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9kYXRhYmFzZVwiO1xuaW1wb3J0IHsgUmRzQXVyb3JhR2xvYmFsIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhR2xvYmFsXCI7XG5pbXBvcnQge1xuICBEeW5hbW9EQlRhYmxlLFxuICB0eXBlIER5bmFtb0RCS2V5U2NoZW1hLFxuICB0eXBlIER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXgsXG4gIHR5cGUgRHluYW1vREJUYWJsZVByb3BzXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL2R5bmFtb2RiXCI7XG5pbXBvcnQge1xuICBGamFsbExvZ2dlcixcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWRcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCIuLi8uLi91dGlscy9jYXBpdGFsaXNlU3RyaW5nLmpzXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElWcGMsXG4gIHR5cGUgU3VibmV0U2VsZWN0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyB0eXBlIElUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCB7IHR5cGUgU2VjcmV0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc2VjcmV0c1wiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIHR5cGUgSVJlbGF0aW9uYWxEYXRhYmFzZSxcbiAgdHlwZSBJRHluYW1vREJEYXRhYmFzZSxcbiAgdHlwZSBBbnlEYXRhYmFzZSxcbiAgdHlwZSBSZWxhdGlvbmFsRGF0YWJhc2VUeXBlXG59IGZyb20gXCIuL2ludGVyZmFjZXMvZGF0YWJhc2UuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgSUR5bmFtb0RCQ29ubmVjdG9yLFxuICB0eXBlIElTZWN1cml0eUdyb3VwQ29ubmVjdG9yXG59IGZyb20gXCIuL2ludGVyZmFjZXMvY29ubmVjdG9yLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIElJbnN0YW5jZUVuZ2luZSxcbiAgdHlwZSBJQ2x1c3RlckVuZ2luZSxcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICBEYXRhYmFzZUluc3RhbmNlRW5naW5lLFxuICBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24sXG4gIEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbixcbiAgUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxuICBNeXNxbEVuZ2luZVZlcnNpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIElLZXkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWttc1wiO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZUVuZ2luZSA9IFwicG9zdGdyZXNxbFwiIHwgXCJteXNxbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuZ2luZUNvbmZpZyB7XG4gIGRlZmF1bHRVc2VybmFtZTogc3RyaW5nO1xuICBzc2xQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByb3RhdGlvbkFwcE5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IERBVEFCQVNFX0VOR0lORV9DT05GSUc6IFJlY29yZDxcbiAgRGF0YWJhc2VFbmdpbmUsXG4gIHtcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogc3RyaW5nOyBtYWpvclZlcnNpb246IHN0cmluZyB9O1xuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IHN0cmluZzsgbWFqb3JWZXJzaW9uOiBzdHJpbmcgfTtcbiAgICBkZWZhdWx0VXNlcm5hbWU6IHN0cmluZztcbiAgICBzc2xQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHJvdGF0aW9uQXBwTmFtZTogc3RyaW5nO1xuICB9XG4+ID0ge1xuICBwb3N0Z3Jlc3FsOiB7XG4gICAgYXVyb3JhOiB7IHZlcnNpb246IFwiMTYuNlwiLCBtYWpvclZlcnNpb246IFwiMTZcIiB9LFxuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IFwiMTcuNVwiLCBtYWpvclZlcnNpb246IFwiMTdcIiB9LFxuICAgIGRlZmF1bHRVc2VybmFtZTogXCJwb3N0Z3Jlc1wiLFxuICAgIHNzbFBhcmFtZXRlcnM6IHsgXCJyZHMuZm9yY2Vfc3NsXCI6IFwiMVwiIH0sXG4gICAgcm90YXRpb25BcHBOYW1lOiBcIlNlY3JldHNNYW5hZ2VyUkRTUG9zdGdyZVNRTFJvdGF0aW9uTXVsdGlVc2VyXCJcbiAgfSxcbiAgbXlzcWw6IHtcbiAgICAvLyBtYWpvclZlcnNpb24gbXVzdCBiZSBBdXJvcmEgdmVyc2lvbiAoMy4wOC4wKSwgTk9UIE15U1FMIHZlcnNpb24gKDguMClcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogXCI4LjAubXlzcWxfYXVyb3JhLjMuMDguMFwiLCBtYWpvclZlcnNpb246IFwiMy4wOC4wXCIgfSxcbiAgICBpbnN0YW5jZTogeyB2ZXJzaW9uOiBcIjguNC40XCIsIG1ham9yVmVyc2lvbjogXCI4LjRcIiB9LFxuICAgIGRlZmF1bHRVc2VybmFtZTogXCJhZG1pblwiLFxuICAgIHNzbFBhcmFtZXRlcnM6IHsgcmVxdWlyZV9zZWN1cmVfdHJhbnNwb3J0OiBcIk9OXCIgfSxcbiAgICByb3RhdGlvbkFwcE5hbWU6IFwiU2VjcmV0c01hbmFnZXJSRFNNeVNRTFJvdGF0aW9uTXVsdGlVc2VyXCJcbiAgfVxufTtcblxuY29uc3QgQVVST1JBX0VOR0lORV9GQUNUT1JJRVM6IFJlY29yZDxEYXRhYmFzZUVuZ2luZSwgKCkgPT4gSUNsdXN0ZXJFbmdpbmU+ID0ge1xuICBwb3N0Z3Jlc3FsOiAoKSA9PiB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcucG9zdGdyZXNxbC5hdXJvcmE7XG4gICAgcmV0dXJuIERhdGFiYXNlQ2x1c3RlckVuZ2luZS5hdXJvcmFQb3N0Z3Jlcyh7XG4gICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24ub2YodmVyc2lvbiwgbWFqb3JWZXJzaW9uKVxuICAgIH0pO1xuICB9LFxuICBteXNxbDogKCkgPT4ge1xuICAgIGNvbnN0IHsgdmVyc2lvbiwgbWFqb3JWZXJzaW9uIH0gPSBEQVRBQkFTRV9FTkdJTkVfQ09ORklHLm15c3FsLmF1cm9yYTtcbiAgICByZXR1cm4gRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYU15c3FsKHtcbiAgICAgIHZlcnNpb246IEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgfSk7XG4gIH1cbn07XG5cbmNvbnN0IElOU1RBTkNFX0VOR0lORV9GQUNUT1JJRVM6IFJlY29yZDxEYXRhYmFzZUVuZ2luZSwgKCkgPT4gSUluc3RhbmNlRW5naW5lPiA9XG4gIHtcbiAgICBwb3N0Z3Jlc3FsOiAoKSA9PiB7XG4gICAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID1cbiAgICAgICAgREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5wb3N0Z3Jlc3FsLmluc3RhbmNlO1xuICAgICAgcmV0dXJuIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUucG9zdGdyZXMoe1xuICAgICAgICB2ZXJzaW9uOiBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24ub2YodmVyc2lvbiwgbWFqb3JWZXJzaW9uKVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBteXNxbDogKCkgPT4ge1xuICAgICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcubXlzcWwuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gRGF0YWJhc2VJbnN0YW5jZUVuZ2luZS5teXNxbCh7XG4gICAgICAgIHZlcnNpb246IE15c3FsRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBJQ2x1c3RlckVuZ2luZSB7XG4gIHJldHVybiBBVVJPUkFfRU5HSU5FX0ZBQ1RPUklFU1tlbmdpbmVdKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YW5jZUVuZ2luZShlbmdpbmU6IERhdGFiYXNlRW5naW5lKTogSUluc3RhbmNlRW5naW5lIHtcbiAgcmV0dXJuIElOU1RBTkNFX0VOR0lORV9GQUNUT1JJRVNbZW5naW5lXSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5naW5lQ29uZmlnKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBFbmdpbmVDb25maWcge1xuICBjb25zdCBjb25maWcgPSBEQVRBQkFTRV9FTkdJTkVfQ09ORklHW2VuZ2luZV07XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdFVzZXJuYW1lOiBjb25maWcuZGVmYXVsdFVzZXJuYW1lLFxuICAgIHNzbFBhcmFtZXRlcnM6IGNvbmZpZy5zc2xQYXJhbWV0ZXJzLFxuICAgIHJvdGF0aW9uQXBwTmFtZTogY29uZmlnLnJvdGF0aW9uQXBwTmFtZVxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3h5Q29uZmlnIHtcbiAgbWF4Q29ubmVjdGlvbnM/OiBudW1iZXI7XG4gIG1heElkbGVDb25uZWN0aW9ucz86IG51bWJlcjtcbiAgY29ubmVjdGlvbkJvcnJvd1RpbWVvdXQ/OiBudW1iZXI7XG4gIHJlcXVpcmVUTFM/OiBib29sZWFuO1xuICB2cGNTdWJuZXRzPzogU3VibmV0U2VsZWN0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRSZXBsaWNhQ29uZmlnIHtcbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xuICBhdmFpbGFiaWxpdHlab25lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWRlbnRpYWxzQ29uZmlnIHtcbiAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gIHNlY3JldFJvdGF0aW9uPzogU2VjcmV0Um90YXRpb25Db25maWcgfCBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWNyZXRSb3RhdGlvbkNvbmZpZyB7XG4gIGF1dG9tYXRpY2FsbHlBZnRlcj86IER1cmF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVuY3J5cHRpb25Db25maWcge1xuICBzdG9yYWdlS2V5PzogRW5jcnlwdGlvbktleVNwZWM7XG59XG5cbmV4cG9ydCB0eXBlIFBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb25QZXJpb2QgPSA3IHwgMzEgfCA5MyB8IDE4NiB8IDM3MjtcblxuZXhwb3J0IGludGVyZmFjZSBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHtcbiAgZW5jcnlwdGlvbktleT86IEVuY3J5cHRpb25LZXlTcGVjO1xuICAvKiogUmV0ZW50aW9uIHBlcmlvZCBpbiBkYXlzLiBEZWZhdWx0OiAzMSAoMSBtb250aCkuICovXG4gIHJldGVudGlvblBlcmlvZD86IFBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb25QZXJpb2Q7XG59XG5cbi8vIE1hcmtlciBmb3IgQVdTIG1hbmFnZWQgZW5jcnlwdGlvbiBrZXkgKGF3cy9yZHMsIGF3cy9zMywgZXRjLilcbmV4cG9ydCBpbnRlcmZhY2UgQXdzTWFuYWdlZEtleSB7XG4gIHJlYWRvbmx5IGF3c01hbmFnZWQ6IHRydWU7XG59XG5cbi8vIE1hcmtlciBmb3IgZXhwbGljaXRseSByZXF1ZXN0aW5nIGEgQ3VzdG9tZXIgTWFuYWdlZCBLZXkgKENNSykuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbWVyTWFuYWdlZEtleU1hcmtlciB7XG4gIHJlYWRvbmx5IHVzZUNNSzogdHJ1ZTtcbn1cblxuLy8gRW5jcnlwdGlvbiBrZXkgc3BlY2lmaWNhdGlvbiBmb3IgUkRTIHJlc291cmNlcy5cbmV4cG9ydCB0eXBlIEVuY3J5cHRpb25LZXlTcGVjID0gSUtleSB8IEF3c01hbmFnZWRLZXkgfCBDdXN0b21lck1hbmFnZWRLZXlNYXJrZXI7XG5cbi8vIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgdGhlIGVuY3J5cHRpb24ga2V5IHNwZWMgaXMgQVdTIG1hbmFnZWQuXG5leHBvcnQgZnVuY3Rpb24gaXNBd3NNYW5hZ2VkS2V5KFxuICBzcGVjOiBFbmNyeXB0aW9uS2V5U3BlYyB8IHVuZGVmaW5lZFxuKTogc3BlYyBpcyBBd3NNYW5hZ2VkS2V5IHtcbiAgcmV0dXJuIChcbiAgICBzcGVjICE9PSB1bmRlZmluZWQgJiZcbiAgICB0eXBlb2Ygc3BlYyA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwiYXdzTWFuYWdlZFwiIGluIHNwZWMgJiZcbiAgICAoc3BlYyBhcyBBd3NNYW5hZ2VkS2V5KS5hd3NNYW5hZ2VkID09PSB0cnVlXG4gICk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBDTUsgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NNS1JlcXVlc3RlZChcbiAgc3BlYzogRW5jcnlwdGlvbktleVNwZWMgfCB1bmRlZmluZWRcbik6IHNwZWMgaXMgQ3VzdG9tZXJNYW5hZ2VkS2V5TWFya2VyIHtcbiAgcmV0dXJuIChcbiAgICBzcGVjICE9PSB1bmRlZmluZWQgJiZcbiAgICB0eXBlb2Ygc3BlYyA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwidXNlQ01LXCIgaW4gc3BlYyAmJlxuICAgIChzcGVjIGFzIEN1c3RvbWVyTWFuYWdlZEtleU1hcmtlcikudXNlQ01LID09PSB0cnVlXG4gICk7XG59XG5cbi8qKlxuICogQ29udmVuaWVuY2UgY29uc3RhbnQgZm9yIHNwZWNpZnlpbmcgQVdTIG1hbmFnZWQgZW5jcnlwdGlvbiAodGhlIGRlZmF1bHQpLlxuICogQGV4YW1wbGVcbiAqIGVuY3J5cHRpb246IHsgc3RvcmFnZUtleTogQVdTX01BTkFHRUQgfVxuICovXG5leHBvcnQgY29uc3QgQVdTX01BTkFHRUQ6IEF3c01hbmFnZWRLZXkgPSB7IGF3c01hbmFnZWQ6IHRydWUgfSBhcyBjb25zdDtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBjb25zdGFudCBmb3IgZXhwbGljaXRseSByZXF1ZXN0aW5nIENNSy5cbiAqIEBleGFtcGxlXG4gKiBlbmNyeXB0aW9uOiB7IHN0b3JhZ2VLZXk6IFVTRV9DTUsgfVxuICovXG5leHBvcnQgY29uc3QgVVNFX0NNSzogQ3VzdG9tZXJNYW5hZ2VkS2V5TWFya2VyID0geyB1c2VDTUs6IHRydWUgfSBhcyBjb25zdDtcblxuLyoqXG4gKiAqKkRFU1RSVUNUSVZFKio6IENoYW5naW5nIGBzdG9yYWdlS2V5YCBhZnRlciBjbHVzdGVyIGNyZWF0aW9uIGNhdXNlcyBjbHVzdGVyIFJFUExBQ0VNRU5ULlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYUVuY3J5cHRpb25Db25maWcge1xuICAvKiogREVTVFJVQ1RJVkU6IENoYW5naW5nIGFmdGVyIGNyZWF0aW9uIGNhdXNlcyBjbHVzdGVyIHJlcGxhY2VtZW50ICovXG4gIHN0b3JhZ2VLZXk/OiBFbmNyeXB0aW9uS2V5U3BlYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXJvcmFSZWFkZXJDb25maWcge1xuICBzY2FsZVdpdGhXcml0ZXI/OiBib29sZWFuO1xuICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzPzogYm9vbGVhbjtcbiAgaWRlbnRpZmllclN1ZmZpeD86IHN0cmluZztcbiAgYXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXJvcmFXcml0ZXJDb25maWcge1xuICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzPzogYm9vbGVhbjtcbiAgaWRlbnRpZmllclN1ZmZpeD86IHN0cmluZztcbiAgYXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXJvcmFSZWFkZXJzQ29uZmlnIHtcbiAgLyoqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGluc3RhbmNlcyAqL1xuICBjb3VudD86IG51bWJlcjtcbiAgLyoqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGNvdW50ICovXG4gIGluc3RhbmNlcz86IEF1cm9yYVJlYWRlckNvbmZpZ1tdO1xuICBkZWZhdWx0RW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQmFzZSBwcm9wcyBmb3IgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAqL1xudHlwZSBCYXNlRGF0YWJhc2VQcm9wcyA9IHtcbiAgdnBjPzogSVZwYztcbiAgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcbiAgZGVsZXRpb25Qcm90ZWN0aW9uPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVyb3JhRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJBdXJvcmFcIjtcbiAgZGF0YWJhc2VFbmdpbmU/OiBEYXRhYmFzZUVuZ2luZTtcbiAgLyoqIE92ZXJyaWRlcyBkYXRhYmFzZUVuZ2luZSBpZiBwcm92aWRlZCAqL1xuICBlbmdpbmU/OiBJQ2x1c3RlckVuZ2luZTtcbiAgd3JpdGVyPzogQXVyb3JhV3JpdGVyQ29uZmlnO1xuICByZWFkZXJzPzogQXVyb3JhUmVhZGVyc0NvbmZpZyB8IGZhbHNlO1xuICBwcm94eT86IFByb3h5Q29uZmlnIHwgZmFsc2U7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIC8qKiBERVNUUlVDVElWRTogQ2hhbmdpbmcgc3RvcmFnZUtleSBjYXVzZXMgY2x1c3RlciByZXBsYWNlbWVudCAqL1xuICBlbmNyeXB0aW9uPzogQXVyb3JhRW5jcnlwdGlvbkNvbmZpZztcbiAgYmFja3VwUmV0ZW50aW9uPzogbnVtYmVyO1xuICBtb25pdG9yaW5nSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c/OiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIHBlcmZvcm1hbmNlSW5zaWdodHM/OiBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHwgZmFsc2U7XG4gIC8qKiBBUk4gb3IgaWRlbnRpZmllciBvZiBEQiBjbHVzdGVyIHNuYXBzaG90IHRvIHJlc3RvcmUgZnJvbSAqL1xuICBzbmFwc2hvdElkZW50aWZpZXI/OiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSBmcm9tIHRoZSBzbmFwc2hvdCAocmVxdWlyZWQgd2hlbiByZXN0b3JpbmcgZnJvbSBzbmFwc2hvdCB0byByZXNldCBwYXNzd29yZCkgKi9cbiAgc25hcHNob3RVc2VybmFtZT86IHN0cmluZztcbiAgLyoqIEFsbG93IGFjY2VzcyBmcm9tIFZQQyBDSURSIChhdm9pZHMgY3Jvc3Mtc3RhY2sgY3ljbGljIGRlcGVuZGVuY2llcyB3aXRoIExhbWJkYSkgKi9cbiAgYWxsb3dWcGNBY2Nlc3M/OiBib29sZWFuO1xuICAvKipcbiAgICogTWFrZSBkYXRhYmFzZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZyb20gdGhlIGludGVybmV0LlxuICAgKiBXQVJOSU5HOiBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzayBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnRcbiAgICogb3Igd2hlbiBidWlsZGluZyBQYXlsb2FkIGFwcHMgbG9jYWxseSB0aGF0IG5lZWQgZGF0YWJhc2UgYWNjZXNzLlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBkYXRhYmFzZSBpcyBwbGFjZWQgaW4gcHVibGljIHN1Ym5ldHMuXG4gICAqL1xuICBwdWJsaWNseUFjY2Vzc2libGU/OiBib29sZWFuO1xuICAvKipcbiAgICogSVAgYWRkcmVzcyB0byBhbGxvdyBhY2Nlc3MgZnJvbSB3aGVuIHB1YmxpY2x5QWNjZXNzaWJsZSBpcyB0cnVlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBhY2Nlc3MgaXMgcmVzdHJpY3RlZCB0byBWUEMgb25seSBldmVuIHdoZW4gcHVibGljLlxuICAgKiBGb3JtYXQ6IENJRFIgbm90YXRpb24gKGUuZy4sIFwiMjAzLjAuMTEzLjAvMzJcIiBmb3Igc2luZ2xlIElQKVxuICAgKi9cbiAgYWxsb3dlZElwQ2lkcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxBdXJvcmFEYXRhYmFzZVByb3BzIGV4dGVuZHMgQmFzZURhdGFiYXNlUHJvcHMge1xuICB0eXBlOiBcIkdsb2JhbEF1cm9yYVwiO1xuICBwcmltYXJ5UmVnaW9uOiBzdHJpbmc7XG4gIHNlY29uZGFyeVJlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIGVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZz86IGJvb2xlYW47XG4gIGRhdGFiYXNlRW5naW5lPzogRGF0YWJhc2VFbmdpbmU7XG4gIC8qKiBPdmVycmlkZXMgZGF0YWJhc2VFbmdpbmUgaWYgcHJvdmlkZWQgKi9cbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICAvKiogREVTVFJVQ1RJVkU6IENoYW5naW5nIHN0b3JhZ2VLZXkgY2F1c2VzIGNsdXN0ZXIgcmVwbGFjZW1lbnQgKi9cbiAgZW5jcnlwdGlvbj86IEF1cm9yYUVuY3J5cHRpb25Db25maWc7XG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgY2x1c3RlciBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xuICAvKiogVXNlcm5hbWUgZnJvbSB0aGUgc25hcHNob3QgKHJlcXVpcmVkIHdoZW4gcmVzdG9yaW5nIGZyb20gc25hcHNob3QgdG8gcmVzZXQgcGFzc3dvcmQpICovXG4gIHNuYXBzaG90VXNlcm5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFuY2VEYXRhYmFzZVByb3BzIGV4dGVuZHMgQmFzZURhdGFiYXNlUHJvcHMge1xuICB0eXBlOiBcIkluc3RhbmNlXCI7XG4gIGRhdGFiYXNlRW5naW5lPzogRGF0YWJhc2VFbmdpbmU7XG4gIC8qKiBPdmVycmlkZXMgZGF0YWJhc2VFbmdpbmUgaWYgcHJvdmlkZWQgKi9cbiAgZW5naW5lPzogSUluc3RhbmNlRW5naW5lO1xuICBhbGxvY2F0ZWRTdG9yYWdlPzogbnVtYmVyO1xuICBwb3J0PzogbnVtYmVyO1xuICBtdWx0aUF6PzogYm9vbGVhbjtcbiAgYmFja3VwUmV0ZW50aW9uPzogbnVtYmVyO1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICBwcm94eT86IFByb3h5Q29uZmlnIHwgZmFsc2U7XG4gIHJlYWRSZXBsaWNhPzogUmVhZFJlcGxpY2FDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25Db25maWc7XG4gIHB1YmxpY2x5QWNjZXNzaWJsZT86IGJvb2xlYW47XG4gIC8qKiBBUk4gb3IgaWRlbnRpZmllciBvZiBEQiBpbnN0YW5jZSBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xuICAvKiogVXNlcm5hbWUgZnJvbSB0aGUgc25hcHNob3QgKHJlcXVpcmVkIHdoZW4gcmVzdG9yaW5nIGZyb20gc25hcHNob3QgdG8gcmVzZXQgcGFzc3dvcmQpICovXG4gIHNuYXBzaG90VXNlcm5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRHluYW1vREIgdGFibGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCRGF0YWJhc2VQcm9wcyB7XG4gIHR5cGU6IFwiRHluYW1vREJcIjtcbiAgcGFydGl0aW9uS2V5OiBEeW5hbW9EQktleVNjaGVtYTtcbiAgc29ydEtleT86IER5bmFtb0RCS2V5U2NoZW1hO1xuICBiaWxsaW5nTW9kZT86IFwiUEFZX1BFUl9SRVFVRVNUXCIgfCBcIlBST1ZJU0lPTkVEXCI7XG4gIHJlYWRDYXBhY2l0eT86IG51bWJlcjtcbiAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcz86IER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXhbXTtcbiAgdGltZVRvTGl2ZUF0dHJpYnV0ZT86IHN0cmluZztcbiAgc3RyZWFtPzogXCJORVdfSU1BR0VcIiB8IFwiT0xEX0lNQUdFXCIgfCBcIk5FV19BTkRfT0xEX0lNQUdFU1wiIHwgXCJLRVlTX09OTFlcIjtcbiAgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIGVuY3J5cHRpb24/OiBcIkFXU19PV05FRFwiIHwgXCJBV1NfTUFOQUdFRFwiIHwgXCJDVVNUT01FUl9NQU5BR0VEXCI7XG4gIHJlbW92YWxQb2xpY3k/OiBcIkRFU1RST1lcIiB8IFwiUkVUQUlOXCIgfCBcIlNOQVBTSE9UXCI7XG59XG5cbi8qKlxuICogUmVsYXRpb25hbCBkYXRhYmFzZSBwcm9wcyB1bmlvbiAoQXVyb3JhLCBJbnN0YW5jZSwgR2xvYmFsQXVyb3JhKS5cbiAqL1xuZXhwb3J0IHR5cGUgSVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzID1cbiAgfCBBdXJvcmFEYXRhYmFzZVByb3BzXG4gIHwgSW5zdGFuY2VEYXRhYmFzZVByb3BzXG4gIHwgR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wcztcblxuLyoqXG4gKiBBbGwgZGF0YWJhc2UgcHJvcHMgdW5pb24uXG4gKi9cbmV4cG9ydCB0eXBlIElEYXRhYmFzZVByb3BzID1cbiAgfCBBdXJvcmFEYXRhYmFzZVByb3BzXG4gIHwgSW5zdGFuY2VEYXRhYmFzZVByb3BzXG4gIHwgR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wc1xuICB8IER5bmFtb0RCRGF0YWJhc2VQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgRHluYW1vREIgcHJvcHMgYW5kIGxvZ3Mgd2FybmluZ3MgZm9yIG1pc2NvbmZpZ3VyZWQgb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEeW5hbW9EQlByb3BzKHByb3BzOiBEeW5hbW9EQkRhdGFiYXNlUHJvcHMpOiB2b2lkIHtcbiAgLy8gVmFsaWRhdGUgcHJvdmlzaW9uZWQgY2FwYWNpdHlcbiAgaWYgKHByb3BzLmJpbGxpbmdNb2RlID09PSBcIlBST1ZJU0lPTkVEXCIpIHtcbiAgICBpZiAoIXByb3BzLnJlYWRDYXBhY2l0eSB8fCAhcHJvcHMud3JpdGVDYXBhY2l0eSkge1xuICAgICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgICAgXCInYmlsbGluZ01vZGUnIGlzIFBST1ZJU0lPTkVEIGJ1dCBjYXBhY2l0eSBub3Qgc3BlY2lmaWVkLiBcIiArXG4gICAgICAgICAgXCJVc2luZyBkZWZhdWx0IHZhbHVlcy4gQ29uc2lkZXIgc3BlY2lmeWluZyAncmVhZENhcGFjaXR5JyBhbmQgJ3dyaXRlQ2FwYWNpdHknLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdhcm4gYWJvdXQgY2FwYWNpdHkgd2l0aCBvbi1kZW1hbmQgYmlsbGluZ1xuICBpZiAocHJvcHMuYmlsbGluZ01vZGUgIT09IFwiUFJPVklTSU9ORURcIikge1xuICAgIGlmIChwcm9wcy5yZWFkQ2FwYWNpdHkgfHwgcHJvcHMud3JpdGVDYXBhY2l0eSkge1xuICAgICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgICAgXCIncmVhZENhcGFjaXR5JyBvciAnd3JpdGVDYXBhY2l0eScgc3BlY2lmaWVkIGJ1dCAnYmlsbGluZ01vZGUnIFwiICtcbiAgICAgICAgICBcImlzIG5vdCBQUk9WSVNJT05FRC4gQ2FwYWNpdHkgc2V0dGluZ3Mgd2lsbCBiZSBpZ25vcmVkLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIEdTSSBwYXJ0aXRpb24ga2V5cyBhcmUgZGlmZmVyZW50IGZyb20gdGFibGUgcGFydGl0aW9uIGtleVxuICBpZiAocHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcykge1xuICAgIGNvbnN0IHRhYmxlUGFydGl0aW9uS2V5ID0gcHJvcHMucGFydGl0aW9uS2V5Lm5hbWU7XG4gICAgZm9yIChjb25zdCBnc2kgb2YgcHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcykge1xuICAgICAgaWYgKFxuICAgICAgICBnc2kucGFydGl0aW9uS2V5Lm5hbWUgPT09IHRhYmxlUGFydGl0aW9uS2V5ICYmXG4gICAgICAgIGdzaS5zb3J0S2V5Py5uYW1lID09PSBwcm9wcy5zb3J0S2V5Py5uYW1lXG4gICAgICApIHtcbiAgICAgICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgICAgICBgR1NJICcke2dzaS5pbmRleE5hbWV9JyBoYXMgdGhlIHNhbWUga2V5IHNjaGVtYSBhcyB0aGUgdGFibGUuIGAgK1xuICAgICAgICAgICAgXCJUaGlzIG1heSBub3QgcHJvdmlkZSB0aGUgcXVlcnkgZmxleGliaWxpdHkgeW91IG5lZWQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgcmVsYXRpb25hbCBkYXRhYmFzZSBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgaWdub3JlZCBvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKiBUaGVzZSBjaGVja3MgaGVscCBjYXRjaCBpc3N1ZXMgd2hlbiBwcm9wcyBjb21lIGZyb20gZHluYW1pYyBzb3VyY2VzIHdoZXJlXG4gKiBUeXBlU2NyaXB0J3MgY29tcGlsZS10aW1lIGNoZWNrcyBtYXkgbm90IGFwcGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKFxuICBwcm9wczogSVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzXG4pOiB2b2lkIHtcbiAgLy8gR2xvYmFsQXVyb3JhIHJlcXVpcmVzIHByaW1hcnlSZWdpb25cbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiR2xvYmFsQXVyb3JhXCIgJiYgIXByb3BzLnByaW1hcnlSZWdpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkdsb2JhbEF1cm9yYSBkYXRhYmFzZSByZXF1aXJlcyAncHJpbWFyeVJlZ2lvbicuIFwiICtcbiAgICAgICAgXCJTcGVjaWZ5IHRoZSBBV1MgcmVnaW9uIHdoZXJlIHRoZSBwcmltYXJ5IGNsdXN0ZXIgd2lsbCBiZSBjcmVhdGVkLlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIEluc3RhbmNlLW9ubHkgb3B0aW9ucyBvbiBBdXJvcmEvR2xvYmFsQXVyb3JhXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcInJlYWRSZXBsaWNhXCIsIFwibXVsdGlBelwiLCBcImFsbG9jYXRlZFN0b3JhZ2VcIl0sXG4gICAgXCJJbnN0YW5jZVwiLFxuICAgIFwiSW5zdGFuY2UgZGF0YWJhc2VcIlxuICApO1xuXG4gIC8vIEF1cm9yYS1vbmx5IG9wdGlvbnMgb24gSW5zdGFuY2VcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHMsXG4gICAgW1wicmVhZGVyc1wiLCBcIndyaXRlclwiLCBcImJhY2t1cFJldGVudGlvblwiXSxcbiAgICBbXCJBdXJvcmFcIiwgXCJHbG9iYWxBdXJvcmFcIl0sXG4gICAgXCJBdXJvcmEgZGF0YWJhc2VcIlxuICApO1xuXG4gIC8vIEdsb2JhbEF1cm9yYS1vbmx5IG9wdGlvbnMgb24gbm9uLWdsb2JhbCBkYXRhYmFzZXNcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHMsXG4gICAgW1wicHJpbWFyeVJlZ2lvblwiLCBcInNlY29uZGFyeVJlZ2lvbnNcIiwgXCJlbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmdcIl0sXG4gICAgXCJHbG9iYWxBdXJvcmFcIixcbiAgICBcIkdsb2JhbEF1cm9yYSBkYXRhYmFzZVwiXG4gICk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGRhdGFiYXNlIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBpZ25vcmVkIG9yIG1pc2NvbmZpZ3VyZWQgb3B0aW9ucy5cbiAqIERpc3BhdGNoZXMgdG8gdHlwZS1zcGVjaWZpYyB2YWxpZGF0b3JzIGJhc2VkIG9uIHRoZSBkYXRhYmFzZSB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURhdGFiYXNlUHJvcHMocHJvcHM6IElEYXRhYmFzZVByb3BzKTogdm9pZCB7XG4gIGlmIChwcm9wcy50eXBlID09PSBcIkR5bmFtb0RCXCIpIHtcbiAgICB2YWxpZGF0ZUR5bmFtb0RCUHJvcHMocHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUmVsYXRpb25hbERhdGFiYXNlUHJvcHMocHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHlwZS1zYWZlIGRhdGFiYXNlIHJlc291cmNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXVyb3JhIGRhdGFiYXNlIC0gcmV0dXJucyBSZWxhdGlvbmFsRGF0YWJhc2VcbiAqIGNvbnN0IGF1cm9yYSA9IGFwcC5hZGREYXRhYmFzZShEYXRhYmFzZUZhY3RvcnkuYnVpbGQoXCJNYWluXCIsIHtcbiAqICAgdHlwZTogXCJBdXJvcmFcIixcbiAqICAgZGF0YWJhc2VOYW1lOiBcIm15X2FwcFwiXG4gKiB9KSk7XG4gKiBhdXJvcmEuZ2V0SG9zdEVuZHBvaW50KCk7IC8vIEF2YWlsYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBEeW5hbW9EQiB0YWJsZSAtIHJldHVybnMgRHluYW1vREJEYXRhYmFzZVxuICogY29uc3QgY2FjaGUgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiQ2FjaGVcIiwge1xuICogICB0eXBlOiBcIkR5bmFtb0RCXCIsXG4gKiAgIHBhcnRpdGlvbktleTogeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiU1wiIH1cbiAqIH0pKTtcbiAqIGNhY2hlLmdldFRhYmxlTmFtZSgpOyAvLyBBdmFpbGFibGVcbiAqIGNhY2hlLmdyYW50UmVhZFdyaXRlRGF0YShsYW1iZGEpOyAvLyBBdmFpbGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFiYXNlRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBBdXJvcmFEYXRhYmFzZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gUmVsYXRpb25hbERhdGFiYXNlO1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSW5zdGFuY2VEYXRhYmFzZVByb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gUmVsYXRpb25hbERhdGFiYXNlO1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFJlbGF0aW9uYWxEYXRhYmFzZTtcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IER5bmFtb0RCRGF0YWJhc2VQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IER5bmFtb0RCRGF0YWJhc2U7XG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJRGF0YWJhc2VQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEFueURhdGFiYXNlIHtcbiAgICByZXR1cm4gKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KTogQW55RGF0YWJhc2UgPT4ge1xuICAgICAgdmFsaWRhdGVEYXRhYmFzZVByb3BzKHByb3BzKTtcblxuICAgICAgaWYgKHByb3BzLnR5cGUgPT09IFwiRHluYW1vREJcIikge1xuICAgICAgICByZXR1cm4gbmV3IER5bmFtb0RCRGF0YWJhc2Uoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFiYXNlUHJvcHM6IElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcyA9IHtcbiAgICAgICAgLi4ueyB2cGM6IGFwcC5nZXRWcGMoKSB9LFxuICAgICAgICAuLi5wcm9wc1xuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgUmVsYXRpb25hbERhdGFiYXNlKHNjb3BlLCBpZCwgZGF0YWJhc2VQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIER5bmFtb0RCIGRhdGFiYXNlIHdyYXBwZXIgaW1wbGVtZW50aW5nIElEeW5hbW9EQkRhdGFiYXNlIGludGVyZmFjZS5cbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBhY2Nlc3MgdG8gRHluYW1vREIgdGFibGUgb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgY2FjaGUgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiQ2FjaGVcIiwge1xuICogICB0eXBlOiBcIkR5bmFtb0RCXCIsXG4gKiAgIHBhcnRpdGlvbktleTogeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiU1wiIH1cbiAqIH0pKTtcbiAqIGNhY2hlLmdyYW50UmVhZFdyaXRlRGF0YShsYW1iZGEpO1xuICovXG5leHBvcnQgY2xhc3MgRHluYW1vREJEYXRhYmFzZVxuICBleHRlbmRzIENvbnN0cnVjdFxuICBpbXBsZW1lbnRzIElEeW5hbW9EQkRhdGFiYXNlLCBJRHluYW1vREJDb25uZWN0b3JcbntcbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlVHlwZSA9IFwiRHluYW1vREJcIiBhcyBjb25zdDtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RvclR5cGUgPSBcImR5bmFtb2RiXCIgYXMgY29uc3Q7XG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFibGU6IER5bmFtb0RCVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IER5bmFtb0RCRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgY29uc3QgdGFibGVQcm9wczogRHluYW1vREJUYWJsZVByb3BzID0ge1xuICAgICAgcGFydGl0aW9uS2V5OiBwcm9wcy5wYXJ0aXRpb25LZXksXG4gICAgICBzb3J0S2V5OiBwcm9wcy5zb3J0S2V5LFxuICAgICAgYmlsbGluZ01vZGU6IHByb3BzLmJpbGxpbmdNb2RlLFxuICAgICAgcmVhZENhcGFjaXR5OiBwcm9wcy5yZWFkQ2FwYWNpdHksXG4gICAgICB3cml0ZUNhcGFjaXR5OiBwcm9wcy53cml0ZUNhcGFjaXR5LFxuICAgICAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlczogcHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcyxcbiAgICAgIHRpbWVUb0xpdmVBdHRyaWJ1dGU6IHByb3BzLnRpbWVUb0xpdmVBdHRyaWJ1dGUsXG4gICAgICBzdHJlYW06IHByb3BzLnN0cmVhbSxcbiAgICAgIHBvaW50SW5UaW1lUmVjb3Zlcnk6IHByb3BzLnBvaW50SW5UaW1lUmVjb3ZlcnksXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeVxuICAgIH07XG4gICAgdGhpcy50YWJsZSA9IG5ldyBEeW5hbW9EQlRhYmxlKHRoaXMsIGlkLCB0YWJsZVByb3BzKTtcbiAgfVxuXG4gIGdldFRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdldFRhYmxlTmFtZSgpO1xuICB9XG5cbiAgZ2V0VGFibGVBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5nZXRUYWJsZUFybigpO1xuICB9XG5cbiAgZ2V0VGFibGUoKTogSVRhYmxlIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5nZXRUYWJsZSgpO1xuICB9XG5cbiAgZ2V0U3RyZWFtQXJuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ2V0VGFibGVTdHJlYW1Bcm4oKTtcbiAgfVxuXG4gIGdyYW50UmVhZERhdGEoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFJlYWQoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFdyaXRlRGF0YShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdyYW50V3JpdGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFJlYWRXcml0ZURhdGEoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFJlYWRXcml0ZShncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50RnVsbEFjY2VzcyhncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdyYW50RnVsbEFjY2VzcyhncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50U3RyZWFtUmVhZChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdyYW50U3RyZWFtUmVhZChncmFudGVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbGF0aW9uYWwgZGF0YWJhc2Ugd3JhcHBlciBpbXBsZW1lbnRpbmcgSVJlbGF0aW9uYWxEYXRhYmFzZSBpbnRlcmZhY2UuXG4gKiBTdXBwb3J0cyBBdXJvcmEsIFJEUyBJbnN0YW5jZSwgYW5kIEdsb2JhbEF1cm9yYSBkYXRhYmFzZSB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGIgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiTWFpblwiLCB7XG4gKiAgIHR5cGU6IFwiQXVyb3JhXCIsXG4gKiAgIGRhdGFiYXNlTmFtZTogXCJteV9hcHBcIlxuICogfSkpO1xuICogZGIuZ3JhbnRDb25uZWN0KGxhbWJkYSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBSZWxhdGlvbmFsRGF0YWJhc2VcbiAgZXh0ZW5kcyBDb25zdHJ1Y3RcbiAgaW1wbGVtZW50cyBJUmVsYXRpb25hbERhdGFiYXNlLCBJU2VjdXJpdHlHcm91cENvbm5lY3Rvclxue1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIHB1YmxpYyByZWFkb25seSB2cGM6IElWcGM7XG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZVR5cGU6IFJlbGF0aW9uYWxEYXRhYmFzZVR5cGU7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0b3JUeXBlID0gXCJyZWxhdGlvbmFsXCIgYXMgY29uc3Q7XG5cbiAgcHVibGljIGNvbm5lY3Rpb25zITogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgZGF0YWJhc2UhOiBSZHNBdXJvcmEgfCBSZHNJbnN0YW5jZSB8IFJkc0F1cm9yYUdsb2JhbDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMuZGF0YWJhc2VUeXBlID0gcHJvcHMudHlwZTtcbiAgICAvLyBWUEMgaXMgdmFsaWRhdGVkIGluIGFkZFh4eCBtZXRob2RzLCBzbyBhc3NlcnRpb24gaXMgc2FmZSBoZXJlXG4gICAgdGhpcy52cGMgPSBwcm9wcy52cGMhO1xuXG4gICAgdGhpcy5fZGF0YWJhc2VOYW1lID0gcHJvcHMuZGF0YWJhc2VOYW1lO1xuICAgIHRoaXMuYWRkRGF0YWJhc2UocHJvcHMpO1xuICB9XG5cbiAgYWRkRGF0YWJhc2UocHJvcHM6IElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcykge1xuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSBcIkF1cm9yYVwiOlxuICAgICAgICB0aGlzLmFkZEF1cm9yYShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkdsb2JhbEF1cm9yYVwiOlxuICAgICAgICB0aGlzLmFkZEF1cm9yYUdsb2JhbChwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkluc3RhbmNlXCI6XG4gICAgICAgIHRoaXMuYWRkUmRzSW5zdGFuY2UocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gcHJvcHM7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgZGF0YWJhc2UgdHlwZTogJHtTdHJpbmcoKF9leGhhdXN0aXZlIGFzIElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcykudHlwZSl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQXVyb3JhKHByb3BzOiBBdXJvcmFEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgQXVyb3JhIGRhdGFiYXNlXCIpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWREYXRhYmFzZUVuZ2luZSA9IHByb3BzLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiO1xuICAgIGNvbnN0IHJlc29sdmVkRW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSA/PyBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIGlmIChwcm9wcy5wdWJsaWNseUFjY2Vzc2libGUpIHtcbiAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgIGBBdXJvcmEgZGF0YWJhc2UgJyR7cHJvcHMuZGF0YWJhc2VOYW1lfScgaXMgY29uZmlndXJlZCB3aXRoIHB1YmxpYyBhY2Nlc3NpYmlsaXR5LiBgICtcbiAgICAgICAgICBcIlRoaXMgaXMgYSBzZWN1cml0eSByaXNrIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudC5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFJkc0F1cm9yYSh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmRzYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIGVuZ2luZTogcmVzb2x2ZWRFbmdpbmUsXG4gICAgICBlbmdpbmVDb25maWcsXG4gICAgICB3cml0ZXI6IHByb3BzLndyaXRlcixcbiAgICAgIHJlYWRlcnM6IHByb3BzLnJlYWRlcnMsXG4gICAgICBwcm94eTogcHJvcHMucHJveHksXG4gICAgICBjcmVkZW50aWFsczogcHJvcHMuY3JlZGVudGlhbHMsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgICAgYmFja3VwUmV0ZW50aW9uOiBwcm9wcy5iYWNrdXBSZXRlbnRpb24sXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCxcbiAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OiBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyxcbiAgICAgIHBvcnQ6IHByb3BzLnBvcnQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzOiBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzLFxuICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uOiBwcm9wcy5kZWxldGlvblByb3RlY3Rpb24sXG4gICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllcixcbiAgICAgIHNuYXBzaG90VXNlcm5hbWU6IHByb3BzLnNuYXBzaG90VXNlcm5hbWUsXG4gICAgICBhbGxvd1ZwY0FjY2VzczogcHJvcHMuYWxsb3dWcGNBY2Nlc3MsXG4gICAgICBwdWJsaWNseUFjY2Vzc2libGU6IHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZSxcbiAgICAgIGFsbG93ZWRJcENpZHI6IHByb3BzLmFsbG93ZWRJcENpZHJcbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9ucztcbiAgICB0aGlzLmFkZERhdGFiYXNlT3V0cHV0cyhwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEF1cm9yYUdsb2JhbChwcm9wczogR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wcykge1xuICAgIGlmICghcHJvcHMudnBjKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVlBDIGlzIHJlcXVpcmVkIGZvciBHbG9iYWwgQXVyb3JhIGRhdGFiYXNlXCIpO1xuICAgIGlmICghcHJvcHMucHJpbWFyeVJlZ2lvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInByaW1hcnlSZWdpb24gaXMgcmVxdWlyZWQgZm9yIEdsb2JhbCBBdXJvcmEgZGF0YWJhc2VcIik7XG5cbiAgICBjb25zdCByZXNvbHZlZERhdGFiYXNlRW5naW5lID0gcHJvcHMuZGF0YWJhc2VFbmdpbmUgPz8gXCJwb3N0Z3Jlc3FsXCI7XG4gICAgY29uc3QgcmVzb2x2ZWRFbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lID8/IGdldEF1cm9yYUNsdXN0ZXJFbmdpbmUocmVzb2x2ZWREYXRhYmFzZUVuZ2luZSk7XG4gICAgY29uc3QgZW5naW5lQ29uZmlnID0gZ2V0RW5naW5lQ29uZmlnKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuXG4gICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBSZHNBdXJvcmFHbG9iYWwoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJkc0dsb2JhbGAsXG4gICAgICB7XG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgcHJpbWFyeVJlZ2lvbjogcHJvcHMucHJpbWFyeVJlZ2lvbixcbiAgICAgICAgc2Vjb25kYXJ5UmVnaW9uczogcHJvcHMuc2Vjb25kYXJ5UmVnaW9ucyxcbiAgICAgICAgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXI6IHByb3BzLmdsb2JhbENsdXN0ZXJJZGVudGlmaWVyLFxuICAgICAgICBlbmdpbmU6IHJlc29sdmVkRW5naW5lLFxuICAgICAgICBlbmdpbmVDb25maWcsXG4gICAgICAgIGVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZzogcHJvcHMuZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nLFxuICAgICAgICB3cml0ZXI6IHByb3BzLndyaXRlcixcbiAgICAgICAgcmVhZGVyczogcHJvcHMucmVhZGVycyxcbiAgICAgICAgcHJveHk6IHByb3BzLnByb3h5LFxuICAgICAgICBjcmVkZW50aWFsczogcHJvcHMuY3JlZGVudGlhbHMsXG4gICAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgICAgIGJhY2t1cFJldGVudGlvbjogcHJvcHMuYmFja3VwUmV0ZW50aW9uLFxuICAgICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCxcbiAgICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93LFxuICAgICAgICBwb3J0OiBwcm9wcy5wb3J0LFxuICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRzOiBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzLFxuICAgICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb3BzLmRlbGV0aW9uUHJvdGVjdGlvbixcbiAgICAgICAgc25hcHNob3RJZGVudGlmaWVyOiBwcm9wcy5zbmFwc2hvdElkZW50aWZpZXIsXG4gICAgICAgIHNuYXBzaG90VXNlcm5hbWU6IHByb3BzLnNuYXBzaG90VXNlcm5hbWVcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICAgIHRoaXMuYWRkRGF0YWJhc2VPdXRwdXRzKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmRzSW5zdGFuY2UocHJvcHM6IEluc3RhbmNlRGF0YWJhc2VQcm9wcykge1xuICAgIGlmICghcHJvcHMudnBjKSB0aHJvdyBuZXcgRXJyb3IoXCJWUEMgaXMgcmVxdWlyZWQgZm9yIEluc3RhbmNlIGRhdGFiYXNlXCIpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWREYXRhYmFzZUVuZ2luZSA9IHByb3BzLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiO1xuICAgIGNvbnN0IHJlc29sdmVkRW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSA/PyBnZXRJbnN0YW5jZUVuZ2luZShyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcbiAgICBjb25zdCBlbmdpbmVDb25maWcgPSBnZXRFbmdpbmVDb25maWcocmVzb2x2ZWREYXRhYmFzZUVuZ2luZSk7XG5cbiAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFJkc0luc3RhbmNlKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGUsXG4gICAgICBhbGxvY2F0ZWRTdG9yYWdlOiBwcm9wcy5hbGxvY2F0ZWRTdG9yYWdlLFxuICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgIGVuZ2luZTogcmVzb2x2ZWRFbmdpbmUsXG4gICAgICBlbmdpbmVDb25maWcsXG4gICAgICBtdWx0aUF6OiBwcm9wcy5tdWx0aUF6LFxuICAgICAgYmFja3VwUmV0ZW50aW9uOlxuICAgICAgICBwcm9wcy5iYWNrdXBSZXRlbnRpb24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gRHVyYXRpb24uZGF5cyhwcm9wcy5iYWNrdXBSZXRlbnRpb24pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzOiBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzLFxuICAgICAgcHJveHk6IHByb3BzLnByb3h5LFxuICAgICAgcmVhZFJlcGxpY2E6IHByb3BzLnJlYWRSZXBsaWNhLFxuICAgICAgY3JlZGVudGlhbHM6IHByb3BzLmNyZWRlbnRpYWxzLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlLFxuICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uOiBwcm9wcy5kZWxldGlvblByb3RlY3Rpb24sXG4gICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllcixcbiAgICAgIHNuYXBzaG90VXNlcm5hbWU6IHByb3BzLnNuYXBzaG90VXNlcm5hbWVcbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9ucztcbiAgICB0aGlzLmFkZERhdGFiYXNlT3V0cHV0cyhwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZERhdGFiYXNlT3V0cHV0cyhwcm9wczogSVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmRhdGFiYXNlLmdldEhvc3RFbmRwb2ludCgpO1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcbiAgICAvLyBTYW5pdGlzZSBmb3IgQ2ZuT3V0cHV0IG5hbWVzIOKAlCBDbG91ZEZvcm1hdGlvbiBleHBvcnQgbmFtZXMgb25seSBhbGxvdyBbYS16QS1aMC05Oi1dXG4gICAgY29uc3Qgb3V0cHV0TmFtZSA9IHRvUGFzY2FsQ2FzZShwcm9wcy5kYXRhYmFzZU5hbWUpO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtvdXRwdXROYW1lfUVuZHBvaW50YCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfUVuZHBvaW50YCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke291dHB1dE5hbWV9RW5kcG9pbnRgLFxuICAgICAgdmFsdWU6IGVuZHBvaW50LFxuICAgICAgZGVzY3JpcHRpb246IGBEYXRhYmFzZSBFbmRwb2ludCBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtvdXRwdXROYW1lfVBvcnRgLCB7XG4gICAgICBrZXk6IGAke3N0YWNrTmFtZX0ke291dHB1dE5hbWV9UG9ydGAsXG4gICAgICBleHBvcnROYW1lOiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfVBvcnRgLFxuICAgICAgdmFsdWU6IHRoaXMuZGF0YWJhc2UuZ2V0SG9zdFBvcnQoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgRGF0YWJhc2UgUG9ydCBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtvdXRwdXROYW1lfURhdGFiYXNlTmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7b3V0cHV0TmFtZX1EYXRhYmFzZU5hbWVgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfSR7b3V0cHV0TmFtZX1EYXRhYmFzZU5hbWVgLFxuICAgICAgdmFsdWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgRGF0YWJhc2UgTmFtZSBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgIH0pO1xuXG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSB0aGlzLmRhdGFiYXNlLmdldENyZWRlbnRpYWxzKCk7XG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtvdXRwdXROYW1lfVNlY3JldEFybmAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7b3V0cHV0TmFtZX1TZWNyZXRBcm5gLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfSR7b3V0cHV0TmFtZX1TZWNyZXRBcm5gLFxuICAgICAgdmFsdWU6IGNyZWRlbnRpYWxzLnNlY3JldC5zZWNyZXRBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYERhdGFiYXNlIENyZWRlbnRpYWxzIFNlY3JldCBBUk4gZm9yICR7cHJvcHMuZGF0YWJhc2VOYW1lfWBcbiAgICB9KTtcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldEhvc3RFbmRwb2ludCgpO1xuICB9XG5cbiAgZ2V0SG9zdFBvcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRIb3N0UG9ydCgpO1xuICB9XG5cbiAgZ2V0RGF0YWJhc2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBjb25uZWN0IHBlcm1pc3Npb25zIHRvIGEgZ3JhbnRlZSBieSBhZGRpbmcgaXQgdG8gdGhlIGRhdGFiYXNlIHNlY3VyaXR5IGdyb3VwLlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgY29ubmVjdGFibGUgcHJpbmNpcGFsIHRvIGdyYW50IGNvbm5lY3QgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIGdyYW50Q29ubmVjdChncmFudGVlOiBJQ29ubmVjdGFibGUpOiB2b2lkIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKGdyYW50ZWUpO1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCBEeW5hbW9EQiB0eXBlcyBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHtcbiAgRHluYW1vREJLZXlTY2hlbWEsXG4gIER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXgsXG4gIER5bmFtb0RCVGFibGVQcm9wc1xufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9keW5hbW9kYlwiO1xuXG4vLyBSZS1leHBvcnQgaW50ZXJmYWNlIHR5cGVzXG5leHBvcnQge1xuICB0eXBlIElSZWxhdGlvbmFsRGF0YWJhc2UsXG4gIHR5cGUgSUR5bmFtb0RCRGF0YWJhc2UsXG4gIHR5cGUgQW55RGF0YWJhc2UsXG4gIHR5cGUgRGF0YWJhc2VUeXBlLFxuICB0eXBlIFJlbGF0aW9uYWxEYXRhYmFzZVR5cGUsXG4gIGlzUmVsYXRpb25hbERhdGFiYXNlLFxuICBpc0R5bmFtb0RCRGF0YWJhc2UsXG4gIGlzQXVyb3JhRGF0YWJhc2UsXG4gIGlzSW5zdGFuY2VEYXRhYmFzZSxcbiAgaXNHbG9iYWxBdXJvcmFEYXRhYmFzZVxufSBmcm9tIFwiLi9pbnRlcmZhY2VzL2RhdGFiYXNlLmpzXCI7XG4iXX0=
|
|
438
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRJQSx3REFFQztBQUVELDhDQUVDO0FBRUQsMENBT0M7QUEzSkQsMkNBQXVDO0FBQ3ZDLDZDQUErQztBQUcvQywyREFBc0U7QUFDdEUsa0ZBQStFO0FBQy9FLG9FQUsrQztBQUMvQyx5RUFHeUM7QUFDekMseUVBQStEO0FBb0IvRCxpREFTNkI7QUFDN0IsNkNBQXVDO0FBZXZDLDJEQWtCbUM7QUFKakMsZ0hBQUEsZUFBZSxPQUFBO0FBQ2YsK0dBQUEsY0FBYyxPQUFBO0FBQ2QsNEdBQUEsV0FBVyxPQUFBO0FBQ1gsd0dBQUEsT0FBTyxPQUFBO0FBR0ksUUFBQSxzQkFBc0IsR0FTL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixVQUFVLEVBQUU7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUU7UUFDL0MsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSxVQUFVO1FBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDdkMsZUFBZSxFQUFFLDhDQUE4QztLQUNoRTtJQUNELEtBQUssRUFBRTtRQUNMLHdFQUF3RTtRQUN4RSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtRQUN0RSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7UUFDbkQsZUFBZSxFQUFFLE9BQU87UUFDeEIsYUFBYSxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSx5Q0FBeUM7S0FDM0Q7Q0FD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QUFDO0lBQ2pELENBQUM7Q0FDRjtBQWxPRCxnREFrT0M7QUFTRCw0QkFBNEI7QUFDNUIsd0RBV2tDO0FBTGhDLG1IQUFBLG9CQUFvQixPQUFBO0FBQ3BCLGlIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLGlIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHFIQUFBLHNCQUFzQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENmbk91dHB1dCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IFJkc0F1cm9yYSwgUmRzSW5zdGFuY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9kYXRhYmFzZVwiO1xuaW1wb3J0IHsgUmRzQXVyb3JhR2xvYmFsIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhR2xvYmFsXCI7XG5pbXBvcnQge1xuICBEeW5hbW9EQlRhYmxlLFxuICB0eXBlIER5bmFtb0RCS2V5U2NoZW1hLFxuICB0eXBlIER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXgsXG4gIHR5cGUgRHluYW1vREJUYWJsZVByb3BzXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL2R5bmFtb2RiXCI7XG5pbXBvcnQge1xuICBGamFsbExvZ2dlcixcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWRcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCIuLi8uLi91dGlscy9jYXBpdGFsaXNlU3RyaW5nLmpzXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElWcGNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IHR5cGUgSVRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5pbXBvcnQgeyB0eXBlIElHcmFudGFibGUsIHR5cGUgR3JhbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBJUmVsYXRpb25hbERhdGFiYXNlLFxuICB0eXBlIElEeW5hbW9EQkRhdGFiYXNlLFxuICB0eXBlIEFueURhdGFiYXNlLFxuICB0eXBlIFJlbGF0aW9uYWxEYXRhYmFzZVR5cGVcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9kYXRhYmFzZS5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBJRHluYW1vREJDb25uZWN0b3IsXG4gIHR5cGUgSVNlY3VyaXR5R3JvdXBDb25uZWN0b3Jcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9jb25uZWN0b3IuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgSUluc3RhbmNlRW5naW5lLFxuICB0eXBlIElDbHVzdGVyRW5naW5lLFxuICBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUsXG4gIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUsXG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQXVyb3JhTXlzcWxFbmdpbmVWZXJzaW9uLFxuICBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24sXG4gIE15c3FsRW5naW5lVmVyc2lvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGF0YWJhc2VFbmdpbmUsXG4gIHR5cGUgRW5naW5lQ29uZmlnLFxuICB0eXBlIFByb3h5Q29uZmlnLFxuICB0eXBlIFJlYWRSZXBsaWNhQ29uZmlnLFxuICB0eXBlIENyZWRlbnRpYWxzQ29uZmlnLFxuICB0eXBlIEVuY3J5cHRpb25Db25maWcsXG4gIHR5cGUgRGF0YWJhc2VJbnNpZ2h0c0NvbmZpZyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVdyaXRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFSZWFkZXJzQ29uZmlnXG59IGZyb20gXCIuLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIHsgRGF0YWJhc2VFbmdpbmUsIEVuZ2luZUNvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5leHBvcnQge1xuICB0eXBlIFByb3h5Q29uZmlnLFxuICB0eXBlIFJlYWRSZXBsaWNhQ29uZmlnLFxuICB0eXBlIENyZWRlbnRpYWxzQ29uZmlnLFxuICB0eXBlIFNlY3JldFJvdGF0aW9uQ29uZmlnLFxuICB0eXBlIEVuY3J5cHRpb25Db25maWcsXG4gIHR5cGUgRGF0YWJhc2VJbnNpZ2h0c0NvbmZpZyxcbiAgdHlwZSBBd3NNYW5hZ2VkS2V5LFxuICB0eXBlIEN1c3RvbWVyTWFuYWdlZEtleU1hcmtlcixcbiAgdHlwZSBFbmNyeXB0aW9uS2V5U3BlYyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVJlYWRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFXcml0ZXJDb25maWcsXG4gIHR5cGUgQXVyb3JhUmVhZGVyc0NvbmZpZyxcbiAgaXNBd3NNYW5hZ2VkS2V5LFxuICBpc0NNS1JlcXVlc3RlZCxcbiAgQVdTX01BTkFHRUQsXG4gIFVTRV9DTUtcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFiYXNlVHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERBVEFCQVNFX0VOR0lORV9DT05GSUc6IFJlY29yZDxcbiAgRGF0YWJhc2VFbmdpbmUsXG4gIHtcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogc3RyaW5nOyBtYWpvclZlcnNpb246IHN0cmluZyB9O1xuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IHN0cmluZzsgbWFqb3JWZXJzaW9uOiBzdHJpbmcgfTtcbiAgICBkZWZhdWx0VXNlcm5hbWU6IHN0cmluZztcbiAgICBzc2xQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHJvdGF0aW9uQXBwTmFtZTogc3RyaW5nO1xuICB9XG4+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIHBvc3RncmVzcWw6IHtcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogXCIxNi42XCIsIG1ham9yVmVyc2lvbjogXCIxNlwiIH0sXG4gICAgaW5zdGFuY2U6IHsgdmVyc2lvbjogXCIxNy41XCIsIG1ham9yVmVyc2lvbjogXCIxN1wiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcInBvc3RncmVzXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICByb3RhdGlvbkFwcE5hbWU6IFwiU2VjcmV0c01hbmFnZXJSRFNQb3N0Z3JlU1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9LFxuICBteXNxbDoge1xuICAgIC8vIG1ham9yVmVyc2lvbiBtdXN0IGJlIEF1cm9yYSB2ZXJzaW9uICgzLjA4LjApLCBOT1QgTXlTUUwgdmVyc2lvbiAoOC4wKVxuICAgIGF1cm9yYTogeyB2ZXJzaW9uOiBcIjguMC5teXNxbF9hdXJvcmEuMy4wOC4wXCIsIG1ham9yVmVyc2lvbjogXCIzLjA4LjBcIiB9LFxuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IFwiOC40LjRcIiwgbWFqb3JWZXJzaW9uOiBcIjguNFwiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcImFkbWluXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyByZXF1aXJlX3NlY3VyZV90cmFuc3BvcnQ6IFwiT05cIiB9LFxuICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU015U1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9XG59KTtcblxuY29uc3QgQVVST1JBX0VOR0lORV9GQUNUT1JJRVM6IFJlY29yZDxEYXRhYmFzZUVuZ2luZSwgKCkgPT4gSUNsdXN0ZXJFbmdpbmU+ID0ge1xuICBwb3N0Z3Jlc3FsOiAoKSA9PiB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcucG9zdGdyZXNxbC5hdXJvcmE7XG4gICAgcmV0dXJuIERhdGFiYXNlQ2x1c3RlckVuZ2luZS5hdXJvcmFQb3N0Z3Jlcyh7XG4gICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24ub2YodmVyc2lvbiwgbWFqb3JWZXJzaW9uKVxuICAgIH0pO1xuICB9LFxuICBteXNxbDogKCkgPT4ge1xuICAgIGNvbnN0IHsgdmVyc2lvbiwgbWFqb3JWZXJzaW9uIH0gPSBEQVRBQkFTRV9FTkdJTkVfQ09ORklHLm15c3FsLmF1cm9yYTtcbiAgICByZXR1cm4gRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYU15c3FsKHtcbiAgICAgIHZlcnNpb246IEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgfSk7XG4gIH1cbn07XG5cbmNvbnN0IElOU1RBTkNFX0VOR0lORV9GQUNUT1JJRVM6IFJlY29yZDxEYXRhYmFzZUVuZ2luZSwgKCkgPT4gSUluc3RhbmNlRW5naW5lPiA9XG4gIHtcbiAgICBwb3N0Z3Jlc3FsOiAoKSA9PiB7XG4gICAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID1cbiAgICAgICAgREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5wb3N0Z3Jlc3FsLmluc3RhbmNlO1xuICAgICAgcmV0dXJuIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUucG9zdGdyZXMoe1xuICAgICAgICB2ZXJzaW9uOiBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24ub2YodmVyc2lvbiwgbWFqb3JWZXJzaW9uKVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBteXNxbDogKCkgPT4ge1xuICAgICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcubXlzcWwuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gRGF0YWJhc2VJbnN0YW5jZUVuZ2luZS5teXNxbCh7XG4gICAgICAgIHZlcnNpb246IE15c3FsRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBJQ2x1c3RlckVuZ2luZSB7XG4gIHJldHVybiBBVVJPUkFfRU5HSU5FX0ZBQ1RPUklFU1tlbmdpbmVdKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YW5jZUVuZ2luZShlbmdpbmU6IERhdGFiYXNlRW5naW5lKTogSUluc3RhbmNlRW5naW5lIHtcbiAgcmV0dXJuIElOU1RBTkNFX0VOR0lORV9GQUNUT1JJRVNbZW5naW5lXSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5naW5lQ29uZmlnKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBFbmdpbmVDb25maWcge1xuICBjb25zdCBjb25maWcgPSBEQVRBQkFTRV9FTkdJTkVfQ09ORklHW2VuZ2luZV07XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdFVzZXJuYW1lOiBjb25maWcuZGVmYXVsdFVzZXJuYW1lLFxuICAgIHNzbFBhcmFtZXRlcnM6IGNvbmZpZy5zc2xQYXJhbWV0ZXJzLFxuICAgIHJvdGF0aW9uQXBwTmFtZTogY29uZmlnLnJvdGF0aW9uQXBwTmFtZVxuICB9O1xufVxuXG4vKipcbiAqIEJhc2UgcHJvcHMgZm9yIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbnR5cGUgQmFzZURhdGFiYXNlUHJvcHMgPSB7XG4gIHZwYz86IElWcGM7XG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIGRlbGV0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYURhdGFiYXNlUHJvcHMgZXh0ZW5kcyBCYXNlRGF0YWJhc2VQcm9wcyB7XG4gIHR5cGU6IFwiQXVyb3JhXCI7XG4gIGRhdGFiYXNlRW5naW5lPzogRGF0YWJhc2VFbmdpbmU7XG4gIC8qKiBPdmVycmlkZXMgZGF0YWJhc2VFbmdpbmUgaWYgcHJvdmlkZWQgKi9cbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICAvKiogREVTVFJVQ1RJVkU6IENoYW5naW5nIHN0b3JhZ2VLZXkgY2F1c2VzIGNsdXN0ZXIgcmVwbGFjZW1lbnQgKi9cbiAgZW5jcnlwdGlvbj86IEF1cm9yYUVuY3J5cHRpb25Db25maWc7XG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBkYXRhYmFzZUluc2lnaHRzPzogRGF0YWJhc2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgY2x1c3RlciBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xuICAvKiogVXNlcm5hbWUgZnJvbSB0aGUgc25hcHNob3QgKHJlcXVpcmVkIHdoZW4gcmVzdG9yaW5nIGZyb20gc25hcHNob3QgdG8gcmVzZXQgcGFzc3dvcmQpICovXG4gIHNuYXBzaG90VXNlcm5hbWU/OiBzdHJpbmc7XG4gIC8qKiBBbGxvdyBhY2Nlc3MgZnJvbSBWUEMgQ0lEUiAoYXZvaWRzIGNyb3NzLXN0YWNrIGN5Y2xpYyBkZXBlbmRlbmNpZXMgd2l0aCBMYW1iZGEpICovXG4gIGFsbG93VnBjQWNjZXNzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1ha2UgZGF0YWJhc2UgcHVibGljbHkgYWNjZXNzaWJsZSBmcm9tIHRoZSBpbnRlcm5ldC5cbiAgICogV0FSTklORzogVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2sgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRldmVsb3BtZW50XG4gICAqIG9yIHdoZW4gYnVpbGRpbmcgUGF5bG9hZCBhcHBzIGxvY2FsbHkgdGhhdCBuZWVkIGRhdGFiYXNlIGFjY2Vzcy5cbiAgICogV2hlbiBlbmFibGVkLCB0aGUgZGF0YWJhc2UgaXMgcGxhY2VkIGluIHB1YmxpYyBzdWJuZXRzLlxuICAgKi9cbiAgcHVibGljbHlBY2Nlc3NpYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElQIGFkZHJlc3MgdG8gYWxsb3cgYWNjZXNzIGZyb20gd2hlbiBwdWJsaWNseUFjY2Vzc2libGUgaXMgdHJ1ZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgYWNjZXNzIGlzIHJlc3RyaWN0ZWQgdG8gVlBDIG9ubHkgZXZlbiB3aGVuIHB1YmxpYy5cbiAgICogRm9ybWF0OiBDSURSIG5vdGF0aW9uIChlLmcuLCBcIjIwMy4wLjExMy4wLzMyXCIgZm9yIHNpbmdsZSBJUClcbiAgICovXG4gIGFsbG93ZWRJcENpZHI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJHbG9iYWxBdXJvcmFcIjtcbiAgcHJpbWFyeVJlZ2lvbjogc3RyaW5nO1xuICBzZWNvbmRhcnlSZWdpb25zPzogc3RyaW5nW107XG4gIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyPzogc3RyaW5nO1xuICBlbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmc/OiBib29sZWFuO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICB3cml0ZXI/OiBBdXJvcmFXcml0ZXJDb25maWc7XG4gIHJlYWRlcnM/OiBBdXJvcmFSZWFkZXJzQ29uZmlnIHwgZmFsc2U7XG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgLyoqIERFU1RSVUNUSVZFOiBDaGFuZ2luZyBzdG9yYWdlS2V5IGNhdXNlcyBjbHVzdGVyIHJlcGxhY2VtZW50ICovXG4gIGVuY3J5cHRpb24/OiBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuICBiYWNrdXBSZXRlbnRpb24/OiBudW1iZXI7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgZGF0YWJhc2VJbnNpZ2h0cz86IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGNsdXN0ZXIgc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJJbnN0YW5jZVwiO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElJbnN0YW5jZUVuZ2luZTtcbiAgYWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgcG9ydD86IG51bWJlcjtcbiAgbXVsdGlBej86IGJvb2xlYW47XG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgZGF0YWJhc2VJbnNpZ2h0cz86IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICByZWFkUmVwbGljYT86IFJlYWRSZXBsaWNhQ29uZmlnIHwgZmFsc2U7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uQ29uZmlnO1xuICBwdWJsaWNseUFjY2Vzc2libGU/OiBib29sZWFuO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgaW5zdGFuY2Ugc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIER5bmFtb0RCIHRhYmxlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbW9EQkRhdGFiYXNlUHJvcHMge1xuICB0eXBlOiBcIkR5bmFtb0RCXCI7XG4gIHBhcnRpdGlvbktleTogRHluYW1vREJLZXlTY2hlbWE7XG4gIHNvcnRLZXk/OiBEeW5hbW9EQktleVNjaGVtYTtcbiAgYmlsbGluZ01vZGU/OiBcIlBBWV9QRVJfUkVRVUVTVFwiIHwgXCJQUk9WSVNJT05FRFwiO1xuICByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gIHdyaXRlQ2FwYWNpdHk/OiBudW1iZXI7XG4gIGdsb2JhbFNlY29uZGFyeUluZGV4ZXM/OiBEeW5hbW9EQkdsb2JhbFNlY29uZGFyeUluZGV4W107XG4gIHRpbWVUb0xpdmVBdHRyaWJ1dGU/OiBzdHJpbmc7XG4gIHN0cmVhbT86IFwiTkVXX0lNQUdFXCIgfCBcIk9MRF9JTUFHRVwiIHwgXCJORVdfQU5EX09MRF9JTUFHRVNcIiB8IFwiS0VZU19PTkxZXCI7XG4gIHBvaW50SW5UaW1lUmVjb3Zlcnk/OiBib29sZWFuO1xuICBlbmNyeXB0aW9uPzogXCJBV1NfT1dORURcIiB8IFwiQVdTX01BTkFHRURcIiB8IFwiQ1VTVE9NRVJfTUFOQUdFRFwiO1xuICByZW1vdmFsUG9saWN5PzogXCJERVNUUk9ZXCIgfCBcIlJFVEFJTlwiIHwgXCJTTkFQU0hPVFwiO1xufVxuXG4vKipcbiAqIFJlbGF0aW9uYWwgZGF0YWJhc2UgcHJvcHMgdW5pb24gKEF1cm9yYSwgSW5zdGFuY2UsIEdsb2JhbEF1cm9yYSkuXG4gKi9cbmV4cG9ydCB0eXBlIElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcyA9XG4gIHwgQXVyb3JhRGF0YWJhc2VQcm9wc1xuICB8IEluc3RhbmNlRGF0YWJhc2VQcm9wc1xuICB8IEdsb2JhbEF1cm9yYURhdGFiYXNlUHJvcHM7XG5cbi8qKlxuICogQWxsIGRhdGFiYXNlIHByb3BzIHVuaW9uLlxuICovXG5leHBvcnQgdHlwZSBJRGF0YWJhc2VQcm9wcyA9XG4gIHwgQXVyb3JhRGF0YWJhc2VQcm9wc1xuICB8IEluc3RhbmNlRGF0YWJhc2VQcm9wc1xuICB8IEdsb2JhbEF1cm9yYURhdGFiYXNlUHJvcHNcbiAgfCBEeW5hbW9EQkRhdGFiYXNlUHJvcHM7XG5cbi8qKlxuICogVmFsaWRhdGVzIER5bmFtb0RCIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRHluYW1vREJQcm9wcyhwcm9wczogRHluYW1vREJEYXRhYmFzZVByb3BzKTogdm9pZCB7XG4gIC8vIFZhbGlkYXRlIHByb3Zpc2lvbmVkIGNhcGFjaXR5XG4gIGlmIChwcm9wcy5iaWxsaW5nTW9kZSA9PT0gXCJQUk9WSVNJT05FRFwiKSB7XG4gICAgaWYgKCFwcm9wcy5yZWFkQ2FwYWNpdHkgfHwgIXByb3BzLndyaXRlQ2FwYWNpdHkpIHtcbiAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgIFwiJ2JpbGxpbmdNb2RlJyBpcyBQUk9WSVNJT05FRCBidXQgY2FwYWNpdHkgbm90IHNwZWNpZmllZC4gXCIgK1xuICAgICAgICAgIFwiVXNpbmcgZGVmYXVsdCB2YWx1ZXMuIENvbnNpZGVyIHNwZWNpZnlpbmcgJ3JlYWRDYXBhY2l0eScgYW5kICd3cml0ZUNhcGFjaXR5Jy5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBXYXJuIGFib3V0IGNhcGFjaXR5IHdpdGggb24tZGVtYW5kIGJpbGxpbmdcbiAgaWYgKHByb3BzLmJpbGxpbmdNb2RlICE9PSBcIlBST1ZJU0lPTkVEXCIpIHtcbiAgICBpZiAocHJvcHMucmVhZENhcGFjaXR5IHx8IHByb3BzLndyaXRlQ2FwYWNpdHkpIHtcbiAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgIFwiJ3JlYWRDYXBhY2l0eScgb3IgJ3dyaXRlQ2FwYWNpdHknIHNwZWNpZmllZCBidXQgJ2JpbGxpbmdNb2RlJyBcIiArXG4gICAgICAgICAgXCJpcyBub3QgUFJPVklTSU9ORUQuIENhcGFjaXR5IHNldHRpbmdzIHdpbGwgYmUgaWdub3JlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBHU0kgcGFydGl0aW9uIGtleXMgYXJlIGRpZmZlcmVudCBmcm9tIHRhYmxlIHBhcnRpdGlvbiBrZXlcbiAgaWYgKHByb3BzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXMpIHtcbiAgICBjb25zdCB0YWJsZVBhcnRpdGlvbktleSA9IHByb3BzLnBhcnRpdGlvbktleS5uYW1lO1xuICAgIGZvciAoY29uc3QgZ3NpIG9mIHByb3BzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZ3NpLnBhcnRpdGlvbktleS5uYW1lID09PSB0YWJsZVBhcnRpdGlvbktleSAmJlxuICAgICAgICBnc2kuc29ydEtleT8ubmFtZSA9PT0gcHJvcHMuc29ydEtleT8ubmFtZVxuICAgICAgKSB7XG4gICAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEdTSSAnJHtnc2kuaW5kZXhOYW1lfScgaGFzIHRoZSBzYW1lIGtleSBzY2hlbWEgYXMgdGhlIHRhYmxlLiBgICtcbiAgICAgICAgICAgIFwiVGhpcyBtYXkgbm90IHByb3ZpZGUgdGhlIHF1ZXJ5IGZsZXhpYmlsaXR5IHlvdSBuZWVkLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHJlbGF0aW9uYWwgZGF0YWJhc2UgcHJvcHMgYW5kIGxvZ3Mgd2FybmluZ3MgZm9yIGlnbm9yZWQgb3IgbWlzY29uZmlndXJlZCBvcHRpb25zLlxuICogVGhlc2UgY2hlY2tzIGhlbHAgY2F0Y2ggaXNzdWVzIHdoZW4gcHJvcHMgY29tZSBmcm9tIGR5bmFtaWMgc291cmNlcyB3aGVyZVxuICogVHlwZVNjcmlwdCdzIGNvbXBpbGUtdGltZSBjaGVja3MgbWF5IG5vdCBhcHBseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcyhcbiAgcHJvcHM6IElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wc1xuKTogdm9pZCB7XG4gIC8vIEdsb2JhbEF1cm9yYSByZXF1aXJlcyBwcmltYXJ5UmVnaW9uXG4gIGlmIChwcm9wcy50eXBlID09PSBcIkdsb2JhbEF1cm9yYVwiICYmICFwcm9wcy5wcmltYXJ5UmVnaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJHbG9iYWxBdXJvcmEgZGF0YWJhc2UgcmVxdWlyZXMgJ3ByaW1hcnlSZWdpb24nLiBcIiArXG4gICAgICAgIFwiU3BlY2lmeSB0aGUgQVdTIHJlZ2lvbiB3aGVyZSB0aGUgcHJpbWFyeSBjbHVzdGVyIHdpbGwgYmUgY3JlYXRlZC5cIlxuICAgICk7XG4gIH1cblxuICAvLyBJbnN0YW5jZS1vbmx5IG9wdGlvbnMgb24gQXVyb3JhL0dsb2JhbEF1cm9yYVxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wcyxcbiAgICBbXCJyZWFkUmVwbGljYVwiLCBcIm11bHRpQXpcIiwgXCJhbGxvY2F0ZWRTdG9yYWdlXCJdLFxuICAgIFwiSW5zdGFuY2VcIixcbiAgICBcIkluc3RhbmNlIGRhdGFiYXNlXCJcbiAgKTtcblxuICAvLyBBdXJvcmEtb25seSBvcHRpb25zIG9uIEluc3RhbmNlXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcInJlYWRlcnNcIiwgXCJ3cml0ZXJcIiwgXCJiYWNrdXBSZXRlbnRpb25cIl0sXG4gICAgW1wiQXVyb3JhXCIsIFwiR2xvYmFsQXVyb3JhXCJdLFxuICAgIFwiQXVyb3JhIGRhdGFiYXNlXCJcbiAgKTtcblxuICAvLyBHbG9iYWxBdXJvcmEtb25seSBvcHRpb25zIG9uIG5vbi1nbG9iYWwgZGF0YWJhc2VzXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcInByaW1hcnlSZWdpb25cIiwgXCJzZWNvbmRhcnlSZWdpb25zXCIsIFwiZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nXCJdLFxuICAgIFwiR2xvYmFsQXVyb3JhXCIsXG4gICAgXCJHbG9iYWxBdXJvcmEgZGF0YWJhc2VcIlxuICApO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBkYXRhYmFzZSBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgaWdub3JlZCBvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKiBEaXNwYXRjaGVzIHRvIHR5cGUtc3BlY2lmaWMgdmFsaWRhdG9ycyBiYXNlZCBvbiB0aGUgZGF0YWJhc2UgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEYXRhYmFzZVByb3BzKHByb3BzOiBJRGF0YWJhc2VQcm9wcyk6IHZvaWQge1xuICBpZiAocHJvcHMudHlwZSA9PT0gXCJEeW5hbW9EQlwiKSB7XG4gICAgdmFsaWRhdGVEeW5hbW9EQlByb3BzKHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKHByb3BzKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHR5cGUtc2FmZSBkYXRhYmFzZSByZXNvdXJjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEF1cm9yYSBkYXRhYmFzZSAtIHJldHVybnMgUmVsYXRpb25hbERhdGFiYXNlXG4gKiBjb25zdCBhdXJvcmEgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiTWFpblwiLCB7XG4gKiAgIHR5cGU6IFwiQXVyb3JhXCIsXG4gKiAgIGRhdGFiYXNlTmFtZTogXCJteV9hcHBcIlxuICogfSkpO1xuICogYXVyb3JhLmdldEhvc3RFbmRwb2ludCgpOyAvLyBBdmFpbGFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRHluYW1vREIgdGFibGUgLSByZXR1cm5zIER5bmFtb0RCRGF0YWJhc2VcbiAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAqICAgdHlwZTogXCJEeW5hbW9EQlwiLFxuICogICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIlNcIiB9XG4gKiB9KSk7XG4gKiBjYWNoZS5nZXRUYWJsZU5hbWUoKTsgLy8gQXZhaWxhYmxlXG4gKiBjYWNoZS5ncmFudFJlYWRXcml0ZURhdGEobGFtYmRhKTsgLy8gQXZhaWxhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXVyb3JhRGF0YWJhc2VQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFJlbGF0aW9uYWxEYXRhYmFzZTtcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEluc3RhbmNlRGF0YWJhc2VQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFJlbGF0aW9uYWxEYXRhYmFzZTtcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEdsb2JhbEF1cm9yYURhdGFiYXNlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBSZWxhdGlvbmFsRGF0YWJhc2U7XG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBEeW5hbW9EQkRhdGFiYXNlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBEeW5hbW9EQkRhdGFiYXNlO1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSURhdGFiYXNlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBBbnlEYXRhYmFzZSB7XG4gICAgcmV0dXJuIChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCk6IEFueURhdGFiYXNlID0+IHtcbiAgICAgIHZhbGlkYXRlRGF0YWJhc2VQcm9wcyhwcm9wcyk7XG5cbiAgICAgIGlmIChwcm9wcy50eXBlID09PSBcIkR5bmFtb0RCXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEeW5hbW9EQkRhdGFiYXNlKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhYmFzZVByb3BzOiBJUmVsYXRpb25hbERhdGFiYXNlUHJvcHMgPSB7XG4gICAgICAgIC4uLnsgdnBjOiBhcHAuZ2V0VnBjKCkgfSxcbiAgICAgICAgLi4ucHJvcHNcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IFJlbGF0aW9uYWxEYXRhYmFzZShzY29wZSwgaWQsIGRhdGFiYXNlUHJvcHMpO1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBEeW5hbW9EQiBkYXRhYmFzZSB3cmFwcGVyIGltcGxlbWVudGluZyBJRHluYW1vREJEYXRhYmFzZSBpbnRlcmZhY2UuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIER5bmFtb0RCIHRhYmxlIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAqICAgdHlwZTogXCJEeW5hbW9EQlwiLFxuICogICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIlNcIiB9XG4gKiB9KSk7XG4gKiBjYWNoZS5ncmFudFJlYWRXcml0ZURhdGEobGFtYmRhKTtcbiAqL1xuZXhwb3J0IGNsYXNzIER5bmFtb0RCRGF0YWJhc2VcbiAgZXh0ZW5kcyBDb25zdHJ1Y3RcbiAgaW1wbGVtZW50cyBJRHluYW1vREJEYXRhYmFzZSwgSUR5bmFtb0RCQ29ubmVjdG9yXG57XG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZVR5cGUgPSBcIkR5bmFtb0RCXCIgYXMgY29uc3Q7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0b3JUeXBlID0gXCJkeW5hbW9kYlwiIGFzIGNvbnN0O1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlOiBEeW5hbW9EQlRhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEeW5hbW9EQkRhdGFiYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcblxuICAgIGNvbnN0IHRhYmxlUHJvcHM6IER5bmFtb0RCVGFibGVQcm9wcyA9IHtcbiAgICAgIHBhcnRpdGlvbktleTogcHJvcHMucGFydGl0aW9uS2V5LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleSxcbiAgICAgIGJpbGxpbmdNb2RlOiBwcm9wcy5iaWxsaW5nTW9kZSxcbiAgICAgIHJlYWRDYXBhY2l0eTogcHJvcHMucmVhZENhcGFjaXR5LFxuICAgICAgd3JpdGVDYXBhY2l0eTogcHJvcHMud3JpdGVDYXBhY2l0eSxcbiAgICAgIGdsb2JhbFNlY29uZGFyeUluZGV4ZXM6IHByb3BzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXMsXG4gICAgICB0aW1lVG9MaXZlQXR0cmlidXRlOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlLFxuICAgICAgc3RyZWFtOiBwcm9wcy5zdHJlYW0sXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5OiBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5LFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3lcbiAgICB9O1xuICAgIHRoaXMudGFibGUgPSBuZXcgRHluYW1vREJUYWJsZSh0aGlzLCBpZCwgdGFibGVQcm9wcyk7XG4gIH1cblxuICBnZXRUYWJsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5nZXRUYWJsZU5hbWUoKTtcbiAgfVxuXG4gIGdldFRhYmxlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ2V0VGFibGVBcm4oKTtcbiAgfVxuXG4gIGdldFRhYmxlKCk6IElUYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ2V0VGFibGUoKTtcbiAgfVxuXG4gIGdldFN0cmVhbUFybigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdldFRhYmxlU3RyZWFtQXJuKCk7XG4gIH1cblxuICBncmFudFJlYWREYXRhKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRSZWFkKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRXcml0ZURhdGEoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFdyaXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRSZWFkV3JpdGVEYXRhKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudEZ1bGxBY2Nlc3MoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudEZ1bGxBY2Nlc3MoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFN0cmVhbVJlYWQoZ3JhbnRlZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWxhdGlvbmFsIGRhdGFiYXNlIHdyYXBwZXIgaW1wbGVtZW50aW5nIElSZWxhdGlvbmFsRGF0YWJhc2UgaW50ZXJmYWNlLlxuICogU3VwcG9ydHMgQXVyb3JhLCBSRFMgSW5zdGFuY2UsIGFuZCBHbG9iYWxBdXJvcmEgZGF0YWJhc2UgdHlwZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRiID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIk1haW5cIiwge1xuICogICB0eXBlOiBcIkF1cm9yYVwiLFxuICogICBkYXRhYmFzZU5hbWU6IFwibXlfYXBwXCJcbiAqIH0pKTtcbiAqIGRiLmdyYW50Q29ubmVjdChsYW1iZGEpO1xuICovXG5leHBvcnQgY2xhc3MgUmVsYXRpb25hbERhdGFiYXNlXG4gIGV4dGVuZHMgQ29uc3RydWN0XG4gIGltcGxlbWVudHMgSVJlbGF0aW9uYWxEYXRhYmFzZSwgSVNlY3VyaXR5R3JvdXBDb25uZWN0b3JcbntcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzY29wZTogQ29uc3RydWN0O1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjOiBJVnBjO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YWJhc2VUeXBlOiBSZWxhdGlvbmFsRGF0YWJhc2VUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdG9yVHlwZSA9IFwicmVsYXRpb25hbFwiIGFzIGNvbnN0O1xuXG4gIHB1YmxpYyBjb25uZWN0aW9ucyE6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGFiYXNlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGRhdGFiYXNlITogUmRzQXVyb3JhIHwgUmRzSW5zdGFuY2UgfCBSZHNBdXJvcmFHbG9iYWw7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLmRhdGFiYXNlVHlwZSA9IHByb3BzLnR5cGU7XG4gICAgaWYgKCFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgcmVsYXRpb25hbCBkYXRhYmFzZVwiKTtcbiAgICB9XG4gICAgdGhpcy52cGMgPSBwcm9wcy52cGM7XG5cbiAgICB0aGlzLl9kYXRhYmFzZU5hbWUgPSBwcm9wcy5kYXRhYmFzZU5hbWU7XG4gICAgdGhpcy5hZGREYXRhYmFzZShwcm9wcyk7XG4gIH1cblxuICBhZGREYXRhYmFzZShwcm9wczogSVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKSB7XG4gICAgc3dpdGNoIChwcm9wcy50eXBlKSB7XG4gICAgICBjYXNlIFwiQXVyb3JhXCI6XG4gICAgICAgIHRoaXMuYWRkQXVyb3JhKHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiR2xvYmFsQXVyb3JhXCI6XG4gICAgICAgIHRoaXMuYWRkQXVyb3JhR2xvYmFsKHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiSW5zdGFuY2VcIjpcbiAgICAgICAgdGhpcy5hZGRSZHNJbnN0YW5jZShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnN1cHBvcnRlZCBkYXRhYmFzZSB0eXBlOiAke1N0cmluZygoX2V4aGF1c3RpdmUgYXMgSVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKS50eXBlKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRBdXJvcmEocHJvcHM6IEF1cm9yYURhdGFiYXNlUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnZwYykgdGhyb3cgbmV3IEVycm9yKFwiVlBDIGlzIHJlcXVpcmVkIGZvciBBdXJvcmEgZGF0YWJhc2VcIik7XG5cbiAgICBjb25zdCByZXNvbHZlZERhdGFiYXNlRW5naW5lID0gcHJvcHMuZGF0YWJhc2VFbmdpbmUgPz8gXCJwb3N0Z3Jlc3FsXCI7XG4gICAgY29uc3QgcmVzb2x2ZWRFbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lID8/IGdldEF1cm9yYUNsdXN0ZXJFbmdpbmUocmVzb2x2ZWREYXRhYmFzZUVuZ2luZSk7XG4gICAgY29uc3QgZW5naW5lQ29uZmlnID0gZ2V0RW5naW5lQ29uZmlnKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuXG4gICAgaWYgKHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZSkge1xuICAgICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgICAgYEF1cm9yYSBkYXRhYmFzZSAnJHtwcm9wcy5kYXRhYmFzZU5hbWV9JyBpcyBjb25maWd1cmVkIHdpdGggcHVibGljIGFjY2Vzc2liaWxpdHkuIGAgK1xuICAgICAgICAgIFwiVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2sgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRldmVsb3BtZW50LlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzQXVyb3JhKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIHdyaXRlcjogcHJvcHMud3JpdGVyLFxuICAgICAgcmVhZGVyczogcHJvcHMucmVhZGVycyxcbiAgICAgIHByb3h5OiBwcm9wcy5wcm94eSxcbiAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgICBiYWNrdXBSZXRlbnRpb246IHByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93LFxuICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgIGRhdGFiYXNlSW5zaWdodHM6IHByb3BzLmRhdGFiYXNlSW5zaWdodHMsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb3BzLmRlbGV0aW9uUHJvdGVjdGlvbixcbiAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgc25hcHNob3RVc2VybmFtZTogcHJvcHMuc25hcHNob3RVc2VybmFtZSxcbiAgICAgIGFsbG93VnBjQWNjZXNzOiBwcm9wcy5hbGxvd1ZwY0FjY2VzcyxcbiAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlLFxuICAgICAgYWxsb3dlZElwQ2lkcjogcHJvcHMuYWxsb3dlZElwQ2lkclxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICAgIHRoaXMuYWRkRGF0YWJhc2VPdXRwdXRzKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQXVyb3JhR2xvYmFsKHByb3BzOiBHbG9iYWxBdXJvcmFEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWUEMgaXMgcmVxdWlyZWQgZm9yIEdsb2JhbCBBdXJvcmEgZGF0YWJhc2VcIik7XG4gICAgaWYgKCFwcm9wcy5wcmltYXJ5UmVnaW9uKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJpbWFyeVJlZ2lvbiBpcyByZXF1aXJlZCBmb3IgR2xvYmFsIEF1cm9yYSBkYXRhYmFzZVwiKTtcblxuICAgIGNvbnN0IHJlc29sdmVkRGF0YWJhc2VFbmdpbmUgPSBwcm9wcy5kYXRhYmFzZUVuZ2luZSA/PyBcInBvc3RncmVzcWxcIjtcbiAgICBjb25zdCByZXNvbHZlZEVuZ2luZSA9XG4gICAgICBwcm9wcy5lbmdpbmUgPz8gZ2V0QXVyb3JhQ2x1c3RlckVuZ2luZShyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcbiAgICBjb25zdCBlbmdpbmVDb25maWcgPSBnZXRFbmdpbmVDb25maWcocmVzb2x2ZWREYXRhYmFzZUVuZ2luZSk7XG5cbiAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFJkc0F1cm9yYUdsb2JhbChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmRzR2xvYmFsYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICBwcmltYXJ5UmVnaW9uOiBwcm9wcy5wcmltYXJ5UmVnaW9uLFxuICAgICAgICBzZWNvbmRhcnlSZWdpb25zOiBwcm9wcy5zZWNvbmRhcnlSZWdpb25zLFxuICAgICAgICBnbG9iYWxDbHVzdGVySWRlbnRpZmllcjogcHJvcHMuZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXIsXG4gICAgICAgIGVuZ2luZTogcmVzb2x2ZWRFbmdpbmUsXG4gICAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgICAgZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nOiBwcm9wcy5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcsXG4gICAgICAgIHdyaXRlcjogcHJvcHMud3JpdGVyLFxuICAgICAgICByZWFkZXJzOiBwcm9wcy5yZWFkZXJzLFxuICAgICAgICBwcm94eTogcHJvcHMucHJveHksXG4gICAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgICAgYmFja3VwUmV0ZW50aW9uOiBwcm9wcy5iYWNrdXBSZXRlbnRpb24sXG4gICAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzogcHJvcHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3csXG4gICAgICAgIHBvcnQ6IHByb3BzLnBvcnQsXG4gICAgICAgIGRhdGFiYXNlSW5zaWdodHM6IHByb3BzLmRhdGFiYXNlSW5zaWdodHMsXG4gICAgICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogcHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uLFxuICAgICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllcixcbiAgICAgICAgc25hcHNob3RVc2VybmFtZTogcHJvcHMuc25hcHNob3RVc2VybmFtZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZGF0YWJhc2UuY29ubmVjdGlvbnM7XG4gICAgdGhpcy5hZGREYXRhYmFzZU91dHB1dHMocHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZHNJbnN0YW5jZShwcm9wczogSW5zdGFuY2VEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgSW5zdGFuY2UgZGF0YWJhc2VcIik7XG5cbiAgICBjb25zdCByZXNvbHZlZERhdGFiYXNlRW5naW5lID0gcHJvcHMuZGF0YWJhc2VFbmdpbmUgPz8gXCJwb3N0Z3Jlc3FsXCI7XG4gICAgY29uc3QgcmVzb2x2ZWRFbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lID8/IGdldEluc3RhbmNlRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzSW5zdGFuY2UodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJkc2AsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSxcbiAgICAgIGFsbG9jYXRlZFN0b3JhZ2U6IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2UsXG4gICAgICBwb3J0OiBwcm9wcy5wb3J0LFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIG11bHRpQXo6IHByb3BzLm11bHRpQXosXG4gICAgICBiYWNrdXBSZXRlbnRpb246XG4gICAgICAgIHByb3BzLmJhY2t1cFJldGVudGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBEdXJhdGlvbi5kYXlzKHByb3BzLmJhY2t1cFJldGVudGlvbilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFiYXNlSW5zaWdodHM6IHByb3BzLmRhdGFiYXNlSW5zaWdodHMsXG4gICAgICBwcm94eTogcHJvcHMucHJveHksXG4gICAgICByZWFkUmVwbGljYTogcHJvcHMucmVhZFJlcGxpY2EsXG4gICAgICBjcmVkZW50aWFsczogcHJvcHMuY3JlZGVudGlhbHMsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgICAgcHVibGljbHlBY2Nlc3NpYmxlOiBwcm9wcy5wdWJsaWNseUFjY2Vzc2libGUsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb3BzLmRlbGV0aW9uUHJvdGVjdGlvbixcbiAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgc25hcHNob3RVc2VybmFtZTogcHJvcHMuc25hcHNob3RVc2VybmFtZVxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICAgIHRoaXMuYWRkRGF0YWJhc2VPdXRwdXRzKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGF0YWJhc2VPdXRwdXRzKHByb3BzOiBJUmVsYXRpb25hbERhdGFiYXNlUHJvcHMpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuZGF0YWJhc2UuZ2V0SG9zdEVuZHBvaW50KCk7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gU3RhY2sub2YodGhpcykuc3RhY2tOYW1lO1xuICAgIC8vIFNhbml0aXNlIGZvciBDZm5PdXRwdXQgbmFtZXMg4oCUIENsb3VkRm9ybWF0aW9uIGV4cG9ydCBuYW1lcyBvbmx5IGFsbG93IFthLXpBLVowLTk6LV1cbiAgICBjb25zdCBvdXRwdXROYW1lID0gdG9QYXNjYWxDYXNlKHByb3BzLmRhdGFiYXNlTmFtZSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9RW5kcG9pbnRgLCB7XG4gICAgICBrZXk6IGAke3N0YWNrTmFtZX0ke291dHB1dE5hbWV9RW5kcG9pbnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfSR7b3V0cHV0TmFtZX1FbmRwb2ludGAsXG4gICAgICB2YWx1ZTogZW5kcG9pbnQsXG4gICAgICBkZXNjcmlwdGlvbjogYERhdGFiYXNlIEVuZHBvaW50IGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9UG9ydGAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7b3V0cHV0TmFtZX1Qb3J0YCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke291dHB1dE5hbWV9UG9ydGAsXG4gICAgICB2YWx1ZTogdGhpcy5kYXRhYmFzZS5nZXRIb3N0UG9ydCgpLFxuICAgICAgZGVzY3JpcHRpb246IGBEYXRhYmFzZSBQb3J0IGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9RGF0YWJhc2VOYW1lYCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfURhdGFiYXNlTmFtZWAsXG4gICAgICBleHBvcnROYW1lOiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfURhdGFiYXNlTmFtZWAsXG4gICAgICB2YWx1ZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGBEYXRhYmFzZSBOYW1lIGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHRoaXMuZGF0YWJhc2UuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9U2VjcmV0QXJuYCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfVNlY3JldEFybmAsXG4gICAgICBleHBvcnROYW1lOiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfVNlY3JldEFybmAsXG4gICAgICB2YWx1ZTogY3JlZGVudGlhbHMuc2VjcmV0LnNlY3JldEFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBgRGF0YWJhc2UgQ3JlZGVudGlhbHMgU2VjcmV0IEFSTiBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRDcmVkZW50aWFscygpO1xuICB9XG5cbiAgZ2V0SG9zdEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0SG9zdEVuZHBvaW50KCk7XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldEhvc3RQb3J0KCk7XG4gIH1cblxuICBnZXREYXRhYmFzZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YWJhc2VOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IGNvbm5lY3QgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlIGJ5IGFkZGluZyBpdCB0byB0aGUgZGF0YWJhc2Ugc2VjdXJpdHkgZ3JvdXAuXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBjb25uZWN0YWJsZSBwcmluY2lwYWwgdG8gZ3JhbnQgY29ubmVjdCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgZ3JhbnRDb25uZWN0KGdyYW50ZWU6IElDb25uZWN0YWJsZSk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20oZ3JhbnRlZSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IER5bmFtb0RCIHR5cGVzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUge1xuICBEeW5hbW9EQktleVNjaGVtYSxcbiAgRHluYW1vREJHbG9iYWxTZWNvbmRhcnlJbmRleCxcbiAgRHluYW1vREJUYWJsZVByb3BzXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL2R5bmFtb2RiXCI7XG5cbi8vIFJlLWV4cG9ydCBpbnRlcmZhY2UgdHlwZXNcbmV4cG9ydCB7XG4gIHR5cGUgSVJlbGF0aW9uYWxEYXRhYmFzZSxcbiAgdHlwZSBJRHluYW1vREJEYXRhYmFzZSxcbiAgdHlwZSBBbnlEYXRhYmFzZSxcbiAgdHlwZSBEYXRhYmFzZVR5cGUsXG4gIHR5cGUgUmVsYXRpb25hbERhdGFiYXNlVHlwZSxcbiAgaXNSZWxhdGlvbmFsRGF0YWJhc2UsXG4gIGlzRHluYW1vREJEYXRhYmFzZSxcbiAgaXNBdXJvcmFEYXRhYmFzZSxcbiAgaXNJbnN0YW5jZURhdGFiYXNlLFxuICBpc0dsb2JhbEF1cm9yYURhdGFiYXNlXG59IGZyb20gXCIuL2ludGVyZmFjZXMvZGF0YWJhc2UuanNcIjtcbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import * as route53 from "aws-cdk-lib/aws-route53";
|
|
3
|
+
import type { DomainDelegatedProps } from "./interfaces/domain";
|
|
4
|
+
export declare class DomainDelegation extends Construct {
|
|
5
|
+
readonly hostedZoneId: string;
|
|
6
|
+
readonly hostedZone: route53.HostedZone;
|
|
7
|
+
constructor(scope: Construct, id: string, props: DomainDelegatedProps);
|
|
8
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DomainDelegation = void 0;
|
|
4
|
+
const constructs_1 = require("constructs");
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
const route53 = require("aws-cdk-lib/aws-route53");
|
|
7
|
+
const iam_1 = require("../../resources/aws/iam");
|
|
8
|
+
const capitaliseString_1 = require("../../utils/capitaliseString");
|
|
9
|
+
const domainCertificate_1 = require("../../resources/aws/networking/domainCertificate");
|
|
10
|
+
const domainTypes_1 = require("../../utils/domainTypes");
|
|
11
|
+
class DomainDelegation extends constructs_1.Construct {
|
|
12
|
+
constructor(scope, id, props) {
|
|
13
|
+
super(scope, id);
|
|
14
|
+
const parentFirstLabel = props.parentZoneName.split(".")[0] ?? "default";
|
|
15
|
+
const delegationRoleArn = aws_cdk_lib_1.Fn.importValue(`${parentFirstLabel}DelegateHostedZoneRoleArn`);
|
|
16
|
+
const hostedZoneDelegationRole = iam_1.Role.fromRoleArn(this, "HostedZoneDelegationRole", delegationRoleArn);
|
|
17
|
+
const safeZone = (0, capitaliseString_1.getSafeZoneName)(props.zoneName);
|
|
18
|
+
this.hostedZone = new route53.HostedZone(this, `${safeZone}HostedZone`, {
|
|
19
|
+
zoneName: props.zoneName
|
|
20
|
+
});
|
|
21
|
+
this.hostedZoneId = this.hostedZone.hostedZoneId;
|
|
22
|
+
new route53.CrossAccountZoneDelegationRecord(this, `${safeZone}DelegationRecord`, {
|
|
23
|
+
delegationRole: hostedZoneDelegationRole,
|
|
24
|
+
delegatedZone: this.hostedZone,
|
|
25
|
+
parentHostedZoneName: props.parentZoneName
|
|
26
|
+
});
|
|
27
|
+
const safeKey = (0, capitaliseString_1.toPascalCase)(safeZone);
|
|
28
|
+
const exports = (0, domainTypes_1.getDomainExportNames)(props.zoneName);
|
|
29
|
+
new aws_cdk_lib_1.CfnOutput(this, `${safeKey}HostedZoneId`, {
|
|
30
|
+
key: `${safeKey}HostedZoneId`,
|
|
31
|
+
value: this.hostedZoneId,
|
|
32
|
+
exportName: exports.hostedZoneId
|
|
33
|
+
});
|
|
34
|
+
new aws_cdk_lib_1.CfnOutput(this, `${safeKey}Nameservers`, {
|
|
35
|
+
key: `${safeKey}Nameservers`,
|
|
36
|
+
value: aws_cdk_lib_1.Fn.join(",", this.hostedZone.hostedZoneNameServers ?? [])
|
|
37
|
+
});
|
|
38
|
+
if (props.certificates) {
|
|
39
|
+
props.certificates.forEach((cert, index) => {
|
|
40
|
+
const safeCertName = (0, capitaliseString_1.toPascalCase)(cert.domainName.split(".").join(""));
|
|
41
|
+
new domainCertificate_1.DomainCertificate(this, `${safeKey}${safeCertName}Cert${index}`, {
|
|
42
|
+
domainName: cert.domainName,
|
|
43
|
+
subjectAlternativeNames: cert.subjectAlternativeNames,
|
|
44
|
+
hostedZone: this.hostedZone
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (props.records) {
|
|
49
|
+
(0, domainTypes_1.addDnsRecords)(this, this.hostedZone, props.zoneName, props.records);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.DomainDelegation = DomainDelegation;
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluRGVsZWdhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvZG9tYWluRGVsZWdhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsNkNBQTRDO0FBQzVDLG1EQUFtRDtBQUNuRCxpREFBK0M7QUFDL0MsbUVBQTZFO0FBQzdFLHdGQUFxRjtBQUVyRix5REFBOEU7QUFFOUUsTUFBYSxnQkFBaUIsU0FBUSxzQkFBUztJQUk3QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDekUsTUFBTSxpQkFBaUIsR0FBRyxnQkFBRSxDQUFDLFdBQVcsQ0FDdEMsR0FBRyxnQkFBZ0IsMkJBQTJCLENBQy9DLENBQUM7UUFFRixNQUFNLHdCQUF3QixHQUFHLFVBQUksQ0FBQyxXQUFXLENBQy9DLElBQUksRUFDSiwwQkFBMEIsRUFDMUIsaUJBQWlCLENBQ2xCLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFBLGtDQUFlLEVBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsWUFBWSxFQUFFO1lBQ3RFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBRWpELElBQUksT0FBTyxDQUFDLGdDQUFnQyxDQUMxQyxJQUFJLEVBQ0osR0FBRyxRQUFRLGtCQUFrQixFQUM3QjtZQUNFLGNBQWMsRUFBRSx3QkFBd0I7WUFDeEMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzlCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxjQUFjO1NBQzNDLENBQ0YsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLElBQUEsK0JBQVksRUFBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFBLGtDQUFvQixFQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVyRCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsT0FBTyxjQUFjLEVBQUU7WUFDNUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxjQUFjO1lBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN4QixVQUFVLEVBQUUsT0FBTyxDQUFDLFlBQVk7U0FDakMsQ0FBQyxDQUFDO1FBRUgsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxHQUFHLE9BQU8sYUFBYSxFQUFFO1lBQzNDLEdBQUcsRUFBRSxHQUFHLE9BQU8sYUFBYTtZQUM1QixLQUFLLEVBQUUsZ0JBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLElBQUksRUFBRSxDQUFDO1NBQ2pFLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN6QyxNQUFNLFlBQVksR0FBRyxJQUFBLCtCQUFZLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLEdBQUcsT0FBTyxHQUFHLFlBQVksT0FBTyxLQUFLLEVBQUUsRUFBRTtvQkFDbkUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUMzQix1QkFBdUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCO29CQUNyRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7aUJBQzVCLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQUEsMkJBQWEsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBakVELDRDQWlFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIEZuIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2lhbVwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlLCBnZXRTYWZlWm9uZU5hbWUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY2FwaXRhbGlzZVN0cmluZ1wiO1xuaW1wb3J0IHsgRG9tYWluQ2VydGlmaWNhdGUgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL2RvbWFpbkNlcnRpZmljYXRlXCI7XG5pbXBvcnQgdHlwZSB7IERvbWFpbkRlbGVnYXRlZFByb3BzIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9kb21haW5cIjtcbmltcG9ydCB7IGdldERvbWFpbkV4cG9ydE5hbWVzLCBhZGREbnNSZWNvcmRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2RvbWFpblR5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBEb21haW5EZWxlZ2F0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGhvc3RlZFpvbmVJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgaG9zdGVkWm9uZTogcm91dGU1My5Ib3N0ZWRab25lO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEb21haW5EZWxlZ2F0ZWRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBwYXJlbnRGaXJzdExhYmVsID0gcHJvcHMucGFyZW50Wm9uZU5hbWUuc3BsaXQoXCIuXCIpWzBdID8/IFwiZGVmYXVsdFwiO1xuICAgIGNvbnN0IGRlbGVnYXRpb25Sb2xlQXJuID0gRm4uaW1wb3J0VmFsdWUoXG4gICAgICBgJHtwYXJlbnRGaXJzdExhYmVsfURlbGVnYXRlSG9zdGVkWm9uZVJvbGVBcm5gXG4gICAgKTtcblxuICAgIGNvbnN0IGhvc3RlZFpvbmVEZWxlZ2F0aW9uUm9sZSA9IFJvbGUuZnJvbVJvbGVBcm4oXG4gICAgICB0aGlzLFxuICAgICAgXCJIb3N0ZWRab25lRGVsZWdhdGlvblJvbGVcIixcbiAgICAgIGRlbGVnYXRpb25Sb2xlQXJuXG4gICAgKTtcblxuICAgIGNvbnN0IHNhZmVab25lID0gZ2V0U2FmZVpvbmVOYW1lKHByb3BzLnpvbmVOYW1lKTtcblxuICAgIHRoaXMuaG9zdGVkWm9uZSA9IG5ldyByb3V0ZTUzLkhvc3RlZFpvbmUodGhpcywgYCR7c2FmZVpvbmV9SG9zdGVkWm9uZWAsIHtcbiAgICAgIHpvbmVOYW1lOiBwcm9wcy56b25lTmFtZVxuICAgIH0pO1xuXG4gICAgdGhpcy5ob3N0ZWRab25lSWQgPSB0aGlzLmhvc3RlZFpvbmUuaG9zdGVkWm9uZUlkO1xuXG4gICAgbmV3IHJvdXRlNTMuQ3Jvc3NBY2NvdW50Wm9uZURlbGVnYXRpb25SZWNvcmQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7c2FmZVpvbmV9RGVsZWdhdGlvblJlY29yZGAsXG4gICAgICB7XG4gICAgICAgIGRlbGVnYXRpb25Sb2xlOiBob3N0ZWRab25lRGVsZWdhdGlvblJvbGUsXG4gICAgICAgIGRlbGVnYXRlZFpvbmU6IHRoaXMuaG9zdGVkWm9uZSxcbiAgICAgICAgcGFyZW50SG9zdGVkWm9uZU5hbWU6IHByb3BzLnBhcmVudFpvbmVOYW1lXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHNhZmVLZXkgPSB0b1Bhc2NhbENhc2Uoc2FmZVpvbmUpO1xuICAgIGNvbnN0IGV4cG9ydHMgPSBnZXREb21haW5FeHBvcnROYW1lcyhwcm9wcy56b25lTmFtZSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3NhZmVLZXl9SG9zdGVkWm9uZUlkYCwge1xuICAgICAga2V5OiBgJHtzYWZlS2V5fUhvc3RlZFpvbmVJZGAsXG4gICAgICB2YWx1ZTogdGhpcy5ob3N0ZWRab25lSWQsXG4gICAgICBleHBvcnROYW1lOiBleHBvcnRzLmhvc3RlZFpvbmVJZFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtzYWZlS2V5fU5hbWVzZXJ2ZXJzYCwge1xuICAgICAga2V5OiBgJHtzYWZlS2V5fU5hbWVzZXJ2ZXJzYCxcbiAgICAgIHZhbHVlOiBGbi5qb2luKFwiLFwiLCB0aGlzLmhvc3RlZFpvbmUuaG9zdGVkWm9uZU5hbWVTZXJ2ZXJzID8/IFtdKVxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmNlcnRpZmljYXRlcykge1xuICAgICAgcHJvcHMuY2VydGlmaWNhdGVzLmZvckVhY2goKGNlcnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNhZmVDZXJ0TmFtZSA9IHRvUGFzY2FsQ2FzZShjZXJ0LmRvbWFpbk5hbWUuc3BsaXQoXCIuXCIpLmpvaW4oXCJcIikpO1xuICAgICAgICBuZXcgRG9tYWluQ2VydGlmaWNhdGUodGhpcywgYCR7c2FmZUtleX0ke3NhZmVDZXJ0TmFtZX1DZXJ0JHtpbmRleH1gLCB7XG4gICAgICAgICAgZG9tYWluTmFtZTogY2VydC5kb21haW5OYW1lLFxuICAgICAgICAgIHN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzOiBjZXJ0LnN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzLFxuICAgICAgICAgIGhvc3RlZFpvbmU6IHRoaXMuaG9zdGVkWm9uZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5yZWNvcmRzKSB7XG4gICAgICBhZGREbnNSZWNvcmRzKHRoaXMsIHRoaXMuaG9zdGVkWm9uZSwgcHJvcHMuem9uZU5hbWUsIHByb3BzLnJlY29yZHMpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Construct } from "constructs";
|
|
2
|
+
import { Domain } from "../../resources/aws/networking/domain";
|
|
3
|
+
import { DomainDelegation } from "./domainDelegation";
|
|
4
|
+
import type { DomainApexProps, DomainDelegatedProps } from "./interfaces/domain";
|
|
5
|
+
export declare class DomainFactory {
|
|
6
|
+
static build(id: string, props: DomainApexProps): (scope: Construct) => Domain;
|
|
7
|
+
static build(id: string, props: DomainDelegatedProps): (scope: Construct) => DomainDelegation;
|
|
8
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DomainFactory = void 0;
|
|
4
|
+
const domain_1 = require("../../resources/aws/networking/domain");
|
|
5
|
+
const domainDelegation_1 = require("./domainDelegation");
|
|
6
|
+
class DomainFactory {
|
|
7
|
+
static build(id, props) {
|
|
8
|
+
return (scope) => {
|
|
9
|
+
switch (props.type) {
|
|
10
|
+
case "domain":
|
|
11
|
+
return new domain_1.Domain(scope, id, props);
|
|
12
|
+
case "delegated":
|
|
13
|
+
return new domainDelegation_1.DomainDelegation(scope, id, props);
|
|
14
|
+
default: {
|
|
15
|
+
const _exhaustive = props;
|
|
16
|
+
throw new Error(`Unsupported domain type: ${String(_exhaustive.type)}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.DomainFactory = DomainFactory;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvZG9tYWluRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxrRUFBK0Q7QUFDL0QseURBQXNEO0FBT3RELE1BQWEsYUFBYTtJQVN4QixNQUFNLENBQUMsS0FBSyxDQUNWLEVBQVUsRUFDVixLQUFtQjtRQUVuQixPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFO1lBQzFCLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQixLQUFLLFFBQVE7b0JBQ1gsT0FBTyxJQUFJLGVBQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0QyxLQUFLLFdBQVc7b0JBQ2QsT0FBTyxJQUFJLG1DQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ1IsTUFBTSxXQUFXLEdBQVUsS0FBSyxDQUFDO29CQUNqQyxNQUFNLElBQUksS0FBSyxDQUNiLDRCQUE0QixNQUFNLENBQUUsV0FBNEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN6RSxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBNUJELHNDQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IERvbWFpbiB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvZG9tYWluXCI7XG5pbXBvcnQgeyBEb21haW5EZWxlZ2F0aW9uIH0gZnJvbSBcIi4vZG9tYWluRGVsZWdhdGlvblwiO1xuaW1wb3J0IHR5cGUge1xuICBEb21haW5BcGV4UHJvcHMsXG4gIERvbWFpbkRlbGVnYXRlZFByb3BzLFxuICBJRG9tYWluUHJvcHNcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9kb21haW5cIjtcblxuZXhwb3J0IGNsYXNzIERvbWFpbkZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogRG9tYWluQXBleFByb3BzXG4gICk6IChzY29wZTogQ29uc3RydWN0KSA9PiBEb21haW47XG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBEb21haW5EZWxlZ2F0ZWRQcm9wc1xuICApOiAoc2NvcGU6IENvbnN0cnVjdCkgPT4gRG9tYWluRGVsZWdhdGlvbjtcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElEb21haW5Qcm9wc1xuICApOiAoc2NvcGU6IENvbnN0cnVjdCkgPT4gRG9tYWluIHwgRG9tYWluRGVsZWdhdGlvbiB7XG4gICAgcmV0dXJuIChzY29wZTogQ29uc3RydWN0KSA9PiB7XG4gICAgICBzd2l0Y2ggKHByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImRvbWFpblwiOlxuICAgICAgICAgIHJldHVybiBuZXcgRG9tYWluKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgICAgICBjYXNlIFwiZGVsZWdhdGVkXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBEb21haW5EZWxlZ2F0aW9uKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gcHJvcHM7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIGRvbWFpbiB0eXBlOiAke1N0cmluZygoX2V4aGF1c3RpdmUgYXMgSURvbWFpblByb3BzKS50eXBlKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -6,7 +6,10 @@ export * from "./buildkite";
|
|
|
6
6
|
export * from "../../resources/aws/compute/ec2";
|
|
7
7
|
export * from "./fivetranProxy";
|
|
8
8
|
export * from "./database";
|
|
9
|
-
export * from "
|
|
9
|
+
export * from "../../resources/aws/networking/hostedZone";
|
|
10
|
+
export * from "./domainFactory";
|
|
11
|
+
export * from "./domainDelegation";
|
|
12
|
+
export * from "./interfaces/domain";
|
|
10
13
|
export * from "./compute";
|
|
11
14
|
export * from "./storage";
|
|
12
15
|
export * from "./auditRole";
|
|
@@ -23,7 +23,11 @@ __exportStar(require("./buildkite"), exports);
|
|
|
23
23
|
__exportStar(require("../../resources/aws/compute/ec2"), exports);
|
|
24
24
|
__exportStar(require("./fivetranProxy"), exports);
|
|
25
25
|
__exportStar(require("./database"), exports);
|
|
26
|
-
__exportStar(require("
|
|
26
|
+
__exportStar(require("../../resources/aws/networking/hostedZone"), exports);
|
|
27
|
+
// Domain patterns
|
|
28
|
+
__exportStar(require("./domainFactory"), exports);
|
|
29
|
+
__exportStar(require("./domainDelegation"), exports);
|
|
30
|
+
__exportStar(require("./interfaces/domain"), exports);
|
|
27
31
|
// Patterns
|
|
28
32
|
__exportStar(require("./compute"), exports);
|
|
29
33
|
__exportStar(require("./storage"), exports);
|
|
@@ -32,4 +36,4 @@ __exportStar(require("./network"), exports);
|
|
|
32
36
|
__exportStar(require("./cdn"), exports);
|
|
33
37
|
__exportStar(require("./messaging"), exports);
|
|
34
38
|
__exportStar(require("./pattern"), exports);
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3QkFBd0I7QUFDeEIsaURBQStCO0FBQy9CLDZDQUEyQjtBQUMzQiw0Q0FBMEI7QUFDMUIsd0RBQXNDO0FBRXRDLDhDQUE0QjtBQUM1QixrRUFBZ0Q7QUFDaEQsa0RBQWdDO0FBQ2hDLDZDQUEyQjtBQUMzQiw0RUFBMEQ7QUFFMUQsa0JBQWtCO0FBQ2xCLGtEQUFnQztBQUNoQyxxREFBbUM7QUFDbkMsc0RBQW9DO0FBRXBDLFdBQVc7QUFDWCw0Q0FBMEI7QUFDMUIsNENBQTBCO0FBQzFCLDhDQUE0QjtBQUM1Qiw0Q0FBMEI7QUFDMUIsd0NBQXNCO0FBQ3RCLDhDQUE0QjtBQUM1Qiw0Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBPcmdhbmlzYXRpb24gcGF0dGVybnNcbmV4cG9ydCAqIGZyb20gXCIuL29yZ2FuaXNhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGxhdGZvcm1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FjY291bnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29yZ2FuaXNhdGlvbkZhY3RvcnlcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vYnVpbGRraXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2VjMlwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZml2ZXRyYW5Qcm94eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvaG9zdGVkWm9uZVwiO1xuXG4vLyBEb21haW4gcGF0dGVybnNcbmV4cG9ydCAqIGZyb20gXCIuL2RvbWFpbkZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RvbWFpbkRlbGVnYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXMvZG9tYWluXCI7XG5cbi8vIFBhdHRlcm5zXG5leHBvcnQgKiBmcm9tIFwiLi9jb21wdXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdG9yYWdlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hdWRpdFJvbGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25ldHdvcmtcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NkblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWVzc2FnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wYXR0ZXJuXCI7XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Construct } from "constructs";
|
|
2
|
+
import type { Distribution } from "aws-cdk-lib/aws-cloudfront";
|
|
3
|
+
/**
|
|
4
|
+
* CDN type discriminator.
|
|
5
|
+
* Currently only CloudFront is supported.
|
|
6
|
+
*/
|
|
7
|
+
export type CdnType = "cloudfront";
|
|
8
|
+
/**
|
|
9
|
+
* Runtime interface for CDN distributions.
|
|
10
|
+
* Provides access to the underlying CloudFront distribution.
|
|
11
|
+
*/
|
|
12
|
+
export interface ICdn {
|
|
13
|
+
readonly node: Construct["node"];
|
|
14
|
+
getDistributionDomainName(): string;
|
|
15
|
+
getDistributionId(): string;
|
|
16
|
+
getDistribution(): Distribution;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Union type representing any CDN interface.
|
|
20
|
+
* Currently only CloudFront, but extensible for future CDN types.
|
|
21
|
+
*/
|
|
22
|
+
export type AnyCdn = ICdn;
|
|
23
|
+
/**
|
|
24
|
+
* Type guard to check if a resource is a CDN distribution.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isCdn(resource: unknown): resource is ICdn;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isCdn = isCdn;
|
|
4
|
+
/**
|
|
5
|
+
* Type guard to check if a resource is a CDN distribution.
|
|
6
|
+
*/
|
|
7
|
+
function isCdn(resource) {
|
|
8
|
+
return (typeof resource === "object" &&
|
|
9
|
+
resource !== null &&
|
|
10
|
+
"getDistributionDomainName" in resource &&
|
|
11
|
+
"getDistributionId" in resource &&
|
|
12
|
+
"getDistribution" in resource);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9pbnRlcmZhY2VzL2Nkbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQThCQSxzQkFRQztBQVhEOztHQUVHO0FBQ0gsU0FBZ0IsS0FBSyxDQUFDLFFBQWlCO0lBQ3JDLE9BQU8sQ0FDTCxPQUFPLFFBQVEsS0FBSyxRQUFRO1FBQzVCLFFBQVEsS0FBSyxJQUFJO1FBQ2pCLDJCQUEyQixJQUFJLFFBQVE7UUFDdkMsbUJBQW1CLElBQUksUUFBUTtRQUMvQixpQkFBaUIsSUFBSSxRQUFRLENBQzlCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHR5cGUgeyBEaXN0cmlidXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcblxuLyoqXG4gKiBDRE4gdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQ3VycmVudGx5IG9ubHkgQ2xvdWRGcm9udCBpcyBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIENkblR5cGUgPSBcImNsb3VkZnJvbnRcIjtcblxuLyoqXG4gKiBSdW50aW1lIGludGVyZmFjZSBmb3IgQ0ROIGRpc3RyaWJ1dGlvbnMuXG4gKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNkbiB7XG4gIHJlYWRvbmx5IG5vZGU6IENvbnN0cnVjdFtcIm5vZGVcIl07XG5cbiAgZ2V0RGlzdHJpYnV0aW9uRG9tYWluTmFtZSgpOiBzdHJpbmc7XG4gIGdldERpc3RyaWJ1dGlvbklkKCk6IHN0cmluZztcbiAgZ2V0RGlzdHJpYnV0aW9uKCk6IERpc3RyaWJ1dGlvbjtcbn1cblxuLyoqXG4gKiBVbmlvbiB0eXBlIHJlcHJlc2VudGluZyBhbnkgQ0ROIGludGVyZmFjZS5cbiAqIEN1cnJlbnRseSBvbmx5IENsb3VkRnJvbnQsIGJ1dCBleHRlbnNpYmxlIGZvciBmdXR1cmUgQ0ROIHR5cGVzLlxuICovXG5leHBvcnQgdHlwZSBBbnlDZG4gPSBJQ2RuO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSByZXNvdXJjZSBpcyBhIENETiBkaXN0cmlidXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NkbihyZXNvdXJjZTogdW5rbm93bik6IHJlc291cmNlIGlzIElDZG4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiByZXNvdXJjZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHJlc291cmNlICE9PSBudWxsICYmXG4gICAgXCJnZXREaXN0cmlidXRpb25Eb21haW5OYW1lXCIgaW4gcmVzb3VyY2UgJiZcbiAgICBcImdldERpc3RyaWJ1dGlvbklkXCIgaW4gcmVzb3VyY2UgJiZcbiAgICBcImdldERpc3RyaWJ1dGlvblwiIGluIHJlc291cmNlXG4gICk7XG59XG4iXX0=
|