@fjall/components-infrastructure 0.87.20 → 0.88.3
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 +14 -18
- package/dist/lib/app.js +58 -41
- package/dist/lib/config/aws/accountId.js +1 -2
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
- package/dist/lib/config/aws/costAllocationTags.js +3 -4
- package/dist/lib/config/aws/identityCenter.d.ts +4 -4
- package/dist/lib/config/aws/identityCenter.js +17 -63
- package/dist/lib/config/aws/identityCenterGroupMembership.js +27 -42
- package/dist/lib/config/aws/index.d.ts +0 -8
- package/dist/lib/config/aws/index.js +1 -9
- package/dist/lib/config/aws/ipamDelegateAdmin.js +1 -2
- package/dist/lib/config/aws/ipamPoolId.js +1 -2
- package/dist/lib/config/aws/organisationId.js +1 -2
- package/dist/lib/config/aws/organisationsAccess.js +1 -2
- package/dist/lib/config/aws/ramSharing.js +1 -2
- package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets +30 -0
- package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
- package/dist/lib/layers/secrets-resolver/bin/resolve-secrets +30 -0
- package/dist/lib/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
- package/dist/lib/patterns/aws/account.d.ts +12 -0
- package/dist/lib/patterns/aws/account.js +73 -0
- package/dist/lib/patterns/aws/buildkite.js +1 -2
- package/dist/lib/patterns/aws/cdn.d.ts +5 -10
- package/dist/lib/patterns/aws/cdn.js +5 -13
- package/dist/lib/patterns/aws/compute.d.ts +20 -3
- package/dist/lib/patterns/aws/compute.js +29 -5
- package/dist/lib/patterns/aws/database.d.ts +3 -3
- package/dist/lib/patterns/aws/database.js +18 -15
- package/dist/lib/patterns/aws/index.d.ts +4 -3
- package/dist/lib/patterns/aws/index.js +6 -4
- package/dist/lib/patterns/aws/interfaces/index.d.ts +2 -1
- package/dist/lib/patterns/aws/interfaces/index.js +8 -5
- package/dist/lib/patterns/aws/interfaces/organisation.d.ts +22 -0
- package/dist/lib/patterns/aws/interfaces/organisation.js +28 -0
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +5 -5
- package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
- package/dist/lib/patterns/aws/interfaces/storage.d.ts +10 -120
- package/dist/lib/patterns/aws/interfaces/storage.js +6 -43
- package/dist/lib/patterns/aws/organisation.d.ts +38 -0
- package/dist/lib/patterns/aws/organisation.js +92 -0
- package/dist/lib/patterns/aws/organisationFactory.d.ts +20 -0
- package/dist/lib/patterns/aws/organisationFactory.js +24 -0
- package/dist/lib/patterns/aws/pattern.d.ts +1 -1
- package/dist/lib/patterns/aws/pattern.js +1 -1
- package/dist/lib/patterns/aws/payload.d.ts +6 -5
- package/dist/lib/patterns/aws/payload.js +92 -42
- package/dist/lib/patterns/aws/platform.d.ts +11 -0
- package/dist/lib/patterns/aws/platform.js +29 -0
- package/dist/lib/patterns/aws/storage.d.ts +40 -125
- package/dist/lib/patterns/aws/storage.js +63 -191
- package/dist/lib/resources/aws/compute/ec2.d.ts +1 -1
- package/dist/lib/resources/aws/compute/ec2.js +3 -4
- package/dist/lib/resources/aws/compute/ecs.d.ts +6 -9
- package/dist/lib/resources/aws/compute/ecs.js +58 -26
- package/dist/lib/resources/aws/compute/lambda.d.ts +14 -1
- package/dist/lib/resources/aws/compute/lambda.js +45 -13
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +16 -16
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +14 -10
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +5 -4
- package/dist/lib/resources/aws/database/rdsInstance.js +18 -7
- package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +0 -2
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +9 -46
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -2
- package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -3
- package/dist/lib/resources/aws/iam/identityCenter/group.js +7 -85
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -3
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +9 -96
- package/dist/lib/resources/aws/index.d.ts +1 -0
- package/dist/lib/resources/aws/index.js +2 -1
- package/dist/lib/resources/aws/logging/cloudTrail.js +7 -4
- package/dist/lib/resources/aws/networking/ipamPool.js +76 -5
- package/dist/lib/resources/aws/organisation/index.d.ts +4 -0
- package/dist/lib/resources/aws/organisation/index.js +10 -0
- package/dist/lib/resources/aws/organisation/organisation.d.ts +12 -0
- package/dist/lib/resources/aws/organisation/organisation.js +14 -0
- package/dist/lib/resources/aws/organisation/organisationAccount.d.ts +18 -0
- package/dist/lib/resources/aws/organisation/organisationAccount.js +31 -0
- package/dist/lib/resources/aws/organisation/organisationPolicy.d.ts +13 -0
- package/dist/lib/resources/aws/organisation/organisationPolicy.js +32 -0
- package/dist/lib/resources/aws/organisation/organisationalUnit.d.ts +10 -0
- package/dist/lib/resources/aws/organisation/organisationalUnit.js +9 -0
- package/dist/lib/resources/aws/secrets/kms.js +10 -7
- package/dist/lib/resources/aws/secrets/parameter.js +5 -4
- package/dist/lib/resources/aws/storage/ecr.d.ts +3 -1
- package/dist/lib/resources/aws/storage/ecr.js +3 -3
- package/dist/lib/resources/aws/storage/s3.d.ts +6 -39
- package/dist/lib/resources/aws/storage/s3.js +31 -34
- package/dist/lib/utils/capitaliseString.d.ts +12 -0
- package/dist/lib/utils/capitaliseString.js +30 -0
- package/dist/lib/utils/capitalizeString.d.ts +11 -0
- package/dist/lib/utils/capitalizeString.js +24 -1
- package/dist/lib/utils/getConfig.d.ts +5 -1
- package/dist/lib/utils/getConfig.js +9 -1
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/resourceNaming.d.ts +22 -19
- package/dist/lib/utils/resourceNaming.js +39 -35
- package/package.json +5 -6
package/dist/lib/app.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { type INetworkProps, type Network } from "./patterns/aws/network";
|
|
|
10
10
|
import { type Cdn } from "./patterns/aws/cdn";
|
|
11
11
|
import { type AnyMessaging } from "./patterns/aws/messaging";
|
|
12
12
|
import { type AnyCompute } from "./patterns/aws/compute";
|
|
13
|
-
import { type
|
|
13
|
+
import { type Storage, type StorageFactoryFn } from "./patterns/aws/storage";
|
|
14
14
|
import { type AnyPattern } from "./patterns/aws/pattern";
|
|
15
15
|
import { type ResourceInventory } from "./aspects/resourceInventory";
|
|
16
16
|
import { type ManifestCollector } from "./utils/manifestWriter";
|
|
@@ -52,6 +52,8 @@ export interface IAppOptions {
|
|
|
52
52
|
export declare class App extends CdkApp {
|
|
53
53
|
private static instance;
|
|
54
54
|
private name;
|
|
55
|
+
/** PascalCase form of name, used as stack-name prefix and construct IDs. */
|
|
56
|
+
private stackPrefix;
|
|
55
57
|
private stacks;
|
|
56
58
|
private vpc?;
|
|
57
59
|
private additionalVpcs;
|
|
@@ -62,7 +64,7 @@ export declare class App extends CdkApp {
|
|
|
62
64
|
private networkDisabled;
|
|
63
65
|
private globalTags;
|
|
64
66
|
private aspectApplied;
|
|
65
|
-
private resourceInventory
|
|
67
|
+
private resourceInventory?;
|
|
66
68
|
private manifestCollector;
|
|
67
69
|
private constructor();
|
|
68
70
|
/**
|
|
@@ -175,7 +177,7 @@ export declare class App extends CdkApp {
|
|
|
175
177
|
*/
|
|
176
178
|
getVpcNames(): string[];
|
|
177
179
|
/**
|
|
178
|
-
*
|
|
180
|
+
* Retrieve the default application container registry. If the registry does not exist
|
|
179
181
|
* it will be created.
|
|
180
182
|
*/
|
|
181
183
|
getDefaultContainerRegistry(): Ecr;
|
|
@@ -247,7 +249,7 @@ export declare class App extends CdkApp {
|
|
|
247
249
|
* // Aurora database - returns RelationalDatabase
|
|
248
250
|
* const db = app.addDatabase(DatabaseFactory.build("Main", {
|
|
249
251
|
* type: "Aurora",
|
|
250
|
-
* databaseName: "
|
|
252
|
+
* databaseName: "my_app"
|
|
251
253
|
* }));
|
|
252
254
|
* db.getHostEndpoint(); // Available
|
|
253
255
|
*
|
|
@@ -263,32 +265,26 @@ export declare class App extends CdkApp {
|
|
|
263
265
|
/**
|
|
264
266
|
* Add a storage resource (S3) to the default storage stack using the factory pattern.
|
|
265
267
|
*
|
|
266
|
-
* Returns the appropriate storage type based on the factory configuration:
|
|
267
|
-
* - PrivateStorage for bucketType: "private"
|
|
268
|
-
* - WebsiteStorage for bucketType: "website"
|
|
269
|
-
* - PublicStorage for bucketType: "publicRead"
|
|
270
|
-
*
|
|
271
268
|
* @example
|
|
272
|
-
* // Private
|
|
269
|
+
* // Private bucket (default)
|
|
273
270
|
* const assets = app.addStorage(StorageFactory.build("Assets", {
|
|
274
|
-
*
|
|
271
|
+
* versioned: true
|
|
275
272
|
* }));
|
|
276
|
-
* assets.grantPublicAccess("public/*"); // Available on PrivateStorage
|
|
277
273
|
*
|
|
278
274
|
* @example
|
|
279
|
-
* // Website
|
|
275
|
+
* // Website bucket
|
|
280
276
|
* const site = app.addStorage(StorageFactory.build("Site", {
|
|
281
|
-
*
|
|
277
|
+
* websiteHosting: { indexDocument: "index.html" }
|
|
282
278
|
* }));
|
|
283
|
-
* site.getWebsiteUrl(); // Available on WebsiteStorage
|
|
284
279
|
*/
|
|
285
|
-
addStorage
|
|
280
|
+
addStorage(fn: StorageFactoryFn): Storage;
|
|
281
|
+
private resolveStorageStack;
|
|
286
282
|
/**
|
|
287
283
|
* Add a CDN resource (CloudFront) to the default CDN stack using the factory pattern.
|
|
288
284
|
*
|
|
289
285
|
* @example
|
|
290
286
|
* // S3 origin
|
|
291
|
-
* const assets = app.addStorage(StorageFactory.build("Assets", {
|
|
287
|
+
* const assets = app.addStorage(StorageFactory.build("Assets", {}));
|
|
292
288
|
* app.addCdn(CdnFactory.build("AssetsCdn", {
|
|
293
289
|
* originType: "s3",
|
|
294
290
|
* bucket: assets
|
|
@@ -381,7 +377,7 @@ export declare class App extends CdkApp {
|
|
|
381
377
|
*/
|
|
382
378
|
addStorageResource(resource: Construct): void;
|
|
383
379
|
/**
|
|
384
|
-
*
|
|
380
|
+
* Initialise standard tags
|
|
385
381
|
*/
|
|
386
382
|
private initialiseStandardTags;
|
|
387
383
|
/**
|
package/dist/lib/app.js
CHANGED
|
@@ -7,6 +7,7 @@ const resources_1 = require("./resources");
|
|
|
7
7
|
const ecr_1 = require("./resources/aws/storage/ecr");
|
|
8
8
|
const network_1 = require("./patterns/aws/network");
|
|
9
9
|
const standardTagsAspect_1 = require("./utils/standardTagsAspect");
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
10
11
|
const getConfig_1 = require("./utils/getConfig");
|
|
11
12
|
const monitoringRole_1 = require("./resources/aws/monitoring/monitoringRole");
|
|
12
13
|
const monitoring_1 = require("./config/monitoring");
|
|
@@ -14,6 +15,7 @@ const auditRole_1 = require("./resources/aws/audit/auditRole");
|
|
|
14
15
|
const audit_1 = require("./config/audit");
|
|
15
16
|
const validationLogger_1 = require("./utils/validationLogger");
|
|
16
17
|
const manifestWriter_1 = require("./utils/manifestWriter");
|
|
18
|
+
const capitaliseString_1 = require("./utils/capitaliseString");
|
|
17
19
|
/**
|
|
18
20
|
* The basic corner-stone of all Fjall-hosted applications.
|
|
19
21
|
* This class is a singleton and should be used to create and manage
|
|
@@ -29,6 +31,7 @@ class App extends aws_cdk_lib_1.App {
|
|
|
29
31
|
this.aspectApplied = false;
|
|
30
32
|
App.instance = this;
|
|
31
33
|
this.name = name ?? "FjallApp";
|
|
34
|
+
this.stackPrefix = (0, capitaliseString_1.toPascalCase)(this.name);
|
|
32
35
|
// Initialise manifest collector for build-time service discovery
|
|
33
36
|
this.manifestCollector = (0, manifestWriter_1.getManifestCollector)(this.name);
|
|
34
37
|
this.initialiseStandardTags();
|
|
@@ -46,12 +49,13 @@ class App extends aws_cdk_lib_1.App {
|
|
|
46
49
|
initialiseNetwork(config) {
|
|
47
50
|
const networkStack = this.getDefaultNetworkStack();
|
|
48
51
|
if ("useExisting" in config) {
|
|
49
|
-
this.vpc = vpc_1.Vpc.fromLookup(networkStack.getStack(), `${this.
|
|
52
|
+
this.vpc = vpc_1.Vpc.fromLookup(networkStack.getStack(), `${this.stackPrefix}ImportedVpc`, {
|
|
50
53
|
vpcId: config.useExisting
|
|
51
54
|
});
|
|
52
55
|
}
|
|
53
56
|
else {
|
|
54
|
-
const
|
|
57
|
+
const networkConfig = { ...config, vpcName: config.vpcName ?? this.name };
|
|
58
|
+
const network = network_1.NetworkFactory.build(`${this.stackPrefix}Vpc`, networkConfig)(this, networkStack.getStack());
|
|
55
59
|
this.vpc = network.getVpc();
|
|
56
60
|
}
|
|
57
61
|
}
|
|
@@ -112,6 +116,7 @@ class App extends aws_cdk_lib_1.App {
|
|
|
112
116
|
`Ensure App.getApp() is called with the final name before initialising network.`);
|
|
113
117
|
}
|
|
114
118
|
App.instance.name = name;
|
|
119
|
+
App.instance.stackPrefix = (0, capitaliseString_1.toPascalCase)(name);
|
|
115
120
|
// Reinitialise standard tags with the new name
|
|
116
121
|
App.instance.initialiseStandardTags();
|
|
117
122
|
}
|
|
@@ -156,28 +161,28 @@ class App extends aws_cdk_lib_1.App {
|
|
|
156
161
|
* @returns {AwsStack}
|
|
157
162
|
*/
|
|
158
163
|
getDefaultComputeStack() {
|
|
159
|
-
return this.getStack(`${this.
|
|
164
|
+
return this.getStack(`${this.stackPrefix}Compute`, this.getDefaultNetworkStack());
|
|
160
165
|
}
|
|
161
166
|
/**
|
|
162
167
|
* Retrieve default network stack - named as `${this.name}Network`
|
|
163
168
|
* @returns {AwsStack}
|
|
164
169
|
*/
|
|
165
170
|
getDefaultNetworkStack() {
|
|
166
|
-
return this.getStack(`${this.
|
|
171
|
+
return this.getStack(`${this.stackPrefix}Network`);
|
|
167
172
|
}
|
|
168
173
|
/**
|
|
169
174
|
* Retrieve default database stack - named as `${this.name}Database`
|
|
170
175
|
* @returns {AwsStack}
|
|
171
176
|
*/
|
|
172
177
|
getDefaultDatabaseStack() {
|
|
173
|
-
return this.getStack(`${this.
|
|
178
|
+
return this.getStack(`${this.stackPrefix}Database`, this.getDefaultNetworkStack());
|
|
174
179
|
}
|
|
175
180
|
/**
|
|
176
181
|
* Retrieve default storage stack - named as `${this.name}Storage`
|
|
177
182
|
* @returns {AwsStack}
|
|
178
183
|
*/
|
|
179
184
|
getDefaultStorageStack() {
|
|
180
|
-
return this.getStack(`${this.
|
|
185
|
+
return this.getStack(`${this.stackPrefix}Storage`, this.getDefaultNetworkStack());
|
|
181
186
|
}
|
|
182
187
|
/**
|
|
183
188
|
* Retrieve default CDN stack - named as `${this.name}Cdn`
|
|
@@ -188,7 +193,7 @@ class App extends aws_cdk_lib_1.App {
|
|
|
188
193
|
* @returns {AwsStack}
|
|
189
194
|
*/
|
|
190
195
|
getDefaultCdnStack() {
|
|
191
|
-
return this.getStack(`${this.
|
|
196
|
+
return this.getStack(`${this.stackPrefix}Cdn`, this.getDefaultNetworkStack());
|
|
192
197
|
}
|
|
193
198
|
/**
|
|
194
199
|
* Retrieve default messaging stack - named as `${this.name}Messaging`
|
|
@@ -200,7 +205,7 @@ class App extends aws_cdk_lib_1.App {
|
|
|
200
205
|
* @returns {AwsStack}
|
|
201
206
|
*/
|
|
202
207
|
getDefaultMessagingStack() {
|
|
203
|
-
return this.getStack(`${this.
|
|
208
|
+
return this.getStack(`${this.stackPrefix}Messaging`, this.getDefaultNetworkStack());
|
|
204
209
|
}
|
|
205
210
|
/**
|
|
206
211
|
* Get a VPC by name. If no name is provided, returns the default VPC.
|
|
@@ -247,13 +252,17 @@ class App extends aws_cdk_lib_1.App {
|
|
|
247
252
|
return names;
|
|
248
253
|
}
|
|
249
254
|
/**
|
|
250
|
-
*
|
|
255
|
+
* Retrieve the default application container registry. If the registry does not exist
|
|
251
256
|
* it will be created.
|
|
252
257
|
*/
|
|
253
258
|
getDefaultContainerRegistry() {
|
|
254
259
|
if (!this.defaultEcr) {
|
|
255
260
|
const networkStack = this.getDefaultNetworkStack();
|
|
256
|
-
|
|
261
|
+
const ecr = ecr_1.EcrFactory.build(`${this.stackPrefix}Ecr`, {
|
|
262
|
+
repositoryName: (0, capitaliseString_1.toKebab)(this.name)
|
|
263
|
+
})(this, networkStack.getStack());
|
|
264
|
+
this.defaultEcr = ecr;
|
|
265
|
+
return ecr;
|
|
257
266
|
}
|
|
258
267
|
return this.defaultEcr;
|
|
259
268
|
}
|
|
@@ -268,14 +277,15 @@ class App extends aws_cdk_lib_1.App {
|
|
|
268
277
|
if (!this.defaultMonitoringRole) {
|
|
269
278
|
const networkStack = this.getDefaultNetworkStack();
|
|
270
279
|
const accountId = webappAccountId || monitoring_1.FJALL_MONITORING_CONFIG.webappAwsAccountId;
|
|
271
|
-
|
|
280
|
+
const role = monitoringRole_1.default.build(`${this.stackPrefix}MonitoringRole`, {
|
|
272
281
|
webappAccountId: accountId,
|
|
273
282
|
appName: this.name,
|
|
274
283
|
roleNamePrefix: monitoring_1.FJALL_MONITORING_CONFIG.roleNamePrefix,
|
|
275
284
|
rolePath: monitoring_1.FJALL_MONITORING_CONFIG.rolePath
|
|
276
285
|
})(this, networkStack.getStack());
|
|
277
|
-
|
|
278
|
-
|
|
286
|
+
networkStack.addConstruct(role);
|
|
287
|
+
this.defaultMonitoringRole = role;
|
|
288
|
+
return role;
|
|
279
289
|
}
|
|
280
290
|
return this.defaultMonitoringRole;
|
|
281
291
|
}
|
|
@@ -294,17 +304,17 @@ class App extends aws_cdk_lib_1.App {
|
|
|
294
304
|
if (!this.defaultAuditRole) {
|
|
295
305
|
const networkStack = this.getDefaultNetworkStack();
|
|
296
306
|
const accountId = webappAccountId || audit_1.FJALL_AUDIT_CONFIG.webappAwsAccountId;
|
|
297
|
-
// Generate or use provided external ID
|
|
298
307
|
this.auditRoleExternalId = externalId || this.generateAuditExternalId();
|
|
299
|
-
|
|
308
|
+
const role = auditRole_1.default.build(`${this.stackPrefix}AuditRole`, {
|
|
300
309
|
webappAccountId: accountId,
|
|
301
310
|
appName: this.name,
|
|
302
311
|
externalId: this.auditRoleExternalId,
|
|
303
312
|
roleNamePrefix: audit_1.FJALL_AUDIT_CONFIG.roleNamePrefix,
|
|
304
313
|
rolePath: audit_1.FJALL_AUDIT_CONFIG.rolePath
|
|
305
314
|
})(this, networkStack.getStack());
|
|
306
|
-
|
|
307
|
-
|
|
315
|
+
networkStack.addConstruct(role);
|
|
316
|
+
this.defaultAuditRole = role;
|
|
317
|
+
return role;
|
|
308
318
|
}
|
|
309
319
|
return this.defaultAuditRole;
|
|
310
320
|
}
|
|
@@ -320,8 +330,8 @@ class App extends aws_cdk_lib_1.App {
|
|
|
320
330
|
* Format: fjall-audit-{appName}-{timestamp}
|
|
321
331
|
*/
|
|
322
332
|
generateAuditExternalId() {
|
|
323
|
-
const
|
|
324
|
-
return `fjall-audit-${this.name
|
|
333
|
+
const uniqueId = (0, crypto_1.randomBytes)(8).toString("hex");
|
|
334
|
+
return `fjall-audit-${(0, capitaliseString_1.toKebab)(this.name)}-${uniqueId}`;
|
|
325
335
|
}
|
|
326
336
|
/**
|
|
327
337
|
* Add a compute resource to the default compute stack using the factory pattern.
|
|
@@ -373,7 +383,7 @@ class App extends aws_cdk_lib_1.App {
|
|
|
373
383
|
* // Aurora database - returns RelationalDatabase
|
|
374
384
|
* const db = app.addDatabase(DatabaseFactory.build("Main", {
|
|
375
385
|
* type: "Aurora",
|
|
376
|
-
* databaseName: "
|
|
386
|
+
* databaseName: "my_app"
|
|
377
387
|
* }));
|
|
378
388
|
* db.getHostEndpoint(); // Available
|
|
379
389
|
*
|
|
@@ -394,37 +404,41 @@ class App extends aws_cdk_lib_1.App {
|
|
|
394
404
|
/**
|
|
395
405
|
* Add a storage resource (S3) to the default storage stack using the factory pattern.
|
|
396
406
|
*
|
|
397
|
-
* Returns the appropriate storage type based on the factory configuration:
|
|
398
|
-
* - PrivateStorage for bucketType: "private"
|
|
399
|
-
* - WebsiteStorage for bucketType: "website"
|
|
400
|
-
* - PublicStorage for bucketType: "publicRead"
|
|
401
|
-
*
|
|
402
407
|
* @example
|
|
403
|
-
* // Private
|
|
408
|
+
* // Private bucket (default)
|
|
404
409
|
* const assets = app.addStorage(StorageFactory.build("Assets", {
|
|
405
|
-
*
|
|
410
|
+
* versioned: true
|
|
406
411
|
* }));
|
|
407
|
-
* assets.grantPublicAccess("public/*"); // Available on PrivateStorage
|
|
408
412
|
*
|
|
409
413
|
* @example
|
|
410
|
-
* // Website
|
|
414
|
+
* // Website bucket
|
|
411
415
|
* const site = app.addStorage(StorageFactory.build("Site", {
|
|
412
|
-
*
|
|
416
|
+
* websiteHosting: { indexDocument: "index.html" }
|
|
413
417
|
* }));
|
|
414
|
-
* site.getWebsiteUrl(); // Available on WebsiteStorage
|
|
415
418
|
*/
|
|
416
419
|
addStorage(fn) {
|
|
417
|
-
const
|
|
418
|
-
const
|
|
419
|
-
|
|
420
|
+
const placement = fn.stackPlacement ?? "storage";
|
|
421
|
+
const stack = this.resolveStorageStack(placement);
|
|
422
|
+
const storageConstruct = fn(this, stack.getStack());
|
|
423
|
+
stack.addConstruct(storageConstruct);
|
|
420
424
|
return storageConstruct;
|
|
421
425
|
}
|
|
426
|
+
resolveStorageStack(placement) {
|
|
427
|
+
switch (placement) {
|
|
428
|
+
case "cdn":
|
|
429
|
+
return this.getDefaultCdnStack();
|
|
430
|
+
case "compute":
|
|
431
|
+
return this.getDefaultComputeStack();
|
|
432
|
+
default:
|
|
433
|
+
return this.getDefaultStorageStack();
|
|
434
|
+
}
|
|
435
|
+
}
|
|
422
436
|
/**
|
|
423
437
|
* Add a CDN resource (CloudFront) to the default CDN stack using the factory pattern.
|
|
424
438
|
*
|
|
425
439
|
* @example
|
|
426
440
|
* // S3 origin
|
|
427
|
-
* const assets = app.addStorage(StorageFactory.build("Assets", {
|
|
441
|
+
* const assets = app.addStorage(StorageFactory.build("Assets", {}));
|
|
428
442
|
* app.addCdn(CdnFactory.build("AssetsCdn", {
|
|
429
443
|
* originType: "s3",
|
|
430
444
|
* bucket: assets
|
|
@@ -546,7 +560,7 @@ class App extends aws_cdk_lib_1.App {
|
|
|
546
560
|
storageStack.addConstruct(resource);
|
|
547
561
|
}
|
|
548
562
|
/**
|
|
549
|
-
*
|
|
563
|
+
* Initialise standard tags
|
|
550
564
|
*/
|
|
551
565
|
initialiseStandardTags() {
|
|
552
566
|
const config = (0, getConfig_1.getConfig)();
|
|
@@ -561,9 +575,9 @@ class App extends aws_cdk_lib_1.App {
|
|
|
561
575
|
applyTagsAspect() {
|
|
562
576
|
if (!this.aspectApplied && Object.keys(this.globalTags).length > 0) {
|
|
563
577
|
// Apply standard tags using Tags.of(this).add()
|
|
564
|
-
Object.entries(this.globalTags)
|
|
578
|
+
for (const [key, value] of Object.entries(this.globalTags)) {
|
|
565
579
|
aws_cdk_lib_1.Tags.of(this).add(key, value);
|
|
566
|
-
}
|
|
580
|
+
}
|
|
567
581
|
// Apply aspect for resource-specific tags (IPAM pool, backup tier)
|
|
568
582
|
aws_cdk_lib_1.Aspects.of(this).add(new standardTagsAspect_1.StandardTagsAspect());
|
|
569
583
|
this.aspectApplied = true;
|
|
@@ -586,9 +600,9 @@ class App extends aws_cdk_lib_1.App {
|
|
|
586
600
|
...this.globalTags,
|
|
587
601
|
...tags
|
|
588
602
|
};
|
|
589
|
-
|
|
603
|
+
for (const [key, value] of Object.entries(tags)) {
|
|
590
604
|
aws_cdk_lib_1.Tags.of(this).add(key, value);
|
|
591
|
-
}
|
|
605
|
+
}
|
|
592
606
|
return this;
|
|
593
607
|
}
|
|
594
608
|
/**
|
|
@@ -597,6 +611,9 @@ class App extends aws_cdk_lib_1.App {
|
|
|
597
611
|
* @returns {ResourceInventory} Complete inventory of all resources in the app
|
|
598
612
|
*/
|
|
599
613
|
exportResourceInventory() {
|
|
614
|
+
if (!this.resourceInventory) {
|
|
615
|
+
throw new Error("Resource inventory not available. Ensure a ResourceInventoryAspect has been added before calling exportResourceInventory().");
|
|
616
|
+
}
|
|
600
617
|
return {
|
|
601
618
|
resources: this.resourceInventory.getInventory(),
|
|
602
619
|
generatedAt: new Date().toISOString(),
|
|
@@ -631,4 +648,4 @@ class App extends aws_cdk_lib_1.App {
|
|
|
631
648
|
exports.App = App;
|
|
632
649
|
App.instance = null;
|
|
633
650
|
exports.default = App;
|
|
634
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FLcUI7QUFHckIsd0RBQXFEO0FBR3JELDJDQUF1QztBQUN2QyxxREFBbUU7QUFFbkUsb0RBSWdDO0FBTWhDLG1FQUFnRTtBQUtoRSxpREFBOEM7QUFDOUMsOEVBQThFO0FBQzlFLG9EQUE4RDtBQUM5RCwrREFBK0Q7QUFDL0QsMENBQW9EO0FBQ3BELCtEQUF1RDtBQUN2RCwyREFJZ0M7QUErQmhDOzs7O0dBSUc7QUFDSCxNQUFhLEdBQUksU0FBUSxpQkFBTTtJQWtCN0IsWUFBb0IsSUFBYSxFQUFFLE9BQXFCO1FBQ3RELEtBQUssRUFBRSxDQUFDO1FBZkYsV0FBTSxHQUFnQyxFQUFFLENBQUM7UUFHekMsbUJBQWMsR0FBRyxJQUFJLEdBQUcsRUFBZ0IsQ0FBQztRQUt6QyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixlQUFVLEdBQThCLEVBQUUsQ0FBQztRQUMzQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQU81QixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVwQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxVQUFVLENBQUM7UUFFL0IsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFBLHFDQUFvQixFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QiwrQ0FBK0M7UUFDL0MsSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7YUFBTSxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FB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UyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUU7WUFDaEQsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ3JDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBK0I7UUFDMUMsMEJBQTBCO1FBQzFCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEMsbURBQW1EO1FBQ25ELElBQUksQ0FBQztZQUNILElBQUEsOEJBQWEsRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZiw0Q0FBNEM7WUFDNUMsTUFBTSxZQUFZLEdBQ2hCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RCw4QkFBVyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7QUFwdEJILGtCQXF0QkM7QUFwdEJnQixZQUFRLEdBQWUsSUFBSSxBQUFuQixDQUFvQjtBQXN0QjdDLGtCQUFlLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFwcCBhcyBDZGtBcHAsXG4gIEFzcGVjdHMsXG4gIFRhZ3MsXG4gIHR5cGUgU3RhZ2VTeW50aGVzaXNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgdHlwZSBDbG91ZEFzc2VtYmx5IH0gZnJvbSBcImF3cy1jZGstbGliL2N4LWFwaVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL3ZwY1wiO1xuaW1wb3J0IHsgdHlwZSBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IHR5cGUgUm9sZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuL3Jlc291cmNlc1wiO1xuaW1wb3J0IHsgdHlwZSBFY3IsIEVjckZhY3RvcnkgfSBmcm9tIFwiLi9yZXNvdXJjZXMvYXdzL3N0b3JhZ2UvZWNyXCI7XG5pbXBvcnQgeyB0eXBlIEFueURhdGFiYXNlIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL2RhdGFiYXNlXCI7XG5pbXBvcnQge1xuICB0eXBlIElOZXR3b3JrUHJvcHMsXG4gIE5ldHdvcmtGYWN0b3J5LFxuICB0eXBlIE5ldHdvcmtcbn0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL25ldHdvcmtcIjtcbmltcG9ydCB7IHR5cGUgQ2RuIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL2NkblwiO1xuaW1wb3J0IHsgdHlwZSBBbnlNZXNzYWdpbmcgfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvbWVzc2FnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIEFueUNvbXB1dGUgfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvY29tcHV0ZVwiO1xuaW1wb3J0IHsgdHlwZSBBbnlTdG9yYWdlIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL3N0b3JhZ2VcIjtcbmltcG9ydCB7IHR5cGUgQW55UGF0dGVybiB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9wYXR0ZXJuXCI7XG5pbXBvcnQgeyBTdGFuZGFyZFRhZ3NBc3BlY3QgfSBmcm9tIFwiLi91dGlscy9zdGFuZGFyZFRhZ3NBc3BlY3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgUmVzb3VyY2VJbnZlbnRvcnlBc3BlY3QsXG4gIHR5cGUgUmVzb3VyY2VJbnZlbnRvcnlcbn0gZnJvbSBcIi4vYXNwZWN0cy9yZXNvdXJjZUludmVudG9yeVwiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4vdXRpbHMvZ2V0Q29uZmlnXCI7XG5pbXBvcnQgTW9uaXRvcmluZ1JvbGVGYWN0b3J5IGZyb20gXCIuL3Jlc291cmNlcy9hd3MvbW9uaXRvcmluZy9tb25pdG9yaW5nUm9sZVwiO1xuaW1wb3J0IHsgRkpBTExfTU9OSVRPUklOR19DT05GSUcgfSBmcm9tIFwiLi9jb25maWcvbW9uaXRvcmluZ1wiO1xuaW1wb3J0IEF1ZGl0Um9sZUZhY3RvcnkgZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9hdWRpdC9hdWRpdFJvbGVcIjtcbmltcG9ydCB7IEZKQUxMX0FVRElUX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZy9hdWRpdFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyXCI7XG5pbXBvcnQge1xuICBnZXRNYW5pZmVzdENvbGxlY3RvcixcbiAgd3JpdGVNYW5pZmVzdCxcbiAgdHlwZSBNYW5pZmVzdENvbGxlY3RvclxufSBmcm9tIFwiLi91dGlscy9tYW5pZmVzdFdyaXRlclwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQXBwLmdldEFwcCgpLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYXBwIHdpdGggbmV3IFZQQ1xuICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gKiAgIG5ldHdvcms6IHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhcHAgdXNpbmcgZXhpc3RpbmcgVlBDXG4gKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAqICAgbmV0d29yazogeyB1c2VFeGlzdGluZzogXCJ2cGMtMTIzNDU2NzhcIiB9XG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFwcCB3aXRob3V0IG5ldHdvcmsgKFMzLW9ubHkgYXBwcylcbiAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiBmYWxzZSB9KTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXBwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT2JqZWN0IHdpdGggSU5ldHdvcmtQcm9wczogQ3JlYXRlIG5ldyBWUEMgd2l0aCBjb25maWdcbiAgICogLSBmYWxzZTogTm8gbmV0d29yayAoZm9yIFMzLW9ubHkgYXBwcylcbiAgICogLSB7IHVzZUV4aXN0aW5nOiBzdHJpbmcgfTogVXNlIGV4aXN0aW5nIFZQQyBieSBJRFxuICAgKi9cbiAgbmV0d29yaz86IElOZXR3b3JrUHJvcHMgfCBmYWxzZSB8IHsgdXNlRXhpc3Rpbmc6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNpYyBjb3JuZXItc3RvbmUgb2YgYWxsIEZqYWxsLWhvc3RlZCBhcHBsaWNhdGlvbnMuXG4gKiAgVGhpcyBjbGFzcyBpcyBhIHNpbmdsZXRvbiBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2VcbiAqICAgYWxsIHJlc291cmNlcyBpbiBhIEZqYWxsIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXBwIGV4dGVuZHMgQ2RrQXBwIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFwcCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0YWNrczogeyBba2V5OiBzdHJpbmddOiBBd3NTdGFjayB9ID0ge307XG5cbiAgcHJpdmF0ZSB2cGM/OiBJVnBjO1xuICBwcml2YXRlIGFkZGl0aW9uYWxWcGNzID0gbmV3IE1hcDxzdHJpbmcsIElWcGM+KCk7XG4gIHByaXZhdGUgZGVmYXVsdEVjciE6IEVjcjtcbiAgcHJpdmF0ZSBkZWZhdWx0TW9uaXRvcmluZ1JvbGUhOiBSb2xlO1xuICBwcml2YXRlIGRlZmF1bHRBdWRpdFJvbGUhOiBSb2xlO1xuICBwcml2YXRlIGF1ZGl0Um9sZUV4dGVybmFsSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgbmV0d29ya0Rpc2FibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgZ2xvYmFsVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwcml2YXRlIGFzcGVjdEFwcGxpZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvdXJjZUludmVudG9yeSE6IFJlc291cmNlSW52ZW50b3J5QXNwZWN0O1xuICBwcml2YXRlIG1hbmlmZXN0Q29sbGVjdG9yOiBNYW5pZmVzdENvbGxlY3RvcjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBJQXBwT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBBcHAuaW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZSA/PyBcIkZqYWxsQXBwXCI7XG5cbiAgICAvLyBJbml0aWFsaXNlIG1hbmlmZXN0IGNvbGxlY3RvciBmb3IgYnVpbGQtdGltZSBzZXJ2aWNlIGRpc2NvdmVyeVxuICAgIHRoaXMubWFuaWZlc3RDb2xsZWN0b3IgPSBnZXRNYW5pZmVzdENvbGxlY3Rvcih0aGlzLm5hbWUpO1xuXG4gICAgdGhpcy5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG5cbiAgICAvLyBJbml0aWFsaXNlIG5ldHdvcmsgaW1tZWRpYXRlbHkgaWYgY29uZmlndXJlZFxuICAgIGlmIChvcHRpb25zPy5uZXR3b3JrID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5uZXR3b3JrRGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8ubmV0d29yaykge1xuICAgICAgdGhpcy5pbml0aWFsaXNlTmV0d29yayhvcHRpb25zLm5ldHdvcmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlIHRoZSBuZXR3b3JrIChWUEMpIGZvciB0aGlzIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXNlTmV0d29yayhcbiAgICBjb25maWc6IElOZXR3b3JrUHJvcHMgfCB7IHVzZUV4aXN0aW5nOiBzdHJpbmcgfVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcblxuICAgIGlmIChcInVzZUV4aXN0aW5nXCIgaW4gY29uZmlnKSB7XG4gICAgICB0aGlzLnZwYyA9IFZwYy5mcm9tTG9va3VwKFxuICAgICAgICBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSxcbiAgICAgICAgYCR7dGhpcy5uYW1lfUltcG9ydGVkVnBjYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwY0lkOiBjb25maWcudXNlRXhpc3RpbmdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmtGYWN0b3J5LmJ1aWxkKGAke3RoaXMubmFtZX1WcGNgLCBjb25maWcpKFxuICAgICAgICB0aGlzLFxuICAgICAgICBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKVxuICAgICAgKTtcbiAgICAgIHRoaXMudnBjID0gbmV0d29yay5nZXRWcGMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYXBwbGljYXRpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldC9DcmVhdGUgYSBiYXNpYyBGamFsbCBBcHBsaWNhdGlvbiB3aXRoIHN0YW5kYXJkIHRhZ3MgYXBwbGllZC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgQXBwbGljYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIG5ldHdvcmsgc2V0dGluZ3NcbiAgICogQHJldHVybnMge0FwcH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQ3JlYXRlIGFwcCB3aXRoIG5ldyBWUENcbiAgICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gICAqICAgbmV0d29yazogeyBtYXhBenM6IDIsIG5hdEdhdGV3YXlzOiBmYWxzZSB9XG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBDcmVhdGUgYXBwIHVzaW5nIGV4aXN0aW5nIFZQQ1xuICAgKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAgICogICBuZXR3b3JrOiB7IHVzZUV4aXN0aW5nOiBcInZwYy0xMjM0NTY3OFwiIH1cbiAgICogfSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENyZWF0ZSBhcHAgd2l0aG91dCBuZXR3b3JrIChTMy1vbmx5IGFwcHMpXG4gICAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiBmYWxzZSB9KTtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QXBwKG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBJQXBwT3B0aW9ucyk6IEFwcCB7XG4gICAgY29uc3QgYXBwID0gQXBwLmdldEluc3RhbmNlKG5hbWUsIG9wdGlvbnMpO1xuICAgIGFwcC5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvQ3JlYXRlIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEFwcFxuICAgKiBAcGFyYW0gbmFtZSBBcHBsaWNhdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgbmV0d29yayBzZXR0aW5nc1xuICAgKiBAcmV0dXJucyB7QXBwfVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZShuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpOiBBcHAge1xuICAgIC8vIERlc3BpdGUgc3VwcG9ydGluZyBtdWx0aXBsZSBzdGFja3MgeW91IGNhbiBzdGlsbCBvbmx5IGV2ZXJcbiAgICAvLyBoYXZlIGEgc2luZ2xlIEFwcGxpY2F0aW9uIHBlciBDREsgZGVwbG95bWVudFxuICAgIGlmICghQXBwLmluc3RhbmNlKSB7XG4gICAgICBBcHAuaW5zdGFuY2UgPSBuZXcgQXBwKG5hbWUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBzaW5nbGV0b24gZXhpc3RzIGJ1dCBuYW1lIGRpZmZlcnMsIHVwZGF0ZSBpdCAoYmVmb3JlIGFueSBpbmZyYSBpcyBkZWZpbmVkKVxuICAgICAgaWYgKG5hbWUgJiYgQXBwLmluc3RhbmNlLm5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgLy8gV2FybiBpZiBuZXR3b3JrIGFscmVhZHkgaW5pdGlhbGlzZWQgLSBjaGFuZ2luZyBuYW1lIGFmdGVyIG5ldHdvcmsgZXhpc3RzIGNyZWF0ZXMgYSBtaXNtYXRjaFxuICAgICAgICBpZiAoQXBwLmluc3RhbmNlLnZwYykge1xuICAgICAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgQXBwIG5hbWUgY2hhbmdlZCBmcm9tIFwiJHtBcHAuaW5zdGFuY2UubmFtZX1cIiB0byBcIiR7bmFtZX1cIiBhZnRlciBuZXR3b3JrIHdhcyBpbml0aWFsaXNlZC4gYCArXG4gICAgICAgICAgICAgIGBWUEMgd2lsbCBoYXZlIG5hbWUgXCIke0FwcC5pbnN0YW5jZS5uYW1lfVZwY1wiIGJ1dCBhcHAgbmFtZSBpcyBcIiR7bmFtZX1cIi4gYCArXG4gICAgICAgICAgICAgIGBFbnN1cmUgQXBwLmdldEFwcCgpIGlzIGNhbGxlZCB3aXRoIHRoZSBmaW5hbCBuYW1lIGJlZm9yZSBpbml0aWFsaXNpbmcgbmV0d29yay5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBBcHAuaW5zdGFuY2UubmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIFJlaW5pdGlhbGlzZSBzdGFuZGFyZCB0YWdzIHdpdGggdGhlIG5ldyBuYW1lXG4gICAgICAgIEFwcC5pbnN0YW5jZS5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG9wdGlvbnMgcHJvdmlkZWQgYnV0IG5ldHdvcmsgbm90IHlldCBpbml0aWFsaXNlZCwgaW5pdGlhbGlzZSBpdCBub3dcbiAgICAgIGlmIChvcHRpb25zPy5uZXR3b3JrID09PSBmYWxzZSkge1xuICAgICAgICBBcHAuaW5zdGFuY2UubmV0d29ya0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIG9wdGlvbnM/Lm5ldHdvcmsgJiZcbiAgICAgICAgIUFwcC5pbnN0YW5jZS52cGMgJiZcbiAgICAgICAgIUFwcC5pbnN0YW5jZS5uZXR3b3JrRGlzYWJsZWRcbiAgICAgICkge1xuICAgICAgICBBcHAuaW5zdGFuY2UuaW5pdGlhbGlzZU5ldHdvcmsob3B0aW9ucy5uZXR3b3JrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXBwLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGEgc3RhY2sgYnkga2V5LiBJZiB0aGUgc3RhY2sgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogIERlcGVuZGVuY2llcyBhcmUgb25seSBhcHBsaWVkIHRoZSBmaXJzdCB0aW1lIGEgc3RhY2sgaXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgb2YgdGhlIHN0YWNrXG4gICAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgLSBUaGUgc3RhY2socykgdGhhdCB0aGlzIHN0YWNrIGRlcGVuZHMgb25cbiAgICogQHJldHVybnMge0F3c1N0YWNrfVxuICAgKi9cbiAgcHVibGljIGdldFN0YWNrKGtleTogc3RyaW5nLCBkZXBlbmRlbmNpZXM/OiBBd3NTdGFjayB8IEF3c1N0YWNrW10pOiBBd3NTdGFjayB7XG4gICAgLy8gQXBwbHkgdGhlIGFzcGVjdCBvbmNlIGJlZm9yZSBjcmVhdGluZyB0aGUgZmlyc3Qgc3RhY2tcbiAgICBpZiAoXG4gICAgICAhdGhpcy5hc3BlY3RBcHBsaWVkICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0YWNrcykubGVuZ3RoID09PSAwICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbFRhZ3MpLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuYXBwbHlUYWdzQXNwZWN0KCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YWNrc1trZXldKSB7XG4gICAgICB0aGlzLnN0YWNrc1trZXldID0gbmV3IEF3c1N0YWNrKGtleSwgZGVwZW5kZW5jaWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGFja3Nba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IGNvbXB1dGUgc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9Q29tcHV0ZWBcbiAgICpcbiAgICogT25seSBkZXBlbmRzIG9uIE5ldHdvcmsuIERhdGFiYXNlIGRlcGVuZGVuY3kgaXMgYWRkZWQgYXV0b21hdGljYWxseVxuICAgKiBieSBDREsgd2hlbiBjb21wdXRlIHJlc291cmNlcyByZWZlcmVuY2UgZGF0YWJhc2UgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soYCR7dGhpcy5uYW1lfUNvbXB1dGVgLCB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBuZXR3b3JrIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfU5ldHdvcmtgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0TmV0d29ya1N0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhgJHt0aGlzLm5hbWV9TmV0d29ya2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgZGF0YWJhc2Ugc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9RGF0YWJhc2VgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0RGF0YWJhc2VTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soYCR7dGhpcy5uYW1lfURhdGFiYXNlYCwgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgc3RvcmFnZSBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1TdG9yYWdlYFxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soYCR7dGhpcy5uYW1lfVN0b3JhZ2VgLCB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBDRE4gc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9Q2RuYFxuICAgKlxuICAgKiBEZXBlbmRzIG9uIE5ldHdvcmsuIENvbXB1dGUvU3RvcmFnZSBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHlcbiAgICogYnkgQ0RLIHdoZW4gQ0ROIHJlc291cmNlcyByZWZlcmVuY2UgQUxCIG9yIFMzIGJ1Y2tldCByZXNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q2RuU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKGAke3RoaXMubmFtZX1DZG5gLCB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBtZXNzYWdpbmcgc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9TWVzc2FnaW5nYFxuICAgKlxuICAgKiBVc2VkIGZvciBTUVMgcXVldWVzLCBTTlMgdG9waWNzLCBhbmQgRXZlbnRCcmlkZ2UgZXZlbnQgYnVzZXMuXG4gICAqIERlcGVuZHMgb24gTmV0d29yayBvbmx5LiBUaGVzZSBhcmUgcmVnaW9uYWwgc2VydmljZXMgdGhhdCBkb24ndFxuICAgKiByZXF1aXJlIFZQQywgYnV0IHdlIG1haW50YWluIGNvbnNpc3RlbnQgc3RhY2sgZGVwZW5kZW5jeSBwYXR0ZXJucy5cbiAgICpcbiAgICogQHJldHVybnMge0F3c1N0YWNrfVxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHRNZXNzYWdpbmdTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soXG4gICAgICBgJHt0aGlzLm5hbWV9TWVzc2FnaW5nYCxcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBWUEMgYnkgbmFtZS4gSWYgbm8gbmFtZSBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgZGVmYXVsdCBWUEMuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBwdXJlIGdldHRlciAtIGl0IG5ldmVyIGNyZWF0ZXMgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqIE5ldHdvcmsgbXVzdCBiZSBjb25maWd1cmVkIHZpYSBBcHAuZ2V0QXBwKCkgb3B0aW9ucyBvciBhcHAuYWRkTmV0d29yaygpLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIFZQQyB0byByZXRyaWV2ZS4gSWYgbm90IHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkZWZhdWx0IFZQQy5cbiAgICogQHJldHVybnMge0lWcGN9IFRoZSBjb25maWd1cmVkIFZQQ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbmV0d29yayBpcyBkaXNhYmxlZCwgbm90IGNvbmZpZ3VyZWQsIG9yIG5hbWVkIFZQQyBub3QgZm91bmRcbiAgICovXG4gIHB1YmxpYyBnZXRWcGMobmFtZT86IHN0cmluZyk6IElWcGMge1xuICAgIGlmICh0aGlzLm5ldHdvcmtEaXNhYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk5ldHdvcmsgaXMgZGlzYWJsZWQgZm9yIHRoaXMgYXBwLiBDYW5ub3QgZ2V0IFZQQy4gXCIgK1xuICAgICAgICAgIFwiUGFzcyBuZXR3b3JrIGNvbmZpZyB0byBBcHAuZ2V0QXBwKCkgdG8gZW5hYmxlIG5ldHdvcmtpbmcuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSWYgbmFtZSBpcyBwcm92aWRlZCwgbG9vayBpbiBhZGRpdGlvbmFsIFZQQ3MgZmlyc3RcbiAgICBpZiAobmFtZSkge1xuICAgICAgY29uc3QgYWRkaXRpb25hbFZwYyA9IHRoaXMuYWRkaXRpb25hbFZwY3MuZ2V0KG5hbWUpO1xuICAgICAgaWYgKGFkZGl0aW9uYWxWcGMpIHtcbiAgICAgICAgcmV0dXJuIGFkZGl0aW9uYWxWcGM7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWUEMgJyR7bmFtZX0nIG5vdCBmb3VuZC4gQXZhaWxhYmxlIFZQQ3M6ICR7dGhpcy5nZXRWcGNOYW1lcygpLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICAgIFwiQ3JlYXRlIGFkZGl0aW9uYWwgVlBDcyB1c2luZyBhcHAuYWRkTmV0d29yayhOZXR3b3JrRmFjdG9yeS5idWlsZCguLi4pKS5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZGVmYXVsdCBWUENcbiAgICBpZiAoIXRoaXMudnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTmV0d29yayBub3QgY29uZmlndXJlZC4gUGFzcyBuZXR3b3JrIGNvbmZpZyB0byBBcHAuZ2V0QXBwKCkuIFwiICtcbiAgICAgICAgICBcIkV4YW1wbGU6IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiB7IG1heEF6czogMiB9IH0pXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZwYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5hbWVzIG9mIGFsbCBhdmFpbGFibGUgVlBDcy5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBBcnJheSBvZiBWUEMgbmFtZXMuIEluY2x1ZGVzIFwiZGVmYXVsdFwiIGlmIHRoZSBkZWZhdWx0IFZQQyBpcyBjb25maWd1cmVkLlxuICAgKi9cbiAgcHVibGljIGdldFZwY05hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy52cGMpIHtcbiAgICAgIG5hbWVzLnB1c2goXCJkZWZhdWx0XCIpO1xuICAgIH1cbiAgICBuYW1lcy5wdXNoKC4uLnRoaXMuYWRkaXRpb25hbFZwY3Mua2V5cygpKTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmVpdmUgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGFpbmVyIHJlZ2lzdHJ5LiBJZiB0aGUgcmVnaXN0cnkgZG9lcyBub3QgZXhpc3RcbiAgICogIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKTogRWNyIHtcbiAgICBpZiAoIXRoaXMuZGVmYXVsdEVjcikge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG5cbiAgICAgIHRoaXMuZGVmYXVsdEVjciA9IEVjckZhY3RvcnkuYnVpbGQoYCR7dGhpcy5uYW1lfUVjcmApKFxuICAgICAgICB0aGlzLFxuICAgICAgICBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0RWNyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgbW9uaXRvcmluZyByb2xlIGluIHRoZSBOZXR3b3JrIHN0YWNrIHRoYXQgYWxsb3dzXG4gICAqIHRoZSBGamFsbCB3ZWJhcHAgdG8gcXVlcnkgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBFQ1Mgc3RhdHVzLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViYXBwQWNjb3VudElkIC0gT3B0aW9uYWwgQVdTIGFjY291bnQgSUQgb2YgdGhlIEZqYWxsIHdlYmFwcC4gRGVmYXVsdHMgdG8gY29uZmlndXJlZCBwbGF0Zm9ybSBhY2NvdW50LlxuICAgKiBAcmV0dXJucyB7Um9sZX0gVGhlIGNyZWF0ZWQgbW9uaXRvcmluZyByb2xlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTW9uaXRvcmluZ1JvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRNb25pdG9yaW5nUm9sZSkge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgICB3ZWJhcHBBY2NvdW50SWQgfHwgRkpBTExfTU9OSVRPUklOR19DT05GSUcud2ViYXBwQXdzQWNjb3VudElkO1xuXG4gICAgICB0aGlzLmRlZmF1bHRNb25pdG9yaW5nUm9sZSA9IE1vbml0b3JpbmdSb2xlRmFjdG9yeS5idWlsZChcbiAgICAgICAgYCR7dGhpcy5uYW1lfU1vbml0b3JpbmdSb2xlYCxcbiAgICAgICAge1xuICAgICAgICAgIHdlYmFwcEFjY291bnRJZDogYWNjb3VudElkLFxuICAgICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfTU9OSVRPUklOR19DT05GSUcucm9sZU5hbWVQcmVmaXgsXG4gICAgICAgICAgcm9sZVBhdGg6IEZKQUxMX01PTklUT1JJTkdfQ09ORklHLnJvbGVQYXRoXG4gICAgICAgIH1cbiAgICAgICkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcm9sZSB3aXRoIHRoZSBuZXR3b3JrIHN0YWNrXG4gICAgICBuZXR3b3JrU3RhY2suYWRkQ29uc3RydWN0KHRoaXMuZGVmYXVsdE1vbml0b3JpbmdSb2xlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY3Jvc3MtYWNjb3VudCBhdWRpdCByb2xlIGluIHRoZSBOZXR3b3JrIHN0YWNrIHRoYXQgYWxsb3dzXG4gICAqIHRoZSBGamFsbCBwbGF0Zm9ybSB0byB1c2UgQ2xvdWRRdWVyeSBmb3IgY29tcHJlaGVuc2l2ZSBBV1MgcmVzb3VyY2UgYXVkaXRpbmcuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gZXhwbGljaXQgb3B0LWluIGZlYXR1cmUuIENhbGwgdGhpcyBtZXRob2QgdG8gZW5hYmxlIENsb3VkUXVlcnlcbiAgICogYXVkaXQgY2FwYWJpbGl0aWVzIGZvciB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViYXBwQWNjb3VudElkIC0gT3B0aW9uYWwgQVdTIGFjY291bnQgSUQgb2YgdGhlIEZqYWxsIHdlYmFwcC4gRGVmYXVsdHMgdG8gY29uZmlndXJlZCBwbGF0Zm9ybSBhY2NvdW50LlxuICAgKiBAcGFyYW0gZXh0ZXJuYWxJZCAtIE9wdGlvbmFsIGV4dGVybmFsIElEIGZvciBhZGRpdGlvbmFsIHNlY3VyaXR5LiBJZiBub3QgcHJvdmlkZWQsIGEgdW5pcXVlIElEIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgKiBAcmV0dXJucyB7Um9sZX0gVGhlIGNyZWF0ZWQgYXVkaXQgcm9sZVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUF1ZGl0Um9sZSh3ZWJhcHBBY2NvdW50SWQ/OiBzdHJpbmcsIGV4dGVybmFsSWQ/OiBzdHJpbmcpOiBSb2xlIHtcbiAgICBpZiAoIXRoaXMuZGVmYXVsdEF1ZGl0Um9sZSkge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgICB3ZWJhcHBBY2NvdW50SWQgfHwgRkpBTExfQVVESVRfQ09ORklHLndlYmFwcEF3c0FjY291bnRJZDtcblxuICAgICAgLy8gR2VuZXJhdGUgb3IgdXNlIHByb3ZpZGVkIGV4dGVybmFsIElEXG4gICAgICB0aGlzLmF1ZGl0Um9sZUV4dGVybmFsSWQgPSBleHRlcm5hbElkIHx8IHRoaXMuZ2VuZXJhdGVBdWRpdEV4dGVybmFsSWQoKTtcblxuICAgICAgdGhpcy5kZWZhdWx0QXVkaXRSb2xlID0gQXVkaXRSb2xlRmFjdG9yeS5idWlsZChgJHt0aGlzLm5hbWV9QXVkaXRSb2xlYCwge1xuICAgICAgICB3ZWJhcHBBY2NvdW50SWQ6IGFjY291bnRJZCxcbiAgICAgICAgYXBwTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICBleHRlcm5hbElkOiB0aGlzLmF1ZGl0Um9sZUV4dGVybmFsSWQsXG4gICAgICAgIHJvbGVOYW1lUHJlZml4OiBGSkFMTF9BVURJVF9DT05GSUcucm9sZU5hbWVQcmVmaXgsXG4gICAgICAgIHJvbGVQYXRoOiBGSkFMTF9BVURJVF9DT05GSUcucm9sZVBhdGhcbiAgICAgIH0pKHRoaXMsIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHJvbGUgd2l0aCB0aGUgbmV0d29yayBzdGFja1xuICAgICAgbmV0d29ya1N0YWNrLmFkZENvbnN0cnVjdCh0aGlzLmRlZmF1bHRBdWRpdFJvbGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlZmF1bHRBdWRpdFJvbGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBleHRlcm5hbCBJRCB1c2VkIGZvciB0aGUgYXVkaXQgcm9sZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUaGUgZXh0ZXJuYWwgSUQgaWYgYXVkaXQgcm9sZSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0QXVkaXRSb2xlRXh0ZXJuYWxJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmF1ZGl0Um9sZUV4dGVybmFsSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSB1bmlxdWUgZXh0ZXJuYWwgSUQgZm9yIGF1ZGl0IHJvbGVcbiAgICogRm9ybWF0OiBmamFsbC1hdWRpdC17YXBwTmFtZX0te3RpbWVzdGFtcH1cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVBdWRpdEV4dGVybmFsSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBgZmphbGwtYXVkaXQtJHt0aGlzLm5hbWUudG9Mb3dlckNhc2UoKX0tJHt0aW1lc3RhbXB9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb21wdXRlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGNvbXB1dGUgc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICogQXV0b21hdGljYWxseSBjcmVhdGVzIG1vbml0b3Jpbmcgcm9sZSBpZiBub3QgYWxyZWFkeSBjcmVhdGVkLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBjb21wdXRlIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgY29uZmlndXJhdGlvbjpcbiAgICogLSBFY3NDb21wdXRlIGZvciB0eXBlOiBcImVjc1wiXG4gICAqIC0gTGFtYmRhQ29tcHV0ZSBmb3IgdHlwZTogXCJsYW1iZGFcIlxuICAgKiAtIEVjMkNvbXB1dGUgZm9yIHR5cGU6IFwiZWMyXCJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRUNTIGNvbXB1dGUgLSByZXR1cm5zIEVjc0NvbXB1dGVcbiAgICogY29uc3QgYXBpID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJBcGlcIiwge1xuICAgKiAgIHR5cGU6IFwiZWNzXCIsXG4gICAqICAgc2VydmljZXM6IFt7IG5hbWU6IFwiYXBpXCIsIC4uLiB9XVxuICAgKiB9KSk7XG4gICAqIGFwaS5nZXRMb2FkQmFsYW5jZXIoKTsgLy8gQXZhaWxhYmxlIG9uIEVjc0NvbXB1dGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gTGFtYmRhIGNvbXB1dGUgLSByZXR1cm5zIExhbWJkYUNvbXB1dGVcbiAgICogY29uc3Qgd29ya2VyID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJXb3JrZXJcIiwge1xuICAgKiAgIHR5cGU6IFwibGFtYmRhXCIsXG4gICAqICAgZnVuY3Rpb25zOiBbeyBuYW1lOiBcInByb2Nlc3NcIiwgLi4uIH1dXG4gICAqIH0pKTtcbiAgICogd29ya2VyLmdldEZ1bmN0aW9uKFwicHJvY2Vzc1wiKTsgLy8gQXZhaWxhYmxlIG9uIExhbWJkYUNvbXB1dGVcbiAgICovXG4gIHB1YmxpYyBhZGRDb21wdXRlPFQgZXh0ZW5kcyBBbnlDb21wdXRlPihcbiAgICBmbjogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBUXG4gICk6IFQge1xuICAgIC8vIEF1dG8tY3JlYXRlIG1vbml0b3Jpbmcgcm9sZSB3aGVuIGNvbXB1dGUgaXMgYWRkZWRcbiAgICBpZiAoIXRoaXMuZGVmYXVsdE1vbml0b3JpbmdSb2xlKSB7XG4gICAgICB0aGlzLmNyZWF0ZU1vbml0b3JpbmdSb2xlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk7XG4gICAgY29uc3QgY29uc3RydWN0ID0gZm4odGhpcywgY29tcHV0ZVN0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QoY29uc3RydWN0KTtcbiAgICByZXR1cm4gY29uc3RydWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IGFkZCBhIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGNvbXB1dGUgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYWRkQ29tcHV0ZVJlc291cmNlKHJlc291cmNlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wdXRlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICBjb21wdXRlU3RhY2suYWRkQ29uc3RydWN0KHJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBkYXRhYmFzZSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBkYXRhYmFzZSB0eXBlIGJhc2VkIG9uIHRoZSBmYWN0b3J5IHVzZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEF1cm9yYSBkYXRhYmFzZSAtIHJldHVybnMgUmVsYXRpb25hbERhdGFiYXNlXG4gICAqIGNvbnN0IGRiID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIk1haW5cIiwge1xuICAgKiAgIHR5cGU6IFwiQXVyb3JhXCIsXG4gICAqICAgZGF0YWJhc2VOYW1lOiBcIm15YXBwXCJcbiAgICogfSkpO1xuICAgKiBkYi5nZXRIb3N0RW5kcG9pbnQoKTsgLy8gQXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIER5bmFtb0RCIHRhYmxlIC0gcmV0dXJucyBEeW5hbW9EQkRhdGFiYXNlXG4gICAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAgICogICB0eXBlOiBcIkR5bmFtb0RCXCIsXG4gICAqICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJTXCIgfVxuICAgKiB9KSk7XG4gICAqIGNhY2hlLmdldFRhYmxlTmFtZSgpOyAvLyBBdmFpbGFibGVcbiAgICovXG4gIHB1YmxpYyBhZGREYXRhYmFzZTxUIGV4dGVuZHMgQW55RGF0YWJhc2U+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgZGF0YWJhc2VTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTtcbiAgICBjb25zdCBkYXRhYmFzZUNvbnN0cnVjdCA9IGZuKHRoaXMsIGRhdGFiYXNlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgZGF0YWJhc2VTdGFjay5hZGRDb25zdHJ1Y3QoZGF0YWJhc2VDb25zdHJ1Y3QpO1xuXG4gICAgcmV0dXJuIGRhdGFiYXNlQ29uc3RydWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0b3JhZ2UgcmVzb3VyY2UgKFMzKSB0byB0aGUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHN0b3JhZ2UgdHlwZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uOlxuICAgKiAtIFByaXZhdGVTdG9yYWdlIGZvciBidWNrZXRUeXBlOiBcInByaXZhdGVcIlxuICAgKiAtIFdlYnNpdGVTdG9yYWdlIGZvciBidWNrZXRUeXBlOiBcIndlYnNpdGVcIlxuICAgKiAtIFB1YmxpY1N0b3JhZ2UgZm9yIGJ1Y2tldFR5cGU6IFwicHVibGljUmVhZFwiXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFByaXZhdGUgc3RvcmFnZSAtIHJldHVybnMgUHJpdmF0ZVN0b3JhZ2VcbiAgICogY29uc3QgYXNzZXRzID0gYXBwLmFkZFN0b3JhZ2UoU3RvcmFnZUZhY3RvcnkuYnVpbGQoXCJBc3NldHNcIiwge1xuICAgKiAgIGJ1Y2tldFR5cGU6IFwicHJpdmF0ZVwiXG4gICAqIH0pKTtcbiAgICogYXNzZXRzLmdyYW50UHVibGljQWNjZXNzKFwicHVibGljLypcIik7IC8vIEF2YWlsYWJsZSBvbiBQcml2YXRlU3RvcmFnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBXZWJzaXRlIHN0b3JhZ2UgLSByZXR1cm5zIFdlYnNpdGVTdG9yYWdlXG4gICAqIGNvbnN0IHNpdGUgPSBhcHAuYWRkU3RvcmFnZShTdG9yYWdlRmFjdG9yeS5idWlsZChcIlNpdGVcIiwge1xuICAgKiAgIGJ1Y2tldFR5cGU6IFwid2Vic2l0ZVwiXG4gICAqIH0pKTtcbiAgICogc2l0ZS5nZXRXZWJzaXRlVXJsKCk7IC8vIEF2YWlsYWJsZSBvbiBXZWJzaXRlU3RvcmFnZVxuICAgKi9cbiAgcHVibGljIGFkZFN0b3JhZ2U8VCBleHRlbmRzIEFueVN0b3JhZ2U+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3Qgc3RvcmFnZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnN0cnVjdCA9IGZuKHRoaXMsIHN0b3JhZ2VTdGFjay5nZXRTdGFjaygpKTtcbiAgICBzdG9yYWdlU3RhY2suYWRkQ29uc3RydWN0KHN0b3JhZ2VDb25zdHJ1Y3QpO1xuXG4gICAgcmV0dXJuIHN0b3JhZ2VDb25zdHJ1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgQ0ROIHJlc291cmNlIChDbG91ZEZyb250KSB0byB0aGUgZGVmYXVsdCBDRE4gc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUzMgb3JpZ2luXG4gICAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHsgYnVja2V0VHlwZTogXCJwcml2YXRlXCIgfSkpO1xuICAgKiBhcHAuYWRkQ2RuKENkbkZhY3RvcnkuYnVpbGQoXCJBc3NldHNDZG5cIiwge1xuICAgKiAgIG9yaWdpblR5cGU6IFwiczNcIixcbiAgICogICBidWNrZXQ6IGFzc2V0c1xuICAgKiB9KSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEFMQiBvcmlnaW4gKEVDUylcbiAgICogY29uc3QgYXBpID0gYXBwLmFkZENvbXB1dGUoQ29tcHV0ZUZhY3RvcnkuYnVpbGQoXCJBcGlcIiwgeyB0eXBlOiBcImVjc1wiLCAuLi4gfSkpO1xuICAgKiBhcHAuYWRkQ2RuKENkbkZhY3RvcnkuYnVpbGQoXCJBcGlDZG5cIiwge1xuICAgKiAgIG9yaWdpblR5cGU6IFwiYWxiXCIsXG4gICAqICAgbG9hZEJhbGFuY2VyOiBhcGlcbiAgICogfSkpO1xuICAgKi9cbiAgcHVibGljIGFkZENkbihmbjogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBDZG4pOiBDZG4ge1xuICAgIGNvbnN0IGNkblN0YWNrID0gdGhpcy5nZXREZWZhdWx0Q2RuU3RhY2soKTtcbiAgICBjb25zdCBjZG4gPSBmbih0aGlzLCBjZG5TdGFjay5nZXRTdGFjaygpKTtcbiAgICBjZG5TdGFjay5hZGRDb25zdHJ1Y3QoY2RuKTtcblxuICAgIHJldHVybiBjZG47XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbWVzc2FnaW5nIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IHF1ZXVlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIG1lc3NhZ2luZyB0eXBlIGJhc2VkIG9uIHRoZSBmYWN0b3J5IGNvbmZpZ3VyYXRpb24uXG4gICAqIEN1cnJlbnRseSBzdXBwb3J0cyBxdWV1ZSAoU1FTKSwgd2l0aCBmdXR1cmUgc3VwcG9ydCBwbGFubmVkIGZvclxuICAgKiB0b3BpYyAoU05TKSwgZXZlbnRidXMgKEV2ZW50QnJpZGdlKSwgYW5kIHN0cmVhbSAoS2luZXNpcykuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFF1ZXVlIG1lc3NhZ2luZyAtIHJldHVybnMgUXVldWVNZXNzYWdpbmdcbiAgICogY29uc3Qgbm90aWZpY2F0aW9ucyA9IGFwcC5hZGRNZXNzYWdpbmcoTWVzc2FnaW5nRmFjdG9yeS5idWlsZChcIk5vdGlmaWNhdGlvbnNcIiwge1xuICAgKiAgIHR5cGU6IFwicXVldWVcIixcbiAgICogICBxdWV1ZVR5cGU6IFwic3RhbmRhcmRcIixcbiAgICogICBkZWFkTGV0dGVyUXVldWU6IHsgZW5hYmxlZDogdHJ1ZSwgbWF4UmVjZWl2ZUNvdW50OiAzIH1cbiAgICogfSkpO1xuICAgKiBub3RpZmljYXRpb25zLmdyYW50U2VuZE1lc3NhZ2VzKGFwaUZ1bmN0aW9uKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRklGTyBxdWV1ZSBmb3IgT3Blbk5leHQgcmV2YWxpZGF0aW9uXG4gICAqIGNvbnN0IHJldmFsaWRhdGlvbiA9IGFwcC5hZGRNZXNzYWdpbmcoTWVzc2FnaW5nRmFjdG9yeS5idWlsZChcIlJldmFsaWRhdGlvblwiLCB7XG4gICAqICAgdHlwZTogXCJxdWV1ZVwiLFxuICAgKiAgIHF1ZXVlVHlwZTogXCJmaWZvXCIsXG4gICAqICAgdmlzaWJpbGl0eVRpbWVvdXQ6IDMwMCxcbiAgICogICBjb250ZW50QmFzZWREZWR1cGxpY2F0aW9uOiB0cnVlXG4gICAqIH0pKTtcbiAgICovXG4gIHB1YmxpYyBhZGRNZXNzYWdpbmc8VCBleHRlbmRzIEFueU1lc3NhZ2luZz4oXG4gICAgZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gVFxuICApOiBUIHtcbiAgICBjb25zdCBtZXNzYWdpbmdTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE1lc3NhZ2luZ1N0YWNrKCk7XG4gICAgY29uc3QgbWVzc2FnaW5nID0gZm4odGhpcywgbWVzc2FnaW5nU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgbWVzc2FnaW5nU3RhY2suYWRkQ29uc3RydWN0KG1lc3NhZ2luZyk7XG5cbiAgICByZXR1cm4gbWVzc2FnaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhpZ2gtbGV2ZWwgaW5mcmFzdHJ1Y3R1cmUgcGF0dGVybiB0byB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIFBhdHRlcm5zIGFyZSBjb21wb3NpdGUgY29uc3RydWN0cyB0aGF0IGNyZWF0ZSBtdWx0aXBsZSByZWxhdGVkIHJlc291cmNlc1xuICAgKiBhcyBhIHNpbmdsZSwgY29oZXNpdmUgdW5pdC4gVGhleSBlbmNhcHN1bGF0ZSBiZXN0IHByYWN0aWNlcyBhbmQgcmVkdWNlXG4gICAqIGJvaWxlcnBsYXRlIGZvciBjb21tb24gZGVwbG95bWVudCBzY2VuYXJpb3MuXG4gICAqXG4gICAqIEN1cnJlbnRseSBzdXBwb3J0ZWQgcGF0dGVybnM6XG4gICAqIC0gYHBheWxvYWRgOiBQYXlsb2FkIENNUyBkZXBsb3ltZW50IHdpdGggT3Blbk5leHRcbiAgICpcbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgcGF0dGVybiBpbnRlcmZhY2UgYmFzZWQgb24gdGhlIGZhY3RvcnkgY29uZmlndXJhdGlvbixcbiAgICogcHJvdmlkaW5nIGFjY2VzcyB0byBhbGwgdW5kZXJseWluZyByZXNvdXJjZXMgdmlhIGVzY2FwZSBoYXRjaGVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBQYXlsb2FkIENNUyBwYXR0ZXJuIC0gcmV0dXJucyBQYXlsb2FkXG4gICAqIGNvbnN0IHBheWxvYWQgPSBhcHAuYWRkUGF0dGVybihQYXR0ZXJuRmFjdG9yeS5idWlsZChcIlBheWxvYWRBcHBcIiwge1xuICAgKiAgIHR5cGU6IFwicGF5bG9hZFwiLFxuICAgKiAgIG5hbWU6IFwibXktY21zXCIsXG4gICAqICAgc291cmNlOiBcIi4uLy4uXCJcbiAgICogfSkpO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBFc2NhcGUgaGF0Y2hlcyAtIGFjY2VzcyB1bmRlcmx5aW5nIHJlc291cmNlc1xuICAgKiBwYXlsb2FkLmdldERhdGFiYXNlKCkuZ3JhbnRDb25uZWN0KG90aGVyTGFtYmRhKTtcbiAgICogcGF5bG9hZC5nZXRTZXJ2ZXIoKS5nZXRMYW1iZGFGdW5jdGlvbigpLmFkZEVudmlyb25tZW50KFwiQ1VTVE9NXCIsIFwidmFsdWVcIik7XG4gICAqIHBheWxvYWQuZ2V0Q2RuKCkuZ2V0RGlzdHJpYnV0aW9uKCkuYWRkQmVoYXZpb3IoXCIvY3VzdG9tLypcIiwgY3VzdG9tT3JpZ2luKTtcbiAgICovXG4gIHB1YmxpYyBhZGRQYXR0ZXJuPFQgZXh0ZW5kcyBBbnlQYXR0ZXJuPihcbiAgICBmbjogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBUXG4gICk6IFQge1xuICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBmbih0aGlzLCBjb21wdXRlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY29tcHV0ZVN0YWNrLmFkZENvbnN0cnVjdChwYXR0ZXJuKTtcbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gYWRkaXRpb25hbCBuZXR3b3JrIChWUEMpIHRvIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgdG8gY3JlYXRlIGFkZGl0aW9uYWwgVlBDcyBiZXlvbmQgdGhlIGRlZmF1bHQgVlBDIGNvbmZpZ3VyZWQgdmlhIEFwcC5nZXRBcHAoKS5cbiAgICogQWRkaXRpb25hbCBWUENzIGNhbiBiZSByZXRyaWV2ZWQgYnkgbmFtZSB1c2luZyBhcHAuZ2V0VnBjKG5hbWUpLlxuICAgKlxuICAgKiBAcGFyYW0gZm4gLSBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyB0aGUgTmV0d29yayBjb25zdHJ1Y3RcbiAgICogQHJldHVybnMge05ldHdvcmt9IFRoZSBjcmVhdGVkIE5ldHdvcmsgY29uc3RydWN0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGlzb2xhdGVkVnBjID0gYXBwLmFkZE5ldHdvcmsoXG4gICAqICAgTmV0d29ya0ZhY3RvcnkuYnVpbGQoXCJJc29sYXRlZFZwY1wiLCB7IG1heEF6czogMiwgbmF0R2F0ZXdheXM6IGZhbHNlIH0pXG4gICAqICk7XG4gICAqL1xuICBwdWJsaWMgYWRkTmV0d29yayhmbjogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBOZXR3b3JrKTogTmV0d29yayB7XG4gICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG4gICAgY29uc3QgbmV0d29yayA9IGZuKHRoaXMsIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpKTtcbiAgICBjb25zdCB2cGNOYW1lID0gbmV0d29yay5ub2RlLmlkO1xuXG4gICAgLy8gU3RvcmUgaW4gYWRkaXRpb25hbCBWUENzIG1hcCBmb3IgcmV0cmlldmFsIHZpYSBnZXRWcGMobmFtZSlcbiAgICB0aGlzLmFkZGl0aW9uYWxWcGNzLnNldCh2cGNOYW1lLCBuZXR3b3JrLmdldFZwYygpKTtcbiAgICBuZXR3b3JrU3RhY2suYWRkQ29uc3RydWN0KG5ldHdvcmspO1xuXG4gICAgcmV0dXJuIG5ldHdvcms7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgZGF0YWJhc2Ugc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYWRkRGF0YWJhc2VSZXNvdXJjZShyZXNvdXJjZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3QgZGF0YWJhc2VTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTtcbiAgICBkYXRhYmFzZVN0YWNrLmFkZENvbnN0cnVjdChyZXNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgc3RvcmFnZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGRTdG9yYWdlUmVzb3VyY2UocmVzb3VyY2U6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JhZ2VTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpO1xuICAgIHN0b3JhZ2VTdGFjay5hZGRDb25zdHJ1Y3QocmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgc3RhbmRhcmQgdGFnc1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZygpO1xuICAgIHRoaXMuZ2xvYmFsVGFncyA9IHtcbiAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246ZW52aXJvbm1lbnRcIjogY29uZmlnLmVudmlyb25tZW50LFxuICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpzZXJ2aWNlXCI6IHRoaXMubmFtZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYWxsIHRhZ3MgdXNpbmcgQ0RLJ3MgbmF0aXZlIFRhZ3Mub2YoKS5hZGQoKSBBUElcbiAgICovXG4gIHByaXZhdGUgYXBwbHlUYWdzQXNwZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hc3BlY3RBcHBsaWVkICYmIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsVGFncykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQXBwbHkgc3RhbmRhcmQgdGFncyB1c2luZyBUYWdzLm9mKHRoaXMpLmFkZCgpXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmdsb2JhbFRhZ3MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBUYWdzLm9mKHRoaXMpLmFkZChrZXksIHZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBcHBseSBhc3BlY3QgZm9yIHJlc291cmNlLXNwZWNpZmljIHRhZ3MgKElQQU0gcG9vbCwgYmFja3VwIHRpZXIpXG4gICAgICBBc3BlY3RzLm9mKHRoaXMpLmFkZChuZXcgU3RhbmRhcmRUYWdzQXNwZWN0KCkpO1xuXG4gICAgICB0aGlzLmFzcGVjdEFwcGxpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgY3VzdG9tIHRhZ3MgdG8gYWxsIHJlc291cmNlcyBpbiB0aGUgYXBwLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBDdXN0b20gdGFncyB0byBhcHBseSB0byBhbGwgcmVzb3VyY2VzXG4gICAqIEBleGFtcGxlXG4gICAqIGFwcC5hZGRUYWdzKHtcbiAgICogICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOm93bmVyXCI6IFwicGxhdGZvcm0tdGVhbVwiLFxuICAgKiAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246Y29zdC1jZW50ZXJcIjogXCJDQy0xMjNcIixcbiAgICogICBcInRlYW06c2xhY2stY2hhbm5lbFwiOiBcIiNwbGF0Zm9ybS1hbGVydHNcIlxuICAgKiB9KTtcbiAgICovXG4gIHB1YmxpYyBhZGRUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBBcHAge1xuICAgIC8vIE1lcmdlIHRhZ3MgaW50byBnbG9iYWxUYWdzIGZvciB0cmFja2luZ1xuICAgIHRoaXMuZ2xvYmFsVGFncyA9IHtcbiAgICAgIC4uLnRoaXMuZ2xvYmFsVGFncyxcbiAgICAgIC4uLnRhZ3NcbiAgICB9O1xuICAgIE9iamVjdC5lbnRyaWVzKHRhZ3MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgVGFncy5vZih0aGlzKS5hZGQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgcmVzb3VyY2UgaW52ZW50b3J5IGNvbGxlY3RlZCBkdXJpbmcgc3ludGhlc2lzXG4gICAqIENhbGwgdGhpcyBhZnRlciBhcHAuc3ludGgoKSB0byBnZXQgY29tcGxldGUgcmVzb3VyY2UgaW52ZW50b3J5XG4gICAqIEByZXR1cm5zIHtSZXNvdXJjZUludmVudG9yeX0gQ29tcGxldGUgaW52ZW50b3J5IG9mIGFsbCByZXNvdXJjZXMgaW4gdGhlIGFwcFxuICAgKi9cbiAgcHVibGljIGV4cG9ydFJlc291cmNlSW52ZW50b3J5KCk6IFJlc291cmNlSW52ZW50b3J5IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlSW52ZW50b3J5LmdldEludmVudG9yeSgpLFxuICAgICAgZ2VuZXJhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGFwcE5hbWU6IHRoaXMubmFtZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIHJlZ2lzdGVyaW5nIHNlcnZpY2VzIGFuZCBwYXR0ZXJucy5cbiAgICogVXNlZCBieSBDb21wdXRlRmFjdG9yeSBhbmQgUGF0dGVybkZhY3RvcnkgdG8gcmVnaXN0ZXIgdGhlaXIgY29uZmlndXJhdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0TWFuaWZlc3RDb2xsZWN0b3IoKTogTWFuaWZlc3RDb2xsZWN0b3Ige1xuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0Q29sbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHN5bnRoIHRvIGF1dG9tYXRpY2FsbHkgZXhwb3J0IHJlc291cmNlIGludmVudG9yeSBhbmQgbWFuaWZlc3RcbiAgICovXG4gIHB1YmxpYyBzeW50aChvcHRpb25zPzogU3RhZ2VTeW50aGVzaXNPcHRpb25zKTogQ2xvdWRBc3NlbWJseSB7XG4gICAgLy8gQ2FsbCBwYXJlbnQgc3ludGggZmlyc3RcbiAgICBjb25zdCBhc3NlbWJseSA9IHN1cGVyLnN5bnRoKG9wdGlvbnMpO1xuXG4gICAgLy8gQWZ0ZXIgc3ludGhlc2lzLCB3cml0ZSBGamFsbCBtYW5pZmVzdCB0byBjZGsub3V0XG4gICAgdHJ5IHtcbiAgICAgIHdyaXRlTWFuaWZlc3QoYXNzZW1ibHksIHRoaXMubWFuaWZlc3RDb2xsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEb24ndCBmYWlsIHN5bnRoIGlmIG1hbmlmZXN0IGV4cG9ydCBmYWlsc1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgRmphbGxMb2dnZXIud2FybihgRmFpbGVkIHRvIGV4cG9ydCBGamFsbCBtYW5pZmVzdDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiJdfQ==
|
|
651
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FLcUI7QUFHckIsd0RBQXFEO0FBR3JELDJDQUF1QztBQUN2QyxxREFBbUU7QUFFbkUsb0RBSWdDO0FBTWhDLG1FQUFnRTtBQUNoRSxtQ0FBcUM7QUFLckMsaURBQThDO0FBQzlDLDhFQUE4RTtBQUM5RSxvREFBOEQ7QUFDOUQsK0RBQStEO0FBQy9ELDBDQUFvRDtBQUNwRCwrREFBdUQ7QUFDdkQsMkRBSWdDO0FBQ2hDLCtEQUFpRTtBQStCakU7Ozs7R0FJRztBQUNILE1BQWEsR0FBSSxTQUFRLGlCQUFNO0lBb0I3QixZQUFvQixJQUFhLEVBQUUsT0FBcUI7UUFDdEQsS0FBSyxFQUFFLENBQUM7UUFmRixXQUFNLEdBQWdDLEVBQUUsQ0FBQztRQUd6QyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO1FBS3pDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGVBQVUsR0FBOEIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBTzVCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXBCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUEsK0JBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFBLHFDQUFvQixFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QiwrQ0FBK0M7UUFDL0MsSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENB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LElBQUksQ0FBQyxJQUFJO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUErQjtRQUMxQywwQkFBMEI7UUFDMUIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV0QyxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDO1lBQ0gsSUFBQSw4QkFBYSxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDRDQUE0QztZQUM1QyxNQUFNLFlBQVksR0FDaEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pELDhCQUFXLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztBQTl1Qkgsa0JBK3VCQztBQTl1QmdCLFlBQVEsR0FBZSxJQUFJLEFBQW5CLENBQW9CO0FBZ3ZCN0Msa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBwIGFzIENka0FwcCxcbiAgQXNwZWN0cyxcbiAgVGFncyxcbiAgdHlwZSBTdGFnZVN5bnRoZXNpc09wdGlvbnNcbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIENsb3VkQXNzZW1ibHkgfSBmcm9tIFwiYXdzLWNkay1saWIvY3gtYXBpXCI7XG5pbXBvcnQgeyB0eXBlIENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvdnBjXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgdHlwZSBSb2xlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4vcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyB0eXBlIEVjciwgRWNyRmFjdG9yeSB9IGZyb20gXCIuL3Jlc291cmNlcy9hd3Mvc3RvcmFnZS9lY3JcIjtcbmltcG9ydCB7IHR5cGUgQW55RGF0YWJhc2UgfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvZGF0YWJhc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgSU5ldHdvcmtQcm9wcyxcbiAgTmV0d29ya0ZhY3RvcnksXG4gIHR5cGUgTmV0d29ya1xufSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvbmV0d29ya1wiO1xuaW1wb3J0IHsgdHlwZSBDZG4gfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvY2RuXCI7XG5pbXBvcnQgeyB0eXBlIEFueU1lc3NhZ2luZyB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9tZXNzYWdpbmdcIjtcbmltcG9ydCB7IHR5cGUgQW55Q29tcHV0ZSB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9jb21wdXRlXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2UsIHR5cGUgU3RvcmFnZUZhY3RvcnlGbiB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9zdG9yYWdlXCI7XG5pbXBvcnQgeyB0eXBlIEFueVBhdHRlcm4gfSBmcm9tIFwiLi9wYXR0ZXJucy9hd3MvcGF0dGVyblwiO1xuaW1wb3J0IHsgU3RhbmRhcmRUYWdzQXNwZWN0IH0gZnJvbSBcIi4vdXRpbHMvc3RhbmRhcmRUYWdzQXNwZWN0XCI7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7XG4gIHR5cGUgUmVzb3VyY2VJbnZlbnRvcnlBc3BlY3QsXG4gIHR5cGUgUmVzb3VyY2VJbnZlbnRvcnlcbn0gZnJvbSBcIi4vYXNwZWN0cy9yZXNvdXJjZUludmVudG9yeVwiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4vdXRpbHMvZ2V0Q29uZmlnXCI7XG5pbXBvcnQgTW9uaXRvcmluZ1JvbGVGYWN0b3J5IGZyb20gXCIuL3Jlc291cmNlcy9hd3MvbW9uaXRvcmluZy9tb25pdG9yaW5nUm9sZVwiO1xuaW1wb3J0IHsgRkpBTExfTU9OSVRPUklOR19DT05GSUcgfSBmcm9tIFwiLi9jb25maWcvbW9uaXRvcmluZ1wiO1xuaW1wb3J0IEF1ZGl0Um9sZUZhY3RvcnkgZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9hdWRpdC9hdWRpdFJvbGVcIjtcbmltcG9ydCB7IEZKQUxMX0FVRElUX0NPTkZJRyB9IGZyb20gXCIuL2NvbmZpZy9hdWRpdFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyXCI7XG5pbXBvcnQge1xuICBnZXRNYW5pZmVzdENvbGxlY3RvcixcbiAgd3JpdGVNYW5pZmVzdCxcbiAgdHlwZSBNYW5pZmVzdENvbGxlY3RvclxufSBmcm9tIFwiLi91dGlscy9tYW5pZmVzdFdyaXRlclwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlLCB0b0tlYmFiIH0gZnJvbSBcIi4vdXRpbHMvY2FwaXRhbGlzZVN0cmluZ1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQXBwLmdldEFwcCgpLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYXBwIHdpdGggbmV3IFZQQ1xuICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gKiAgIG5ldHdvcms6IHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhcHAgdXNpbmcgZXhpc3RpbmcgVlBDXG4gKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAqICAgbmV0d29yazogeyB1c2VFeGlzdGluZzogXCJ2cGMtMTIzNDU2NzhcIiB9XG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFwcCB3aXRob3V0IG5ldHdvcmsgKFMzLW9ubHkgYXBwcylcbiAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiBmYWxzZSB9KTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXBwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gT2JqZWN0IHdpdGggSU5ldHdvcmtQcm9wczogQ3JlYXRlIG5ldyBWUEMgd2l0aCBjb25maWdcbiAgICogLSBmYWxzZTogTm8gbmV0d29yayAoZm9yIFMzLW9ubHkgYXBwcylcbiAgICogLSB7IHVzZUV4aXN0aW5nOiBzdHJpbmcgfTogVXNlIGV4aXN0aW5nIFZQQyBieSBJRFxuICAgKi9cbiAgbmV0d29yaz86IElOZXR3b3JrUHJvcHMgfCBmYWxzZSB8IHsgdXNlRXhpc3Rpbmc6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNpYyBjb3JuZXItc3RvbmUgb2YgYWxsIEZqYWxsLWhvc3RlZCBhcHBsaWNhdGlvbnMuXG4gKiAgVGhpcyBjbGFzcyBpcyBhIHNpbmdsZXRvbiBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2VcbiAqICAgYWxsIHJlc291cmNlcyBpbiBhIEZqYWxsIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXBwIGV4dGVuZHMgQ2RrQXBwIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFwcCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAvKiogUGFzY2FsQ2FzZSBmb3JtIG9mIG5hbWUsIHVzZWQgYXMgc3RhY2stbmFtZSBwcmVmaXggYW5kIGNvbnN0cnVjdCBJRHMuICovXG4gIHByaXZhdGUgc3RhY2tQcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGFja3M6IHsgW2tleTogc3RyaW5nXTogQXdzU3RhY2sgfSA9IHt9O1xuXG4gIHByaXZhdGUgdnBjPzogSVZwYztcbiAgcHJpdmF0ZSBhZGRpdGlvbmFsVnBjcyA9IG5ldyBNYXA8c3RyaW5nLCBJVnBjPigpO1xuICBwcml2YXRlIGRlZmF1bHRFY3I6IEVjciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkZWZhdWx0TW9uaXRvcmluZ1JvbGU6IFJvbGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVmYXVsdEF1ZGl0Um9sZTogUm9sZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhdWRpdFJvbGVFeHRlcm5hbElkPzogc3RyaW5nO1xuICBwcml2YXRlIG5ldHdvcmtEaXNhYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdsb2JhbFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSBhc3BlY3RBcHBsaWVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb3VyY2VJbnZlbnRvcnk/OiBSZXNvdXJjZUludmVudG9yeUFzcGVjdDtcbiAgcHJpdmF0ZSBtYW5pZmVzdENvbGxlY3RvcjogTWFuaWZlc3RDb2xsZWN0b3I7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgQXBwLmluc3RhbmNlID0gdGhpcztcblxuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gXCJGamFsbEFwcFwiO1xuICAgIHRoaXMuc3RhY2tQcmVmaXggPSB0b1Bhc2NhbENhc2UodGhpcy5uYW1lKTtcblxuICAgIC8vIEluaXRpYWxpc2UgbWFuaWZlc3QgY29sbGVjdG9yIGZvciBidWlsZC10aW1lIHNlcnZpY2UgZGlzY292ZXJ5XG4gICAgdGhpcy5tYW5pZmVzdENvbGxlY3RvciA9IGdldE1hbmlmZXN0Q29sbGVjdG9yKHRoaXMubmFtZSk7XG5cbiAgICB0aGlzLmluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTtcblxuICAgIC8vIEluaXRpYWxpc2UgbmV0d29yayBpbW1lZGlhdGVseSBpZiBjb25maWd1cmVkXG4gICAgaWYgKG9wdGlvbnM/Lm5ldHdvcmsgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm5ldHdvcmtEaXNhYmxlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zPy5uZXR3b3JrKSB7XG4gICAgICB0aGlzLmluaXRpYWxpc2VOZXR3b3JrKG9wdGlvbnMubmV0d29yayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2UgdGhlIG5ldHdvcmsgKFZQQykgZm9yIHRoaXMgYXBwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpc2VOZXR3b3JrKFxuICAgIGNvbmZpZzogSU5ldHdvcmtQcm9wcyB8IHsgdXNlRXhpc3Rpbmc6IHN0cmluZyB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuXG4gICAgaWYgKFwidXNlRXhpc3RpbmdcIiBpbiBjb25maWcpIHtcbiAgICAgIHRoaXMudnBjID0gVnBjLmZyb21Mb29rdXAoXG4gICAgICAgIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpLFxuICAgICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fUltcG9ydGVkVnBjYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwY0lkOiBjb25maWcudXNlRXhpc3RpbmdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV0d29ya0NvbmZpZyA9IHsgLi4uY29uZmlnLCB2cGNOYW1lOiBjb25maWcudnBjTmFtZSA/PyB0aGlzLm5hbWUgfTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBOZXR3b3JrRmFjdG9yeS5idWlsZChcbiAgICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1WcGNgLFxuICAgICAgICBuZXR3b3JrQ29uZmlnXG4gICAgICApKHRoaXMsIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpKTtcbiAgICAgIHRoaXMudnBjID0gbmV0d29yay5nZXRWcGMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYXBwbGljYXRpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldC9DcmVhdGUgYSBiYXNpYyBGamFsbCBBcHBsaWNhdGlvbiB3aXRoIHN0YW5kYXJkIHRhZ3MgYXBwbGllZC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgQXBwbGljYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIG5ldHdvcmsgc2V0dGluZ3NcbiAgICogQHJldHVybnMge0FwcH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQ3JlYXRlIGFwcCB3aXRoIG5ldyBWUENcbiAgICogY29uc3QgYXBwID0gQXBwLmdldEFwcChhcHBOYW1lLCB7XG4gICAqICAgbmV0d29yazogeyBtYXhBenM6IDIsIG5hdEdhdGV3YXlzOiBmYWxzZSB9XG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBDcmVhdGUgYXBwIHVzaW5nIGV4aXN0aW5nIFZQQ1xuICAgKiBjb25zdCBhcHAgPSBBcHAuZ2V0QXBwKGFwcE5hbWUsIHtcbiAgICogICBuZXR3b3JrOiB7IHVzZUV4aXN0aW5nOiBcInZwYy0xMjM0NTY3OFwiIH1cbiAgICogfSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENyZWF0ZSBhcHAgd2l0aG91dCBuZXR3b3JrIChTMy1vbmx5IGFwcHMpXG4gICAqIGNvbnN0IGFwcCA9IEFwcC5nZXRBcHAoYXBwTmFtZSwgeyBuZXR3b3JrOiBmYWxzZSB9KTtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QXBwKG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBJQXBwT3B0aW9ucyk6IEFwcCB7XG4gICAgY29uc3QgYXBwID0gQXBwLmdldEluc3RhbmNlKG5hbWUsIG9wdGlvbnMpO1xuICAgIGFwcC5pbml0aWFsaXNlU3RhbmRhcmRUYWdzKCk7XG4gICAgcmV0dXJuIGFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvQ3JlYXRlIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEFwcFxuICAgKiBAcGFyYW0gbmFtZSBBcHBsaWNhdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgbmV0d29yayBzZXR0aW5nc1xuICAgKiBAcmV0dXJucyB7QXBwfVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZShuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogSUFwcE9wdGlvbnMpOiBBcHAge1xuICAgIC8vIERlc3BpdGUgc3VwcG9ydGluZyBtdWx0aXBsZSBzdGFja3MgeW91IGNhbiBzdGlsbCBvbmx5IGV2ZXJcbiAgICAvLyBoYXZlIGEgc2luZ2xlIEFwcGxpY2F0aW9uIHBlciBDREsgZGVwbG95bWVudFxuICAgIGlmICghQXBwLmluc3RhbmNlKSB7XG4gICAgICBBcHAuaW5zdGFuY2UgPSBuZXcgQXBwKG5hbWUsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBzaW5nbGV0b24gZXhpc3RzIGJ1dCBuYW1lIGRpZmZlcnMsIHVwZGF0ZSBpdCAoYmVmb3JlIGFueSBpbmZyYSBpcyBkZWZpbmVkKVxuICAgICAgaWYgKG5hbWUgJiYgQXBwLmluc3RhbmNlLm5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgLy8gV2FybiBpZiBuZXR3b3JrIGFscmVhZHkgaW5pdGlhbGlzZWQgLSBjaGFuZ2luZyBuYW1lIGFmdGVyIG5ldHdvcmsgZXhpc3RzIGNyZWF0ZXMgYSBtaXNtYXRjaFxuICAgICAgICBpZiAoQXBwLmluc3RhbmNlLnZwYykge1xuICAgICAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgQXBwIG5hbWUgY2hhbmdlZCBmcm9tIFwiJHtBcHAuaW5zdGFuY2UubmFtZX1cIiB0byBcIiR7bmFtZX1cIiBhZnRlciBuZXR3b3JrIHdhcyBpbml0aWFsaXNlZC4gYCArXG4gICAgICAgICAgICAgIGBWUEMgd2lsbCBoYXZlIG5hbWUgXCIke0FwcC5pbnN0YW5jZS5uYW1lfVZwY1wiIGJ1dCBhcHAgbmFtZSBpcyBcIiR7bmFtZX1cIi4gYCArXG4gICAgICAgICAgICAgIGBFbnN1cmUgQXBwLmdldEFwcCgpIGlzIGNhbGxlZCB3aXRoIHRoZSBmaW5hbCBuYW1lIGJlZm9yZSBpbml0aWFsaXNpbmcgbmV0d29yay5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBBcHAuaW5zdGFuY2UubmFtZSA9IG5hbWU7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5zdGFja1ByZWZpeCA9IHRvUGFzY2FsQ2FzZShuYW1lKTtcbiAgICAgICAgLy8gUmVpbml0aWFsaXNlIHN0YW5kYXJkIHRhZ3Mgd2l0aCB0aGUgbmV3IG5hbWVcbiAgICAgICAgQXBwLmluc3RhbmNlLmluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgb3B0aW9ucyBwcm92aWRlZCBidXQgbmV0d29yayBub3QgeWV0IGluaXRpYWxpc2VkLCBpbml0aWFsaXNlIGl0IG5vd1xuICAgICAgaWYgKG9wdGlvbnM/Lm5ldHdvcmsgPT09IGZhbHNlKSB7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5uZXR3b3JrRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgb3B0aW9ucz8ubmV0d29yayAmJlxuICAgICAgICAhQXBwLmluc3RhbmNlLnZwYyAmJlxuICAgICAgICAhQXBwLmluc3RhbmNlLm5ldHdvcmtEaXNhYmxlZFxuICAgICAgKSB7XG4gICAgICAgIEFwcC5pbnN0YW5jZS5pbml0aWFsaXNlTmV0d29yayhvcHRpb25zLm5ldHdvcmspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcHAuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYSBzdGFjayBieSBrZXkuIElmIHRoZSBzdGFjayBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiAgRGVwZW5kZW5jaWVzIGFyZSBvbmx5IGFwcGxpZWQgdGhlIGZpcnN0IHRpbWUgYSBzdGFjayBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBvZiB0aGUgc3RhY2tcbiAgICogQHBhcmFtIGRlcGVuZGVuY2llcyAtIFRoZSBzdGFjayhzKSB0aGF0IHRoaXMgc3RhY2sgZGVwZW5kcyBvblxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhY2soa2V5OiBzdHJpbmcsIGRlcGVuZGVuY2llcz86IEF3c1N0YWNrIHwgQXdzU3RhY2tbXSk6IEF3c1N0YWNrIHtcbiAgICAvLyBBcHBseSB0aGUgYXNwZWN0IG9uY2UgYmVmb3JlIGNyZWF0aW5nIHRoZSBmaXJzdCBzdGFja1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFzcGVjdEFwcGxpZWQgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RhY2tzKS5sZW5ndGggPT09IDAgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsVGFncykubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5hcHBseVRhZ3NBc3BlY3QoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhY2tzW2tleV0pIHtcbiAgICAgIHRoaXMuc3RhY2tzW2tleV0gPSBuZXcgQXdzU3RhY2soa2V5LCBkZXBlbmRlbmNpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YWNrc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgY29tcHV0ZSBzdGFjayAtIG5hbWVkIGFzIGAke3RoaXMubmFtZX1Db21wdXRlYFxuICAgKlxuICAgKiBPbmx5IGRlcGVuZHMgb24gTmV0d29yay4gRGF0YWJhc2UgZGVwZW5kZW5jeSBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5XG4gICAqIGJ5IENESyB3aGVuIGNvbXB1dGUgcmVzb3VyY2VzIHJlZmVyZW5jZSBkYXRhYmFzZSByZXNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9Q29tcHV0ZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBuZXR3b3JrIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfU5ldHdvcmtgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0TmV0d29ya1N0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhgJHt0aGlzLnN0YWNrUHJlZml4fU5ldHdvcmtgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfURhdGFiYXNlYFxuICAgKiBAcmV0dXJucyB7QXdzU3RhY2t9XG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1EYXRhYmFzZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfVN0b3JhZ2VgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhcbiAgICAgIGAke3RoaXMuc3RhY2tQcmVmaXh9U3RvcmFnZWAsXG4gICAgICB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBDRE4gc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9Q2RuYFxuICAgKlxuICAgKiBEZXBlbmRzIG9uIE5ldHdvcmsuIENvbXB1dGUvU3RvcmFnZSBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHlcbiAgICogYnkgQ0RLIHdoZW4gQ0ROIHJlc291cmNlcyByZWZlcmVuY2UgQUxCIG9yIFMzIGJ1Y2tldCByZXNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q2RuU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1DZG5gLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGRlZmF1bHQgbWVzc2FnaW5nIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfU1lc3NhZ2luZ2BcbiAgICpcbiAgICogVXNlZCBmb3IgU1FTIHF1ZXVlcywgU05TIHRvcGljcywgYW5kIEV2ZW50QnJpZGdlIGV2ZW50IGJ1c2VzLlxuICAgKiBEZXBlbmRzIG9uIE5ldHdvcmsgb25seS4gVGhlc2UgYXJlIHJlZ2lvbmFsIHNlcnZpY2VzIHRoYXQgZG9uJ3RcbiAgICogcmVxdWlyZSBWUEMsIGJ1dCB3ZSBtYWludGFpbiBjb25zaXN0ZW50IHN0YWNrIGRlcGVuZGVuY3kgcGF0dGVybnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0TWVzc2FnaW5nU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKFxuICAgICAgYCR7dGhpcy5zdGFja1ByZWZpeH1NZXNzYWdpbmdgLFxuICAgICAgdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIFZQQyBieSBuYW1lLiBJZiBubyBuYW1lIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkZWZhdWx0IFZQQy5cbiAgICpcbiAgICogVGhpcyBpcyBhIHB1cmUgZ2V0dGVyIC0gaXQgbmV2ZXIgY3JlYXRlcyBpbmZyYXN0cnVjdHVyZS5cbiAgICogTmV0d29yayBtdXN0IGJlIGNvbmZpZ3VyZWQgdmlhIEFwcC5nZXRBcHAoKSBvcHRpb25zIG9yIGFwcC5hZGROZXR3b3JrKCkuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgVlBDIHRvIHJldHJpZXZlLiBJZiBub3QgcHJvdmlkZWQsIHJldHVybnMgdGhlIGRlZmF1bHQgVlBDLlxuICAgKiBAcmV0dXJucyB7SVZwY30gVGhlIGNvbmZpZ3VyZWQgVlBDXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBuZXR3b3JrIGlzIGRpc2FibGVkLCBub3QgY29uZmlndXJlZCwgb3IgbmFtZWQgVlBDIG5vdCBmb3VuZFxuICAgKi9cbiAgcHVibGljIGdldFZwYyhuYW1lPzogc3RyaW5nKTogSVZwYyB7XG4gICAgaWYgKHRoaXMubmV0d29ya0Rpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTmV0d29yayBpcyBkaXNhYmxlZCBmb3IgdGhpcyBhcHAuIENhbm5vdCBnZXQgVlBDLiBcIiArXG4gICAgICAgICAgXCJQYXNzIG5ldHdvcmsgY29uZmlnIHRvIEFwcC5nZXRBcHAoKSB0byBlbmFibGUgbmV0d29ya2luZy5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJZiBuYW1lIGlzIHByb3ZpZGVkLCBsb29rIGluIGFkZGl0aW9uYWwgVlBDcyBmaXJzdFxuICAgIGlmIChuYW1lKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsVnBjID0gdGhpcy5hZGRpdGlvbmFsVnBjcy5nZXQobmFtZSk7XG4gICAgICBpZiAoYWRkaXRpb25hbFZwYykge1xuICAgICAgICByZXR1cm4gYWRkaXRpb25hbFZwYztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZQQyAnJHtuYW1lfScgbm90IGZvdW5kLiBBdmFpbGFibGUgVlBDczogJHt0aGlzLmdldFZwY05hbWVzKCkuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgICAgXCJDcmVhdGUgYWRkaXRpb25hbCBWUENzIHVzaW5nIGFwcC5hZGROZXR3b3JrKE5ldHdvcmtGYWN0b3J5LmJ1aWxkKC4uLikpLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBkZWZhdWx0IFZQQ1xuICAgIGlmICghdGhpcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJOZXR3b3JrIG5vdCBjb25maWd1cmVkLiBQYXNzIG5ldHdvcmsgY29uZmlnIHRvIEFwcC5nZXRBcHAoKS4gXCIgK1xuICAgICAgICAgIFwiRXhhbXBsZTogQXBwLmdldEFwcChhcHBOYW1lLCB7IG5ldHdvcms6IHsgbWF4QXpzOiAyIH0gfSlcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudnBjO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZXMgb2YgYWxsIGF2YWlsYWJsZSBWUENzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFycmF5IG9mIFZQQyBuYW1lcy4gSW5jbHVkZXMgXCJkZWZhdWx0XCIgaWYgdGhlIGRlZmF1bHQgVlBDIGlzIGNvbmZpZ3VyZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0VnBjTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLnZwYykge1xuICAgICAgbmFtZXMucHVzaChcImRlZmF1bHRcIik7XG4gICAgfVxuICAgIG5hbWVzLnB1c2goLi4udGhpcy5hZGRpdGlvbmFsVnBjcy5rZXlzKCkpO1xuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBjb250YWluZXIgcmVnaXN0cnkuIElmIHRoZSByZWdpc3RyeSBkb2VzIG5vdCBleGlzdFxuICAgKiAgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHRDb250YWluZXJSZWdpc3RyeSgpOiBFY3Ige1xuICAgIGlmICghdGhpcy5kZWZhdWx0RWNyKSB7XG4gICAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcblxuICAgICAgY29uc3QgZWNyID0gRWNyRmFjdG9yeS5idWlsZChgJHt0aGlzLnN0YWNrUHJlZml4fUVjcmAsIHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHRvS2ViYWIodGhpcy5uYW1lKVxuICAgICAgfSkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuICAgICAgdGhpcy5kZWZhdWx0RWNyID0gZWNyO1xuICAgICAgcmV0dXJuIGVjcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0RWNyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgbW9uaXRvcmluZyByb2xlIGluIHRoZSBOZXR3b3JrIHN0YWNrIHRoYXQgYWxsb3dzXG4gICAqIHRoZSBGamFsbCB3ZWJhcHAgdG8gcXVlcnkgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBFQ1Mgc3RhdHVzLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViYXBwQWNjb3VudElkIC0gT3B0aW9uYWwgQVdTIGFjY291bnQgSUQgb2YgdGhlIEZqYWxsIHdlYmFwcC4gRGVmYXVsdHMgdG8gY29uZmlndXJlZCBwbGF0Zm9ybSBhY2NvdW50LlxuICAgKiBAcmV0dXJucyB7Um9sZX0gVGhlIGNyZWF0ZWQgbW9uaXRvcmluZyByb2xlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTW9uaXRvcmluZ1JvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRNb25pdG9yaW5nUm9sZSkge1xuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgICB3ZWJhcHBBY2NvdW50SWQgfHwgRkpBTExfTU9OSVRPUklOR19DT05GSUcud2ViYXBwQXdzQWNjb3VudElkO1xuXG4gICAgICBjb25zdCByb2xlID0gTW9uaXRvcmluZ1JvbGVGYWN0b3J5LmJ1aWxkKFxuICAgICAgICBgJHt0aGlzLnN0YWNrUHJlZml4fU1vbml0b3JpbmdSb2xlYCxcbiAgICAgICAge1xuICAgICAgICAgIHdlYmFwcEFjY291bnRJZDogYWNjb3VudElkLFxuICAgICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfTU9OSVRPUklOR19DT05GSUcucm9sZU5hbWVQcmVmaXgsXG4gICAgICAgICAgcm9sZVBhdGg6IEZKQUxMX01PTklUT1JJTkdfQ09ORklHLnJvbGVQYXRoXG4gICAgICAgIH1cbiAgICAgICkodGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuXG4gICAgICBuZXR3b3JrU3RhY2suYWRkQ29uc3RydWN0KHJvbGUpO1xuICAgICAgdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGUgPSByb2xlO1xuICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdE1vbml0b3JpbmdSb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyb3NzLWFjY291bnQgYXVkaXQgcm9sZSBpbiB0aGUgTmV0d29yayBzdGFjayB0aGF0IGFsbG93c1xuICAgKiB0aGUgRmphbGwgcGxhdGZvcm0gdG8gdXNlIENsb3VkUXVlcnkgZm9yIGNvbXByZWhlbnNpdmUgQVdTIHJlc291cmNlIGF1ZGl0aW5nLlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IG9wdC1pbiBmZWF0dXJlLiBDYWxsIHRoaXMgbWV0aG9kIHRvIGVuYWJsZSBDbG91ZFF1ZXJ5XG4gICAqIGF1ZGl0IGNhcGFiaWxpdGllcyBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHdlYmFwcEFjY291bnRJZCAtIE9wdGlvbmFsIEFXUyBhY2NvdW50IElEIG9mIHRoZSBGamFsbCB3ZWJhcHAuIERlZmF1bHRzIHRvIGNvbmZpZ3VyZWQgcGxhdGZvcm0gYWNjb3VudC5cbiAgICogQHBhcmFtIGV4dGVybmFsSWQgLSBPcHRpb25hbCBleHRlcm5hbCBJRCBmb3IgYWRkaXRpb25hbCBzZWN1cml0eS4gSWYgbm90IHByb3ZpZGVkLCBhIHVuaXF1ZSBJRCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICogQHJldHVybnMge1JvbGV9IFRoZSBjcmVhdGVkIGF1ZGl0IHJvbGVcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVBdWRpdFJvbGUod2ViYXBwQWNjb3VudElkPzogc3RyaW5nLCBleHRlcm5hbElkPzogc3RyaW5nKTogUm9sZSB7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRBdWRpdFJvbGUpIHtcbiAgICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICAgd2ViYXBwQWNjb3VudElkIHx8IEZKQUxMX0FVRElUX0NPTkZJRy53ZWJhcHBBd3NBY2NvdW50SWQ7XG5cbiAgICAgIHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQgfHwgdGhpcy5nZW5lcmF0ZUF1ZGl0RXh0ZXJuYWxJZCgpO1xuXG4gICAgICBjb25zdCByb2xlID0gQXVkaXRSb2xlRmFjdG9yeS5idWlsZChgJHt0aGlzLnN0YWNrUHJlZml4fUF1ZGl0Um9sZWAsIHtcbiAgICAgICAgd2ViYXBwQWNjb3VudElkOiBhY2NvdW50SWQsXG4gICAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgZXh0ZXJuYWxJZDogdGhpcy5hdWRpdFJvbGVFeHRlcm5hbElkLFxuICAgICAgICByb2xlTmFtZVByZWZpeDogRkpBTExfQVVESVRfQ09ORklHLnJvbGVOYW1lUHJlZml4LFxuICAgICAgICByb2xlUGF0aDogRkpBTExfQVVESVRfQ09ORklHLnJvbGVQYXRoXG4gICAgICB9KSh0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG5cbiAgICAgIG5ldHdvcmtTdGFjay5hZGRDb25zdHJ1Y3Qocm9sZSk7XG4gICAgICB0aGlzLmRlZmF1bHRBdWRpdFJvbGUgPSByb2xlO1xuICAgICAgcmV0dXJuIHJvbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdEF1ZGl0Um9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGV4dGVybmFsIElEIHVzZWQgZm9yIHRoZSBhdWRpdCByb2xlXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBleHRlcm5hbCBJRCBpZiBhdWRpdCByb2xlIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXRBdWRpdFJvbGVFeHRlcm5hbElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaXRSb2xlRXh0ZXJuYWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBleHRlcm5hbCBJRCBmb3IgYXVkaXQgcm9sZVxuICAgKiBGb3JtYXQ6IGZqYWxsLWF1ZGl0LXthcHBOYW1lfS17dGltZXN0YW1wfVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUF1ZGl0RXh0ZXJuYWxJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVuaXF1ZUlkID0gcmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoXCJoZXhcIik7XG4gICAgcmV0dXJuIGBmamFsbC1hdWRpdC0ke3RvS2ViYWIodGhpcy5uYW1lKX0tJHt1bmlxdWVJZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbXB1dGUgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKiBBdXRvbWF0aWNhbGx5IGNyZWF0ZXMgbW9uaXRvcmluZyByb2xlIGlmIG5vdCBhbHJlYWR5IGNyZWF0ZWQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGNvbXB1dGUgdHlwZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uOlxuICAgKiAtIEVjc0NvbXB1dGUgZm9yIHR5cGU6IFwiZWNzXCJcbiAgICogLSBMYW1iZGFDb21wdXRlIGZvciB0eXBlOiBcImxhbWJkYVwiXG4gICAqIC0gRWMyQ29tcHV0ZSBmb3IgdHlwZTogXCJlYzJcIlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBFQ1MgY29tcHV0ZSAtIHJldHVybnMgRWNzQ29tcHV0ZVxuICAgKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7XG4gICAqICAgdHlwZTogXCJlY3NcIixcbiAgICogICBzZXJ2aWNlczogW3sgbmFtZTogXCJhcGlcIiwgLi4uIH1dXG4gICAqIH0pKTtcbiAgICogYXBpLmdldExvYWRCYWxhbmNlcigpOyAvLyBBdmFpbGFibGUgb24gRWNzQ29tcHV0ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBMYW1iZGEgY29tcHV0ZSAtIHJldHVybnMgTGFtYmRhQ29tcHV0ZVxuICAgKiBjb25zdCB3b3JrZXIgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIldvcmtlclwiLCB7XG4gICAqICAgdHlwZTogXCJsYW1iZGFcIixcbiAgICogICBmdW5jdGlvbnM6IFt7IG5hbWU6IFwicHJvY2Vzc1wiLCAuLi4gfV1cbiAgICogfSkpO1xuICAgKiB3b3JrZXIuZ2V0RnVuY3Rpb24oXCJwcm9jZXNzXCIpOyAvLyBBdmFpbGFibGUgb24gTGFtYmRhQ29tcHV0ZVxuICAgKi9cbiAgcHVibGljIGFkZENvbXB1dGU8VCBleHRlbmRzIEFueUNvbXB1dGU+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgLy8gQXV0by1jcmVhdGUgbW9uaXRvcmluZyByb2xlIHdoZW4gY29tcHV0ZSBpcyBhZGRlZFxuICAgIGlmICghdGhpcy5kZWZhdWx0TW9uaXRvcmluZ1JvbGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlTW9uaXRvcmluZ1JvbGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICBjb25zdCBjb25zdHJ1Y3QgPSBmbih0aGlzLCBjb21wdXRlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgY29tcHV0ZVN0YWNrLmFkZENvbnN0cnVjdChjb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBjb25zdHJ1Y3Q7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgY29tcHV0ZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wdXRlUmVzb3VyY2UocmVzb3VyY2U6IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QocmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGRhdGFiYXNlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGRhdGFiYXNlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgdXNlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQXVyb3JhIGRhdGFiYXNlIC0gcmV0dXJucyBSZWxhdGlvbmFsRGF0YWJhc2VcbiAgICogY29uc3QgZGIgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiTWFpblwiLCB7XG4gICAqICAgdHlwZTogXCJBdXJvcmFcIixcbiAgICogICBkYXRhYmFzZU5hbWU6IFwibXlfYXBwXCJcbiAgICogfSkpO1xuICAgKiBkYi5nZXRIb3N0RW5kcG9pbnQoKTsgLy8gQXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIER5bmFtb0RCIHRhYmxlIC0gcmV0dXJucyBEeW5hbW9EQkRhdGFiYXNlXG4gICAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAgICogICB0eXBlOiBcIkR5bmFtb0RCXCIsXG4gICAqICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJTXCIgfVxuICAgKiB9KSk7XG4gICAqIGNhY2hlLmdldFRhYmxlTmFtZSgpOyAvLyBBdmFpbGFibGVcbiAgICovXG4gIHB1YmxpYyBhZGREYXRhYmFzZTxUIGV4dGVuZHMgQW55RGF0YWJhc2U+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgZGF0YWJhc2VTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdERhdGFiYXNlU3RhY2soKTtcbiAgICBjb25zdCBkYXRhYmFzZUNvbnN0cnVjdCA9IGZuKHRoaXMsIGRhdGFiYXNlU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgZGF0YWJhc2VTdGFjay5hZGRDb25zdHJ1Y3QoZGF0YWJhc2VDb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuXG4gICAgcmV0dXJuIGRhdGFiYXNlQ29uc3RydWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0b3JhZ2UgcmVzb3VyY2UgKFMzKSB0byB0aGUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrIHVzaW5nIHRoZSBmYWN0b3J5IHBhdHRlcm4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFByaXZhdGUgYnVja2V0IChkZWZhdWx0KVxuICAgKiBjb25zdCBhc3NldHMgPSBhcHAuYWRkU3RvcmFnZShTdG9yYWdlRmFjdG9yeS5idWlsZChcIkFzc2V0c1wiLCB7XG4gICAqICAgdmVyc2lvbmVkOiB0cnVlXG4gICAqIH0pKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gV2Vic2l0ZSBidWNrZXRcbiAgICogY29uc3Qgc2l0ZSA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiU2l0ZVwiLCB7XG4gICAqICAgd2Vic2l0ZUhvc3Rpbmc6IHsgaW5kZXhEb2N1bWVudDogXCJpbmRleC5odG1sXCIgfVxuICAgKiB9KSk7XG4gICAqL1xuICBwdWJsaWMgYWRkU3RvcmFnZShmbjogU3RvcmFnZUZhY3RvcnlGbik6IFN0b3JhZ2Uge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IGZuLnN0YWNrUGxhY2VtZW50ID8/IFwic3RvcmFnZVwiO1xuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5yZXNvbHZlU3RvcmFnZVN0YWNrKHBsYWNlbWVudCk7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnN0cnVjdCA9IGZuKHRoaXMsIHN0YWNrLmdldFN0YWNrKCkpO1xuICAgIHN0YWNrLmFkZENvbnN0cnVjdChzdG9yYWdlQ29uc3RydWN0KTtcbiAgICByZXR1cm4gc3RvcmFnZUNvbnN0cnVjdDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVN0b3JhZ2VTdGFjayhwbGFjZW1lbnQ6IHN0cmluZyk6IEF3c1N0YWNrIHtcbiAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgICAgY2FzZSBcImNkblwiOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0Q2RuU3RhY2soKTtcbiAgICAgIGNhc2UgXCJjb21wdXRlXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRTdG9yYWdlU3RhY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgQ0ROIHJlc291cmNlIChDbG91ZEZyb250KSB0byB0aGUgZGVmYXVsdCBDRE4gc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUzMgb3JpZ2luXG4gICAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHt9KSk7XG4gICAqIGFwcC5hZGRDZG4oQ2RuRmFjdG9yeS5idWlsZChcIkFzc2V0c0NkblwiLCB7XG4gICAqICAgb3JpZ2luVHlwZTogXCJzM1wiLFxuICAgKiAgIGJ1Y2tldDogYXNzZXRzXG4gICAqIH0pKTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQUxCIG9yaWdpbiAoRUNTKVxuICAgKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7IHR5cGU6IFwiZWNzXCIsIC4uLiB9KSk7XG4gICAqIGFwcC5hZGRDZG4oQ2RuRmFjdG9yeS5idWlsZChcIkFwaUNkblwiLCB7XG4gICAqICAgb3JpZ2luVHlwZTogXCJhbGJcIixcbiAgICogICBsb2FkQmFsYW5jZXI6IGFwaVxuICAgKiB9KSk7XG4gICAqL1xuICBwdWJsaWMgYWRkQ2RuKGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IENkbik6IENkbiB7XG4gICAgY29uc3QgY2RuU3RhY2sgPSB0aGlzLmdldERlZmF1bHRDZG5TdGFjaygpO1xuICAgIGNvbnN0IGNkbiA9IGZuKHRoaXMsIGNkblN0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNkblN0YWNrLmFkZENvbnN0cnVjdChjZG4pO1xuXG4gICAgcmV0dXJuIGNkbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBtZXNzYWdpbmcgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgcXVldWUgc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnaW5nIHR5cGUgYmFzZWQgb24gdGhlIGZhY3RvcnkgY29uZmlndXJhdGlvbi5cbiAgICogQ3VycmVudGx5IHN1cHBvcnRzIHF1ZXVlIChTUVMpLCB3aXRoIGZ1dHVyZSBzdXBwb3J0IHBsYW5uZWQgZm9yXG4gICAqIHRvcGljIChTTlMpLCBldmVudGJ1cyAoRXZlbnRCcmlkZ2UpLCBhbmQgc3RyZWFtIChLaW5lc2lzKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUXVldWUgbWVzc2FnaW5nIC0gcmV0dXJucyBRdWV1ZU1lc3NhZ2luZ1xuICAgKiBjb25zdCBub3RpZmljYXRpb25zID0gYXBwLmFkZE1lc3NhZ2luZyhNZXNzYWdpbmdGYWN0b3J5LmJ1aWxkKFwiTm90aWZpY2F0aW9uc1wiLCB7XG4gICAqICAgdHlwZTogXCJxdWV1ZVwiLFxuICAgKiAgIHF1ZXVlVHlwZTogXCJzdGFuZGFyZFwiLFxuICAgKiAgIGRlYWRMZXR0ZXJRdWV1ZTogeyBlbmFibGVkOiB0cnVlLCBtYXhSZWNlaXZlQ291bnQ6IDMgfVxuICAgKiB9KSk7XG4gICAqIG5vdGlmaWNhdGlvbnMuZ3JhbnRTZW5kTWVzc2FnZXMoYXBpRnVuY3Rpb24pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBGSUZPIHF1ZXVlIGZvciBPcGVuTmV4dCByZXZhbGlkYXRpb25cbiAgICogY29uc3QgcmV2YWxpZGF0aW9uID0gYXBwLmFkZE1lc3NhZ2luZyhNZXNzYWdpbmdGYWN0b3J5LmJ1aWxkKFwiUmV2YWxpZGF0aW9uXCIsIHtcbiAgICogICB0eXBlOiBcInF1ZXVlXCIsXG4gICAqICAgcXVldWVUeXBlOiBcImZpZm9cIixcbiAgICogICB2aXNpYmlsaXR5VGltZW91dDogMzAwLFxuICAgKiAgIGNvbnRlbnRCYXNlZERlZHVwbGljYXRpb246IHRydWVcbiAgICogfSkpO1xuICAgKi9cbiAgcHVibGljIGFkZE1lc3NhZ2luZzxUIGV4dGVuZHMgQW55TWVzc2FnaW5nPihcbiAgICBmbjogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBUXG4gICk6IFQge1xuICAgIGNvbnN0IG1lc3NhZ2luZ1N0YWNrID0gdGhpcy5nZXREZWZhdWx0TWVzc2FnaW5nU3RhY2soKTtcbiAgICBjb25zdCBtZXNzYWdpbmcgPSBmbih0aGlzLCBtZXNzYWdpbmdTdGFjay5nZXRTdGFjaygpKTtcbiAgICBtZXNzYWdpbmdTdGFjay5hZGRDb25zdHJ1Y3QobWVzc2FnaW5nIGFzIHVua25vd24gYXMgQ29uc3RydWN0KTtcblxuICAgIHJldHVybiBtZXNzYWdpbmc7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgaGlnaC1sZXZlbCBpbmZyYXN0cnVjdHVyZSBwYXR0ZXJuIHRvIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogUGF0dGVybnMgYXJlIGNvbXBvc2l0ZSBjb25zdHJ1Y3RzIHRoYXQgY3JlYXRlIG11bHRpcGxlIHJlbGF0ZWQgcmVzb3VyY2VzXG4gICAqIGFzIGEgc2luZ2xlLCBjb2hlc2l2ZSB1bml0LiBUaGV5IGVuY2Fwc3VsYXRlIGJlc3QgcHJhY3RpY2VzIGFuZCByZWR1Y2VcbiAgICogYm9pbGVycGxhdGUgZm9yIGNvbW1vbiBkZXBsb3ltZW50IHNjZW5hcmlvcy5cbiAgICpcbiAgICogQ3VycmVudGx5IHN1cHBvcnRlZCBwYXR0ZXJuczpcbiAgICogLSBgcGF5bG9hZGA6IFBheWxvYWQgQ01TIGRlcGxveW1lbnQgd2l0aCBPcGVuTmV4dFxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBwYXR0ZXJuIGludGVyZmFjZSBiYXNlZCBvbiB0aGUgZmFjdG9yeSBjb25maWd1cmF0aW9uLFxuICAgKiBwcm92aWRpbmcgYWNjZXNzIHRvIGFsbCB1bmRlcmx5aW5nIHJlc291cmNlcyB2aWEgZXNjYXBlIGhhdGNoZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFBheWxvYWQgQ01TIHBhdHRlcm4gLSByZXR1cm5zIFBheWxvYWRcbiAgICogY29uc3QgcGF5bG9hZCA9IGFwcC5hZGRQYXR0ZXJuKFBhdHRlcm5GYWN0b3J5LmJ1aWxkKFwiUGF5bG9hZEFwcFwiLCB7XG4gICAqICAgdHlwZTogXCJwYXlsb2FkXCIsXG4gICAqICAgbmFtZTogXCJteS1jbXNcIixcbiAgICogICBzb3VyY2U6IFwiLi4vLi5cIlxuICAgKiB9KSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEVzY2FwZSBoYXRjaGVzIC0gYWNjZXNzIHVuZGVybHlpbmcgcmVzb3VyY2VzXG4gICAqIHBheWxvYWQuZ2V0RGF0YWJhc2UoKS5ncmFudENvbm5lY3Qob3RoZXJMYW1iZGEpO1xuICAgKiBwYXlsb2FkLmdldFNlcnZlcigpLmdldExhbWJkYUZ1bmN0aW9uKCkuYWRkRW52aXJvbm1lbnQoXCJDVVNUT01cIiwgXCJ2YWx1ZVwiKTtcbiAgICogcGF5bG9hZC5nZXRDZG4oKS5nZXREaXN0cmlidXRpb24oKS5hZGRCZWhhdmlvcihcIi9jdXN0b20vKlwiLCBjdXN0b21PcmlnaW4pO1xuICAgKi9cbiAgcHVibGljIGFkZFBhdHRlcm48VCBleHRlbmRzIEFueVBhdHRlcm4+KFxuICAgIGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFRcbiAgKTogVCB7XG4gICAgY29uc3QgY29tcHV0ZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk7XG4gICAgY29uc3QgcGF0dGVybiA9IGZuKHRoaXMsIGNvbXB1dGVTdGFjay5nZXRTdGFjaygpKTtcbiAgICBjb21wdXRlU3RhY2suYWRkQ29uc3RydWN0KHBhdHRlcm4gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3QpO1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBhZGRpdGlvbmFsIG5ldHdvcmsgKFZQQykgdG8gdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyB0byBjcmVhdGUgYWRkaXRpb25hbCBWUENzIGJleW9uZCB0aGUgZGVmYXVsdCBWUEMgY29uZmlndXJlZCB2aWEgQXBwLmdldEFwcCgpLlxuICAgKiBBZGRpdGlvbmFsIFZQQ3MgY2FuIGJlIHJldHJpZXZlZCBieSBuYW1lIHVzaW5nIGFwcC5nZXRWcGMobmFtZSkuXG4gICAqXG4gICAqIEBwYXJhbSBmbiAtIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBOZXR3b3JrIGNvbnN0cnVjdFxuICAgKiBAcmV0dXJucyB7TmV0d29ya30gVGhlIGNyZWF0ZWQgTmV0d29yayBjb25zdHJ1Y3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgaXNvbGF0ZWRWcGMgPSBhcHAuYWRkTmV0d29yayhcbiAgICogICBOZXR3b3JrRmFjdG9yeS5idWlsZChcIklzb2xhdGVkVnBjXCIsIHsgbWF4QXpzOiAyLCBuYXRHYXRld2F5czogZmFsc2UgfSlcbiAgICogKTtcbiAgICovXG4gIHB1YmxpYyBhZGROZXR3b3JrKGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IE5ldHdvcmspOiBOZXR3b3JrIHtcbiAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcbiAgICBjb25zdCBuZXR3b3JrID0gZm4odGhpcywgbmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuICAgIGNvbnN0IHZwY05hbWUgPSBuZXR3b3JrLm5vZGUuaWQ7XG5cbiAgICAvLyBTdG9yZSBpbiBhZGRpdGlvbmFsIFZQQ3MgbWFwIGZvciByZXRyaWV2YWwgdmlhIGdldFZwYyhuYW1lKVxuICAgIHRoaXMuYWRkaXRpb25hbFZwY3Muc2V0KHZwY05hbWUsIG5ldHdvcmsuZ2V0VnBjKCkpO1xuICAgIG5ldHdvcmtTdGFjay5hZGRDb25zdHJ1Y3QobmV0d29yayk7XG5cbiAgICByZXR1cm4gbmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhZGREYXRhYmFzZVJlc291cmNlKHJlc291cmNlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhYmFzZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0RGF0YWJhc2VTdGFjaygpO1xuICAgIGRhdGFiYXNlU3RhY2suYWRkQ29uc3RydWN0KHJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBzdG9yYWdlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFkZFN0b3JhZ2VSZXNvdXJjZShyZXNvdXJjZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc3RvcmFnZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk7XG4gICAgc3RvcmFnZVN0YWNrLmFkZENvbnN0cnVjdChyZXNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZSBzdGFuZGFyZCB0YWdzXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpc2VTdGFuZGFyZFRhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7XG4gICAgdGhpcy5nbG9iYWxUYWdzID0ge1xuICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjplbnZpcm9ubWVudFwiOiBjb25maWcuZW52aXJvbm1lbnQsXG4gICAgICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOnNlcnZpY2VcIjogdGhpcy5uYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbGwgdGFncyB1c2luZyBDREsncyBuYXRpdmUgVGFncy5vZigpLmFkZCgpIEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVRhZ3NBc3BlY3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFzcGVjdEFwcGxpZWQgJiYgT2JqZWN0LmtleXModGhpcy5nbG9iYWxUYWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBcHBseSBzdGFuZGFyZCB0YWdzIHVzaW5nIFRhZ3Mub2YodGhpcykuYWRkKClcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZ2xvYmFsVGFncykpIHtcbiAgICAgICAgVGFncy5vZih0aGlzKS5hZGQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IGFzcGVjdCBmb3IgcmVzb3VyY2Utc3BlY2lmaWMgdGFncyAoSVBBTSBwb29sLCBiYWNrdXAgdGllcilcbiAgICAgIEFzcGVjdHMub2YodGhpcykuYWRkKG5ldyBTdGFuZGFyZFRhZ3NBc3BlY3QoKSk7XG5cbiAgICAgIHRoaXMuYXNwZWN0QXBwbGllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjdXN0b20gdGFncyB0byBhbGwgcmVzb3VyY2VzIGluIHRoZSBhcHAuXG4gICAqXG4gICAqIEBwYXJhbSB0YWdzIEN1c3RvbSB0YWdzIHRvIGFwcGx5IHRvIGFsbCByZXNvdXJjZXNcbiAgICogQGV4YW1wbGVcbiAgICogYXBwLmFkZFRhZ3Moe1xuICAgKiAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246b3duZXJcIjogXCJwbGF0Zm9ybS10ZWFtXCIsXG4gICAqICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpjb3N0LWNlbnRlclwiOiBcIkNDLTEyM1wiLFxuICAgKiAgIFwidGVhbTpzbGFjay1jaGFubmVsXCI6IFwiI3BsYXRmb3JtLWFsZXJ0c1wiXG4gICAqIH0pO1xuICAgKi9cbiAgcHVibGljIGFkZFRhZ3ModGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IEFwcCB7XG4gICAgLy8gTWVyZ2UgdGFncyBpbnRvIGdsb2JhbFRhZ3MgZm9yIHRyYWNraW5nXG4gICAgdGhpcy5nbG9iYWxUYWdzID0ge1xuICAgICAgLi4udGhpcy5nbG9iYWxUYWdzLFxuICAgICAgLi4udGFnc1xuICAgIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICAgIFRhZ3Mub2YodGhpcykuYWRkKGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCByZXNvdXJjZSBpbnZlbnRvcnkgY29sbGVjdGVkIGR1cmluZyBzeW50aGVzaXNcbiAgICogQ2FsbCB0aGlzIGFmdGVyIGFwcC5zeW50aCgpIHRvIGdldCBjb21wbGV0ZSByZXNvdXJjZSBpbnZlbnRvcnlcbiAgICogQHJldHVybnMge1Jlc291cmNlSW52ZW50b3J5fSBDb21wbGV0ZSBpbnZlbnRvcnkgb2YgYWxsIHJlc291cmNlcyBpbiB0aGUgYXBwXG4gICAqL1xuICBwdWJsaWMgZXhwb3J0UmVzb3VyY2VJbnZlbnRvcnkoKTogUmVzb3VyY2VJbnZlbnRvcnkge1xuICAgIGlmICghdGhpcy5yZXNvdXJjZUludmVudG9yeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlJlc291cmNlIGludmVudG9yeSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgYSBSZXNvdXJjZUludmVudG9yeUFzcGVjdCBoYXMgYmVlbiBhZGRlZCBiZWZvcmUgY2FsbGluZyBleHBvcnRSZXNvdXJjZUludmVudG9yeSgpLlwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlSW52ZW50b3J5LmdldEludmVudG9yeSgpLFxuICAgICAgZ2VuZXJhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGFwcE5hbWU6IHRoaXMubmFtZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYW5pZmVzdCBjb2xsZWN0b3IgZm9yIHJlZ2lzdGVyaW5nIHNlcnZpY2VzIGFuZCBwYXR0ZXJucy5cbiAgICogVXNlZCBieSBDb21wdXRlRmFjdG9yeSBhbmQgUGF0dGVybkZhY3RvcnkgdG8gcmVnaXN0ZXIgdGhlaXIgY29uZmlndXJhdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0TWFuaWZlc3RDb2xsZWN0b3IoKTogTWFuaWZlc3RDb2xsZWN0b3Ige1xuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0Q29sbGVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHN5bnRoIHRvIGF1dG9tYXRpY2FsbHkgZXhwb3J0IHJlc291cmNlIGludmVudG9yeSBhbmQgbWFuaWZlc3RcbiAgICovXG4gIHB1YmxpYyBzeW50aChvcHRpb25zPzogU3RhZ2VTeW50aGVzaXNPcHRpb25zKTogQ2xvdWRBc3NlbWJseSB7XG4gICAgLy8gQ2FsbCBwYXJlbnQgc3ludGggZmlyc3RcbiAgICBjb25zdCBhc3NlbWJseSA9IHN1cGVyLnN5bnRoKG9wdGlvbnMpO1xuXG4gICAgLy8gQWZ0ZXIgc3ludGhlc2lzLCB3cml0ZSBGamFsbCBtYW5pZmVzdCB0byBjZGsub3V0XG4gICAgdHJ5IHtcbiAgICAgIHdyaXRlTWFuaWZlc3QoYXNzZW1ibHksIHRoaXMubWFuaWZlc3RDb2xsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEb24ndCBmYWlsIHN5bnRoIGlmIG1hbmlmZXN0IGV4cG9ydCBmYWlsc1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgRmphbGxMb2dnZXIud2FybihgRmFpbGVkIHRvIGV4cG9ydCBGamFsbCBtYW5pZmVzdDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiJdfQ==
|
|
@@ -9,7 +9,6 @@ class AccountId extends constructs_1.Construct {
|
|
|
9
9
|
constructor(scope, id) {
|
|
10
10
|
super(scope, id);
|
|
11
11
|
const sts = new awsCustomResource_1.AwsCustomResource(this, "GetAccountIdResource", {
|
|
12
|
-
functionName: "getAccountId",
|
|
13
12
|
onCreate: {
|
|
14
13
|
service: "sts",
|
|
15
14
|
action: "GetCallerIdentityCommand", // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sts/command/GetCallerIdentityCommand/
|
|
@@ -30,4 +29,4 @@ class AccountId extends constructs_1.Construct {
|
|
|
30
29
|
}
|
|
31
30
|
}
|
|
32
31
|
exports.AccountId = AccountId;
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudElkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3MvYWNjb3VudElkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF3QztBQUN4QyxnRUFBZ0U7QUFDaEUsMkNBQXVDO0FBRXZDLHVGQUFvRjtBQUVwRixNQUFhLFNBQVUsU0FBUSxzQkFBUztJQUd0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sR0FBRyxHQUFHLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzlELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUsMEJBQTBCLEVBQUUsc0dBQXNHO2dCQUMxSSxrQkFBa0IsRUFDaEIsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUM7YUFDeEQ7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLDBCQUEwQixFQUFFLHNHQUFzRztnQkFDMUksa0JBQWtCLEVBQ2hCLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ3hEO1lBQ0QsWUFBWSxFQUFFLHNCQUFzQjtTQUNyQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDdEQsR0FBRyxFQUFFLFdBQVc7WUFDaEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7WUFDdEMsVUFBVSxFQUFFLFdBQVc7U0FDeEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBNUJELDhCQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuXG5leHBvcnQgY2xhc3MgQWNjb3VudElkIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFjY291bnRJZDogQ2ZuT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qgc3RzID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiR2V0QWNjb3VudElkUmVzb3VyY2VcIiwge1xuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJzdHNcIixcbiAgICAgICAgYWN0aW9uOiBcIkdldENhbGxlcklkZW50aXR5Q29tbWFuZFwiLCAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy92My9sYXRlc3QvY2xpZW50L3N0cy9jb21tYW5kL0dldENhbGxlcklkZW50aXR5Q29tbWFuZC9cbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOlxuICAgICAgICAgIGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXCJnZXRBY2NvdW50SWRcIilcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcInN0c1wiLFxuICAgICAgICBhY3Rpb246IFwiR2V0Q2FsbGVySWRlbnRpdHlDb21tYW5kXCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL3YzL2xhdGVzdC9jbGllbnQvc3RzL2NvbW1hbmQvR2V0Q2FsbGVySWRlbnRpdHlDb21tYW5kL1xuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6XG4gICAgICAgICAgY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcImdldEFjY291bnRJZFwiKVxuICAgICAgfSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OmdldEFjY291bnRJZFwiXG4gICAgfSk7XG5cbiAgICB0aGlzLmFjY291bnRJZCA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJBY2NvdW50SWRPdXRwdXRcIiwge1xuICAgICAga2V5OiBcIkFjY291bnRJZFwiLFxuICAgICAgdmFsdWU6IHN0cy5nZXRSZXNwb25zZUZpZWxkKFwiQWNjb3VudFwiKSxcbiAgICAgIGV4cG9ydE5hbWU6IFwiQWNjb3VudElkXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
|