@ashishpandeyone/cdk-lambda-web-function 0.1.11 → 0.1.12
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/.jsii +125 -62
- package/.jsii.tabl.json +1 -1
- package/API.md +129 -0
- package/README.md +29 -0
- package/assets/web-function-provider/index.js +19 -19
- package/lib/nodejs-web-function.js +1 -1
- package/lib/private/log-group.d.ts +2 -0
- package/lib/private/log-group.js +11 -2
- package/lib/private/provider-protocol.d.ts +2 -0
- package/lib/private/provider-protocol.js +1 -1
- package/lib/web-function-deployment.js +1 -1
- package/lib/web-function-endpoint.js +1 -1
- package/lib/web-function-grants.js +1 -1
- package/lib/web-function-origin.js +1 -1
- package/lib/web-function-revision.js +1 -1
- package/lib/web-function.d.ts +29 -0
- package/lib/web-function.js +55 -4
- package/package.json +1 -1
package/lib/web-function.js
CHANGED
|
@@ -59,7 +59,7 @@ const MAX_ENDPOINTS = 10;
|
|
|
59
59
|
* What `WebFunction` and imported functions have in common.
|
|
60
60
|
*/
|
|
61
61
|
class WebFunctionBase extends aws_cdk_lib_1.Resource {
|
|
62
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase", version: "0.1.
|
|
62
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase", version: "0.1.12" };
|
|
63
63
|
/** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
|
|
64
64
|
get webFunctionRef() {
|
|
65
65
|
return { functionArn: this.webFunctionArn };
|
|
@@ -156,7 +156,7 @@ exports.WebFunctionBase = WebFunctionBase;
|
|
|
156
156
|
* @resource AWS::Lambda::WebFunction
|
|
157
157
|
*/
|
|
158
158
|
class WebFunction extends WebFunctionBase {
|
|
159
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.
|
|
159
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.12" };
|
|
160
160
|
/**
|
|
161
161
|
* Identifies this class to property injectors (`PropertyInjectors.of(scope).add(...)`), which can set default props for
|
|
162
162
|
* every `WebFunction` under a scope. Injectors for `WebFunction` also apply to `NodejsWebFunction`.
|
|
@@ -194,6 +194,8 @@ class WebFunction extends WebFunctionBase {
|
|
|
194
194
|
role;
|
|
195
195
|
/** The customer managed key of the function's revisions, if any. */
|
|
196
196
|
encryptionKey;
|
|
197
|
+
/** The customer managed key of the function's log groups, if any. */
|
|
198
|
+
logEncryptionKey;
|
|
197
199
|
/** The principal to grant permissions to (the execution role). */
|
|
198
200
|
grantPrincipal;
|
|
199
201
|
/**
|
|
@@ -245,7 +247,13 @@ class WebFunction extends WebFunctionBase {
|
|
|
245
247
|
this.grantPrincipal = this.role;
|
|
246
248
|
// Log groups first: the service would otherwise create them without retention.
|
|
247
249
|
this.logGroupName = logGroupName;
|
|
248
|
-
this.logOptions = { logRetention: props.logRetention, logRemovalPolicy: props.logRemovalPolicy };
|
|
250
|
+
this.logOptions = { logRetention: props.logRetention, logRemovalPolicy: props.logRemovalPolicy, logEncryptionKey: props.logEncryptionKey };
|
|
251
|
+
this.logEncryptionKey = props.logEncryptionKey;
|
|
252
|
+
if (this.logEncryptionKey) {
|
|
253
|
+
// Only a key defined in this app takes the statement, for the region it's in.
|
|
254
|
+
this.logEncryptionKey.addToResourcePolicy(this.logEncryptionKeyPolicyStatement(this.logEncryptionKey.env.region));
|
|
255
|
+
this.node.addValidation({ validate: () => this.validateLogEncryptionKey() });
|
|
256
|
+
}
|
|
249
257
|
const logGroups = this.createLogGroups(logGroupName);
|
|
250
258
|
this.logGroup = logs.LogGroup.fromLogGroupName(this, 'LogGroup', logGroupName);
|
|
251
259
|
const code = new code_1.WebFunctionCode(this, 'Code', props.code).location;
|
|
@@ -383,6 +391,26 @@ class WebFunction extends WebFunctionBase {
|
|
|
383
391
|
},
|
|
384
392
|
});
|
|
385
393
|
}
|
|
394
|
+
/**
|
|
395
|
+
* The key-policy statement CloudWatch Logs needs in `region` to encrypt this function's log groups there with
|
|
396
|
+
* `logEncryptionKey`, limited to those groups (`kms:EncryptionContext:aws:logs:arn`).
|
|
397
|
+
*
|
|
398
|
+
* It's added to `logEncryptionKey` for the key's own region when the key is defined in this app. Add it to the
|
|
399
|
+
* replica in every other region the function serves from yourself: replicas don't share their primary's policy.
|
|
400
|
+
*
|
|
401
|
+
* @param region the region of the key or replica
|
|
402
|
+
*/
|
|
403
|
+
logEncryptionKeyPolicyStatement(region) {
|
|
404
|
+
const groups = aws_cdk_lib_1.Stack.of(this).formatArn({
|
|
405
|
+
service: 'logs', region, resource: 'log-group', resourceName: `${this.logGroupName}*`, arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
|
|
406
|
+
});
|
|
407
|
+
return new iam.PolicyStatement({
|
|
408
|
+
principals: [new iam.ServicePrincipal(`logs.${region}.amazonaws.com`)],
|
|
409
|
+
actions: ['kms:Encrypt*', 'kms:Decrypt*', 'kms:ReEncrypt*', 'kms:GenerateDataKey*', 'kms:Describe*'],
|
|
410
|
+
resources: ['*'],
|
|
411
|
+
conditions: { ArnLike: { 'kms:EncryptionContext:aws:logs:arn': groups } },
|
|
412
|
+
});
|
|
413
|
+
}
|
|
386
414
|
/** Regional and multi-region endpoints need a multi-Region key: otherwise their other regions fail to activate. */
|
|
387
415
|
validateEncryptionKey() {
|
|
388
416
|
const multi = this.endpoints.filter((e) => e.endpointType !== enums_1.WebFunctionEndpointType.HOME_REGION);
|
|
@@ -391,6 +419,28 @@ class WebFunction extends WebFunctionBase {
|
|
|
391
419
|
const typeName = (t) => (t === enums_1.WebFunctionEndpointType.MULTI_REGION ? 'MULTI_REGION' : 'PER_REGION');
|
|
392
420
|
return [`encryptionKey must be a multi-Region key (with a replica in every serving region) for ${multi.map((e) => `${e.node.id} (${typeName(e.endpointType)})`).join(', ')}: with a single-Region key, the endpoint fails to activate in its other regions and the deployment rolls back`];
|
|
393
421
|
}
|
|
422
|
+
/** Log groups outside the key's region need the replica of a multi-Region key there. */
|
|
423
|
+
validateLogEncryptionKey() {
|
|
424
|
+
const key = this.logEncryptionKey;
|
|
425
|
+
if (isMultiRegionKey(key) !== false)
|
|
426
|
+
return [];
|
|
427
|
+
const elsewhere = [aws_cdk_lib_1.Stack.of(this).region, ...this.remoteLogGroups.keys()]
|
|
428
|
+
.filter((region) => aws_cdk_lib_1.Token.compareStrings(region, key.env.region) === aws_cdk_lib_1.TokenComparison.DIFFERENT);
|
|
429
|
+
if (elsewhere.length === 0)
|
|
430
|
+
return [];
|
|
431
|
+
return [`logEncryptionKey must be a multi-Region key (with a replica in every serving region) for the log groups in ${elsewhere.join(', ')}: CloudWatch Logs only uses a key in the group's own region`];
|
|
432
|
+
}
|
|
433
|
+
/** The key for a log group in `region`: the key itself in its own region, otherwise its replica there (same key ID). */
|
|
434
|
+
logKeyArnIn(region) {
|
|
435
|
+
const key = this.logOptions.logEncryptionKey;
|
|
436
|
+
if (!key)
|
|
437
|
+
return undefined;
|
|
438
|
+
if (region === key.env.region || aws_cdk_lib_1.Token.compareStrings(region, key.env.region) === aws_cdk_lib_1.TokenComparison.SAME)
|
|
439
|
+
return key.keyArn;
|
|
440
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(key.keyArn))
|
|
441
|
+
return aws_cdk_lib_1.Arn.format({ ...aws_cdk_lib_1.Arn.split(key.keyArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME), region });
|
|
442
|
+
return aws_cdk_lib_1.Stack.of(this).formatArn({ service: 'kms', region, account: key.env.account, resource: 'key', resourceName: key.keyId });
|
|
443
|
+
}
|
|
394
444
|
createEndpoint(id, options, namePrefix, nameSeed) {
|
|
395
445
|
if (this.endpoints.length >= MAX_ENDPOINTS) {
|
|
396
446
|
throw new Error(`${this.node.path}: a Web Function can have at most ${MAX_ENDPOINTS} endpoints`);
|
|
@@ -456,6 +506,7 @@ class WebFunction extends WebFunctionBase {
|
|
|
456
506
|
logGroupName: name,
|
|
457
507
|
retention: this.logOptions.logRetention ?? logs.RetentionDays.ONE_MONTH,
|
|
458
508
|
removalPolicy: this.logOptions.logRemovalPolicy ?? aws_cdk_lib_1.RemovalPolicy.RETAIN,
|
|
509
|
+
kmsKeyArn: this.logKeyArnIn(region),
|
|
459
510
|
});
|
|
460
511
|
}
|
|
461
512
|
}
|
|
@@ -511,4 +562,4 @@ function importedArn(scope, id, attrs) {
|
|
|
511
562
|
}
|
|
512
563
|
return arn;
|
|
513
564
|
}
|
|
514
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXdMO0FBQ3hMLHVFQUF5RDtBQUN6RCx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLCtEQUFpRDtBQUNqRCwyREFBNkM7QUFFN0MsbUNBQXVFO0FBQ3ZFLHlDQUFpRDtBQUNqRCxtREFBMEQ7QUFDMUQsK0NBQWtFO0FBQ2xFLHVDQUF1RDtBQUN2RCxxRUFBMkQ7QUFDM0QscUZBQWdGO0FBQ2hGLGlFQUE2RDtBQUM3RCxxREFBcUY7QUFDckYsbUVBQW1JO0FBQ25JLCtEQUEwRDtBQUMxRCxtRUFBeUY7QUFFekYsOERBQThEO0FBQzlELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQXlRekI7O0dBRUc7QUFDSCxNQUFzQixlQUFnQixTQUFRLHNCQUFROztJQUlwRCxtRkFBbUY7SUFDbkYsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFRRDs7Ozs7OztPQU9HO0lBQ0ksbUJBQW1CLENBQUMsU0FBOEI7UUFDdkQsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHdCQUF3QixDQUFDLEtBQWdCLEVBQUUsU0FBOEI7UUFDOUUsTUFBTSxJQUFJLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsSUFBSSxtQkFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssNkJBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2Rix5QkFBVyxD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QUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLHVCQUFTLENBQUMsbUJBQW1CO1NBQzNILENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsY0FBZSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdFQUF3RSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BILE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLE1BQU0sR0FBRyw2RkFBNkYsQ0FBQyxDQUFDO0lBQ2pJLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucywgQXJuLCBBcm5Gb3JtYXQsIHR5cGUgQ2ZuUmVzb3VyY2UsIER1cmF0aW9uLCB0eXBlIElSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFJlbW92YWxQb2xpY3ksIFJlc291cmNlLCBTdGFjaywgVG9rZW4sIFRva2VuQ29tcGFyaXNvbiwgVmFsaWRhdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlLCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25Db2RlIH0gZnJvbSAnLi9wcml2YXRlL2NvZGUnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25Mb2dHcm91cCB9IGZyb20gJy4vcHJpdmF0ZS9sb2ctZ3JvdXAnO1xuaW1wb3J0IHsgREVGQVVMVF9QRVJJT0QsIFdFQl9OQU1FU1BBQ0UgfSBmcm9tICcuL3ByaXZhdGUvbWV0cmljcyc7XG5pbXBvcnQgeyBhY2tub3dsZWRnZUlhbUZpbmRpbmdzIH0gZnJvbSAnLi9wcml2YXRlL25hZyc7XG5pbXBvcnQgeyBpbmplY3RQcm9wcyB9IGZyb20gJy4vcHJpdmF0ZS9wcm9wZXJ0eS1pbmplY3Rpb24nO1xuaW1wb3J0IHsgUmVzb3VyY2VQb2xpY3lTdGF0ZW1lbnRzIH0gZnJvbSAnLi9wcml2YXRlL3Jlc291cmNlLXBvbGljeS1zdGF0ZW1lbnRzJztcbmltcG9ydCB7IFJldmlzaW9uQ2xlYW51cCB9IGZyb20gJy4vcHJpdmF0ZS9yZXZpc2lvbi1jbGVhbnVwJztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHR5cGUgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMsIHR5cGUgV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1lbmRwb2ludCc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkdyYW50cyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWdyYW50cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvblJldmlzaW9uLCB0eXBlIElXZWJGdW5jdGlvblJldmlzaW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tcmV2aXNpb24nO1xuXG4vKiogRW5kcG9pbnRzIHBlciBmdW5jdGlvbiAoc2VydmljZSBxdW90YSwgbm90IGFkanVzdGFibGUpLiAqL1xuY29uc3QgTUFYX0VORFBPSU5UUyA9IDEwO1xuXG4vKipcbiAqIE9wdGlvbnMgc2hhcmVkIGJ5IGBXZWJGdW5jdGlvbmAgYW5kIGBOb2RlanNXZWJGdW5jdGlvbmA6IGV2ZXJ5dGhpbmcgZXhjZXB0IGhvdyB0aGUgY29kZSBpcyBzdXBwbGllZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGNhbGxlcnMgb2YgdGhlIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGVuZHBvaW50IChgZm4uZW5kcG9pbnRgKTogd2hlcmUgaXQgc2VydmVzIGZyb20sIGl0cyBuYW1lIGFuZCBsaW1pdHMuXG4gICAqIEl0IHNlcnZlcyB0aGUgY3VycmVudCByZXZpc2lvbjsgcm91dGUgaXQgZWxzZXdoZXJlIHdpdGggYGZuLmVuZHBvaW50LnJvdXRlVHJhZmZpYygpYC5cbiAgICogQWRkIG1vcmUgZW5kcG9pbnRzIHdpdGggYGFkZEVuZHBvaW50YC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIEhPTUVfUkVHSU9OIGVuZHBvaW50IHNlcnZpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50PzogV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IG9mIHRoZSBuZXdlc3QgcmV2aXNpb25zIHRvIGtlZXAgKDEtNTApLiBFYWNoIGRlcGxveW1lbnQgdGhhdCBjaGFuZ2VzIHRoZSBjb2RlIG9yXG4gICAqIGNvbmZpZ3VyYXRpb24gY3JlYXRlcyBhIHJldmlzaW9uOyBvbGRlciBvbmVzIHN0YXkgYXZhaWxhYmxlIHRvIHJvbGwgYmFjayB0byBvciByb3V0ZSB0cmFmZmljIHRvLFxuICAgKiBhbmQgdGhlIG9sZGVzdCBiZXlvbmQgdGhpcyBjb3VudCBhcmUgZGVsZXRlZCBhZnRlciBlYWNoIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIFJldmlzaW9ucyB0aGF0IGFuIGVuZHBvaW50IHJvdXRlcyB0byBhcmUgbmV2ZXIgZGVsZXRlZCwgYW5kIG5laXRoZXIgYXJlIHRob3NlIHRoZSBwcmV2aW91c1xuICAgKiBkZXBsb3ltZW50IHVzZWQgKGEgcm9sbGJhY2sgcmV0dXJucyB0byB0aGVtKS5cbiAgICpcbiAgICogQGRlZmF1bHQgMjBcbiAgICovXG4gIHJlYWRvbmx5IHJldmlzaW9uUmV0ZW50aW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLiBSZW5hbWluZyBhIGZ1bmN0aW9uIHJlcGxhY2VzIGl0LCBhbmQgaXRzIGVuZHBvaW50IGdldHMgYSBuZXcgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgdW5pcXVlIG5hbWUgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbnN0cnVjdCBwYXRoIChtb3ZpbmcgdGhlIGNvbnN0cnVjdCBjaGFuZ2VzIGl0KVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBmdW5jdGlvbidzIGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0aW9uIHJvbGUuXG4gICAqXG4gICAqIEFuIGBpYW0uSVJvbGVgIChub3QgYElSb2xlUmVmYCkgYmVjYXVzZSB0aGUgZnVuY3Rpb24gYWRkcyBzdGF0ZW1lbnRzIHRvIGl0IGFuZCBncmFudHMgdGhyb3VnaCBpdC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHJvbGUgdHJ1c3RpbmcgYGxhbWJkYS5hbWF6b25hd3MuY29tYCB3aXRoIGBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVgXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBBIGN1c3RvbWVyIG1hbmFnZWQgS01TIGtleSBmb3IgdGhlIGZ1bmN0aW9uJ3MgcmV2aXNpb25zOiB0aGVpciBjb2RlIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEEgYFBFUl9SRUdJT05gIG9yIGBNVUxUSV9SRUdJT05gIGVuZHBvaW50IG5lZWRzIGEgKiptdWx0aS1SZWdpb24ga2V5Kiogd2l0aCBhIHJlcGxpY2EgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlc1xuICAgKiBmcm9tLCBhbmQgZWFjaCByZXBsaWNhJ3MgcG9saWN5IG11c3QgYWxsb3cgTGFtYmRhIHRvIGRlY3J5cHQgKHNlZSBgZW5jcnlwdGlvbktleVBvbGljeVN0YXRlbWVudCgpYCkuIEEga2V5IGRlZmluZWRcbiAgICogaW4gdGhpcyBhcHAgZ2V0cyB0aGF0IHN0YXRlbWVudCBhZGRlZCB0byBpdHMgb3duIHBvbGljeS5cbiAgICpcbiAgICogQ2hhbmdpbmcgdGhlIGtleSBjcmVhdGVzIGEgbmV3IHJldmlzaW9uLiBFYXJsaWVyIHJldmlzaW9ucywgaW5jbHVkaW5nIHRoZSBvbmVzIGtlcHQgYXMgcm9sbGJhY2sgdGFyZ2V0cywgc3RpbGxcbiAgICogbmVlZCB0aGVpciBrZXkuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6cHJlZmVyLXJlZi1pbnRlcmZhY2VdXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYW4gQVdTIG93bmVkIGtleVxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMuIE5hbWVzIHN0YXJ0aW5nIHdpdGggYEFXU19gIGFyZSByZXNlcnZlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGEgc2luZ2xlIHJlcXVlc3QgbWF5IHJ1bi5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IG1hbnkgcmVxdWVzdHMgb25lIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVzIGF0IHRoZSBzYW1lIHRpbWUgKDEtMTI4KS5cbiAgICogUmVxdWVzdHMgc2hhcmUgbW9kdWxlLWxldmVsIHN0YXRlLCBzbyBoYW5kbGVycyBtdXN0IGJlIGNvbmN1cnJlbmN5LXNhZmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDY0XG4gICAqL1xuICByZWFkb25seSBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXRlbnRpb24gZm9yIGV2ZXJ5IGxvZyBncm91cCBvZiB0aGUgZnVuY3Rpb24sIGluIGV2ZXJ5IHJlZ2lvbiBpdCBzZXJ2ZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBXaGF0IGhhcHBlbnMgdG8gdGhlIGxvZyBncm91cHMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgcmVtb3ZlZDogUkVUQUlOIG9yIERFU1RST1kuXG4gICAqIFdpdGggREVTVFJPWSwgZGVsZXRpb24gd2FpdHMgYWJvdXQgYSBtaW51dGUgZm9yIGVudmlyb25tZW50cyB0byBmbHVzaCB0aGVpciBsYXN0IGxpbmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIGFwcGxpY2F0aW9uIGxvZ3MgdG8ga2VlcC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbFYyPzogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIHBsYXRmb3JtIGxvZ3MgdG8ga2VlcCAoREVCVUcsIElORk8gb3IgV0FSTikuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBzeXN0ZW1Mb2dMZXZlbFYyPzogbGFtYmRhLlN5c3RlbUxvZ0xldmVsO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGEgYFdlYkZ1bmN0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblByb3BzIGV4dGVuZHMgV2ViRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBOb2RlLmpzIHJ1bnRpbWUsIGUuZy4gYGxhbWJkYS5SdW50aW1lLk5PREVKU18yNF9YYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgY29kZTogYSB6aXAgaW4gUzMgKGBDb2RlLmZyb21Bc3NldGAsIGBDb2RlLmZyb21CdWNrZXRgLCBgQ29kZS5mcm9tQ3VzdG9tQ29tbWFuZGAsIGBDb2RlLmZyb21Eb2NrZXJCdWlsZGApLlxuICAgKiBJbmxpbmUgY29kZSBhbmQgY29udGFpbmVyIGltYWdlcyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBUaGUgY29kZSBpcyBjb3BpZWQgaW50byB0aGUgc3RhY2sncyBjb2RlIGJ1Y2tldCwgd2hpY2ggTGFtYmRhIFdlYiBGdW5jdGlvbnMgY2FuIHJlYWQuXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBsYW1iZGEuQ29kZTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdGhhdCBzdGFydHMgeW91ciBzZXJ2ZXIsIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5kZXguanMnXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQSBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBjcmVhdGVkIGluIHRoaXMgYXBwIChgV2ViRnVuY3Rpb25gKSBvciBpbXBvcnRlZCAoYFdlYkZ1bmN0aW9uLmZyb21XZWJGdW5jdGlvbkFybmApLlxuICpcbiAqIGBhZGRUb1Jlc291cmNlUG9saWN5YCBhZGRzIHRvIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeSAod2hvIGVsc2UgbWF5IGNhbGwgb3IgbWFuYWdlIGl0KS4gRWFjaCBzdGFjayB3cml0ZXNcbiAqIG9ubHkgaXRzIG93biBzdGF0ZW1lbnRzIGludG8gdGhlIGZ1bmN0aW9uJ3Mgc2luZ2xlIHBvbGljeSwgc28gYW55IHN0YWNrIGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQgY2FuIGFkZCB0aGVtLFxuICogaW5jbHVkaW5nIG9uZSB0aGF0IGltcG9ydHMgdGhlIGZ1bmN0aW9uLiBGcm9tIGFub3RoZXIgYWNjb3VudCwgbm90aGluZyBpcyBhZGRlZCAoYHN0YXRlbWVudEFkZGVkOiBmYWxzZWApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElXZWJGdW5jdGlvbiBleHRlbmRzIElSZXNvdXJjZSwgbGFtYmRhLklXZWJGdW5jdGlvblJlZiwgaWFtLklSZXNvdXJjZVdpdGhQb2xpY3kge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgbmFtZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIEFSTi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm46IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBmdW5jdGlvbidzIGVuZHBvaW50IChgbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnRgKTogdGhlIGRlZmF1bHQgZW5kcG9pbnRcbiAgICogb2YgYSBgV2ViRnVuY3Rpb25gOyBmb3IgYW4gaW1wb3J0ZWQgZnVuY3Rpb24sIHRoZSBlbmRwb2ludCBuYW1lZCBpbiBpdHMgYXR0cmlidXRlcywgb3IgZXZlcnkgZW5kcG9pbnQuXG4gICAqXG4gICAqIEEgZ3JhbnRlZSBpbiB0aGUgZnVuY3Rpb24ncyBhY2NvdW50IGdldHMgYW4gSUFNIHBvbGljeSBzdGF0ZW1lbnQ7IGFub3RoZXIgYWNjb3VudCBvciBhbiBBV1Mgc2VydmljZSBhbHNvIGdldHMgYVxuICAgKiBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5IChub3Qgd2hlbiB0aGUgZnVuY3Rpb24gaXRzZWxmIGlzIGluIGFub3RoZXIgYWNjb3VudCB0aGFuIHRoaXMgc3RhY2spLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBIG1ldHJpYyBvZiB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCkuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xuXG4gIC8qKiBUaW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHdlcmUgYWN0aXZlIChgRW52aXJvbm1lbnRBY3RpdmVUaW1lYCkuICovXG4gIG1ldHJpY0FjdGl2ZVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogQ1BVIHRpbWUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdXNlZCAoYEVudmlyb25tZW50Q1BVVGltZWApLiAqL1xuICBtZXRyaWNDcHVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIFJlcXVlc3RzIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVkIGF0IG9uY2UgKGBFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0c2AsIG1heGltdW0pLiAqL1xuICBtZXRyaWNDb25jdXJyZW50UmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogUGVhayBtZW1vcnkgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IHVzZWQgKGBFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlYCwgbWF4aW11bSkuICovXG4gIG1ldHJpY01heE1lbW9yeVVzYWdlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIEJ5dGVzIHNlbnQgaW4gcmVzcG9uc2VzIChgUmVzcG9uc2VCeXRlc2ApLiAqL1xuICBtZXRyaWNSZXNwb25zZUJ5dGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG59XG5cbi8qKlxuICogQXR0cmlidXRlcyBvZiBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24uIEdpdmUgaXRzIEFSTiBvciBpdHMgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLCBlLmcuIGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTExMTIyMjIzMzMzOndlYi1mdW5jdGlvbi9vcmRlcnNgLiBJdCBtYXkgYmUgaW4gYW5vdGhlclxuICAgKiByZWdpb24gb3IgYWNjb3VudDsgYWNyb3NzIGFjY291bnRzLCBgZ3JhbnRJbnZva2VgIGFsc28gbmVlZHMgdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5IHRvIGFsbG93IHRoZSBjYWxsZXIuXG4gICAqIEEgdG9rZW4gKGUuZy4gZnJvbSBhbm90aGVyIHN0YWNrKSBpcyB0YWtlbiB0byBiZSBpbiB0aGlzIHN0YWNrJ3MgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJ1aWx0IGZyb20gYHdlYkZ1bmN0aW9uTmFtZWAsIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZCByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRha2VuIGZyb20gYHdlYkZ1bmN0aW9uQXJuYFxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQgYGdyYW50SW52b2tlYCBhbGxvd3MgY2FsbGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBldmVyeSBlbmRwb2ludCBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9uIGZvciBhIHByaW5jaXBhbCBvdXRzaWRlIHRoaXMgYWNjb3VudCwgYW4gQVdTIHNlcnZpY2Ugb3IgYW4gb3JnYW5pemF0aW9uIHRvIGNhbGwgYSBmdW5jdGlvbidzIGVuZHBvaW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblBlcm1pc3Npb24ge1xuICAvKipcbiAgICogV2hvIG1heSBjYWxsOiBhbiBhY2NvdW50IChgaWFtLkFjY291bnRQcmluY2lwYWxgKSwgYSByb2xlIG9yIHVzZXIgKGBpYW0uQXJuUHJpbmNpcGFsYCksIGFuIEFXUyBzZXJ2aWNlXG4gICAqIChgaWFtLlNlcnZpY2VQcmluY2lwYWxgLCB3aXRoIGBzb3VyY2VBcm5gIG9yIGBzb3VyY2VBY2NvdW50YCkgb3IgYW4gb3JnYW5pemF0aW9uIChgaWFtLk9yZ2FuaXphdGlvblByaW5jaXBhbGApLlxuICAgKlxuICAgKiBBIHByaW5jaXBhbCBpbiBhbm90aGVyIGFjY291bnQgYWxzbyBuZWVkcyBgbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnRgIGluIGl0cyBvd24gSUFNIHBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCB0aGUgcHJpbmNpcGFsIG1heSBjYWxsLiBJdCBtdXN0IGJlbG9uZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGV2ZXJ5IGVuZHBvaW50IG9mIHRoZSBmdW5jdGlvbiwgaW5jbHVkaW5nIG9uZXMgYWRkZWQgbGF0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50PzogV2ViRnVuY3Rpb25FbmRwb2ludDtcblxuICAvKipcbiAgICogRm9yIGFuIEFXUyBzZXJ2aWNlOiB0aGUgQVJOIG9mIHRoZSByZXNvdXJjZSBjYWxsaW5nIG9uIGl0cyBiZWhhbGYgKGNvbmRpdGlvbiBgYXdzOlNvdXJjZUFybmAsIGBBcm5MaWtlYCksXG4gICAqIGUuZy4gYSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi4gV2l0aG91dCBpdCBvciBgc291cmNlQWNjb3VudGAsIGFueSBhY2NvdW50J3MgdXNlIG9mIHRoZSBzZXJ2aWNlIGNvdWxkIGNhbGwgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbmRpdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb3IgYW4gQVdTIHNlcnZpY2U6IHRoZSBhY2NvdW50IHRoYXQgb3ducyB0aGUgcmVzb3VyY2UgY2FsbGluZyBvbiBpdHMgYmVoYWxmIChjb25kaXRpb24gYGF3czpTb3VyY2VBY2NvdW50YCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29uZGl0aW9uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VBY2NvdW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYFdlYkZ1bmN0aW9uYCBhbmQgaW1wb3J0ZWQgZnVuY3Rpb25zIGhhdmUgaW4gY29tbW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2ViRnVuY3Rpb25CYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJV2ViRnVuY3Rpb24ge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKiBBIHJlZmVyZW5jZSB0byB0aGlzIGZ1bmN0aW9uLCBmb3IgQVBJcyB0aGF0IGFjY2VwdCBgbGFtYmRhLklXZWJGdW5jdGlvblJlZmAuICovXG4gIHB1YmxpYyBnZXQgd2ViRnVuY3Rpb25SZWYoKTogbGFtYmRhLldlYkZ1bmN0aW9uUmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbkFybiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZnVuY3Rpb24ncyBlbmRwb2ludC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5LCBlLmcuIHRvIGxldCBhbm90aGVyIGFjY291bnQgbWFuYWdlIHRoZSBmdW5jdGlvbi5cbiAgICogRm9yIGludm9raW5nLCBwcmVmZXIgYGFkZFBlcm1pc3Npb25gIG9yIGBncmFudEludm9rZWAuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYXMgYSBzaW5nbGUgcmVzb3VyY2UgcG9saWN5LiBFYWNoIHN0YWNrIHdyaXRlcyBvbmx5IGl0cyBvd24gc3RhdGVtZW50cyBpbnRvIGl0LCB0aHJvdWdoIGEgY3VzdG9tXG4gICAqIHJlc291cmNlIHRoYXQgbWVyZ2VzIHRoZW0gd2l0aCBldmVyeSBvdGhlciBzdGFjaydzLCBhbmQgd2l0aCBzdGF0ZW1lbnRzIGFkZGVkIG91dHNpZGUgQ2xvdWRGb3JtYXRpb24uIEZyb20gYVxuICAgKiBzdGFjayBpbiBhbm90aGVyIGFjY291bnQgdGhhbiB0aGUgZnVuY3Rpb24sIG5vdGhpbmcgaXMgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFRvUmVzb3VyY2VQb2xpY3lGcm9tKHRoaXMsIHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kgZnJvbSBgc2NvcGVgJ3Mgc3RhY2ssIGUuZy4gdGhlIHN0YWNrIG9mIGEgQ2xvdWRGcm9udFxuICAgKiBkaXN0cmlidXRpb24gdGhhdCB1c2VzIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FkZFRvUmVzb3VyY2VQb2xpY3lGcm9tKHNjb3BlOiBDb25zdHJ1Y3QsIHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICBjb25zdCBmcm9tID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIGlmIChUb2tlbi5jb21wYXJlU3RyaW5ncyhmcm9tLmFjY291bnQsIHRoaXMuZW52LmFjY291bnQpID09PSBUb2tlbkNvbXBhcmlzb24uRElGRkVSRU5UKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpyZXNvdXJjZVBvbGljeUZyb21PdGhlckFjY291bnQnLFxuICAgICAgICBgQSBzdGF0ZW1lbnQgZm9yIHRoZSByZXNvdXJjZSBwb2xpY3kgb2YgYSBmdW5jdGlvbiBpbiBhY2NvdW50ICR7dGhpcy5lbnYuYWNjb3VudH0gd2FzIG5vdCBhZGRlZDogc3RhY2sgJHtmcm9tLnN0YWNrTmFtZX0gaXMgaW4gYWNjb3VudCAke2Zyb20uYWNjb3VudH0uIEFkZCBpdCBpbiB0aGUgZnVuY3Rpb24ncyBhY2NvdW50LmApO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGNvbnN0IHdyaXRlciA9IFJlc291cmNlUG9saWN5U3RhdGVtZW50cy5vZihzY29wZSwgdGhpcywgdGhpcy53ZWJGdW5jdGlvbkFybik7XG4gICAgd3JpdGVyLmFkZChzdGF0ZW1lbnQpO1xuICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiB0cnVlLCBwb2xpY3lEZXBlbmRhYmxlOiB3cml0ZXIucmVzb3VyY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIG1ldHJpYyBvZiB0aGlzIGZ1bmN0aW9uJ3MgZXhlY3V0aW9uIGVudmlyb25tZW50cyBpbiBgQVdTL0xhbWJkYS9XZWJgIChkaW1lbnNpb24gYEZ1bmN0aW9uTmFtZWApLCBhY3Jvc3MgYWxsIGVuZHBvaW50cy5cbiAgICogRm9yIHJlcXVlc3QgYW5kIGVycm9yIGNvdW50cywgdXNlIHRoZSBlbmRwb2ludCdzIG1ldHJpY3MgKGBmbi5lbmRwb2ludC5tZXRyaWNSZXF1ZXN0cygpYCkuXG4gICAqXG4gICAqIE1ldHJpY3MgYXJlIHB1Ymxpc2hlZCBpbiB0aGUgcmVnaW9uIHRoYXQgc2VydmVkIHRoZSByZXF1ZXN0OiBwYXNzIGByZWdpb25gIGZvciBhbm90aGVyIHNlcnZpbmcgcmVnaW9uLlxuICAgKiBBbiBhbGFybSBjYW4gb25seSB1c2UgbWV0cmljcyBmcm9tIGl0cyBvd24gc3RhY2sncyByZWdpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgMSBtaW51dGUsIGluIHRoZSBmdW5jdGlvbidzIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgLy8gQW4gaW1wb3J0ZWQgZnVuY3Rpb24gaW4gYW5vdGhlciByZWdpb24gcHVibGlzaGVzIGl0cyBtZXRyaWNzIHRoZXJlLlxuICAgIGNvbnN0IHJlZ2lvbiA9ICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5lbnYucmVnaW9uKSAmJiB0aGlzLmVudi5yZWdpb24gIT09IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbiA/IHRoaXMuZW52LnJlZ2lvbiA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogV0VCX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7IEZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbk5hbWUgfSxcbiAgICAgIHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5TVU0sXG4gICAgICBwZXJpb2Q6IERFRkFVTFRfUEVSSU9ELFxuICAgICAgcmVnaW9uLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogVGltZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50cyB3ZXJlIGFjdGl2ZSAoYEVudmlyb25tZW50QWN0aXZlVGltZWApLiAqL1xuICBwdWJsaWMgbWV0cmljQWN0aXZlVGltZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50QWN0aXZlVGltZScsIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBDUFUgdGltZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50cyB1c2VkIChgRW52aXJvbm1lbnRDUFVUaW1lYCkuICovXG4gIHB1YmxpYyBtZXRyaWNDcHVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRDUFVUaW1lJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVkIGF0IG9uY2UgKGBFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0c2ApLCB0byBjb21wYXJlIHdpdGhcbiAgICogYG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1heGltdW0gb3ZlciAxIG1pbnV0ZVxuICAgKi9cbiAgcHVibGljIG1ldHJpY0NvbmN1cnJlbnRSZXF1ZXN0cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50Q29uY3VycmVudFJlcXVlc3RzJywgeyBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuTUFYSU1VTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVhayBtZW1vcnkgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IHVzZWQgKGBFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlYCk7IGVhY2ggZW52aXJvbm1lbnQgaGFzIDIgR0IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbWF4aW11bSBvdmVyIDEgbWludXRlXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTWF4TWVtb3J5VXNhZ2UocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlJywgeyBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuTUFYSU1VTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKiogQnl0ZXMgc2VudCBpbiByZXNwb25zZXMgKGBSZXNwb25zZUJ5dGVzYCkuICovXG4gIHB1YmxpYyBtZXRyaWNSZXNwb25zZUJ5dGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnUmVzcG9uc2VCeXRlcycsIHByb3BzKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgTm9kZS5qcyBIVFRQIHNlcnZlciBydW5uaW5nIGFzIGFuIEFXUyBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBzZXJ2ZWQgZnJvbSBvbmUgb3IgbW9yZSByZWdpb25zLlxuICpcbiAqIENyZWF0ZXMgdGhlIGZ1bmN0aW9uLCBpdHMgY3VycmVudCByZXZpc2lvbiAoY29kZSBhbmQgY29uZmlndXJhdGlvbjsgYW55IGNoYW5nZSBjcmVhdGVzIGEgbmV3IG9uZSxcbiAqIGFuZCB0aGUgbmV3ZXN0IGByZXZpc2lvblJldGVudGlvbmAgYXJlIGtlcHQpLCBhIGRlZmF1bHQgSFRUUFMgZW5kcG9pbnQsIGFuIGV4ZWN1dGlvbiByb2xlLCBhbmQgb3duc1xuICogdGhlIGZ1bmN0aW9uJ3MgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24gaXRzIGVuZHBvaW50cyBzZXJ2ZSBmcm9tLlxuICpcbiAqIFVzZSBgZnJvbVdlYkZ1bmN0aW9uQXJuYCwgYGZyb21XZWJGdW5jdGlvbk5hbWVgIG9yIGBmcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzYCBmb3IgYSBmdW5jdGlvbiBkZWZpbmVkIGVsc2V3aGVyZS5cbiAqXG4gKiBAcmVzb3VyY2UgQVdTOjpMYW1iZGE6OldlYkZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJGdW5jdGlvbiBleHRlbmRzIFdlYkZ1bmN0aW9uQmFzZSBpbXBsZW1lbnRzIGlhbS5JR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXMgdGhpcyBjbGFzcyB0byBwcm9wZXJ0eSBpbmplY3RvcnMgKGBQcm9wZXJ0eUluamVjdG9ycy5vZihzY29wZSkuYWRkKC4uLilgKSwgd2hpY2ggY2FuIHNldCBkZWZhdWx0IHByb3BzIGZvclxuICAgKiBldmVyeSBgV2ViRnVuY3Rpb25gIHVuZGVyIGEgc2NvcGUuIEluamVjdG9ycyBmb3IgYFdlYkZ1bmN0aW9uYCBhbHNvIGFwcGx5IHRvIGBOb2RlanNXZWJGdW5jdGlvbmAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhc2hpc2hwYW5kZXlvbmUvY2RrLWxhbWJkYS13ZWItZnVuY3Rpb24uV2ViRnVuY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4aXN0aW5nIFdlYiBGdW5jdGlvbiBieSBpdHMgQVJOIChpbiBhbnkgcmVnaW9uIG9yIGFjY291bnQpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tV2ViRnVuY3Rpb25Bcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgd2ViRnVuY3Rpb25Bcm46IHN0cmluZyk6IElXZWJGdW5jdGlvbiB7XG4gICAgcmV0dXJuIFdlYkZ1bmN0aW9uLmZyb21XZWJGdW5jdGlvbkF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IHdlYkZ1bmN0aW9uQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXhpc3RpbmcgV2ViIEZ1bmN0aW9uIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZCByZWdpb24gYnkgaXRzIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21XZWJGdW5jdGlvbk5hbWUoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmcpOiBJV2ViRnVuY3Rpb24ge1xuICAgIHJldHVybiBXZWJGdW5jdGlvbi5mcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB3ZWJGdW5jdGlvbk5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb246IGdpdmUgaXRzIEFSTiBvciBpdHMgbmFtZSwgYW5kIG9wdGlvbmFsbHkgdGhlIGVuZHBvaW50IGBncmFudEludm9rZWAgYWxsb3dzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMpOiBJV2ViRnVuY3Rpb24ge1xuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRXZWJGdW5jdGlvbihzY29wZSwgaWQsIGF0dHJzKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBJRCBvZiB0aGUgY3VycmVudCByZXZpc2lvbi4gU2FtZSBhcyBgY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWRgLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmV2aXNpb25JZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgcmV2aXNpb24gYnVpbHQgZnJvbSB0aGUgY3VycmVudCBjb2RlIGFuZCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudFJldmlzaW9uOiBJV2ViRnVuY3Rpb25SZXZpc2lvbjtcblxuICAvKiogVGhlIGRlZmF1bHQgZW5kcG9pbnQuIEFkZCBtb3JlIHdpdGggYGFkZEVuZHBvaW50YC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50OiBXZWJGdW5jdGlvbkVuZHBvaW50O1xuXG4gIC8qKiBHcmFudHMgb24gdGhlIGRlZmF1bHQgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiBPdGhlciBlbmRwb2ludHMgaGF2ZSB0aGVpciBvd24gYGdyYW50c2AuICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudHM6IFdlYkZ1bmN0aW9uR3JhbnRzO1xuXG4gIC8qKiBUaGUgZXhlY3V0aW9uIHJvbGUuICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG5cbiAgLyoqIFRoZSBjdXN0b21lciBtYW5hZ2VkIGtleSBvZiB0aGUgZnVuY3Rpb24ncyByZXZpc2lvbnMsIGlmIGFueS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKiogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0byAodGhlIGV4ZWN1dGlvbiByb2xlKS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIGhvbWUtcmVnaW9uIGxvZyBncm91cCB0aGF0IHJlY2VpdmVzIHRoZSBsb2dzIG9mIGV2ZXJ5IHJlZ2lvbiB0aGUgZnVuY3Rpb24gc2VydmVzIGZyb20uXG4gICAqIFN1YnNjcmliZSB0byB0aGlzIG9uZSBvbmx5OiBlYWNoIHJlZ2lvbidzIGAubG9jYWxgIGdyb3VwIGhvbGRzIGEgY29weSBvZiB0aGUgc2FtZSBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuSUxvZ0dyb3VwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbW90ZUxvZ0dyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBXZWJGdW5jdGlvbkxvZ0dyb3VwPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ09wdGlvbnM6IFBpY2s8V2ViRnVuY3Rpb25Qcm9wcywgJ2xvZ1JldGVudGlvbicgfCAnbG9nUmVtb3ZhbFBvbGljeSc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV2aXNpb25DbGVhbnVwOiBSZXZpc2lvbkNsZWFudXA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBwcm9wcyA9IGluamVjdFByb3BzKFdlYkZ1bmN0aW9uLlBST1BFUlRZX0lOSkVDVElPTl9JRCwgcHJvcHMsIHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMucnVudGltZS5mYW1pbHkgIT09IGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogTGFtYmRhIFdlYiBGdW5jdGlvbnMgcnVuIE5vZGUuanMgb25seSwgZ290ICR7cHJvcHMucnVudGltZS5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0ID0gcHJvcHMudGltZW91dD8udG9TZWNvbmRzKCkgPz8gMzA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGltZW91dCkgJiYgKHRpbWVvdXQgPCAzIHx8IHRpbWVvdXQgPiA5MDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAzIHNlY29uZHMgYW5kIDE1IG1pbnV0ZXMsIGdvdCAke3RpbWVvdXR9c2ApO1xuICAgIH1cbiAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHByb3BzLm1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ7XG4gICAgY29uc3QgdmFsaWRDb25jdXJyZW5jeSA9IChuOiBudW1iZXIpID0+IE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAxICYmIG4gPD0gMTI4O1xuICAgIGlmIChtYXhDb25jdXJyZW5jeSAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQobWF4Q29uY3VycmVuY3kpICYmICF2YWxpZENvbmN1cnJlbmN5KG1heENvbmN1cnJlbmN5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDEyOCwgZ290ICR7bWF4Q29uY3VycmVuY3l9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJldmlzaW9uUmV0ZW50aW9uID0gcHJvcHMucmV2aXNpb25SZXRlbnRpb24gPz8gMjA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocmV2aXNpb25SZXRlbnRpb24pICYmICghTnVtYmVyLmlzSW50ZWdlcihyZXZpc2lvblJldGVudGlvbikgfHwgcmV2aXNpb25SZXRlbnRpb24gPCAxIHx8IHJldmlzaW9uUmV0ZW50aW9uID4gNTApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZXZpc2lvblJldGVudGlvbiBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDUwLCBnb3QgJHtyZXZpc2lvblJldGVudGlvbn1gKTtcbiAgICB9XG4gICAgY29uc3Qgc3lzdGVtTG9nTGV2ZWxzID0gW2xhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5ERUJVRywgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk8sIGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5XQVJOXTtcbiAgICBpZiAocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMiAhPT0gdW5kZWZpbmVkICYmICFzeXN0ZW1Mb2dMZXZlbHMuaW5jbHVkZXMocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHN5c3RlbUxvZ0xldmVsVjIgbXVzdCBiZSBERUJVRywgSU5GTyBvciBXQVJOIGZvciBMYW1iZGEgV2ViIEZ1bmN0aW9uc2ApO1xuICAgIH1cblxuICAgIHRoaXMud2ViRnVuY3Rpb25OYW1lID0gcHJvcHMud2ViRnVuY3Rpb25OYW1lID8/IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQsIHNlcGFyYXRvcjogJy0nIH0pO1xuICAgIGFzc2VydFJlc291cmNlTmFtZSh0aGlzLCAnd2ViRnVuY3Rpb25OYW1lJywgdGhpcy53ZWJGdW5jdGlvbk5hbWUpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMuZW52aXJvbm1lbnQgPz8ge30pKSB7XG4gICAgICB0aGlzLmFkZEVudmlyb25tZW50KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZW50cnlwb2ludCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVudmlyb25tZW50LkFXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQgPSBwcm9wcy5lbnRyeXBvaW50O1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ0dyb3VwTmFtZSA9IGAvYXdzL2xhbWJkYS93ZWIvJHt0aGlzLndlYkZ1bmN0aW9uTmFtZX1gO1xuICAgIHRoaXMucm9sZSA9IHByb3BzLnJvbGUgPz8gdGhpcy5jcmVhdGVSb2xlKGxvZ0dyb3VwTmFtZSk7XG4gICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMucm9sZTtcblxuICAgIC8vIExvZyBncm91cHMgZmlyc3Q6IHRoZSBzZXJ2aWNlIHdvdWxkIG90aGVyd2lzZSBjcmVhdGUgdGhlbSB3aXRob3V0IHJldGVudGlvbi5cbiAgICB0aGlzLmxvZ0dyb3VwTmFtZSA9IGxvZ0dyb3VwTmFtZTtcbiAgICB0aGlzLmxvZ09wdGlvbnMgPSB7IGxvZ1JldGVudGlvbjogcHJvcHMubG9nUmV0ZW50aW9uLCBsb2dSZW1vdmFsUG9saWN5OiBwcm9wcy5sb2dSZW1vdmFsUG9saWN5IH07XG4gICAgY29uc3QgbG9nR3JvdXBzID0gdGhpcy5jcmVhdGVMb2dHcm91cHMobG9nR3JvdXBOYW1lKTtcbiAgICB0aGlzLmxvZ0dyb3VwID0gbG9ncy5Mb2dHcm91cC5mcm9tTG9nR3JvdXBOYW1lKHRoaXMsICdMb2dHcm91cCcsIGxvZ0dyb3VwTmFtZSk7XG5cbiAgICBjb25zdCBjb2RlID0gbmV3IFdlYkZ1bmN0aW9uQ29kZSh0aGlzLCAnQ29kZScsIHByb3BzLmNvZGUpLmxvY2F0aW9uO1xuXG4gICAgY29uc3QgZm4gPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uKHRoaXMsICdSZXNvdXJjZScsIHsgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSB9KTtcbiAgICAvLyBUaGUgZnVuY3Rpb24gaXMgZGVsZXRlZCBiZWZvcmUgaXRzIGxvZyBncm91cHMsIHdoaWNoIHRoZW4gd2FpdCBmb3IgbGF0ZSBmbHVzaGVzLlxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgbG9nR3JvdXBzKSBmbi5ub2RlLmFkZERlcGVuZGVuY3koZ3JvdXAucmVzb3VyY2UpO1xuICAgIFZhbGlkYXRpb25zLm9mKGZuKS5hY2tub3dsZWRnZShDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFKTtcbiAgICB0aGlzLnJlc291cmNlID0gZm47XG4gICAgdGhpcy53ZWJGdW5jdGlvbkFybiA9IGZuLmF0dHJGdW5jdGlvbkFybjtcblxuICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IHByb3BzLmVuY3J5cHRpb25LZXk7XG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSkge1xuICAgICAgLy8gT25seSBhIGtleSBkZWZpbmVkIGluIHRoaXMgYXBwIHRha2VzIHRoZSBzdGF0ZW1lbnQgKGFuIGltcG9ydGVkIGtleSdzIHBvbGljeSBpcyBtYW5hZ2VkIGVsc2V3aGVyZSkuXG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuYWRkVG9SZXNvdXJjZVBvbGljeSh0aGlzLmVuY3J5cHRpb25LZXlQb2xpY3lTdGF0ZW1lbnQoKSk7XG4gICAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbih7IHZhbGlkYXRlOiAoKSA9PiB0aGlzLnZhbGlkYXRlRW5jcnlwdGlvbktleSgpIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJldmlzaW9uID0gbmV3IGxhbWJkYS5DZm5XZWJGdW5jdGlvblJldmlzaW9uKHRoaXMsICdSZXZpc2lvbicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogZm4uYXR0ckZ1bmN0aW9uQXJuLFxuICAgICAga21zS2V5QXJuOiB0aGlzLmVuY3J5cHRpb25LZXk/LmtleUFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGJ1aWxkQ29uZmlnOiB7XG4gICAgICAgIGNvZGVDb25maWc6IHsgczNPYmplY3Q6IHsgYnVja2V0OiBjb2RlLmJ1Y2tldE5hbWUsIGtleTogY29kZS5vYmplY3RLZXksIHZlcnNpb25JZDogY29kZS5vYmplY3RWZXJzaW9uIH0gfSxcbiAgICAgICAgcnVudGltZUNvbmZpZzogeyBydW50aW1lOiBwcm9wcy5ydW50aW1lLm5hbWUgfSxcbiAgICAgIH0sXG4gICAgICBzZXJ2aWNlQ29uZmlnOiB7XG4gICAgICAgIGV4ZWN1dGlvblJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiAoT2JqZWN0LmtleXModGhpcy5lbnZpcm9ubWVudCkubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5lbnZpcm9ubWVudCB9IDogdW5kZWZpbmVkKSB9KSxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHRpbWVvdXQsXG4gICAgICAgIG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ6IG1heENvbmN1cnJlbmN5LFxuICAgICAgICB0ZWxlbWV0cnlDb25maWc6IHtcbiAgICAgICAgICBsb2dnaW5nQ29uZmlnOiB7XG4gICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXBOYW1lLFxuICAgICAgICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogcHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbFYyLFxuICAgICAgICAgICAgc3lzdGVtTG9nTGV2ZWw6IHByb3BzLnN5c3RlbUxvZ0xldmVsVjIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJvbGUncyBwb2xpY2llcywgc28gdGhlIGZpcnN0IGVudmlyb25tZW50IHN0YXJ0cyB3aXRoIGl0cyBwZXJtaXNzaW9ucy5cbiAgICByZXZpc2lvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXZpc2lvbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgLy8gUmVwbGFjZWQgcmV2aXNpb25zIHN0YXkgYXMgcm9sbGJhY2sgdGFyZ2V0czsgUmV2aXNpb25DbGVhbnVwIGRlbGV0ZXMgdGhlIG9sZGVzdC4gRGVsZXRpbmcgdGhlIGZ1bmN0aW9uIGRlbGV0ZXMgdGhlbSBhbGwuXG4gICAgcmV2aXNpb24uYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB0aGlzLnJldmlzaW9uSWQgPSByZXZpc2lvbi5hdHRyUmV2aXNpb25JZDtcbiAgICB0aGlzLmN1cnJlbnRSZXZpc2lvbiA9IFdlYkZ1bmN0aW9uUmV2aXNpb24uX2N1cnJlbnQodGhpcywgJ0N1cnJlbnRSZXZpc2lvbicsIHRoaXMsIHJldmlzaW9uLmF0dHJSZXZpc2lvbklkLCByZXZpc2lvbi5hdHRyUmV2aXNpb25Bcm4pO1xuXG4gICAgdGhpcy5yZXZpc2lvbkNsZWFudXAgPSBuZXcgUmV2aXNpb25DbGVhbnVwKHRoaXMsICdSZXZpc2lvbkNsZWFudXAnLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25Bcm46IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGtlZXA6IHJldmlzaW9uUmV0ZW50aW9uLFxuICAgICAgcmV2aXNpb25JZHM6ICgpID0+IFt0aGlzLmN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkLCAuLi50aGlzLmVuZHBvaW50cy5mbGF0TWFwKChlKSA9PiBlLl9yZXZpc2lvbklkcygpKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVuZHBvaW50ID0gdGhpcy5jcmVhdGVFbmRwb2ludCgnRW5kcG9pbnQnLCB7IC4uLnByb3BzLmVuZHBvaW50LCBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUgfSwgJ2RlZmF1bHQnKTtcbiAgICB0aGlzLmdyYW50cyA9IHRoaXMuZW5kcG9pbnQuZ3JhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW5kcG9pbnQgKHVwIHRvIDEwIHBlciBmdW5jdGlvbiksIGUuZy4gYSBwdWJsaWMgb25lIG5leHQgdG8gYW4gSUFNLW9ubHkgb25lLCBvciBvbmUgcGlubmVkIHRvIGFuXG4gICAqIGVhcmxpZXIgcmV2aXNpb24uIEVhY2ggZW5kcG9pbnQgaGFzIGl0cyBvd24gVVJMLCBhdXRoZW50aWNhdGlvbiwgcmVnaW9ucyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgdGhlIGVuZHBvaW50J3MgY29uc3RydWN0IElELCBhbHNvIHVzZWQgaW4gaXRzIGdlbmVyYXRlZCBuYW1lIChgPGlkPi08aGFzaD5gKVxuICAgKi9cbiAgcHVibGljIGFkZEVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgY29uc3QgcHJlZml4ID0gaWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rLywgJycpLnNsaWNlKDAsIDU1KS5yZXBsYWNlKC8tKyQvLCAnJykgfHwgJ2VuZHBvaW50JztcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVFbmRwb2ludChpZCwgb3B0aW9ucywgcHJlZml4LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKi9cbiAgcHVibGljIGFkZEVudmlyb25tZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogV2ViRnVuY3Rpb24ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnQVdTXycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBlbnZpcm9ubWVudCB2YXJpYWJsZSAke2tleX0gaXMgcmVzZXJ2ZWQgKG5hbWVzIHN0YXJ0aW5nIHdpdGggQVdTXyBhcmUgc2V0IGJ5IHRoZSBydW50aW1lKSR7a2V5ID09PSAnQVdTX0xBTUJEQV9OT0RFSlNfRU5UUllQT0lOVCcgPyAnOyB1c2UgdGhlIGVudHJ5cG9pbnQgcHJvcGVydHknIDogJyd9YCk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnRba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIGV4ZWN1dGlvbiByb2xlJ3MgcG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYGdyYW50ZWVgIHRvIGNhbGwgdGhlIGVuZHBvaW50LiBTaG9ydGN1dCBmb3IgYGdyYW50cy5pbnZva2UoZ3JhbnRlZSlgLCBhcyBvbiBgbGFtYmRhLkZ1bmN0aW9uYC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5pbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgcHJpbmNpcGFsIGluIGFub3RoZXIgYWNjb3VudCwgYW4gQVdTIHNlcnZpY2Ugb3IgYW4gb3JnYW5pemF0aW9uIHRvIGNhbGwgdGhlIGZ1bmN0aW9uJ3MgZW5kcG9pbnRzLFxuICAgKiB0aHJvdWdoIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeS4gRm9yIGEgcm9sZSBpbiB0aGlzIGFjY291bnQsIHVzZSBgZ3JhbnRJbnZva2VgLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgdGhlIHN0YXRlbWVudCBJRCAoYFNpZGApOiBsZXR0ZXJzIGFuZCBkaWdpdHMsIHVuaXF1ZSB3aXRoaW4gdGhlIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgYWRkUGVybWlzc2lvbihpZDogc3RyaW5nLCBwZXJtaXNzaW9uOiBXZWJGdW5jdGlvblBlcm1pc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChpZCkgJiYgIS9eW0EtWmEtejAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHBlcm1pc3Npb24gaWQgJyR7aWR9JyBtdXN0IGJlIGxldHRlcnMgYW5kIGRpZ2l0cyBvbmx5IChpdCBpcyB0aGUgc3RhdGVtZW50J3MgU2lkKWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJtaXNzaW9uSWRzLmhhcyhpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZXJlIGlzIGFscmVhZHkgYSBwZXJtaXNzaW9uIHdpdGggaWQgJyR7aWR9J2ApO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IHBlcm1pc3Npb24uZW5kcG9pbnQ7XG4gICAgaWYgKGVuZHBvaW50ICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuZW5kcG9pbnRzLmluY2x1ZGVzKGVuZHBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50ICR7ZW5kcG9pbnQubm9kZS5wYXRofSBiZWxvbmdzIHRvIGFub3RoZXIgZnVuY3Rpb25gKTtcbiAgICB9XG4gICAgdGhpcy5wZXJtaXNzaW9uSWRzLmFkZChpZCk7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiBpZCxcbiAgICAgIHByaW5jaXBhbHM6IFtwZXJtaXNzaW9uLnByaW5jaXBhbF0sXG4gICAgICBhY3Rpb25zOiBbJ2xhbWJkYTpJbnZva2VXZWJGdW5jdGlvbkVuZHBvaW50J10sXG4gICAgICByZXNvdXJjZXM6IFtlbmRwb2ludD8uZW5kcG9pbnRBcm4gPz8gYCR7dGhpcy53ZWJGdW5jdGlvbkFybn0vZW5kcG9pbnQvKmBdLFxuICAgIH0pO1xuICAgIGlmIChwZXJtaXNzaW9uLnNvdXJjZUFybiAhPT0gdW5kZWZpbmVkKSBzdGF0ZW1lbnQuYWRkQ29uZGl0aW9uKCdBcm5MaWtlJywgeyAnYXdzOlNvdXJjZUFybic6IHBlcm1pc3Npb24uc291cmNlQXJuIH0pO1xuICAgIGlmIChwZXJtaXNzaW9uLnNvdXJjZUFjY291bnQgIT09IHVuZGVmaW5lZCkgc3RhdGVtZW50LmFkZENvbmRpdGlvbignU3RyaW5nRXF1YWxzJywgeyAnYXdzOlNvdXJjZUFjY291bnQnOiBwZXJtaXNzaW9uLnNvdXJjZUFjY291bnQgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleS1wb2xpY3kgc3RhdGVtZW50IExhbWJkYSBuZWVkcyB0byBzdGFydCB0aGlzIGZ1bmN0aW9uJ3MgZW52aXJvbm1lbnRzIHdpdGggYGVuY3J5cHRpb25LZXlgOiBga21zOkRlY3J5cHRgIGZvclxuICAgKiBgbGFtYmRhLmFtYXpvbmF3cy5jb21gLCBsaW1pdGVkIHRvIHRoaXMgZnVuY3Rpb24ncyByZXZpc2lvbnMgKGBhd3M6U291cmNlQXJuYCBhbmQgdGhlIGVuY3J5cHRpb24gY29udGV4dCBMYW1iZGEgc2V0cykuXG4gICAqXG4gICAqIEl0J3MgYWRkZWQgdG8gYGVuY3J5cHRpb25LZXlgIHdoZW4gdGhlIGtleSBpcyBkZWZpbmVkIGluIHRoaXMgYXBwLiBBZGQgaXQgdG8gZXZlcnkgcmVwbGljYSBvZiBhIG11bHRpLVJlZ2lvbiBrZXlcbiAgICogeW91cnNlbGY6IHJlcGxpY2FzIGRvbid0IHNoYXJlIHRoZWlyIHByaW1hcnkncyBwb2xpY3kuXG4gICAqL1xuICBwdWJsaWMgZW5jcnlwdGlvbktleVBvbGljeVN0YXRlbWVudCgpOiBpYW0uUG9saWN5U3RhdGVtZW50IHtcbiAgICBjb25zdCByZXZpc2lvbnMgPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xhbWJkYScsIHJlc291cmNlOiAnd2ViLWZ1bmN0aW9uJywgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLndlYkZ1bmN0aW9uTmFtZX0vcmV2aXNpb24vKmAsIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyldLFxuICAgICAgYWN0aW9uczogWydrbXM6RGVjcnlwdCddLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nTGlrZTogeyAnYXdzOlNvdXJjZUFybic6IHJldmlzaW9ucywgJ2ttczpFbmNyeXB0aW9uQ29udGV4dDphd3M6bGFtYmRhOldlYkZ1bmN0aW9uUmV2aXNpb25Bcm4nOiByZXZpc2lvbnMgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaW9uYWwgYW5kIG11bHRpLXJlZ2lvbiBlbmRwb2ludHMgbmVlZCBhIG11bHRpLVJlZ2lvbiBrZXk6IG90aGVyd2lzZSB0aGVpciBvdGhlciByZWdpb25zIGZhaWwgdG8gYWN0aXZhdGUuICovXG4gIHByaXZhdGUgdmFsaWRhdGVFbmNyeXB0aW9uS2V5KCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBtdWx0aSA9IHRoaXMuZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS5lbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLkhPTUVfUkVHSU9OKTtcbiAgICBpZiAobXVsdGkubGVuZ3RoID09PSAwIHx8IGlzTXVsdGlSZWdpb25LZXkodGhpcy5lbmNyeXB0aW9uS2V5ISkgIT09IGZhbHNlKSByZXR1cm4gW107XG4gICAgY29uc3QgdHlwZU5hbWUgPSAodDogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUpID0+ICh0ID09PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5NVUxUSV9SRUdJT04gPyAnTVVMVElfUkVHSU9OJyA6ICdQRVJfUkVHSU9OJyk7XG4gICAgcmV0dXJuIFtgZW5jcnlwdGlvbktleSBtdXN0IGJlIGEgbXVsdGktUmVnaW9uIGtleSAod2l0aCBhIHJlcGxpY2EgaW4gZXZlcnkgc2VydmluZyByZWdpb24pIGZvciAke211bHRpLm1hcCgoZSkgPT4gYCR7ZS5ub2RlLmlkfSAoJHt0eXBlTmFtZShlLmVuZHBvaW50VHlwZSl9KWApLmpvaW4oJywgJyl9OiB3aXRoIGEgc2luZ2xlLVJlZ2lvbiBrZXksIHRoZSBlbmRwb2ludCBmYWlscyB0byBhY3RpdmF0ZSBpbiBpdHMgb3RoZXIgcmVnaW9ucyBhbmQgdGhlIGRlcGxveW1lbnQgcm9sbHMgYmFja2BdO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFbmRwb2ludChpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucywgbmFtZVByZWZpeDogc3RyaW5nLCBuYW1lU2VlZD86IHN0cmluZyk6IFdlYkZ1bmN0aW9uRW5kcG9pbnQge1xuICAgIGlmICh0aGlzLmVuZHBvaW50cy5sZW5ndGggPj0gTUFYX0VORFBPSU5UUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogYSBXZWIgRnVuY3Rpb24gY2FuIGhhdmUgYXQgbW9zdCAke01BWF9FTkRQT0lOVFN9IGVuZHBvaW50c2ApO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IFdlYkZ1bmN0aW9uRW5kcG9pbnQuX2NyZWF0ZSh0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHdlYkZ1bmN0aW9uOiB0aGlzLFxuICAgICAgY3VycmVudFJldmlzaW9uOiB0aGlzLmN1cnJlbnRSZXZpc2lvbixcbiAgICAgIG5hbWVQcmVmaXgsXG4gICAgICBuYW1lU2VlZCxcbiAgICB9KTtcbiAgICBjb25zdCBjbGFzaCA9IHRoaXMuZW5kcG9pbnRzLmZpbmQoKGUpID0+ICFUb2tlbi5pc1VucmVzb2x2ZWQoZS5lbmRwb2ludE5hbWUpICYmIGUuZW5kcG9pbnROYW1lID09PSBlbmRwb2ludC5lbmRwb2ludE5hbWUpO1xuICAgIGlmIChjbGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06IGVuZHBvaW50TmFtZSAnJHtlbmRwb2ludC5lbmRwb2ludE5hbWV9JyBpcyBhbHJlYWR5IHVzZWQgYnkgJHtjbGFzaC5ub2RlLnBhdGh9YCk7XG4gICAgfVxuICAgIHRoaXMuZW5kcG9pbnRzLnB1c2goZW5kcG9pbnQpO1xuICAgIC8vIFJldmlzaW9ucyBhbiBlbmRwb2ludCBzdG9wcyByb3V0aW5nIHRvIG9ubHkgYmVjb21lIGRlbGV0YWJsZSBvbmNlIGl0J3MgdXBkYXRlZC5cbiAgICB0aGlzLnJldmlzaW9uQ2xlYW51cC5ub2RlLmFkZERlcGVuZGVuY3koZW5kcG9pbnQpO1xuICAgIC8vIEVhY2ggc2VydmluZyByZWdpb24ncyAubG9jYWwgZ3JvdXAgbXVzdCBleGlzdCBiZWZvcmUgdHJhZmZpYywgYW5kIG91dGxpdmUgdGhlIGZ1bmN0aW9uLlxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIGVuZHBvaW50LnJlZ2lvbnMuc2xpY2UoMSkpIHtcbiAgICAgIGlmICh0aGlzLnJlbW90ZUxvZ0dyb3Vwcy5oYXMocmVnaW9uKSkgY29udGludWU7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMubG9nR3JvdXBJbihgTG9jYWxMb2dzLSR7cmVnaW9ufWAsIHJlZ2lvbiwgYCR7dGhpcy5sb2dHcm91cE5hbWV9LmxvY2FsYCk7XG4gICAgICB0aGlzLnJlbW90ZUxvZ0dyb3Vwcy5zZXQocmVnaW9uLCBncm91cCk7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShncm91cC5yZXNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBleGVjdXRpb24gcm9sZTogd3JpdGUgdG8gdGhlIGZ1bmN0aW9uJ3Mgb3duIGxvZyBncm91cHMgb25seSAodGhlIGhvbWUgcmVnaW9uJ3MgYW5kIGV2ZXJ5IHJlZ2lvbidzXG4gICAqIGAubG9jYWxgIGNvcHkpLCB0aGUgbWluaW11bSBBV1MgZG9jdW1lbnRzIGZvciBXZWIgRnVuY3Rpb25zLiBOb3QgYEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZWAsIHdob3NlXG4gICAqIGBsb2dzOkNyZWF0ZUxvZ0dyb3VwYCBvbiBgKmAgbGV0cyBlbnZpcm9ubWVudHMgc3RpbGwgc2h1dHRpbmcgZG93biByZS1jcmVhdGUgYSBkZWxldGVkIG9yIHJlbmFtZWQgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVJvbGUobG9nR3JvdXBOYW1lOiBzdHJpbmcpOiBpYW0uUm9sZSB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBsb2dHcm91cEFybiA9IChyZWdpb246IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiBzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xvZ3MnLCByZWdpb24sIHJlc291cmNlOiAnbG9nLWdyb3VwJywgcmVzb3VyY2VOYW1lOiBgJHtuYW1lfToqYCwgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdTZXJ2aWNlUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgTG9nczogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW25ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFsnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpQdXRMb2dFdmVudHMnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2xvZ0dyb3VwQXJuKHN0YWNrLnJlZ2lvbiwgbG9nR3JvdXBOYW1lKSwgbG9nR3JvdXBBcm4oJyonLCBgJHtsb2dHcm91cE5hbWV9LmxvY2FsYCldLFxuICAgICAgICAgIH0pXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGFja25vd2xlZGdlSWFtRmluZGluZ3Mocm9sZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5SZXNvdXJjZSwgJ0xvZyBzdHJlYW1zIG9mIHRoaXMgZnVuY3Rpb25cXCdzIG93biBsb2cgZ3JvdXBzLCBpbiBldmVyeSByZWdpb24gaXQgc2VydmVzIGZyb20nKTtcbiAgICByZXR1cm4gcm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZTogc3RyaW5nKTogV2ViRnVuY3Rpb25Mb2dHcm91cFtdIHtcbiAgICBjb25zdCBob21lID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvZ3MnLCBob21lLCBsb2dHcm91cE5hbWUpLFxuICAgICAgdGhpcy5sb2dHcm91cEluKCdMb2NhbExvZ3MnLCBob21lLCBgJHtsb2dHcm91cE5hbWV9LmxvY2FsYCksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nR3JvdXBJbihpZDogc3RyaW5nLCByZWdpb246IHN0cmluZywgbmFtZTogc3RyaW5nKTogV2ViRnVuY3Rpb25Mb2dHcm91cCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkxvZ0dyb3VwKHRoaXMsIGlkLCB7XG4gICAgICByZWdpb24sXG4gICAgICBsb2dHcm91cE5hbWU6IG5hbWUsXG4gICAgICByZXRlbnRpb246IHRoaXMubG9nT3B0aW9ucy5sb2dSZXRlbnRpb24gPz8gbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHRoaXMubG9nT3B0aW9ucy5sb2dSZW1vdmFsUG9saWN5ID8/IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBBIFdlYiBGdW5jdGlvbiBkZWZpbmVkIG91dHNpZGUgdGhpcyBhcHAuICovXG5jbGFzcyBJbXBvcnRlZFdlYkZ1bmN0aW9uIGV4dGVuZHMgV2ViRnVuY3Rpb25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm46IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFdlYkZ1bmN0aW9uQXR0cmlidXRlcykge1xuICAgIGNvbnN0IGFybiA9IGltcG9ydGVkQXJuKHNjb3BlLCBpZCwgYXR0cnMpO1xuICAgIC8vIEEgdG9rZW4gQVJOIChlLmcuIGEgV2ViRnVuY3Rpb24gaW4gYW5vdGhlciBzdGFjaywgb3IgRm4uaW1wb3J0VmFsdWUpIGlzIHRha2VuIHRvIGJlIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZFxuICAgIC8vIHJlZ2lvbiwgYXMgaXRzIG1ldHJpY3MgYWxyZWFkeSBhcmU6IGEgZ3JhbnQgdG8gYSByb2xlIG9mIHRoaXMgYWNjb3VudCB0aGVuIHN0YXlzIGlkZW50aXR5LW9ubHkuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCBUb2tlbi5pc1VucmVzb2x2ZWQoYXJuKSA/IHt9IDogeyBlbnZpcm9ubWVudEZyb21Bcm46IGFybiB9KTtcbiAgICB0aGlzLndlYkZ1bmN0aW9uQXJuID0gYXJuO1xuICAgIHRoaXMud2ViRnVuY3Rpb25OYW1lID0gYXR0cnMud2ViRnVuY3Rpb25OYW1lID8/IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhO1xuICAgIGlmIChhdHRycy5lbmRwb2ludE5hbWUgIT09IHVuZGVmaW5lZCkgYXNzZXJ0UmVzb3VyY2VOYW1lKHRoaXMsICdlbmRwb2ludE5hbWUnLCBhdHRycy5lbmRwb2ludE5hbWUpO1xuICAgIHRoaXMuZW5kcG9pbnROYW1lID0gYXR0cnMuZW5kcG9pbnROYW1lO1xuICB9XG5cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gV2ViRnVuY3Rpb25HcmFudHMuX2ZvckVuZHBvaW50QXJucyhbYCR7dGhpcy53ZWJGdW5jdGlvbkFybn0vZW5kcG9pbnQvJHt0aGlzLmVuZHBvaW50TmFtZSA/PyAnKid9YF0sIHRoaXMpLmludm9rZShncmFudGVlKTtcbiAgfVxufVxuXG4vKiogV2hldGhlciBhIGtleSBpcyBtdWx0aS1SZWdpb24sIHdoZW4gdGhhdCBjYW4gYmUgdG9sZCBhdCBzeW50aGVzaXM6IGl0cyBMMSBpbiB0aGlzIGFwcCwgb3IgYW4gYG1yay1gIGtleSBJRCBpbiBpdHMgQVJOLiAqL1xuZnVuY3Rpb24gaXNNdWx0aVJlZ2lvbktleShrZXk6IGttcy5JS2V5KTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNmbiA9IGtleS5ub2RlLmRlZmF1bHRDaGlsZDtcbiAgaWYgKGNmbiBpbnN0YW5jZW9mIGttcy5DZm5LZXkpIHtcbiAgICBjb25zdCBtdWx0aVJlZ2lvbiA9IFN0YWNrLm9mKGNmbikucmVzb2x2ZShjZm4ubXVsdGlSZWdpb24pO1xuICAgIHJldHVybiB0eXBlb2YgbXVsdGlSZWdpb24gPT09ICdib29sZWFuJyA/IG11bHRpUmVnaW9uIDogbXVsdGlSZWdpb24gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoa2V5LmtleUFybikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAvOmtleVxcL21yay0vLnRlc3Qoa2V5LmtleUFybik7XG59XG5cbmZ1bmN0aW9uIGltcG9ydGVkQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gYCR7c2NvcGUubm9kZS5wYXRofS8ke2lkfWA7XG4gIGlmICgoYXR0cnMud2ViRnVuY3Rpb25Bcm4gPT09IHVuZGVmaW5lZCkgPT09IChhdHRycy53ZWJGdW5jdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cGF0aH06IGdpdmUgZWl0aGVyIHdlYkZ1bmN0aW9uQXJuIG9yIHdlYkZ1bmN0aW9uTmFtZWApO1xuICB9XG4gIGlmIChhdHRycy53ZWJGdW5jdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGF0dHJzLndlYkZ1bmN0aW9uTmFtZSkpIHtcbiAgICAgIC8vIFZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzY29wZSwgYmVmb3JlIHRoZSBpbXBvcnQgZXhpc3RzLlxuICAgICAgYXNzZXJ0UmVzb3VyY2VOYW1lKHNjb3BlLCAnd2ViRnVuY3Rpb25OYW1lJywgYXR0cnMud2ViRnVuY3Rpb25OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIFN0YWNrLm9mKHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xhbWJkYScsIHJlc291cmNlOiAnd2ViLWZ1bmN0aW9uJywgcmVzb3VyY2VOYW1lOiBhdHRycy53ZWJGdW5jdGlvbk5hbWUsIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXJuID0gYXR0cnMud2ViRnVuY3Rpb25Bcm4hO1xuICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChhcm4pICYmICEvXmFybjpbXjpdKzpsYW1iZGE6W2EtejAtOS1dKzpcXGR7MTJ9OndlYi1mdW5jdGlvblxcL1tBLVphLXowLTlfLV17MSw2NH0kLy50ZXN0KGFybikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cGF0aH06ICcke2Fybn0nIGlzIG5vdCBhIFdlYiBGdW5jdGlvbiBBUk4gKGFybjo8cGFydGl0aW9uPjpsYW1iZGE6PHJlZ2lvbj46PGFjY291bnQ+OndlYi1mdW5jdGlvbi88bmFtZT4pYCk7XG4gIH1cbiAgcmV0dXJuIGFybjtcbn1cbiJdfQ==
|
|
565
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXdMO0FBQ3hMLHVFQUF5RDtBQUN6RCx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLCtEQUFpRDtBQUNqRCwyREFBNkM7QUFFN0MsbUNBQXVFO0FBQ3ZFLHlDQUFpRDtBQUNqRCxtREFBMEQ7QUFDMUQsK0NBQWtFO0FBQ2xFLHVDQUF1RDtBQUN2RCxxRUFBMkQ7QUFDM0QscUZBQWdGO0FBQ2hGLGlFQUE2RDtBQUM3RCxxREFBcUY7QUFDckYsbUVBQW1JO0FBQ25JLCtEQUEwRDtBQUMxRCxtRUFBeUY7QUFFekYsOERBQThEO0FBQzlELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQXVSekI7O0dBRUc7QUFDSCxNQUFzQixlQUFnQixTQUFRLHNCQUFROztJQUlwRCxtRkFBbUY7SUFDbkYsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFRRDs7Ozs7OztPQU9HO0lBQ0ksbUJBQW1CLENBQUMsU0FBOEI7UUFDdkQsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHdCQUF3QixDQUFDLEtBQWdCLEVBQUUsU0FBOEI7UUFDOUUsTUFBTSxJQUFJLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsSUFBSSxtQkFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssNkJBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2Rix5QkFBVyxD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Q0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNuRixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxpREFBaUQsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQy9DLHlEQUF5RDtZQUN6RCxJQUFBLCtCQUFrQixFQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELE9BQU8sbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQy9CLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsdUJBQVMsQ0FBQyxtQkFBbUI7U0FDM0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFlLENBQUM7SUFDbEMsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0VBQXdFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEgsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksTUFBTSxHQUFHLDZGQUE2RixDQUFDLENBQUM7SUFDakksQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBBcm4sIEFybkZvcm1hdCwgdHlwZSBDZm5SZXNvdXJjZSwgRHVyYXRpb24sIHR5cGUgSVJlc291cmNlLCBMYXp5LCBOYW1lcywgUmVtb3ZhbFBvbGljeSwgUmVzb3VyY2UsIFN0YWNrLCBUb2tlbiwgVG9rZW5Db21wYXJpc29uLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uQXV0aFR5cGUsIFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkNvZGUgfSBmcm9tICcuL3ByaXZhdGUvY29kZSc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkxvZ0dyb3VwIH0gZnJvbSAnLi9wcml2YXRlL2xvZy1ncm91cCc7XG5pbXBvcnQgeyBERUZBVUxUX1BFUklPRCwgV0VCX05BTUVTUEFDRSB9IGZyb20gJy4vcHJpdmF0ZS9tZXRyaWNzJztcbmltcG9ydCB7IGFja25vd2xlZGdlSWFtRmluZGluZ3MgfSBmcm9tICcuL3ByaXZhdGUvbmFnJztcbmltcG9ydCB7IGluamVjdFByb3BzIH0gZnJvbSAnLi9wcml2YXRlL3Byb3BlcnR5LWluamVjdGlvbic7XG5pbXBvcnQgeyBSZXNvdXJjZVBvbGljeVN0YXRlbWVudHMgfSBmcm9tICcuL3ByaXZhdGUvcmVzb3VyY2UtcG9saWN5LXN0YXRlbWVudHMnO1xuaW1wb3J0IHsgUmV2aXNpb25DbGVhbnVwIH0gZnJvbSAnLi9wcml2YXRlL3JldmlzaW9uLWNsZWFudXAnO1xuaW1wb3J0IHsgQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSwgYXNzZXJ0UmVzb3VyY2VOYW1lIH0gZnJvbSAnLi9wcml2YXRlL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25FbmRwb2ludCwgdHlwZSBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucywgdHlwZSBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uUmV2aXNpb24sIHR5cGUgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKiBFbmRwb2ludHMgcGVyIGZ1bmN0aW9uIChzZXJ2aWNlIHF1b3RhLCBub3QgYWRqdXN0YWJsZSkuICovXG5jb25zdCBNQVhfRU5EUE9JTlRTID0gMTA7XG5cbi8qKlxuICogT3B0aW9ucyBzaGFyZWQgYnkgYFdlYkZ1bmN0aW9uYCBhbmQgYE5vZGVqc1dlYkZ1bmN0aW9uYDogZXZlcnl0aGluZyBleGNlcHQgaG93IHRoZSBjb2RlIGlzIHN1cHBsaWVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGUgZW5kcG9pbnQgYXJlIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRoVHlwZTogV2ViRnVuY3Rpb25BdXRoVHlwZTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZW5kcG9pbnQgKGBmbi5lbmRwb2ludGApOiB3aGVyZSBpdCBzZXJ2ZXMgZnJvbSwgaXRzIG5hbWUgYW5kIGxpbWl0cy5cbiAgICogSXQgc2VydmVzIHRoZSBjdXJyZW50IHJldmlzaW9uOyByb3V0ZSBpdCBlbHNld2hlcmUgd2l0aCBgZm4uZW5kcG9pbnQucm91dGVUcmFmZmljKClgLlxuICAgKiBBZGQgbW9yZSBlbmRwb2ludHMgd2l0aCBgYWRkRW5kcG9pbnRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmluZyB0aGUgY3VycmVudCByZXZpc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucztcblxuICAvKipcbiAgICogSG93IG1hbnkgb2YgdGhlIG5ld2VzdCByZXZpc2lvbnMgdG8ga2VlcCAoMS01MCkuIEVhY2ggZGVwbG95bWVudCB0aGF0IGNoYW5nZXMgdGhlIGNvZGUgb3JcbiAgICogY29uZmlndXJhdGlvbiBjcmVhdGVzIGEgcmV2aXNpb247IG9sZGVyIG9uZXMgc3RheSBhdmFpbGFibGUgdG8gcm9sbCBiYWNrIHRvIG9yIHJvdXRlIHRyYWZmaWMgdG8sXG4gICAqIGFuZCB0aGUgb2xkZXN0IGJleW9uZCB0aGlzIGNvdW50IGFyZSBkZWxldGVkIGFmdGVyIGVhY2ggZGVwbG95bWVudC5cbiAgICpcbiAgICogUmV2aXNpb25zIHRoYXQgYW4gZW5kcG9pbnQgcm91dGVzIHRvIGFyZSBuZXZlciBkZWxldGVkLCBhbmQgbmVpdGhlciBhcmUgdGhvc2UgdGhlIHByZXZpb3VzXG4gICAqIGRlcGxveW1lbnQgdXNlZCAoYSByb2xsYmFjayByZXR1cm5zIHRvIHRoZW0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyMFxuICAgKi9cbiAgcmVhZG9ubHkgcmV2aXNpb25SZXRlbnRpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuIFJlbmFtaW5nIGEgZnVuY3Rpb24gcmVwbGFjZXMgaXQsIGFuZCBpdHMgZW5kcG9pbnQgZ2V0cyBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSB1bmlxdWUgbmFtZSBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uc3RydWN0IHBhdGggKG1vdmluZyB0aGUgY29uc3RydWN0IGNoYW5nZXMgaXQpXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uJ3MgY29kZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZS5cbiAgICpcbiAgICogQW4gYGlhbS5JUm9sZWAgKG5vdCBgSVJvbGVSZWZgKSBiZWNhdXNlIHRoZSBmdW5jdGlvbiBhZGRzIHN0YXRlbWVudHMgdG8gaXQgYW5kIGdyYW50cyB0aHJvdWdoIGl0LlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnByZWZlci1yZWYtaW50ZXJmYWNlXVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgcm9sZSB0cnVzdGluZyBgbGFtYmRhLmFtYXpvbmF3cy5jb21gIHdpdGggYEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZWBcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIEEgY3VzdG9tZXIgbWFuYWdlZCBLTVMga2V5IGZvciB0aGUgZnVuY3Rpb24ncyByZXZpc2lvbnM6IHRoZWlyIGNvZGUgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICpcbiAgICogQSBgUEVSX1JFR0lPTmAgb3IgYE1VTFRJX1JFR0lPTmAgZW5kcG9pbnQgbmVlZHMgYSAqKm11bHRpLVJlZ2lvbiBrZXkqKiB3aXRoIGEgcmVwbGljYSBpbiBldmVyeSByZWdpb24gaXQgc2VydmVzXG4gICAqIGZyb20sIGFuZCBlYWNoIHJlcGxpY2EncyBwb2xpY3kgbXVzdCBhbGxvdyBMYW1iZGEgdG8gZGVjcnlwdCAoc2VlIGBlbmNyeXB0aW9uS2V5UG9saWN5U3RhdGVtZW50KClgKS4gQSBrZXkgZGVmaW5lZFxuICAgKiBpbiB0aGlzIGFwcCBnZXRzIHRoYXQgc3RhdGVtZW50IGFkZGVkIHRvIGl0cyBvd24gcG9saWN5LlxuICAgKlxuICAgKiBDaGFuZ2luZyB0aGUga2V5IGNyZWF0ZXMgYSBuZXcgcmV2aXNpb24uIEVhcmxpZXIgcmV2aXNpb25zLCBpbmNsdWRpbmcgdGhlIG9uZXMga2VwdCBhcyByb2xsYmFjayB0YXJnZXRzLCBzdGlsbFxuICAgKiBuZWVkIHRoZWlyIGtleS5cbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbiBBV1Mgb3duZWQga2V5XG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcy4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogSG93IGxvbmcgYSBzaW5nbGUgcmVxdWVzdCBtYXkgcnVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSByZXF1ZXN0cyBvbmUgZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZXMgYXQgdGhlIHNhbWUgdGltZSAoMS0xMjgpLlxuICAgKiBSZXF1ZXN0cyBzaGFyZSBtb2R1bGUtbGV2ZWwgc3RhdGUsIHNvIGhhbmRsZXJzIG11c3QgYmUgY29uY3VycmVuY3ktc2FmZS5cbiAgICpcbiAgICogQGRlZmF1bHQgNjRcbiAgICovXG4gIHJlYWRvbmx5IG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldGVudGlvbiBmb3IgZXZlcnkgbG9nIGdyb3VwIG9mIHRoZSBmdW5jdGlvbiwgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRIXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFdoYXQgaGFwcGVucyB0byB0aGUgbG9nIGdyb3VwcyB3aGVuIHRoZSBmdW5jdGlvbiBpcyByZW1vdmVkOiBSRVRBSU4gb3IgREVTVFJPWS5cbiAgICogV2l0aCBERVNUUk9ZLCBkZWxldGlvbiB3YWl0cyBhYm91dCBhIG1pbnV0ZSBmb3IgZW52aXJvbm1lbnRzIHRvIGZsdXNoIHRoZWlyIGxhc3QgbGluZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuUkVUQUlOXG4gICAqL1xuICByZWFkb25seSBsb2dSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogQSBjdXN0b21lciBtYW5hZ2VkIEtNUyBrZXkgZm9yIHRoZSBmdW5jdGlvbidzIGxvZyBncm91cHMsIGluIGV2ZXJ5IHJlZ2lvbiBpdCBzZXJ2ZXMgZnJvbS5cbiAgICpcbiAgICogQ2xvdWRXYXRjaCBMb2dzIG5lZWRzIGEga2V5IGluIGVhY2ggZ3JvdXAncyByZWdpb246IGZvciByZWdpb25zIG90aGVyIHRoYW4gdGhlIGtleSdzIG93biwgdGhlIGNvbnN0cnVjdCB1c2VzIHRoZVxuICAgKiByZXBsaWNhIG9mIGEgKiptdWx0aS1SZWdpb24ga2V5KiogdGhlcmUgKHRoZSBzYW1lIGtleSBJRCkuIEVhY2gga2V5J3MgcG9saWN5IG11c3QgYWxsb3cgQ2xvdWRXYXRjaCBMb2dzIGluIGl0c1xuICAgKiByZWdpb24gKHNlZSBgbG9nRW5jcnlwdGlvbktleVBvbGljeVN0YXRlbWVudCgpYCkuIEEga2V5IGRlZmluZWQgaW4gdGhpcyBhcHAgZ2V0cyB0aGF0IHN0YXRlbWVudCBmb3IgaXRzIG93biByZWdpb24uXG4gICAqXG4gICAqIFJlbW92aW5nIHRoZSBrZXkgZGVjcnlwdHMgbm90aGluZzogdGhlIGdyb3VwcyBrZWVwIHRoZWlyIGV4aXN0aW5nIGV2ZW50cyBlbmNyeXB0ZWQgd2l0aCBpdC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBDbG91ZFdhdGNoIExvZ3MnIG93biBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBsb2dFbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIGFwcGxpY2F0aW9uIGxvZ3MgdG8ga2VlcC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbFYyPzogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIHBsYXRmb3JtIGxvZ3MgdG8ga2VlcCAoREVCVUcsIElORk8gb3IgV0FSTikuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBzeXN0ZW1Mb2dMZXZlbFYyPzogbGFtYmRhLlN5c3RlbUxvZ0xldmVsO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGEgYFdlYkZ1bmN0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblByb3BzIGV4dGVuZHMgV2ViRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBOb2RlLmpzIHJ1bnRpbWUsIGUuZy4gYGxhbWJkYS5SdW50aW1lLk5PREVKU18yNF9YYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgY29kZTogYSB6aXAgaW4gUzMgKGBDb2RlLmZyb21Bc3NldGAsIGBDb2RlLmZyb21CdWNrZXRgLCBgQ29kZS5mcm9tQ3VzdG9tQ29tbWFuZGAsIGBDb2RlLmZyb21Eb2NrZXJCdWlsZGApLlxuICAgKiBJbmxpbmUgY29kZSBhbmQgY29udGFpbmVyIGltYWdlcyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBUaGUgY29kZSBpcyBjb3BpZWQgaW50byB0aGUgc3RhY2sncyBjb2RlIGJ1Y2tldCwgd2hpY2ggTGFtYmRhIFdlYiBGdW5jdGlvbnMgY2FuIHJlYWQuXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBsYW1iZGEuQ29kZTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdGhhdCBzdGFydHMgeW91ciBzZXJ2ZXIsIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5kZXguanMnXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQSBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBjcmVhdGVkIGluIHRoaXMgYXBwIChgV2ViRnVuY3Rpb25gKSBvciBpbXBvcnRlZCAoYFdlYkZ1bmN0aW9uLmZyb21XZWJGdW5jdGlvbkFybmApLlxuICpcbiAqIGBhZGRUb1Jlc291cmNlUG9saWN5YCBhZGRzIHRvIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeSAod2hvIGVsc2UgbWF5IGNhbGwgb3IgbWFuYWdlIGl0KS4gRWFjaCBzdGFjayB3cml0ZXNcbiAqIG9ubHkgaXRzIG93biBzdGF0ZW1lbnRzIGludG8gdGhlIGZ1bmN0aW9uJ3Mgc2luZ2xlIHBvbGljeSwgc28gYW55IHN0YWNrIGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQgY2FuIGFkZCB0aGVtLFxuICogaW5jbHVkaW5nIG9uZSB0aGF0IGltcG9ydHMgdGhlIGZ1bmN0aW9uLiBGcm9tIGFub3RoZXIgYWNjb3VudCwgbm90aGluZyBpcyBhZGRlZCAoYHN0YXRlbWVudEFkZGVkOiBmYWxzZWApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElXZWJGdW5jdGlvbiBleHRlbmRzIElSZXNvdXJjZSwgbGFtYmRhLklXZWJGdW5jdGlvblJlZiwgaWFtLklSZXNvdXJjZVdpdGhQb2xpY3kge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgbmFtZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIEFSTi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm46IHN0cmluZztcblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBmdW5jdGlvbidzIGVuZHBvaW50IChgbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnRgKTogdGhlIGRlZmF1bHQgZW5kcG9pbnRcbiAgICogb2YgYSBgV2ViRnVuY3Rpb25gOyBmb3IgYW4gaW1wb3J0ZWQgZnVuY3Rpb24sIHRoZSBlbmRwb2ludCBuYW1lZCBpbiBpdHMgYXR0cmlidXRlcywgb3IgZXZlcnkgZW5kcG9pbnQuXG4gICAqXG4gICAqIEEgZ3JhbnRlZSBpbiB0aGUgZnVuY3Rpb24ncyBhY2NvdW50IGdldHMgYW4gSUFNIHBvbGljeSBzdGF0ZW1lbnQ7IGFub3RoZXIgYWNjb3VudCBvciBhbiBBV1Mgc2VydmljZSBhbHNvIGdldHMgYVxuICAgKiBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5IChub3Qgd2hlbiB0aGUgZnVuY3Rpb24gaXRzZWxmIGlzIGluIGFub3RoZXIgYWNjb3VudCB0aGFuIHRoaXMgc3RhY2spLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBIG1ldHJpYyBvZiB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCkuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xuXG4gIC8qKiBUaW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHdlcmUgYWN0aXZlIChgRW52aXJvbm1lbnRBY3RpdmVUaW1lYCkuICovXG4gIG1ldHJpY0FjdGl2ZVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogQ1BVIHRpbWUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdXNlZCAoYEVudmlyb25tZW50Q1BVVGltZWApLiAqL1xuICBtZXRyaWNDcHVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIFJlcXVlc3RzIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVkIGF0IG9uY2UgKGBFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0c2AsIG1heGltdW0pLiAqL1xuICBtZXRyaWNDb25jdXJyZW50UmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogUGVhayBtZW1vcnkgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IHVzZWQgKGBFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlYCwgbWF4aW11bSkuICovXG4gIG1ldHJpY01heE1lbW9yeVVzYWdlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIEJ5dGVzIHNlbnQgaW4gcmVzcG9uc2VzIChgUmVzcG9uc2VCeXRlc2ApLiAqL1xuICBtZXRyaWNSZXNwb25zZUJ5dGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG59XG5cbi8qKlxuICogQXR0cmlidXRlcyBvZiBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24uIEdpdmUgaXRzIEFSTiBvciBpdHMgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLCBlLmcuIGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTExMTIyMjIzMzMzOndlYi1mdW5jdGlvbi9vcmRlcnNgLiBJdCBtYXkgYmUgaW4gYW5vdGhlclxuICAgKiByZWdpb24gb3IgYWNjb3VudDsgYWNyb3NzIGFjY291bnRzLCBgZ3JhbnRJbnZva2VgIGFsc28gbmVlZHMgdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5IHRvIGFsbG93IHRoZSBjYWxsZXIuXG4gICAqIEEgdG9rZW4gKGUuZy4gZnJvbSBhbm90aGVyIHN0YWNrKSBpcyB0YWtlbiB0byBiZSBpbiB0aGlzIHN0YWNrJ3MgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJ1aWx0IGZyb20gYHdlYkZ1bmN0aW9uTmFtZWAsIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZCByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRha2VuIGZyb20gYHdlYkZ1bmN0aW9uQXJuYFxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQgYGdyYW50SW52b2tlYCBhbGxvd3MgY2FsbGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBldmVyeSBlbmRwb2ludCBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJtaXNzaW9uIGZvciBhIHByaW5jaXBhbCBvdXRzaWRlIHRoaXMgYWNjb3VudCwgYW4gQVdTIHNlcnZpY2Ugb3IgYW4gb3JnYW5pemF0aW9uIHRvIGNhbGwgYSBmdW5jdGlvbidzIGVuZHBvaW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblBlcm1pc3Npb24ge1xuICAvKipcbiAgICogV2hvIG1heSBjYWxsOiBhbiBhY2NvdW50IChgaWFtLkFjY291bnRQcmluY2lwYWxgKSwgYSByb2xlIG9yIHVzZXIgKGBpYW0uQXJuUHJpbmNpcGFsYCksIGFuIEFXUyBzZXJ2aWNlXG4gICAqIChgaWFtLlNlcnZpY2VQcmluY2lwYWxgLCB3aXRoIGBzb3VyY2VBcm5gIG9yIGBzb3VyY2VBY2NvdW50YCkgb3IgYW4gb3JnYW5pemF0aW9uIChgaWFtLk9yZ2FuaXphdGlvblByaW5jaXBhbGApLlxuICAgKlxuICAgKiBBIHByaW5jaXBhbCBpbiBhbm90aGVyIGFjY291bnQgYWxzbyBuZWVkcyBgbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnRgIGluIGl0cyBvd24gSUFNIHBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCB0aGUgcHJpbmNpcGFsIG1heSBjYWxsLiBJdCBtdXN0IGJlbG9uZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGV2ZXJ5IGVuZHBvaW50IG9mIHRoZSBmdW5jdGlvbiwgaW5jbHVkaW5nIG9uZXMgYWRkZWQgbGF0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50PzogV2ViRnVuY3Rpb25FbmRwb2ludDtcblxuICAvKipcbiAgICogRm9yIGFuIEFXUyBzZXJ2aWNlOiB0aGUgQVJOIG9mIHRoZSByZXNvdXJjZSBjYWxsaW5nIG9uIGl0cyBiZWhhbGYgKGNvbmRpdGlvbiBgYXdzOlNvdXJjZUFybmAsIGBBcm5MaWtlYCksXG4gICAqIGUuZy4gYSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi4gV2l0aG91dCBpdCBvciBgc291cmNlQWNjb3VudGAsIGFueSBhY2NvdW50J3MgdXNlIG9mIHRoZSBzZXJ2aWNlIGNvdWxkIGNhbGwgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbmRpdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb3IgYW4gQVdTIHNlcnZpY2U6IHRoZSBhY2NvdW50IHRoYXQgb3ducyB0aGUgcmVzb3VyY2UgY2FsbGluZyBvbiBpdHMgYmVoYWxmIChjb25kaXRpb24gYGF3czpTb3VyY2VBY2NvdW50YCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29uZGl0aW9uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VBY2NvdW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgYFdlYkZ1bmN0aW9uYCBhbmQgaW1wb3J0ZWQgZnVuY3Rpb25zIGhhdmUgaW4gY29tbW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2ViRnVuY3Rpb25CYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJV2ViRnVuY3Rpb24ge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKiBBIHJlZmVyZW5jZSB0byB0aGlzIGZ1bmN0aW9uLCBmb3IgQVBJcyB0aGF0IGFjY2VwdCBgbGFtYmRhLklXZWJGdW5jdGlvblJlZmAuICovXG4gIHB1YmxpYyBnZXQgd2ViRnVuY3Rpb25SZWYoKTogbGFtYmRhLldlYkZ1bmN0aW9uUmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbkFybiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZnVuY3Rpb24ncyBlbmRwb2ludC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5LCBlLmcuIHRvIGxldCBhbm90aGVyIGFjY291bnQgbWFuYWdlIHRoZSBmdW5jdGlvbi5cbiAgICogRm9yIGludm9raW5nLCBwcmVmZXIgYGFkZFBlcm1pc3Npb25gIG9yIGBncmFudEludm9rZWAuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYXMgYSBzaW5nbGUgcmVzb3VyY2UgcG9saWN5LiBFYWNoIHN0YWNrIHdyaXRlcyBvbmx5IGl0cyBvd24gc3RhdGVtZW50cyBpbnRvIGl0LCB0aHJvdWdoIGEgY3VzdG9tXG4gICAqIHJlc291cmNlIHRoYXQgbWVyZ2VzIHRoZW0gd2l0aCBldmVyeSBvdGhlciBzdGFjaydzLCBhbmQgd2l0aCBzdGF0ZW1lbnRzIGFkZGVkIG91dHNpZGUgQ2xvdWRGb3JtYXRpb24uIEZyb20gYVxuICAgKiBzdGFjayBpbiBhbm90aGVyIGFjY291bnQgdGhhbiB0aGUgZnVuY3Rpb24sIG5vdGhpbmcgaXMgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFRvUmVzb3VyY2VQb2xpY3lGcm9tKHRoaXMsIHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kgZnJvbSBgc2NvcGVgJ3Mgc3RhY2ssIGUuZy4gdGhlIHN0YWNrIG9mIGEgQ2xvdWRGcm9udFxuICAgKiBkaXN0cmlidXRpb24gdGhhdCB1c2VzIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FkZFRvUmVzb3VyY2VQb2xpY3lGcm9tKHNjb3BlOiBDb25zdHJ1Y3QsIHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICBjb25zdCBmcm9tID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIGlmIChUb2tlbi5jb21wYXJlU3RyaW5ncyhmcm9tLmFjY291bnQsIHRoaXMuZW52LmFjY291bnQpID09PSBUb2tlbkNvbXBhcmlzb24uRElGRkVSRU5UKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpyZXNvdXJjZVBvbGljeUZyb21PdGhlckFjY291bnQnLFxuICAgICAgICBgQSBzdGF0ZW1lbnQgZm9yIHRoZSByZXNvdXJjZSBwb2xpY3kgb2YgYSBmdW5jdGlvbiBpbiBhY2NvdW50ICR7dGhpcy5lbnYuYWNjb3VudH0gd2FzIG5vdCBhZGRlZDogc3RhY2sgJHtmcm9tLnN0YWNrTmFtZX0gaXMgaW4gYWNjb3VudCAke2Zyb20uYWNjb3VudH0uIEFkZCBpdCBpbiB0aGUgZnVuY3Rpb24ncyBhY2NvdW50LmApO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGNvbnN0IHdyaXRlciA9IFJlc291cmNlUG9saWN5U3RhdGVtZW50cy5vZihzY29wZSwgdGhpcywgdGhpcy53ZWJGdW5jdGlvbkFybik7XG4gICAgd3JpdGVyLmFkZChzdGF0ZW1lbnQpO1xuICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiB0cnVlLCBwb2xpY3lEZXBlbmRhYmxlOiB3cml0ZXIucmVzb3VyY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIG1ldHJpYyBvZiB0aGlzIGZ1bmN0aW9uJ3MgZXhlY3V0aW9uIGVudmlyb25tZW50cyBpbiBgQVdTL0xhbWJkYS9XZWJgIChkaW1lbnNpb24gYEZ1bmN0aW9uTmFtZWApLCBhY3Jvc3MgYWxsIGVuZHBvaW50cy5cbiAgICogRm9yIHJlcXVlc3QgYW5kIGVycm9yIGNvdW50cywgdXNlIHRoZSBlbmRwb2ludCdzIG1ldHJpY3MgKGBmbi5lbmRwb2ludC5tZXRyaWNSZXF1ZXN0cygpYCkuXG4gICAqXG4gICAqIE1ldHJpY3MgYXJlIHB1Ymxpc2hlZCBpbiB0aGUgcmVnaW9uIHRoYXQgc2VydmVkIHRoZSByZXF1ZXN0OiBwYXNzIGByZWdpb25gIGZvciBhbm90aGVyIHNlcnZpbmcgcmVnaW9uLlxuICAgKiBBbiBhbGFybSBjYW4gb25seSB1c2UgbWV0cmljcyBmcm9tIGl0cyBvd24gc3RhY2sncyByZWdpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgMSBtaW51dGUsIGluIHRoZSBmdW5jdGlvbidzIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgLy8gQW4gaW1wb3J0ZWQgZnVuY3Rpb24gaW4gYW5vdGhlciByZWdpb24gcHVibGlzaGVzIGl0cyBtZXRyaWNzIHRoZXJlLlxuICAgIGNvbnN0IHJlZ2lvbiA9ICFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5lbnYucmVnaW9uKSAmJiB0aGlzLmVudi5yZWdpb24gIT09IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbiA/IHRoaXMuZW52LnJlZ2lvbiA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogV0VCX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7IEZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbk5hbWUgfSxcbiAgICAgIHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5TVU0sXG4gICAgICBwZXJpb2Q6IERFRkFVTFRfUEVSSU9ELFxuICAgICAgcmVnaW9uLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogVGltZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50cyB3ZXJlIGFjdGl2ZSAoYEVudmlyb25tZW50QWN0aXZlVGltZWApLiAqL1xuICBwdWJsaWMgbWV0cmljQWN0aXZlVGltZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50QWN0aXZlVGltZScsIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBDUFUgdGltZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50cyB1c2VkIChgRW52aXJvbm1lbnRDUFVUaW1lYCkuICovXG4gIHB1YmxpYyBtZXRyaWNDcHVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRDUFVUaW1lJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVkIGF0IG9uY2UgKGBFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0c2ApLCB0byBjb21wYXJlIHdpdGhcbiAgICogYG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1heGltdW0gb3ZlciAxIG1pbnV0ZVxuICAgKi9cbiAgcHVibGljIG1ldHJpY0NvbmN1cnJlbnRSZXF1ZXN0cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50Q29uY3VycmVudFJlcXVlc3RzJywgeyBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuTUFYSU1VTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVhayBtZW1vcnkgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IHVzZWQgKGBFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlYCk7IGVhY2ggZW52aXJvbm1lbnQgaGFzIDIgR0IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbWF4aW11bSBvdmVyIDEgbWludXRlXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTWF4TWVtb3J5VXNhZ2UocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlJywgeyBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuTUFYSU1VTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKiogQnl0ZXMgc2VudCBpbiByZXNwb25zZXMgKGBSZXNwb25zZUJ5dGVzYCkuICovXG4gIHB1YmxpYyBtZXRyaWNSZXNwb25zZUJ5dGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnUmVzcG9uc2VCeXRlcycsIHByb3BzKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgTm9kZS5qcyBIVFRQIHNlcnZlciBydW5uaW5nIGFzIGFuIEFXUyBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBzZXJ2ZWQgZnJvbSBvbmUgb3IgbW9yZSByZWdpb25zLlxuICpcbiAqIENyZWF0ZXMgdGhlIGZ1bmN0aW9uLCBpdHMgY3VycmVudCByZXZpc2lvbiAoY29kZSBhbmQgY29uZmlndXJhdGlvbjsgYW55IGNoYW5nZSBjcmVhdGVzIGEgbmV3IG9uZSxcbiAqIGFuZCB0aGUgbmV3ZXN0IGByZXZpc2lvblJldGVudGlvbmAgYXJlIGtlcHQpLCBhIGRlZmF1bHQgSFRUUFMgZW5kcG9pbnQsIGFuIGV4ZWN1dGlvbiByb2xlLCBhbmQgb3duc1xuICogdGhlIGZ1bmN0aW9uJ3MgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24gaXRzIGVuZHBvaW50cyBzZXJ2ZSBmcm9tLlxuICpcbiAqIFVzZSBgZnJvbVdlYkZ1bmN0aW9uQXJuYCwgYGZyb21XZWJGdW5jdGlvbk5hbWVgIG9yIGBmcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzYCBmb3IgYSBmdW5jdGlvbiBkZWZpbmVkIGVsc2V3aGVyZS5cbiAqXG4gKiBAcmVzb3VyY2UgQVdTOjpMYW1iZGE6OldlYkZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJGdW5jdGlvbiBleHRlbmRzIFdlYkZ1bmN0aW9uQmFzZSBpbXBsZW1lbnRzIGlhbS5JR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXMgdGhpcyBjbGFzcyB0byBwcm9wZXJ0eSBpbmplY3RvcnMgKGBQcm9wZXJ0eUluamVjdG9ycy5vZihzY29wZSkuYWRkKC4uLilgKSwgd2hpY2ggY2FuIHNldCBkZWZhdWx0IHByb3BzIGZvclxuICAgKiBldmVyeSBgV2ViRnVuY3Rpb25gIHVuZGVyIGEgc2NvcGUuIEluamVjdG9ycyBmb3IgYFdlYkZ1bmN0aW9uYCBhbHNvIGFwcGx5IHRvIGBOb2RlanNXZWJGdW5jdGlvbmAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhc2hpc2hwYW5kZXlvbmUvY2RrLWxhbWJkYS13ZWItZnVuY3Rpb24uV2ViRnVuY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4aXN0aW5nIFdlYiBGdW5jdGlvbiBieSBpdHMgQVJOIChpbiBhbnkgcmVnaW9uIG9yIGFjY291bnQpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tV2ViRnVuY3Rpb25Bcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgd2ViRnVuY3Rpb25Bcm46IHN0cmluZyk6IElXZWJGdW5jdGlvbiB7XG4gICAgcmV0dXJuIFdlYkZ1bmN0aW9uLmZyb21XZWJGdW5jdGlvbkF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IHdlYkZ1bmN0aW9uQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXhpc3RpbmcgV2ViIEZ1bmN0aW9uIGluIHRoaXMgc3RhY2sncyBhY2NvdW50IGFuZCByZWdpb24gYnkgaXRzIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21XZWJGdW5jdGlvbk5hbWUoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmcpOiBJV2ViRnVuY3Rpb24ge1xuICAgIHJldHVybiBXZWJGdW5jdGlvbi5mcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB3ZWJGdW5jdGlvbk5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb246IGdpdmUgaXRzIEFSTiBvciBpdHMgbmFtZSwgYW5kIG9wdGlvbmFsbHkgdGhlIGVuZHBvaW50IGBncmFudEludm9rZWAgYWxsb3dzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMpOiBJV2ViRnVuY3Rpb24ge1xuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRXZWJGdW5jdGlvbihzY29wZSwgaWQsIGF0dHJzKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBJRCBvZiB0aGUgY3VycmVudCByZXZpc2lvbi4gU2FtZSBhcyBgY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWRgLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmV2aXNpb25JZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgcmV2aXNpb24gYnVpbHQgZnJvbSB0aGUgY3VycmVudCBjb2RlIGFuZCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudFJldmlzaW9uOiBJV2ViRnVuY3Rpb25SZXZpc2lvbjtcblxuICAvKiogVGhlIGRlZmF1bHQgZW5kcG9pbnQuIEFkZCBtb3JlIHdpdGggYGFkZEVuZHBvaW50YC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50OiBXZWJGdW5jdGlvbkVuZHBvaW50O1xuXG4gIC8qKiBHcmFudHMgb24gdGhlIGRlZmF1bHQgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiBPdGhlciBlbmRwb2ludHMgaGF2ZSB0aGVpciBvd24gYGdyYW50c2AuICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudHM6IFdlYkZ1bmN0aW9uR3JhbnRzO1xuXG4gIC8qKiBUaGUgZXhlY3V0aW9uIHJvbGUuICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG5cbiAgLyoqIFRoZSBjdXN0b21lciBtYW5hZ2VkIGtleSBvZiB0aGUgZnVuY3Rpb24ncyByZXZpc2lvbnMsIGlmIGFueS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKiogVGhlIGN1c3RvbWVyIG1hbmFnZWQga2V5IG9mIHRoZSBmdW5jdGlvbidzIGxvZyBncm91cHMsIGlmIGFueS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ0VuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKiogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0byAodGhlIGV4ZWN1dGlvbiByb2xlKS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIGhvbWUtcmVnaW9uIGxvZyBncm91cCB0aGF0IHJlY2VpdmVzIHRoZSBsb2dzIG9mIGV2ZXJ5IHJlZ2lvbiB0aGUgZnVuY3Rpb24gc2VydmVzIGZyb20uXG4gICAqIFN1YnNjcmliZSB0byB0aGlzIG9uZSBvbmx5OiBlYWNoIHJlZ2lvbidzIGAubG9jYWxgIGdyb3VwIGhvbGRzIGEgY29weSBvZiB0aGUgc2FtZSBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuSUxvZ0dyb3VwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbW90ZUxvZ0dyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBXZWJGdW5jdGlvbkxvZ0dyb3VwPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ09wdGlvbnM6IFBpY2s8V2ViRnVuY3Rpb25Qcm9wcywgJ2xvZ1JldGVudGlvbicgfCAnbG9nUmVtb3ZhbFBvbGljeScgfCAnbG9nRW5jcnlwdGlvbktleSc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV2aXNpb25DbGVhbnVwOiBSZXZpc2lvbkNsZWFudXA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWlzc2lvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBwcm9wcyA9IGluamVjdFByb3BzKFdlYkZ1bmN0aW9uLlBST1BFUlRZX0lOSkVDVElPTl9JRCwgcHJvcHMsIHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMucnVudGltZS5mYW1pbHkgIT09IGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogTGFtYmRhIFdlYiBGdW5jdGlvbnMgcnVuIE5vZGUuanMgb25seSwgZ290ICR7cHJvcHMucnVudGltZS5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0ID0gcHJvcHMudGltZW91dD8udG9TZWNvbmRzKCkgPz8gMzA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGltZW91dCkgJiYgKHRpbWVvdXQgPCAzIHx8IHRpbWVvdXQgPiA5MDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAzIHNlY29uZHMgYW5kIDE1IG1pbnV0ZXMsIGdvdCAke3RpbWVvdXR9c2ApO1xuICAgIH1cbiAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHByb3BzLm1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ7XG4gICAgY29uc3QgdmFsaWRDb25jdXJyZW5jeSA9IChuOiBudW1iZXIpID0+IE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAxICYmIG4gPD0gMTI4O1xuICAgIGlmIChtYXhDb25jdXJyZW5jeSAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQobWF4Q29uY3VycmVuY3kpICYmICF2YWxpZENvbmN1cnJlbmN5KG1heENvbmN1cnJlbmN5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDEyOCwgZ290ICR7bWF4Q29uY3VycmVuY3l9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJldmlzaW9uUmV0ZW50aW9uID0gcHJvcHMucmV2aXNpb25SZXRlbnRpb24gPz8gMjA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocmV2aXNpb25SZXRlbnRpb24pICYmICghTnVtYmVyLmlzSW50ZWdlcihyZXZpc2lvblJldGVudGlvbikgfHwgcmV2aXNpb25SZXRlbnRpb24gPCAxIHx8IHJldmlzaW9uUmV0ZW50aW9uID4gNTApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZXZpc2lvblJldGVudGlvbiBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDUwLCBnb3QgJHtyZXZpc2lvblJldGVudGlvbn1gKTtcbiAgICB9XG4gICAgY29uc3Qgc3lzdGVtTG9nTGV2ZWxzID0gW2xhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5ERUJVRywgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk8sIGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5XQVJOXTtcbiAgICBpZiAocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMiAhPT0gdW5kZWZpbmVkICYmICFzeXN0ZW1Mb2dMZXZlbHMuaW5jbHVkZXMocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHN5c3RlbUxvZ0xldmVsVjIgbXVzdCBiZSBERUJVRywgSU5GTyBvciBXQVJOIGZvciBMYW1iZGEgV2ViIEZ1bmN0aW9uc2ApO1xuICAgIH1cblxuICAgIHRoaXMud2ViRnVuY3Rpb25OYW1lID0gcHJvcHMud2ViRnVuY3Rpb25OYW1lID8/IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQsIHNlcGFyYXRvcjogJy0nIH0pO1xuICAgIGFzc2VydFJlc291cmNlTmFtZSh0aGlzLCAnd2ViRnVuY3Rpb25OYW1lJywgdGhpcy53ZWJGdW5jdGlvbk5hbWUpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMuZW52aXJvbm1lbnQgPz8ge30pKSB7XG4gICAgICB0aGlzLmFkZEVudmlyb25tZW50KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZW50cnlwb2ludCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVudmlyb25tZW50LkFXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQgPSBwcm9wcy5lbnRyeXBvaW50O1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ0dyb3VwTmFtZSA9IGAvYXdzL2xhbWJkYS93ZWIvJHt0aGlzLndlYkZ1bmN0aW9uTmFtZX1gO1xuICAgIHRoaXMucm9sZSA9IHByb3BzLnJvbGUgPz8gdGhpcy5jcmVhdGVSb2xlKGxvZ0dyb3VwTmFtZSk7XG4gICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMucm9sZTtcblxuICAgIC8vIExvZyBncm91cHMgZmlyc3Q6IHRoZSBzZXJ2aWNlIHdvdWxkIG90aGVyd2lzZSBjcmVhdGUgdGhlbSB3aXRob3V0IHJldGVudGlvbi5cbiAgICB0aGlzLmxvZ0dyb3VwTmFtZSA9IGxvZ0dyb3VwTmFtZTtcbiAgICB0aGlzLmxvZ09wdGlvbnMgPSB7IGxvZ1JldGVudGlvbjogcHJvcHMubG9nUmV0ZW50aW9uLCBsb2dSZW1vdmFsUG9saWN5OiBwcm9wcy5sb2dSZW1vdmFsUG9saWN5LCBsb2dFbmNyeXB0aW9uS2V5OiBwcm9wcy5sb2dFbmNyeXB0aW9uS2V5IH07XG4gICAgdGhpcy5sb2dFbmNyeXB0aW9uS2V5ID0gcHJvcHMubG9nRW5jcnlwdGlvbktleTtcbiAgICBpZiAodGhpcy5sb2dFbmNyeXB0aW9uS2V5KSB7XG4gICAgICAvLyBPbmx5IGEga2V5IGRlZmluZWQgaW4gdGhpcyBhcHAgdGFrZXMgdGhlIHN0YXRlbWVudCwgZm9yIHRoZSByZWdpb24gaXQncyBpbi5cbiAgICAgIHRoaXMubG9nRW5jcnlwdGlvbktleS5hZGRUb1Jlc291cmNlUG9saWN5KHRoaXMubG9nRW5jcnlwdGlvbktleVBvbGljeVN0YXRlbWVudCh0aGlzLmxvZ0VuY3J5cHRpb25LZXkuZW52LnJlZ2lvbikpO1xuICAgICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oeyB2YWxpZGF0ZTogKCkgPT4gdGhpcy52YWxpZGF0ZUxvZ0VuY3J5cHRpb25LZXkoKSB9KTtcbiAgICB9XG4gICAgY29uc3QgbG9nR3JvdXBzID0gdGhpcy5jcmVhdGVMb2dHcm91cHMobG9nR3JvdXBOYW1lKTtcbiAgICB0aGlzLmxvZ0dyb3VwID0gbG9ncy5Mb2dHcm91cC5mcm9tTG9nR3JvdXBOYW1lKHRoaXMsICdMb2dHcm91cCcsIGxvZ0dyb3VwTmFtZSk7XG5cbiAgICBjb25zdCBjb2RlID0gbmV3IFdlYkZ1bmN0aW9uQ29kZSh0aGlzLCAnQ29kZScsIHByb3BzLmNvZGUpLmxvY2F0aW9uO1xuXG4gICAgY29uc3QgZm4gPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uKHRoaXMsICdSZXNvdXJjZScsIHsgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSB9KTtcbiAgICAvLyBUaGUgZnVuY3Rpb24gaXMgZGVsZXRlZCBiZWZvcmUgaXRzIGxvZyBncm91cHMsIHdoaWNoIHRoZW4gd2FpdCBmb3IgbGF0ZSBmbHVzaGVzLlxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgbG9nR3JvdXBzKSBmbi5ub2RlLmFkZERlcGVuZGVuY3koZ3JvdXAucmVzb3VyY2UpO1xuICAgIFZhbGlkYXRpb25zLm9mKGZuKS5hY2tub3dsZWRnZShDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFKTtcbiAgICB0aGlzLnJlc291cmNlID0gZm47XG4gICAgdGhpcy53ZWJGdW5jdGlvbkFybiA9IGZuLmF0dHJGdW5jdGlvbkFybjtcblxuICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IHByb3BzLmVuY3J5cHRpb25LZXk7XG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSkge1xuICAgICAgLy8gT25seSBhIGtleSBkZWZpbmVkIGluIHRoaXMgYXBwIHRha2VzIHRoZSBzdGF0ZW1lbnQgKGFuIGltcG9ydGVkIGtleSdzIHBvbGljeSBpcyBtYW5hZ2VkIGVsc2V3aGVyZSkuXG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuYWRkVG9SZXNvdXJjZVBvbGljeSh0aGlzLmVuY3J5cHRpb25LZXlQb2xpY3lTdGF0ZW1lbnQoKSk7XG4gICAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbih7IHZhbGlkYXRlOiAoKSA9PiB0aGlzLnZhbGlkYXRlRW5jcnlwdGlvbktleSgpIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJldmlzaW9uID0gbmV3IGxhbWJkYS5DZm5XZWJGdW5jdGlvblJldmlzaW9uKHRoaXMsICdSZXZpc2lvbicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogZm4uYXR0ckZ1bmN0aW9uQXJuLFxuICAgICAga21zS2V5QXJuOiB0aGlzLmVuY3J5cHRpb25LZXk/LmtleUFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGJ1aWxkQ29uZmlnOiB7XG4gICAgICAgIGNvZGVDb25maWc6IHsgczNPYmplY3Q6IHsgYnVja2V0OiBjb2RlLmJ1Y2tldE5hbWUsIGtleTogY29kZS5vYmplY3RLZXksIHZlcnNpb25JZDogY29kZS5vYmplY3RWZXJzaW9uIH0gfSxcbiAgICAgICAgcnVudGltZUNvbmZpZzogeyBydW50aW1lOiBwcm9wcy5ydW50aW1lLm5hbWUgfSxcbiAgICAgIH0sXG4gICAgICBzZXJ2aWNlQ29uZmlnOiB7XG4gICAgICAgIGV4ZWN1dGlvblJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiAoT2JqZWN0LmtleXModGhpcy5lbnZpcm9ubWVudCkubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5lbnZpcm9ubWVudCB9IDogdW5kZWZpbmVkKSB9KSxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHRpbWVvdXQsXG4gICAgICAgIG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ6IG1heENvbmN1cnJlbmN5LFxuICAgICAgICB0ZWxlbWV0cnlDb25maWc6IHtcbiAgICAgICAgICBsb2dnaW5nQ29uZmlnOiB7XG4gICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXBOYW1lLFxuICAgICAgICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogcHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbFYyLFxuICAgICAgICAgICAgc3lzdGVtTG9nTGV2ZWw6IHByb3BzLnN5c3RlbUxvZ0xldmVsVjIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJvbGUncyBwb2xpY2llcywgc28gdGhlIGZpcnN0IGVudmlyb25tZW50IHN0YXJ0cyB3aXRoIGl0cyBwZXJtaXNzaW9ucy5cbiAgICByZXZpc2lvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXZpc2lvbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgLy8gUmVwbGFjZWQgcmV2aXNpb25zIHN0YXkgYXMgcm9sbGJhY2sgdGFyZ2V0czsgUmV2aXNpb25DbGVhbnVwIGRlbGV0ZXMgdGhlIG9sZGVzdC4gRGVsZXRpbmcgdGhlIGZ1bmN0aW9uIGRlbGV0ZXMgdGhlbSBhbGwuXG4gICAgcmV2aXNpb24uYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB0aGlzLnJldmlzaW9uSWQgPSByZXZpc2lvbi5hdHRyUmV2aXNpb25JZDtcbiAgICB0aGlzLmN1cnJlbnRSZXZpc2lvbiA9IFdlYkZ1bmN0aW9uUmV2aXNpb24uX2N1cnJlbnQodGhpcywgJ0N1cnJlbnRSZXZpc2lvbicsIHRoaXMsIHJldmlzaW9uLmF0dHJSZXZpc2lvbklkLCByZXZpc2lvbi5hdHRyUmV2aXNpb25Bcm4pO1xuXG4gICAgdGhpcy5yZXZpc2lvbkNsZWFudXAgPSBuZXcgUmV2aXNpb25DbGVhbnVwKHRoaXMsICdSZXZpc2lvbkNsZWFudXAnLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25Bcm46IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGtlZXA6IHJldmlzaW9uUmV0ZW50aW9uLFxuICAgICAgcmV2aXNpb25JZHM6ICgpID0+IFt0aGlzLmN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkLCAuLi50aGlzLmVuZHBvaW50cy5mbGF0TWFwKChlKSA9PiBlLl9yZXZpc2lvbklkcygpKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVuZHBvaW50ID0gdGhpcy5jcmVhdGVFbmRwb2ludCgnRW5kcG9pbnQnLCB7IC4uLnByb3BzLmVuZHBvaW50LCBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUgfSwgJ2RlZmF1bHQnKTtcbiAgICB0aGlzLmdyYW50cyA9IHRoaXMuZW5kcG9pbnQuZ3JhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW5kcG9pbnQgKHVwIHRvIDEwIHBlciBmdW5jdGlvbiksIGUuZy4gYSBwdWJsaWMgb25lIG5leHQgdG8gYW4gSUFNLW9ubHkgb25lLCBvciBvbmUgcGlubmVkIHRvIGFuXG4gICAqIGVhcmxpZXIgcmV2aXNpb24uIEVhY2ggZW5kcG9pbnQgaGFzIGl0cyBvd24gVVJMLCBhdXRoZW50aWNhdGlvbiwgcmVnaW9ucyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgdGhlIGVuZHBvaW50J3MgY29uc3RydWN0IElELCBhbHNvIHVzZWQgaW4gaXRzIGdlbmVyYXRlZCBuYW1lIChgPGlkPi08aGFzaD5gKVxuICAgKi9cbiAgcHVibGljIGFkZEVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgY29uc3QgcHJlZml4ID0gaWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rLywgJycpLnNsaWNlKDAsIDU1KS5yZXBsYWNlKC8tKyQvLCAnJykgfHwgJ2VuZHBvaW50JztcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVFbmRwb2ludChpZCwgb3B0aW9ucywgcHJlZml4LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKi9cbiAgcHVibGljIGFkZEVudmlyb25tZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogV2ViRnVuY3Rpb24ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnQVdTXycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBlbnZpcm9ubWVudCB2YXJpYWJsZSAke2tleX0gaXMgcmVzZXJ2ZWQgKG5hbWVzIHN0YXJ0aW5nIHdpdGggQVdTXyBhcmUgc2V0IGJ5IHRoZSBydW50aW1lKSR7a2V5ID09PSAnQVdTX0xBTUJEQV9OT0RFSlNfRU5UUllQT0lOVCcgPyAnOyB1c2UgdGhlIGVudHJ5cG9pbnQgcHJvcGVydHknIDogJyd9YCk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnRba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIGV4ZWN1dGlvbiByb2xlJ3MgcG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYGdyYW50ZWVgIHRvIGNhbGwgdGhlIGVuZHBvaW50LiBTaG9ydGN1dCBmb3IgYGdyYW50cy5pbnZva2UoZ3JhbnRlZSlgLCBhcyBvbiBgbGFtYmRhLkZ1bmN0aW9uYC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5pbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgcHJpbmNpcGFsIGluIGFub3RoZXIgYWNjb3VudCwgYW4gQVdTIHNlcnZpY2Ugb3IgYW4gb3JnYW5pemF0aW9uIHRvIGNhbGwgdGhlIGZ1bmN0aW9uJ3MgZW5kcG9pbnRzLFxuICAgKiB0aHJvdWdoIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeS4gRm9yIGEgcm9sZSBpbiB0aGlzIGFjY291bnQsIHVzZSBgZ3JhbnRJbnZva2VgLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgdGhlIHN0YXRlbWVudCBJRCAoYFNpZGApOiBsZXR0ZXJzIGFuZCBkaWdpdHMsIHVuaXF1ZSB3aXRoaW4gdGhlIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgYWRkUGVybWlzc2lvbihpZDogc3RyaW5nLCBwZXJtaXNzaW9uOiBXZWJGdW5jdGlvblBlcm1pc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChpZCkgJiYgIS9eW0EtWmEtejAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHBlcm1pc3Npb24gaWQgJyR7aWR9JyBtdXN0IGJlIGxldHRlcnMgYW5kIGRpZ2l0cyBvbmx5IChpdCBpcyB0aGUgc3RhdGVtZW50J3MgU2lkKWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJtaXNzaW9uSWRzLmhhcyhpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZXJlIGlzIGFscmVhZHkgYSBwZXJtaXNzaW9uIHdpdGggaWQgJyR7aWR9J2ApO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IHBlcm1pc3Npb24uZW5kcG9pbnQ7XG4gICAgaWYgKGVuZHBvaW50ICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuZW5kcG9pbnRzLmluY2x1ZGVzKGVuZHBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50ICR7ZW5kcG9pbnQubm9kZS5wYXRofSBiZWxvbmdzIHRvIGFub3RoZXIgZnVuY3Rpb25gKTtcbiAgICB9XG4gICAgdGhpcy5wZXJtaXNzaW9uSWRzLmFkZChpZCk7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiBpZCxcbiAgICAgIHByaW5jaXBhbHM6IFtwZXJtaXNzaW9uLnByaW5jaXBhbF0sXG4gICAgICBhY3Rpb25zOiBbJ2xhbWJkYTpJbnZva2VXZWJGdW5jdGlvbkVuZHBvaW50J10sXG4gICAgICByZXNvdXJjZXM6IFtlbmRwb2ludD8uZW5kcG9pbnRBcm4gPz8gYCR7dGhpcy53ZWJGdW5jdGlvbkFybn0vZW5kcG9pbnQvKmBdLFxuICAgIH0pO1xuICAgIGlmIChwZXJtaXNzaW9uLnNvdXJjZUFybiAhPT0gdW5kZWZpbmVkKSBzdGF0ZW1lbnQuYWRkQ29uZGl0aW9uKCdBcm5MaWtlJywgeyAnYXdzOlNvdXJjZUFybic6IHBlcm1pc3Npb24uc291cmNlQXJuIH0pO1xuICAgIGlmIChwZXJtaXNzaW9uLnNvdXJjZUFjY291bnQgIT09IHVuZGVmaW5lZCkgc3RhdGVtZW50LmFkZENvbmRpdGlvbignU3RyaW5nRXF1YWxzJywgeyAnYXdzOlNvdXJjZUFjY291bnQnOiBwZXJtaXNzaW9uLnNvdXJjZUFjY291bnQgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleS1wb2xpY3kgc3RhdGVtZW50IExhbWJkYSBuZWVkcyB0byBzdGFydCB0aGlzIGZ1bmN0aW9uJ3MgZW52aXJvbm1lbnRzIHdpdGggYGVuY3J5cHRpb25LZXlgOiBga21zOkRlY3J5cHRgIGZvclxuICAgKiBgbGFtYmRhLmFtYXpvbmF3cy5jb21gLCBsaW1pdGVkIHRvIHRoaXMgZnVuY3Rpb24ncyByZXZpc2lvbnMgKGBhd3M6U291cmNlQXJuYCBhbmQgdGhlIGVuY3J5cHRpb24gY29udGV4dCBMYW1iZGEgc2V0cykuXG4gICAqXG4gICAqIEl0J3MgYWRkZWQgdG8gYGVuY3J5cHRpb25LZXlgIHdoZW4gdGhlIGtleSBpcyBkZWZpbmVkIGluIHRoaXMgYXBwLiBBZGQgaXQgdG8gZXZlcnkgcmVwbGljYSBvZiBhIG11bHRpLVJlZ2lvbiBrZXlcbiAgICogeW91cnNlbGY6IHJlcGxpY2FzIGRvbid0IHNoYXJlIHRoZWlyIHByaW1hcnkncyBwb2xpY3kuXG4gICAqL1xuICBwdWJsaWMgZW5jcnlwdGlvbktleVBvbGljeVN0YXRlbWVudCgpOiBpYW0uUG9saWN5U3RhdGVtZW50IHtcbiAgICBjb25zdCByZXZpc2lvbnMgPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xhbWJkYScsIHJlc291cmNlOiAnd2ViLWZ1bmN0aW9uJywgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLndlYkZ1bmN0aW9uTmFtZX0vcmV2aXNpb24vKmAsIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyldLFxuICAgICAgYWN0aW9uczogWydrbXM6RGVjcnlwdCddLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nTGlrZTogeyAnYXdzOlNvdXJjZUFybic6IHJldmlzaW9ucywgJ2ttczpFbmNyeXB0aW9uQ29udGV4dDphd3M6bGFtYmRhOldlYkZ1bmN0aW9uUmV2aXNpb25Bcm4nOiByZXZpc2lvbnMgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleS1wb2xpY3kgc3RhdGVtZW50IENsb3VkV2F0Y2ggTG9ncyBuZWVkcyBpbiBgcmVnaW9uYCB0byBlbmNyeXB0IHRoaXMgZnVuY3Rpb24ncyBsb2cgZ3JvdXBzIHRoZXJlIHdpdGhcbiAgICogYGxvZ0VuY3J5cHRpb25LZXlgLCBsaW1pdGVkIHRvIHRob3NlIGdyb3VwcyAoYGttczpFbmNyeXB0aW9uQ29udGV4dDphd3M6bG9nczphcm5gKS5cbiAgICpcbiAgICogSXQncyBhZGRlZCB0byBgbG9nRW5jcnlwdGlvbktleWAgZm9yIHRoZSBrZXkncyBvd24gcmVnaW9uIHdoZW4gdGhlIGtleSBpcyBkZWZpbmVkIGluIHRoaXMgYXBwLiBBZGQgaXQgdG8gdGhlXG4gICAqIHJlcGxpY2EgaW4gZXZlcnkgb3RoZXIgcmVnaW9uIHRoZSBmdW5jdGlvbiBzZXJ2ZXMgZnJvbSB5b3Vyc2VsZjogcmVwbGljYXMgZG9uJ3Qgc2hhcmUgdGhlaXIgcHJpbWFyeSdzIHBvbGljeS5cbiAgICpcbiAgICogQHBhcmFtIHJlZ2lvbiB0aGUgcmVnaW9uIG9mIHRoZSBrZXkgb3IgcmVwbGljYVxuICAgKi9cbiAgcHVibGljIGxvZ0VuY3J5cHRpb25LZXlQb2xpY3lTdGF0ZW1lbnQocmVnaW9uOiBzdHJpbmcpOiBpYW0uUG9saWN5U3RhdGVtZW50IHtcbiAgICBjb25zdCBncm91cHMgPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xvZ3MnLCByZWdpb24sIHJlc291cmNlOiAnbG9nLWdyb3VwJywgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLmxvZ0dyb3VwTmFtZX0qYCwgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uU2VydmljZVByaW5jaXBhbChgbG9ncy4ke3JlZ2lvbn0uYW1hem9uYXdzLmNvbWApXSxcbiAgICAgIGFjdGlvbnM6IFsna21zOkVuY3J5cHQqJywgJ2ttczpEZWNyeXB0KicsICdrbXM6UmVFbmNyeXB0KicsICdrbXM6R2VuZXJhdGVEYXRhS2V5KicsICdrbXM6RGVzY3JpYmUqJ10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczogeyBBcm5MaWtlOiB7ICdrbXM6RW5jcnlwdGlvbkNvbnRleHQ6YXdzOmxvZ3M6YXJuJzogZ3JvdXBzIH0gfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpb25hbCBhbmQgbXVsdGktcmVnaW9uIGVuZHBvaW50cyBuZWVkIGEgbXVsdGktUmVnaW9uIGtleTogb3RoZXJ3aXNlIHRoZWlyIG90aGVyIHJlZ2lvbnMgZmFpbCB0byBhY3RpdmF0ZS4gKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVuY3J5cHRpb25LZXkoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG11bHRpID0gdGhpcy5lbmRwb2ludHMuZmlsdGVyKChlKSA9PiBlLmVuZHBvaW50VHlwZSAhPT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04pO1xuICAgIGlmIChtdWx0aS5sZW5ndGggPT09IDAgfHwgaXNNdWx0aVJlZ2lvbktleSh0aGlzLmVuY3J5cHRpb25LZXkhKSAhPT0gZmFsc2UpIHJldHVybiBbXTtcbiAgICBjb25zdCB0eXBlTmFtZSA9ICh0OiBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSkgPT4gKHQgPT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLk1VTFRJX1JFR0lPTiA/ICdNVUxUSV9SRUdJT04nIDogJ1BFUl9SRUdJT04nKTtcbiAgICByZXR1cm4gW2BlbmNyeXB0aW9uS2V5IG11c3QgYmUgYSBtdWx0aS1SZWdpb24ga2V5ICh3aXRoIGEgcmVwbGljYSBpbiBldmVyeSBzZXJ2aW5nIHJlZ2lvbikgZm9yICR7bXVsdGkubWFwKChlKSA9PiBgJHtlLm5vZGUuaWR9ICgke3R5cGVOYW1lKGUuZW5kcG9pbnRUeXBlKX0pYCkuam9pbignLCAnKX06IHdpdGggYSBzaW5nbGUtUmVnaW9uIGtleSwgdGhlIGVuZHBvaW50IGZhaWxzIHRvIGFjdGl2YXRlIGluIGl0cyBvdGhlciByZWdpb25zIGFuZCB0aGUgZGVwbG95bWVudCByb2xscyBiYWNrYF07XG4gIH1cblxuICAvKiogTG9nIGdyb3VwcyBvdXRzaWRlIHRoZSBrZXkncyByZWdpb24gbmVlZCB0aGUgcmVwbGljYSBvZiBhIG11bHRpLVJlZ2lvbiBrZXkgdGhlcmUuICovXG4gIHByaXZhdGUgdmFsaWRhdGVMb2dFbmNyeXB0aW9uS2V5KCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmxvZ0VuY3J5cHRpb25LZXkhO1xuICAgIGlmIChpc011bHRpUmVnaW9uS2V5KGtleSkgIT09IGZhbHNlKSByZXR1cm4gW107XG4gICAgY29uc3QgZWxzZXdoZXJlID0gW1N0YWNrLm9mKHRoaXMpLnJlZ2lvbiwgLi4udGhpcy5yZW1vdGVMb2dHcm91cHMua2V5cygpXVxuICAgICAgLmZpbHRlcigocmVnaW9uKSA9PiBUb2tlbi5jb21wYXJlU3RyaW5ncyhyZWdpb24sIGtleS5lbnYucmVnaW9uKSA9PT0gVG9rZW5Db21wYXJpc29uLkRJRkZFUkVOVCk7XG4gICAgaWYgKGVsc2V3aGVyZS5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW2Bsb2dFbmNyeXB0aW9uS2V5IG11c3QgYmUgYSBtdWx0aS1SZWdpb24ga2V5ICh3aXRoIGEgcmVwbGljYSBpbiBldmVyeSBzZXJ2aW5nIHJlZ2lvbikgZm9yIHRoZSBsb2cgZ3JvdXBzIGluICR7ZWxzZXdoZXJlLmpvaW4oJywgJyl9OiBDbG91ZFdhdGNoIExvZ3Mgb25seSB1c2VzIGEga2V5IGluIHRoZSBncm91cCdzIG93biByZWdpb25gXTtcbiAgfVxuXG4gIC8qKiBUaGUga2V5IGZvciBhIGxvZyBncm91cCBpbiBgcmVnaW9uYDogdGhlIGtleSBpdHNlbGYgaW4gaXRzIG93biByZWdpb24sIG90aGVyd2lzZSBpdHMgcmVwbGljYSB0aGVyZSAoc2FtZSBrZXkgSUQpLiAqL1xuICBwcml2YXRlIGxvZ0tleUFybkluKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmxvZ09wdGlvbnMubG9nRW5jcnlwdGlvbktleTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocmVnaW9uID09PSBrZXkuZW52LnJlZ2lvbiB8fCBUb2tlbi5jb21wYXJlU3RyaW5ncyhyZWdpb24sIGtleS5lbnYucmVnaW9uKSA9PT0gVG9rZW5Db21wYXJpc29uLlNBTUUpIHJldHVybiBrZXkua2V5QXJuO1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGtleS5rZXlBcm4pKSByZXR1cm4gQXJuLmZvcm1hdCh7IC4uLkFybi5zcGxpdChrZXkua2V5QXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSksIHJlZ2lvbiB9KTtcbiAgICByZXR1cm4gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHsgc2VydmljZTogJ2ttcycsIHJlZ2lvbiwgYWNjb3VudDoga2V5LmVudi5hY2NvdW50LCByZXNvdXJjZTogJ2tleScsIHJlc291cmNlTmFtZToga2V5LmtleUlkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFbmRwb2ludChpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucywgbmFtZVByZWZpeDogc3RyaW5nLCBuYW1lU2VlZD86IHN0cmluZyk6IFdlYkZ1bmN0aW9uRW5kcG9pbnQge1xuICAgIGlmICh0aGlzLmVuZHBvaW50cy5sZW5ndGggPj0gTUFYX0VORFBPSU5UUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogYSBXZWIgRnVuY3Rpb24gY2FuIGhhdmUgYXQgbW9zdCAke01BWF9FTkRQT0lOVFN9IGVuZHBvaW50c2ApO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IFdlYkZ1bmN0aW9uRW5kcG9pbnQuX2NyZWF0ZSh0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHdlYkZ1bmN0aW9uOiB0aGlzLFxuICAgICAgY3VycmVudFJldmlzaW9uOiB0aGlzLmN1cnJlbnRSZXZpc2lvbixcbiAgICAgIG5hbWVQcmVmaXgsXG4gICAgICBuYW1lU2VlZCxcbiAgICB9KTtcbiAgICBjb25zdCBjbGFzaCA9IHRoaXMuZW5kcG9pbnRzLmZpbmQoKGUpID0+ICFUb2tlbi5pc1VucmVzb2x2ZWQoZS5lbmRwb2ludE5hbWUpICYmIGUuZW5kcG9pbnROYW1lID09PSBlbmRwb2ludC5lbmRwb2ludE5hbWUpO1xuICAgIGlmIChjbGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06IGVuZHBvaW50TmFtZSAnJHtlbmRwb2ludC5lbmRwb2ludE5hbWV9JyBpcyBhbHJlYWR5IHVzZWQgYnkgJHtjbGFzaC5ub2RlLnBhdGh9YCk7XG4gICAgfVxuICAgIHRoaXMuZW5kcG9pbnRzLnB1c2goZW5kcG9pbnQpO1xuICAgIC8vIFJldmlzaW9ucyBhbiBlbmRwb2ludCBzdG9wcyByb3V0aW5nIHRvIG9ubHkgYmVjb21lIGRlbGV0YWJsZSBvbmNlIGl0J3MgdXBkYXRlZC5cbiAgICB0aGlzLnJldmlzaW9uQ2xlYW51cC5ub2RlLmFkZERlcGVuZGVuY3koZW5kcG9pbnQpO1xuICAgIC8vIEVhY2ggc2VydmluZyByZWdpb24ncyAubG9jYWwgZ3JvdXAgbXVzdCBleGlzdCBiZWZvcmUgdHJhZmZpYywgYW5kIG91dGxpdmUgdGhlIGZ1bmN0aW9uLlxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIGVuZHBvaW50LnJlZ2lvbnMuc2xpY2UoMSkpIHtcbiAgICAgIGlmICh0aGlzLnJlbW90ZUxvZ0dyb3Vwcy5oYXMocmVnaW9uKSkgY29udGludWU7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMubG9nR3JvdXBJbihgTG9jYWxMb2dzLSR7cmVnaW9ufWAsIHJlZ2lvbiwgYCR7dGhpcy5sb2dHcm91cE5hbWV9LmxvY2FsYCk7XG4gICAgICB0aGlzLnJlbW90ZUxvZ0dyb3Vwcy5zZXQocmVnaW9uLCBncm91cCk7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShncm91cC5yZXNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBleGVjdXRpb24gcm9sZTogd3JpdGUgdG8gdGhlIGZ1bmN0aW9uJ3Mgb3duIGxvZyBncm91cHMgb25seSAodGhlIGhvbWUgcmVnaW9uJ3MgYW5kIGV2ZXJ5IHJlZ2lvbidzXG4gICAqIGAubG9jYWxgIGNvcHkpLCB0aGUgbWluaW11bSBBV1MgZG9jdW1lbnRzIGZvciBXZWIgRnVuY3Rpb25zLiBOb3QgYEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZWAsIHdob3NlXG4gICAqIGBsb2dzOkNyZWF0ZUxvZ0dyb3VwYCBvbiBgKmAgbGV0cyBlbnZpcm9ubWVudHMgc3RpbGwgc2h1dHRpbmcgZG93biByZS1jcmVhdGUgYSBkZWxldGVkIG9yIHJlbmFtZWQgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVJvbGUobG9nR3JvdXBOYW1lOiBzdHJpbmcpOiBpYW0uUm9sZSB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBsb2dHcm91cEFybiA9IChyZWdpb246IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiBzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xvZ3MnLCByZWdpb24sIHJlc291cmNlOiAnbG9nLWdyb3VwJywgcmVzb3VyY2VOYW1lOiBgJHtuYW1lfToqYCwgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdTZXJ2aWNlUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgTG9nczogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW25ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFsnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpQdXRMb2dFdmVudHMnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2xvZ0dyb3VwQXJuKHN0YWNrLnJlZ2lvbiwgbG9nR3JvdXBOYW1lKSwgbG9nR3JvdXBBcm4oJyonLCBgJHtsb2dHcm91cE5hbWV9LmxvY2FsYCldLFxuICAgICAgICAgIH0pXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGFja25vd2xlZGdlSWFtRmluZGluZ3Mocm9sZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5SZXNvdXJjZSwgJ0xvZyBzdHJlYW1zIG9mIHRoaXMgZnVuY3Rpb25cXCdzIG93biBsb2cgZ3JvdXBzLCBpbiBldmVyeSByZWdpb24gaXQgc2VydmVzIGZyb20nKTtcbiAgICByZXR1cm4gcm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZTogc3RyaW5nKTogV2ViRnVuY3Rpb25Mb2dHcm91cFtdIHtcbiAgICBjb25zdCBob21lID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvZ3MnLCBob21lLCBsb2dHcm91cE5hbWUpLFxuICAgICAgdGhpcy5sb2dHcm91cEluKCdMb2NhbExvZ3MnLCBob21lLCBgJHtsb2dHcm91cE5hbWV9LmxvY2FsYCksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nR3JvdXBJbihpZDogc3RyaW5nLCByZWdpb246IHN0cmluZywgbmFtZTogc3RyaW5nKTogV2ViRnVuY3Rpb25Mb2dHcm91cCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkxvZ0dyb3VwKHRoaXMsIGlkLCB7XG4gICAgICByZWdpb24sXG4gICAgICBsb2dHcm91cE5hbWU6IG5hbWUsXG4gICAgICByZXRlbnRpb246IHRoaXMubG9nT3B0aW9ucy5sb2dSZXRlbnRpb24gPz8gbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IHRoaXMubG9nT3B0aW9ucy5sb2dSZW1vdmFsUG9saWN5ID8/IFJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAga21zS2V5QXJuOiB0aGlzLmxvZ0tleUFybkluKHJlZ2lvbiksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEEgV2ViIEZ1bmN0aW9uIGRlZmluZWQgb3V0c2lkZSB0aGlzIGFwcC4gKi9cbmNsYXNzIEltcG9ydGVkV2ViRnVuY3Rpb24gZXh0ZW5kcyBXZWJGdW5jdGlvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKSB7XG4gICAgY29uc3QgYXJuID0gaW1wb3J0ZWRBcm4oc2NvcGUsIGlkLCBhdHRycyk7XG4gICAgLy8gQSB0b2tlbiBBUk4gKGUuZy4gYSBXZWJGdW5jdGlvbiBpbiBhbm90aGVyIHN0YWNrLCBvciBGbi5pbXBvcnRWYWx1ZSkgaXMgdGFrZW4gdG8gYmUgaW4gdGhpcyBzdGFjaydzIGFjY291bnQgYW5kXG4gICAgLy8gcmVnaW9uLCBhcyBpdHMgbWV0cmljcyBhbHJlYWR5IGFyZTogYSBncmFudCB0byBhIHJvbGUgb2YgdGhpcyBhY2NvdW50IHRoZW4gc3RheXMgaWRlbnRpdHktb25seS5cbiAgICBzdXBlcihzY29wZSwgaWQsIFRva2VuLmlzVW5yZXNvbHZlZChhcm4pID8ge30gOiB7IGVudmlyb25tZW50RnJvbUFybjogYXJuIH0pO1xuICAgIHRoaXMud2ViRnVuY3Rpb25Bcm4gPSBhcm47XG4gICAgdGhpcy53ZWJGdW5jdGlvbk5hbWUgPSBhdHRycy53ZWJGdW5jdGlvbk5hbWUgPz8gQXJuLnNwbGl0KGFybiwgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSE7XG4gICAgaWYgKGF0dHJzLmVuZHBvaW50TmFtZSAhPT0gdW5kZWZpbmVkKSBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ2VuZHBvaW50TmFtZScsIGF0dHJzLmVuZHBvaW50TmFtZSk7XG4gICAgdGhpcy5lbmRwb2ludE5hbWUgPSBhdHRycy5lbmRwb2ludE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBXZWJGdW5jdGlvbkdyYW50cy5fZm9yRW5kcG9pbnRBcm5zKFtgJHt0aGlzLndlYkZ1bmN0aW9uQXJufS9lbmRwb2ludC8ke3RoaXMuZW5kcG9pbnROYW1lID8/ICcqJ31gXSwgdGhpcykuaW52b2tlKGdyYW50ZWUpO1xuICB9XG59XG5cbi8qKiBXaGV0aGVyIGEga2V5IGlzIG11bHRpLVJlZ2lvbiwgd2hlbiB0aGF0IGNhbiBiZSB0b2xkIGF0IHN5bnRoZXNpczogaXRzIEwxIGluIHRoaXMgYXBwLCBvciBhbiBgbXJrLWAga2V5IElEIGluIGl0cyBBUk4uICovXG5mdW5jdGlvbiBpc011bHRpUmVnaW9uS2V5KGtleToga21zLklLZXkpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2ZuID0ga2V5Lm5vZGUuZGVmYXVsdENoaWxkO1xuICBpZiAoY2ZuIGluc3RhbmNlb2Yga21zLkNmbktleSkge1xuICAgIGNvbnN0IG11bHRpUmVnaW9uID0gU3RhY2sub2YoY2ZuKS5yZXNvbHZlKGNmbi5tdWx0aVJlZ2lvbik7XG4gICAgcmV0dXJuIHR5cGVvZiBtdWx0aVJlZ2lvbiA9PT0gJ2Jvb2xlYW4nID8gbXVsdGlSZWdpb24gOiBtdWx0aVJlZ2lvbiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXkua2V5QXJuKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIC86a2V5XFwvbXJrLS8udGVzdChrZXkua2V5QXJuKTtcbn1cblxuZnVuY3Rpb24gaW1wb3J0ZWRBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFdlYkZ1bmN0aW9uQXR0cmlidXRlcyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSBgJHtzY29wZS5ub2RlLnBhdGh9LyR7aWR9YDtcbiAgaWYgKChhdHRycy53ZWJGdW5jdGlvbkFybiA9PT0gdW5kZWZpbmVkKSA9PT0gKGF0dHJzLndlYkZ1bmN0aW9uTmFtZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtwYXRofTogZ2l2ZSBlaXRoZXIgd2ViRnVuY3Rpb25Bcm4gb3Igd2ViRnVuY3Rpb25OYW1lYCk7XG4gIH1cbiAgaWYgKGF0dHJzLndlYkZ1bmN0aW9uTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoYXR0cnMud2ViRnVuY3Rpb25OYW1lKSkge1xuICAgICAgLy8gVmFsaWRhdGVkIGFnYWluc3QgdGhlIHNjb3BlLCBiZWZvcmUgdGhlIGltcG9ydCBleGlzdHMuXG4gICAgICBhc3NlcnRSZXNvdXJjZU5hbWUoc2NvcGUsICd3ZWJGdW5jdGlvbk5hbWUnLCBhdHRycy53ZWJGdW5jdGlvbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gU3RhY2sub2Yoc2NvcGUpLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnbGFtYmRhJywgcmVzb3VyY2U6ICd3ZWItZnVuY3Rpb24nLCByZXNvdXJjZU5hbWU6IGF0dHJzLndlYkZ1bmN0aW9uTmFtZSwgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBhcm4gPSBhdHRycy53ZWJGdW5jdGlvbkFybiE7XG4gIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGFybikgJiYgIS9eYXJuOlteOl0rOmxhbWJkYTpbYS16MC05LV0rOlxcZHsxMn06d2ViLWZ1bmN0aW9uXFwvW0EtWmEtejAtOV8tXXsxLDY0fSQvLnRlc3QoYXJuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtwYXRofTogJyR7YXJufScgaXMgbm90IGEgV2ViIEZ1bmN0aW9uIEFSTiAoYXJuOjxwYXJ0aXRpb24+OmxhbWJkYTo8cmVnaW9uPjo8YWNjb3VudD46d2ViLWZ1bmN0aW9uLzxuYW1lPilgKTtcbiAgfVxuICByZXR1cm4gYXJuO1xufVxuIl19
|