@cdklabs/cdk-appmod-catalog-blueprints 1.10.0 → 1.12.0
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 +1276 -211
- package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
- package/lib/document-processing/agentic-document-processing.js +2 -2
- package/lib/document-processing/base-document-processing.js +1 -1
- package/lib/document-processing/bedrock-document-processing.js +1 -1
- package/lib/document-processing/default-document-processing-config.js +1 -1
- package/lib/framework/agents/base-agent.d.ts +15 -2
- package/lib/framework/agents/base-agent.js +3 -3
- package/lib/framework/agents/batch-agent.d.ts +1 -1
- package/lib/framework/agents/batch-agent.js +2 -2
- package/lib/framework/agents/default-agent-config.js +1 -1
- package/lib/framework/agents/interactive-agent.d.ts +286 -3
- package/lib/framework/agents/interactive-agent.js +412 -123
- package/lib/framework/agents/knowledge-base/base-knowledge-base.js +1 -1
- package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +1 -1
- package/lib/framework/agents/resources/agentcore-agent-handler/Dockerfile +20 -0
- package/lib/framework/agents/resources/agentcore-agent-handler/main.py +224 -0
- package/lib/framework/agents/resources/agentcore-agent-handler/requirements.txt +5 -0
- package/lib/framework/agents/resources/interactive-agent-handler/index.py +16 -93
- package/lib/framework/agents/resources/interactive-agent-handler/test_handler.py +214 -413
- package/lib/framework/bedrock/bedrock.js +1 -1
- package/lib/framework/custom-resource/default-runtimes.js +1 -1
- package/lib/framework/foundation/access-log.js +1 -1
- package/lib/framework/foundation/eventbridge-broker.js +1 -1
- package/lib/framework/foundation/network.js +1 -1
- package/lib/framework/tests/interactive-agent-nag.test.js +56 -1
- package/lib/framework/tests/interactive-agent.test.js +257 -11
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utilities/data-loader.js +1 -1
- package/lib/utilities/lambda-iam-utils.js +1 -1
- package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
- package/lib/utilities/observability/cloudwatch-transaction-search.js +1 -1
- package/lib/utilities/observability/default-observability-config.js +1 -1
- package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
- package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
- package/lib/utilities/observability/powertools-config.js +1 -1
- package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
- package/lib/webapp/frontend-construct.js +1 -1
- package/package.json +2 -2
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
2
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.InteractiveAgent = exports.NoAuthenticator = exports.CognitoAuthenticator = exports.NullConversationManager = exports.SlidingWindowConversationManager = exports.S3SessionManager = exports.StreamingHttpAdapter = void 0;
|
|
4
|
+
exports.InteractiveAgent = exports.AgentCoreRuntimeHostingAdapter = exports.LambdaHostingAdapter = exports.NoAuthenticator = exports.CognitoAuthenticator = exports.NullConversationManager = exports.SlidingWindowConversationManager = exports.S3SessionManager = exports.StreamingHttpAdapter = void 0;
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
7
7
|
// SPDX-License-Identifier: Apache-2.0
|
|
8
8
|
const path = require("path");
|
|
9
9
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
10
10
|
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
|
|
11
|
+
const aws_bedrockagentcore_1 = require("aws-cdk-lib/aws-bedrockagentcore");
|
|
11
12
|
const aws_cognito_1 = require("aws-cdk-lib/aws-cognito");
|
|
13
|
+
const aws_ecr_assets_1 = require("aws-cdk-lib/aws-ecr-assets");
|
|
12
14
|
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
13
15
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
14
16
|
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
@@ -179,7 +181,7 @@ class StreamingHttpAdapter {
|
|
|
179
181
|
}
|
|
180
182
|
exports.StreamingHttpAdapter = StreamingHttpAdapter;
|
|
181
183
|
_a = JSII_RTTI_SYMBOL_1;
|
|
182
|
-
StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.StreamingHttpAdapter", version: "1.
|
|
184
|
+
StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.StreamingHttpAdapter", version: "1.12.0" };
|
|
183
185
|
/**
|
|
184
186
|
* S3-based session manager for persisting conversation state.
|
|
185
187
|
*
|
|
@@ -212,6 +214,11 @@ StreamingHttpAdapter[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.Stream
|
|
|
212
214
|
* sessionStore: sessionManager
|
|
213
215
|
* });
|
|
214
216
|
* ```
|
|
217
|
+
*
|
|
218
|
+
* @deprecated Use Strands-native `S3SessionManager` from `strands.session.s3_session_manager` instead.
|
|
219
|
+
* The Python handler now uses Strands-native session management automatically.
|
|
220
|
+
* An S3 bucket is still created for the Strands session manager; this CDK class
|
|
221
|
+
* is no longer needed to configure session persistence.
|
|
215
222
|
*/
|
|
216
223
|
class S3SessionManager {
|
|
217
224
|
constructor(scope, id, props = {}) {
|
|
@@ -251,7 +258,7 @@ class S3SessionManager {
|
|
|
251
258
|
}
|
|
252
259
|
exports.S3SessionManager = S3SessionManager;
|
|
253
260
|
_b = JSII_RTTI_SYMBOL_1;
|
|
254
|
-
S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionManager", version: "1.
|
|
261
|
+
S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionManager", version: "1.12.0" };
|
|
255
262
|
/**
|
|
256
263
|
* Sliding window conversation manager for maintaining recent conversation history.
|
|
257
264
|
*
|
|
@@ -273,6 +280,10 @@ S3SessionManager[_b] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.S3SessionM
|
|
|
273
280
|
* contextStrategy: contextManager
|
|
274
281
|
* });
|
|
275
282
|
* ```
|
|
283
|
+
*
|
|
284
|
+
* @deprecated Use Strands-native `SlidingWindowConversationManager` from
|
|
285
|
+
* `strands.agent.conversation_manager` instead. The Python handler now handles
|
|
286
|
+
* conversation windowing natively.
|
|
276
287
|
*/
|
|
277
288
|
class SlidingWindowConversationManager {
|
|
278
289
|
constructor(props = {}) {
|
|
@@ -295,12 +306,15 @@ class SlidingWindowConversationManager {
|
|
|
295
306
|
}
|
|
296
307
|
exports.SlidingWindowConversationManager = SlidingWindowConversationManager;
|
|
297
308
|
_c = JSII_RTTI_SYMBOL_1;
|
|
298
|
-
SlidingWindowConversationManager[_c] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.SlidingWindowConversationManager", version: "1.
|
|
309
|
+
SlidingWindowConversationManager[_c] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.SlidingWindowConversationManager", version: "1.12.0" };
|
|
299
310
|
/**
|
|
300
311
|
* Null conversation manager for stateless interactions.
|
|
301
312
|
*
|
|
302
313
|
* Disables conversation history, treating each message as independent.
|
|
303
314
|
* Useful for stateless use cases where context is not needed.
|
|
315
|
+
*
|
|
316
|
+
* @deprecated The Python handler now uses Strands-native conversation management.
|
|
317
|
+
* To disable conversation history, omit the session bucket configuration.
|
|
304
318
|
*/
|
|
305
319
|
class NullConversationManager {
|
|
306
320
|
/**
|
|
@@ -315,7 +329,7 @@ class NullConversationManager {
|
|
|
315
329
|
}
|
|
316
330
|
exports.NullConversationManager = NullConversationManager;
|
|
317
331
|
_d = JSII_RTTI_SYMBOL_1;
|
|
318
|
-
NullConversationManager[_d] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NullConversationManager", version: "1.
|
|
332
|
+
NullConversationManager[_d] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NullConversationManager", version: "1.12.0" };
|
|
319
333
|
/**
|
|
320
334
|
* Cognito-based authenticator for securing REST API endpoints.
|
|
321
335
|
*
|
|
@@ -438,7 +452,7 @@ class CognitoAuthenticator {
|
|
|
438
452
|
}
|
|
439
453
|
exports.CognitoAuthenticator = CognitoAuthenticator;
|
|
440
454
|
_e = JSII_RTTI_SYMBOL_1;
|
|
441
|
-
CognitoAuthenticator[_e] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.CognitoAuthenticator", version: "1.
|
|
455
|
+
CognitoAuthenticator[_e] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.CognitoAuthenticator", version: "1.12.0" };
|
|
442
456
|
/**
|
|
443
457
|
* No-authentication authenticator for development and testing.
|
|
444
458
|
*
|
|
@@ -468,7 +482,343 @@ class NoAuthenticator {
|
|
|
468
482
|
}
|
|
469
483
|
exports.NoAuthenticator = NoAuthenticator;
|
|
470
484
|
_f = JSII_RTTI_SYMBOL_1;
|
|
471
|
-
NoAuthenticator[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthenticator", version: "1.
|
|
485
|
+
NoAuthenticator[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthenticator", version: "1.12.0" };
|
|
486
|
+
/**
|
|
487
|
+
* Lambda hosting adapter for InteractiveAgent.
|
|
488
|
+
*
|
|
489
|
+
* Deploys the agent as a Lambda function behind Lambda Web Adapter and API Gateway
|
|
490
|
+
* REST API with response streaming. This is the default hosting backend.
|
|
491
|
+
*
|
|
492
|
+
* ## Architecture
|
|
493
|
+
*
|
|
494
|
+
* ```
|
|
495
|
+
* Client → POST /chat → API Gateway REST API (STREAM) → Lambda (FastAPI + LWA) → Bedrock
|
|
496
|
+
* Client ← SSE stream ← API Gateway ← Lambda response streaming ← Agent tokens
|
|
497
|
+
* ```
|
|
498
|
+
*/
|
|
499
|
+
class LambdaHostingAdapter {
|
|
500
|
+
constructor(props = {}) {
|
|
501
|
+
this.props = props;
|
|
502
|
+
}
|
|
503
|
+
get servicePrincipal() { return new aws_iam_1.ServicePrincipal('lambda.amazonaws.com'); }
|
|
504
|
+
/**
|
|
505
|
+
* Deploy Lambda + LWA + API Gateway hosting infrastructure.
|
|
506
|
+
*/
|
|
507
|
+
deploy(config) {
|
|
508
|
+
const scope = config.scope;
|
|
509
|
+
// Initialize authenticator
|
|
510
|
+
const authenticator = this.props.authenticator !== undefined
|
|
511
|
+
? this.props.authenticator
|
|
512
|
+
: new CognitoAuthenticator();
|
|
513
|
+
this.authenticator = authenticator;
|
|
514
|
+
if (authenticator instanceof CognitoAuthenticator) {
|
|
515
|
+
authenticator._setScope(scope);
|
|
516
|
+
}
|
|
517
|
+
// Initialize communication adapter
|
|
518
|
+
const adapter = this.props.communicationAdapter || new StreamingHttpAdapter({
|
|
519
|
+
authenticator,
|
|
520
|
+
});
|
|
521
|
+
this.communicationAdapter = adapter;
|
|
522
|
+
if (adapter instanceof StreamingHttpAdapter) {
|
|
523
|
+
adapter._setScope(scope);
|
|
524
|
+
}
|
|
525
|
+
// Build environment variables
|
|
526
|
+
const env = {
|
|
527
|
+
...config.environment,
|
|
528
|
+
// Lambda Web Adapter configuration
|
|
529
|
+
AWS_LAMBDA_EXEC_WRAPPER: '/opt/bootstrap',
|
|
530
|
+
AWS_LWA_INVOKE_MODE: 'response_stream',
|
|
531
|
+
AWS_LWA_READINESS_CHECK_PATH: '/health',
|
|
532
|
+
AWS_LWA_PORT: '8080',
|
|
533
|
+
PORT: '8080',
|
|
534
|
+
...authenticator.environmentVariables(),
|
|
535
|
+
};
|
|
536
|
+
// Create Lambda function with Lambda Web Adapter layer
|
|
537
|
+
const { account, region } = aws_cdk_lib_1.Stack.of(scope);
|
|
538
|
+
const agentLambdaLogPermissionsResult = utilities_1.LambdaIamUtils.createLogsPermissions({
|
|
539
|
+
account,
|
|
540
|
+
region,
|
|
541
|
+
scope,
|
|
542
|
+
functionName: config.agentName,
|
|
543
|
+
enableObservability: config.enableObservability,
|
|
544
|
+
});
|
|
545
|
+
// Lambda Web Adapter layer
|
|
546
|
+
const webAdapterLayer = aws_lambda_1.LayerVersion.fromLayerVersionArn(scope, 'LambdaWebAdapterLayer', `arn:aws:lambda:${region}:753240598075:layer:LambdaAdapterLayerX86:25`);
|
|
547
|
+
const allLayers = [webAdapterLayer];
|
|
548
|
+
if (config.lambdaLayers) {
|
|
549
|
+
allLayers.push(...config.lambdaLayers);
|
|
550
|
+
}
|
|
551
|
+
if (config.knowledgeBaseLayers && config.knowledgeBaseLayers.length > 0) {
|
|
552
|
+
allLayers.push(...config.knowledgeBaseLayers);
|
|
553
|
+
}
|
|
554
|
+
const handlerPath = path.join(__dirname, 'resources/interactive-agent-handler');
|
|
555
|
+
// All Python version references derived from DefaultRuntimes.PYTHON
|
|
556
|
+
const pythonRuntime = custom_resource_1.DefaultRuntimes.PYTHON;
|
|
557
|
+
const pyVersion = pythonRuntime.name.replace('python', ''); // e.g. "3.13"
|
|
558
|
+
const architecture = this.props.architecture || config.architecture || aws_lambda_1.Architecture.X86_64;
|
|
559
|
+
const memorySize = this.props.memorySize || config.memorySize || 1024;
|
|
560
|
+
const timeout = this.props.timeout || config.timeout || aws_cdk_lib_1.Duration.minutes(15);
|
|
561
|
+
const reservedConcurrentExecutions = this.props.reservedConcurrentExecutions ?? config.reservedConcurrentExecutions;
|
|
562
|
+
const agentFunction = new aws_lambda_1.Function(scope, 'InteractiveAgentFunction', {
|
|
563
|
+
functionName: agentLambdaLogPermissionsResult.uniqueFunctionName,
|
|
564
|
+
architecture,
|
|
565
|
+
code: aws_lambda_1.Code.fromAsset(handlerPath, {
|
|
566
|
+
bundling: {
|
|
567
|
+
image: pythonRuntime.bundlingImage,
|
|
568
|
+
command: [
|
|
569
|
+
'bash', '-c',
|
|
570
|
+
'pip install -r requirements.txt -t /asset-output && cp -a . /asset-output',
|
|
571
|
+
],
|
|
572
|
+
local: {
|
|
573
|
+
tryBundle(outputDir) {
|
|
574
|
+
try {
|
|
575
|
+
const proc = require('child_process'); // eslint-disable-line @typescript-eslint/no-require-imports
|
|
576
|
+
const pythonCandidates = [`python${pyVersion}`, 'python3', 'python'];
|
|
577
|
+
let pythonBin = 'python3';
|
|
578
|
+
for (const candidate of pythonCandidates) {
|
|
579
|
+
try {
|
|
580
|
+
const ver = proc.execSync(`${candidate} --version 2>&1`, { encoding: 'utf-8' }).trim();
|
|
581
|
+
const match = ver.match(/Python (\d+)\.(\d+)/);
|
|
582
|
+
if (match && (parseInt(match[1]) > 3 || (parseInt(match[1]) === 3 && parseInt(match[2]) >= 11))) {
|
|
583
|
+
pythonBin = candidate;
|
|
584
|
+
break;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
catch {
|
|
588
|
+
continue;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
proc.execSync(`${pythonBin} -m pip install -r requirements.txt -t "${outputDir}" --platform manylinux2014_x86_64 --only-binary=:all: --python-version ${pyVersion}`, { cwd: handlerPath, stdio: 'inherit' });
|
|
592
|
+
proc.execSync(`cp -r . "${outputDir}"`, { cwd: handlerPath, stdio: 'inherit' });
|
|
593
|
+
return true;
|
|
594
|
+
}
|
|
595
|
+
catch {
|
|
596
|
+
return false;
|
|
597
|
+
}
|
|
598
|
+
},
|
|
599
|
+
},
|
|
600
|
+
},
|
|
601
|
+
}),
|
|
602
|
+
role: config.agentRole,
|
|
603
|
+
handler: 'run.sh',
|
|
604
|
+
runtime: pythonRuntime,
|
|
605
|
+
layers: allLayers,
|
|
606
|
+
timeout,
|
|
607
|
+
memorySize,
|
|
608
|
+
environment: env,
|
|
609
|
+
environmentEncryption: config.encryptionKey,
|
|
610
|
+
vpc: config.network ? config.network.vpc : undefined,
|
|
611
|
+
vpcSubnets: config.network ? config.network.applicationSubnetSelection() : undefined,
|
|
612
|
+
reservedConcurrentExecutions,
|
|
613
|
+
});
|
|
614
|
+
// Grant log permissions
|
|
615
|
+
for (const s of agentLambdaLogPermissionsResult.policyStatements) {
|
|
616
|
+
config.agentRole.addToPrincipalPolicy(s);
|
|
617
|
+
}
|
|
618
|
+
// Grant authenticator permissions
|
|
619
|
+
if (authenticator) {
|
|
620
|
+
authenticator.grantAuthenticate(agentFunction);
|
|
621
|
+
}
|
|
622
|
+
// Attach communication adapter and get endpoint
|
|
623
|
+
const endpoint = adapter.attachToFunction(agentFunction);
|
|
624
|
+
adapter.grantInvoke(agentFunction);
|
|
625
|
+
return { endpoint, agentFunction };
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
exports.LambdaHostingAdapter = LambdaHostingAdapter;
|
|
629
|
+
_g = JSII_RTTI_SYMBOL_1;
|
|
630
|
+
LambdaHostingAdapter[_g] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LambdaHostingAdapter", version: "1.12.0" };
|
|
631
|
+
/**
|
|
632
|
+
* AgentCore Runtime hosting adapter for InteractiveAgent.
|
|
633
|
+
*
|
|
634
|
+
* Deploys the agent as a container running on AgentCore Runtime (microVM).
|
|
635
|
+
* Uses L1 constructs `CfnRuntime` and `CfnRuntimeEndpoint` from
|
|
636
|
+
* `aws-cdk-lib/aws-bedrockagentcore`.
|
|
637
|
+
*
|
|
638
|
+
* ## Architecture
|
|
639
|
+
*
|
|
640
|
+
* ```
|
|
641
|
+
* Client → AgentCore Runtime Endpoint → Container (FastAPI on port 8080) → Bedrock
|
|
642
|
+
* ```
|
|
643
|
+
*
|
|
644
|
+
* ## Features
|
|
645
|
+
*
|
|
646
|
+
* - **Session Isolation**: microVM provides per-session isolation (no S3 session bucket needed)
|
|
647
|
+
* - **Managed Infrastructure**: No Lambda cold starts or timeout limits
|
|
648
|
+
* - **Multiple Protocols**: HTTP, MCP, or A2A protocol support
|
|
649
|
+
* - **Container-Based**: Standard Docker image deployment
|
|
650
|
+
*
|
|
651
|
+
* ## Usage
|
|
652
|
+
*
|
|
653
|
+
* ```typescript
|
|
654
|
+
* import { Asset } from 'aws-cdk-lib/aws-s3-assets';
|
|
655
|
+
* import { InteractiveAgent, AgentCoreRuntimeHostingAdapter } from '@cdklabs/cdk-appmod-catalog-blueprints';
|
|
656
|
+
*
|
|
657
|
+
* declare const myPrompt: Asset;
|
|
658
|
+
*
|
|
659
|
+
* new InteractiveAgent(this, 'Agent', {
|
|
660
|
+
* agentName: 'MyChatbot',
|
|
661
|
+
* agentDefinition: { bedrockModel: {}, systemPrompt: myPrompt },
|
|
662
|
+
* hostingAdapter: new AgentCoreRuntimeHostingAdapter({
|
|
663
|
+
* networkMode: 'PUBLIC',
|
|
664
|
+
* }),
|
|
665
|
+
* });
|
|
666
|
+
* ```
|
|
667
|
+
*/
|
|
668
|
+
class AgentCoreRuntimeHostingAdapter {
|
|
669
|
+
constructor(props = {}) {
|
|
670
|
+
this.props = props;
|
|
671
|
+
}
|
|
672
|
+
get servicePrincipal() { return new aws_iam_1.ServicePrincipal('bedrock-agentcore.amazonaws.com'); }
|
|
673
|
+
/**
|
|
674
|
+
* Deploy AgentCore Runtime hosting infrastructure.
|
|
675
|
+
*/
|
|
676
|
+
deploy(config) {
|
|
677
|
+
const scope = config.scope;
|
|
678
|
+
const networkMode = this.props.networkMode || 'PUBLIC';
|
|
679
|
+
// Build or reference container image
|
|
680
|
+
let containerUri;
|
|
681
|
+
if (this.props.containerImageUri) {
|
|
682
|
+
containerUri = this.props.containerImageUri;
|
|
683
|
+
}
|
|
684
|
+
else {
|
|
685
|
+
const handlerPath = path.join(__dirname, 'resources/agentcore-agent-handler');
|
|
686
|
+
const imageAsset = new aws_ecr_assets_1.DockerImageAsset(scope, 'AgentCoreHandlerImage', {
|
|
687
|
+
directory: handlerPath,
|
|
688
|
+
});
|
|
689
|
+
containerUri = imageAsset.imageUri;
|
|
690
|
+
}
|
|
691
|
+
// Reuse the single agentRole (already has bedrock-agentcore trust from BaseAgent).
|
|
692
|
+
// Only add ECR pull permissions — all other permissions (Bedrock InvokeModel,
|
|
693
|
+
// S3 tool assets, KB access, session bucket, observability) are already granted
|
|
694
|
+
// by BaseAgent on config.agentRole.
|
|
695
|
+
const ecrPolicyResult = config.agentRole.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
|
|
696
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
697
|
+
actions: [
|
|
698
|
+
'ecr:GetDownloadUrlForLayer',
|
|
699
|
+
'ecr:BatchGetImage',
|
|
700
|
+
'ecr:GetAuthorizationToken',
|
|
701
|
+
],
|
|
702
|
+
resources: ['*'],
|
|
703
|
+
}));
|
|
704
|
+
// Add ADOT observability permissions when enabled.
|
|
705
|
+
// The container Dockerfile uses `opentelemetry-instrument` as its CMD wrapper;
|
|
706
|
+
// ADOT needs these permissions to export traces, logs, and metrics from the container.
|
|
707
|
+
// Note: We use explicit statements instead of CloudWatchLambdaApplicationSignalsExecutionRolePolicy
|
|
708
|
+
// because that managed policy only covers /aws/application-signals/data log group
|
|
709
|
+
// and misses permissions ADOT needs (DescribeLogGroups, DescribeLogStreams, PutMetricData).
|
|
710
|
+
if (config.enableObservability) {
|
|
711
|
+
config.agentRole.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
|
|
712
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
713
|
+
actions: [
|
|
714
|
+
'logs:DescribeLogGroups',
|
|
715
|
+
'logs:DescribeLogStreams',
|
|
716
|
+
],
|
|
717
|
+
resources: ['*'],
|
|
718
|
+
}));
|
|
719
|
+
config.agentRole.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
|
|
720
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
721
|
+
actions: [
|
|
722
|
+
'cloudwatch:PutMetricData',
|
|
723
|
+
],
|
|
724
|
+
resources: ['*'],
|
|
725
|
+
}));
|
|
726
|
+
}
|
|
727
|
+
// Build environment variables for the container
|
|
728
|
+
const { region, account } = aws_cdk_lib_1.Stack.of(scope);
|
|
729
|
+
const envVars = {
|
|
730
|
+
// Unlike Lambda, AgentCore containers don't get AWS_REGION automatically.
|
|
731
|
+
// boto3 and other AWS SDKs need it to make API calls.
|
|
732
|
+
AWS_REGION: region,
|
|
733
|
+
AWS_DEFAULT_REGION: region,
|
|
734
|
+
};
|
|
735
|
+
for (const [key, value] of Object.entries(config.environment)) {
|
|
736
|
+
envVars[key] = value;
|
|
737
|
+
}
|
|
738
|
+
// Note: AGENT_OBSERVABILITY_ENABLED and OTEL_* env vars are NOT set here.
|
|
739
|
+
// For AgentCore-hosted agents, the ADOT auto-instrumentation via
|
|
740
|
+
// `opentelemetry-instrument` in the Dockerfile CMD handles trace/span
|
|
741
|
+
// export automatically. These env vars are only needed for agents
|
|
742
|
+
// hosted outside of AgentCore.
|
|
743
|
+
// Build network configuration
|
|
744
|
+
const networkConfiguration = {
|
|
745
|
+
networkMode,
|
|
746
|
+
};
|
|
747
|
+
// Build authorization configuration if JWT authorizer is specified
|
|
748
|
+
const authConfig = this.props.customJwtAuthorizer ? {
|
|
749
|
+
customJwtAuthorizer: {
|
|
750
|
+
discoveryUrl: this.props.customJwtAuthorizer.discoveryUrl,
|
|
751
|
+
allowedAudience: this.props.customJwtAuthorizer.allowedAudience,
|
|
752
|
+
allowedClients: this.props.customJwtAuthorizer.allowedClients,
|
|
753
|
+
},
|
|
754
|
+
} : undefined;
|
|
755
|
+
// Create CfnRuntime
|
|
756
|
+
const runtime = new aws_bedrockagentcore_1.CfnRuntime(scope, 'AgentCoreRuntime', {
|
|
757
|
+
agentRuntimeName: `${config.agentName.replace(/-/g, '_')}_runtime`,
|
|
758
|
+
agentRuntimeArtifact: {
|
|
759
|
+
containerConfiguration: {
|
|
760
|
+
containerUri,
|
|
761
|
+
},
|
|
762
|
+
},
|
|
763
|
+
roleArn: config.agentRole.roleArn,
|
|
764
|
+
networkConfiguration,
|
|
765
|
+
authorizerConfiguration: authConfig,
|
|
766
|
+
environmentVariables: envVars,
|
|
767
|
+
});
|
|
768
|
+
runtime.applyRemovalPolicy(config.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY);
|
|
769
|
+
// When JWT auth is configured, allowlist the Authorization header so the
|
|
770
|
+
// container can extract user identity claims from the forwarded JWT token.
|
|
771
|
+
// See: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-oauth.html#oauth-propagate-jwt-token
|
|
772
|
+
if (this.props.customJwtAuthorizer) {
|
|
773
|
+
runtime.addPropertyOverride('RequestHeaderConfiguration', {
|
|
774
|
+
RequestHeaderAllowlist: ['Authorization'],
|
|
775
|
+
});
|
|
776
|
+
}
|
|
777
|
+
// Ensure CfnRuntime waits for the role and its policies to be fully created/updated.
|
|
778
|
+
// Without this, CloudFormation may validate the role before:
|
|
779
|
+
// - The trust policy is updated to bedrock-agentcore.amazonaws.com (during stack updates)
|
|
780
|
+
// - The ECR permissions policy is attached
|
|
781
|
+
runtime.node.addDependency(config.agentRole);
|
|
782
|
+
if (ecrPolicyResult.policyDependable) {
|
|
783
|
+
runtime.node.addDependency(ecrPolicyResult.policyDependable);
|
|
784
|
+
}
|
|
785
|
+
// Create CfnRuntimeEndpoint
|
|
786
|
+
const endpointName = this.props.endpointName || `${config.agentName.replace(/-/g, '_')}_endpoint`;
|
|
787
|
+
const runtimeEndpoint = new aws_bedrockagentcore_1.CfnRuntimeEndpoint(scope, 'AgentCoreRuntimeEndpoint', {
|
|
788
|
+
agentRuntimeId: runtime.ref,
|
|
789
|
+
agentRuntimeVersion: runtime.attrAgentRuntimeVersion,
|
|
790
|
+
name: endpointName,
|
|
791
|
+
...(this.props.protocolConfiguration && {
|
|
792
|
+
protocolConfiguration: {
|
|
793
|
+
serverProtocol: this.props.protocolConfiguration,
|
|
794
|
+
},
|
|
795
|
+
}),
|
|
796
|
+
});
|
|
797
|
+
runtimeEndpoint.applyRemovalPolicy(config.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY);
|
|
798
|
+
// Construct the full invocation URL for direct HTTPS access (required for JWT auth).
|
|
799
|
+
// Format: https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{URL-encoded-ARN}/invocations?qualifier={endpointName}
|
|
800
|
+
const encodedArn = aws_cdk_lib_1.Fn.join('', [
|
|
801
|
+
'arn%3Aaws%3Abedrock-agentcore%3A',
|
|
802
|
+
region,
|
|
803
|
+
'%3A',
|
|
804
|
+
account,
|
|
805
|
+
'%3Aruntime%2F',
|
|
806
|
+
runtime.attrAgentRuntimeId,
|
|
807
|
+
]);
|
|
808
|
+
const endpoint = aws_cdk_lib_1.Fn.join('', [
|
|
809
|
+
'https://bedrock-agentcore.',
|
|
810
|
+
region,
|
|
811
|
+
'.amazonaws.com/runtimes/',
|
|
812
|
+
encodedArn,
|
|
813
|
+
'/invocations?qualifier=',
|
|
814
|
+
endpointName,
|
|
815
|
+
]);
|
|
816
|
+
return { endpoint, cfnRuntime: runtime };
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
exports.AgentCoreRuntimeHostingAdapter = AgentCoreRuntimeHostingAdapter;
|
|
820
|
+
_h = JSII_RTTI_SYMBOL_1;
|
|
821
|
+
AgentCoreRuntimeHostingAdapter[_h] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.AgentCoreRuntimeHostingAdapter", version: "1.12.0" };
|
|
472
822
|
/**
|
|
473
823
|
* Interactive Agent for real-time conversational AI with SSE streaming.
|
|
474
824
|
*
|
|
@@ -522,26 +872,22 @@ NoAuthenticator[_f] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.NoAuthentic
|
|
|
522
872
|
*/
|
|
523
873
|
class InteractiveAgent extends base_agent_1.BaseAgent {
|
|
524
874
|
constructor(scope, id, props) {
|
|
525
|
-
super(
|
|
875
|
+
// Determine hosting adapter BEFORE super() so we can pass its trust principal
|
|
876
|
+
const hostingAdapter = props.hostingAdapter || new LambdaHostingAdapter({
|
|
877
|
+
communicationAdapter: props.communicationAdapter,
|
|
878
|
+
authenticator: props.authenticator,
|
|
879
|
+
memorySize: props.memorySize,
|
|
880
|
+
timeout: props.timeout,
|
|
881
|
+
architecture: props.architecture,
|
|
882
|
+
reservedConcurrentExecutions: props.reservedConcurrentExecutions,
|
|
883
|
+
});
|
|
884
|
+
super(scope, id, { ...props, servicePrincipal: hostingAdapter.servicePrincipal });
|
|
526
885
|
// Validate props
|
|
527
886
|
this.validateProps(props);
|
|
528
887
|
const modelId = bedrock_1.BedrockModelUtils.deriveActualModelId(this.bedrockModel);
|
|
529
888
|
const metricNamespace = props.metricNamespace || observability_1.DefaultObservabilityConfig.DEFAULT_METRIC_NAMESPACE;
|
|
530
889
|
const metricServiceName = props.metricServiceName || default_agent_config_1.DefaultAgentConfig.DEFAULT_OBSERVABILITY_METRIC_SVC_NAME;
|
|
531
|
-
// Initialize
|
|
532
|
-
this.authenticator = props.authenticator !== undefined ? props.authenticator : new CognitoAuthenticator();
|
|
533
|
-
if (this.authenticator instanceof CognitoAuthenticator) {
|
|
534
|
-
this.authenticator._setScope(this);
|
|
535
|
-
}
|
|
536
|
-
// Initialize communication adapter
|
|
537
|
-
const adapter = props.communicationAdapter || new StreamingHttpAdapter({
|
|
538
|
-
authenticator: this.authenticator,
|
|
539
|
-
});
|
|
540
|
-
this.adapter = adapter;
|
|
541
|
-
if (adapter instanceof StreamingHttpAdapter) {
|
|
542
|
-
adapter._setScope(this);
|
|
543
|
-
}
|
|
544
|
-
// Initialize session store
|
|
890
|
+
// Initialize session store (S3 bucket for Strands-native S3SessionManager)
|
|
545
891
|
if (props.sessionStore !== undefined) {
|
|
546
892
|
this.sessionStore = props.sessionStore;
|
|
547
893
|
}
|
|
@@ -552,7 +898,7 @@ class InteractiveAgent extends base_agent_1.BaseAgent {
|
|
|
552
898
|
});
|
|
553
899
|
}
|
|
554
900
|
else {
|
|
555
|
-
// Default: create S3SessionManager
|
|
901
|
+
// Default: create S3SessionManager (bucket used by Strands-native session manager)
|
|
556
902
|
this.sessionStore = new S3SessionManager(this, 'SessionManager', {
|
|
557
903
|
sessionTTL: props.sessionTTL,
|
|
558
904
|
encryptionKey: props.encryptionKey,
|
|
@@ -560,7 +906,8 @@ class InteractiveAgent extends base_agent_1.BaseAgent {
|
|
|
560
906
|
});
|
|
561
907
|
}
|
|
562
908
|
this.sessionBucket = this.sessionStore?.sessionBucket;
|
|
563
|
-
//
|
|
909
|
+
// Context strategy is deprecated — Strands-native conversation manager handles this.
|
|
910
|
+
// Keep for backward compatibility but do not use env vars.
|
|
564
911
|
if (props.contextStrategy) {
|
|
565
912
|
this.contextStrategy = props.contextStrategy;
|
|
566
913
|
}
|
|
@@ -569,23 +916,13 @@ class InteractiveAgent extends base_agent_1.BaseAgent {
|
|
|
569
916
|
windowSize: props.messageHistoryLimit,
|
|
570
917
|
});
|
|
571
918
|
}
|
|
572
|
-
// Build environment variables
|
|
919
|
+
// Build base environment variables
|
|
573
920
|
const env = {
|
|
574
921
|
MODEL_ID: modelId,
|
|
575
922
|
SYSTEM_PROMPT_S3_BUCKET_NAME: props.agentDefinition.systemPrompt.s3BucketName,
|
|
576
923
|
SYSTEM_PROMPT_S3_KEY: props.agentDefinition.systemPrompt.s3ObjectKey,
|
|
577
924
|
TOOLS_CONFIG: JSON.stringify(this.agentToolsLocationDefinitions),
|
|
578
|
-
|
|
579
|
-
// AWS_LAMBDA_EXEC_WRAPPER tells Lambda to use LWA's bootstrap script
|
|
580
|
-
// which intercepts the runtime and proxies requests to the web app
|
|
581
|
-
AWS_LAMBDA_EXEC_WRAPPER: '/opt/bootstrap',
|
|
582
|
-
AWS_LWA_INVOKE_MODE: 'response_stream',
|
|
583
|
-
AWS_LWA_READINESS_CHECK_PATH: '/health',
|
|
584
|
-
AWS_LWA_PORT: '8080',
|
|
585
|
-
PORT: '8080',
|
|
586
|
-
...this.contextStrategy.environmentVariables(),
|
|
587
|
-
...this.authenticator.environmentVariables(),
|
|
588
|
-
...utilities_1.PowertoolsConfig.generateDefaultLambdaConfig(props.enableObservability, metricNamespace, metricServiceName),
|
|
925
|
+
...utilities_1.PowertoolsConfig.generateDefaultLambdaConfig(props.enableObservability, metricNamespace, metricServiceName, 'DEBUG'),
|
|
589
926
|
};
|
|
590
927
|
// Add session bucket env var if session store exists
|
|
591
928
|
if (this.sessionBucket) {
|
|
@@ -596,98 +933,50 @@ class InteractiveAgent extends base_agent_1.BaseAgent {
|
|
|
596
933
|
env.KNOWLEDGE_BASES_CONFIG = JSON.stringify(this.knowledgeBaseConfigs);
|
|
597
934
|
env.KNOWLEDGE_BASE_SYSTEM_PROMPT_ADDITION = (0, batch_agent_1.generateKnowledgeBaseSystemPromptAddition)(this.knowledgeBaseConfigs);
|
|
598
935
|
}
|
|
599
|
-
//
|
|
600
|
-
const
|
|
601
|
-
const agentLambdaLogPermissionsResult = utilities_1.LambdaIamUtils.createLogsPermissions({
|
|
602
|
-
account,
|
|
603
|
-
region,
|
|
936
|
+
// Deploy via hosting adapter
|
|
937
|
+
const hostingResult = hostingAdapter.deploy({
|
|
604
938
|
scope: this,
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
});
|
|
608
|
-
// Lambda Web Adapter layer
|
|
609
|
-
const webAdapterLayer = aws_lambda_1.LayerVersion.fromLayerVersionArn(this, 'LambdaWebAdapterLayer', `arn:aws:lambda:${region}:753240598075:layer:LambdaAdapterLayerX86:25`);
|
|
610
|
-
const allLayers = [webAdapterLayer];
|
|
611
|
-
if (props.agentDefinition.lambdaLayers) {
|
|
612
|
-
allLayers.push(...props.agentDefinition.lambdaLayers);
|
|
613
|
-
}
|
|
614
|
-
if (this.knowledgeBaseLayers.length > 0) {
|
|
615
|
-
allLayers.push(...this.knowledgeBaseLayers);
|
|
616
|
-
}
|
|
617
|
-
const handlerPath = path.join(__dirname, 'resources/interactive-agent-handler');
|
|
618
|
-
// All Python version references derived from DefaultRuntimes.PYTHON
|
|
619
|
-
const pythonRuntime = custom_resource_1.DefaultRuntimes.PYTHON;
|
|
620
|
-
const pyVersion = pythonRuntime.name.replace('python', ''); // e.g. "3.13"
|
|
621
|
-
this.agentFunction = new aws_lambda_1.Function(this, 'InteractiveAgentFunction', {
|
|
622
|
-
functionName: agentLambdaLogPermissionsResult.uniqueFunctionName,
|
|
623
|
-
architecture: props.architecture || aws_lambda_1.Architecture.X86_64,
|
|
624
|
-
code: aws_lambda_1.Code.fromAsset(handlerPath, {
|
|
625
|
-
bundling: {
|
|
626
|
-
image: pythonRuntime.bundlingImage,
|
|
627
|
-
command: [
|
|
628
|
-
'bash', '-c',
|
|
629
|
-
'pip install -r requirements.txt -t /asset-output && cp -a . /asset-output',
|
|
630
|
-
],
|
|
631
|
-
local: {
|
|
632
|
-
tryBundle(outputDir) {
|
|
633
|
-
try {
|
|
634
|
-
const proc = require('child_process'); // eslint-disable-line @typescript-eslint/no-require-imports
|
|
635
|
-
// Find a local Python >= 3.11 for pip (system default may be too old)
|
|
636
|
-
const pythonCandidates = [`python${pyVersion}`, 'python3', 'python'];
|
|
637
|
-
let pythonBin = 'python3';
|
|
638
|
-
for (const candidate of pythonCandidates) {
|
|
639
|
-
try {
|
|
640
|
-
const ver = proc.execSync(`${candidate} --version 2>&1`, { encoding: 'utf-8' }).trim();
|
|
641
|
-
const match = ver.match(/Python (\d+)\.(\d+)/);
|
|
642
|
-
if (match && (parseInt(match[1]) > 3 || (parseInt(match[1]) === 3 && parseInt(match[2]) >= 11))) {
|
|
643
|
-
pythonBin = candidate;
|
|
644
|
-
break;
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
catch {
|
|
648
|
-
continue;
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
proc.execSync(`${pythonBin} -m pip install -r requirements.txt -t "${outputDir}" --platform manylinux2014_x86_64 --only-binary=:all: --python-version ${pyVersion}`, { cwd: handlerPath, stdio: 'inherit' });
|
|
652
|
-
proc.execSync(`cp -r . "${outputDir}"`, { cwd: handlerPath, stdio: 'inherit' });
|
|
653
|
-
return true;
|
|
654
|
-
}
|
|
655
|
-
catch {
|
|
656
|
-
return false;
|
|
657
|
-
}
|
|
658
|
-
},
|
|
659
|
-
},
|
|
660
|
-
},
|
|
661
|
-
}),
|
|
662
|
-
role: this.agentRole,
|
|
663
|
-
handler: 'run.sh',
|
|
664
|
-
runtime: pythonRuntime,
|
|
665
|
-
layers: allLayers,
|
|
666
|
-
timeout: props.timeout || aws_cdk_lib_1.Duration.minutes(15),
|
|
667
|
-
memorySize: props.memorySize || 1024,
|
|
939
|
+
agentName: props.agentName,
|
|
940
|
+
agentRole: this.agentRole,
|
|
668
941
|
environment: env,
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
942
|
+
encryptionKey: this.encryptionKey,
|
|
943
|
+
network: props.network,
|
|
944
|
+
architecture: props.architecture,
|
|
945
|
+
memorySize: props.memorySize,
|
|
946
|
+
timeout: props.timeout,
|
|
672
947
|
reservedConcurrentExecutions: props.reservedConcurrentExecutions,
|
|
948
|
+
lambdaLayers: props.agentDefinition.lambdaLayers,
|
|
949
|
+
knowledgeBaseLayers: this.knowledgeBaseLayers,
|
|
950
|
+
enableObservability: props.enableObservability,
|
|
951
|
+
toolsConfig: JSON.stringify(this.agentToolsLocationDefinitions),
|
|
952
|
+
systemPromptBucket: props.agentDefinition.systemPrompt.s3BucketName,
|
|
953
|
+
systemPromptKey: props.agentDefinition.systemPrompt.s3ObjectKey,
|
|
954
|
+
knowledgeBaseConfigs: this.knowledgeBaseConfigs.length > 0 ? JSON.stringify(this.knowledgeBaseConfigs) : undefined,
|
|
955
|
+
knowledgeBaseSystemPromptAddition: this.knowledgeBaseConfigs.length > 0
|
|
956
|
+
? (0, batch_agent_1.generateKnowledgeBaseSystemPromptAddition)(this.knowledgeBaseConfigs)
|
|
957
|
+
: undefined,
|
|
958
|
+
removalPolicy: props.removalPolicy,
|
|
673
959
|
});
|
|
960
|
+
this.apiEndpoint = hostingResult.endpoint;
|
|
961
|
+
this.agentFunction = hostingResult.agentFunction;
|
|
962
|
+
this.cfnRuntime = hostingResult.cfnRuntime;
|
|
963
|
+
// Set adapter and authenticator references for backward compatibility
|
|
964
|
+
if (hostingAdapter instanceof LambdaHostingAdapter) {
|
|
965
|
+
this.adapter = hostingAdapter.communicationAdapter;
|
|
966
|
+
this.authenticator = hostingAdapter.authenticator;
|
|
967
|
+
}
|
|
674
968
|
// Grant system prompt read access
|
|
675
969
|
props.agentDefinition.systemPrompt.grantRead(this.agentRole);
|
|
676
|
-
// Grant log permissions
|
|
677
|
-
for (const s of agentLambdaLogPermissionsResult.policyStatements) {
|
|
678
|
-
this.agentRole.addToPrincipalPolicy(s);
|
|
679
|
-
}
|
|
680
970
|
// Grant session store access
|
|
681
971
|
if (this.sessionStore) {
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
972
|
+
if (this.agentFunction) {
|
|
973
|
+
this.sessionStore.grantReadWrite(this.agentFunction);
|
|
974
|
+
}
|
|
975
|
+
else if (this.sessionBucket) {
|
|
976
|
+
// For AgentCore hosting, grant the agent role direct S3 access
|
|
977
|
+
this.sessionBucket.grantReadWrite(this.agentRole);
|
|
978
|
+
}
|
|
687
979
|
}
|
|
688
|
-
// Attach communication adapter and get endpoint
|
|
689
|
-
this.apiEndpoint = this.adapter.attachToFunction(this.agentFunction);
|
|
690
|
-
this.adapter.grantInvoke(this.agentFunction);
|
|
691
980
|
}
|
|
692
981
|
/**
|
|
693
982
|
* Validates InteractiveAgent props.
|
|
@@ -711,6 +1000,6 @@ class InteractiveAgent extends base_agent_1.BaseAgent {
|
|
|
711
1000
|
}
|
|
712
1001
|
}
|
|
713
1002
|
exports.InteractiveAgent = InteractiveAgent;
|
|
714
|
-
|
|
715
|
-
InteractiveAgent[
|
|
716
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9pbnRlcmFjdGl2ZS1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkJBQTZCO0FBQzdCLDZDQUE2RDtBQUM3RCwrREFRb0M7QUFDcEMseURBQXlIO0FBQ3pILGlEQUFnRjtBQUVoRix1REFBOEc7QUFDOUcsK0NBQTBGO0FBRTFGLDZDQUF5RDtBQUN6RCwrQ0FBMEU7QUFDMUUsaUVBQTREO0FBQzVELCtDQUFtRTtBQUNuRSxpRUFBMkU7QUFDM0Usd0NBQStDO0FBQy9DLHdEQUFxRDtBQTREckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFhLG9CQUFvQjtJQWMvQixZQUFZLFFBQW1DLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLGNBQXlCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1RkFBdUYsQ0FBQyxDQUFDO1FBQzNHLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUM7UUFFakQsNEJBQTRCO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksd0JBQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUNqRCxXQUFXLEVBQUUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxVQUFVO1lBQ3hELFdBQVcsRUFBRSxvREFBb0Q7WUFDakUsYUFBYSxFQUFFO2dCQUNiLFNBQVM7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TyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxJQUFJLGNBQWMsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuSCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7O0FBck9ILDRDQXNPQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IER1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25UeXBlLFxuICBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplcixcbiAgQ29ycyxcbiAgR2F0ZXdheVJlc3BvbnNlLFxuICBMYW1iZGFJbnRlZ3JhdGlvbixcbiAgUmVzcG9uc2VUeXBlLFxuICBSZXN0QXBpLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQgeyBVc2VyUG9vbCwgVXNlclBvb2xDbGllbnQsIE1mYSwgQWNjb3VudFJlY292ZXJ5LCBVc2VyUG9vbENsaWVudElkZW50aXR5UHJvdmlkZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29nbml0byc7XG5pbXBvcnQgeyBTZXJ2aWNlUHJpbmNpcGFsLCBQb2xpY3lTdGF0ZW1lbnQsIEVmZmVjdCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgSUtleSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHsgSUZ1bmN0aW9uLCBBcmNoaXRlY3R1cmUsIElMYXllclZlcnNpb24sIExheWVyVmVyc2lvbiwgRnVuY3Rpb24sIENvZGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IElCdWNrZXQsIEJ1Y2tldCwgQnVja2V0RW5jcnlwdGlvbiwgQmxvY2tQdWJsaWNBY2Nlc3MgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCYXNlQWdlbnQsIEJhc2VBZ2VudFByb3BzIH0gZnJvbSAnLi9iYXNlLWFnZW50JztcbmltcG9ydCB7IGdlbmVyYXRlS25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uIH0gZnJvbSAnLi9iYXRjaC1hZ2VudCc7XG5pbXBvcnQgeyBEZWZhdWx0QWdlbnRDb25maWcgfSBmcm9tICcuL2RlZmF1bHQtYWdlbnQtY29uZmlnJztcbmltcG9ydCB7IExhbWJkYUlhbVV0aWxzLCBQb3dlcnRvb2xzQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzJztcbmltcG9ydCB7IERlZmF1bHRPYnNlcnZhYmlsaXR5Q29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL29ic2VydmFiaWxpdHknO1xuaW1wb3J0IHsgQmVkcm9ja01vZGVsVXRpbHMgfSBmcm9tICcuLi9iZWRyb2NrJztcbmltcG9ydCB7IERlZmF1bHRSdW50aW1lcyB9IGZyb20gJy4uL2N1c3RvbS1yZXNvdXJjZSc7XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBwbHVnZ2FibGUgY29tbXVuaWNhdGlvbiBtZWNoYW5pc21zLlxuICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBTdHJlYW1pbmdIdHRwQWRhcHRlciAoQVBJIEdhdGV3YXkgUkVTVCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb21tdW5pY2F0aW9uQWRhcHRlciB7XG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIGFkYXB0ZXIgdG8gYSBMYW1iZGEgZnVuY3Rpb24gYW5kIGNyZWF0ZSBjb21tdW5pY2F0aW9uIGluZnJhc3RydWN0dXJlLlxuICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMgZW5kcG9pbnQgVVJMIGZvciBjbGllbnQgY29ubmVjdGlvbnMuXG4gICAqL1xuICBhdHRhY2hUb0Z1bmN0aW9uKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBMYW1iZGEgZnVuY3Rpb24gcGVybWlzc2lvbiB0byBzZW5kIHJlc3BvbnNlcyBiYWNrIHRvIGNsaWVudHMuXG4gICAqL1xuICBncmFudEludm9rZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaHJvdHRsZSBzZXR0aW5ncyBmb3IgUkVTVCBBUEkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyb3R0bGVTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBSYXRlIGxpbWl0IChyZXF1ZXN0cyBwZXIgc2Vjb25kKS5cbiAgICovXG4gIHJlYWRvbmx5IHJhdGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogQnVyc3QgbGltaXQgKG1heGltdW0gY29uY3VycmVudCByZXF1ZXN0cykuXG4gICAqL1xuICByZWFkb25seSBidXJzdExpbWl0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgU3RyZWFtaW5nSHR0cEFkYXB0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtaW5nSHR0cEFkYXB0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBSRVNUIEFQSSBzdGFnZSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAncHJvZCdcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhyb3R0bGUgc2V0dGluZ3MgZm9yIFJFU1QgQVBJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyB0aHJvdHRsaW5nXG4gICAqL1xuICByZWFkb25seSB0aHJvdHRsZT86IFRocm90dGxlU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIEFQSSBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFVzZXMgYXV0aGVudGljYXRvciBmcm9tIEludGVyYWN0aXZlQWdlbnRcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3I/OiBJQXV0aGVudGljYXRvcjtcbn1cblxuLyoqXG4gKiBTdHJlYW1pbmcgSFRUUCBhZGFwdGVyIGZvciByZWFsLXRpbWUgYWdlbnQgY29tbXVuaWNhdGlvbiB2aWEgU1NFLlxuICpcbiAqIFRoaXMgYWRhcHRlciBjcmVhdGVzIGFuIEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nIGVuYWJsZWQsXG4gKiBhbGxvd2luZyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHN0cmVhbSBTU0UgKFNlcnZlci1TZW50IEV2ZW50cykgcmVzcG9uc2VzXG4gKiBiYWNrIHRvIGNsaWVudHMgYXMgdGhlIFN0cmFuZHMgQWdlbnQgZ2VuZXJhdGVzIHRva2Vucy5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCDihpIgUE9TVCAvY2hhdCDihpIgQVBJIEdhdGV3YXkgUkVTVCBBUEkgKFNUUkVBTSBtb2RlKSDihpIgTGFtYmRhIChGYXN0QVBJICsgTFdBKSDihpIgQmVkcm9ja1xuICogQ2xpZW50IOKGkCBTU0Ugc3RyZWFtIOKGkCBBUEkgR2F0ZXdheSDihpAgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyDihpAgQWdlbnQgdG9rZW5zXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipSZXNwb25zZSBTdHJlYW1pbmcqKjogUHJvZ3Jlc3NpdmUgU1NFIGRlbGl2ZXJ5IHZpYSBBUEkgR2F0ZXdheSByZXNwb25zZSBzdHJlYW1pbmdcbiAqIC0gKioxNS1NaW51dGUgVGltZW91dCoqOiBFeHRlbmRlZCB0aW1lb3V0IGZvciBsb25nLXJ1bm5pbmcgYWdlbnQgY29udmVyc2F0aW9uc1xuICogLSAqKkNvZ25pdG8gQXV0aCoqOiBOYXRpdmUgQ09HTklUT19VU0VSX1BPT0xTIGF1dGhvcml6ZXIgb24gUkVTVCBBUElcbiAqIC0gKipDT1JTKio6IEJ1aWx0LWluIENPUlMgc3VwcG9ydCBmb3IgYnJvd3NlciBjbGllbnRzXG4gKiAtICoqVGhyb3R0bGluZyoqOiBDb25maWd1cmFibGUgcmF0ZSBhbmQgYnVyc3QgbGltaXRzXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBTdHJlYW1pbmdIdHRwQWRhcHRlciB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgU3RyZWFtaW5nSHR0cEFkYXB0ZXIoe1xuICogICBzdGFnZU5hbWU6ICdwcm9kJyxcbiAqICAgdGhyb3R0bGU6IHsgcmF0ZUxpbWl0OiAxMDAsIGJ1cnN0TGltaXQ6IDIwMCB9XG4gKiB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnQ2hhdEFnZW50JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgY29tbXVuaWNhdGlvbkFkYXB0ZXI6IGFkYXB0ZXJcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1pbmdIdHRwQWRhcHRlciBpbXBsZW1lbnRzIElDb21tdW5pY2F0aW9uQWRhcHRlciB7XG4gIC8qKlxuICAgKiBUaGUgUkVTVCBBUEkgR2F0ZXdheS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN0QXBpPzogUmVzdEFwaTtcblxuICAvKipcbiAgICogVGhlIEFQSSBlbmRwb2ludCBVUkwuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpRW5kcG9pbnQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogU3RyZWFtaW5nSHR0cEFkYXB0ZXJQcm9wcztcbiAgcHJpdmF0ZSBzY29wZT86IENvbnN0cnVjdDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogU3RyZWFtaW5nSHR0cEFkYXB0ZXJQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGUgYWRhcHRlciB0byBhIExhbWJkYSBmdW5jdGlvbiBhbmQgY3JlYXRlIFJFU1QgQVBJIGluZnJhc3RydWN0dXJlLlxuICAgKiBDcmVhdGVzIEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggUE9TVCAvY2hhdCBlbmRwb2ludCBhbmQgcmVzcG9uc2Ugc3RyZWFtaW5nLlxuICAgKi9cbiAgYXR0YWNoVG9GdW5jdGlvbihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2NvcGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3RyZWFtaW5nSHR0cEFkYXB0ZXIgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgc2NvcGUgYmVmb3JlIGNhbGxpbmcgYXR0YWNoVG9GdW5jdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWdlTmFtZSA9IHRoaXMucHJvcHMuc3RhZ2VOYW1lIHx8ICdwcm9kJztcblxuICAgIC8vIENyZWF0ZSBSRVNUIEFQSSB3aXRoIENPUlNcbiAgICBjb25zdCByZXN0QXBpID0gbmV3IFJlc3RBcGkodGhpcy5zY29wZSwgJ0NoYXRBcGknLCB7XG4gICAgICByZXN0QXBpTmFtZTogYCR7U3RhY2sub2YodGhpcy5zY29wZSkuc3RhY2tOYW1lfS1DaGF0QXBpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJhY3RpdmUgQWdlbnQgQ2hhdCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcnLFxuICAgICAgZGVwbG95T3B0aW9uczoge1xuICAgICAgICBzdGFnZU5hbWUsXG4gICAgICAgIHRocm90dGxpbmdSYXRlTGltaXQ6IHRoaXMucHJvcHMudGhyb3R0bGU/LnJhdGVMaW1pdCxcbiAgICAgICAgdGhyb3R0bGluZ0J1cnN0TGltaXQ6IHRoaXMucHJvcHMudGhyb3R0bGU/LmJ1cnN0TGltaXQsXG4gICAgICB9LFxuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogQ29ycy5BTExfT1JJR0lOUyxcbiAgICAgICAgYWxsb3dNZXRob2RzOiBbJ1BPU1QnLCAnT1BUSU9OUyddLFxuICAgICAgICBhbGxvd0hlYWRlcnM6IFsnQ29udGVudC1UeXBlJywgJ0F1dGhvcml6YXRpb24nXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgKHRoaXMgYXMgYW55KS5yZXN0QXBpID0gcmVzdEFwaTtcblxuICAgIC8vIEFkZCBDT1JTIGhlYWRlcnMgdG8gQVBJIEdhdGV3YXkgZXJyb3IgcmVzcG9uc2VzICg0WFgvNVhYKS5cbiAgICAvLyBXaXRob3V0IHRoZXNlLCB0aGUgQ29nbml0byBhdXRob3JpemVyJ3MgNDAxIHJlc3BvbnNlIHdvbid0IGluY2x1ZGVcbiAgICAvLyBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4gYW5kIHRoZSBicm93c2VyIHdpbGwgYmxvY2sgaXQgYXMgYSBDT1JTIGVycm9yLlxuICAgIG5ldyBHYXRld2F5UmVzcG9uc2UodGhpcy5zY29wZSwgJ0dhdGV3YXlEZWZhdWx0NFhYJywge1xuICAgICAgcmVzdEFwaSxcbiAgICAgIHR5cGU6IFJlc3BvbnNlVHlwZS5ERUZBVUxUXzRYWCxcbiAgICAgIHJlc3BvbnNlSGVhZGVyczoge1xuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogXCInKidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiBcIidDb250ZW50LVR5cGUsQXV0aG9yaXphdGlvbidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiBcIidQT1NULE9QVElPTlMnXCIsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIG5ldyBHYXRld2F5UmVzcG9uc2UodGhpcy5zY29wZSwgJ0dhdGV3YXlEZWZhdWx0NVhYJywge1xuICAgICAgcmVzdEFwaSxcbiAgICAgIHR5cGU6IFJlc3BvbnNlVHlwZS5ERUZBVUxUXzVYWCxcbiAgICAgIHJlc3BvbnNlSGVhZGVyczoge1xuICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogXCInKidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiBcIidDb250ZW50LVR5cGUsQXV0aG9yaXphdGlvbidcIixcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiBcIidQT1NULE9QVElPTlMnXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIExhbWJkYSBpbnRlZ3JhdGlvblxuICAgIGNvbnN0IGxhbWJkYUludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKGxhbWJkYUZ1bmN0aW9uLCB7XG4gICAgICBwcm94eTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIEFkZCAvY2hhdCByZXNvdXJjZSB3aXRoIFBPU1QgbWV0aG9kXG4gICAgY29uc3QgY2hhdFJlc291cmNlID0gcmVzdEFwaS5yb290LmFkZFJlc291cmNlKCdjaGF0Jyk7XG5cbiAgICAvLyBEZXRlcm1pbmUgYXV0aG9yaXphdGlvbiB0eXBlXG4gICAgbGV0IGF1dGhvcml6YXRpb25UeXBlID0gQXV0aG9yaXphdGlvblR5cGUuTk9ORTtcbiAgICBsZXQgYXV0aG9yaXplcjogQ29nbml0b1VzZXJQb29sc0F1dGhvcml6ZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5hdXRoZW50aWNhdG9yIGluc3RhbmNlb2YgQ29nbml0b0F1dGhlbnRpY2F0b3IgJiYgdGhpcy5wcm9wcy5hdXRoZW50aWNhdG9yLnVzZXJQb29sKSB7XG4gICAgICBhdXRob3JpemVyID0gbmV3IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyKHRoaXMuc2NvcGUsICdDb2duaXRvQXV0aG9yaXplcicsIHtcbiAgICAgICAgY29nbml0b1VzZXJQb29sczogW3RoaXMucHJvcHMuYXV0aGVudGljYXRvci51c2VyUG9vbF0sXG4gICAgICAgIGF1dGhvcml6ZXJOYW1lOiAnQ29nbml0b0F1dGhvcml6ZXInLFxuICAgICAgfSk7XG4gICAgICBhdXRob3JpemF0aW9uVHlwZSA9IEF1dGhvcml6YXRpb25UeXBlLkNPR05JVE87XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdE1ldGhvZCA9IGNoYXRSZXNvdXJjZS5hZGRNZXRob2QoJ1BPU1QnLCBsYW1iZGFJbnRlZ3JhdGlvbiwge1xuICAgICAgYXV0aG9yaXphdGlvblR5cGUsXG4gICAgICBhdXRob3JpemVyLFxuICAgIH0pO1xuXG4gICAgLy8gQ29uZmlndXJlIHJlc3BvbnNlIHN0cmVhbWluZyB2aWEgQ2ZuTWV0aG9kIGVzY2FwZSBoYXRjaFxuICAgIC8vIEFQSSBHYXRld2F5IFJFU1QgQVBJIHJlc3BvbnNlIHN0cmVhbWluZyByZXF1aXJlczpcbiAgICAvLyAxLiByZXNwb25zZVRyYW5zZmVyTW9kZTogU1RSRUFNIG9uIHRoZSBpbnRlZ3JhdGlvblxuICAgIC8vIDIuIEludGVncmF0aW9uIFVSSSBwb2ludGluZyB0byAvcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zXG4gICAgY29uc3QgY2ZuTWV0aG9kID0gcG9zdE1ldGhvZC5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhbnk7XG4gICAgaWYgKGNmbk1ldGhvZCkge1xuICAgICAgY2ZuTWV0aG9kLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ0ludGVncmF0aW9uLlJlc3BvbnNlVHJhbnNmZXJNb2RlJywgJ1NUUkVBTScpO1xuICAgICAgLy8gT3ZlcnJpZGUgdGhlIGludGVncmF0aW9uIFVSSSB0byB1c2UgcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zIHBhdGhcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMuc2NvcGUpLnJlZ2lvbjtcbiAgICAgIGNmbk1ldGhvZC5hZGRQcm9wZXJ0eU92ZXJyaWRlKFxuICAgICAgICAnSW50ZWdyYXRpb24uVXJpJyxcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06bGFtYmRhOnBhdGgvMjAyMS0xMS0xNS9mdW5jdGlvbnMvJHtsYW1iZGFGdW5jdGlvbi5mdW5jdGlvbkFybn0vcmVzcG9uc2Utc3RyZWFtaW5nLWludm9jYXRpb25zYCxcbiAgICAgICk7XG4gICAgICAvLyBTZXQgaW50ZWdyYXRpb24gdGltZW91dCB0byAxNSBtaW51dGVzICg5MDAwMDAgbXMpXG4gICAgICBjZm5NZXRob2QuYWRkUHJvcGVydHlPdmVycmlkZSgnSW50ZWdyYXRpb24uVGltZW91dEluTWlsbGlzJywgOTAwMDAwKTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBBUEkgR2F0ZXdheSBwZXJtaXNzaW9uIHRvIGludm9rZSBMYW1iZGEgd2l0aCByZXNwb25zZSBzdHJlYW1pbmdcbiAgICBsYW1iZGFGdW5jdGlvbi5hZGRQZXJtaXNzaW9uKCdBcGlHYXRld2F5SW52b2tlJywge1xuICAgICAgcHJpbmNpcGFsOiBuZXcgU2VydmljZVByaW5jaXBhbCgnYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tJyksXG4gICAgICBzb3VyY2VBcm46IHJlc3RBcGkuYXJuRm9yRXhlY3V0ZUFwaSgpLFxuICAgIH0pO1xuXG4gICAgLy8gQWxzbyBncmFudCBJbnZva2VXaXRoUmVzcG9uc2VTdHJlYW0gcGVybWlzc2lvblxuICAgIGxhbWJkYUZ1bmN0aW9uLmFkZFBlcm1pc3Npb24oJ0FwaUdhdGV3YXlTdHJlYW1JbnZva2UnLCB7XG4gICAgICBwcmluY2lwYWw6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdhcGlnYXRld2F5LmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIHNvdXJjZUFybjogcmVzdEFwaS5hcm5Gb3JFeGVjdXRlQXBpKCdQT1NUJywgJy9jaGF0JyksXG4gICAgICBhY3Rpb246ICdsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmwnLFxuICAgIH0pO1xuXG4gICAgLy8gQ29uc3RydWN0IGVuZHBvaW50IFVSTFxuICAgIGNvbnN0IHVybCA9IHJlc3RBcGkudXJsRm9yUGF0aCgnL2NoYXQnKTtcbiAgICAodGhpcyBhcyBhbnkpLmFwaUVuZHBvaW50ID0gdXJsO1xuXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb25zIGZvciBBUEkgR2F0ZXdheSBpbnRlZ3JhdGlvbi5cbiAgICogRm9yIFJFU1QgQVBJIHN0cmVhbWluZywgbm8gYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcmUgbmVlZGVkIGJleW9uZCB0aGUgaW52b2tlIHBlcm1pc3Npb24uXG4gICAqL1xuICBncmFudEludm9rZShfbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIC8vIFJFU1QgQVBJIHN0cmVhbWluZyBkb2Vzbid0IG5lZWQgcG9zdF90b19jb25uZWN0aW9uIGxpa2UgV2ViU29ja2V0LlxuICAgIC8vIFRoZSBMYW1iZGEgaW52b2tlIHBlcm1pc3Npb24gaXMgYWxyZWFkeSBncmFudGVkIGluIGF0dGFjaFRvRnVuY3Rpb24uXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciB3aXRoIGEgQ0RLIHNjb3BlLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYXR0YWNoVG9GdW5jdGlvbiBvciBncmFudEludm9rZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3NldFNjb3BlKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIHNlc3Npb24gcGVyc2lzdGVuY2UuXG4gKlxuICogU2Vzc2lvbiBzdG9yZXMgbWFuYWdlIGNvbnZlcnNhdGlvbiBzdGF0ZSBwZXJzaXN0ZW5jZSBhY3Jvc3MgSFRUUCByZXF1ZXN0cy5cbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIChTM1Nlc3Npb25NYW5hZ2VyKSB1c2VzIFMzIGZvciBkdXJhYmxlIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNlc3Npb25TdG9yZSB7XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHVzZWQgZm9yIHNlc3Npb24gc3RvcmFnZSAoaWYgUzMtYmFzZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkJ1Y2tldD86IElCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFGdW5jdGlvbiAtIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHNlc3Npb24gc3RvcmVcbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgUzNTZXNzaW9uTWFuYWdlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM1Nlc3Npb25NYW5hZ2VyUHJvcHMge1xuICAvKipcbiAgICogUzMgYnVja2V0IGZvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBidWNrZXQgd2l0aCBLTVMgZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGltZS10by1saXZlIGZvciBzZXNzaW9ucy5cbiAgICogU2Vzc2lvbnMgb2xkZXIgdGhhbiB0aGlzIGR1cmF0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWxldGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5ob3VycygyNClcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25UVEw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogS01TIGVuY3J5cHRpb24ga2V5IGZvciB0aGUgc2Vzc2lvbiBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBLTVMga2V5IHdpdGggcm90YXRpb24gZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IElLZXk7XG5cbiAgLyoqXG4gICAqIFJlbW92YWwgcG9saWN5IGZvciB0aGUgc2Vzc2lvbiBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG59XG5cbi8qKlxuICogUzMtYmFzZWQgc2Vzc2lvbiBtYW5hZ2VyIGZvciBwZXJzaXN0aW5nIGNvbnZlcnNhdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2VzIFMzIGZvciBkdXJhYmxlIHN0b3JhZ2Ugb2Ygc2Vzc2lvbiBkYXRhIHdpdGggYXV0b21hdGljIGV4cGlyYXRpb25cbiAqIHZpYSBsaWZlY3ljbGUgcG9saWNpZXMuIEVhY2ggSFRUUCByZXF1ZXN0IGxvYWRzL3NhdmVzIHNlc3Npb24gc3RhdGUsXG4gKiBlbmFibGluZyBtdWx0aS10dXJuIGNvbnZlcnNhdGlvbnMgb3ZlciBzdGF0ZWxlc3MgSFRUUC5cbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipEdXJhYmxlIFN0b3JhZ2UqKjogU2Vzc2lvbnMgcGVyc2lzdGVkIHRvIFMzIHN1cnZpdmUgTGFtYmRhIHJlc3RhcnRzXG4gKiAtICoqQXV0b21hdGljIEV4cGlyYXRpb24qKjogTGlmZWN5Y2xlIHBvbGljeSByZW1vdmVzIG9sZCBzZXNzaW9uc1xuICogLSAqKkVuY3J5cHRpb24qKjogS01TIGVuY3J5cHRpb24gYXQgcmVzdFxuICogLSAqKkNvc3QgT3B0aW1pemF0aW9uKio6IFMzIFN0YW5kYXJkIHN0b3JhZ2Ugd2l0aCBsaWZlY3ljbGUgbWFuYWdlbWVudFxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIFMzU2Vzc2lvbk1hbmFnZXIgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKiBpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IHNlc3Npb25NYW5hZ2VyID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIodGhpcywgJ1Nlc3Npb25NYW5hZ2VyJywge1xuICogICBzZXNzaW9uVFRMOiBEdXJhdGlvbi5ob3Vycyg0OClcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBzZXNzaW9uU3RvcmU6IHNlc3Npb25NYW5hZ2VyXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUzNTZXNzaW9uTWFuYWdlciBpbXBsZW1lbnRzIElTZXNzaW9uU3RvcmUge1xuICAvKipcbiAgICogVGhlIFMzIGJ1Y2tldCB1c2VkIGZvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vzc2lvbiBUVEwgZHVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvblRUTDogRHVyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFMzU2Vzc2lvbk1hbmFnZXJQcm9wcyA9IHt9KSB7XG4gICAgY29uc3QgcmVtb3ZhbFBvbGljeSA9IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuICAgIGNvbnN0IHNlc3Npb25UVEwgPSBwcm9wcy5zZXNzaW9uVFRMIHx8IER1cmF0aW9uLmhvdXJzKDI0KTtcblxuICAgIC8vIFVzZSBwcm92aWRlZCBidWNrZXQgb3IgY3JlYXRlIG5ldyBvbmVcbiAgICB0aGlzLmJ1Y2tldCA9IHByb3BzLmJ1Y2tldCB8fCBuZXcgQnVja2V0KHNjb3BlLCBgJHtpZH1CdWNrZXRgLCB7XG4gICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICByZW1vdmFsUG9saWN5OiByZW1vdmFsUG9saWN5LFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHJlbW92YWxQb2xpY3kgPT09IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0RlbGV0ZU9sZFNlc3Npb25zJyxcbiAgICAgICAgICBleHBpcmF0aW9uOiBzZXNzaW9uVFRMLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgIHZlcnNpb25lZDogZmFsc2UsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXNzaW9uVFRMID0gc2Vzc2lvblRUTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHVzZWQgZm9yIHNlc3Npb24gc3RvcmFnZSAoSVNlc3Npb25TdG9yZSBpbnRlcmZhY2UpLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXNzaW9uQnVja2V0KCk6IElCdWNrZXQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGxhbWJkYUZ1bmN0aW9uKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgY29udmVyc2F0aW9uIGhpc3RvcnkgbWFuYWdlbWVudC5cbiAqXG4gKiBDb250ZXh0IHN0cmF0ZWdpZXMgY29udHJvbCBob3cgY29udmVyc2F0aW9uIGhpc3RvcnkgaXMgbWFpbnRhaW5lZCBhbmQgcHJvdmlkZWRcbiAqIHRvIHRoZSBhZ2VudC4gRGlmZmVyZW50IHN0cmF0ZWdpZXMgZW5hYmxlIGRpZmZlcmVudCBjb252ZXJzYXRpb24gcGF0dGVybnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRleHRTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGNvbmZpZ3VyZSB0aGUgY29udGV4dCBtYW5hZ2VyXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB0byBrZWVwIGluIGNvbnZlcnNhdGlvbiBoaXN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAyMCBtZXNzYWdlc1xuICAgKi9cbiAgcmVhZG9ubHkgd2luZG93U2l6ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTbGlkaW5nIHdpbmRvdyBjb252ZXJzYXRpb24gbWFuYWdlciBmb3IgbWFpbnRhaW5pbmcgcmVjZW50IGNvbnZlcnNhdGlvbiBoaXN0b3J5LlxuICpcbiAqIEtlZXBzIGEgZml4ZWQtc2l6ZSB3aW5kb3cgb2YgcmVjZW50IG1lc3NhZ2VzLCBhdXRvbWF0aWNhbGx5IGRpc2NhcmRpbmcgb2xkZXJcbiAqIG1lc3NhZ2VzIGFzIG5ldyBvbmVzIGFycml2ZS4gUHJvdmlkZXMgY29uc2lzdGVudCBjb250ZXh0IHNpemUgZm9yIHRoZSBhZ2VudC5cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50LCBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciB9IGZyb20gJ0BjZGtsYWJzL2Nkay1hcHBtb2QtY2F0YWxvZy1ibHVlcHJpbnRzJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IGNvbnRleHRNYW5hZ2VyID0gbmV3IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyKHsgd2luZG93U2l6ZTogMzAgfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIGNvbnRleHRTdHJhdGVneTogY29udGV4dE1hbmFnZXJcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb250ZXh0U3RyYXRlZ3kge1xuICAvKipcbiAgICogVGhlIHdpbmRvdyBzaXplIChudW1iZXIgb2YgbWVzc2FnZXMgdG8ga2VlcCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2luZG93U2l6ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlclByb3BzID0ge30pIHtcbiAgICBjb25zdCB3aW5kb3dTaXplID0gcHJvcHMud2luZG93U2l6ZSAhPT0gdW5kZWZpbmVkID8gcHJvcHMud2luZG93U2l6ZSA6IDIwO1xuXG4gICAgaWYgKHdpbmRvd1NpemUgPCAxIHx8IHdpbmRvd1NpemUgPiAxMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpbmRvd1NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnKTtcbiAgICB9XG5cbiAgICB0aGlzLndpbmRvd1NpemUgPSB3aW5kb3dTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENPTlRFWFRfRU5BQkxFRDogJ3RydWUnLFxuICAgICAgQ09OVEVYVF9TVFJBVEVHWTogJ1NsaWRpbmdXaW5kb3cnLFxuICAgICAgQ09OVEVYVF9XSU5ET1dfU0laRTogdGhpcy53aW5kb3dTaXplLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIE51bGwgY29udmVyc2F0aW9uIG1hbmFnZXIgZm9yIHN0YXRlbGVzcyBpbnRlcmFjdGlvbnMuXG4gKlxuICogRGlzYWJsZXMgY29udmVyc2F0aW9uIGhpc3RvcnksIHRyZWF0aW5nIGVhY2ggbWVzc2FnZSBhcyBpbmRlcGVuZGVudC5cbiAqIFVzZWZ1bCBmb3Igc3RhdGVsZXNzIHVzZSBjYXNlcyB3aGVyZSBjb250ZXh0IGlzIG5vdCBuZWVkZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdWxsQ29udmVyc2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb250ZXh0U3RyYXRlZ3kge1xuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQ09OVEVYVF9FTkFCTEVEOiAnZmFsc2UnLFxuICAgICAgQ09OVEVYVF9TVFJBVEVHWTogJ051bGwnLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMuXG4gKlxuICogQXV0aGVudGljYXRvcnMgY29udHJvbCBob3cgQVBJIGVuZHBvaW50cyBhcmUgc2VjdXJlZC5cbiAqIERpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydCB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhlbnRpY2F0b3Ige1xuICAvKipcbiAgICogR3JhbnQgYXV0aGVudGljYXRpb24gcGVybWlzc2lvbnMgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBncmFudEF1dGhlbnRpY2F0ZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZDtcblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgQ29nbml0b0F1dGhlbnRpY2F0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nbml0b0F1dGhlbnRpY2F0b3JQcm9wcyB7XG4gIC8qKlxuICAgKiBDb2duaXRvIFVzZXIgUG9vbCBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBVc2VyIFBvb2wgd2l0aCBzZWN1cmUgZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJQb29sPzogVXNlclBvb2w7XG5cbiAgLyoqXG4gICAqIENvZ25pdG8gVXNlciBQb29sIENsaWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIGNsaWVudCB3aXRoIGFwcHJvcHJpYXRlIGF1dGggZmxvd3NcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJQb29sQ2xpZW50PzogVXNlclBvb2xDbGllbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92YWwgcG9saWN5IGZvciBDb2duaXRvIHJlc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBDb2duaXRvLWJhc2VkIGF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIFJFU1QgQVBJIGVuZHBvaW50cy5cbiAqXG4gKiBDcmVhdGVzIGEgQ29nbml0byBVc2VyIFBvb2wgYW5kIGludGVncmF0ZXMgd2l0aCBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICogdXNpbmcgdGhlIG5hdGl2ZSBDT0dOSVRPX1VTRVJfUE9PTFMgYXV0aG9yaXplciB0eXBlLiBDbGllbnRzIHNlbmRcbiAqIEpXVCB0b2tlbnMgaW4gdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLlxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKk5hdGl2ZSBKV1QgVmFsaWRhdGlvbioqOiBBUEkgR2F0ZXdheSB2YWxpZGF0ZXMgdG9rZW5zIHdpdGhvdXQgY3VzdG9tIExhbWJkYVxuICogLSAqKlVzZXIgTWFuYWdlbWVudCoqOiBCdWlsdC1pbiB1c2VyIHJlZ2lzdHJhdGlvbiBhbmQgbWFuYWdlbWVudFxuICogLSAqKlBhc3N3b3JkIFBvbGljaWVzKio6IEVuZm9yY2VzIHN0cm9uZyBwYXNzd29yZCByZXF1aXJlbWVudHNcbiAqIC0gKipBY2NvdW50IFJlY292ZXJ5Kio6IEVtYWlsLWJhc2VkIGFjY291bnQgcmVjb3ZlcnlcbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWInO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgQ29nbml0b0F1dGhlbnRpY2F0b3IgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBhdXRoZW50aWNhdG9yID0gbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKHtcbiAqICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU5cbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBhdXRoZW50aWNhdG9yXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29nbml0b0F1dGhlbnRpY2F0b3IgaW1wbGVtZW50cyBJQXV0aGVudGljYXRvciB7XG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBVc2VyIFBvb2wuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2w/OiBVc2VyUG9vbDtcblxuICAvKipcbiAgICogVGhlIENvZ25pdG8gVXNlciBQb29sIENsaWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbENsaWVudD86IFVzZXJQb29sQ2xpZW50O1xuXG4gIHByaXZhdGUgc2NvcGU/OiBDb25zdHJ1Y3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ29nbml0b0F1dGhlbnRpY2F0b3JQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy51c2VyUG9vbCA9IHByb3BzLnVzZXJQb29sO1xuICAgIHRoaXMudXNlclBvb2xDbGllbnQgPSBwcm9wcy51c2VyUG9vbENsaWVudDtcbiAgICB0aGlzLnJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBhdXRoZW50aWNhdGlvbiBwZXJtaXNzaW9ucyB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICogR3JhbnRzIHBlcm1pc3Npb25zIHRvIHZlcmlmeSBDb2duaXRvIHRva2Vucy5cbiAgICovXG4gIGdyYW50QXV0aGVudGljYXRlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2NvcGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29nbml0b0F1dGhlbnRpY2F0b3IgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgc2NvcGUgYmVmb3JlIGNhbGxpbmcgZ3JhbnRBdXRoZW50aWNhdGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlclBvb2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBQb29sIG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgZ3JhbnRpbmcgcGVybWlzc2lvbnMuIENhbGwgX3NldFNjb3BlIGZpcnN0LicpO1xuICAgIH1cblxuICAgIGxhbWJkYUZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdjb2duaXRvLWlkcDpHZXRVc2VyJyxcbiAgICAgICAgICAnY29nbml0by1pZHA6QWRtaW5HZXRVc2VyJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy51c2VyUG9vbC51c2VyUG9vbEFybl0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFVVEhfVFlQRTogJ0NvZ25pdG8nLFxuICAgICAgVVNFUl9QT09MX0lEOiB0aGlzLnVzZXJQb29sPy51c2VyUG9vbElkIHx8ICcnLFxuICAgICAgVVNFUl9QT09MX0NMSUVOVF9JRDogdGhpcy51c2VyUG9vbENsaWVudD8udXNlclBvb2xDbGllbnRJZCB8fCAnJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGF1dGhlbnRpY2F0b3Igd2l0aCBhIENESyBzY29wZS5cbiAgICogQ3JlYXRlcyBVc2VyIFBvb2wgYW5kIENsaWVudCBpZiBub3QgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zZXRTY29wZShzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuXG4gICAgaWYgKCF0aGlzLnVzZXJQb29sKSB7XG4gICAgICAodGhpcyBhcyBhbnkpLnVzZXJQb29sID0gbmV3IFVzZXJQb29sKHNjb3BlLCAnVXNlclBvb2wnLCB7XG4gICAgICAgIHVzZXJQb29sTmFtZTogYCR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX0tVXNlclBvb2xgLFxuICAgICAgICBzZWxmU2lnblVwRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgc2lnbkluQWxpYXNlczoge1xuICAgICAgICAgIGVtYWlsOiB0cnVlLFxuICAgICAgICAgIHVzZXJuYW1lOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBhdXRvVmVyaWZ5OiB7XG4gICAgICAgICAgZW1haWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHBhc3N3b3JkUG9saWN5OiB7XG4gICAgICAgICAgbWluTGVuZ3RoOiA4LFxuICAgICAgICAgIHJlcXVpcmVMb3dlcmNhc2U6IHRydWUsXG4gICAgICAgICAgcmVxdWlyZVVwcGVyY2FzZTogdHJ1ZSxcbiAgICAgICAgICByZXF1aXJlRGlnaXRzOiB0cnVlLFxuICAgICAgICAgIHJlcXVpcmVTeW1ib2xzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBtZmE6IE1mYS5PUFRJT05BTCxcbiAgICAgICAgbWZhU2Vjb25kRmFjdG9yOiB7XG4gICAgICAgICAgc21zOiB0cnVlLFxuICAgICAgICAgIG90cDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgYWNjb3VudFJlY292ZXJ5OiBBY2NvdW50UmVjb3ZlcnkuRU1BSUxfT05MWSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogdGhpcy5yZW1vdmFsUG9saWN5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZXJQb29sQ2xpZW50ICYmIHRoaXMudXNlclBvb2wpIHtcbiAgICAgICh0aGlzIGFzIGFueSkudXNlclBvb2xDbGllbnQgPSBuZXcgVXNlclBvb2xDbGllbnQoc2NvcGUsICdVc2VyUG9vbENsaWVudCcsIHtcbiAgICAgICAgdXNlclBvb2w6IHRoaXMudXNlclBvb2wsXG4gICAgICAgIHVzZXJQb29sQ2xpZW50TmFtZTogYCR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX0tVXNlclBvb2xDbGllbnRgLFxuICAgICAgICBhdXRoRmxvd3M6IHtcbiAgICAgICAgICB1c2VyUGFzc3dvcmQ6IHRydWUsXG4gICAgICAgICAgdXNlclNycDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXQ6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0ZWRJZGVudGl0eVByb3ZpZGVyczogW1xuICAgICAgICAgIFVzZXJQb29sQ2xpZW50SWRlbnRpdHlQcm92aWRlci5DT0dOSVRPLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTm8tYXV0aGVudGljYXRpb24gYXV0aGVudGljYXRvciBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuXG4gKlxuICogRGlzYWJsZXMgYXV0aGVudGljYXRpb24gZW50aXJlbHksIGFsbG93aW5nIGFueSBjbGllbnQgdG8gY29ubmVjdFxuICogd2l0aG91dCBjcmVkZW50aWFscy4gVGhpcyBzaG91bGQgT05MWSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudFxuICogYW5kIHRlc3RpbmcgZW52aXJvbm1lbnRzLlxuICpcbiAqICMjIFNlY3VyaXR5IFdhcm5pbmdcbiAqXG4gKiBUaGlzIGF1dGhlbnRpY2F0b3IgcHJvdmlkZXMgTk8gc2VjdXJpdHkuIE5ldmVyIHVzZSBpbiBwcm9kdWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgTm9BdXRoZW50aWNhdG9yIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0b3Ige1xuICAvKipcbiAgICogTm8tb3AgZm9yIE5vQXV0aGVudGljYXRvciBzaW5jZSBubyBhdXRoZW50aWNhdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAqL1xuICBncmFudEF1dGhlbnRpY2F0ZShfbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIC8vIE5vIHBlcm1pc3Npb25zIG5lZWRlZFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFVVEhfVFlQRTogJ05vbmUnLFxuICAgIH07XG4gIH1cbn1cblxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgSW50ZXJhY3RpdmVBZ2VudC5cbiAqXG4gKiBFeHRlbmRzIEJhc2VBZ2VudFByb3BzIHdpdGggY29tbXVuaWNhdGlvbiwgc2Vzc2lvbiwgY29udGV4dCwgYW5kIGF1dGhlbnRpY2F0aW9uXG4gKiBzdHJhdGVneSBpbnRlcmZhY2VzIGZvciBidWlsZGluZyByZWFsLXRpbWUgY29udmVyc2F0aW9uYWwgQUkgYWdlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aXZlQWdlbnRQcm9wcyBleHRlbmRzIEJhc2VBZ2VudFByb3BzIHtcbiAgLyoqXG4gICAqIENvbW11bmljYXRpb24gYWRhcHRlciBmb3IgY2xpZW50LWFnZW50IGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdHJlYW1pbmdIdHRwQWRhcHRlciB3aXRoIENvZ25pdG9BdXRoZW50aWNhdG9yXG4gICAqL1xuICByZWFkb25seSBjb21tdW5pY2F0aW9uQWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcblxuICAvKipcbiAgICogU2Vzc2lvbiBzdG9yZSBmb3IgcGVyc2lzdGluZyBjb252ZXJzYXRpb24gc3RhdGUuXG4gICAqIFNldCB0byB1bmRlZmluZWQgdG8gZGlzYWJsZSBzZXNzaW9uIHBlcnNpc3RlbmNlIChzdGF0ZWxlc3MgbW9kZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFMzU2Vzc2lvbk1hbmFnZXIgd2l0aCAyNC1ob3VyIFRUTFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblN0b3JlPzogSVNlc3Npb25TdG9yZTtcblxuICAvKipcbiAgICogUzMgYnVja2V0IGZvciBzZXNzaW9uIHN0b3JhZ2UgKHNob3J0aGFuZCBmb3IgUzNTZXNzaW9uTWFuYWdlcikuXG4gICAqIElnbm9yZWQgaWYgc2Vzc2lvblN0b3JlIGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvLWNyZWF0ZWQgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uQnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGltZS10by1saXZlIGZvciBzZXNzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uaG91cnMoMjQpXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uVFRMPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbnRleHQgc3RyYXRlZ3kgZm9yIGNvbnZlcnNhdGlvbiBoaXN0b3J5IG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyIHdpdGggMjAgbWVzc2FnZXNcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRTdHJhdGVneT86IElDb250ZXh0U3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGtlZXAgaW4gY29udmVyc2F0aW9uIGhpc3RvcnkuXG4gICAqIFNob3J0aGFuZCBmb3IgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgd2luZG93U2l6ZS5cbiAgICogSWdub3JlZCBpZiBjb250ZXh0U3RyYXRlZ3kgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDIwXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlSGlzdG9yeUxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBBUEkgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDb2duaXRvQXV0aGVudGljYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gbWVtb3J5IHNpemUgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwMjRcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiB0aW1lb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDE1KVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFJlc2VydmVkIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gcmVzZXJ2ZWQgY29uY3VycmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW50ZXJhY3RpdmUgQWdlbnQgZm9yIHJlYWwtdGltZSBjb252ZXJzYXRpb25hbCBBSSB3aXRoIFNTRSBzdHJlYW1pbmcuXG4gKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHNlcnZlcmxlc3MgaW5mcmFzdHJ1Y3R1cmUgZm9yIGludGVyYWN0aXZlIEFJIGNvbnZlcnNhdGlvbnNcbiAqIHVzaW5nIEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nLCBMYW1iZGEgV2ViIEFkYXB0ZXIsXG4gKiBGYXN0QVBJLCBhbmQgc3RhbmRhcmQgU3RyYW5kcyBBZ2VudC5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqXG4gKiBgYGBcbiAqIENsaWVudCAoZmV0Y2ggKyBSZWFkYWJsZVN0cmVhbSlcbiAqICAgICDihpMgUE9TVCAvY2hhdCAoQXV0aG9yaXphdGlvbjogQmVhcmVyIEpXVClcbiAqIEFQSSBHYXRld2F5IFJFU1QgQVBJIChyZXNwb25zZVRyYW5zZmVyTW9kZTogU1RSRUFNKVxuICogICAgIOKGkyBJbnZva2VXaXRoUmVzcG9uc2VTdHJlYW1cbiAqIExhbWJkYSAoUHl0aG9uICsgTGFtYmRhIFdlYiBBZGFwdGVyICsgRmFzdEFQSSlcbiAqICAgICDihpMgc3RyYW5kcy5BZ2VudCBzdHJlYW1pbmdcbiAqIEFtYXpvbiBCZWRyb2NrIChDbGF1ZGUpXG4gKiBgYGBcbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipTU0UgU3RyZWFtaW5nKio6IFJlYWwtdGltZSB0b2tlbi1ieS10b2tlbiByZXNwb25zZSBzdHJlYW1pbmdcbiAqIC0gKioxNS1NaW51dGUgVGltZW91dCoqOiBFeHRlbmRlZCB0aW1lb3V0IGZvciBsb25nIGNvbnZlcnNhdGlvbnNcbiAqIC0gKipTZXNzaW9uIE1hbmFnZW1lbnQqKjogUzMtYmFzZWQgY29udmVyc2F0aW9uIHBlcnNpc3RlbmNlXG4gKiAtICoqQ29udGV4dCBXaW5kb3dpbmcqKjogU2xpZGluZyB3aW5kb3cgY29udmVyc2F0aW9uIGhpc3RvcnlcbiAqIC0gKipDb2duaXRvIEF1dGgqKjogTmF0aXZlIEpXVCB2YWxpZGF0aW9uIG9uIFJFU1QgQVBJXG4gKiAtICoqU3RyYXRlZ3kgSW50ZXJmYWNlcyoqOiBQbHVnZ2FibGUgYWRhcHRlcnMgZm9yIGFsbCBjb21wb25lbnRzXG4gKiAtICoqT2JzZXJ2YWJpbGl0eSoqOiBMYW1iZGEgUG93ZXJ0b29scyBpbnRlZ3JhdGlvblxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3Qgc3lzdGVtUHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0NoYXRBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnTXlDaGF0Ym90JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7XG4gKiAgICAgYmVkcm9ja01vZGVsOiB7IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlIH0sXG4gKiAgICAgc3lzdGVtUHJvbXB0OiBzeXN0ZW1Qcm9tcHQsXG4gKiAgIH0sXG4gKiB9KTtcbiAqXG4gKiAvLyBBY2Nlc3Mgb3V0cHV0c1xuICogYWdlbnQuYXBpRW5kcG9pbnQ7ICAgICAgIC8vIFJFU1QgQVBJIGVuZHBvaW50IFVSTFxuICogYWdlbnQuc2Vzc2lvbkJ1Y2tldDsgICAgIC8vIFMzIHNlc3Npb24gYnVja2V0XG4gKiBhZ2VudC5hdXRoZW50aWNhdG9yOyAgICAgLy8gQ29nbml0byBhdXRoZW50aWNhdG9yIChmb3IgVXNlciBQb29sIGluZm8pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVyYWN0aXZlQWdlbnQgZXh0ZW5kcyBCYXNlQWdlbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRGdW5jdGlvbjogSUZ1bmN0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgYWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25TdG9yZT86IElTZXNzaW9uU3RvcmU7XG4gIHB1YmxpYyByZWFkb25seSBjb250ZXh0U3RyYXRlZ3k/OiBJQ29udGV4dFN0cmF0ZWd5O1xuICBwdWJsaWMgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpRW5kcG9pbnQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25CdWNrZXQ/OiBJQnVja2V0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbnRlcmFjdGl2ZUFnZW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIC8vIFZhbGlkYXRlIHByb3BzXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcblxuICAgIGNvbnN0IG1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHRoaXMuYmVkcm9ja01vZGVsKTtcbiAgICBjb25zdCBtZXRyaWNOYW1lc3BhY2UgPSBwcm9wcy5tZXRyaWNOYW1lc3BhY2UgfHwgRGVmYXVsdE9ic2VydmFiaWxpdHlDb25maWcuREVGQVVMVF9NRVRSSUNfTkFNRVNQQUNFO1xuICAgIGNvbnN0IG1ldHJpY1NlcnZpY2VOYW1lID0gcHJvcHMubWV0cmljU2VydmljZU5hbWUgfHwgRGVmYXVsdEFnZW50Q29uZmlnLkRFRkFVTFRfT0JTRVJWQUJJTElUWV9NRVRSSUNfU1ZDX05BTUU7XG5cbiAgICAvLyBJbml0aWFsaXplIGF1dGhlbnRpY2F0b3JcbiAgICB0aGlzLmF1dGhlbnRpY2F0b3IgPSBwcm9wcy5hdXRoZW50aWNhdG9yICE9PSB1bmRlZmluZWQgPyBwcm9wcy5hdXRoZW50aWNhdG9yIDogbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKCk7XG4gICAgaWYgKHRoaXMuYXV0aGVudGljYXRvciBpbnN0YW5jZW9mIENvZ25pdG9BdXRoZW50aWNhdG9yKSB7XG4gICAgICB0aGlzLmF1dGhlbnRpY2F0b3IuX3NldFNjb3BlKHRoaXMpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgY29tbXVuaWNhdGlvbiBhZGFwdGVyXG4gICAgY29uc3QgYWRhcHRlciA9IHByb3BzLmNvbW11bmljYXRpb25BZGFwdGVyIHx8IG5ldyBTdHJlYW1pbmdIdHRwQWRhcHRlcih7XG4gICAgICBhdXRoZW50aWNhdG9yOiB0aGlzLmF1dGhlbnRpY2F0b3IsXG4gICAgfSk7XG4gICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0cmVhbWluZ0h0dHBBZGFwdGVyKSB7XG4gICAgICBhZGFwdGVyLl9zZXRTY29wZSh0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHNlc3Npb24gc3RvcmVcbiAgICBpZiAocHJvcHMuc2Vzc2lvblN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2Vzc2lvblN0b3JlID0gcHJvcHMuc2Vzc2lvblN0b3JlO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuc2Vzc2lvblN0b3JlID09PSB1bmRlZmluZWQgJiYgcHJvcHMuc2Vzc2lvbkJ1Y2tldCkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcih0aGlzLCAnU2Vzc2lvbk1hbmFnZXInLCB7XG4gICAgICAgIGJ1Y2tldDogcHJvcHMuc2Vzc2lvbkJ1Y2tldCxcbiAgICAgICAgc2Vzc2lvblRUTDogcHJvcHMuc2Vzc2lvblRUTCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0OiBjcmVhdGUgUzNTZXNzaW9uTWFuYWdlclxuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUgPSBuZXcgUzNTZXNzaW9uTWFuYWdlcih0aGlzLCAnU2Vzc2lvbk1hbmFnZXInLCB7XG4gICAgICAgIHNlc3Npb25UVEw6IHByb3BzLnNlc3Npb25UVEwsXG4gICAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3ksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXNzaW9uQnVja2V0ID0gdGhpcy5zZXNzaW9uU3RvcmU/LnNlc3Npb25CdWNrZXQ7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbnRleHQgc3RyYXRlZ3lcbiAgICBpZiAocHJvcHMuY29udGV4dFN0cmF0ZWd5KSB7XG4gICAgICB0aGlzLmNvbnRleHRTdHJhdGVneSA9IHByb3BzLmNvbnRleHRTdHJhdGVneTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0U3RyYXRlZ3kgPSBuZXcgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIoe1xuICAgICAgICB3aW5kb3dTaXplOiBwcm9wcy5tZXNzYWdlSGlzdG9yeUxpbWl0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTU9ERUxfSUQ6IG1vZGVsSWQsXG4gICAgICBTWVNURU1fUFJPTVBUX1MzX0JVQ0tFVF9OQU1FOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzQnVja2V0TmFtZSxcbiAgICAgIFNZU1RFTV9QUk9NUFRfUzNfS0VZOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzT2JqZWN0S2V5LFxuICAgICAgVE9PTFNfQ09ORklHOiBKU09OLnN0cmluZ2lmeSh0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zKSxcbiAgICAgIC8vIExhbWJkYSBXZWIgQWRhcHRlciBjb25maWd1cmF0aW9uXG4gICAgICAvLyBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUiB0ZWxscyBMYW1iZGEgdG8gdXNlIExXQSdzIGJvb3RzdHJhcCBzY3JpcHRcbiAgICAgIC8vIHdoaWNoIGludGVyY2VwdHMgdGhlIHJ1bnRpbWUgYW5kIHByb3hpZXMgcmVxdWVzdHMgdG8gdGhlIHdlYiBhcHBcbiAgICAgIEFXU19MQU1CREFfRVhFQ19XUkFQUEVSOiAnL29wdC9ib290c3RyYXAnLFxuICAgICAgQVdTX0xXQV9JTlZPS0VfTU9ERTogJ3Jlc3BvbnNlX3N0cmVhbScsXG4gICAgICBBV1NfTFdBX1JFQURJTkVTU19DSEVDS19QQVRIOiAnL2hlYWx0aCcsXG4gICAgICBBV1NfTFdBX1BPUlQ6ICc4MDgwJyxcbiAgICAgIFBPUlQ6ICc4MDgwJyxcbiAgICAgIC4uLnRoaXMuY29udGV4dFN0cmF0ZWd5LmVudmlyb25tZW50VmFyaWFibGVzKCksXG4gICAgICAuLi50aGlzLmF1dGhlbnRpY2F0b3IuZW52aXJvbm1lbnRWYXJpYWJsZXMoKSxcbiAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICBwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICBtZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgIG1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNlc3Npb24gYnVja2V0IGVudiB2YXIgaWYgc2Vzc2lvbiBzdG9yZSBleGlzdHNcbiAgICBpZiAodGhpcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICBlbnYuU0VTU0lPTl9CVUNLRVQgPSB0aGlzLnNlc3Npb25CdWNrZXQuYnVja2V0TmFtZTtcbiAgICB9XG5cbiAgICAvLyBBZGQga25vd2xlZGdlIGJhc2UgY29uZmlndXJhdGlvbiBpZiBLQnMgYXJlIGNvbmZpZ3VyZWRcbiAgICBpZiAodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwKSB7XG4gICAgICBlbnYuS05PV0xFREdFX0JBU0VTX0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpO1xuICAgICAgZW52LktOT1dMRURHRV9CQVNFX1NZU1RFTV9QUk9NUFRfQURESVRJT04gPSBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbih0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgTGFtYmRhIGZ1bmN0aW9uIHdpdGggTGFtYmRhIFdlYiBBZGFwdGVyIGxheWVyXG4gICAgY29uc3QgeyBhY2NvdW50LCByZWdpb24gfSA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IGFnZW50TGFtYmRhTG9nUGVybWlzc2lvbnNSZXN1bHQgPSBMYW1iZGFJYW1VdGlscy5jcmVhdGVMb2dzUGVybWlzc2lvbnMoe1xuICAgICAgYWNjb3VudCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy5hZ2VudE5hbWUsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuXG4gICAgLy8gTGFtYmRhIFdlYiBBZGFwdGVyIGxheWVyXG4gICAgY29uc3Qgd2ViQWRhcHRlckxheWVyID0gTGF5ZXJWZXJzaW9uLmZyb21MYXllclZlcnNpb25Bcm4oXG4gICAgICB0aGlzLFxuICAgICAgJ0xhbWJkYVdlYkFkYXB0ZXJMYXllcicsXG4gICAgICBgYXJuOmF3czpsYW1iZGE6JHtyZWdpb259Ojc1MzI0MDU5ODA3NTpsYXllcjpMYW1iZGFBZGFwdGVyTGF5ZXJYODY6MjVgLFxuICAgICk7XG5cbiAgICBjb25zdCBhbGxMYXllcnM6IElMYXllclZlcnNpb25bXSA9IFt3ZWJBZGFwdGVyTGF5ZXJdO1xuICAgIGlmIChwcm9wcy5hZ2VudERlZmluaXRpb24ubGFtYmRhTGF5ZXJzKSB7XG4gICAgICBhbGxMYXllcnMucHVzaCguLi5wcm9wcy5hZ2VudERlZmluaXRpb24ubGFtYmRhTGF5ZXJzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMua25vd2xlZGdlQmFzZUxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICBhbGxMYXllcnMucHVzaCguLi50aGlzLmtub3dsZWRnZUJhc2VMYXllcnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9pbnRlcmFjdGl2ZS1hZ2VudC1oYW5kbGVyJyk7XG5cbiAgICAvLyBBbGwgUHl0aG9uIHZlcnNpb24gcmVmZXJlbmNlcyBkZXJpdmVkIGZyb20gRGVmYXVsdFJ1bnRpbWVzLlBZVEhPTlxuICAgIGNvbnN0IHB5dGhvblJ1bnRpbWUgPSBEZWZhdWx0UnVudGltZXMuUFlUSE9OO1xuICAgIGNvbnN0IHB5VmVyc2lvbiA9IHB5dGhvblJ1bnRpbWUubmFtZS5yZXBsYWNlKCdweXRob24nLCAnJyk7IC8vIGUuZy4gXCIzLjEzXCJcblxuICAgIHRoaXMuYWdlbnRGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnSW50ZXJhY3RpdmVBZ2VudEZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBhZ2VudExhbWJkYUxvZ1Blcm1pc3Npb25zUmVzdWx0LnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlIHx8IEFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChoYW5kbGVyUGF0aCwge1xuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIGltYWdlOiBweXRob25SdW50aW1lLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgY29tbWFuZDogW1xuICAgICAgICAgICAgJ2Jhc2gnLCAnLWMnLFxuICAgICAgICAgICAgJ3BpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQgLXQgL2Fzc2V0LW91dHB1dCAmJiBjcCAtYSAuIC9hc3NldC1vdXRwdXQnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgYSBsb2NhbCBQeXRob24gPj0gMy4xMSBmb3IgcGlwIChzeXN0ZW0gZGVmYXVsdCBtYXkgYmUgdG9vIG9sZClcbiAgICAgICAgICAgICAgICBjb25zdCBweXRob25DYW5kaWRhdGVzID0gW2BweXRob24ke3B5VmVyc2lvbn1gLCAncHl0aG9uMycsICdweXRob24nXTtcbiAgICAgICAgICAgICAgICBsZXQgcHl0aG9uQmluID0gJ3B5dGhvbjMnO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHB5dGhvbkNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlciA9IHByb2MuZXhlY1N5bmMoYCR7Y2FuZGlkYXRlfSAtLXZlcnNpb24gMj4mMWAsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZlci5tYXRjaCgvUHl0aG9uIChcXGQrKVxcLihcXGQrKS8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggJiYgKHBhcnNlSW50KG1hdGNoWzFdKSA+IDMgfHwgKHBhcnNlSW50KG1hdGNoWzFdKSA9PT0gMyAmJiBwYXJzZUludChtYXRjaFsyXSkgPj0gMTEpKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHB5dGhvbkJpbiA9IGNhbmRpZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9jLmV4ZWNTeW5jKFxuICAgICAgICAgICAgICAgICAgYCR7cHl0aG9uQmlufSAtbSBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0IC10IFwiJHtvdXRwdXREaXJ9XCIgLS1wbGF0Zm9ybSBtYW55bGludXgyMDE0X3g4Nl82NCAtLW9ubHktYmluYXJ5PTphbGw6IC0tcHl0aG9uLXZlcnNpb24gJHtweVZlcnNpb259YCxcbiAgICAgICAgICAgICAgICAgIHsgY3dkOiBoYW5kbGVyUGF0aCwgc3RkaW86ICdpbmhlcml0JyB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcHJvYy5leGVjU3luYyhcbiAgICAgICAgICAgICAgICAgIGBjcCAtciAuIFwiJHtvdXRwdXREaXJ9XCJgLFxuICAgICAgICAgICAgICAgICAgeyBjd2Q6IGhhbmRsZXJQYXRoLCBzdGRpbzogJ2luaGVyaXQnIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHJvbGU6IHRoaXMuYWdlbnRSb2xlLFxuICAgICAgaGFuZGxlcjogJ3J1bi5zaCcsXG4gICAgICBydW50aW1lOiBweXRob25SdW50aW1lLFxuICAgICAgbGF5ZXJzOiBhbGxMYXllcnMsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0IHx8IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSB8fCAxMDI0LFxuICAgICAgZW52aXJvbm1lbnQ6IGVudixcbiAgICAgIGVudmlyb25tZW50RW5jcnlwdGlvbjogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgdnBjOiBwcm9wcy5uZXR3b3JrID8gcHJvcHMubmV0d29yay52cGMgOiB1bmRlZmluZWQsXG4gICAgICB2cGNTdWJuZXRzOiBwcm9wcy5uZXR3b3JrID8gcHJvcHMubmV0d29yay5hcHBsaWNhdGlvblN1Ym5ldFNlbGVjdGlvbigpIDogdW5kZWZpbmVkLFxuICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogcHJvcHMucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyxcbiAgICB9KTtcblxuICAgIC8vIEdyYW50IHN5c3RlbSBwcm9tcHQgcmVhZCBhY2Nlc3NcbiAgICBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LmdyYW50UmVhZCh0aGlzLmFnZW50Um9sZSk7XG5cbiAgICAvLyBHcmFudCBsb2cgcGVybWlzc2lvbnNcbiAgICBmb3IgKGNvbnN0IHMgb2YgYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdC5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICB0aGlzLmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzKTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBzZXNzaW9uIHN0b3JlIGFjY2Vzc1xuICAgIGlmICh0aGlzLnNlc3Npb25TdG9yZSkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUuZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBhdXRoZW50aWNhdG9yIHBlcm1pc3Npb25zXG4gICAgaWYgKHRoaXMuYXV0aGVudGljYXRvcikge1xuICAgICAgdGhpcy5hdXRoZW50aWNhdG9yLmdyYW50QXV0aGVudGljYXRlKHRoaXMuYWdlbnRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNoIGNvbW11bmljYXRpb24gYWRhcHRlciBhbmQgZ2V0IGVuZHBvaW50XG4gICAgdGhpcy5hcGlFbmRwb2ludCA9IHRoaXMuYWRhcHRlciEuYXR0YWNoVG9GdW5jdGlvbih0aGlzLmFnZW50RnVuY3Rpb24pO1xuICAgIHRoaXMuYWRhcHRlciEuZ3JhbnRJbnZva2UodGhpcy5hZ2VudEZ1bmN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgSW50ZXJhY3RpdmVBZ2VudCBwcm9wcy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogSW50ZXJhY3RpdmVBZ2VudFByb3BzKTogdm9pZCB7XG4gICAgaWYgKCFwcm9wcy5hZ2VudE5hbWUgfHwgcHJvcHMuYWdlbnROYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWdlbnROYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5tZW1vcnlTaXplICE9PSB1bmRlZmluZWQgJiYgKHByb3BzLm1lbW9yeVNpemUgPCAxMjggfHwgcHJvcHMubWVtb3J5U2l6ZSA+IDEwMjQwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZW1vcnlTaXplIG11c3QgYmUgYmV0d2VlbiAxMjggYW5kIDEwMjQwIE1CJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBwcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpO1xuICAgICAgaWYgKHRpbWVvdXRTZWNvbmRzIDwgMSB8fCB0aW1lb3V0U2Vjb25kcyA+IDkwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1lc3NhZ2VIaXN0b3J5TGltaXQgIT09IHVuZGVmaW5lZCAmJiAocHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCA8IDEgfHwgcHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCA+IDEwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2VIaXN0b3J5TGltaXQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
1003
|
+
_j = JSII_RTTI_SYMBOL_1;
|
|
1004
|
+
InteractiveAgent[_j] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.InteractiveAgent", version: "1.12.0" };
|
|
1005
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9pbnRlcmFjdGl2ZS1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkJBQTZCO0FBQzdCLDZDQUFpRTtBQUNqRSwrREFRb0M7QUFDcEMsMkVBQWtGO0FBQ2xGLHlEQUF5SDtBQUN6SCwrREFBOEQ7QUFDOUQsaURBQXNGO0FBRXRGLHVEQUE4RztBQUM5RywrQ0FBMEY7QUFFMUYsNkNBQXlEO0FBQ3pELCtDQUEwRTtBQUMxRSxpRUFBNEQ7QUFDNUQsK0NBQW1FO0FBQ25FLGlFQUEyRTtBQUMzRSx3Q0FBK0M7QUFDL0Msd0RBQXFEO0FBNkRyRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUNILE1BQWEsb0JBQW9CO0lBYy9CLFlBQVksUUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsY0FBeUI7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDM0csQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQztRQUVqRCw0QkFBNEI7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSx3QkFBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ2pELFdBQVcsRUFBRSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFVBQVU7WUFDeEQsV0FBVyxFQUFFLG9EQUFvRDtZ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QUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuSCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7O0FBMUpILDRDQTJKQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IER1cmF0aW9uLCBGbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBBdXRob3JpemF0aW9uVHlwZSxcbiAgQ29nbml0b1VzZXJQb29sc0F1dGhvcml6ZXIsXG4gIENvcnMsXG4gIEdhdGV3YXlSZXNwb25zZSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIFJlc3BvbnNlVHlwZSxcbiAgUmVzdEFwaSxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0IHsgQ2ZuUnVudGltZSwgQ2ZuUnVudGltZUVuZHBvaW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHsgVXNlclBvb2wsIFVzZXJQb29sQ2xpZW50LCBNZmEsIEFjY291bnRSZWNvdmVyeSwgVXNlclBvb2xDbGllbnRJZGVudGl0eVByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZ25pdG8nO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2VBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3ItYXNzZXRzJztcbmltcG9ydCB7IFJvbGUsIFNlcnZpY2VQcmluY2lwYWwsIFBvbGljeVN0YXRlbWVudCwgRWZmZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IElGdW5jdGlvbiwgQXJjaGl0ZWN0dXJlLCBJTGF5ZXJWZXJzaW9uLCBMYXllclZlcnNpb24sIEZ1bmN0aW9uLCBDb2RlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBJQnVja2V0LCBCdWNrZXQsIEJ1Y2tldEVuY3J5cHRpb24sIEJsb2NrUHVibGljQWNjZXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZUFnZW50LCBCYXNlQWdlbnRQcm9wcyB9IGZyb20gJy4vYmFzZS1hZ2VudCc7XG5pbXBvcnQgeyBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbiB9IGZyb20gJy4vYmF0Y2gtYWdlbnQnO1xuaW1wb3J0IHsgRGVmYXVsdEFnZW50Q29uZmlnIH0gZnJvbSAnLi9kZWZhdWx0LWFnZW50LWNvbmZpZyc7XG5pbXBvcnQgeyBMYW1iZGFJYW1VdGlscywgUG93ZXJ0b29sc0NvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9vYnNlcnZhYmlsaXR5JztcbmltcG9ydCB7IEJlZHJvY2tNb2RlbFV0aWxzIH0gZnJvbSAnLi4vYmVkcm9jayc7XG5pbXBvcnQgeyBEZWZhdWx0UnVudGltZXMgfSBmcm9tICcuLi9jdXN0b20tcmVzb3VyY2UnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4uL2ZvdW5kYXRpb24nO1xuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgcGx1Z2dhYmxlIGNvbW11bmljYXRpb24gbWVjaGFuaXNtcy5cbiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgKEFQSSBHYXRld2F5IFJFU1QgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29tbXVuaWNhdGlvbkFkYXB0ZXIge1xuICAvKipcbiAgICogQXR0YWNoIHRoZSBhZGFwdGVyIHRvIGEgTGFtYmRhIGZ1bmN0aW9uIGFuZCBjcmVhdGUgY29tbXVuaWNhdGlvbiBpbmZyYXN0cnVjdHVyZS5cbiAgICogUmV0dXJucyB0aGUgcHVibGljIGVuZHBvaW50IFVSTCBmb3IgY2xpZW50IGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgYXR0YWNoVG9GdW5jdGlvbihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgTGFtYmRhIGZ1bmN0aW9uIHBlcm1pc3Npb24gdG8gc2VuZCByZXNwb25zZXMgYmFjayB0byBjbGllbnRzLlxuICAgKi9cbiAgZ3JhbnRJbnZva2UobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhyb3R0bGUgc2V0dGluZ3MgZm9yIFJFU1QgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocm90dGxlU2V0dGluZ3Mge1xuICAvKipcbiAgICogUmF0ZSBsaW1pdCAocmVxdWVzdHMgcGVyIHNlY29uZCkuXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ1cnN0IGxpbWl0IChtYXhpbXVtIGNvbmN1cnJlbnQgcmVxdWVzdHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVyc3RMaW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIFN0cmVhbWluZ0h0dHBBZGFwdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbWluZ0h0dHBBZGFwdGVyUHJvcHMge1xuICAvKipcbiAgICogUkVTVCBBUEkgc3RhZ2UgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ3Byb2QnXG4gICAqL1xuICByZWFkb25seSBzdGFnZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRocm90dGxlIHNldHRpbmdzIGZvciBSRVNUIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gdGhyb3R0bGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGhyb3R0bGU/OiBUaHJvdHRsZVNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBBUEkgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBVc2VzIGF1dGhlbnRpY2F0b3IgZnJvbSBJbnRlcmFjdGl2ZUFnZW50XG4gICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG59XG5cbi8qKlxuICogU3RyZWFtaW5nIEhUVFAgYWRhcHRlciBmb3IgcmVhbC10aW1lIGFnZW50IGNvbW11bmljYXRpb24gdmlhIFNTRS5cbiAqXG4gKiBUaGlzIGFkYXB0ZXIgY3JlYXRlcyBhbiBBUEkgR2F0ZXdheSBSRVNUIEFQSSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZyBlbmFibGVkLFxuICogYWxsb3dpbmcgdGhlIExhbWJkYSBmdW5jdGlvbiB0byBzdHJlYW0gU1NFIChTZXJ2ZXItU2VudCBFdmVudHMpIHJlc3BvbnNlc1xuICogYmFjayB0byBjbGllbnRzIGFzIHRoZSBTdHJhbmRzIEFnZW50IGdlbmVyYXRlcyB0b2tlbnMuXG4gKlxuICogIyMgQXJjaGl0ZWN0dXJlXG4gKlxuICogYGBgXG4gKiBDbGllbnQg4oaSIFBPU1QgL2NoYXQg4oaSIEFQSSBHYXRld2F5IFJFU1QgQVBJIChTVFJFQU0gbW9kZSkg4oaSIExhbWJkYSAoRmFzdEFQSSArIExXQSkg4oaSIEJlZHJvY2tcbiAqIENsaWVudCDihpAgU1NFIHN0cmVhbSDihpAgQVBJIEdhdGV3YXkg4oaQIExhbWJkYSByZXNwb25zZSBzdHJlYW1pbmcg4oaQIEFnZW50IHRva2Vuc1xuICogYGBgXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqUmVzcG9uc2UgU3RyZWFtaW5nKio6IFByb2dyZXNzaXZlIFNTRSBkZWxpdmVyeSB2aWEgQVBJIEdhdGV3YXkgcmVzcG9uc2Ugc3RyZWFtaW5nXG4gKiAtICoqMTUtTWludXRlIFRpbWVvdXQqKjogRXh0ZW5kZWQgdGltZW91dCBmb3IgbG9uZy1ydW5uaW5nIGFnZW50IGNvbnZlcnNhdGlvbnNcbiAqIC0gKipDb2duaXRvIEF1dGgqKjogTmF0aXZlIENPR05JVE9fVVNFUl9QT09MUyBhdXRob3JpemVyIG9uIFJFU1QgQVBJXG4gKiAtICoqQ09SUyoqOiBCdWlsdC1pbiBDT1JTIHN1cHBvcnQgZm9yIGJyb3dzZXIgY2xpZW50c1xuICogLSAqKlRocm90dGxpbmcqKjogQ29uZmlndXJhYmxlIHJhdGUgYW5kIGJ1cnN0IGxpbWl0c1xuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFN0cmVhbWluZ0h0dHBBZGFwdGVyKHtcbiAqICAgc3RhZ2VOYW1lOiAncHJvZCcsXG4gKiAgIHRocm90dGxlOiB7IHJhdGVMaW1pdDogMTAwLCBidXJzdExpbWl0OiAyMDAgfVxuICogfSk7XG4gKlxuICogY29uc3QgYWdlbnQgPSBuZXcgSW50ZXJhY3RpdmVBZ2VudCh0aGlzLCAnQWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ0NoYXRBZ2VudCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjogeyBiZWRyb2NrTW9kZWw6IHt9LCBzeXN0ZW1Qcm9tcHQ6IG15UHJvbXB0IH0sXG4gKiAgIGNvbW11bmljYXRpb25BZGFwdGVyOiBhZGFwdGVyXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtaW5nSHR0cEFkYXB0ZXIgaW1wbGVtZW50cyBJQ29tbXVuaWNhdGlvbkFkYXB0ZXIge1xuICAvKipcbiAgICogVGhlIFJFU1QgQVBJIEdhdGV3YXkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaT86IFJlc3RBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBBUEkgZW5kcG9pbnQgVVJMLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaUVuZHBvaW50Pzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFN0cmVhbWluZ0h0dHBBZGFwdGVyUHJvcHM7XG4gIHByaXZhdGUgc2NvcGU/OiBDb25zdHJ1Y3Q7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFN0cmVhbWluZ0h0dHBBZGFwdGVyUHJvcHMgPSB7fSkge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIGFkYXB0ZXIgdG8gYSBMYW1iZGEgZnVuY3Rpb24gYW5kIGNyZWF0ZSBSRVNUIEFQSSBpbmZyYXN0cnVjdHVyZS5cbiAgICogQ3JlYXRlcyBBUEkgR2F0ZXdheSBSRVNUIEFQSSB3aXRoIFBPU1QgL2NoYXQgZW5kcG9pbnQgYW5kIHJlc3BvbnNlIHN0cmVhbWluZy5cbiAgICovXG4gIGF0dGFjaFRvRnVuY3Rpb24obGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnNjb3BlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0cmVhbWluZ0h0dHBBZGFwdGVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHNjb3BlIGJlZm9yZSBjYWxsaW5nIGF0dGFjaFRvRnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFnZU5hbWUgPSB0aGlzLnByb3BzLnN0YWdlTmFtZSB8fCAncHJvZCc7XG5cbiAgICAvLyBDcmVhdGUgUkVTVCBBUEkgd2l0aCBDT1JTXG4gICAgY29uc3QgcmVzdEFwaSA9IG5ldyBSZXN0QXBpKHRoaXMuc2NvcGUsICdDaGF0QXBpJywge1xuICAgICAgcmVzdEFwaU5hbWU6IGAke1N0YWNrLm9mKHRoaXMuc2NvcGUpLnN0YWNrTmFtZX0tQ2hhdEFwaWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyYWN0aXZlIEFnZW50IENoYXQgQVBJIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nJyxcbiAgICAgIGRlcGxveU9wdGlvbnM6IHtcbiAgICAgICAgc3RhZ2VOYW1lLFxuICAgICAgICB0aHJvdHRsaW5nUmF0ZUxpbWl0OiB0aGlzLnByb3BzLnRocm90dGxlPy5yYXRlTGltaXQsXG4gICAgICAgIHRocm90dGxpbmdCdXJzdExpbWl0OiB0aGlzLnByb3BzLnRocm90dGxlPy5idXJzdExpbWl0LFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRDb3JzUHJlZmxpZ2h0T3B0aW9uczoge1xuICAgICAgICBhbGxvd09yaWdpbnM6IENvcnMuQUxMX09SSUdJTlMsXG4gICAgICAgIGFsbG93TWV0aG9kczogWydQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYWxsb3dIZWFkZXJzOiBbJ0NvbnRlbnQtVHlwZScsICdBdXRob3JpemF0aW9uJ10sXG4gICAgICB9LFxuICAgIH0pO1xuICAgICh0aGlzIGFzIGFueSkucmVzdEFwaSA9IHJlc3RBcGk7XG5cbiAgICAvLyBBZGQgQ09SUyBoZWFkZXJzIHRvIEFQSSBHYXRld2F5IGVycm9yIHJlc3BvbnNlcyAoNFhYLzVYWCkuXG4gICAgLy8gV2l0aG91dCB0aGVzZSwgdGhlIENvZ25pdG8gYXV0aG9yaXplcidzIDQwMSByZXNwb25zZSB3b24ndCBpbmNsdWRlXG4gICAgLy8gQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luIGFuZCB0aGUgYnJvd3NlciB3aWxsIGJsb2NrIGl0IGFzIGEgQ09SUyBlcnJvci5cbiAgICBuZXcgR2F0ZXdheVJlc3BvbnNlKHRoaXMuc2NvcGUsICdHYXRld2F5RGVmYXVsdDRYWCcsIHtcbiAgICAgIHJlc3RBcGksXG4gICAgICB0eXBlOiBSZXNwb25zZVR5cGUuREVGQVVMVF80WFgsXG4gICAgICByZXNwb25zZUhlYWRlcnM6IHtcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6IFwiJyonXCIsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogXCInQ29udGVudC1UeXBlLEF1dGhvcml6YXRpb24nXCIsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogXCInUE9TVCxPUFRJT05TJ1wiLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBuZXcgR2F0ZXdheVJlc3BvbnNlKHRoaXMuc2NvcGUsICdHYXRld2F5RGVmYXVsdDVYWCcsIHtcbiAgICAgIHJlc3RBcGksXG4gICAgICB0eXBlOiBSZXNwb25zZVR5cGUuREVGQVVMVF81WFgsXG4gICAgICByZXNwb25zZUhlYWRlcnM6IHtcbiAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6IFwiJyonXCIsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogXCInQ29udGVudC1UeXBlLEF1dGhvcml6YXRpb24nXCIsXG4gICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogXCInUE9TVCxPUFRJT05TJ1wiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBMYW1iZGEgaW50ZWdyYXRpb25cbiAgICBjb25zdCBsYW1iZGFJbnRlZ3JhdGlvbiA9IG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihsYW1iZGFGdW5jdGlvbiwge1xuICAgICAgcHJveHk6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgL2NoYXQgcmVzb3VyY2Ugd2l0aCBQT1NUIG1ldGhvZFxuICAgIGNvbnN0IGNoYXRSZXNvdXJjZSA9IHJlc3RBcGkucm9vdC5hZGRSZXNvdXJjZSgnY2hhdCcpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGF1dGhvcml6YXRpb24gdHlwZVxuICAgIGxldCBhdXRob3JpemF0aW9uVHlwZSA9IEF1dGhvcml6YXRpb25UeXBlLk5PTkU7XG4gICAgbGV0IGF1dGhvcml6ZXI6IENvZ25pdG9Vc2VyUG9vbHNBdXRob3JpemVyIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuYXV0aGVudGljYXRvciBpbnN0YW5jZW9mIENvZ25pdG9BdXRoZW50aWNhdG9yICYmIHRoaXMucHJvcHMuYXV0aGVudGljYXRvci51c2VyUG9vbCkge1xuICAgICAgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xzQXV0aG9yaXplcih0aGlzLnNjb3BlLCAnQ29nbml0b0F1dGhvcml6ZXInLCB7XG4gICAgICAgIGNvZ25pdG9Vc2VyUG9vbHM6IFt0aGlzLnByb3BzLmF1dGhlbnRpY2F0b3IudXNlclBvb2xdLFxuICAgICAgICBhdXRob3JpemVyTmFtZTogJ0NvZ25pdG9BdXRob3JpemVyJyxcbiAgICAgIH0pO1xuICAgICAgYXV0aG9yaXphdGlvblR5cGUgPSBBdXRob3JpemF0aW9uVHlwZS5DT0dOSVRPO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RNZXRob2QgPSBjaGF0UmVzb3VyY2UuYWRkTWV0aG9kKCdQT1NUJywgbGFtYmRhSW50ZWdyYXRpb24sIHtcbiAgICAgIGF1dGhvcml6YXRpb25UeXBlLFxuICAgICAgYXV0aG9yaXplcixcbiAgICB9KTtcblxuICAgIC8vIENvbmZpZ3VyZSByZXNwb25zZSBzdHJlYW1pbmcgdmlhIENmbk1ldGhvZCBlc2NhcGUgaGF0Y2hcbiAgICAvLyBBUEkgR2F0ZXdheSBSRVNUIEFQSSByZXNwb25zZSBzdHJlYW1pbmcgcmVxdWlyZXM6XG4gICAgLy8gMS4gcmVzcG9uc2VUcmFuc2Zlck1vZGU6IFNUUkVBTSBvbiB0aGUgaW50ZWdyYXRpb25cbiAgICAvLyAyLiBJbnRlZ3JhdGlvbiBVUkkgcG9pbnRpbmcgdG8gL3Jlc3BvbnNlLXN0cmVhbWluZy1pbnZvY2F0aW9uc1xuICAgIGNvbnN0IGNmbk1ldGhvZCA9IHBvc3RNZXRob2Qubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYW55O1xuICAgIGlmIChjZm5NZXRob2QpIHtcbiAgICAgIGNmbk1ldGhvZC5hZGRQcm9wZXJ0eU92ZXJyaWRlKCdJbnRlZ3JhdGlvbi5SZXNwb25zZVRyYW5zZmVyTW9kZScsICdTVFJFQU0nKTtcbiAgICAgIC8vIE92ZXJyaWRlIHRoZSBpbnRlZ3JhdGlvbiBVUkkgdG8gdXNlIHJlc3BvbnNlLXN0cmVhbWluZy1pbnZvY2F0aW9ucyBwYXRoXG4gICAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZih0aGlzLnNjb3BlKS5yZWdpb247XG4gICAgICBjZm5NZXRob2QuYWRkUHJvcGVydHlPdmVycmlkZShcbiAgICAgICAgJ0ludGVncmF0aW9uLlVyaScsXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtyZWdpb259OmxhbWJkYTpwYXRoLzIwMjEtMTEtMTUvZnVuY3Rpb25zLyR7bGFtYmRhRnVuY3Rpb24uZnVuY3Rpb25Bcm59L3Jlc3BvbnNlLXN0cmVhbWluZy1pbnZvY2F0aW9uc2AsXG4gICAgICApO1xuICAgICAgLy8gU2V0IGludGVncmF0aW9uIHRpbWVvdXQgdG8gMTUgbWludXRlcyAoOTAwMDAwIG1zKVxuICAgICAgY2ZuTWV0aG9kLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ0ludGVncmF0aW9uLlRpbWVvdXRJbk1pbGxpcycsIDkwMDAwMCk7XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgQVBJIEdhdGV3YXkgcGVybWlzc2lvbiB0byBpbnZva2UgTGFtYmRhIHdpdGggcmVzcG9uc2Ugc3RyZWFtaW5nXG4gICAgbGFtYmRhRnVuY3Rpb24uYWRkUGVybWlzc2lvbignQXBpR2F0ZXdheUludm9rZScsIHtcbiAgICAgIHByaW5jaXBhbDogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbScpLFxuICAgICAgc291cmNlQXJuOiByZXN0QXBpLmFybkZvckV4ZWN1dGVBcGkoKSxcbiAgICB9KTtcblxuICAgIC8vIEFsc28gZ3JhbnQgSW52b2tlV2l0aFJlc3BvbnNlU3RyZWFtIHBlcm1pc3Npb25cbiAgICBsYW1iZGFGdW5jdGlvbi5hZGRQZXJtaXNzaW9uKCdBcGlHYXRld2F5U3RyZWFtSW52b2tlJywge1xuICAgICAgcHJpbmNpcGFsOiBuZXcgU2VydmljZVByaW5jaXBhbCgnYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tJyksXG4gICAgICBzb3VyY2VBcm46IHJlc3RBcGkuYXJuRm9yRXhlY3V0ZUFwaSgnUE9TVCcsICcvY2hhdCcpLFxuICAgICAgYWN0aW9uOiAnbGFtYmRhOkludm9rZUZ1bmN0aW9uVXJsJyxcbiAgICB9KTtcblxuICAgIC8vIENvbnN0cnVjdCBlbmRwb2ludCBVUkxcbiAgICBjb25zdCB1cmwgPSByZXN0QXBpLnVybEZvclBhdGgoJy9jaGF0Jyk7XG4gICAgKHRoaXMgYXMgYW55KS5hcGlFbmRwb2ludCA9IHVybDtcblxuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgdGhlIExhbWJkYSBmdW5jdGlvbiBwZXJtaXNzaW9ucyBmb3IgQVBJIEdhdGV3YXkgaW50ZWdyYXRpb24uXG4gICAqIEZvciBSRVNUIEFQSSBzdHJlYW1pbmcsIG5vIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXJlIG5lZWRlZCBiZXlvbmQgdGhlIGludm9rZSBwZXJtaXNzaW9uLlxuICAgKi9cbiAgZ3JhbnRJbnZva2UoX2xhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBSRVNUIEFQSSBzdHJlYW1pbmcgZG9lc24ndCBuZWVkIHBvc3RfdG9fY29ubmVjdGlvbiBsaWtlIFdlYlNvY2tldC5cbiAgICAvLyBUaGUgTGFtYmRhIGludm9rZSBwZXJtaXNzaW9uIGlzIGFscmVhZHkgZ3JhbnRlZCBpbiBhdHRhY2hUb0Z1bmN0aW9uLlxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGFkYXB0ZXIgd2l0aCBhIENESyBzY29wZS5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGF0dGFjaFRvRnVuY3Rpb24gb3IgZ3JhbnRJbnZva2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zZXRTY29wZShzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICB9XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBzZXNzaW9uIHBlcnNpc3RlbmNlLlxuICpcbiAqIFNlc3Npb24gc3RvcmVzIG1hbmFnZSBjb252ZXJzYXRpb24gc3RhdGUgcGVyc2lzdGVuY2UgYWNyb3NzIEhUVFAgcmVxdWVzdHMuXG4gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAoUzNTZXNzaW9uTWFuYWdlcikgdXNlcyBTMyBmb3IgZHVyYWJsZSBzdG9yYWdlLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgUzNTZXNzaW9uTWFuYWdlcmAgZnJvbSBgc3RyYW5kcy5zZXNzaW9uLnMzX3Nlc3Npb25fbWFuYWdlcmAgaW5zdGVhZC5cbiAqIFRoZSBQeXRob24gaGFuZGxlciBub3cgdXNlcyBTdHJhbmRzLW5hdGl2ZSBzZXNzaW9uIG1hbmFnZW1lbnQgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2Vzc2lvblN0b3JlIHtcbiAgLyoqXG4gICAqIFRoZSBTMyBidWNrZXQgdXNlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIChpZiBTMy1iYXNlZCkuXG4gICAqL1xuICByZWFkb25seSBzZXNzaW9uQnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogR3JhbnQgcmVhZC93cml0ZSBwZXJtaXNzaW9ucyB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUZ1bmN0aW9uIC0gVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgc2Vzc2lvbiBzdG9yZVxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBTM1Nlc3Npb25NYW5hZ2VyLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgUzNTZXNzaW9uTWFuYWdlcmAgZnJvbSBgc3RyYW5kcy5zZXNzaW9uLnMzX3Nlc3Npb25fbWFuYWdlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM1Nlc3Npb25NYW5hZ2VyUHJvcHMge1xuICAvKipcbiAgICogUzMgYnVja2V0IGZvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBidWNrZXQgd2l0aCBLTVMgZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGltZS10by1saXZlIGZvciBzZXNzaW9ucy5cbiAgICogU2Vzc2lvbnMgb2xkZXIgdGhhbiB0aGlzIGR1cmF0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWxldGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5ob3VycygyNClcbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25UVEw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogS01TIGVuY3J5cHRpb24ga2V5IGZvciB0aGUgc2Vzc2lvbiBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBLTVMga2V5IHdpdGggcm90YXRpb24gZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IElLZXk7XG5cbiAgLyoqXG4gICAqIFJlbW92YWwgcG9saWN5IGZvciB0aGUgc2Vzc2lvbiBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG59XG5cbi8qKlxuICogUzMtYmFzZWQgc2Vzc2lvbiBtYW5hZ2VyIGZvciBwZXJzaXN0aW5nIGNvbnZlcnNhdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2VzIFMzIGZvciBkdXJhYmxlIHN0b3JhZ2Ugb2Ygc2Vzc2lvbiBkYXRhIHdpdGggYXV0b21hdGljIGV4cGlyYXRpb25cbiAqIHZpYSBsaWZlY3ljbGUgcG9saWNpZXMuIEVhY2ggSFRUUCByZXF1ZXN0IGxvYWRzL3NhdmVzIHNlc3Npb24gc3RhdGUsXG4gKiBlbmFibGluZyBtdWx0aS10dXJuIGNvbnZlcnNhdGlvbnMgb3ZlciBzdGF0ZWxlc3MgSFRUUC5cbiAqXG4gKiAjIyBGZWF0dXJlc1xuICpcbiAqIC0gKipEdXJhYmxlIFN0b3JhZ2UqKjogU2Vzc2lvbnMgcGVyc2lzdGVkIHRvIFMzIHN1cnZpdmUgTGFtYmRhIHJlc3RhcnRzXG4gKiAtICoqQXV0b21hdGljIEV4cGlyYXRpb24qKjogTGlmZWN5Y2xlIHBvbGljeSByZW1vdmVzIG9sZCBzZXNzaW9uc1xuICogLSAqKkVuY3J5cHRpb24qKjogS01TIGVuY3J5cHRpb24gYXQgcmVzdFxuICogLSAqKkNvc3QgT3B0aW1pemF0aW9uKio6IFMzIFN0YW5kYXJkIHN0b3JhZ2Ugd2l0aCBsaWZlY3ljbGUgbWFuYWdlbWVudFxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIFMzU2Vzc2lvbk1hbmFnZXIgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKiBpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbiAqXG4gKiBjb25zdCBteVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqIGNvbnN0IHNlc3Npb25NYW5hZ2VyID0gbmV3IFMzU2Vzc2lvbk1hbmFnZXIodGhpcywgJ1Nlc3Npb25NYW5hZ2VyJywge1xuICogICBzZXNzaW9uVFRMOiBEdXJhdGlvbi5ob3Vycyg0OClcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBzZXNzaW9uU3RvcmU6IHNlc3Npb25NYW5hZ2VyXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBTdHJhbmRzLW5hdGl2ZSBgUzNTZXNzaW9uTWFuYWdlcmAgZnJvbSBgc3RyYW5kcy5zZXNzaW9uLnMzX3Nlc3Npb25fbWFuYWdlcmAgaW5zdGVhZC5cbiAqIFRoZSBQeXRob24gaGFuZGxlciBub3cgdXNlcyBTdHJhbmRzLW5hdGl2ZSBzZXNzaW9uIG1hbmFnZW1lbnQgYXV0b21hdGljYWxseS5cbiAqIEFuIFMzIGJ1Y2tldCBpcyBzdGlsbCBjcmVhdGVkIGZvciB0aGUgU3RyYW5kcyBzZXNzaW9uIG1hbmFnZXI7IHRoaXMgQ0RLIGNsYXNzXG4gKiBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGNvbmZpZ3VyZSBzZXNzaW9uIHBlcnNpc3RlbmNlLlxuICovXG5leHBvcnQgY2xhc3MgUzNTZXNzaW9uTWFuYWdlciBpbXBsZW1lbnRzIElTZXNzaW9uU3RvcmUge1xuICAvKipcbiAgICogVGhlIFMzIGJ1Y2tldCB1c2VkIGZvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vzc2lvbiBUVEwgZHVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvblRUTDogRHVyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFMzU2Vzc2lvbk1hbmFnZXJQcm9wcyA9IHt9KSB7XG4gICAgY29uc3QgcmVtb3ZhbFBvbGljeSA9IHByb3BzLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuICAgIGNvbnN0IHNlc3Npb25UVEwgPSBwcm9wcy5zZXNzaW9uVFRMIHx8IER1cmF0aW9uLmhvdXJzKDI0KTtcblxuICAgIC8vIFVzZSBwcm92aWRlZCBidWNrZXQgb3IgY3JlYXRlIG5ldyBvbmVcbiAgICB0aGlzLmJ1Y2tldCA9IHByb3BzLmJ1Y2tldCB8fCBuZXcgQnVja2V0KHNjb3BlLCBgJHtpZH1CdWNrZXRgLCB7XG4gICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuY3J5cHRpb25LZXk6IHByb3BzLmVuY3J5cHRpb25LZXksXG4gICAgICByZW1vdmFsUG9saWN5OiByZW1vdmFsUG9saWN5LFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHJlbW92YWxQb2xpY3kgPT09IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0RlbGV0ZU9sZFNlc3Npb25zJyxcbiAgICAgICAgICBleHBpcmF0aW9uOiBzZXNzaW9uVFRMLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgIHZlcnNpb25lZDogZmFsc2UsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXNzaW9uVFRMID0gc2Vzc2lvblRUTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHVzZWQgZm9yIHNlc3Npb24gc3RvcmFnZSAoSVNlc3Npb25TdG9yZSBpbnRlcmZhY2UpLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXNzaW9uQnVja2V0KCk6IElCdWNrZXQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkL3dyaXRlIHBlcm1pc3Npb25zIHRvIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgZ3JhbnRSZWFkV3JpdGUobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGxhbWJkYUZ1bmN0aW9uKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IGludGVyZmFjZSBmb3IgY29udmVyc2F0aW9uIGhpc3RvcnkgbWFuYWdlbWVudC5cbiAqXG4gKiBDb250ZXh0IHN0cmF0ZWdpZXMgY29udHJvbCBob3cgY29udmVyc2F0aW9uIGhpc3RvcnkgaXMgbWFpbnRhaW5lZCBhbmQgcHJvdmlkZWRcbiAqIHRvIHRoZSBhZ2VudC4gRGlmZmVyZW50IHN0cmF0ZWdpZXMgZW5hYmxlIGRpZmZlcmVudCBjb252ZXJzYXRpb24gcGF0dGVybnMuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0cmFuZHMtbmF0aXZlIGBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcmAgZnJvbVxuICogYHN0cmFuZHMuYWdlbnQuY29udmVyc2F0aW9uX21hbmFnZXJgIGluc3RlYWQuIFRoZSBQeXRob24gaGFuZGxlciBub3cgdXNlc1xuICogU3RyYW5kcy1uYXRpdmUgY29udmVyc2F0aW9uIG1hbmFnZW1lbnQgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29udGV4dFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gY29uZmlndXJlIHRoZSBjb250ZXh0IG1hbmFnZXJcbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBmcm9tXG4gKiBgc3RyYW5kcy5hZ2VudC5jb252ZXJzYXRpb25fbWFuYWdlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlclByb3BzIHtcbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGtlZXAgaW4gY29udmVyc2F0aW9uIGhpc3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IDIwIG1lc3NhZ2VzXG4gICAqL1xuICByZWFkb25seSB3aW5kb3dTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNsaWRpbmcgd2luZG93IGNvbnZlcnNhdGlvbiBtYW5hZ2VyIGZvciBtYWludGFpbmluZyByZWNlbnQgY29udmVyc2F0aW9uIGhpc3RvcnkuXG4gKlxuICogS2VlcHMgYSBmaXhlZC1zaXplIHdpbmRvdyBvZiByZWNlbnQgbWVzc2FnZXMsIGF1dG9tYXRpY2FsbHkgZGlzY2FyZGluZyBvbGRlclxuICogbWVzc2FnZXMgYXMgbmV3IG9uZXMgYXJyaXZlLiBQcm92aWRlcyBjb25zaXN0ZW50IGNvbnRleHQgc2l6ZSBmb3IgdGhlIGFnZW50LlxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbiAqIGltcG9ydCB7IEludGVyYWN0aXZlQWdlbnQsIFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyIH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IG15UHJvbXB0ID0gbmV3IEFzc2V0KHRoaXMsICdQcm9tcHQnLCB7IHBhdGg6ICcuL3Byb21wdC50eHQnIH0pO1xuICogY29uc3QgY29udGV4dE1hbmFnZXIgPSBuZXcgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIoeyB3aW5kb3dTaXplOiAzMCB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnQ2hhdEFnZW50JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgY29udGV4dFN0cmF0ZWd5OiBjb250ZXh0TWFuYWdlclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgU3RyYW5kcy1uYXRpdmUgYFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyYCBmcm9tXG4gKiBgc3RyYW5kcy5hZ2VudC5jb252ZXJzYXRpb25fbWFuYWdlcmAgaW5zdGVhZC4gVGhlIFB5dGhvbiBoYW5kbGVyIG5vdyBoYW5kbGVzXG4gKiBjb252ZXJzYXRpb24gd2luZG93aW5nIG5hdGl2ZWx5LlxuICovXG5leHBvcnQgY2xhc3MgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQ29udGV4dFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIFRoZSB3aW5kb3cgc2l6ZSAobnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGtlZXApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdpbmRvd1NpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJQcm9wcyA9IHt9KSB7XG4gICAgY29uc3Qgd2luZG93U2l6ZSA9IHByb3BzLndpbmRvd1NpemUgIT09IHVuZGVmaW5lZCA/IHByb3BzLndpbmRvd1NpemUgOiAyMDtcblxuICAgIGlmICh3aW5kb3dTaXplIDwgMSB8fCB3aW5kb3dTaXplID4gMTAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3aW5kb3dTaXplIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAwJyk7XG4gICAgfVxuXG4gICAgdGhpcy53aW5kb3dTaXplID0gd2luZG93U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMYW1iZGEgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGVudmlyb25tZW50VmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB7XG4gICAgICBDT05URVhUX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgIENPTlRFWFRfU1RSQVRFR1k6ICdTbGlkaW5nV2luZG93JyxcbiAgICAgIENPTlRFWFRfV0lORE9XX1NJWkU6IHRoaXMud2luZG93U2l6ZS50b1N0cmluZygpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBOdWxsIGNvbnZlcnNhdGlvbiBtYW5hZ2VyIGZvciBzdGF0ZWxlc3MgaW50ZXJhY3Rpb25zLlxuICpcbiAqIERpc2FibGVzIGNvbnZlcnNhdGlvbiBoaXN0b3J5LCB0cmVhdGluZyBlYWNoIG1lc3NhZ2UgYXMgaW5kZXBlbmRlbnQuXG4gKiBVc2VmdWwgZm9yIHN0YXRlbGVzcyB1c2UgY2FzZXMgd2hlcmUgY29udGV4dCBpcyBub3QgbmVlZGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSBQeXRob24gaGFuZGxlciBub3cgdXNlcyBTdHJhbmRzLW5hdGl2ZSBjb252ZXJzYXRpb24gbWFuYWdlbWVudC5cbiAqIFRvIGRpc2FibGUgY29udmVyc2F0aW9uIGhpc3RvcnksIG9taXQgdGhlIHNlc3Npb24gYnVja2V0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBOdWxsQ29udmVyc2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb250ZXh0U3RyYXRlZ3kge1xuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQ09OVEVYVF9FTkFCTEVEOiAnZmFsc2UnLFxuICAgICAgQ09OVEVYVF9TVFJBVEVHWTogJ051bGwnLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBTdHJhdGVneSBpbnRlcmZhY2UgZm9yIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMuXG4gKlxuICogQXV0aGVudGljYXRvcnMgY29udHJvbCBob3cgQVBJIGVuZHBvaW50cyBhcmUgc2VjdXJlZC5cbiAqIERpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydCB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhlbnRpY2F0b3Ige1xuICAvKipcbiAgICogR3JhbnQgYXV0aGVudGljYXRpb24gcGVybWlzc2lvbnMgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBncmFudEF1dGhlbnRpY2F0ZShsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uKTogdm9pZDtcblxuICAvKipcbiAgICogR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGFtYmRhIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgQ29nbml0b0F1dGhlbnRpY2F0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29nbml0b0F1dGhlbnRpY2F0b3JQcm9wcyB7XG4gIC8qKlxuICAgKiBDb2duaXRvIFVzZXIgUG9vbCBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tY3JlYXRlZCBVc2VyIFBvb2wgd2l0aCBzZWN1cmUgZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJQb29sPzogVXNlclBvb2w7XG5cbiAgLyoqXG4gICAqIENvZ25pdG8gVXNlciBQb29sIENsaWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIGNsaWVudCB3aXRoIGFwcHJvcHJpYXRlIGF1dGggZmxvd3NcbiAgICovXG4gIHJlYWRvbmx5IHVzZXJQb29sQ2xpZW50PzogVXNlclBvb2xDbGllbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92YWwgcG9saWN5IGZvciBDb2duaXRvIHJlc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBDb2duaXRvLWJhc2VkIGF1dGhlbnRpY2F0b3IgZm9yIHNlY3VyaW5nIFJFU1QgQVBJIGVuZHBvaW50cy5cbiAqXG4gKiBDcmVhdGVzIGEgQ29nbml0byBVc2VyIFBvb2wgYW5kIGludGVncmF0ZXMgd2l0aCBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICogdXNpbmcgdGhlIG5hdGl2ZSBDT0dOSVRPX1VTRVJfUE9PTFMgYXV0aG9yaXplciB0eXBlLiBDbGllbnRzIHNlbmRcbiAqIEpXVCB0b2tlbnMgaW4gdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLlxuICpcbiAqICMjIEZlYXR1cmVzXG4gKlxuICogLSAqKk5hdGl2ZSBKV1QgVmFsaWRhdGlvbioqOiBBUEkgR2F0ZXdheSB2YWxpZGF0ZXMgdG9rZW5zIHdpdGhvdXQgY3VzdG9tIExhbWJkYVxuICogLSAqKlVzZXIgTWFuYWdlbWVudCoqOiBCdWlsdC1pbiB1c2VyIHJlZ2lzdHJhdGlvbiBhbmQgbWFuYWdlbWVudFxuICogLSAqKlBhc3N3b3JkIFBvbGljaWVzKio6IEVuZm9yY2VzIHN0cm9uZyBwYXNzd29yZCByZXF1aXJlbWVudHNcbiAqIC0gKipBY2NvdW50IFJlY292ZXJ5Kio6IEVtYWlsLWJhc2VkIGFjY291bnQgcmVjb3ZlcnlcbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWInO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgQ29nbml0b0F1dGhlbnRpY2F0b3IgfSBmcm9tICdAY2RrbGFicy9jZGstYXBwbW9kLWNhdGFsb2ctYmx1ZXByaW50cyc7XG4gKlxuICogY29uc3QgbXlQcm9tcHQgPSBuZXcgQXNzZXQodGhpcywgJ1Byb21wdCcsIHsgcGF0aDogJy4vcHJvbXB0LnR4dCcgfSk7XG4gKiBjb25zdCBhdXRoZW50aWNhdG9yID0gbmV3IENvZ25pdG9BdXRoZW50aWNhdG9yKHtcbiAqICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU5cbiAqIH0pO1xuICpcbiAqIGNvbnN0IGFnZW50ID0gbmV3IEludGVyYWN0aXZlQWdlbnQodGhpcywgJ0FnZW50Jywge1xuICogICBhZ2VudE5hbWU6ICdDaGF0QWdlbnQnLFxuICogICBhZ2VudERlZmluaXRpb246IHsgYmVkcm9ja01vZGVsOiB7fSwgc3lzdGVtUHJvbXB0OiBteVByb21wdCB9LFxuICogICBhdXRoZW50aWNhdG9yXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29nbml0b0F1dGhlbnRpY2F0b3IgaW1wbGVtZW50cyBJQXV0aGVudGljYXRvciB7XG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBVc2VyIFBvb2wuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclBvb2w/OiBVc2VyUG9vbDtcblxuICAvKipcbiAgICogVGhlIENvZ25pdG8gVXNlciBQb29sIENsaWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyUG9vbENsaWVudD86IFVzZXJQb29sQ2xpZW50O1xuXG4gIHByaXZhdGUgc2NvcGU/OiBDb25zdHJ1Y3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ29nbml0b0F1dGhlbnRpY2F0b3JQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy51c2VyUG9vbCA9IHByb3BzLnVzZXJQb29sO1xuICAgIHRoaXMudXNlclBvb2xDbGllbnQgPSBwcm9wcy51c2VyUG9vbENsaWVudDtcbiAgICB0aGlzLnJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBhdXRoZW50aWNhdGlvbiBwZXJtaXNzaW9ucyB0byBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICogR3JhbnRzIHBlcm1pc3Npb25zIHRvIHZlcmlmeSBDb2duaXRvIHRva2Vucy5cbiAgICovXG4gIGdyYW50QXV0aGVudGljYXRlKGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2NvcGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29nbml0b0F1dGhlbnRpY2F0b3IgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgc2NvcGUgYmVmb3JlIGNhbGxpbmcgZ3JhbnRBdXRoZW50aWNhdGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlclBvb2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBQb29sIG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgZ3JhbnRpbmcgcGVybWlzc2lvbnMuIENhbGwgX3NldFNjb3BlIGZpcnN0LicpO1xuICAgIH1cblxuICAgIGxhbWJkYUZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdjb2duaXRvLWlkcDpHZXRVc2VyJyxcbiAgICAgICAgICAnY29nbml0by1pZHA6QWRtaW5HZXRVc2VyJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy51c2VyUG9vbC51c2VyUG9vbEFybl0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFVVEhfVFlQRTogJ0NvZ25pdG8nLFxuICAgICAgVVNFUl9QT09MX0lEOiB0aGlzLnVzZXJQb29sPy51c2VyUG9vbElkIHx8ICcnLFxuICAgICAgVVNFUl9QT09MX0NMSUVOVF9JRDogdGhpcy51c2VyUG9vbENsaWVudD8udXNlclBvb2xDbGllbnRJZCB8fCAnJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGF1dGhlbnRpY2F0b3Igd2l0aCBhIENESyBzY29wZS5cbiAgICogQ3JlYXRlcyBVc2VyIFBvb2wgYW5kIENsaWVudCBpZiBub3QgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zZXRTY29wZShzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuXG4gICAgaWYgKCF0aGlzLnVzZXJQb29sKSB7XG4gICAgICAodGhpcyBhcyBhbnkpLnVzZXJQb29sID0gbmV3IFVzZXJQb29sKHNjb3BlLCAnVXNlclBvb2wnLCB7XG4gICAgICAgIHVzZXJQb29sTmFtZTogYCR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX0tVXNlclBvb2xgLFxuICAgICAgICBzZWxmU2lnblVwRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgc2lnbkluQWxpYXNlczoge1xuICAgICAgICAgIGVtYWlsOiB0cnVlLFxuICAgICAgICAgIHVzZXJuYW1lOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBhdXRvVmVyaWZ5OiB7XG4gICAgICAgICAgZW1haWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHBhc3N3b3JkUG9saWN5OiB7XG4gICAgICAgICAgbWluTGVuZ3RoOiA4LFxuICAgICAgICAgIHJlcXVpcmVMb3dlcmNhc2U6IHRydWUsXG4gICAgICAgICAgcmVxdWlyZVVwcGVyY2FzZTogdHJ1ZSxcbiAgICAgICAgICByZXF1aXJlRGlnaXRzOiB0cnVlLFxuICAgICAgICAgIHJlcXVpcmVTeW1ib2xzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBtZmE6IE1mYS5PUFRJT05BTCxcbiAgICAgICAgbWZhU2Vjb25kRmFjdG9yOiB7XG4gICAgICAgICAgc21zOiB0cnVlLFxuICAgICAgICAgIG90cDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgYWNjb3VudFJlY292ZXJ5OiBBY2NvdW50UmVjb3ZlcnkuRU1BSUxfT05MWSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogdGhpcy5yZW1vdmFsUG9saWN5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZXJQb29sQ2xpZW50ICYmIHRoaXMudXNlclBvb2wpIHtcbiAgICAgICh0aGlzIGFzIGFueSkudXNlclBvb2xDbGllbnQgPSBuZXcgVXNlclBvb2xDbGllbnQoc2NvcGUsICdVc2VyUG9vbENsaWVudCcsIHtcbiAgICAgICAgdXNlclBvb2w6IHRoaXMudXNlclBvb2wsXG4gICAgICAgIHVzZXJQb29sQ2xpZW50TmFtZTogYCR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX0tVXNlclBvb2xDbGllbnRgLFxuICAgICAgICBhdXRoRmxvd3M6IHtcbiAgICAgICAgICB1c2VyUGFzc3dvcmQ6IHRydWUsXG4gICAgICAgICAgdXNlclNycDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXQ6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0ZWRJZGVudGl0eVByb3ZpZGVyczogW1xuICAgICAgICAgIFVzZXJQb29sQ2xpZW50SWRlbnRpdHlQcm92aWRlci5DT0dOSVRPLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTm8tYXV0aGVudGljYXRpb24gYXV0aGVudGljYXRvciBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuXG4gKlxuICogRGlzYWJsZXMgYXV0aGVudGljYXRpb24gZW50aXJlbHksIGFsbG93aW5nIGFueSBjbGllbnQgdG8gY29ubmVjdFxuICogd2l0aG91dCBjcmVkZW50aWFscy4gVGhpcyBzaG91bGQgT05MWSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudFxuICogYW5kIHRlc3RpbmcgZW52aXJvbm1lbnRzLlxuICpcbiAqICMjIFNlY3VyaXR5IFdhcm5pbmdcbiAqXG4gKiBUaGlzIGF1dGhlbnRpY2F0b3IgcHJvdmlkZXMgTk8gc2VjdXJpdHkuIE5ldmVyIHVzZSBpbiBwcm9kdWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgTm9BdXRoZW50aWNhdG9yIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0b3Ige1xuICAvKipcbiAgICogTm8tb3AgZm9yIE5vQXV0aGVudGljYXRvciBzaW5jZSBubyBhdXRoZW50aWNhdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAqL1xuICBncmFudEF1dGhlbnRpY2F0ZShfbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbik6IHZvaWQge1xuICAgIC8vIE5vIHBlcm1pc3Npb25zIG5lZWRlZFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExhbWJkYSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZW52aXJvbm1lbnRWYXJpYWJsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFVVEhfVFlQRTogJ05vbmUnLFxuICAgIH07XG4gIH1cbn1cblxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIGEgaG9zdGluZyBhZGFwdGVyJ3MgZGVwbG95IG1ldGhvZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZ2VudEhvc3RpbmdDb25maWcge1xuICAvKiogQ0RLIHNjb3BlIGZvciBjcmVhdGluZyByZXNvdXJjZXMuICovXG4gIHJlYWRvbmx5IHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIC8qKiBBZ2VudCBuYW1lIGlkZW50aWZpZXIuICovXG4gIHJlYWRvbmx5IGFnZW50TmFtZTogc3RyaW5nO1xuICAvKiogSUFNIHJvbGUgZm9yIHRoZSBhZ2VudCBydW50aW1lLiAqL1xuICByZWFkb25seSBhZ2VudFJvbGU6IFJvbGU7XG4gIC8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IG9uIHRoZSBydW50aW1lLiAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIEtNUyBlbmNyeXB0aW9uIGtleS4gKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogS2V5O1xuICAvKiogT3B0aW9uYWwgVlBDIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gKi9cbiAgcmVhZG9ubHkgbmV0d29yaz86IE5ldHdvcms7XG4gIC8qKiBMYW1iZGEgYXJjaGl0ZWN0dXJlIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuICAvKiogTGFtYmRhIG1lbW9yeSBzaXplIGluIE1CIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgLyoqIExhbWJkYSB0aW1lb3V0IChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuICAvKiogUmVzZXJ2ZWQgY29uY3VycmVudCBleGVjdXRpb25zIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcbiAgLyoqIExhbWJkYSBsYXllcnMgZnJvbSBhZ2VudCBkZWZpbml0aW9uIChMYW1iZGEgaG9zdGluZyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbGFtYmRhTGF5ZXJzPzogSUxheWVyVmVyc2lvbltdO1xuICAvKiogTGFtYmRhIGxheWVycyBmcm9tIGtub3dsZWRnZSBiYXNlcyAoTGFtYmRhIGhvc3Rpbmcgb25seSkuICovXG4gIHJlYWRvbmx5IGtub3dsZWRnZUJhc2VMYXllcnM/OiBJTGF5ZXJWZXJzaW9uW107XG4gIC8qKiBXaGV0aGVyIG9ic2VydmFiaWxpdHkgaXMgZW5hYmxlZC4gKi9cbiAgcmVhZG9ubHkgZW5hYmxlT2JzZXJ2YWJpbGl0eT86IGJvb2xlYW47XG4gIC8qKiBBZ2VudCB0b29scyBsb2NhdGlvbiBkZWZpbml0aW9ucyAoSlNPTiBzZXJpYWxpemVkKS4gKi9cbiAgcmVhZG9ubHkgdG9vbHNDb25maWc6IHN0cmluZztcbiAgLyoqIFN5c3RlbSBwcm9tcHQgUzMgYnVja2V0IG5hbWUuICovXG4gIHJlYWRvbmx5IHN5c3RlbVByb21wdEJ1Y2tldDogc3RyaW5nO1xuICAvKiogU3lzdGVtIHByb21wdCBTMyBrZXkuICovXG4gIHJlYWRvbmx5IHN5c3RlbVByb21wdEtleTogc3RyaW5nO1xuICAvKiogS25vd2xlZGdlIGJhc2UgY29uZmlncyAoSlNPTiBzZXJpYWxpemVkKS4gKi9cbiAgcmVhZG9ubHkga25vd2xlZGdlQmFzZUNvbmZpZ3M/OiBzdHJpbmc7XG4gIC8qKiBLbm93bGVkZ2UgYmFzZSBzeXN0ZW0gcHJvbXB0IGFkZGl0aW9uLiAqL1xuICByZWFkb25seSBrbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb24/OiBzdHJpbmc7XG4gIC8qKiBSZW1vdmFsIHBvbGljeSBmb3IgcmVzb3VyY2VzLiAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgYSBob3N0aW5nIGFkYXB0ZXIncyBkZXBsb3kgbWV0aG9kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50SG9zdGluZ1Jlc3VsdCB7XG4gIC8qKiBUaGUgYWdlbnQgZW5kcG9pbnQgVVJMIG9yIEFSTi4gKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZztcbiAgLyoqIFRoZSBMYW1iZGEgZnVuY3Rpb24gKGlmIExhbWJkYS1ob3N0ZWQpLiAqL1xuICByZWFkb25seSBhZ2VudEZ1bmN0aW9uPzogSUZ1bmN0aW9uO1xuICAvKiogVGhlIEFnZW50Q29yZSBDZm5SdW50aW1lIChpZiBBZ2VudENvcmUtaG9zdGVkKS4gKi9cbiAgcmVhZG9ubHkgY2ZuUnVudGltZT86IENmblJ1bnRpbWU7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgaW50ZXJmYWNlIGZvciBwbHVnZ2FibGUgaG9zdGluZyBiYWNrZW5kcy5cbiAqXG4gKiBIb3N0aW5nIGFkYXB0ZXJzIGVuY2Fwc3VsYXRlIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gcnVuIGFuIGFnZW50LlxuICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYExhbWJkYUhvc3RpbmdBZGFwdGVyYCAoTGFtYmRhICsgTFdBICsgQVBJIEdhdGV3YXkpLlxuICogYEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlcmAgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdXNpbmcgQWdlbnRDb3JlIFJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUhvc3RpbmdBZGFwdGVyIHtcbiAgLyoqXG4gICAqIFRoZSBJQU0gc2VydmljZSBwcmluY2lwYWwgdGhhdCB0aGlzIGhvc3RpbmcgYmFja2VuZCByZXF1aXJlcy5cbiAgICpcbiAgICogQmFzZUFnZW50IHVzZXMgdGhpcyB0byBjcmVhdGUgdGhlIGFnZW50IHJvbGUgd2l0aCB0aGUgY29ycmVjdCB0cnVzdCBwb2xpY3kuXG4gICAqIEZvciBleGFtcGxlLCBMYW1iZGEgaG9zdGluZyByZXF1aXJlcyBgbGFtYmRhLmFtYXpvbmF3cy5jb21gIHdoaWxlIEFnZW50Q29yZVxuICAgKiBob3N0aW5nIHJlcXVpcmVzIGBiZWRyb2NrLWFnZW50Y29yZS5hbWF6b25hd3MuY29tYC5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VQcmluY2lwYWw6IFNlcnZpY2VQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIERlcGxveSB0aGUgYWdlbnQgaG9zdGluZyBpbmZyYXN0cnVjdHVyZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBob3N0aW5nXG4gICAqIEByZXR1cm5zIFRoZSBob3N0aW5nIHJlc3VsdCBpbmNsdWRpbmcgZW5kcG9pbnQgYW5kIG9wdGlvbmFsIHJlc291cmNlc1xuICAgKi9cbiAgZGVwbG95KGNvbmZpZzogQWdlbnRIb3N0aW5nQ29uZmlnKTogQWdlbnRIb3N0aW5nUmVzdWx0O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgTGFtYmRhSG9zdGluZ0FkYXB0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhSG9zdGluZ0FkYXB0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBDb21tdW5pY2F0aW9uIGFkYXB0ZXIgZm9yIGNsaWVudC1hZ2VudCBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RyZWFtaW5nSHR0cEFkYXB0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGNvbW11bmljYXRpb25BZGFwdGVyPzogSUNvbW11bmljYXRpb25BZGFwdGVyO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdG9yIGZvciBzZWN1cmluZyBBUEkgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDb2duaXRvQXV0aGVudGljYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gbWVtb3J5IHNpemUgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwMjRcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiB0aW1lb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDE1KVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuWDg2XzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFJlc2VydmVkIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gcmVzZXJ2ZWQgY29uY3VycmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGFtYmRhIGhvc3RpbmcgYWRhcHRlciBmb3IgSW50ZXJhY3RpdmVBZ2VudC5cbiAqXG4gKiBEZXBsb3lzIHRoZSBhZ2VudCBhcyBhIExhbWJkYSBmdW5jdGlvbiBiZWhpbmQgTGFtYmRhIFdlYiBBZGFwdGVyIGFuZCBBUEkgR2F0ZXdheVxuICogUkVTVCBBUEkgd2l0aCByZXNwb25zZSBzdHJlYW1pbmcuIFRoaXMgaXMgdGhlIGRlZmF1bHQgaG9zdGluZyBiYWNrZW5kLlxuICpcbiAqICMjIEFyY2hpdGVjdHVyZVxuICpcbiAqIGBgYFxuICogQ2xpZW50IOKGkiBQT1NUIC9jaGF0IOKGkiBBUEkgR2F0ZXdheSBSRVNUIEFQSSAoU1RSRUFNKSDihpIgTGFtYmRhIChGYXN0QVBJICsgTFdBKSDihpIgQmVkcm9ja1xuICogQ2xpZW50IOKGkCBTU0Ugc3RyZWFtIOKGkCBBUEkgR2F0ZXdheSDihpAgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyDihpAgQWdlbnQgdG9rZW5zXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUhvc3RpbmdBZGFwdGVyIGltcGxlbWVudHMgSUhvc3RpbmdBZGFwdGVyIHtcbiAgLyoqIFRoZSBjb21tdW5pY2F0aW9uIGFkYXB0ZXIuICovXG4gIHB1YmxpYyByZWFkb25seSBjb21tdW5pY2F0aW9uQWRhcHRlcj86IElDb21tdW5pY2F0aW9uQWRhcHRlcjtcbiAgLyoqIFRoZSBhdXRoZW50aWNhdG9yLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXV0aGVudGljYXRvcj86IElBdXRoZW50aWNhdG9yO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IExhbWJkYUhvc3RpbmdBZGFwdGVyUHJvcHM7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IExhbWJkYUhvc3RpbmdBZGFwdGVyUHJvcHMgPSB7fSkge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgfVxuXG4gIGdldCBzZXJ2aWNlUHJpbmNpcGFsKCkgeyByZXR1cm4gbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyk7IH1cblxuICAvKipcbiAgICogRGVwbG95IExhbWJkYSArIExXQSArIEFQSSBHYXRld2F5IGhvc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQge1xuICAgIGNvbnN0IHNjb3BlID0gY29uZmlnLnNjb3BlO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhdXRoZW50aWNhdG9yXG4gICAgY29uc3QgYXV0aGVudGljYXRvciA9IHRoaXMucHJvcHMuYXV0aGVudGljYXRvciAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHRoaXMucHJvcHMuYXV0aGVudGljYXRvclxuICAgICAgOiBuZXcgQ29nbml0b0F1dGhlbnRpY2F0b3IoKTtcbiAgICAodGhpcyBhcyBhbnkpLmF1dGhlbnRpY2F0b3IgPSBhdXRoZW50aWNhdG9yO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0b3IgaW5zdGFuY2VvZiBDb2duaXRvQXV0aGVudGljYXRvcikge1xuICAgICAgYXV0aGVudGljYXRvci5fc2V0U2NvcGUoc2NvcGUpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgY29tbXVuaWNhdGlvbiBhZGFwdGVyXG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMucHJvcHMuY29tbXVuaWNhdGlvbkFkYXB0ZXIgfHwgbmV3IFN0cmVhbWluZ0h0dHBBZGFwdGVyKHtcbiAgICAgIGF1dGhlbnRpY2F0b3IsXG4gICAgfSk7XG4gICAgKHRoaXMgYXMgYW55KS5jb21tdW5pY2F0aW9uQWRhcHRlciA9IGFkYXB0ZXI7XG5cbiAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0cmVhbWluZ0h0dHBBZGFwdGVyKSB7XG4gICAgICBhZGFwdGVyLl9zZXRTY29wZShzY29wZSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLi4uY29uZmlnLmVudmlyb25tZW50LFxuICAgICAgLy8gTGFtYmRhIFdlYiBBZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAgICAgIEFXU19MQU1CREFfRVhFQ19XUkFQUEVSOiAnL29wdC9ib290c3RyYXAnLFxuICAgICAgQVdTX0xXQV9JTlZPS0VfTU9ERTogJ3Jlc3BvbnNlX3N0cmVhbScsXG4gICAgICBBV1NfTFdBX1JFQURJTkVTU19DSEVDS19QQVRIOiAnL2hlYWx0aCcsXG4gICAgICBBV1NfTFdBX1BPUlQ6ICc4MDgwJyxcbiAgICAgIFBPUlQ6ICc4MDgwJyxcbiAgICAgIC4uLmF1dGhlbnRpY2F0b3IuZW52aXJvbm1lbnRWYXJpYWJsZXMoKSxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIExhbWJkYSBmdW5jdGlvbiB3aXRoIExhbWJkYSBXZWIgQWRhcHRlciBsYXllclxuICAgIGNvbnN0IHsgYWNjb3VudCwgcmVnaW9uIH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdCA9IExhbWJkYUlhbVV0aWxzLmNyZWF0ZUxvZ3NQZXJtaXNzaW9ucyh7XG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgc2NvcGUsXG4gICAgICBmdW5jdGlvbk5hbWU6IGNvbmZpZy5hZ2VudE5hbWUsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBjb25maWcuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICB9KTtcblxuICAgIC8vIExhbWJkYSBXZWIgQWRhcHRlciBsYXllclxuICAgIGNvbnN0IHdlYkFkYXB0ZXJMYXllciA9IExheWVyVmVyc2lvbi5mcm9tTGF5ZXJWZXJzaW9uQXJuKFxuICAgICAgc2NvcGUsXG4gICAgICAnTGFtYmRhV2ViQWRhcHRlckxheWVyJyxcbiAgICAgIGBhcm46YXdzOmxhbWJkYToke3JlZ2lvbn06NzUzMjQwNTk4MDc1OmxheWVyOkxhbWJkYUFkYXB0ZXJMYXllclg4NjoyNWAsXG4gICAgKTtcblxuICAgIGNvbnN0IGFsbExheWVyczogSUxheWVyVmVyc2lvbltdID0gW3dlYkFkYXB0ZXJMYXllcl07XG4gICAgaWYgKGNvbmZpZy5sYW1iZGFMYXllcnMpIHtcbiAgICAgIGFsbExheWVycy5wdXNoKC4uLmNvbmZpZy5sYW1iZGFMYXllcnMpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMgJiYgY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgYWxsTGF5ZXJzLnB1c2goLi4uY29uZmlnLmtub3dsZWRnZUJhc2VMYXllcnMpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9pbnRlcmFjdGl2ZS1hZ2VudC1oYW5kbGVyJyk7XG5cbiAgICAvLyBBbGwgUHl0aG9uIHZlcnNpb24gcmVmZXJlbmNlcyBkZXJpdmVkIGZyb20gRGVmYXVsdFJ1bnRpbWVzLlBZVEhPTlxuICAgIGNvbnN0IHB5dGhvblJ1bnRpbWUgPSBEZWZhdWx0UnVudGltZXMuUFlUSE9OO1xuICAgIGNvbnN0IHB5VmVyc2lvbiA9IHB5dGhvblJ1bnRpbWUubmFtZS5yZXBsYWNlKCdweXRob24nLCAnJyk7IC8vIGUuZy4gXCIzLjEzXCJcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IHRoaXMucHJvcHMuYXJjaGl0ZWN0dXJlIHx8IGNvbmZpZy5hcmNoaXRlY3R1cmUgfHwgQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbiAgICBjb25zdCBtZW1vcnlTaXplID0gdGhpcy5wcm9wcy5tZW1vcnlTaXplIHx8IGNvbmZpZy5tZW1vcnlTaXplIHx8IDEwMjQ7XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMucHJvcHMudGltZW91dCB8fCBjb25maWcudGltZW91dCB8fCBEdXJhdGlvbi5taW51dGVzKDE1KTtcbiAgICBjb25zdCByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zID0gdGhpcy5wcm9wcy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zID8/IGNvbmZpZy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zO1xuXG4gICAgY29uc3QgYWdlbnRGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihzY29wZSwgJ0ludGVyYWN0aXZlQWdlbnRGdW5jdGlvbicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdC51bmlxdWVGdW5jdGlvbk5hbWUsXG4gICAgICBhcmNoaXRlY3R1cmUsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChoYW5kbGVyUGF0aCwge1xuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIGltYWdlOiBweXRob25SdW50aW1lLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgY29tbWFuZDogW1xuICAgICAgICAgICAgJ2Jhc2gnLCAnLWMnLFxuICAgICAgICAgICAgJ3BpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQgLXQgL2Fzc2V0LW91dHB1dCAmJiBjcCAtYSAuIC9hc3NldC1vdXRwdXQnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICAgICAgICAgIGNvbnN0IHB5dGhvbkNhbmRpZGF0ZXMgPSBbYHB5dGhvbiR7cHlWZXJzaW9ufWAsICdweXRob24zJywgJ3B5dGhvbiddO1xuICAgICAgICAgICAgICAgIGxldCBweXRob25CaW4gPSAncHl0aG9uMyc7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgcHl0aG9uQ2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyID0gcHJvYy5leGVjU3luYyhgJHtjYW5kaWRhdGV9IC0tdmVyc2lvbiAyPiYxYCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmVyLm1hdGNoKC9QeXRob24gKFxcZCspXFwuKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiAocGFyc2VJbnQobWF0Y2hbMV0pID4gMyB8fCAocGFyc2VJbnQobWF0Y2hbMV0pID09PSAzICYmIHBhcnNlSW50KG1hdGNoWzJdKSA+PSAxMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcHl0aG9uQmluID0gY2FuZGlkYXRlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb2MuZXhlY1N5bmMoXG4gICAgICAgICAgICAgICAgICBgJHtweXRob25CaW59IC1tIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQgLXQgXCIke291dHB1dERpcn1cIiAtLXBsYXRmb3JtIG1hbnlsaW51eDIwMTRfeDg2XzY0IC0tb25seS1iaW5hcnk9OmFsbDogLS1weXRob24tdmVyc2lvbiAke3B5VmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgeyBjd2Q6IGhhbmRsZXJQYXRoLCBzdGRpbzogJ2luaGVyaXQnIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwcm9jLmV4ZWNTeW5jKFxuICAgICAgICAgICAgICAgICAgYGNwIC1yIC4gXCIke291dHB1dERpcn1cImAsXG4gICAgICAgICAgICAgICAgICB7IGN3ZDogaGFuZGxlclBhdGgsIHN0ZGlvOiAnaW5oZXJpdCcgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgcm9sZTogY29uZmlnLmFnZW50Um9sZSxcbiAgICAgIGhhbmRsZXI6ICdydW4uc2gnLFxuICAgICAgcnVudGltZTogcHl0aG9uUnVudGltZSxcbiAgICAgIGxheWVyczogYWxsTGF5ZXJzLFxuICAgICAgdGltZW91dCxcbiAgICAgIG1lbW9yeVNpemUsXG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiBjb25maWcuZW5jcnlwdGlvbktleSxcbiAgICAgIHZwYzogY29uZmlnLm5ldHdvcmsgPyBjb25maWcubmV0d29yay52cGMgOiB1bmRlZmluZWQsXG4gICAgICB2cGNTdWJuZXRzOiBjb25maWcubmV0d29yayA/IGNvbmZpZy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgIH0pO1xuXG4gICAgLy8gR3JhbnQgbG9nIHBlcm1pc3Npb25zXG4gICAgZm9yIChjb25zdCBzIG9mIGFnZW50TGFtYmRhTG9nUGVybWlzc2lvbnNSZXN1bHQucG9saWN5U3RhdGVtZW50cykge1xuICAgICAgY29uZmlnLmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzKTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBhdXRoZW50aWNhdG9yIHBlcm1pc3Npb25zXG4gICAgaWYgKGF1dGhlbnRpY2F0b3IpIHtcbiAgICAgIGF1dGhlbnRpY2F0b3IuZ3JhbnRBdXRoZW50aWNhdGUoYWdlbnRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNoIGNvbW11bmljYXRpb24gYWRhcHRlciBhbmQgZ2V0IGVuZHBvaW50XG4gICAgY29uc3QgZW5kcG9pbnQgPSBhZGFwdGVyLmF0dGFjaFRvRnVuY3Rpb24oYWdlbnRGdW5jdGlvbik7XG4gICAgYWRhcHRlci5ncmFudEludm9rZShhZ2VudEZ1bmN0aW9uKTtcblxuICAgIHJldHVybiB7IGVuZHBvaW50LCBhZ2VudEZ1bmN0aW9uIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDdXN0b20gSldUIGF1dGhvcml6ZXIgY29uZmlndXJhdGlvbiBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRDb3JlSnd0QXV0aG9yaXplckNvbmZpZyB7XG4gIC8qKiBPSURDIGRpc2NvdmVyeSBVUkwuICovXG4gIHJlYWRvbmx5IGRpc2NvdmVyeVVybDogc3RyaW5nO1xuICAvKiogQWxsb3dlZCBhdWRpZW5jZXMuICovXG4gIHJlYWRvbmx5IGFsbG93ZWRBdWRpZW5jZT86IHN0cmluZ1tdO1xuICAvKiogQWxsb3dlZCBjbGllbnQgSURzLiAqL1xuICByZWFkb25seSBhbGxvd2VkQ2xpZW50cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzIHtcbiAgLyoqXG4gICAqIEVDUiBjb250YWluZXIgaW1hZ2UgVVJJLiBJZiBub3QgcHJvdmlkZWQsIGJ1aWxkcyBmcm9tIHRoZSBidW5kbGVkIGhhbmRsZXIgc291cmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBCdWlsZHMgZnJvbSBhZ2VudGNvcmUtYWdlbnQtaGFuZGxlciBkaXJlY3RvcnlcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lckltYWdlVXJpPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIG1vZGU6ICdQVUJMSUMnIG9yICdWUEMnLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnUFVCTElDJ1xuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya01vZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBKV1QgYXV0aG9yaXplciBjb25maWd1cmF0aW9uLlxuICAgKiBPbWl0IGZvciBJQU0tb25seSBhdXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tSnd0QXV0aG9yaXplcj86IEFnZW50Q29yZUp3dEF1dGhvcml6ZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIFByb3RvY29sIGNvbmZpZ3VyYXRpb246ICdIVFRQJyB8ICdNQ1AnIHwgJ0EyQScuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdIVFRQJ1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW50aW1lIGVuZHBvaW50IG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IEF1dG8tZ2VuZXJhdGVkIGZyb20gYWdlbnQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcgYWRhcHRlciBmb3IgSW50ZXJhY3RpdmVBZ2VudC5cbiAqXG4gKiBEZXBsb3lzIHRoZSBhZ2VudCBhcyBhIGNvbnRhaW5lciBydW5uaW5nIG9uIEFnZW50Q29yZSBSdW50aW1lIChtaWNyb1ZNKS5cbiAqIFVzZXMgTDEgY29uc3RydWN0cyBgQ2ZuUnVudGltZWAgYW5kIGBDZm5SdW50aW1lRW5kcG9pbnRgIGZyb21cbiAqIGBhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZWAuXG4gKlxuICogIyMgQXJjaGl0ZWN0dXJlXG4gKlxuICogYGBgXG4gKiBDbGllbnQg4oaSIEFnZW50Q29yZSBSdW50aW1lIEVuZHBvaW50IOKGkiBDb250YWluZXIgKEZhc3RBUEkgb24gcG9ydCA4MDgwKSDihpIgQmVkcm9ja1xuICogYGBgXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqU2Vzc2lvbiBJc29sYXRpb24qKjogbWljcm9WTSBwcm92aWRlcyBwZXItc2Vzc2lvbiBpc29sYXRpb24gKG5vIFMzIHNlc3Npb24gYnVja2V0IG5lZWRlZClcbiAqIC0gKipNYW5hZ2VkIEluZnJhc3RydWN0dXJlKio6IE5vIExhbWJkYSBjb2xkIHN0YXJ0cyBvciB0aW1lb3V0IGxpbWl0c1xuICogLSAqKk11bHRpcGxlIFByb3RvY29scyoqOiBIVFRQLCBNQ1AsIG9yIEEyQSBwcm90b2NvbCBzdXBwb3J0XG4gKiAtICoqQ29udGFpbmVyLUJhc2VkKio6IFN0YW5kYXJkIERvY2tlciBpbWFnZSBkZXBsb3ltZW50XG4gKlxuICogIyMgVXNhZ2VcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuICogaW1wb3J0IHsgSW50ZXJhY3RpdmVBZ2VudCwgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyIH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGRlY2xhcmUgY29uc3QgbXlQcm9tcHQ6IEFzc2V0O1xuICpcbiAqIG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdBZ2VudCcsIHtcbiAqICAgYWdlbnROYW1lOiAnTXlDaGF0Ym90JyxcbiAqICAgYWdlbnREZWZpbml0aW9uOiB7IGJlZHJvY2tNb2RlbDoge30sIHN5c3RlbVByb21wdDogbXlQcm9tcHQgfSxcbiAqICAgaG9zdGluZ0FkYXB0ZXI6IG5ldyBBZ2VudENvcmVSdW50aW1lSG9zdGluZ0FkYXB0ZXIoe1xuICogICAgIG5ldHdvcmtNb2RlOiAnUFVCTElDJyxcbiAqICAgfSksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyIGltcGxlbWVudHMgSUhvc3RpbmdBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyUHJvcHM7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEFnZW50Q29yZVJ1bnRpbWVIb3N0aW5nQWRhcHRlclByb3BzID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIH1cblxuICBnZXQgc2VydmljZVByaW5jaXBhbCgpIHsgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdiZWRyb2NrLWFnZW50Y29yZS5hbWF6b25hd3MuY29tJyk7IH1cblxuICAvKipcbiAgICogRGVwbG95IEFnZW50Q29yZSBSdW50aW1lIGhvc3RpbmcgaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZXBsb3koY29uZmlnOiBBZ2VudEhvc3RpbmdDb25maWcpOiBBZ2VudEhvc3RpbmdSZXN1bHQge1xuICAgIGNvbnN0IHNjb3BlID0gY29uZmlnLnNjb3BlO1xuICAgIGNvbnN0IG5ldHdvcmtNb2RlID0gdGhpcy5wcm9wcy5uZXR3b3JrTW9kZSB8fCAnUFVCTElDJztcblxuICAgIC8vIEJ1aWxkIG9yIHJlZmVyZW5jZSBjb250YWluZXIgaW1hZ2VcbiAgICBsZXQgY29udGFpbmVyVXJpOiBzdHJpbmc7XG4gICAgaWYgKHRoaXMucHJvcHMuY29udGFpbmVySW1hZ2VVcmkpIHtcbiAgICAgIGNvbnRhaW5lclVyaSA9IHRoaXMucHJvcHMuY29udGFpbmVySW1hZ2VVcmk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9hZ2VudGNvcmUtYWdlbnQtaGFuZGxlcicpO1xuICAgICAgY29uc3QgaW1hZ2VBc3NldCA9IG5ldyBEb2NrZXJJbWFnZUFzc2V0KHNjb3BlLCAnQWdlbnRDb3JlSGFuZGxlckltYWdlJywge1xuICAgICAgICBkaXJlY3Rvcnk6IGhhbmRsZXJQYXRoLFxuICAgICAgfSk7XG4gICAgICBjb250YWluZXJVcmkgPSBpbWFnZUFzc2V0LmltYWdlVXJpO1xuICAgIH1cblxuICAgIC8vIFJldXNlIHRoZSBzaW5nbGUgYWdlbnRSb2xlIChhbHJlYWR5IGhhcyBiZWRyb2NrLWFnZW50Y29yZSB0cnVzdCBmcm9tIEJhc2VBZ2VudCkuXG4gICAgLy8gT25seSBhZGQgRUNSIHB1bGwgcGVybWlzc2lvbnMg4oCUIGFsbCBvdGhlciBwZXJtaXNzaW9ucyAoQmVkcm9jayBJbnZva2VNb2RlbCxcbiAgICAvLyBTMyB0b29sIGFzc2V0cywgS0IgYWNjZXNzLCBzZXNzaW9uIGJ1Y2tldCwgb2JzZXJ2YWJpbGl0eSkgYXJlIGFscmVhZHkgZ3JhbnRlZFxuICAgIC8vIGJ5IEJhc2VBZ2VudCBvbiBjb25maWcuYWdlbnRSb2xlLlxuICAgIGNvbnN0IGVjclBvbGljeVJlc3VsdCA9IGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2VjcjpHZXREb3dubG9hZFVybEZvckxheWVyJyxcbiAgICAgICAgJ2VjcjpCYXRjaEdldEltYWdlJyxcbiAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQWRkIEFET1Qgb2JzZXJ2YWJpbGl0eSBwZXJtaXNzaW9ucyB3aGVuIGVuYWJsZWQuXG4gICAgLy8gVGhlIGNvbnRhaW5lciBEb2NrZXJmaWxlIHVzZXMgYG9wZW50ZWxlbWV0cnktaW5zdHJ1bWVudGAgYXMgaXRzIENNRCB3cmFwcGVyO1xuICAgIC8vIEFET1QgbmVlZHMgdGhlc2UgcGVybWlzc2lvbnMgdG8gZXhwb3J0IHRyYWNlcywgbG9ncywgYW5kIG1ldHJpY3MgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgIC8vIE5vdGU6IFdlIHVzZSBleHBsaWNpdCBzdGF0ZW1lbnRzIGluc3RlYWQgb2YgQ2xvdWRXYXRjaExhbWJkYUFwcGxpY2F0aW9uU2lnbmFsc0V4ZWN1dGlvblJvbGVQb2xpY3lcbiAgICAvLyBiZWNhdXNlIHRoYXQgbWFuYWdlZCBwb2xpY3kgb25seSBjb3ZlcnMgL2F3cy9hcHBsaWNhdGlvbi1zaWduYWxzL2RhdGEgbG9nIGdyb3VwXG4gICAgLy8gYW5kIG1pc3NlcyBwZXJtaXNzaW9ucyBBRE9UIG5lZWRzIChEZXNjcmliZUxvZ0dyb3VwcywgRGVzY3JpYmVMb2dTdHJlYW1zLCBQdXRNZXRyaWNEYXRhKS5cbiAgICBpZiAoY29uZmlnLmVuYWJsZU9ic2VydmFiaWxpdHkpIHtcbiAgICAgIGNvbmZpZy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSk7XG4gICAgICBjb25maWcuYWdlbnRSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGEnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNvbnRhaW5lclxuICAgIGNvbnN0IHsgcmVnaW9uLCBhY2NvdW50IH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC8vIFVubGlrZSBMYW1iZGEsIEFnZW50Q29yZSBjb250YWluZXJzIGRvbid0IGdldCBBV1NfUkVHSU9OIGF1dG9tYXRpY2FsbHkuXG4gICAgICAvLyBib3RvMyBhbmQgb3RoZXIgQVdTIFNES3MgbmVlZCBpdCB0byBtYWtlIEFQSSBjYWxscy5cbiAgICAgIEFXU19SRUdJT046IHJlZ2lvbixcbiAgICAgIEFXU19ERUZBVUxUX1JFR0lPTjogcmVnaW9uLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmVudmlyb25tZW50KSkge1xuICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogQUdFTlRfT0JTRVJWQUJJTElUWV9FTkFCTEVEIGFuZCBPVEVMXyogZW52IHZhcnMgYXJlIE5PVCBzZXQgaGVyZS5cbiAgICAvLyBGb3IgQWdlbnRDb3JlLWhvc3RlZCBhZ2VudHMsIHRoZSBBRE9UIGF1dG8taW5zdHJ1bWVudGF0aW9uIHZpYVxuICAgIC8vIGBvcGVudGVsZW1ldHJ5LWluc3RydW1lbnRgIGluIHRoZSBEb2NrZXJmaWxlIENNRCBoYW5kbGVzIHRyYWNlL3NwYW5cbiAgICAvLyBleHBvcnQgYXV0b21hdGljYWxseS4gVGhlc2UgZW52IHZhcnMgYXJlIG9ubHkgbmVlZGVkIGZvciBhZ2VudHNcbiAgICAvLyBob3N0ZWQgb3V0c2lkZSBvZiBBZ2VudENvcmUuXG5cbiAgICAvLyBCdWlsZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBuZXR3b3JrQ29uZmlndXJhdGlvbjogYW55ID0ge1xuICAgICAgbmV0d29ya01vZGUsXG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBpZiBKV1QgYXV0aG9yaXplciBpcyBzcGVjaWZpZWRcbiAgICBjb25zdCBhdXRoQ29uZmlnID0gdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyID8ge1xuICAgICAgY3VzdG9tSnd0QXV0aG9yaXplcjoge1xuICAgICAgICBkaXNjb3ZlcnlVcmw6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5kaXNjb3ZlcnlVcmwsXG4gICAgICAgIGFsbG93ZWRBdWRpZW5jZTogdGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyLmFsbG93ZWRBdWRpZW5jZSxcbiAgICAgICAgYWxsb3dlZENsaWVudHM6IHRoaXMucHJvcHMuY3VzdG9tSnd0QXV0aG9yaXplci5hbGxvd2VkQ2xpZW50cyxcbiAgICAgIH0sXG4gICAgfSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBDZm5SdW50aW1lXG4gICAgY29uc3QgcnVudGltZSA9IG5ldyBDZm5SdW50aW1lKHNjb3BlLCAnQWdlbnRDb3JlUnVudGltZScsIHtcbiAgICAgIGFnZW50UnVudGltZU5hbWU6IGAke2NvbmZpZy5hZ2VudE5hbWUucmVwbGFjZSgvLS9nLCAnXycpfV9ydW50aW1lYCxcbiAgICAgIGFnZW50UnVudGltZUFydGlmYWN0OiB7XG4gICAgICAgIGNvbnRhaW5lckNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb250YWluZXJVcmksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcm9sZUFybjogY29uZmlnLmFnZW50Um9sZS5yb2xlQXJuLFxuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb24sXG4gICAgICBhdXRob3JpemVyQ29uZmlndXJhdGlvbjogYXV0aENvbmZpZyxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiBlbnZWYXJzLFxuICAgIH0pO1xuXG4gICAgcnVudGltZS5hcHBseVJlbW92YWxQb2xpY3koY29uZmlnLnJlbW92YWxQb2xpY3kgfHwgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgIC8vIFdoZW4gSldUIGF1dGggaXMgY29uZmlndXJlZCwgYWxsb3dsaXN0IHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBzbyB0aGVcbiAgICAvLyBjb250YWluZXIgY2FuIGV4dHJhY3QgdXNlciBpZGVudGl0eSBjbGFpbXMgZnJvbSB0aGUgZm9yd2FyZGVkIEpXVCB0b2tlbi5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcnVudGltZS1vYXV0aC5odG1sI29hdXRoLXByb3BhZ2F0ZS1qd3QtdG9rZW5cbiAgICBpZiAodGhpcy5wcm9wcy5jdXN0b21Kd3RBdXRob3JpemVyKSB7XG4gICAgICBydW50aW1lLmFkZFByb3BlcnR5T3ZlcnJpZGUoJ1JlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uJywge1xuICAgICAgICBSZXF1ZXN0SGVhZGVyQWxsb3dsaXN0OiBbJ0F1dGhvcml6YXRpb24nXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBDZm5SdW50aW1lIHdhaXRzIGZvciB0aGUgcm9sZSBhbmQgaXRzIHBvbGljaWVzIHRvIGJlIGZ1bGx5IGNyZWF0ZWQvdXBkYXRlZC5cbiAgICAvLyBXaXRob3V0IHRoaXMsIENsb3VkRm9ybWF0aW9uIG1heSB2YWxpZGF0ZSB0aGUgcm9sZSBiZWZvcmU6XG4gICAgLy8gLSBUaGUgdHJ1c3QgcG9saWN5IGlzIHVwZGF0ZWQgdG8gYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbSAoZHVyaW5nIHN0YWNrIHVwZGF0ZXMpXG4gICAgLy8gLSBUaGUgRUNSIHBlcm1pc3Npb25zIHBvbGljeSBpcyBhdHRhY2hlZFxuICAgIHJ1bnRpbWUubm9kZS5hZGREZXBlbmRlbmN5KGNvbmZpZy5hZ2VudFJvbGUpO1xuICAgIGlmIChlY3JQb2xpY3lSZXN1bHQucG9saWN5RGVwZW5kYWJsZSkge1xuICAgICAgcnVudGltZS5ub2RlLmFkZERlcGVuZGVuY3koZWNyUG9saWN5UmVzdWx0LnBvbGljeURlcGVuZGFibGUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBDZm5SdW50aW1lRW5kcG9pbnRcbiAgICBjb25zdCBlbmRwb2ludE5hbWUgPSB0aGlzLnByb3BzLmVuZHBvaW50TmFtZSB8fCBgJHtjb25maWcuYWdlbnROYW1lLnJlcGxhY2UoLy0vZywgJ18nKX1fZW5kcG9pbnRgO1xuICAgIGNvbnN0IHJ1bnRpbWVFbmRwb2ludCA9IG5ldyBDZm5SdW50aW1lRW5kcG9pbnQoc2NvcGUsICdBZ2VudENvcmVSdW50aW1lRW5kcG9pbnQnLCB7XG4gICAgICBhZ2VudFJ1bnRpbWVJZDogcnVudGltZS5yZWYsXG4gICAgICBhZ2VudFJ1bnRpbWVWZXJzaW9uOiBydW50aW1lLmF0dHJBZ2VudFJ1bnRpbWVWZXJzaW9uLFxuICAgICAgbmFtZTogZW5kcG9pbnROYW1lLFxuICAgICAgLi4uKHRoaXMucHJvcHMucHJvdG9jb2xDb25maWd1cmF0aW9uICYmIHtcbiAgICAgICAgcHJvdG9jb2xDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgc2VydmVyUHJvdG9jb2w6IHRoaXMucHJvcHMucHJvdG9jb2xDb25maWd1cmF0aW9uLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgcnVudGltZUVuZHBvaW50LmFwcGx5UmVtb3ZhbFBvbGljeShjb25maWcucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuXG4gICAgLy8gQ29uc3RydWN0IHRoZSBmdWxsIGludm9jYXRpb24gVVJMIGZvciBkaXJlY3QgSFRUUFMgYWNjZXNzIChyZXF1aXJlZCBmb3IgSldUIGF1dGgpLlxuICAgIC8vIEZvcm1hdDogaHR0cHM6Ly9iZWRyb2NrLWFnZW50Y29yZS57cmVnaW9ufS5hbWF6b25hd3MuY29tL3J1bnRpbWVzL3tVUkwtZW5jb2RlZC1BUk59L2ludm9jYXRpb25zP3F1YWxpZmllcj17ZW5kcG9pbnROYW1lfVxuICAgIGNvbnN0IGVuY29kZWRBcm4gPSBGbi5qb2luKCcnLCBbXG4gICAgICAnYXJuJTNBYXdzJTNBYmVkcm9jay1hZ2VudGNvcmUlM0EnLFxuICAgICAgcmVnaW9uLFxuICAgICAgJyUzQScsXG4gICAgICBhY2NvdW50LFxuICAgICAgJyUzQXJ1bnRpbWUlMkYnLFxuICAgICAgcnVudGltZS5hdHRyQWdlbnRSdW50aW1lSWQsXG4gICAgXSk7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBGbi5qb2luKCcnLCBbXG4gICAgICAnaHR0cHM6Ly9iZWRyb2NrLWFnZW50Y29yZS4nLFxuICAgICAgcmVnaW9uLFxuICAgICAgJy5hbWF6b25hd3MuY29tL3J1bnRpbWVzLycsXG4gICAgICBlbmNvZGVkQXJuLFxuICAgICAgJy9pbnZvY2F0aW9ucz9xdWFsaWZpZXI9JyxcbiAgICAgIGVuZHBvaW50TmFtZSxcbiAgICBdKTtcblxuICAgIHJldHVybiB7IGVuZHBvaW50LCBjZm5SdW50aW1lOiBydW50aW1lIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIEludGVyYWN0aXZlQWdlbnQuXG4gKlxuICogRXh0ZW5kcyBCYXNlQWdlbnRQcm9wcyB3aXRoIGNvbW11bmljYXRpb24sIHNlc3Npb24sIGNvbnRleHQsIGFuZCBhdXRoZW50aWNhdGlvblxuICogc3RyYXRlZ3kgaW50ZXJmYWNlcyBmb3IgYnVpbGRpbmcgcmVhbC10aW1lIGNvbnZlcnNhdGlvbmFsIEFJIGFnZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGl2ZUFnZW50UHJvcHMgZXh0ZW5kcyBCYXNlQWdlbnRQcm9wcyB7XG4gIC8qKlxuICAgKiBIb3N0aW5nIGFkYXB0ZXIgZm9yIGRlcGxveWluZyB0aGUgYWdlbnQgcnVudGltZS5cbiAgICpcbiAgICogVXNlIGBMYW1iZGFIb3N0aW5nQWRhcHRlcmAgZm9yIExhbWJkYSArIEFQSSBHYXRld2F5IChkZWZhdWx0KSBvclxuICAgKiBgQWdlbnRDb3JlUnVudGltZUhvc3RpbmdBZGFwdGVyYCBmb3IgQWdlbnRDb3JlIFJ1bnRpbWUgaG9zdGluZy5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgYGNvbW11bmljYXRpb25BZGFwdGVyYCwgYGF1dGhlbnRpY2F0b3JgLCBgbWVtb3J5U2l6ZWAsXG4gICAqIGB0aW1lb3V0YCwgYGFyY2hpdGVjdHVyZWAsIGFuZCBgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uc2AgcHJvcHNcbiAgICogYXJlIGlnbm9yZWQgKGNvbmZpZ3VyZSB0aGVtIG9uIHRoZSBhZGFwdGVyIGRpcmVjdGx5KS5cbiAgICpcbiAgICogQGRlZmF1bHQgTGFtYmRhSG9zdGluZ0FkYXB0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGhvc3RpbmdBZGFwdGVyPzogSUhvc3RpbmdBZGFwdGVyO1xuICAvKipcbiAgICogQ29tbXVuaWNhdGlvbiBhZGFwdGVyIGZvciBjbGllbnQtYWdlbnQgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFN0cmVhbWluZ0h0dHBBZGFwdGVyIHdpdGggQ29nbml0b0F1dGhlbnRpY2F0b3JcbiAgICovXG4gIHJlYWRvbmx5IGNvbW11bmljYXRpb25BZGFwdGVyPzogSUNvbW11bmljYXRpb25BZGFwdGVyO1xuXG4gIC8qKlxuICAgKiBTZXNzaW9uIHN0b3JlIGZvciBwZXJzaXN0aW5nIGNvbnZlcnNhdGlvbiBzdGF0ZS5cbiAgICogU2V0IHRvIHVuZGVmaW5lZCB0byBkaXNhYmxlIHNlc3Npb24gcGVyc2lzdGVuY2UgKHN0YXRlbGVzcyBtb2RlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgUzNTZXNzaW9uTWFuYWdlciB3aXRoIDI0LWhvdXIgVFRMXG4gICAqIEBkZXByZWNhdGVkIFNlc3Npb24gbWFuYWdlbWVudCBpcyBub3cgaGFuZGxlZCBieSBTdHJhbmRzLW5hdGl2ZSBgUzNTZXNzaW9uTWFuYWdlcmAuXG4gICAqIEFuIFMzIGJ1Y2tldCBpcyBhbHdheXMgY3JlYXRlZCBhbmQgcGFzc2VkIGFzIGBTRVNTSU9OX0JVQ0tFVGAgZW52IHZhci5cbiAgICovXG4gIHJlYWRvbmx5IHNlc3Npb25TdG9yZT86IElTZXNzaW9uU3RvcmU7XG5cbiAgLyoqXG4gICAqIFMzIGJ1Y2tldCBmb3Igc2Vzc2lvbiBzdG9yYWdlIChzaG9ydGhhbmQgZm9yIFMzU2Vzc2lvbk1hbmFnZXIpLlxuICAgKiBJZ25vcmVkIGlmIHNlc3Npb25TdG9yZSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0by1jcmVhdGVkIGJ1Y2tldFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkJ1Y2tldD86IElCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRpbWUtdG8tbGl2ZSBmb3Igc2Vzc2lvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmhvdXJzKDI0KVxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvblRUTD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb250ZXh0IHN0cmF0ZWd5IGZvciBjb252ZXJzYXRpb24gaGlzdG9yeSBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciB3aXRoIDIwIG1lc3NhZ2VzXG4gICAqIEBkZXByZWNhdGVkIENvbnZlcnNhdGlvbiBtYW5hZ2VtZW50IGlzIG5vdyBoYW5kbGVkIGJ5IFN0cmFuZHMtbmF0aXZlXG4gICAqIGBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlcmAgaW4gdGhlIFB5dGhvbiBoYW5kbGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dFN0cmF0ZWd5PzogSUNvbnRleHRTdHJhdGVneTtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdG8ga2VlcCBpbiBjb252ZXJzYXRpb24gaGlzdG9yeS5cbiAgICogU2hvcnRoYW5kIGZvciBTbGlkaW5nV2luZG93Q29udmVyc2F0aW9uTWFuYWdlciB3aW5kb3dTaXplLlxuICAgKiBJZ25vcmVkIGlmIGNvbnRleHRTdHJhdGVneSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgMjBcbiAgICogQGRlcHJlY2F0ZWQgQ29udmVyc2F0aW9uIHdpbmRvd2luZyBpcyBub3cgaGFuZGxlZCBieSBTdHJhbmRzLW5hdGl2ZVxuICAgKiBgU2xpZGluZ1dpbmRvd0NvbnZlcnNhdGlvbk1hbmFnZXJgIGluIHRoZSBQeXRob24gaGFuZGxlciAoZGVmYXVsdDogMjApLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZUhpc3RvcnlMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogQXV0aGVudGljYXRvciBmb3Igc2VjdXJpbmcgQVBJIGVuZHBvaW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgQ29nbml0b0F1dGhlbnRpY2F0b3JcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhlbnRpY2F0b3I/OiBJQXV0aGVudGljYXRvcjtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIG1lbW9yeSBzaXplIGluIE1CLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDI0XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gdGltZW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcygxNSlcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIGFyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBSZXNlcnZlZCBjb25jdXJyZW50IGV4ZWN1dGlvbnMgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIHJlc2VydmVkIGNvbmN1cnJlbmN5XG4gICAqL1xuICByZWFkb25seSByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEludGVyYWN0aXZlIEFnZW50IGZvciByZWFsLXRpbWUgY29udmVyc2F0aW9uYWwgQUkgd2l0aCBTU0Ugc3RyZWFtaW5nLlxuICpcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSBzZXJ2ZXJsZXNzIGluZnJhc3RydWN0dXJlIGZvciBpbnRlcmFjdGl2ZSBBSSBjb252ZXJzYXRpb25zXG4gKiB1c2luZyBBUEkgR2F0ZXdheSBSRVNUIEFQSSB3aXRoIHJlc3BvbnNlIHN0cmVhbWluZywgTGFtYmRhIFdlYiBBZGFwdGVyLFxuICogRmFzdEFQSSwgYW5kIHN0YW5kYXJkIFN0cmFuZHMgQWdlbnQuXG4gKlxuICogIyMgQXJjaGl0ZWN0dXJlXG4gKlxuICogYGBgXG4gKiBDbGllbnQgKGZldGNoICsgUmVhZGFibGVTdHJlYW0pXG4gKiAgICAg4oaTIFBPU1QgL2NoYXQgKEF1dGhvcml6YXRpb246IEJlYXJlciBKV1QpXG4gKiBBUEkgR2F0ZXdheSBSRVNUIEFQSSAocmVzcG9uc2VUcmFuc2Zlck1vZGU6IFNUUkVBTSlcbiAqICAgICDihpMgSW52b2tlV2l0aFJlc3BvbnNlU3RyZWFtXG4gKiBMYW1iZGEgKFB5dGhvbiArIExhbWJkYSBXZWIgQWRhcHRlciArIEZhc3RBUEkpXG4gKiAgICAg4oaTIHN0cmFuZHMuQWdlbnQgc3RyZWFtaW5nXG4gKiBBbWF6b24gQmVkcm9jayAoQ2xhdWRlKVxuICogYGBgXG4gKlxuICogIyMgRmVhdHVyZXNcbiAqXG4gKiAtICoqU1NFIFN0cmVhbWluZyoqOiBSZWFsLXRpbWUgdG9rZW4tYnktdG9rZW4gcmVzcG9uc2Ugc3RyZWFtaW5nXG4gKiAtICoqMTUtTWludXRlIFRpbWVvdXQqKjogRXh0ZW5kZWQgdGltZW91dCBmb3IgbG9uZyBjb252ZXJzYXRpb25zXG4gKiAtICoqU2Vzc2lvbiBNYW5hZ2VtZW50Kio6IFMzLWJhc2VkIGNvbnZlcnNhdGlvbiBwZXJzaXN0ZW5jZVxuICogLSAqKkNvbnRleHQgV2luZG93aW5nKio6IFNsaWRpbmcgd2luZG93IGNvbnZlcnNhdGlvbiBoaXN0b3J5XG4gKiAtICoqQ29nbml0byBBdXRoKio6IE5hdGl2ZSBKV1QgdmFsaWRhdGlvbiBvbiBSRVNUIEFQSVxuICogLSAqKlN0cmF0ZWd5IEludGVyZmFjZXMqKjogUGx1Z2dhYmxlIGFkYXB0ZXJzIGZvciBhbGwgY29tcG9uZW50c1xuICogLSAqKk9ic2VydmFiaWxpdHkqKjogTGFtYmRhIFBvd2VydG9vbHMgaW50ZWdyYXRpb25cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG4gKiBpbXBvcnQgeyBJbnRlcmFjdGl2ZUFnZW50IH0gZnJvbSAnQGNka2xhYnMvY2RrLWFwcG1vZC1jYXRhbG9nLWJsdWVwcmludHMnO1xuICpcbiAqIGNvbnN0IHN5c3RlbVByb21wdCA9IG5ldyBBc3NldCh0aGlzLCAnUHJvbXB0JywgeyBwYXRoOiAnLi9wcm9tcHQudHh0JyB9KTtcbiAqXG4gKiBjb25zdCBhZ2VudCA9IG5ldyBJbnRlcmFjdGl2ZUFnZW50KHRoaXMsICdDaGF0QWdlbnQnLCB7XG4gKiAgIGFnZW50TmFtZTogJ015Q2hhdGJvdCcsXG4gKiAgIGFnZW50RGVmaW5pdGlvbjoge1xuICogICAgIGJlZHJvY2tNb2RlbDogeyB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSB9LFxuICogICAgIHN5c3RlbVByb21wdDogc3lzdGVtUHJvbXB0LFxuICogICB9LFxuICogfSk7XG4gKlxuICogLy8gQWNjZXNzIG91dHB1dHNcbiAqIGFnZW50LmFwaUVuZHBvaW50OyAgICAgICAvLyBSRVNUIEFQSSBlbmRwb2ludCBVUkxcbiAqIGFnZW50LnNlc3Npb25CdWNrZXQ7ICAgICAvLyBTMyBzZXNzaW9uIGJ1Y2tldFxuICogYWdlbnQuYXV0aGVudGljYXRvcjsgICAgIC8vIENvZ25pdG8gYXV0aGVudGljYXRvciAoZm9yIFVzZXIgUG9vbCBpbmZvKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmFjdGl2ZUFnZW50IGV4dGVuZHMgQmFzZUFnZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IGFnZW50RnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBhZGFwdGVyPzogSUNvbW11bmljYXRpb25BZGFwdGVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvblN0b3JlPzogSVNlc3Npb25TdG9yZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHRTdHJhdGVneT86IElDb250ZXh0U3RyYXRlZ3k7XG4gIHB1YmxpYyByZWFkb25seSBhdXRoZW50aWNhdG9yPzogSUF1dGhlbnRpY2F0b3I7XG4gIHB1YmxpYyByZWFkb25seSBhcGlFbmRwb2ludDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vzc2lvbkJ1Y2tldD86IElCdWNrZXQ7XG4gIHB1YmxpYyByZWFkb25seSBjZm5SdW50aW1lPzogQ2ZuUnVudGltZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSW50ZXJhY3RpdmVBZ2VudFByb3BzKSB7XG4gICAgLy8gRGV0ZXJtaW5lIGhvc3RpbmcgYWRhcHRlciBCRUZPUkUgc3VwZXIoKSBzbyB3ZSBjYW4gcGFzcyBpdHMgdHJ1c3QgcHJpbmNpcGFsXG4gICAgY29uc3QgaG9zdGluZ0FkYXB0ZXIgPSBwcm9wcy5ob3N0aW5nQWRhcHRlciB8fCBuZXcgTGFtYmRhSG9zdGluZ0FkYXB0ZXIoe1xuICAgICAgY29tbXVuaWNhdGlvbkFkYXB0ZXI6IHByb3BzLmNvbW11bmljYXRpb25BZGFwdGVyLFxuICAgICAgYXV0aGVudGljYXRvcjogcHJvcHMuYXV0aGVudGljYXRvcixcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0LFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcy5hcmNoaXRlY3R1cmUsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBwcm9wcy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgIH0pO1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7IC4uLnByb3BzLCBzZXJ2aWNlUHJpbmNpcGFsOiBob3N0aW5nQWRhcHRlci5zZXJ2aWNlUHJpbmNpcGFsIH0pO1xuXG4gICAgLy8gVmFsaWRhdGUgcHJvcHNcbiAgICB0aGlzLnZhbGlkYXRlUHJvcHMocHJvcHMpO1xuXG4gICAgY29uc3QgbW9kZWxJZCA9IEJlZHJvY2tNb2RlbFV0aWxzLmRlcml2ZUFjdHVhbE1vZGVsSWQodGhpcy5iZWRyb2NrTW9kZWwpO1xuICAgIGNvbnN0IG1ldHJpY05hbWVzcGFjZSA9IHByb3BzLm1ldHJpY05hbWVzcGFjZSB8fCBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZy5ERUZBVUxUX01FVFJJQ19OQU1FU1BBQ0U7XG4gICAgY29uc3QgbWV0cmljU2VydmljZU5hbWUgPSBwcm9wcy5tZXRyaWNTZXJ2aWNlTmFtZSB8fCBEZWZhdWx0QWdlbnRDb25maWcuREVGQVVMVF9PQlNFUlZBQklMSVRZX01FVFJJQ19TVkNfTkFNRTtcblxuICAgIC8vIEluaXRpYWxpemUgc2Vzc2lvbiBzdG9yZSAoUzMgYnVja2V0IGZvciBTdHJhbmRzLW5hdGl2ZSBTM1Nlc3Npb25NYW5hZ2VyKVxuICAgIGlmIChwcm9wcy5zZXNzaW9uU3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXNzaW9uU3RvcmUgPSBwcm9wcy5zZXNzaW9uU3RvcmU7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5zZXNzaW9uU3RvcmUgPT09IHVuZGVmaW5lZCAmJiBwcm9wcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG5ldyBTM1Nlc3Npb25NYW5hZ2VyKHRoaXMsICdTZXNzaW9uTWFuYWdlcicsIHtcbiAgICAgICAgYnVja2V0OiBwcm9wcy5zZXNzaW9uQnVja2V0LFxuICAgICAgICBzZXNzaW9uVFRMOiBwcm9wcy5zZXNzaW9uVFRMLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQ6IGNyZWF0ZSBTM1Nlc3Npb25NYW5hZ2VyIChidWNrZXQgdXNlZCBieSBTdHJhbmRzLW5hdGl2ZSBzZXNzaW9uIG1hbmFnZXIpXG4gICAgICB0aGlzLnNlc3Npb25TdG9yZSA9IG5ldyBTM1Nlc3Npb25NYW5hZ2VyKHRoaXMsICdTZXNzaW9uTWFuYWdlcicsIHtcbiAgICAgICAgc2Vzc2lvblRUTDogcHJvcHMuc2Vzc2lvblRUTCxcbiAgICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNlc3Npb25CdWNrZXQgPSB0aGlzLnNlc3Npb25TdG9yZT8uc2Vzc2lvbkJ1Y2tldDtcblxuICAgIC8vIENvbnRleHQgc3RyYXRlZ3kgaXMgZGVwcmVjYXRlZCDigJQgU3RyYW5kcy1uYXRpdmUgY29udmVyc2F0aW9uIG1hbmFnZXIgaGFuZGxlcyB0aGlzLlxuICAgIC8vIEtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IGRvIG5vdCB1c2UgZW52IHZhcnMuXG4gICAgaWYgKHByb3BzLmNvbnRleHRTdHJhdGVneSkge1xuICAgICAgdGhpcy5jb250ZXh0U3RyYXRlZ3kgPSBwcm9wcy5jb250ZXh0U3RyYXRlZ3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGV4dFN0cmF0ZWd5ID0gbmV3IFNsaWRpbmdXaW5kb3dDb252ZXJzYXRpb25NYW5hZ2VyKHtcbiAgICAgICAgd2luZG93U2l6ZTogcHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGJhc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTU9ERUxfSUQ6IG1vZGVsSWQsXG4gICAgICBTWVNURU1fUFJPTVBUX1MzX0JVQ0tFVF9OQU1FOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzQnVja2V0TmFtZSxcbiAgICAgIFNZU1RFTV9QUk9NUFRfUzNfS0VZOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzT2JqZWN0S2V5LFxuICAgICAgVE9PTFNfQ09ORklHOiBKU09OLnN0cmluZ2lmeSh0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zKSxcbiAgICAgIC4uLlBvd2VydG9vbHNDb25maWcuZ2VuZXJhdGVEZWZhdWx0TGFtYmRhQ29uZmlnKFxuICAgICAgICBwcm9wcy5lbmFibGVPYnNlcnZhYmlsaXR5LFxuICAgICAgICBtZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgIG1ldHJpY1NlcnZpY2VOYW1lLFxuICAgICAgICAnREVCVUcnLFxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNlc3Npb24gYnVja2V0IGVudiB2YXIgaWYgc2Vzc2lvbiBzdG9yZSBleGlzdHNcbiAgICBpZiAodGhpcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICBlbnYuU0VTU0lPTl9CVUNLRVQgPSB0aGlzLnNlc3Npb25CdWNrZXQuYnVja2V0TmFtZTtcbiAgICB9XG5cbiAgICAvLyBBZGQga25vd2xlZGdlIGJhc2UgY29uZmlndXJhdGlvbiBpZiBLQnMgYXJlIGNvbmZpZ3VyZWRcbiAgICBpZiAodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwKSB7XG4gICAgICBlbnYuS05PV0xFREdFX0JBU0VTX0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpO1xuICAgICAgZW52LktOT1dMRURHRV9CQVNFX1NZU1RFTV9QUk9NUFRfQURESVRJT04gPSBnZW5lcmF0ZUtub3dsZWRnZUJhc2VTeXN0ZW1Qcm9tcHRBZGRpdGlvbih0aGlzLmtub3dsZWRnZUJhc2VDb25maWdzKTtcbiAgICB9XG5cbiAgICAvLyBEZXBsb3kgdmlhIGhvc3RpbmcgYWRhcHRlclxuICAgIGNvbnN0IGhvc3RpbmdSZXN1bHQgPSBob3N0aW5nQWRhcHRlci5kZXBsb3koe1xuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBhZ2VudE5hbWU6IHByb3BzLmFnZW50TmFtZSxcbiAgICAgIGFnZW50Um9sZTogdGhpcy5hZ2VudFJvbGUsXG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgbmV0d29yazogcHJvcHMubmV0d29yayxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBwcm9wcy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgICAgbGFtYmRhTGF5ZXJzOiBwcm9wcy5hZ2VudERlZmluaXRpb24ubGFtYmRhTGF5ZXJzLFxuICAgICAga25vd2xlZGdlQmFzZUxheWVyczogdGhpcy5rbm93bGVkZ2VCYXNlTGF5ZXJzLFxuICAgICAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogcHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgIHRvb2xzQ29uZmlnOiBKU09OLnN0cmluZ2lmeSh0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zKSxcbiAgICAgIHN5c3RlbVByb21wdEJ1Y2tldDogcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5zM0J1Y2tldE5hbWUsXG4gICAgICBzeXN0ZW1Qcm9tcHRLZXk6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5zeXN0ZW1Qcm9tcHQuczNPYmplY3RLZXksXG4gICAgICBrbm93bGVkZ2VCYXNlQ29uZmlnczogdGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncy5sZW5ndGggPiAwID8gSlNPTi5zdHJpbmdpZnkodGhpcy5rbm93bGVkZ2VCYXNlQ29uZmlncykgOiB1bmRlZmluZWQsXG4gICAgICBrbm93bGVkZ2VCYXNlU3lzdGVtUHJvbXB0QWRkaXRpb246IHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IGdlbmVyYXRlS25vd2xlZGdlQmFzZVN5c3RlbVByb21wdEFkZGl0aW9uKHRoaXMua25vd2xlZGdlQmFzZUNvbmZpZ3MpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSxcbiAgICB9KTtcblxuICAgIHRoaXMuYXBpRW5kcG9pbnQgPSBob3N0aW5nUmVzdWx0LmVuZHBvaW50O1xuICAgIHRoaXMuYWdlbnRGdW5jdGlvbiA9IGhvc3RpbmdSZXN1bHQuYWdlbnRGdW5jdGlvbjtcbiAgICB0aGlzLmNmblJ1bnRpbWUgPSBob3N0aW5nUmVzdWx0LmNmblJ1bnRpbWU7XG5cbiAgICAvLyBTZXQgYWRhcHRlciBhbmQgYXV0aGVudGljYXRvciByZWZlcmVuY2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgaWYgKGhvc3RpbmdBZGFwdGVyIGluc3RhbmNlb2YgTGFtYmRhSG9zdGluZ0FkYXB0ZXIpIHtcbiAgICAgIHRoaXMuYWRhcHRlciA9IGhvc3RpbmdBZGFwdGVyLmNvbW11bmljYXRpb25BZGFwdGVyO1xuICAgICAgdGhpcy5hdXRoZW50aWNhdG9yID0gaG9zdGluZ0FkYXB0ZXIuYXV0aGVudGljYXRvcjtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBzeXN0ZW0gcHJvbXB0IHJlYWQgYWNjZXNzXG4gICAgcHJvcHMuYWdlbnREZWZpbml0aW9uLnN5c3RlbVByb21wdC5ncmFudFJlYWQodGhpcy5hZ2VudFJvbGUpO1xuXG4gICAgLy8gR3JhbnQgc2Vzc2lvbiBzdG9yZSBhY2Nlc3NcbiAgICBpZiAodGhpcy5zZXNzaW9uU3RvcmUpIHtcbiAgICAgIGlmICh0aGlzLmFnZW50RnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RvcmUuZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudEZ1bmN0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXNzaW9uQnVja2V0KSB7XG4gICAgICAgIC8vIEZvciBBZ2VudENvcmUgaG9zdGluZywgZ3JhbnQgdGhlIGFnZW50IHJvbGUgZGlyZWN0IFMzIGFjY2Vzc1xuICAgICAgICB0aGlzLnNlc3Npb25CdWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5hZ2VudFJvbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgSW50ZXJhY3RpdmVBZ2VudCBwcm9wcy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogSW50ZXJhY3RpdmVBZ2VudFByb3BzKTogdm9pZCB7XG4gICAgaWYgKCFwcm9wcy5hZ2VudE5hbWUgfHwgcHJvcHMuYWdlbnROYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWdlbnROYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5tZW1vcnlTaXplICE9PSB1bmRlZmluZWQgJiYgKHByb3BzLm1lbW9yeVNpemUgPCAxMjggfHwgcHJvcHMubWVtb3J5U2l6ZSA+IDEwMjQwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZW1vcnlTaXplIG11c3QgYmUgYmV0d2VlbiAxMjggYW5kIDEwMjQwIE1CJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBwcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpO1xuICAgICAgaWYgKHRpbWVvdXRTZWNvbmRzIDwgMSB8fCB0aW1lb3V0U2Vjb25kcyA+IDkwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbWVvdXQgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1lc3NhZ2VIaXN0b3J5TGltaXQgIT09IHVuZGVmaW5lZCAmJiAocHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCA8IDEgfHwgcHJvcHMubWVzc2FnZUhpc3RvcnlMaW1pdCA+IDEwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2VIaXN0b3J5TGltaXQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMDAnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|