@fjall/components-infrastructure 0.76.0 → 0.77.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/dist/lib/app.d.ts +93 -12
- package/dist/lib/app.js +117 -48
- package/dist/lib/aspects/resourceInventory.d.ts +41 -0
- package/dist/lib/aspects/resourceInventory.js +56 -0
- package/dist/lib/config/audit.d.ts +18 -0
- package/dist/lib/config/audit.js +22 -0
- package/dist/lib/config/aws/ecrDefaultImage.js +3 -3
- package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
- package/dist/lib/patterns/aws/auditRole.js +58 -0
- package/dist/lib/patterns/aws/basicApp.d.ts +0 -0
- package/dist/lib/patterns/aws/basicApp.js +150 -0
- package/dist/lib/patterns/aws/compute.d.ts +10 -4
- package/dist/lib/patterns/aws/compute.js +5 -5
- package/dist/lib/patterns/aws/database.d.ts +24 -30
- package/dist/lib/patterns/aws/database.js +93 -14
- package/dist/lib/patterns/aws/ec2.d.ts +43 -0
- package/dist/lib/patterns/aws/ec2.js +123 -0
- package/dist/lib/patterns/aws/freeTierApp.d.ts +44 -0
- package/dist/lib/patterns/aws/freeTierApp.js +83 -0
- package/dist/lib/patterns/aws/index.d.ts +1 -0
- package/dist/lib/patterns/aws/index.js +2 -1
- package/dist/lib/patterns/aws/network.d.ts +75 -0
- package/dist/lib/patterns/aws/network.js +99 -0
- package/dist/lib/patterns/aws/spotInstanceApp.d.ts +45 -0
- package/dist/lib/patterns/aws/spotInstanceApp.js +85 -0
- package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
- package/dist/lib/resources/aws/audit/auditRole.js +46 -0
- package/dist/lib/resources/aws/base/awsStack.js +1 -4
- package/dist/lib/resources/aws/compute/ec2.d.ts +1 -0
- package/dist/lib/resources/aws/compute/ec2.js +5 -3
- package/dist/lib/resources/aws/compute/ecs.d.ts +1 -1
- package/dist/lib/resources/aws/compute/ecs.js +6 -2
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +1 -1
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +15 -4
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +1 -1
- package/dist/lib/resources/aws/compute/ecsSpot.js +17 -4
- package/dist/lib/resources/aws/compute/lambda.d.ts +12 -7
- package/dist/lib/resources/aws/compute/lambda.js +27 -19
- package/dist/lib/resources/aws/database/databaseFreeTier.d.ts +15 -0
- package/dist/lib/resources/aws/database/databaseFreeTier.js +29 -0
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +2 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +36 -37
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -0
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +7 -6
- package/dist/lib/resources/aws/database/rdsFreeTier.d.ts +37 -0
- package/dist/lib/resources/aws/database/rdsFreeTier.js +84 -0
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +3 -0
- package/dist/lib/resources/aws/database/rdsInstance.js +117 -33
- package/dist/lib/resources/aws/networking/index.d.ts +0 -1
- package/dist/lib/resources/aws/networking/index.js +1 -2
- package/dist/lib/resources/aws/networking/vpc.d.ts +40 -21
- package/dist/lib/resources/aws/networking/vpc.js +185 -36
- package/dist/lib/resources/aws/networking/vpcEndpoint.d.ts +2 -2
- package/dist/lib/resources/aws/networking/vpcEndpoint.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.d.ts +8 -6
- package/dist/lib/resources/aws/utilities/customResource.js +35 -11
- package/dist/lib/utils/getCidr.d.ts +8 -0
- package/dist/lib/utils/getCidr.js +40 -0
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/resourceNaming.d.ts +41 -0
- package/dist/lib/utils/resourceNaming.js +77 -0
- package/package.json +3 -3
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Database = exports.DatabaseFactory = exports.AWS_MANAGED = exports.DATABASE_ENGINE_CONFIG = void 0;
|
|
3
|
+
exports.Database = exports.DatabaseFactory = exports.USE_CMK = exports.AWS_MANAGED = exports.DATABASE_ENGINE_CONFIG = void 0;
|
|
4
4
|
exports.getAuroraClusterEngine = getAuroraClusterEngine;
|
|
5
5
|
exports.getInstanceEngine = getInstanceEngine;
|
|
6
6
|
exports.getEngineConfig = getEngineConfig;
|
|
7
7
|
exports.isAwsManagedKey = isAwsManagedKey;
|
|
8
|
+
exports.isCMKRequested = isCMKRequested;
|
|
8
9
|
const constructs_1 = require("constructs");
|
|
9
10
|
const database_1 = require("../../resources/aws/database");
|
|
10
11
|
const rdsAuroraGlobal_1 = require("../../resources/aws/database/rdsAuroraGlobal");
|
|
@@ -68,13 +69,7 @@ function getEngineConfig(engine) {
|
|
|
68
69
|
rotationAppName: config.rotationAppName
|
|
69
70
|
};
|
|
70
71
|
}
|
|
71
|
-
|
|
72
|
-
* Type guard to check if the encryption key spec is AWS managed.
|
|
73
|
-
* @example
|
|
74
|
-
* if (isAwsManagedKey(props.encryption?.storageKey)) {
|
|
75
|
-
* // Use AWS managed key
|
|
76
|
-
* }
|
|
77
|
-
*/
|
|
72
|
+
// Type guard to check if the encryption key spec is AWS managed.
|
|
78
73
|
function isAwsManagedKey(spec) {
|
|
79
74
|
return (spec !== undefined &&
|
|
80
75
|
typeof spec === "object" &&
|
|
@@ -82,17 +77,95 @@ function isAwsManagedKey(spec) {
|
|
|
82
77
|
spec.awsManaged === true);
|
|
83
78
|
}
|
|
84
79
|
/**
|
|
85
|
-
*
|
|
80
|
+
* Type guard to check if CMK is explicitly requested.
|
|
81
|
+
*/
|
|
82
|
+
function isCMKRequested(spec) {
|
|
83
|
+
return (spec !== undefined &&
|
|
84
|
+
typeof spec === "object" &&
|
|
85
|
+
"useCMK" in spec &&
|
|
86
|
+
spec.useCMK === true);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convenience constant for specifying AWS managed encryption (the default).
|
|
86
90
|
* @example
|
|
87
91
|
* encryption: { storageKey: AWS_MANAGED }
|
|
88
92
|
*/
|
|
89
93
|
exports.AWS_MANAGED = { awsManaged: true };
|
|
94
|
+
/**
|
|
95
|
+
* Convenience constant for explicitly requesting CMK.
|
|
96
|
+
* @example
|
|
97
|
+
* encryption: { storageKey: USE_CMK }
|
|
98
|
+
*/
|
|
99
|
+
exports.USE_CMK = { useCMK: true };
|
|
100
|
+
/**
|
|
101
|
+
* Validates database props and logs warnings for ignored or misconfigured options.
|
|
102
|
+
* These checks help catch issues when props come from dynamic sources where
|
|
103
|
+
* TypeScript's compile-time checks may not apply.
|
|
104
|
+
*/
|
|
105
|
+
function validateDatabaseProps(props) {
|
|
106
|
+
const propsAny = props;
|
|
107
|
+
// GlobalAurora requires primaryRegion
|
|
108
|
+
if (props.type === "GlobalAurora" && !props.primaryRegion) {
|
|
109
|
+
throw new Error("GlobalAurora database requires 'primaryRegion'. " +
|
|
110
|
+
"Specify the AWS region where the primary cluster will be created.");
|
|
111
|
+
}
|
|
112
|
+
// Warn about Instance-only options on Aurora/GlobalAurora
|
|
113
|
+
if (props.type === "Aurora" || props.type === "GlobalAurora") {
|
|
114
|
+
if ("readReplica" in propsAny && propsAny.readReplica !== undefined) {
|
|
115
|
+
console.warn(`[Fjall] Warning: 'readReplica' is ignored for ${props.type} databases. ` +
|
|
116
|
+
"Use 'readers' configuration for Aurora read scaling.");
|
|
117
|
+
}
|
|
118
|
+
if ("multiAz" in propsAny && propsAny.multiAz !== undefined) {
|
|
119
|
+
console.warn(`[Fjall] Warning: 'multiAz' is ignored for ${props.type} databases. ` +
|
|
120
|
+
"Aurora provides automatic multi-AZ replication.");
|
|
121
|
+
}
|
|
122
|
+
if ("allocatedStorage" in propsAny &&
|
|
123
|
+
propsAny.allocatedStorage !== undefined) {
|
|
124
|
+
console.warn(`[Fjall] Warning: 'allocatedStorage' is ignored for ${props.type} databases. ` +
|
|
125
|
+
"Aurora uses automatic storage scaling.");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Warn about Aurora-only options on Instance
|
|
129
|
+
if (props.type === "Instance") {
|
|
130
|
+
if ("readers" in propsAny && propsAny.readers !== undefined) {
|
|
131
|
+
console.warn("[Fjall] Warning: 'readers' is ignored for Instance databases. " +
|
|
132
|
+
"Use 'readReplica' configuration for RDS Instance read scaling.");
|
|
133
|
+
}
|
|
134
|
+
if ("writer" in propsAny && propsAny.writer !== undefined) {
|
|
135
|
+
console.warn("[Fjall] Warning: 'writer' is ignored for Instance databases. " +
|
|
136
|
+
"Writer configuration only applies to Aurora clusters.");
|
|
137
|
+
}
|
|
138
|
+
if ("backupRetention" in propsAny &&
|
|
139
|
+
propsAny.backupRetention !== undefined) {
|
|
140
|
+
console.warn("[Fjall] Warning: 'backupRetention' in days format is Aurora-specific. " +
|
|
141
|
+
"For RDS Instance, backup retention is configured via Duration in the construct.");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Warn about GlobalAurora-only options on non-global databases
|
|
145
|
+
if (props.type !== "GlobalAurora") {
|
|
146
|
+
if ("primaryRegion" in propsAny && propsAny.primaryRegion !== undefined) {
|
|
147
|
+
console.warn(`[Fjall] Warning: 'primaryRegion' is ignored for ${props.type} databases. ` +
|
|
148
|
+
"Region configuration only applies to GlobalAurora.");
|
|
149
|
+
}
|
|
150
|
+
if ("secondaryRegions" in propsAny &&
|
|
151
|
+
propsAny.secondaryRegions !== undefined) {
|
|
152
|
+
console.warn(`[Fjall] Warning: 'secondaryRegions' is ignored for ${props.type} databases. ` +
|
|
153
|
+
"Multi-region configuration only applies to GlobalAurora.");
|
|
154
|
+
}
|
|
155
|
+
if ("enableGlobalWriteForwarding" in propsAny &&
|
|
156
|
+
propsAny.enableGlobalWriteForwarding !== undefined) {
|
|
157
|
+
console.warn(`[Fjall] Warning: 'enableGlobalWriteForwarding' is ignored for ${props.type} databases. ` +
|
|
158
|
+
"Write forwarding only applies to GlobalAurora.");
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
90
162
|
class DatabaseFactory {
|
|
91
163
|
static build(id, props) {
|
|
92
164
|
return (app, scope) => {
|
|
165
|
+
validateDatabaseProps(props);
|
|
93
166
|
const databaseProps = {
|
|
94
167
|
...props,
|
|
95
|
-
vpc: (props.vpc || app.
|
|
168
|
+
vpc: (props.vpc || app.getVpc())
|
|
96
169
|
};
|
|
97
170
|
return new Database(scope, id, databaseProps);
|
|
98
171
|
};
|
|
@@ -144,7 +217,8 @@ class Database extends constructs_1.Construct {
|
|
|
144
217
|
monitoringInterval: props.monitoringInterval,
|
|
145
218
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow,
|
|
146
219
|
port: props.port,
|
|
147
|
-
performanceInsights: props.performanceInsights
|
|
220
|
+
performanceInsights: props.performanceInsights,
|
|
221
|
+
snapshotIdentifier: props.snapshotIdentifier
|
|
148
222
|
});
|
|
149
223
|
this.connections = this.database.connections;
|
|
150
224
|
}
|
|
@@ -174,11 +248,14 @@ class Database extends constructs_1.Construct {
|
|
|
174
248
|
monitoringInterval: props.monitoringInterval,
|
|
175
249
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow,
|
|
176
250
|
port: props.port,
|
|
177
|
-
performanceInsights: props.performanceInsights
|
|
251
|
+
performanceInsights: props.performanceInsights,
|
|
252
|
+
snapshotIdentifier: props.snapshotIdentifier
|
|
178
253
|
});
|
|
179
254
|
this.connections = this.database.connections;
|
|
180
255
|
}
|
|
181
256
|
addRdsInstance(props) {
|
|
257
|
+
if (!props.vpc)
|
|
258
|
+
throw new Error("VPC is required for Instance database");
|
|
182
259
|
const resolvedDatabaseEngine = props.databaseEngine ?? "postgresql";
|
|
183
260
|
const resolvedEngine = props.engine ?? getInstanceEngine(resolvedDatabaseEngine);
|
|
184
261
|
const engineConfig = getEngineConfig(resolvedDatabaseEngine);
|
|
@@ -195,7 +272,9 @@ class Database extends constructs_1.Construct {
|
|
|
195
272
|
proxy: props.proxy,
|
|
196
273
|
readReplica: props.readReplica,
|
|
197
274
|
credentials: props.credentials,
|
|
198
|
-
encryption: props.encryption
|
|
275
|
+
encryption: props.encryption,
|
|
276
|
+
publiclyAccessible: props.publiclyAccessible,
|
|
277
|
+
snapshotIdentifier: props.snapshotIdentifier
|
|
199
278
|
});
|
|
200
279
|
this.connections = this.database.connections;
|
|
201
280
|
}
|
|
@@ -213,4 +292,4 @@ class Database extends constructs_1.Construct {
|
|
|
213
292
|
}
|
|
214
293
|
}
|
|
215
294
|
exports.Database = Database;
|
|
216
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZGQSx3REFFQztBQUVELDhDQUVDO0FBRUQsMENBT0M7QUF1RUQsMENBU0M7QUE1TEQsMkNBQXVDO0FBR3ZDLDJEQUFzRTtBQUN0RSxrRkFBK0U7QUFTL0UsaURBUzZCO0FBWWhCLFFBQUEsc0JBQXNCLEdBUy9CO0lBQ0YsVUFBVSxFQUFFO1FBQ1YsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO1FBQy9DLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRTtRQUNqRCxlQUFlLEVBQUUsVUFBVTtRQUMzQixhQUFhLEVBQUUsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDLGVBQWUsRUFBRSw4Q0FBOEM7S0FDaEU7SUFDRCxLQUFLLEVBQUU7UUFDTCx3RUFBd0U7UUFDeEUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7UUFDdEUsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO1FBQ25ELGVBQWUsRUFBRSxPQUFPO1FBQ3hCLGFBQWEsRUFBRSxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRTtRQUNqRCxlQUFlLEVBQUUseUNBQXlDO0tBQzNEO0NBQ0YsQ0FBQztBQUVGLE1BQU0sdUJBQXVCLEdBQWlEO0lBQzVFLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDZixNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLDhCQUFzQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDM0UsT0FBTywrQkFBcUIsQ0FBQyxjQUFjLENBQUM7WUFDMUMsT0FBTyxF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RyxLQUFLLENBQUMsWUFBWSxLQUFLLEVBQUU7WUFDaEUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixNQUFNLEVBQUUsY0FBYztZQUN0QixZQUFZO1lBQ1osT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDOUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1NBQzdCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDL0MsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBN0lELDRCQTZJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBSZHNBdXJvcmEsIFJkc0luc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvZGF0YWJhc2VcIjtcbmltcG9ydCB7IFJkc0F1cm9yYUdsb2JhbCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL3Jkc0F1cm9yYUdsb2JhbFwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElWcGMsXG4gIHR5cGUgU3VibmV0U2VsZWN0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICB0eXBlIElJbnN0YW5jZUVuZ2luZSxcbiAgdHlwZSBJQ2x1c3RlckVuZ2luZSxcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICBEYXRhYmFzZUluc3RhbmNlRW5naW5lLFxuICBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24sXG4gIEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbixcbiAgUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxuICBNeXNxbEVuZ2luZVZlcnNpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IHR5cGUgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IHR5cGUgSUtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlRW5naW5lID0gXCJwb3N0Z3Jlc3FsXCIgfCBcIm15c3FsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5naW5lQ29uZmlnIHtcbiAgZGVmYXVsdFVzZXJuYW1lOiBzdHJpbmc7XG4gIHNzbFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJvdGF0aW9uQXBwTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgREFUQUJBU0VfRU5HSU5FX0NPTkZJRzogUmVjb3JkPFxuICBEYXRhYmFzZUVuZ2luZSxcbiAge1xuICAgIGF1cm9yYTogeyB2ZXJzaW9uOiBzdHJpbmc7IG1ham9yVmVyc2lvbjogc3RyaW5nIH07XG4gICAgaW5zdGFuY2U6IHsgdmVyc2lvbjogc3RyaW5nOyBtYWpvclZlcnNpb246IHN0cmluZyB9O1xuICAgIGRlZmF1bHRVc2VybmFtZTogc3RyaW5nO1xuICAgIHNzbFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgcm90YXRpb25BcHBOYW1lOiBzdHJpbmc7XG4gIH1cbj4gPSB7XG4gIHBvc3RncmVzcWw6IHtcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogXCIxNi42XCIsIG1ham9yVmVyc2lvbjogXCIxNlwiIH0sXG4gICAgaW5zdGFuY2U6IHsgdmVyc2lvbjogXCIxNy41XCIsIG1ham9yVmVyc2lvbjogXCIxN1wiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcInBvc3RncmVzXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICByb3RhdGlvbkFwcE5hbWU6IFwiU2VjcmV0c01hbmFnZXJSRFNQb3N0Z3JlU1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9LFxuICBteXNxbDoge1xuICAgIC8vIG1ham9yVmVyc2lvbiBtdXN0IGJlIEF1cm9yYSB2ZXJzaW9uICgzLjA4LjApLCBOT1QgTXlTUUwgdmVyc2lvbiAoOC4wKVxuICAgIGF1cm9yYTogeyB2ZXJzaW9uOiBcIjguMC5teXNxbF9hdXJvcmEuMy4wOC4wXCIsIG1ham9yVmVyc2lvbjogXCIzLjA4LjBcIiB9LFxuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IFwiOC40LjRcIiwgbWFqb3JWZXJzaW9uOiBcIjguNFwiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcImFkbWluXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyByZXF1aXJlX3NlY3VyZV90cmFuc3BvcnQ6IFwiT05cIiB9LFxuICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU015U1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9XG59O1xuXG5jb25zdCBBVVJPUkFfRU5HSU5FX0ZBQ1RPUklFUzogUmVjb3JkPERhdGFiYXNlRW5naW5lLCAoKSA9PiBJQ2x1c3RlckVuZ2luZT4gPSB7XG4gIHBvc3RncmVzcWw6ICgpID0+IHtcbiAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID0gREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5wb3N0Z3Jlc3FsLmF1cm9yYTtcbiAgICByZXR1cm4gRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYVBvc3RncmVzKHtcbiAgICAgIHZlcnNpb246IEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgfSk7XG4gIH0sXG4gIG15c3FsOiAoKSA9PiB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcubXlzcWwuYXVyb3JhO1xuICAgIHJldHVybiBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhTXlzcWwoe1xuICAgICAgdmVyc2lvbjogQXVyb3JhTXlzcWxFbmdpbmVWZXJzaW9uLm9mKHZlcnNpb24sIG1ham9yVmVyc2lvbilcbiAgICB9KTtcbiAgfVxufTtcblxuY29uc3QgSU5TVEFOQ0VfRU5HSU5FX0ZBQ1RPUklFUzogUmVjb3JkPERhdGFiYXNlRW5naW5lLCAoKSA9PiBJSW5zdGFuY2VFbmdpbmU+ID1cbiAge1xuICAgIHBvc3RncmVzcWw6ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgdmVyc2lvbiwgbWFqb3JWZXJzaW9uIH0gPVxuICAgICAgICBEQVRBQkFTRV9FTkdJTkVfQ09ORklHLnBvc3RncmVzcWwuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gRGF0YWJhc2VJbnN0YW5jZUVuZ2luZS5wb3N0Z3Jlcyh7XG4gICAgICAgIHZlcnNpb246IFBvc3RncmVzRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG15c3FsOiAoKSA9PiB7XG4gICAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID0gREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5teXNxbC5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBEYXRhYmFzZUluc3RhbmNlRW5naW5lLm15c3FsKHtcbiAgICAgICAgdmVyc2lvbjogTXlzcWxFbmdpbmVWZXJzaW9uLm9mKHZlcnNpb24sIG1ham9yVmVyc2lvbilcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF1cm9yYUNsdXN0ZXJFbmdpbmUoZW5naW5lOiBEYXRhYmFzZUVuZ2luZSk6IElDbHVzdGVyRW5naW5lIHtcbiAgcmV0dXJuIEFVUk9SQV9FTkdJTkVfRkFDVE9SSUVTW2VuZ2luZV0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbmNlRW5naW5lKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBJSW5zdGFuY2VFbmdpbmUge1xuICByZXR1cm4gSU5TVEFOQ0VfRU5HSU5FX0ZBQ1RPUklFU1tlbmdpbmVdKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmdpbmVDb25maWcoZW5naW5lOiBEYXRhYmFzZUVuZ2luZSk6IEVuZ2luZUNvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IERBVEFCQVNFX0VOR0lORV9DT05GSUdbZW5naW5lXTtcbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0VXNlcm5hbWU6IGNvbmZpZy5kZWZhdWx0VXNlcm5hbWUsXG4gICAgc3NsUGFyYW1ldGVyczogY29uZmlnLnNzbFBhcmFtZXRlcnMsXG4gICAgcm90YXRpb25BcHBOYW1lOiBjb25maWcucm90YXRpb25BcHBOYW1lXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlDb25maWcge1xuICBtYXhDb25uZWN0aW9ucz86IG51bWJlcjtcbiAgbWF4SWRsZUNvbm5lY3Rpb25zPzogbnVtYmVyO1xuICBjb25uZWN0aW9uQm9ycm93VGltZW91dD86IG51bWJlcjtcbiAgcmVxdWlyZVRMUz86IGJvb2xlYW47XG4gIHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFJlcGxpY2FDb25maWcge1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGVudGlhbHNDb25maWcge1xuICB1c2VybmFtZT86IHN0cmluZztcbiAgc2VjcmV0Um90YXRpb24/OiBTZWNyZXRSb3RhdGlvbkNvbmZpZyB8IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldFJvdGF0aW9uQ29uZmlnIHtcbiAgYXV0b21hdGljYWxseUFmdGVyPzogRHVyYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jcnlwdGlvbkNvbmZpZyB7XG4gIHN0b3JhZ2VLZXk/OiBFbmNyeXB0aW9uS2V5U3BlYztcbn1cblxuLyoqXG4gKiBWYWxpZCBQZXJmb3JtYW5jZSBJbnNpZ2h0cyByZXRlbnRpb24gcGVyaW9kcyBpbiBkYXlzLlxuICogLSA3OiBGcmVlIHRpZXIgKG5vIGNoYXJnZSlcbiAqIC0gMzE6IDEgbW9udGggKGRlZmF1bHQgZm9yIHBhaWQpXG4gKiAtIDkzOiAzIG1vbnRoc1xuICogLSAxODY6IDYgbW9udGhzXG4gKiAtIDM3MjogMSB5ZWFyXG4gKiAtIDczMTogMiB5ZWFycyAobWF4aW11bSlcbiAqL1xuZXhwb3J0IHR5cGUgUGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblBlcmlvZCA9IDcgfCAzMSB8IDkzIHwgMTg2IHwgMzcyIHwgNzMxO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcge1xuICBlbmNyeXB0aW9uS2V5PzogRW5jcnlwdGlvbktleVNwZWM7XG4gIC8qKiBSZXRlbnRpb24gcGVyaW9kIGluIGRheXMuIERlZmF1bHQ6IDMxICgxIG1vbnRoKS4gKi9cbiAgcmV0ZW50aW9uUGVyaW9kPzogUGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblBlcmlvZDtcbn1cblxuLyoqXG4gKiBNYXJrZXIgZm9yIEFXUyBtYW5hZ2VkIGVuY3J5cHRpb24ga2V5IChhd3MvcmRzLCBhd3MvczMsIGV0Yy4pXG4gKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGEgQ3VzdG9tZXIgTWFuYWdlZCBLZXkgd2hlbjpcbiAqIC0gQ29zdCBvcHRpbWl6YXRpb24gaXMgYSBwcmlvcml0eVxuICogLSBZb3UgZG9uJ3QgbmVlZCBjcm9zcy1hY2NvdW50IGFjY2Vzc1xuICogLSBZb3UgZG9uJ3QgbmVlZCBjdXN0b20ga2V5IHBvbGljaWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzTWFuYWdlZEtleSB7XG4gIHJlYWRvbmx5IGF3c01hbmFnZWQ6IHRydWU7XG59XG5cbi8qKlxuICogRW5jcnlwdGlvbiBrZXkgc3BlY2lmaWNhdGlvbiBmb3IgUkRTIHJlc291cmNlcy5cbiAqIC0gYElLZXlgOiBVc2UgYSBzcGVjaWZpYyBLTVMga2V5IHlvdSBjb250cm9sXG4gKiAtIGB7IGF3c01hbmFnZWQ6IHRydWUgfWA6IFVzZSBBV1MgbWFuYWdlZCBrZXkgKGF3cy9yZHMpIC0gY29zdC1lZmZlY3RpdmVcbiAqIC0gYHVuZGVmaW5lZGA6IEF1dG8tY3JlYXRlIGEgQ3VzdG9tZXIgTWFuYWdlZCBLZXkgKHNlY3VyZSBkZWZhdWx0KVxuICovXG5leHBvcnQgdHlwZSBFbmNyeXB0aW9uS2V5U3BlYyA9IElLZXkgfCBBd3NNYW5hZ2VkS2V5O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgdGhlIGVuY3J5cHRpb24ga2V5IHNwZWMgaXMgQVdTIG1hbmFnZWQuXG4gKiBAZXhhbXBsZVxuICogaWYgKGlzQXdzTWFuYWdlZEtleShwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5KSkge1xuICogICAvLyBVc2UgQVdTIG1hbmFnZWQga2V5XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0F3c01hbmFnZWRLZXkoXG4gIHNwZWM6IEVuY3J5cHRpb25LZXlTcGVjIHwgdW5kZWZpbmVkXG4pOiBzcGVjIGlzIEF3c01hbmFnZWRLZXkge1xuICByZXR1cm4gKFxuICAgIHNwZWMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBzcGVjID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJhd3NNYW5hZ2VkXCIgaW4gc3BlYyAmJlxuICAgIChzcGVjIGFzIEF3c01hbmFnZWRLZXkpLmF3c01hbmFnZWQgPT09IHRydWVcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZSBjb25zdGFudCBmb3Igc3BlY2lmeWluZyBBV1MgbWFuYWdlZCBlbmNyeXB0aW9uLlxuICogQGV4YW1wbGVcbiAqIGVuY3J5cHRpb246IHsgc3RvcmFnZUtleTogQVdTX01BTkFHRUQgfVxuICovXG5leHBvcnQgY29uc3QgQVdTX01BTkFHRUQ6IEF3c01hbmFnZWRLZXkgPSB7IGF3c01hbmFnZWQ6IHRydWUgfSBhcyBjb25zdDtcblxuLyoqXG4gKiAqKkRFU1RSVUNUSVZFKio6IENoYW5naW5nIGBzdG9yYWdlS2V5YCBhZnRlciBjbHVzdGVyIGNyZWF0aW9uIGNhdXNlcyBjbHVzdGVyIFJFUExBQ0VNRU5ULlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYUVuY3J5cHRpb25Db25maWcge1xuICAvKiogREVTVFJVQ1RJVkU6IENoYW5naW5nIGFmdGVyIGNyZWF0aW9uIGNhdXNlcyBjbHVzdGVyIHJlcGxhY2VtZW50ICovXG4gIHN0b3JhZ2VLZXk/OiBFbmNyeXB0aW9uS2V5U3BlYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXJvcmFSZWFkZXJDb25maWcge1xuICBzY2FsZVdpdGhXcml0ZXI/OiBib29sZWFuO1xuICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzPzogYm9vbGVhbjtcbiAgaWRlbnRpZmllclN1ZmZpeD86IHN0cmluZztcbiAgYXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXJvcmFXcml0ZXJDb25maWcge1xuICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzPzogYm9vbGVhbjtcbiAgaWRlbnRpZmllclN1ZmZpeD86IHN0cmluZztcbiAgYXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXJvcmFSZWFkZXJzQ29uZmlnIHtcbiAgLyoqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGluc3RhbmNlcyAqL1xuICBjb3VudD86IG51bWJlcjtcbiAgLyoqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGNvdW50ICovXG4gIGluc3RhbmNlcz86IEF1cm9yYVJlYWRlckNvbmZpZ1tdO1xuICBkZWZhdWx0RW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0cz86IGJvb2xlYW47XG59XG5cbnR5cGUgRGF0YWJhc2VUeXBlID0gXCJBdXJvcmFcIiB8IFwiSW5zdGFuY2VcIiB8IFwiR2xvYmFsQXVyb3JhXCI7XG5cbnR5cGUgQmFzZURhdGFiYXNlUHJvcHMgPSB7XG4gIHZwYzogSVZwYztcbiAgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVyb3JhRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJBdXJvcmFcIjtcbiAgZGF0YWJhc2VFbmdpbmU/OiBEYXRhYmFzZUVuZ2luZTtcbiAgLyoqIE92ZXJyaWRlcyBkYXRhYmFzZUVuZ2luZSBpZiBwcm92aWRlZCAqL1xuICBlbmdpbmU/OiBJQ2x1c3RlckVuZ2luZTtcbiAgd3JpdGVyPzogQXVyb3JhV3JpdGVyQ29uZmlnO1xuICByZWFkZXJzPzogQXVyb3JhUmVhZGVyc0NvbmZpZyB8IGZhbHNlO1xuICBwcm94eT86IFByb3h5Q29uZmlnIHwgZmFsc2U7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIC8qKiBERVNUUlVDVElWRTogQ2hhbmdpbmcgc3RvcmFnZUtleSBjYXVzZXMgY2x1c3RlciByZXBsYWNlbWVudCAqL1xuICBlbmNyeXB0aW9uPzogQXVyb3JhRW5jcnlwdGlvbkNvbmZpZztcbiAgYmFja3VwUmV0ZW50aW9uPzogbnVtYmVyO1xuICBtb25pdG9yaW5nSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c/OiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIHBlcmZvcm1hbmNlSW5zaWdodHM/OiBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHwgZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJHbG9iYWxBdXJvcmFcIjtcbiAgcHJpbWFyeVJlZ2lvbjogc3RyaW5nO1xuICBzZWNvbmRhcnlSZWdpb25zPzogc3RyaW5nW107XG4gIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyPzogc3RyaW5nO1xuICBlbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmc/OiBib29sZWFuO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICB3cml0ZXI/OiBBdXJvcmFXcml0ZXJDb25maWc7XG4gIHJlYWRlcnM/OiBBdXJvcmFSZWFkZXJzQ29uZmlnIHwgZmFsc2U7XG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgLyoqIERFU1RSVUNUSVZFOiBDaGFuZ2luZyBzdG9yYWdlS2V5IGNhdXNlcyBjbHVzdGVyIHJlcGxhY2VtZW50ICovXG4gIGVuY3J5cHRpb24/OiBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuICBiYWNrdXBSZXRlbnRpb24/OiBudW1iZXI7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgcGVyZm9ybWFuY2VJbnNpZ2h0cz86IFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnN0YW5jZURhdGFiYXNlUHJvcHMgZXh0ZW5kcyBCYXNlRGF0YWJhc2VQcm9wcyB7XG4gIHR5cGU6IFwiSW5zdGFuY2VcIjtcbiAgZGF0YWJhc2VFbmdpbmU/OiBEYXRhYmFzZUVuZ2luZTtcbiAgLyoqIE92ZXJyaWRlcyBkYXRhYmFzZUVuZ2luZSBpZiBwcm92aWRlZCAqL1xuICBlbmdpbmU/OiBJSW5zdGFuY2VFbmdpbmU7XG4gIGFsbG9jYXRlZFN0b3JhZ2U/OiBudW1iZXI7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIG11bHRpQXo/OiBib29sZWFuO1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICBwcm94eT86IFByb3h5Q29uZmlnIHwgZmFsc2U7XG4gIHJlYWRSZXBsaWNhPzogUmVhZFJlcGxpY2FDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25Db25maWc7XG59XG5cbmV4cG9ydCB0eXBlIElEYXRhYmFzZVByb3BzID1cbiAgfCBBdXJvcmFEYXRhYmFzZVByb3BzXG4gIHwgSW5zdGFuY2VEYXRhYmFzZVByb3BzXG4gIHwgR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wcztcblxuZXhwb3J0IGNsYXNzIERhdGFiYXNlRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZDxUIGV4dGVuZHMgSURhdGFiYXNlUHJvcHM+KGlkOiBzdHJpbmcsIHByb3BzOiBUKSB7XG4gICAgcmV0dXJuIChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YWJhc2VQcm9wcyA9IHtcbiAgICAgICAgLi4uKHByb3BzIGFzIGFueSksXG4gICAgICAgIHZwYzogKHByb3BzLnZwYyB8fCBhcHAuZ2V0RGVmYXVsdFZwYygpKSBhcyBJVnBjXG4gICAgICB9IGFzIFQ7XG4gICAgICByZXR1cm4gbmV3IERhdGFiYXNlKHNjb3BlLCBpZCwgZGF0YWJhc2VQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHVibGljIHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIHB1YmxpYyB2cGM6IElWcGM7XG5cbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGRhdGFiYXNlOiBSZHNBdXJvcmEgfCBSZHNJbnN0YW5jZSB8IFJkc0F1cm9yYUdsb2JhbDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSURhdGFiYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZTtcbiAgICB0aGlzLmFkZERhdGFiYXNlKHByb3BzKTtcbiAgfVxuXG4gIGFkZERhdGFiYXNlKHByb3BzOiBJRGF0YWJhc2VQcm9wcykge1xuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSBcIkF1cm9yYVwiOlxuICAgICAgICB0aGlzLmFkZEF1cm9yYShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkdsb2JhbEF1cm9yYVwiOlxuICAgICAgICB0aGlzLmFkZEF1cm9yYUdsb2JhbChwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkluc3RhbmNlXCI6XG4gICAgICAgIHRoaXMuYWRkUmRzSW5zdGFuY2UocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEV4aGF1c3RpdmVuZXNzIGNoZWNrXG4gICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IHByb3BzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGFiYXNlIHR5cGUgJHsocHJvcHMgYXMgYW55KS50eXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQXVyb3JhKHByb3BzOiBBdXJvcmFEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgQXVyb3JhIGRhdGFiYXNlXCIpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWREYXRhYmFzZUVuZ2luZSA9IHByb3BzLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiO1xuICAgIGNvbnN0IHJlc29sdmVkRW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSA/PyBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzQXVyb3JhKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIHdyaXRlcjogcHJvcHMud3JpdGVyLFxuICAgICAgcmVhZGVyczogcHJvcHMucmVhZGVycyxcbiAgICAgIHByb3h5OiBwcm9wcy5wcm94eSxcbiAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgICBiYWNrdXBSZXRlbnRpb246IHByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93LFxuICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHM6IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHNcbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYWRkQXVyb3JhR2xvYmFsKHByb3BzOiBHbG9iYWxBdXJvcmFEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWUEMgaXMgcmVxdWlyZWQgZm9yIEdsb2JhbCBBdXJvcmEgZGF0YWJhc2VcIik7XG4gICAgaWYgKCFwcm9wcy5wcmltYXJ5UmVnaW9uKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJpbWFyeVJlZ2lvbiBpcyByZXF1aXJlZCBmb3IgR2xvYmFsIEF1cm9yYSBkYXRhYmFzZVwiKTtcblxuICAgIGNvbnN0IHJlc29sdmVkRGF0YWJhc2VFbmdpbmUgPSBwcm9wcy5kYXRhYmFzZUVuZ2luZSA/PyBcInBvc3RncmVzcWxcIjtcbiAgICBjb25zdCByZXNvbHZlZEVuZ2luZSA9XG4gICAgICBwcm9wcy5lbmdpbmUgPz8gZ2V0QXVyb3JhQ2x1c3RlckVuZ2luZShyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcbiAgICBjb25zdCBlbmdpbmVDb25maWcgPSBnZXRFbmdpbmVDb25maWcocmVzb2x2ZWREYXRhYmFzZUVuZ2luZSk7XG5cbiAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFJkc0F1cm9yYUdsb2JhbChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmRzR2xvYmFsYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICBwcmltYXJ5UmVnaW9uOiBwcm9wcy5wcmltYXJ5UmVnaW9uLFxuICAgICAgICBzZWNvbmRhcnlSZWdpb25zOiBwcm9wcy5zZWNvbmRhcnlSZWdpb25zLFxuICAgICAgICBnbG9iYWxDbHVzdGVySWRlbnRpZmllcjogcHJvcHMuZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXIsXG4gICAgICAgIGVuZ2luZTogcmVzb2x2ZWRFbmdpbmUsXG4gICAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgICAgZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nOiBwcm9wcy5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcsXG4gICAgICAgIHdyaXRlcjogcHJvcHMud3JpdGVyLFxuICAgICAgICByZWFkZXJzOiBwcm9wcy5yZWFkZXJzLFxuICAgICAgICBwcm94eTogcHJvcHMucHJveHksXG4gICAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgICAgYmFja3VwUmV0ZW50aW9uOiBwcm9wcy5iYWNrdXBSZXRlbnRpb24sXG4gICAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzogcHJvcHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3csXG4gICAgICAgIHBvcnQ6IHByb3BzLnBvcnQsXG4gICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHM6IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHNcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZHNJbnN0YW5jZShwcm9wczogSW5zdGFuY2VEYXRhYmFzZVByb3BzKSB7XG4gICAgY29uc3QgcmVzb2x2ZWREYXRhYmFzZUVuZ2luZSA9IHByb3BzLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiO1xuICAgIGNvbnN0IHJlc29sdmVkRW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSA/PyBnZXRJbnN0YW5jZUVuZ2luZShyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcbiAgICBjb25zdCBlbmdpbmVDb25maWcgPSBnZXRFbmdpbmVDb25maWcocmVzb2x2ZWREYXRhYmFzZUVuZ2luZSk7XG5cbiAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFJkc0luc3RhbmNlKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGUsXG4gICAgICBhbGxvY2F0ZWRTdG9yYWdlOiBwcm9wcy5hbGxvY2F0ZWRTdG9yYWdlLFxuICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgIGVuZ2luZTogcmVzb2x2ZWRFbmdpbmUsXG4gICAgICBlbmdpbmVDb25maWcsXG4gICAgICBtdWx0aUF6OiBwcm9wcy5tdWx0aUF6LFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0czogcHJvcHMucGVyZm9ybWFuY2VJbnNpZ2h0cyxcbiAgICAgIHByb3h5OiBwcm9wcy5wcm94eSxcbiAgICAgIHJlYWRSZXBsaWNhOiBwcm9wcy5yZWFkUmVwbGljYSxcbiAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb25cbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldEhvc3RFbmRwb2ludCgpO1xuICB9XG5cbiAgZ2V0SG9zdFBvcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRIb3N0UG9ydCgpO1xuICB9XG5cbiAgZ2V0RGF0YWJhc2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VOYW1lO1xuICB9XG59XG4iXX0=
|
|
295
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZGQSx3REFFQztBQUVELDhDQUVDO0FBRUQsMENBT0M7QUFrREQsMENBU0M7QUFLRCx3Q0FTQztBQXJMRCwyQ0FBdUM7QUFHdkMsMkRBQXNFO0FBQ3RFLGtGQUErRTtBQVMvRSxpREFTNkI7QUFZaEIsUUFBQSxzQkFBc0IsR0FTL0I7SUFDRixVQUFVLEVBQUU7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUU7UUFDL0MsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSxVQUFVO1FBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDdkMsZUFBZSxFQUFFLDhDQUE4QztLQUNoRTtJQUNELEtBQUssRUFBRTtRQUNMLHdFQUF3RTtRQUN4RSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtRQUN0RSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7UUFDbkQsZUFBZSxFQUFFLE9BQU87UUFDeEIsYUFBYSxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSx5Q0FBeUM7S0FDM0Q7Q0FDRixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBaUQ7SUFDNUUsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUNmLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsOEJBQXNCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUMzRSxPQUFPLCtCQUFxQixDQUFDLGNBQWMsQ0FBQztZ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O1NBQzdDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDL0MsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBbkpELDRCQW1KQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBSZHNBdXJvcmEsIFJkc0luc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvZGF0YWJhc2VcIjtcbmltcG9ydCB7IFJkc0F1cm9yYUdsb2JhbCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL3Jkc0F1cm9yYUdsb2JhbFwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElWcGMsXG4gIHR5cGUgU3VibmV0U2VsZWN0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICB0eXBlIElJbnN0YW5jZUVuZ2luZSxcbiAgdHlwZSBJQ2x1c3RlckVuZ2luZSxcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICBEYXRhYmFzZUluc3RhbmNlRW5naW5lLFxuICBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24sXG4gIEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbixcbiAgUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxuICBNeXNxbEVuZ2luZVZlcnNpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IHR5cGUgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IHR5cGUgSUtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlRW5naW5lID0gXCJwb3N0Z3Jlc3FsXCIgfCBcIm15c3FsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5naW5lQ29uZmlnIHtcbiAgZGVmYXVsdFVzZXJuYW1lOiBzdHJpbmc7XG4gIHNzbFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJvdGF0aW9uQXBwTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgREFUQUJBU0VfRU5HSU5FX0NPTkZJRzogUmVjb3JkPFxuICBEYXRhYmFzZUVuZ2luZSxcbiAge1xuICAgIGF1cm9yYTogeyB2ZXJzaW9uOiBzdHJpbmc7IG1ham9yVmVyc2lvbjogc3RyaW5nIH07XG4gICAgaW5zdGFuY2U6IHsgdmVyc2lvbjogc3RyaW5nOyBtYWpvclZlcnNpb246IHN0cmluZyB9O1xuICAgIGRlZmF1bHRVc2VybmFtZTogc3RyaW5nO1xuICAgIHNzbFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgcm90YXRpb25BcHBOYW1lOiBzdHJpbmc7XG4gIH1cbj4gPSB7XG4gIHBvc3RncmVzcWw6IHtcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogXCIxNi42XCIsIG1ham9yVmVyc2lvbjogXCIxNlwiIH0sXG4gICAgaW5zdGFuY2U6IHsgdmVyc2lvbjogXCIxNy41XCIsIG1ham9yVmVyc2lvbjogXCIxN1wiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcInBvc3RncmVzXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICByb3RhdGlvbkFwcE5hbWU6IFwiU2VjcmV0c01hbmFnZXJSRFNQb3N0Z3JlU1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9LFxuICBteXNxbDoge1xuICAgIC8vIG1ham9yVmVyc2lvbiBtdXN0IGJlIEF1cm9yYSB2ZXJzaW9uICgzLjA4LjApLCBOT1QgTXlTUUwgdmVyc2lvbiAoOC4wKVxuICAgIGF1cm9yYTogeyB2ZXJzaW9uOiBcIjguMC5teXNxbF9hdXJvcmEuMy4wOC4wXCIsIG1ham9yVmVyc2lvbjogXCIzLjA4LjBcIiB9LFxuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IFwiOC40LjRcIiwgbWFqb3JWZXJzaW9uOiBcIjguNFwiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcImFkbWluXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyByZXF1aXJlX3NlY3VyZV90cmFuc3BvcnQ6IFwiT05cIiB9LFxuICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU015U1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9XG59O1xuXG5jb25zdCBBVVJPUkFfRU5HSU5FX0ZBQ1RPUklFUzogUmVjb3JkPERhdGFiYXNlRW5naW5lLCAoKSA9PiBJQ2x1c3RlckVuZ2luZT4gPSB7XG4gIHBvc3RncmVzcWw6ICgpID0+IHtcbiAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID0gREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5wb3N0Z3Jlc3FsLmF1cm9yYTtcbiAgICByZXR1cm4gRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYVBvc3RncmVzKHtcbiAgICAgIHZlcnNpb246IEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgfSk7XG4gIH0sXG4gIG15c3FsOiAoKSA9PiB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcubXlzcWwuYXVyb3JhO1xuICAgIHJldHVybiBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhTXlzcWwoe1xuICAgICAgdmVyc2lvbjogQXVyb3JhTXlzcWxFbmdpbmVWZXJzaW9uLm9mKHZlcnNpb24sIG1ham9yVmVyc2lvbilcbiAgICB9KTtcbiAgfVxufTtcblxuY29uc3QgSU5TVEFOQ0VfRU5HSU5FX0ZBQ1RPUklFUzogUmVjb3JkPERhdGFiYXNlRW5naW5lLCAoKSA9PiBJSW5zdGFuY2VFbmdpbmU+ID1cbiAge1xuICAgIHBvc3RncmVzcWw6ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgdmVyc2lvbiwgbWFqb3JWZXJzaW9uIH0gPVxuICAgICAgICBEQVRBQkFTRV9FTkdJTkVfQ09ORklHLnBvc3RncmVzcWwuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gRGF0YWJhc2VJbnN0YW5jZUVuZ2luZS5wb3N0Z3Jlcyh7XG4gICAgICAgIHZlcnNpb246IFBvc3RncmVzRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG15c3FsOiAoKSA9PiB7XG4gICAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID0gREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5teXNxbC5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBEYXRhYmFzZUluc3RhbmNlRW5naW5lLm15c3FsKHtcbiAgICAgICAgdmVyc2lvbjogTXlzcWxFbmdpbmVWZXJzaW9uLm9mKHZlcnNpb24sIG1ham9yVmVyc2lvbilcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF1cm9yYUNsdXN0ZXJFbmdpbmUoZW5naW5lOiBEYXRhYmFzZUVuZ2luZSk6IElDbHVzdGVyRW5naW5lIHtcbiAgcmV0dXJuIEFVUk9SQV9FTkdJTkVfRkFDVE9SSUVTW2VuZ2luZV0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbmNlRW5naW5lKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBJSW5zdGFuY2VFbmdpbmUge1xuICByZXR1cm4gSU5TVEFOQ0VfRU5HSU5FX0ZBQ1RPUklFU1tlbmdpbmVdKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmdpbmVDb25maWcoZW5naW5lOiBEYXRhYmFzZUVuZ2luZSk6IEVuZ2luZUNvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IERBVEFCQVNFX0VOR0lORV9DT05GSUdbZW5naW5lXTtcbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0VXNlcm5hbWU6IGNvbmZpZy5kZWZhdWx0VXNlcm5hbWUsXG4gICAgc3NsUGFyYW1ldGVyczogY29uZmlnLnNzbFBhcmFtZXRlcnMsXG4gICAgcm90YXRpb25BcHBOYW1lOiBjb25maWcucm90YXRpb25BcHBOYW1lXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlDb25maWcge1xuICBtYXhDb25uZWN0aW9ucz86IG51bWJlcjtcbiAgbWF4SWRsZUNvbm5lY3Rpb25zPzogbnVtYmVyO1xuICBjb25uZWN0aW9uQm9ycm93VGltZW91dD86IG51bWJlcjtcbiAgcmVxdWlyZVRMUz86IGJvb2xlYW47XG4gIHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFJlcGxpY2FDb25maWcge1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGVudGlhbHNDb25maWcge1xuICB1c2VybmFtZT86IHN0cmluZztcbiAgc2VjcmV0Um90YXRpb24/OiBTZWNyZXRSb3RhdGlvbkNvbmZpZyB8IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldFJvdGF0aW9uQ29uZmlnIHtcbiAgYXV0b21hdGljYWxseUFmdGVyPzogRHVyYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jcnlwdGlvbkNvbmZpZyB7XG4gIHN0b3JhZ2VLZXk/OiBFbmNyeXB0aW9uS2V5U3BlYztcbn1cblxuZXhwb3J0IHR5cGUgUGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblBlcmlvZCA9IDcgfCAzMSB8IDkzIHwgMTg2IHwgMzcyIHwgNzMxO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcge1xuICBlbmNyeXB0aW9uS2V5PzogRW5jcnlwdGlvbktleVNwZWM7XG4gIC8qKiBSZXRlbnRpb24gcGVyaW9kIGluIGRheXMuIERlZmF1bHQ6IDMxICgxIG1vbnRoKS4gKi9cbiAgcmV0ZW50aW9uUGVyaW9kPzogUGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblBlcmlvZDtcbn1cblxuLy8gTWFya2VyIGZvciBBV1MgbWFuYWdlZCBlbmNyeXB0aW9uIGtleSAoYXdzL3JkcywgYXdzL3MzLCBldGMuKVxuZXhwb3J0IGludGVyZmFjZSBBd3NNYW5hZ2VkS2V5IHtcbiAgcmVhZG9ubHkgYXdzTWFuYWdlZDogdHJ1ZTtcbn1cblxuLy8gTWFya2VyIGZvciBleHBsaWNpdGx5IHJlcXVlc3RpbmcgYSBDdXN0b21lciBNYW5hZ2VkIEtleSAoQ01LKS5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tZXJNYW5hZ2VkS2V5TWFya2VyIHtcbiAgcmVhZG9ubHkgdXNlQ01LOiB0cnVlO1xufVxuXG4vLyBFbmNyeXB0aW9uIGtleSBzcGVjaWZpY2F0aW9uIGZvciBSRFMgcmVzb3VyY2VzLlxuZXhwb3J0IHR5cGUgRW5jcnlwdGlvbktleVNwZWMgPSBJS2V5IHwgQXdzTWFuYWdlZEtleSB8IEN1c3RvbWVyTWFuYWdlZEtleU1hcmtlcjtcblxuLy8gVHlwZSBndWFyZCB0byBjaGVjayBpZiB0aGUgZW5jcnlwdGlvbiBrZXkgc3BlYyBpcyBBV1MgbWFuYWdlZC5cbmV4cG9ydCBmdW5jdGlvbiBpc0F3c01hbmFnZWRLZXkoXG4gIHNwZWM6IEVuY3J5cHRpb25LZXlTcGVjIHwgdW5kZWZpbmVkXG4pOiBzcGVjIGlzIEF3c01hbmFnZWRLZXkge1xuICByZXR1cm4gKFxuICAgIHNwZWMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBzcGVjID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJhd3NNYW5hZ2VkXCIgaW4gc3BlYyAmJlxuICAgIChzcGVjIGFzIEF3c01hbmFnZWRLZXkpLmF3c01hbmFnZWQgPT09IHRydWVcbiAgKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIENNSyBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ01LUmVxdWVzdGVkKFxuICBzcGVjOiBFbmNyeXB0aW9uS2V5U3BlYyB8IHVuZGVmaW5lZFxuKTogc3BlYyBpcyBDdXN0b21lck1hbmFnZWRLZXlNYXJrZXIge1xuICByZXR1cm4gKFxuICAgIHNwZWMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBzcGVjID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJ1c2VDTUtcIiBpbiBzcGVjICYmXG4gICAgKHNwZWMgYXMgQ3VzdG9tZXJNYW5hZ2VkS2V5TWFya2VyKS51c2VDTUsgPT09IHRydWVcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZSBjb25zdGFudCBmb3Igc3BlY2lmeWluZyBBV1MgbWFuYWdlZCBlbmNyeXB0aW9uICh0aGUgZGVmYXVsdCkuXG4gKiBAZXhhbXBsZVxuICogZW5jcnlwdGlvbjogeyBzdG9yYWdlS2V5OiBBV1NfTUFOQUdFRCB9XG4gKi9cbmV4cG9ydCBjb25zdCBBV1NfTUFOQUdFRDogQXdzTWFuYWdlZEtleSA9IHsgYXdzTWFuYWdlZDogdHJ1ZSB9IGFzIGNvbnN0O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGNvbnN0YW50IGZvciBleHBsaWNpdGx5IHJlcXVlc3RpbmcgQ01LLlxuICogQGV4YW1wbGVcbiAqIGVuY3J5cHRpb246IHsgc3RvcmFnZUtleTogVVNFX0NNSyB9XG4gKi9cbmV4cG9ydCBjb25zdCBVU0VfQ01LOiBDdXN0b21lck1hbmFnZWRLZXlNYXJrZXIgPSB7IHVzZUNNSzogdHJ1ZSB9IGFzIGNvbnN0O1xuXG4vKipcbiAqICoqREVTVFJVQ1RJVkUqKjogQ2hhbmdpbmcgYHN0b3JhZ2VLZXlgIGFmdGVyIGNsdXN0ZXIgY3JlYXRpb24gY2F1c2VzIGNsdXN0ZXIgUkVQTEFDRU1FTlQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXVyb3JhRW5jcnlwdGlvbkNvbmZpZyB7XG4gIC8qKiBERVNUUlVDVElWRTogQ2hhbmdpbmcgYWZ0ZXIgY3JlYXRpb24gY2F1c2VzIGNsdXN0ZXIgcmVwbGFjZW1lbnQgKi9cbiAgc3RvcmFnZUtleT86IEVuY3J5cHRpb25LZXlTcGVjO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYVJlYWRlckNvbmZpZyB7XG4gIHNjYWxlV2l0aFdyaXRlcj86IGJvb2xlYW47XG4gIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM/OiBib29sZWFuO1xuICBpZGVudGlmaWVyU3VmZml4Pzogc3RyaW5nO1xuICBhdmFpbGFiaWxpdHlab25lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYVdyaXRlckNvbmZpZyB7XG4gIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM/OiBib29sZWFuO1xuICBpZGVudGlmaWVyU3VmZml4Pzogc3RyaW5nO1xuICBhdmFpbGFiaWxpdHlab25lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYVJlYWRlcnNDb25maWcge1xuICAvKiogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggaW5zdGFuY2VzICovXG4gIGNvdW50PzogbnVtYmVyO1xuICAvKiogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggY291bnQgKi9cbiAgaW5zdGFuY2VzPzogQXVyb3JhUmVhZGVyQ29uZmlnW107XG4gIGRlZmF1bHRFbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzPzogYm9vbGVhbjtcbn1cblxudHlwZSBEYXRhYmFzZVR5cGUgPSBcIkF1cm9yYVwiIHwgXCJJbnN0YW5jZVwiIHwgXCJHbG9iYWxBdXJvcmFcIjtcblxuLyoqXG4gKiBCYXNlIHByb3BzIGZvciBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICovXG50eXBlIEJhc2VEYXRhYmFzZVByb3BzID0ge1xuICB2cGM/OiBJVnBjO1xuICBkYXRhYmFzZU5hbWU6IHN0cmluZztcbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBdXJvcmFEYXRhYmFzZVByb3BzIGV4dGVuZHMgQmFzZURhdGFiYXNlUHJvcHMge1xuICB0eXBlOiBcIkF1cm9yYVwiO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICB3cml0ZXI/OiBBdXJvcmFXcml0ZXJDb25maWc7XG4gIHJlYWRlcnM/OiBBdXJvcmFSZWFkZXJzQ29uZmlnIHwgZmFsc2U7XG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgLyoqIERFU1RSVUNUSVZFOiBDaGFuZ2luZyBzdG9yYWdlS2V5IGNhdXNlcyBjbHVzdGVyIHJlcGxhY2VtZW50ICovXG4gIGVuY3J5cHRpb24/OiBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuICBiYWNrdXBSZXRlbnRpb24/OiBudW1iZXI7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgcGVyZm9ybWFuY2VJbnNpZ2h0cz86IFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGNsdXN0ZXIgc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxBdXJvcmFEYXRhYmFzZVByb3BzIGV4dGVuZHMgQmFzZURhdGFiYXNlUHJvcHMge1xuICB0eXBlOiBcIkdsb2JhbEF1cm9yYVwiO1xuICBwcmltYXJ5UmVnaW9uOiBzdHJpbmc7XG4gIHNlY29uZGFyeVJlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIGVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZz86IGJvb2xlYW47XG4gIGRhdGFiYXNlRW5naW5lPzogRGF0YWJhc2VFbmdpbmU7XG4gIC8qKiBPdmVycmlkZXMgZGF0YWJhc2VFbmdpbmUgaWYgcHJvdmlkZWQgKi9cbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICAvKiogREVTVFJVQ1RJVkU6IENoYW5naW5nIHN0b3JhZ2VLZXkgY2F1c2VzIGNsdXN0ZXIgcmVwbGFjZW1lbnQgKi9cbiAgZW5jcnlwdGlvbj86IEF1cm9yYUVuY3J5cHRpb25Db25maWc7XG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgY2x1c3RlciBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJJbnN0YW5jZVwiO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElJbnN0YW5jZUVuZ2luZTtcbiAgYWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgcG9ydD86IG51bWJlcjtcbiAgbXVsdGlBej86IGJvb2xlYW47XG4gIHBlcmZvcm1hbmNlSW5zaWdodHM/OiBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHwgZmFsc2U7XG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgcmVhZFJlcGxpY2E/OiBSZWFkUmVwbGljYUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICBlbmNyeXB0aW9uPzogRW5jcnlwdGlvbkNvbmZpZztcbiAgcHVibGljbHlBY2Nlc3NpYmxlPzogYm9vbGVhbjtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGluc3RhbmNlIHNuYXBzaG90IHRvIHJlc3RvcmUgZnJvbSAqL1xuICBzbmFwc2hvdElkZW50aWZpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIElEYXRhYmFzZVByb3BzID1cbiAgfCBBdXJvcmFEYXRhYmFzZVByb3BzXG4gIHwgSW5zdGFuY2VEYXRhYmFzZVByb3BzXG4gIHwgR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgZGF0YWJhc2UgcHJvcHMgYW5kIGxvZ3Mgd2FybmluZ3MgZm9yIGlnbm9yZWQgb3IgbWlzY29uZmlndXJlZCBvcHRpb25zLlxuICogVGhlc2UgY2hlY2tzIGhlbHAgY2F0Y2ggaXNzdWVzIHdoZW4gcHJvcHMgY29tZSBmcm9tIGR5bmFtaWMgc291cmNlcyB3aGVyZVxuICogVHlwZVNjcmlwdCdzIGNvbXBpbGUtdGltZSBjaGVja3MgbWF5IG5vdCBhcHBseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEYXRhYmFzZVByb3BzKHByb3BzOiBJRGF0YWJhc2VQcm9wcyk6IHZvaWQge1xuICBjb25zdCBwcm9wc0FueSA9IHByb3BzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLy8gR2xvYmFsQXVyb3JhIHJlcXVpcmVzIHByaW1hcnlSZWdpb25cbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiR2xvYmFsQXVyb3JhXCIgJiYgIXByb3BzLnByaW1hcnlSZWdpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkdsb2JhbEF1cm9yYSBkYXRhYmFzZSByZXF1aXJlcyAncHJpbWFyeVJlZ2lvbicuIFwiICtcbiAgICAgICAgXCJTcGVjaWZ5IHRoZSBBV1MgcmVnaW9uIHdoZXJlIHRoZSBwcmltYXJ5IGNsdXN0ZXIgd2lsbCBiZSBjcmVhdGVkLlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdhcm4gYWJvdXQgSW5zdGFuY2Utb25seSBvcHRpb25zIG9uIEF1cm9yYS9HbG9iYWxBdXJvcmFcbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiQXVyb3JhXCIgfHwgcHJvcHMudHlwZSA9PT0gXCJHbG9iYWxBdXJvcmFcIikge1xuICAgIGlmIChcInJlYWRSZXBsaWNhXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkucmVhZFJlcGxpY2EgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAncmVhZFJlcGxpY2EnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gZGF0YWJhc2VzLiBgICtcbiAgICAgICAgICBcIlVzZSAncmVhZGVycycgY29uZmlndXJhdGlvbiBmb3IgQXVyb3JhIHJlYWQgc2NhbGluZy5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwibXVsdGlBelwiIGluIHByb3BzQW55ICYmIHByb3BzQW55Lm11bHRpQXogIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnbXVsdGlBeicgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBkYXRhYmFzZXMuIGAgK1xuICAgICAgICAgIFwiQXVyb3JhIHByb3ZpZGVzIGF1dG9tYXRpYyBtdWx0aS1BWiByZXBsaWNhdGlvbi5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgXCJhbGxvY2F0ZWRTdG9yYWdlXCIgaW4gcHJvcHNBbnkgJiZcbiAgICAgIHByb3BzQW55LmFsbG9jYXRlZFN0b3JhZ2UgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnYWxsb2NhdGVkU3RvcmFnZScgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBkYXRhYmFzZXMuIGAgK1xuICAgICAgICAgIFwiQXVyb3JhIHVzZXMgYXV0b21hdGljIHN0b3JhZ2Ugc2NhbGluZy5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBXYXJuIGFib3V0IEF1cm9yYS1vbmx5IG9wdGlvbnMgb24gSW5zdGFuY2VcbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiSW5zdGFuY2VcIikge1xuICAgIGlmIChcInJlYWRlcnNcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5yZWFkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbRmphbGxdIFdhcm5pbmc6ICdyZWFkZXJzJyBpcyBpZ25vcmVkIGZvciBJbnN0YW5jZSBkYXRhYmFzZXMuIFwiICtcbiAgICAgICAgICBcIlVzZSAncmVhZFJlcGxpY2EnIGNvbmZpZ3VyYXRpb24gZm9yIFJEUyBJbnN0YW5jZSByZWFkIHNjYWxpbmcuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcIndyaXRlclwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LndyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0ZqYWxsXSBXYXJuaW5nOiAnd3JpdGVyJyBpcyBpZ25vcmVkIGZvciBJbnN0YW5jZSBkYXRhYmFzZXMuIFwiICtcbiAgICAgICAgICBcIldyaXRlciBjb25maWd1cmF0aW9uIG9ubHkgYXBwbGllcyB0byBBdXJvcmEgY2x1c3RlcnMuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIFwiYmFja3VwUmV0ZW50aW9uXCIgaW4gcHJvcHNBbnkgJiZcbiAgICAgIHByb3BzQW55LmJhY2t1cFJldGVudGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0ZqYWxsXSBXYXJuaW5nOiAnYmFja3VwUmV0ZW50aW9uJyBpbiBkYXlzIGZvcm1hdCBpcyBBdXJvcmEtc3BlY2lmaWMuIFwiICtcbiAgICAgICAgICBcIkZvciBSRFMgSW5zdGFuY2UsIGJhY2t1cCByZXRlbnRpb24gaXMgY29uZmlndXJlZCB2aWEgRHVyYXRpb24gaW4gdGhlIGNvbnN0cnVjdC5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBXYXJuIGFib3V0IEdsb2JhbEF1cm9yYS1vbmx5IG9wdGlvbnMgb24gbm9uLWdsb2JhbCBkYXRhYmFzZXNcbiAgaWYgKHByb3BzLnR5cGUgIT09IFwiR2xvYmFsQXVyb3JhXCIpIHtcbiAgICBpZiAoXCJwcmltYXJ5UmVnaW9uXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkucHJpbWFyeVJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdwcmltYXJ5UmVnaW9uJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGRhdGFiYXNlcy4gYCArXG4gICAgICAgICAgXCJSZWdpb24gY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gR2xvYmFsQXVyb3JhLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBcInNlY29uZGFyeVJlZ2lvbnNcIiBpbiBwcm9wc0FueSAmJlxuICAgICAgcHJvcHNBbnkuc2Vjb25kYXJ5UmVnaW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdzZWNvbmRhcnlSZWdpb25zJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGRhdGFiYXNlcy4gYCArXG4gICAgICAgICAgXCJNdWx0aS1yZWdpb24gY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gR2xvYmFsQXVyb3JhLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBcImVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZ1wiIGluIHByb3BzQW55ICYmXG4gICAgICBwcm9wc0FueS5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGRhdGFiYXNlcy4gYCArXG4gICAgICAgICAgXCJXcml0ZSBmb3J3YXJkaW5nIG9ubHkgYXBwbGllcyB0byBHbG9iYWxBdXJvcmEuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQ8VCBleHRlbmRzIElEYXRhYmFzZVByb3BzPihpZDogc3RyaW5nLCBwcm9wczogVCkge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHZhbGlkYXRlRGF0YWJhc2VQcm9wcyhwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGRhdGFiYXNlUHJvcHMgPSB7XG4gICAgICAgIC4uLihwcm9wcyBhcyBhbnkpLFxuICAgICAgICB2cGM6IChwcm9wcy52cGMgfHwgYXBwLmdldFZwYygpKSBhcyBJVnBjXG4gICAgICB9IGFzIFQ7XG4gICAgICByZXR1cm4gbmV3IERhdGFiYXNlKHNjb3BlLCBpZCwgZGF0YWJhc2VQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHVibGljIHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIHB1YmxpYyB2cGM6IElWcGM7XG5cbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGRhdGFiYXNlOiBSZHNBdXJvcmEgfCBSZHNJbnN0YW5jZSB8IFJkc0F1cm9yYUdsb2JhbDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSURhdGFiYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZTtcbiAgICB0aGlzLmFkZERhdGFiYXNlKHByb3BzKTtcbiAgfVxuXG4gIGFkZERhdGFiYXNlKHByb3BzOiBJRGF0YWJhc2VQcm9wcykge1xuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSBcIkF1cm9yYVwiOlxuICAgICAgICB0aGlzLmFkZEF1cm9yYShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkdsb2JhbEF1cm9yYVwiOlxuICAgICAgICB0aGlzLmFkZEF1cm9yYUdsb2JhbChwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkluc3RhbmNlXCI6XG4gICAgICAgIHRoaXMuYWRkUmRzSW5zdGFuY2UocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEV4aGF1c3RpdmVuZXNzIGNoZWNrXG4gICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IHByb3BzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGFiYXNlIHR5cGUgJHsocHJvcHMgYXMgYW55KS50eXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQXVyb3JhKHByb3BzOiBBdXJvcmFEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgQXVyb3JhIGRhdGFiYXNlXCIpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWREYXRhYmFzZUVuZ2luZSA9IHByb3BzLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiO1xuICAgIGNvbnN0IHJlc29sdmVkRW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSA/PyBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzQXVyb3JhKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIHdyaXRlcjogcHJvcHMud3JpdGVyLFxuICAgICAgcmVhZGVyczogcHJvcHMucmVhZGVycyxcbiAgICAgIHByb3h5OiBwcm9wcy5wcm94eSxcbiAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgICBiYWNrdXBSZXRlbnRpb246IHByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93LFxuICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHM6IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMsXG4gICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllclxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBdXJvcmFHbG9iYWwocHJvcHM6IEdsb2JhbEF1cm9yYURhdGFiYXNlUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnZwYylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgR2xvYmFsIEF1cm9yYSBkYXRhYmFzZVwiKTtcbiAgICBpZiAoIXByb3BzLnByaW1hcnlSZWdpb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcmltYXJ5UmVnaW9uIGlzIHJlcXVpcmVkIGZvciBHbG9iYWwgQXVyb3JhIGRhdGFiYXNlXCIpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWREYXRhYmFzZUVuZ2luZSA9IHByb3BzLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiO1xuICAgIGNvbnN0IHJlc29sdmVkRW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSA/PyBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzQXVyb3JhR2xvYmFsKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNHbG9iYWxgLFxuICAgICAge1xuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICAgIHByaW1hcnlSZWdpb246IHByb3BzLnByaW1hcnlSZWdpb24sXG4gICAgICAgIHNlY29uZGFyeVJlZ2lvbnM6IHByb3BzLnNlY29uZGFyeVJlZ2lvbnMsXG4gICAgICAgIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyOiBwcm9wcy5nbG9iYWxDbHVzdGVySWRlbnRpZmllcixcbiAgICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgICAgZW5naW5lQ29uZmlnLFxuICAgICAgICBlbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmc6IHByb3BzLmVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZyxcbiAgICAgICAgd3JpdGVyOiBwcm9wcy53cml0ZXIsXG4gICAgICAgIHJlYWRlcnM6IHByb3BzLnJlYWRlcnMsXG4gICAgICAgIHByb3h5OiBwcm9wcy5wcm94eSxcbiAgICAgICAgY3JlZGVudGlhbHM6IHByb3BzLmNyZWRlbnRpYWxzLFxuICAgICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgICAgICBiYWNrdXBSZXRlbnRpb246IHByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgICAgbW9uaXRvcmluZ0ludGVydmFsOiBwcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwsXG4gICAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OiBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyxcbiAgICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0czogcHJvcHMucGVyZm9ybWFuY2VJbnNpZ2h0cyxcbiAgICAgICAgc25hcHNob3RJZGVudGlmaWVyOiBwcm9wcy5zbmFwc2hvdElkZW50aWZpZXJcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZHNJbnN0YW5jZShwcm9wczogSW5zdGFuY2VEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgSW5zdGFuY2UgZGF0YWJhc2VcIik7XG5cbiAgICBjb25zdCByZXNvbHZlZERhdGFiYXNlRW5naW5lID0gcHJvcHMuZGF0YWJhc2VFbmdpbmUgPz8gXCJwb3N0Z3Jlc3FsXCI7XG4gICAgY29uc3QgcmVzb2x2ZWRFbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lID8/IGdldEluc3RhbmNlRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzSW5zdGFuY2UodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJkc2AsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSxcbiAgICAgIGFsbG9jYXRlZFN0b3JhZ2U6IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2UsXG4gICAgICBwb3J0OiBwcm9wcy5wb3J0LFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIG11bHRpQXo6IHByb3BzLm11bHRpQXosXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzOiBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzLFxuICAgICAgcHJveHk6IHByb3BzLnByb3h5LFxuICAgICAgcmVhZFJlcGxpY2E6IHByb3BzLnJlYWRSZXBsaWNhLFxuICAgICAgY3JlZGVudGlhbHM6IHByb3BzLmNyZWRlbnRpYWxzLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlLFxuICAgICAgc25hcHNob3RJZGVudGlmaWVyOiBwcm9wcy5zbmFwc2hvdElkZW50aWZpZXJcbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldEhvc3RFbmRwb2ludCgpO1xuICB9XG5cbiAgZ2V0SG9zdFBvcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRIb3N0UG9ydCgpO1xuICB9XG5cbiAgZ2V0RGF0YWJhc2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VOYW1lO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BlockDevice, IMachineImage, IVpc, SubnetType, UserData, SecurityGroup, IConnectable, Connections } from "aws-cdk-lib/aws-ec2";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { StackProps } from "aws-cdk-lib";
|
|
4
|
+
import { Role } from "aws-cdk-lib/aws-iam";
|
|
5
|
+
import { KeyValue } from "../../types";
|
|
6
|
+
interface ExistingVpcConfig {
|
|
7
|
+
vpcId?: string;
|
|
8
|
+
subnetType?: SubnetType;
|
|
9
|
+
}
|
|
10
|
+
interface NewVpcConfig {
|
|
11
|
+
subnetType: SubnetType;
|
|
12
|
+
}
|
|
13
|
+
export type VpcProps = ExistingVpcConfig | NewVpcConfig;
|
|
14
|
+
interface Ec2InstanceProps extends StackProps {
|
|
15
|
+
spotCapacityPercentage?: number;
|
|
16
|
+
blockDevices?: BlockDevice[];
|
|
17
|
+
accountId?: string;
|
|
18
|
+
serviceName: string;
|
|
19
|
+
vpc: VpcProps;
|
|
20
|
+
minCapcity?: number;
|
|
21
|
+
maxCapacity?: number;
|
|
22
|
+
instanceType: string;
|
|
23
|
+
machineImage?: IMachineImage;
|
|
24
|
+
userData?: UserData;
|
|
25
|
+
role?: Role;
|
|
26
|
+
enableSSH?: boolean;
|
|
27
|
+
tags: KeyValue;
|
|
28
|
+
}
|
|
29
|
+
export declare class Ec2Instance extends Construct implements IConnectable {
|
|
30
|
+
private launchTemplate;
|
|
31
|
+
vpc: IVpc;
|
|
32
|
+
asgSecurityGroup: SecurityGroup;
|
|
33
|
+
private autoScalingGroup;
|
|
34
|
+
private keyPair;
|
|
35
|
+
constructor(scope: Construct, id: string, props: Ec2InstanceProps);
|
|
36
|
+
connections: Connections;
|
|
37
|
+
addVpc(props: Ec2InstanceProps): void;
|
|
38
|
+
addKeyPair(props: Ec2InstanceProps): void;
|
|
39
|
+
addLaunchTemplate(props: Ec2InstanceProps): void;
|
|
40
|
+
addAutoScalingGroup(props: Ec2InstanceProps): void;
|
|
41
|
+
suspendAutoScaling(): void;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Ec2Instance = void 0;
|
|
4
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
5
|
+
const constructs_1 = require("constructs");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const tagResource_1 = require("../../utils/tagResource");
|
|
8
|
+
const aws_autoscaling_1 = require("aws-cdk-lib/aws-autoscaling");
|
|
9
|
+
const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
|
|
10
|
+
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
11
|
+
const vpc_1 = require("../../resources/aws/networking/vpc");
|
|
12
|
+
class Ec2Instance extends constructs_1.Construct {
|
|
13
|
+
constructor(scope, id, props) {
|
|
14
|
+
super(scope, id);
|
|
15
|
+
this.addVpc(props);
|
|
16
|
+
if (props.enableSSH) {
|
|
17
|
+
this.addKeyPair(props);
|
|
18
|
+
}
|
|
19
|
+
this.addLaunchTemplate(props);
|
|
20
|
+
this.addAutoScalingGroup(props);
|
|
21
|
+
this.suspendAutoScaling();
|
|
22
|
+
//TODO: Add load balancer as boolean prop, then configure load balancer
|
|
23
|
+
}
|
|
24
|
+
addVpc(props) {
|
|
25
|
+
if ("vpcId" in props.vpc) {
|
|
26
|
+
this.vpc = vpc_1.Vpc.fromLookup(this, `${props.serviceName}Vpc`, {
|
|
27
|
+
vpcId: props.vpc.vpcId
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.vpc = new vpc_1.Vpc(this, `${props.serviceName}Vpc`, {
|
|
32
|
+
accountId: props.accountId,
|
|
33
|
+
tags: props.tags,
|
|
34
|
+
subnetConfiguration: [
|
|
35
|
+
{
|
|
36
|
+
name: `${props.serviceName}`,
|
|
37
|
+
subnetType: props.vpc.subnetType || aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
addKeyPair(props) {
|
|
44
|
+
// TODO: Breakout into a seperate construct for use with better prop handling
|
|
45
|
+
this.keyPair = new aws_ec2_1.KeyPair(this, "KeyPair", {
|
|
46
|
+
keyPairName: `${props.serviceName}KeyPair`
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
addLaunchTemplate(props) {
|
|
50
|
+
this.asgSecurityGroup = new aws_ec2_1.SecurityGroup(this, `AsgSecurityGroup`, {
|
|
51
|
+
vpc: this.vpc,
|
|
52
|
+
description: `Security group for the ${props.serviceName} auto scaling group`
|
|
53
|
+
});
|
|
54
|
+
if (props.enableSSH) {
|
|
55
|
+
this.asgSecurityGroup.addIngressRule(aws_ec2_1.Peer.anyIpv4(), aws_ec2_1.Port.tcp(22), "Allow SSH");
|
|
56
|
+
}
|
|
57
|
+
this.launchTemplate = new aws_ec2_1.LaunchTemplate(this, "LaunchTemplate", {
|
|
58
|
+
launchTemplateName: `${props.serviceName}LaunchTemplate`,
|
|
59
|
+
instanceType: new aws_ec2_1.InstanceType(`${props.instanceType}`),
|
|
60
|
+
machineImage: props.machineImage || aws_ec2_1.MachineImage.latestAmazonLinux2(),
|
|
61
|
+
userData: props.userData,
|
|
62
|
+
role: props.role,
|
|
63
|
+
blockDevices: props?.blockDevices,
|
|
64
|
+
securityGroup: this.asgSecurityGroup,
|
|
65
|
+
detailedMonitoring: true,
|
|
66
|
+
requireImdsv2: true,
|
|
67
|
+
httpPutResponseHopLimit: 2,
|
|
68
|
+
httpTokens: aws_ec2_1.LaunchTemplateHttpTokens.REQUIRED,
|
|
69
|
+
instanceMetadataTags: true,
|
|
70
|
+
keyPair: this.keyPair
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
addAutoScalingGroup(props) {
|
|
74
|
+
// TODO: Support spot instances
|
|
75
|
+
// TODO: Handle terminating EC2 instances when updating, currently hangs.
|
|
76
|
+
this.autoScalingGroup = new aws_autoscaling_1.AutoScalingGroup(this, "AutoScalingGroup", {
|
|
77
|
+
vpc: this.vpc,
|
|
78
|
+
vpcSubnets: {
|
|
79
|
+
subnetType: props.enableSSH ? aws_ec2_1.SubnetType.PUBLIC : undefined
|
|
80
|
+
},
|
|
81
|
+
minCapacity: props.minCapcity,
|
|
82
|
+
maxCapacity: props.maxCapacity,
|
|
83
|
+
launchTemplate: this.launchTemplate,
|
|
84
|
+
cooldown: aws_cdk_lib_1.Duration.seconds(60),
|
|
85
|
+
groupMetrics: [aws_autoscaling_1.GroupMetrics.all()],
|
|
86
|
+
updatePolicy: aws_autoscaling_1.UpdatePolicy.replacingUpdate(),
|
|
87
|
+
newInstancesProtectedFromScaleIn: true,
|
|
88
|
+
// securityGroup: this.asgSecurityGroup,
|
|
89
|
+
terminationPolicies: [
|
|
90
|
+
aws_autoscaling_1.TerminationPolicy.OLDEST_LAUNCH_CONFIGURATION,
|
|
91
|
+
aws_autoscaling_1.TerminationPolicy.CLOSEST_TO_NEXT_INSTANCE_HOUR
|
|
92
|
+
],
|
|
93
|
+
ssmSessionPermissions: true
|
|
94
|
+
});
|
|
95
|
+
(0, tagResource_1.default)(this.autoScalingGroup, props.tags);
|
|
96
|
+
}
|
|
97
|
+
suspendAutoScaling() {
|
|
98
|
+
new awsCustomResource_1.AwsCustomResource(this, "SuspendAutoscaling", {
|
|
99
|
+
functionName: "suspendAutoScaling",
|
|
100
|
+
onCreate: {
|
|
101
|
+
service: "AutoScaling",
|
|
102
|
+
action: "suspendProcesses",
|
|
103
|
+
parameters: {
|
|
104
|
+
AutoScalingGroupName: this.autoScalingGroup.autoScalingGroupName,
|
|
105
|
+
ScalingProcesses: ["AZRebalance"]
|
|
106
|
+
},
|
|
107
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of("suspendAutoScaling")
|
|
108
|
+
},
|
|
109
|
+
onUpdate: {
|
|
110
|
+
service: "AutoScaling",
|
|
111
|
+
action: "suspendProcesses",
|
|
112
|
+
parameters: {
|
|
113
|
+
AutoScalingGroupName: this.autoScalingGroup.autoScalingGroupName,
|
|
114
|
+
ScalingProcesses: ["AZRebalance"]
|
|
115
|
+
},
|
|
116
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of("suspendAutoScaling")
|
|
117
|
+
},
|
|
118
|
+
resourceType: "Custom::suspendAutoscaling"
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.Ec2Instance = Ec2Instance;
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9lYzIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBaUI2QjtBQUM3QiwyQ0FBdUM7QUFDdkMsNkNBQW1EO0FBQ25ELHlEQUFrRDtBQUVsRCxpRUFLcUM7QUFFckMsdUZBQW9GO0FBQ3BGLG1FQUFrRTtBQUNsRSw0REFBeUQ7QUE2QnpELE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBT3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsdUVBQXVFO0lBQ3pFLENBQUM7SUFHRCxNQUFNLENBQUMsS0FBdUI7UUFDNUIsSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsV0FBVyxLQUFLLEVBQUU7Z0JBQ3pELEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksU0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxX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QXdDO1lBQ3hDLG1CQUFtQixFQUFFO2dCQUNuQixtQ0FBaUIsQ0FBQywyQkFBMkI7Z0JBQzdDLG1DQUFpQixDQUFDLDZCQUE2QjthQUNoRDtZQUNELHFCQUFxQixFQUFFLElBQUk7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsSUFBQSxxQkFBVyxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNoRCxZQUFZLEVBQUUsb0JBQW9CO1lBQ2xDLFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsYUFBYTtnQkFDdEIsTUFBTSxFQUFFLGtCQUFrQjtnQkFDMUIsVUFBVSxFQUFFO29CQUNWLG9CQUFvQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0I7b0JBQ2hFLGdCQUFnQixFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUNsQztnQkFDRCxrQkFBa0IsRUFBRSxxQ0FBa0IsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUM7YUFDaEU7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLFVBQVUsRUFBRTtvQkFDVixvQkFBb0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CO29CQUNoRSxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDbEM7Z0JBQ0Qsa0JBQWtCLEVBQUUscUNBQWtCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2FBQ2hFO1lBQ0QsWUFBWSxFQUFFLDRCQUE0QjtTQUMzQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFoSUQsa0NBZ0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmxvY2tEZXZpY2UsXG4gIElNYWNoaW5lSW1hZ2UsXG4gIEluc3RhbmNlVHlwZSxcbiAgSVZwYyxcbiAgTGF1bmNoVGVtcGxhdGUsXG4gIFN1Ym5ldFR5cGUsXG4gIFVzZXJEYXRhLFxuICBNYWNoaW5lSW1hZ2UsXG4gIExhdW5jaFRlbXBsYXRlSHR0cFRva2VucyxcbiAgS2V5UGFpcixcbiAgSUtleVBhaXIsXG4gIFNlY3VyaXR5R3JvdXAsXG4gIFBlZXIsXG4gIFBvcnQsXG4gIElDb25uZWN0YWJsZSxcbiAgQ29ubmVjdGlvbnNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2tQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHRhZ1Jlc291cmNlIGZyb20gXCIuLi8uLi91dGlscy90YWdSZXNvdXJjZVwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICBBdXRvU2NhbGluZ0dyb3VwLFxuICBHcm91cE1ldHJpY3MsXG4gIFRlcm1pbmF0aW9uUG9saWN5LFxuICBVcGRhdGVQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hdXRvc2NhbGluZ1wiO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5pbXBvcnQgeyBQaHlzaWNhbFJlc291cmNlSWQgfSBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGNcIjtcblxuaW50ZXJmYWNlIEV4aXN0aW5nVnBjQ29uZmlnIHtcbiAgdnBjSWQ/OiBzdHJpbmc7XG4gIHN1Ym5ldFR5cGU/OiBTdWJuZXRUeXBlO1xufVxuXG5pbnRlcmZhY2UgTmV3VnBjQ29uZmlnIHtcbiAgc3VibmV0VHlwZTogU3VibmV0VHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgVnBjUHJvcHMgPSBFeGlzdGluZ1ZwY0NvbmZpZyB8IE5ld1ZwY0NvbmZpZztcblxuaW50ZXJmYWNlIEVjMkluc3RhbmNlUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgc3BvdENhcGFjaXR5UGVyY2VudGFnZT86IG51bWJlcjtcbiAgYmxvY2tEZXZpY2VzPzogQmxvY2tEZXZpY2VbXTtcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICB2cGM6IFZwY1Byb3BzO1xuICBtaW5DYXBjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgaW5zdGFuY2VUeXBlOiBzdHJpbmc7XG4gIG1hY2hpbmVJbWFnZT86IElNYWNoaW5lSW1hZ2U7XG4gIHVzZXJEYXRhPzogVXNlckRhdGE7XG4gIHJvbGU/OiBSb2xlO1xuICBlbmFibGVTU0g/OiBib29sZWFuO1xuICB0YWdzOiBLZXlWYWx1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIEVjMkluc3RhbmNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHJpdmF0ZSBsYXVuY2hUZW1wbGF0ZTogTGF1bmNoVGVtcGxhdGU7XG4gIHB1YmxpYyB2cGM6IElWcGM7XG4gIHB1YmxpYyBhc2dTZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIGF1dG9TY2FsaW5nR3JvdXA6IEF1dG9TY2FsaW5nR3JvdXA7XG4gIHByaXZhdGUga2V5UGFpcjogSUtleVBhaXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hZGRWcGMocHJvcHMpO1xuICAgIGlmIChwcm9wcy5lbmFibGVTU0gpIHtcbiAgICAgIHRoaXMuYWRkS2V5UGFpcihwcm9wcyk7XG4gICAgfVxuICAgIHRoaXMuYWRkTGF1bmNoVGVtcGxhdGUocHJvcHMpO1xuICAgIHRoaXMuYWRkQXV0b1NjYWxpbmdHcm91cChwcm9wcyk7XG4gICAgdGhpcy5zdXNwZW5kQXV0b1NjYWxpbmcoKTtcblxuICAgIC8vVE9ETzogQWRkIGxvYWQgYmFsYW5jZXIgYXMgYm9vbGVhbiBwcm9wLCB0aGVuIGNvbmZpZ3VyZSBsb2FkIGJhbGFuY2VyXG4gIH1cbiAgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIGFkZFZwYyhwcm9wczogRWMySW5zdGFuY2VQcm9wcykge1xuICAgIGlmIChcInZwY0lkXCIgaW4gcHJvcHMudnBjKSB7XG4gICAgICB0aGlzLnZwYyA9IFZwYy5mcm9tTG9va3VwKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfVZwY2AsIHtcbiAgICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudnBjID0gbmV3IFZwYyh0aGlzLCBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1WcGNgLCB7XG4gICAgICAgIGFjY291bnRJZDogcHJvcHMuYWNjb3VudElkLFxuICAgICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgICAgICBzdWJuZXRDb25maWd1cmF0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9YCxcbiAgICAgICAgICAgIHN1Ym5ldFR5cGU6IHByb3BzLnZwYy5zdWJuZXRUeXBlIHx8IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYWRkS2V5UGFpcihwcm9wczogRWMySW5zdGFuY2VQcm9wcykge1xuICAgIC8vIFRPRE86IEJyZWFrb3V0IGludG8gYSBzZXBlcmF0ZSBjb25zdHJ1Y3QgZm9yIHVzZSB3aXRoIGJldHRlciBwcm9wIGhhbmRsaW5nXG4gICAgdGhpcy5rZXlQYWlyID0gbmV3IEtleVBhaXIodGhpcywgXCJLZXlQYWlyXCIsIHtcbiAgICAgIGtleVBhaXJOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1LZXlQYWlyYFxuICAgIH0pO1xuICB9XG5cbiAgYWRkTGF1bmNoVGVtcGxhdGUocHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgQXNnU2VjdXJpdHlHcm91cGAsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciB0aGUgJHtwcm9wcy5zZXJ2aWNlTmFtZX0gYXV0byBzY2FsaW5nIGdyb3VwYFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZVNTSCkge1xuICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICBQZWVyLmFueUlwdjQoKSxcbiAgICAgICAgUG9ydC50Y3AoMjIpLFxuICAgICAgICBcIkFsbG93IFNTSFwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubGF1bmNoVGVtcGxhdGUgPSBuZXcgTGF1bmNoVGVtcGxhdGUodGhpcywgXCJMYXVuY2hUZW1wbGF0ZVwiLCB7XG4gICAgICBsYXVuY2hUZW1wbGF0ZU5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfUxhdW5jaFRlbXBsYXRlYCxcbiAgICAgIGluc3RhbmNlVHlwZTogbmV3IEluc3RhbmNlVHlwZShgJHtwcm9wcy5pbnN0YW5jZVR5cGV9YCksXG4gICAgICBtYWNoaW5lSW1hZ2U6IHByb3BzLm1hY2hpbmVJbWFnZSB8fCBNYWNoaW5lSW1hZ2UubGF0ZXN0QW1hem9uTGludXgyKCksXG4gICAgICB1c2VyRGF0YTogcHJvcHMudXNlckRhdGEsXG4gICAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgICAgYmxvY2tEZXZpY2VzOiBwcm9wcz8uYmxvY2tEZXZpY2VzLFxuICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5hc2dTZWN1cml0eUdyb3VwLFxuICAgICAgZGV0YWlsZWRNb25pdG9yaW5nOiB0cnVlLFxuICAgICAgcmVxdWlyZUltZHN2MjogdHJ1ZSxcbiAgICAgIGh0dHBQdXRSZXNwb25zZUhvcExpbWl0OiAyLFxuICAgICAgaHR0cFRva2VuczogTGF1bmNoVGVtcGxhdGVIdHRwVG9rZW5zLlJFUVVJUkVELFxuICAgICAgaW5zdGFuY2VNZXRhZGF0YVRhZ3M6IHRydWUsXG4gICAgICBrZXlQYWlyOiB0aGlzLmtleVBhaXJcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEF1dG9TY2FsaW5nR3JvdXAocHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICAvLyBUT0RPOiBTdXBwb3J0IHNwb3QgaW5zdGFuY2VzXG4gICAgLy8gVE9ETzogSGFuZGxlIHRlcm1pbmF0aW5nIEVDMiBpbnN0YW5jZXMgd2hlbiB1cGRhdGluZywgY3VycmVudGx5IGhhbmdzLlxuICAgIHRoaXMuYXV0b1NjYWxpbmdHcm91cCA9IG5ldyBBdXRvU2NhbGluZ0dyb3VwKHRoaXMsIFwiQXV0b1NjYWxpbmdHcm91cFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRUeXBlOiBwcm9wcy5lbmFibGVTU0ggPyBTdWJuZXRUeXBlLlBVQkxJQyA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIG1pbkNhcGFjaXR5OiBwcm9wcy5taW5DYXBjaXR5LFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5LFxuICAgICAgbGF1bmNoVGVtcGxhdGU6IHRoaXMubGF1bmNoVGVtcGxhdGUsXG4gICAgICBjb29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBncm91cE1ldHJpY3M6IFtHcm91cE1ldHJpY3MuYWxsKCldLFxuICAgICAgdXBkYXRlUG9saWN5OiBVcGRhdGVQb2xpY3kucmVwbGFjaW5nVXBkYXRlKCksXG4gICAgICBuZXdJbnN0YW5jZXNQcm90ZWN0ZWRGcm9tU2NhbGVJbjogdHJ1ZSxcbiAgICAgIC8vIHNlY3VyaXR5R3JvdXA6IHRoaXMuYXNnU2VjdXJpdHlHcm91cCxcbiAgICAgIHRlcm1pbmF0aW9uUG9saWNpZXM6IFtcbiAgICAgICAgVGVybWluYXRpb25Qb2xpY3kuT0xERVNUX0xBVU5DSF9DT05GSUdVUkFUSU9OLFxuICAgICAgICBUZXJtaW5hdGlvblBvbGljeS5DTE9TRVNUX1RPX05FWFRfSU5TVEFOQ0VfSE9VUlxuICAgICAgXSxcbiAgICAgIHNzbVNlc3Npb25QZXJtaXNzaW9uczogdHJ1ZVxuICAgIH0pO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMuYXV0b1NjYWxpbmdHcm91cCwgcHJvcHMudGFncyk7XG4gIH1cblxuICBzdXNwZW5kQXV0b1NjYWxpbmcoKSB7XG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiU3VzcGVuZEF1dG9zY2FsaW5nXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogXCJzdXNwZW5kQXV0b1NjYWxpbmdcIixcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiQXV0b1NjYWxpbmdcIixcbiAgICAgICAgYWN0aW9uOiBcInN1c3BlbmRQcm9jZXNzZXNcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEF1dG9TY2FsaW5nR3JvdXBOYW1lOiB0aGlzLmF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWUsXG4gICAgICAgICAgU2NhbGluZ1Byb2Nlc3NlczogW1wiQVpSZWJhbGFuY2VcIl1cbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoXCJzdXNwZW5kQXV0b1NjYWxpbmdcIilcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIkF1dG9TY2FsaW5nXCIsXG4gICAgICAgIGFjdGlvbjogXCJzdXNwZW5kUHJvY2Vzc2VzXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBBdXRvU2NhbGluZ0dyb3VwTmFtZTogdGhpcy5hdXRvU2NhbGluZ0dyb3VwLmF1dG9TY2FsaW5nR3JvdXBOYW1lLFxuICAgICAgICAgIFNjYWxpbmdQcm9jZXNzZXM6IFtcIkFaUmViYWxhbmNlXCJdXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFwic3VzcGVuZEF1dG9TY2FsaW5nXCIpXG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6c3VzcGVuZEF1dG9zY2FsaW5nXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AwsStackProps } from "../../resources/aws/base/awsStack";
|
|
2
|
+
import { ScalingType } from "../../resources/aws/compute/ecs";
|
|
3
|
+
import { IManagedPolicy, PolicyDocument } from "aws-cdk-lib/aws-iam";
|
|
4
|
+
import { KeyValue } from "../../types";
|
|
5
|
+
/**
|
|
6
|
+
* Intersected with BasicAppProps in the getProps method. This allows the BasicApp construct
|
|
7
|
+
* to treat these as required properties and avoid constant null checking.
|
|
8
|
+
*/
|
|
9
|
+
export interface BasicAppPropDefaults {
|
|
10
|
+
serviceName: string;
|
|
11
|
+
clusterName: string;
|
|
12
|
+
scalingType: ScalingType;
|
|
13
|
+
containerPort: number;
|
|
14
|
+
}
|
|
15
|
+
export interface BasicAppProps {
|
|
16
|
+
account?: string;
|
|
17
|
+
clusterName?: string;
|
|
18
|
+
containerEntryPoint?: string[];
|
|
19
|
+
containerCommand?: string[];
|
|
20
|
+
containerEnvironment?: KeyValue;
|
|
21
|
+
containerPort?: number;
|
|
22
|
+
containerSecrets?: string[];
|
|
23
|
+
environment?: string;
|
|
24
|
+
owner?: string;
|
|
25
|
+
parentDomain?: string;
|
|
26
|
+
listenerPort?: number;
|
|
27
|
+
region?: string;
|
|
28
|
+
scalingType?: ScalingType;
|
|
29
|
+
serviceName?: string;
|
|
30
|
+
taskRoleInlinePolicies?: {
|
|
31
|
+
[name: string]: PolicyDocument;
|
|
32
|
+
};
|
|
33
|
+
taskRoleManagedPolicies?: IManagedPolicy[];
|
|
34
|
+
}
|
|
35
|
+
export declare class BasicApp {
|
|
36
|
+
private vpcStack;
|
|
37
|
+
private databaseStack;
|
|
38
|
+
private secretStack;
|
|
39
|
+
private computeStack;
|
|
40
|
+
constructor(id: string, rawProps: BasicAppProps);
|
|
41
|
+
getStackProps(props: BasicAppProps): AwsStackProps | undefined;
|
|
42
|
+
getProps(id: string, rawProps: BasicAppProps): BasicAppProps & BasicAppPropDefaults;
|
|
43
|
+
}
|
|
44
|
+
export default BasicApp;
|