@aws-cdk/aws-bedrock-agentcore-alpha 2.227.0-alpha.0 → 2.229.0-alpha.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 +1385 -1080
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +15 -1
- package/README.md +119 -15
- package/lib/gateway/gateway-base.js +171 -0
- package/{agentcore → lib}/gateway/gateway.js +4 -4
- package/{agentcore → lib}/gateway/inbound-auth/authorizer.js +3 -3
- package/lib/gateway/outbound-auth/api-key.js +141 -0
- package/{agentcore → lib}/gateway/outbound-auth/credential-provider.js +1 -1
- package/lib/gateway/outbound-auth/oauth.js +76 -0
- package/lib/gateway/perms.d.ts +73 -0
- package/lib/gateway/perms.js +109 -0
- package/{agentcore → lib}/gateway/protocol.js +2 -2
- package/{agentcore → lib}/gateway/targets/schema/api-schema.js +4 -4
- package/{agentcore → lib}/gateway/targets/schema/tool-schema.js +4 -4
- package/{agentcore → lib}/gateway/targets/target-base.js +1 -1
- package/{agentcore → lib}/gateway/targets/target-configuration.js +5 -5
- package/lib/gateway/targets/target.js +444 -0
- package/lib/index.d.ts +30 -1
- package/lib/index.js +55 -6
- package/{agentcore → lib}/memory/memory-strategy.js +1 -1
- package/{agentcore → lib}/memory/memory.js +2 -2
- package/{agentcore → lib}/memory/strategies/managed-strategy.js +1 -1
- package/{agentcore → lib}/memory/strategies/self-managed-strategy.js +1 -1
- package/{agentcore → lib}/network/network-configuration.js +4 -4
- package/{agentcore → lib}/runtime/runtime-artifact.d.ts +30 -0
- package/lib/runtime/runtime-artifact.js +174 -0
- package/{agentcore → lib}/runtime/runtime-authorizer-configuration.js +1 -1
- package/{agentcore → lib}/runtime/runtime-base.js +1 -1
- package/{agentcore → lib}/runtime/runtime-endpoint-base.js +1 -1
- package/{agentcore → lib}/runtime/runtime-endpoint.js +1 -1
- package/{agentcore → lib}/runtime/runtime.d.ts +32 -1
- package/lib/runtime/runtime.js +694 -0
- package/lib/runtime/types.d.ts +50 -0
- package/lib/runtime/types.js +25 -0
- package/{agentcore → lib}/tools/browser.d.ts +37 -0
- package/lib/tools/browser.js +680 -0
- package/{agentcore → lib}/tools/code-interpreter.js +2 -2
- package/package.json +10 -10
- package/agentcore/gateway/gateway-base.js +0 -171
- package/agentcore/gateway/outbound-auth/api-key.js +0 -141
- package/agentcore/gateway/outbound-auth/oauth.js +0 -76
- package/agentcore/gateway/perms.d.ts +0 -75
- package/agentcore/gateway/perms.js +0 -112
- package/agentcore/gateway/targets/target.js +0 -444
- package/agentcore/index.d.ts +0 -30
- package/agentcore/index.js +0 -71
- package/agentcore/runtime/runtime-artifact.js +0 -90
- package/agentcore/runtime/runtime.js +0 -589
- package/agentcore/runtime/types.d.ts +0 -20
- package/agentcore/runtime/types.js +0 -25
- package/agentcore/tools/browser.js +0 -641
- /package/{agentcore → lib}/gateway/gateway-base.d.ts +0 -0
- /package/{agentcore → lib}/gateway/gateway.d.ts +0 -0
- /package/{agentcore → lib}/gateway/inbound-auth/authorizer.d.ts +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/api-key.d.ts +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/credential-provider.d.ts +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/iam-role.d.ts +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/iam-role.js +0 -0
- /package/{agentcore → lib}/gateway/outbound-auth/oauth.d.ts +0 -0
- /package/{agentcore → lib}/gateway/protocol.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/schema/api-schema.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/schema/base-schema.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/schema/base-schema.js +0 -0
- /package/{agentcore → lib}/gateway/targets/schema/tool-schema.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/target-base.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/target-configuration.d.ts +0 -0
- /package/{agentcore → lib}/gateway/targets/target.d.ts +0 -0
- /package/{agentcore → lib}/gateway/validation-helpers.d.ts +0 -0
- /package/{agentcore → lib}/gateway/validation-helpers.js +0 -0
- /package/{agentcore → lib}/memory/memory-strategy.d.ts +0 -0
- /package/{agentcore → lib}/memory/memory.d.ts +0 -0
- /package/{agentcore → lib}/memory/perms.d.ts +0 -0
- /package/{agentcore → lib}/memory/perms.js +0 -0
- /package/{agentcore → lib}/memory/strategies/managed-strategy.d.ts +0 -0
- /package/{agentcore → lib}/memory/strategies/self-managed-strategy.d.ts +0 -0
- /package/{agentcore → lib}/memory/validation-helpers.d.ts +0 -0
- /package/{agentcore → lib}/memory/validation-helpers.js +0 -0
- /package/{agentcore → lib}/network/network-configuration.d.ts +0 -0
- /package/{agentcore → lib}/runtime/perms.d.ts +0 -0
- /package/{agentcore → lib}/runtime/perms.js +0 -0
- /package/{agentcore → lib}/runtime/runtime-authorizer-configuration.d.ts +0 -0
- /package/{agentcore → lib}/runtime/runtime-base.d.ts +0 -0
- /package/{agentcore → lib}/runtime/runtime-endpoint-base.d.ts +0 -0
- /package/{agentcore → lib}/runtime/runtime-endpoint.d.ts +0 -0
- /package/{agentcore → lib}/runtime/validation-helpers.d.ts +0 -0
- /package/{agentcore → lib}/runtime/validation-helpers.js +0 -0
- /package/{agentcore → lib}/tools/code-interpreter.d.ts +0 -0
- /package/{agentcore → lib}/tools/perms.d.ts +0 -0
- /package/{agentcore → lib}/tools/perms.js +0 -0
- /package/{agentcore → lib}/tools/validation-helpers.d.ts +0 -0
- /package/{agentcore → lib}/tools/validation-helpers.js +0 -0
|
@@ -0,0 +1,694 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
3
|
+
var useValue = arguments.length > 2;
|
|
4
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
5
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
6
|
+
}
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
11
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
12
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
13
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
14
|
+
var _, done = false;
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
16
|
+
var context = {};
|
|
17
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
18
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
19
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
20
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
21
|
+
if (kind === "accessor") {
|
|
22
|
+
if (result === void 0) continue;
|
|
23
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
24
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
25
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
26
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
27
|
+
}
|
|
28
|
+
else if (_ = accept(result)) {
|
|
29
|
+
if (kind === "field") initializers.unshift(_);
|
|
30
|
+
else descriptor[key] = _;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
34
|
+
done = true;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.Runtime = void 0;
|
|
38
|
+
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
|
|
39
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
41
|
+
const bedrockagentcore = require("aws-cdk-lib/aws-bedrockagentcore");
|
|
42
|
+
const ec2 = require("aws-cdk-lib/aws-ec2");
|
|
43
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
44
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
45
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
46
|
+
const perms_1 = require("./perms");
|
|
47
|
+
const runtime_base_1 = require("./runtime-base");
|
|
48
|
+
const runtime_endpoint_1 = require("./runtime-endpoint");
|
|
49
|
+
const network_configuration_1 = require("../network/network-configuration");
|
|
50
|
+
const types_1 = require("./types");
|
|
51
|
+
const validation_helpers_1 = require("./validation-helpers");
|
|
52
|
+
/******************************************************************************
|
|
53
|
+
* Constants
|
|
54
|
+
*****************************************************************************/
|
|
55
|
+
/**
|
|
56
|
+
* Minimum timeout for idle runtime sessions
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
const LIFECYCLE_MIN_TIMEOUT = aws_cdk_lib_1.Duration.seconds(60);
|
|
60
|
+
/**
|
|
61
|
+
* Maximum lifetime for the instance
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
const LIFECYCLE_MAX_LIFETIME = aws_cdk_lib_1.Duration.seconds(28800);
|
|
65
|
+
/******************************************************************************
|
|
66
|
+
* Class
|
|
67
|
+
*****************************************************************************/
|
|
68
|
+
/**
|
|
69
|
+
* Bedrock Agent Core Runtime
|
|
70
|
+
* Enables running containerized agents with specific network configurations,
|
|
71
|
+
* security settings, and runtime artifacts.
|
|
72
|
+
*
|
|
73
|
+
* @resource AWS::BedrockAgentCore::Runtime
|
|
74
|
+
* @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime.html
|
|
75
|
+
*/
|
|
76
|
+
let Runtime = (() => {
|
|
77
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
78
|
+
let _classDescriptor;
|
|
79
|
+
let _classExtraInitializers = [];
|
|
80
|
+
let _classThis;
|
|
81
|
+
let _classSuper = runtime_base_1.RuntimeBase;
|
|
82
|
+
let _instanceExtraInitializers = [];
|
|
83
|
+
let _addEndpoint_decorators;
|
|
84
|
+
var Runtime = class extends _classSuper {
|
|
85
|
+
static { _classThis = this; }
|
|
86
|
+
static {
|
|
87
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
88
|
+
_addEndpoint_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
89
|
+
__esDecorate(this, null, _addEndpoint_decorators, { kind: "method", name: "addEndpoint", static: false, private: false, access: { has: obj => "addEndpoint" in obj, get: obj => obj.addEndpoint }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
90
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
91
|
+
Runtime = _classThis = _classDescriptor.value;
|
|
92
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
93
|
+
}
|
|
94
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.Runtime", version: "2.229.0-alpha.0" };
|
|
95
|
+
/** Uniquely identifies this class. */
|
|
96
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.Runtime';
|
|
97
|
+
/**
|
|
98
|
+
* Import an existing Agent Runtime using attributes
|
|
99
|
+
* This allows you to reference an Agent Runtime that was created outside of CDK
|
|
100
|
+
*
|
|
101
|
+
* @param scope The construct scope
|
|
102
|
+
* @param id The construct id
|
|
103
|
+
* @param attrs The attributes of the existing Agent Runtime
|
|
104
|
+
* @returns An IBedrockAgentRuntime instance representing the imported runtime
|
|
105
|
+
*/
|
|
106
|
+
static fromAgentRuntimeAttributes(scope, id, attrs) {
|
|
107
|
+
try {
|
|
108
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AgentRuntimeAttributes(attrs);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
112
|
+
Error.captureStackTrace(error, this.fromAgentRuntimeAttributes);
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
class ImportedBedrockAgentRuntime extends runtime_base_1.RuntimeBase {
|
|
117
|
+
agentRuntimeArn = attrs.agentRuntimeArn;
|
|
118
|
+
agentRuntimeId = attrs.agentRuntimeId;
|
|
119
|
+
agentRuntimeName = attrs.agentRuntimeName;
|
|
120
|
+
agentRuntimeVersion = attrs.agentRuntimeVersion;
|
|
121
|
+
agentStatus = attrs.agentStatus;
|
|
122
|
+
description = attrs.description;
|
|
123
|
+
createdAt = attrs.createdAt;
|
|
124
|
+
lastUpdatedAt = attrs.lastUpdatedAt;
|
|
125
|
+
role;
|
|
126
|
+
grantPrincipal;
|
|
127
|
+
constructor(s, i) {
|
|
128
|
+
super(s, i);
|
|
129
|
+
this.role = iam.Role.fromRoleArn(this, 'Role', attrs.roleArn);
|
|
130
|
+
this.grantPrincipal = this.role;
|
|
131
|
+
if (attrs.securityGroups) {
|
|
132
|
+
this._connections = new ec2.Connections({
|
|
133
|
+
securityGroups: attrs.securityGroups,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return new ImportedBedrockAgentRuntime(scope, id);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The ARN of the agent runtime
|
|
142
|
+
* @attribute
|
|
143
|
+
* @returns a token representing the ARN of this agent runtime
|
|
144
|
+
*/
|
|
145
|
+
agentRuntimeArn = __runInitializers(this, _instanceExtraInitializers);
|
|
146
|
+
/**
|
|
147
|
+
* The unique identifier of the agent runtime
|
|
148
|
+
* @attribute
|
|
149
|
+
* @returns a token representing the ID of this agent runtime
|
|
150
|
+
*/
|
|
151
|
+
agentRuntimeId;
|
|
152
|
+
/**
|
|
153
|
+
* The name of the agent runtime
|
|
154
|
+
* @attribute
|
|
155
|
+
* @returns a token representing the name of this agent runtime
|
|
156
|
+
*/
|
|
157
|
+
agentRuntimeName;
|
|
158
|
+
role;
|
|
159
|
+
/**
|
|
160
|
+
* The version of the agent runtime
|
|
161
|
+
* @attribute
|
|
162
|
+
* @returns a token representing the version of this agent runtime
|
|
163
|
+
*/
|
|
164
|
+
agentRuntimeVersion;
|
|
165
|
+
/**
|
|
166
|
+
* The status of the agent runtime
|
|
167
|
+
* @attribute
|
|
168
|
+
* @returns a token representing the status of this agent runtime
|
|
169
|
+
*/
|
|
170
|
+
agentStatus;
|
|
171
|
+
/**
|
|
172
|
+
* Optional description for the agent runtime
|
|
173
|
+
*/
|
|
174
|
+
description;
|
|
175
|
+
/**
|
|
176
|
+
* The timestamp when the agent runtime was created
|
|
177
|
+
* @attribute
|
|
178
|
+
* @returns a token representing the creation timestamp of this agent runtime
|
|
179
|
+
*/
|
|
180
|
+
createdAt;
|
|
181
|
+
/**
|
|
182
|
+
* The timestamp when the agent runtime was last updated
|
|
183
|
+
* @attribute
|
|
184
|
+
* @returns a token representing the last update timestamp of this agent runtime
|
|
185
|
+
*/
|
|
186
|
+
lastUpdatedAt;
|
|
187
|
+
grantPrincipal;
|
|
188
|
+
runtimeResource;
|
|
189
|
+
/**
|
|
190
|
+
* The artifact configuration for the agent runtime
|
|
191
|
+
*/
|
|
192
|
+
agentRuntimeArtifact;
|
|
193
|
+
networkConfiguration;
|
|
194
|
+
protocolConfiguration;
|
|
195
|
+
authorizerConfiguration;
|
|
196
|
+
lifecycleConfiguration;
|
|
197
|
+
constructor(scope, id, props) {
|
|
198
|
+
super(scope, id);
|
|
199
|
+
try {
|
|
200
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_RuntimeProps(props);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
204
|
+
Error.captureStackTrace(error, Runtime);
|
|
205
|
+
}
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
// CDK Analytics Telemetry
|
|
209
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
210
|
+
this.agentRuntimeName = props.runtimeName;
|
|
211
|
+
this.validateRuntimeName();
|
|
212
|
+
this.description = props.description;
|
|
213
|
+
if (this.description) {
|
|
214
|
+
this.validateDescription();
|
|
215
|
+
}
|
|
216
|
+
if (props.environmentVariables) {
|
|
217
|
+
this.validateEnvironmentVariables(props.environmentVariables);
|
|
218
|
+
}
|
|
219
|
+
if (props.tags) {
|
|
220
|
+
this.validateTags(props.tags);
|
|
221
|
+
}
|
|
222
|
+
if (props.requestHeaderConfiguration) {
|
|
223
|
+
this.validateRequestHeaderConfiguration(props.requestHeaderConfiguration);
|
|
224
|
+
}
|
|
225
|
+
this.lifecycleConfiguration = {
|
|
226
|
+
idleRuntimeSessionTimeout: props.lifecycleConfiguration?.idleRuntimeSessionTimeout ?? LIFECYCLE_MIN_TIMEOUT,
|
|
227
|
+
maxLifetime: props.lifecycleConfiguration?.maxLifetime ?? LIFECYCLE_MAX_LIFETIME,
|
|
228
|
+
};
|
|
229
|
+
this.validateLifecycleConfiguration(this.lifecycleConfiguration);
|
|
230
|
+
if (props.executionRole) {
|
|
231
|
+
this.role = props.executionRole;
|
|
232
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(props.executionRole.roleArn)) {
|
|
233
|
+
this.validateRoleArn(props.executionRole.roleArn);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
this.role = new iam.Role(this, 'ExecutionRole', {
|
|
238
|
+
assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
|
|
239
|
+
description: 'Execution role for Bedrock Agent Core Runtime',
|
|
240
|
+
maxSessionDuration: aws_cdk_lib_1.Duration.hours(8),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
this.addExecutionRolePermissions();
|
|
244
|
+
this.grantPrincipal = this.role;
|
|
245
|
+
this.agentRuntimeArtifact = props.agentRuntimeArtifact;
|
|
246
|
+
// Set up network configuration with VPC support
|
|
247
|
+
this.networkConfiguration = props.networkConfiguration ?? network_configuration_1.RuntimeNetworkConfiguration.usingPublicNetwork();
|
|
248
|
+
// Set connections - create a shared connections object
|
|
249
|
+
if (this.networkConfiguration.connections) {
|
|
250
|
+
// Use the network configuration's connections as the shared object
|
|
251
|
+
this._connections = this.networkConfiguration.connections;
|
|
252
|
+
}
|
|
253
|
+
this.protocolConfiguration = props.protocolConfiguration ?? types_1.ProtocolType.HTTP;
|
|
254
|
+
this.authorizerConfiguration = props.authorizerConfiguration;
|
|
255
|
+
const cfnProps = {
|
|
256
|
+
agentRuntimeName: this.agentRuntimeName,
|
|
257
|
+
roleArn: this.role.roleArn,
|
|
258
|
+
agentRuntimeArtifact: aws_cdk_lib_1.Lazy.any({
|
|
259
|
+
produce: () => this.renderAgentRuntimeArtifact(),
|
|
260
|
+
}),
|
|
261
|
+
networkConfiguration: aws_cdk_lib_1.Lazy.any({
|
|
262
|
+
produce: () => this.networkConfiguration._render(this._connections),
|
|
263
|
+
}),
|
|
264
|
+
protocolConfiguration: aws_cdk_lib_1.Lazy.string({
|
|
265
|
+
produce: () => this.protocolConfiguration,
|
|
266
|
+
}),
|
|
267
|
+
description: props.description,
|
|
268
|
+
environmentVariables: aws_cdk_lib_1.Lazy.any({
|
|
269
|
+
produce: () => this.renderEnvironmentVariables(props.environmentVariables),
|
|
270
|
+
}),
|
|
271
|
+
tags: props.tags ?? {},
|
|
272
|
+
lifecycleConfiguration: this.renderLifecycleConfiguration(),
|
|
273
|
+
};
|
|
274
|
+
if (props.requestHeaderConfiguration) {
|
|
275
|
+
cfnProps.requestHeaderConfiguration = this.renderRequestHeaderConfiguration(props.requestHeaderConfiguration);
|
|
276
|
+
}
|
|
277
|
+
if (props.authorizerConfiguration) {
|
|
278
|
+
cfnProps.authorizerConfiguration = aws_cdk_lib_1.Lazy.any({
|
|
279
|
+
produce: () => this.authorizerConfiguration._render(),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
this.runtimeResource = new bedrockagentcore.CfnRuntime(this, 'Resource', cfnProps);
|
|
283
|
+
// Add dependency on the role (for both custom and auto-created roles)
|
|
284
|
+
// This ensures the Runtime waits for the role and all its policies (including ECR permissions) to be created
|
|
285
|
+
this.runtimeResource.node.addDependency(this.role);
|
|
286
|
+
this.agentRuntimeId = this.runtimeResource.attrAgentRuntimeId;
|
|
287
|
+
this.agentRuntimeArn = this.runtimeResource.attrAgentRuntimeArn;
|
|
288
|
+
this.agentStatus = this.runtimeResource.attrStatus;
|
|
289
|
+
this.agentRuntimeVersion = this.runtimeResource.attrAgentRuntimeVersion;
|
|
290
|
+
this.createdAt = this.runtimeResource.attrCreatedAt;
|
|
291
|
+
this.lastUpdatedAt = this.runtimeResource.attrLastUpdatedAt;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Renders the environment variables for CloudFormation
|
|
295
|
+
* @internal
|
|
296
|
+
*/
|
|
297
|
+
renderEnvironmentVariables(envVars) {
|
|
298
|
+
if (!envVars || Object.keys(envVars).length === 0) {
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
return envVars;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Adds proper permissions to the execution role for the agent runtime
|
|
305
|
+
* Based on: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html
|
|
306
|
+
*/
|
|
307
|
+
addExecutionRolePermissions() {
|
|
308
|
+
const region = aws_cdk_lib_1.Stack.of(this).region;
|
|
309
|
+
const account = aws_cdk_lib_1.Stack.of(this).account;
|
|
310
|
+
// CloudWatch Logs - Log Group operations
|
|
311
|
+
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
312
|
+
sid: 'LogGroupAccess',
|
|
313
|
+
effect: iam.Effect.ALLOW,
|
|
314
|
+
actions: perms_1.RUNTIME_LOGS_GROUP_ACTIONS,
|
|
315
|
+
resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:/aws/bedrock-agentcore/runtimes/*`],
|
|
316
|
+
}));
|
|
317
|
+
// CloudWatch Logs - Describe all log groups
|
|
318
|
+
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
319
|
+
sid: 'DescribeLogGroups',
|
|
320
|
+
effect: iam.Effect.ALLOW,
|
|
321
|
+
actions: perms_1.RUNTIME_LOGS_DESCRIBE_ACTIONS,
|
|
322
|
+
resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:*`],
|
|
323
|
+
}));
|
|
324
|
+
// CloudWatch Logs - Log Stream operations
|
|
325
|
+
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
326
|
+
sid: 'LogStreamAccess',
|
|
327
|
+
effect: iam.Effect.ALLOW,
|
|
328
|
+
actions: perms_1.RUNTIME_LOGS_STREAM_ACTIONS,
|
|
329
|
+
resources: [`arn:${aws_cdk_lib_1.Stack.of(this).partition}:logs:${region}:${account}:log-group:/aws/bedrock-agentcore/runtimes/*:log-stream:*`],
|
|
330
|
+
}));
|
|
331
|
+
// X-Ray Tracing - must be * for tracing
|
|
332
|
+
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
333
|
+
sid: 'XRayAccess',
|
|
334
|
+
effect: iam.Effect.ALLOW,
|
|
335
|
+
actions: perms_1.RUNTIME_XRAY_ACTIONS,
|
|
336
|
+
resources: ['*'],
|
|
337
|
+
}));
|
|
338
|
+
// CloudWatch Metrics - scoped to bedrock-agentcore namespace
|
|
339
|
+
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
340
|
+
sid: 'CloudWatchMetrics',
|
|
341
|
+
effect: iam.Effect.ALLOW,
|
|
342
|
+
actions: perms_1.RUNTIME_CLOUDWATCH_METRICS_ACTIONS,
|
|
343
|
+
resources: ['*'],
|
|
344
|
+
conditions: {
|
|
345
|
+
StringEquals: {
|
|
346
|
+
'cloudwatch:namespace': perms_1.RUNTIME_CLOUDWATCH_NAMESPACE,
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
}));
|
|
350
|
+
// Bedrock AgentCore Workload Identity Access
|
|
351
|
+
// Note: The agent name will be determined at runtime, so we use a wildcard pattern
|
|
352
|
+
this.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
353
|
+
sid: 'GetAgentAccessToken',
|
|
354
|
+
effect: iam.Effect.ALLOW,
|
|
355
|
+
actions: perms_1.RUNTIME_WORKLOAD_IDENTITY_ACTIONS,
|
|
356
|
+
resources: [
|
|
357
|
+
`arn:${aws_cdk_lib_1.Stack.of(this).partition}:bedrock-agentcore:${region}:${account}:workload-identity-directory/default`,
|
|
358
|
+
`arn:${aws_cdk_lib_1.Stack.of(this).partition}:bedrock-agentcore:${region}:${account}:workload-identity-directory/default/workload-identity/*`,
|
|
359
|
+
],
|
|
360
|
+
}));
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Renders the artifact configuration for CloudFormation
|
|
364
|
+
* @internal
|
|
365
|
+
*/
|
|
366
|
+
renderAgentRuntimeArtifact() {
|
|
367
|
+
// set permission with bind
|
|
368
|
+
this.agentRuntimeArtifact.bind(this, this);
|
|
369
|
+
const config = this.agentRuntimeArtifact._render();
|
|
370
|
+
if (config.code) { // S3Image
|
|
371
|
+
return {
|
|
372
|
+
codeConfiguration: {
|
|
373
|
+
code: config.code,
|
|
374
|
+
runtime: config.runtime,
|
|
375
|
+
entryPoint: config.entryPoint,
|
|
376
|
+
},
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
// EcrImage or AssetImage
|
|
381
|
+
const containerUri = config.containerUri;
|
|
382
|
+
if (containerUri) {
|
|
383
|
+
this.validateContainerUri(containerUri);
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
containerConfiguration: {
|
|
387
|
+
containerUri: containerUri,
|
|
388
|
+
},
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Renders the request header configuration for CloudFormation
|
|
394
|
+
* @internal
|
|
395
|
+
*/
|
|
396
|
+
renderRequestHeaderConfiguration(requestHeaderConfiguration) {
|
|
397
|
+
if (!requestHeaderConfiguration?.allowlistedHeaders) {
|
|
398
|
+
return undefined;
|
|
399
|
+
}
|
|
400
|
+
return {
|
|
401
|
+
requestHeaderAllowlist: requestHeaderConfiguration.allowlistedHeaders,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Renders the lifecycle configuration for CloudFormation
|
|
406
|
+
* @internal
|
|
407
|
+
*/
|
|
408
|
+
renderLifecycleConfiguration() {
|
|
409
|
+
return {
|
|
410
|
+
idleRuntimeSessionTimeout: this.lifecycleConfiguration?.idleRuntimeSessionTimeout?.toSeconds(),
|
|
411
|
+
maxLifetime: this.lifecycleConfiguration?.maxLifetime?.toSeconds(),
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Validates the request header configuration
|
|
416
|
+
* @throws Error if validation fails
|
|
417
|
+
*/
|
|
418
|
+
validateRequestHeaderConfiguration(requestHeaderConfiguration) {
|
|
419
|
+
const allErrors = [];
|
|
420
|
+
if (requestHeaderConfiguration.allowlistedHeaders) {
|
|
421
|
+
if (requestHeaderConfiguration.allowlistedHeaders.length < 1 || requestHeaderConfiguration.allowlistedHeaders.length > 20) {
|
|
422
|
+
allErrors.push('Request header allow list contain between 1 and 20 headers');
|
|
423
|
+
}
|
|
424
|
+
for (const header of requestHeaderConfiguration.allowlistedHeaders) {
|
|
425
|
+
// Validate length
|
|
426
|
+
const lengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
427
|
+
value: header,
|
|
428
|
+
fieldName: 'Request header',
|
|
429
|
+
minLength: 1,
|
|
430
|
+
maxLength: 256,
|
|
431
|
+
});
|
|
432
|
+
allErrors.push(...lengthErrors);
|
|
433
|
+
const patternErrors = (0, validation_helpers_1.validateFieldPattern)(header, 'Request header', /(Authorization|X-Amzn-Bedrock-AgentCore-Runtime-Custom-[a-zA-Z0-9-]+)/, 'Request header must contain only letters, numbers, and hyphens');
|
|
434
|
+
allErrors.push(...patternErrors);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
if (allErrors.length > 0) {
|
|
438
|
+
throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Validates the lifecycle configuration
|
|
443
|
+
* @throws Error if validation fails
|
|
444
|
+
*/
|
|
445
|
+
validateLifecycleConfiguration(lifecycleConfiguration) {
|
|
446
|
+
if (lifecycleConfiguration.idleRuntimeSessionTimeout && !lifecycleConfiguration.idleRuntimeSessionTimeout.isUnresolved()) {
|
|
447
|
+
if (lifecycleConfiguration.idleRuntimeSessionTimeout.toSeconds() < LIFECYCLE_MIN_TIMEOUT.toSeconds()
|
|
448
|
+
|| lifecycleConfiguration.idleRuntimeSessionTimeout.toSeconds() > LIFECYCLE_MAX_LIFETIME.toSeconds()) {
|
|
449
|
+
throw new validation_helpers_1.ValidationError(`Idle runtime session timeout must be between ${LIFECYCLE_MIN_TIMEOUT.toSeconds()} seconds and ${LIFECYCLE_MAX_LIFETIME.toSeconds()} seconds`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
if (lifecycleConfiguration.maxLifetime && !lifecycleConfiguration.maxLifetime.isUnresolved()) {
|
|
453
|
+
if (lifecycleConfiguration.maxLifetime.toSeconds() < LIFECYCLE_MIN_TIMEOUT.toSeconds()
|
|
454
|
+
|| lifecycleConfiguration.maxLifetime.toSeconds() > LIFECYCLE_MAX_LIFETIME.toSeconds()) {
|
|
455
|
+
throw new validation_helpers_1.ValidationError(`Maximum lifetime must be between ${LIFECYCLE_MIN_TIMEOUT.toSeconds()} seconds and ${LIFECYCLE_MAX_LIFETIME.toSeconds()} seconds`);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Validates the runtime name format
|
|
461
|
+
* Pattern: ^[a-zA-Z][a-zA-Z0-9_]{0,47}$
|
|
462
|
+
* @throws Error if validation fails
|
|
463
|
+
*/
|
|
464
|
+
validateRuntimeName() {
|
|
465
|
+
// Skip validation if the name contains CDK tokens (unresolved values)
|
|
466
|
+
if (aws_cdk_lib_1.Token.isUnresolved(this.agentRuntimeName)) {
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
// Validate length
|
|
470
|
+
const lengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
471
|
+
value: this.agentRuntimeName,
|
|
472
|
+
fieldName: 'Runtime name',
|
|
473
|
+
minLength: 1,
|
|
474
|
+
maxLength: 48,
|
|
475
|
+
});
|
|
476
|
+
// Validate pattern
|
|
477
|
+
const patternErrors = (0, validation_helpers_1.validateFieldPattern)(this.agentRuntimeName, 'Runtime name', /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/, 'Runtime name must start with a letter and contain only letters, numbers, and underscores');
|
|
478
|
+
// Combine and throw if any errors
|
|
479
|
+
const allErrors = [...lengthErrors, ...patternErrors];
|
|
480
|
+
if (allErrors.length > 0) {
|
|
481
|
+
throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Validates the description format
|
|
486
|
+
* Must be between 1 and 1200 characters (per CloudFormation specification)
|
|
487
|
+
* @throws Error if validation fails
|
|
488
|
+
*/
|
|
489
|
+
validateDescription() {
|
|
490
|
+
// Skip validation if the description contains CDK tokens (unresolved values)
|
|
491
|
+
if (aws_cdk_lib_1.Token.isUnresolved(this.description)) {
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
if (this.description) {
|
|
495
|
+
const errors = (0, validation_helpers_1.validateStringField)({
|
|
496
|
+
value: this.description,
|
|
497
|
+
fieldName: 'Description',
|
|
498
|
+
minLength: 1,
|
|
499
|
+
maxLength: 1200,
|
|
500
|
+
});
|
|
501
|
+
if (errors.length > 0) {
|
|
502
|
+
throw new validation_helpers_1.ValidationError(errors.join('\n'));
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Validates environment variables
|
|
508
|
+
* - Maximum 50 entries
|
|
509
|
+
* - Key: 1-100 characters
|
|
510
|
+
* - Value: 0-2048 characters (per CloudFormation specification)
|
|
511
|
+
* @throws Error if validation fails
|
|
512
|
+
*/
|
|
513
|
+
validateEnvironmentVariables(envVars) {
|
|
514
|
+
const entries = Object.entries(envVars);
|
|
515
|
+
// Validate number of entries (0-50)
|
|
516
|
+
if (entries.length > 50) {
|
|
517
|
+
throw new validation_helpers_1.ValidationError(`Too many environment variables: ${entries.length}. Maximum allowed is 50`);
|
|
518
|
+
}
|
|
519
|
+
for (const [key, value] of entries) {
|
|
520
|
+
// Skip validation if key or value contains CDK tokens
|
|
521
|
+
if (aws_cdk_lib_1.Token.isUnresolved(key) || aws_cdk_lib_1.Token.isUnresolved(value)) {
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
// Validate key length
|
|
525
|
+
const lengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
526
|
+
value: key,
|
|
527
|
+
fieldName: `Environment variable key '${key}'`,
|
|
528
|
+
minLength: 1,
|
|
529
|
+
maxLength: 100,
|
|
530
|
+
});
|
|
531
|
+
// Validate key pattern
|
|
532
|
+
const patternErrors = (0, validation_helpers_1.validateFieldPattern)(key, `Environment variable key '${key}'`, /^[a-zA-Z_][a-zA-Z0-9_]*$/, `Environment variable key '${key}' must start with a letter or underscore and contain only letters, numbers, and underscores`);
|
|
533
|
+
// Combine and throw if any errors
|
|
534
|
+
const allErrors = [...lengthErrors, ...patternErrors];
|
|
535
|
+
if (allErrors.length > 0) {
|
|
536
|
+
throw new validation_helpers_1.ValidationError(allErrors.join('\n'));
|
|
537
|
+
}
|
|
538
|
+
// Validate value length (0-2048 characters per CloudFormation)
|
|
539
|
+
if (value.length > 2048) {
|
|
540
|
+
throw new validation_helpers_1.ValidationError(`Invalid environment variable value length for key '${key}': ${value.length} characters. ` +
|
|
541
|
+
'Values must not exceed 2048 characters');
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Validates the tags format
|
|
547
|
+
* @param tags The tags object to validate
|
|
548
|
+
* @throws Error if validation fails
|
|
549
|
+
*/
|
|
550
|
+
validateTags(tags) {
|
|
551
|
+
// Validate each tag key and value
|
|
552
|
+
for (const [key, value] of Object.entries(tags)) {
|
|
553
|
+
// Skip validation if key or value contains CDK tokens
|
|
554
|
+
if (aws_cdk_lib_1.Token.isUnresolved(key) || aws_cdk_lib_1.Token.isUnresolved(value)) {
|
|
555
|
+
continue;
|
|
556
|
+
}
|
|
557
|
+
// Validate tag key length
|
|
558
|
+
const keyLengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
559
|
+
value: key,
|
|
560
|
+
fieldName: `Tag key "${key}"`,
|
|
561
|
+
minLength: 1,
|
|
562
|
+
maxLength: 256,
|
|
563
|
+
});
|
|
564
|
+
// Validate tag key pattern
|
|
565
|
+
const keyPatternErrors = (0, validation_helpers_1.validateFieldPattern)(key, `Tag key "${key}"`, /^[a-zA-Z0-9\s._:/=+@-]*$/, `Tag key "${key}" can only contain letters (a-z, A-Z), numbers (0-9), spaces, and special characters (._:/=+@-)`);
|
|
566
|
+
// Combine key errors and throw if any
|
|
567
|
+
const keyErrors = [...keyLengthErrors, ...keyPatternErrors];
|
|
568
|
+
if (keyErrors.length > 0) {
|
|
569
|
+
throw new validation_helpers_1.ValidationError(keyErrors.join('\n'));
|
|
570
|
+
}
|
|
571
|
+
if (value === undefined || value === null) {
|
|
572
|
+
throw new validation_helpers_1.ValidationError(`Tag value for key "${key}" cannot be null or undefined`);
|
|
573
|
+
}
|
|
574
|
+
// Validate tag value length
|
|
575
|
+
const valueLengthErrors = (0, validation_helpers_1.validateStringField)({
|
|
576
|
+
value: value,
|
|
577
|
+
fieldName: `Tag value for key "${key}"`,
|
|
578
|
+
minLength: 0,
|
|
579
|
+
maxLength: 256,
|
|
580
|
+
});
|
|
581
|
+
// Validate tag value pattern
|
|
582
|
+
const valuePatternErrors = (0, validation_helpers_1.validateFieldPattern)(value, `Tag value for key "${key}"`, /^[a-zA-Z0-9\s._:/=+@-]*$/, `Tag value for key "${key}" can only contain letters (a-z, A-Z), numbers (0-9), spaces, and special characters (._:/=+@-)`);
|
|
583
|
+
// Combine value errors and throw if any
|
|
584
|
+
const valueErrors = [...valueLengthErrors, ...valuePatternErrors];
|
|
585
|
+
if (valueErrors.length > 0) {
|
|
586
|
+
throw new validation_helpers_1.ValidationError(valueErrors.join('\n'));
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Validates the container URI format
|
|
592
|
+
*/
|
|
593
|
+
validateContainerUri(uri) {
|
|
594
|
+
// Skip validation if the URI contains CDK tokens (unresolved values)
|
|
595
|
+
if (aws_cdk_lib_1.Token.isUnresolved(uri)) {
|
|
596
|
+
// Add a warning that validation will be skipped for token-based URIs
|
|
597
|
+
aws_cdk_lib_1.Annotations.of(this).addInfo('Container URI validation skipped as it contains unresolved CDK tokens. ' +
|
|
598
|
+
'The URI will be validated at deployment time.');
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
// Only validate if the URI is a concrete string (not a token)
|
|
602
|
+
const pattern = /^\d{12}\.dkr\.ecr\.([a-z0-9-]+)\.amazonaws\.com\/((?:[a-z0-9]+(?:[._-][a-z0-9]+)*\/)*[a-z0-9]+(?:[._-][a-z0-9]+)*)([:@]\S+)$/;
|
|
603
|
+
if (!pattern.test(uri)) {
|
|
604
|
+
throw new validation_helpers_1.ValidationError(`Invalid container URI format: ${uri}. Must be a valid ECR URI (e.g., 123456789012.dkr.ecr.us-west-2.amazonaws.com/my-agent:latest)`);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Validates the IAM role ARN format and structure
|
|
609
|
+
* @throws Error if validation fails
|
|
610
|
+
*/
|
|
611
|
+
validateRoleArn(roleArn) {
|
|
612
|
+
// Validate basic ARN format for IAM roles
|
|
613
|
+
const arnPattern = /^arn:[a-z\-]+:iam::\d{12}:role\/[a-zA-Z0-9+=,.@\-_\/]+$/;
|
|
614
|
+
if (!arnPattern.test(roleArn)) {
|
|
615
|
+
throw new validation_helpers_1.ValidationError(`Invalid IAM role ARN format: ${roleArn}. ` +
|
|
616
|
+
'Expected format: arn:<partition>:iam::<account-id>:role/<role-name> or arn:<partition>:iam::<account-id>:role/<path>/<role-name>');
|
|
617
|
+
}
|
|
618
|
+
// Parse the ARN components using CDK's Arn.split()
|
|
619
|
+
// Use SLASH_RESOURCE_NAME format for IAM roles (which use format: role/role-name or role/path/to/role-name)
|
|
620
|
+
const arnComponents = aws_cdk_lib_1.Arn.split(roleArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME);
|
|
621
|
+
if (arnComponents.service !== 'iam') {
|
|
622
|
+
throw new validation_helpers_1.ValidationError(`Invalid service in ARN: ${arnComponents.service}. Expected 'iam' for IAM role ARN.`);
|
|
623
|
+
}
|
|
624
|
+
const accountId = arnComponents.account;
|
|
625
|
+
if (!accountId || !/^\d{12}$/.test(accountId)) {
|
|
626
|
+
throw new validation_helpers_1.ValidationError(`Invalid AWS account ID in role ARN: ${accountId}. Must be a 12-digit number.`);
|
|
627
|
+
}
|
|
628
|
+
// Extract role name from resource
|
|
629
|
+
// For IAM roles, resource will be "role" and resourceName will be the role name (with optional path)
|
|
630
|
+
const resource = arnComponents.resource;
|
|
631
|
+
const resourceName = arnComponents.resourceName;
|
|
632
|
+
if (resource !== 'role') {
|
|
633
|
+
throw new validation_helpers_1.ValidationError(`Invalid resource type in ARN: ${resource}. Expected 'role' for IAM role ARN.`);
|
|
634
|
+
}
|
|
635
|
+
if (!resourceName) {
|
|
636
|
+
throw new validation_helpers_1.ValidationError('Role name is missing in the ARN');
|
|
637
|
+
}
|
|
638
|
+
else {
|
|
639
|
+
const rolePathParts = resourceName.split('/');
|
|
640
|
+
const roleName = rolePathParts[rolePathParts.length - 1];
|
|
641
|
+
if (roleName.length > 64) {
|
|
642
|
+
throw new validation_helpers_1.ValidationError(`Role name exceeds maximum length of 64 characters: ${roleName}`);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
const stackAccount = aws_cdk_lib_1.Stack.of(this).account;
|
|
646
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(stackAccount) && accountId !== stackAccount) {
|
|
647
|
+
aws_cdk_lib_1.Annotations.of(this).addWarning(`IAM role is from a different account (${accountId}) than the stack account (${stackAccount}). ` +
|
|
648
|
+
'Ensure cross-account permissions are properly configured.');
|
|
649
|
+
}
|
|
650
|
+
// Validate the region (IAM is global, so region should be empty)
|
|
651
|
+
const region = arnComponents.region;
|
|
652
|
+
const stackRegion = aws_cdk_lib_1.Stack.of(this).region;
|
|
653
|
+
if (region && region !== '' && region !== stackRegion && !aws_cdk_lib_1.Token.isUnresolved(stackRegion)) {
|
|
654
|
+
aws_cdk_lib_1.Annotations.of(this).addWarning(`IAM role ARN contains a region (${region}) that doesn't match the stack region (${stackRegion}). ` +
|
|
655
|
+
'IAM is a global service, so this might be intentional.');
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Add an endpoint to this runtime
|
|
660
|
+
* This is a convenience method that creates a RuntimeEndpoint associated with this runtime
|
|
661
|
+
*
|
|
662
|
+
* @param endpointName The name of the endpoint
|
|
663
|
+
* @param options Optional configuration for the endpoint
|
|
664
|
+
* @returns The created RuntimeEndpoint
|
|
665
|
+
*/
|
|
666
|
+
addEndpoint(endpointName, options) {
|
|
667
|
+
try {
|
|
668
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddEndpointOptions(options);
|
|
669
|
+
}
|
|
670
|
+
catch (error) {
|
|
671
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
672
|
+
Error.captureStackTrace(error, this.addEndpoint);
|
|
673
|
+
}
|
|
674
|
+
throw error;
|
|
675
|
+
}
|
|
676
|
+
// Create the endpoint (security configuration is no longer supported)
|
|
677
|
+
const endpoint = new runtime_endpoint_1.RuntimeEndpoint(this, `Endpoint${endpointName}`, {
|
|
678
|
+
endpointName: endpointName,
|
|
679
|
+
agentRuntimeId: this.agentRuntimeId,
|
|
680
|
+
agentRuntimeVersion: options?.version ?? this.agentRuntimeVersion ?? '1',
|
|
681
|
+
description: options?.description,
|
|
682
|
+
});
|
|
683
|
+
// Add dependency: endpoint must wait for runtime to be created
|
|
684
|
+
endpoint.node.addDependency(this.runtimeResource);
|
|
685
|
+
return endpoint;
|
|
686
|
+
}
|
|
687
|
+
static {
|
|
688
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
689
|
+
}
|
|
690
|
+
};
|
|
691
|
+
return Runtime = _classThis;
|
|
692
|
+
})();
|
|
693
|
+
exports.Runtime = Runtime;
|
|
694
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQXdGO0FBQ3hGLHFFQUFxRTtBQUNyRSwyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFFMUUsbUNBUWlCO0FBR2pCLGlEQUEyRjtBQUMzRix5REFBcUQ7QUFDckQsNEVBQStFO0FBQy9FLG1DQUEyRjtBQUMzRiw2REFBa0c7QUFFbEc7OytFQUUrRTtBQUMvRTs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsc0JBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFzR3ZEOzsrRUFFK0U7QUFFL0U7Ozs7Ozs7R0FPRztJQUVVLE9BQU87NEJBRG5CLG9DQUFrQjs7OztzQkFDVSwwQkFBVzs7O3VCQUFuQixTQUFRLFdBQVc7Ozs7dUNBcXBCckMsSUFBQSxrQ0FBYyxHQUFFO1lBQ2pCLG9MQUFPLFdBQVcsNkRBZ0JqQjtZQXRxQkgsNktBdXFCQzs7Ozs7UUF0cUJDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsOENBQThDLENBQUM7UUFFdEc7Ozs7Ozs7O1dBUUc7UUFDSSxNQUFNLENBQUMsMEJBQTBCLENBQ3RDLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUE2Qjs7Ozs7Ozs7OztZQUU3QixNQUFNLDJCQUE0QixTQUFRLDBCQUFXO2dCQUNuQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7Z0JBQ3RDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDMUMsbUJB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Q0FBQztZQUNKLENBQUM7WUFFRCxpRUFBaUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxNQUFNLFdBQVcsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDMUMsSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDMUYseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUM3QixtQ0FBbUMsTUFBTSwwQ0FBMEMsV0FBVyxLQUFLO29CQUNuRyx3REFBd0QsQ0FDekQsQ0FBQztZQUNKLENBQUM7U0FDRjtRQUVEOzs7Ozs7O1dBT0c7UUFFSSxXQUFXLENBQ2hCLFlBQW9CLEVBQ3BCLE9BQTRCOzs7Ozs7Ozs7O1lBRTVCLHNFQUFzRTtZQUN0RSxNQUFNLFFBQVEsR0FBRyxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsWUFBWSxFQUFFLEVBQUU7Z0JBQ3BFLFlBQVksRUFBRSxZQUFZO2dCQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLEdBQUc7Z0JBQ3hFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVzthQUNsQyxDQUFDLENBQUM7WUFFSCwrREFBK0Q7WUFDL0QsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWxELE9BQU8sUUFBUSxDQUFDO1NBQ2pCOztZQXRxQlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjaywgQW5ub3RhdGlvbnMsIFRva2VuLCBBcm4sIEFybkZvcm1hdCwgTGF6eSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGJlZHJvY2thZ2VudGNvcmUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgUlVOVElNRV9MT0dTX0dST1VQX0FDVElPTlMsXG4gIFJVTlRJTUVfTE9HU19ERVNDUklCRV9BQ1RJT05TLFxuICBSVU5USU1FX0xPR1NfU1RSRUFNX0FDVElPTlMsXG4gIFJVTlRJTUVfWFJBWV9BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTUVUUklDU19BQ1RJT05TLFxuICBSVU5USU1FX0NMT1VEV0FUQ0hfTkFNRVNQQUNFLFxuICBSVU5USU1FX1dPUktMT0FEX0lERU5USVRZX0FDVElPTlMsXG59IGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHsgQWdlbnRSdW50aW1lQXJ0aWZhY3QgfSBmcm9tICcuL3J1bnRpbWUtYXJ0aWZhY3QnO1xuaW1wb3J0IHsgUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9ydW50aW1lLWF1dGhvcml6ZXItY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBSdW50aW1lQmFzZSwgSUJlZHJvY2tBZ2VudFJ1bnRpbWUsIEFnZW50UnVudGltZUF0dHJpYnV0ZXMgfSBmcm9tICcuL3J1bnRpbWUtYmFzZSc7XG5pbXBvcnQgeyBSdW50aW1lRW5kcG9pbnQgfSBmcm9tICcuL3J1bnRpbWUtZW5kcG9pbnQnO1xuaW1wb3J0IHsgUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vbmV0d29yay9uZXR3b3JrLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgTGlmZWN5Y2xlQ29uZmlndXJhdGlvbiwgUHJvdG9jb2xUeXBlLCBSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVTdHJpbmdGaWVsZCwgVmFsaWRhdGlvbkVycm9yLCB2YWxpZGF0ZUZpZWxkUGF0dGVybiB9IGZyb20gJy4vdmFsaWRhdGlvbi1oZWxwZXJzJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50c1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBNaW5pbXVtIHRpbWVvdXQgZm9yIGlkbGUgcnVudGltZSBzZXNzaW9uc1xuICogQGludGVybmFsXG4gKi9cbmNvbnN0IExJRkVDWUNMRV9NSU5fVElNRU9VVCA9IER1cmF0aW9uLnNlY29uZHMoNjApO1xuXG4vKipcbiAqIE1heGltdW0gbGlmZXRpbWUgZm9yIHRoZSBpbnN0YW5jZVxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IExJRkVDWUNMRV9NQVhfTElGRVRJTUUgPSBEdXJhdGlvbi5zZWNvbmRzKDI4ODAwKTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZSByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzIGFyZSBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKVxuICAgKiBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNhbiBiZSB1cCB0byA0OCBjaGFyYWN0ZXJzIGxvbmdcbiAgICogUGF0dGVybjogXlthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9JFxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFydGlmYWN0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIENvbnRhaW5zIHRoZSBjb250YWluZXIgY29uZmlndXJhdGlvbiB3aXRoIEVDUiBVUklcbiAgICovXG4gIHJlYWRvbmx5IGFnZW50UnVudGltZUFydGlmYWN0OiBBZ2VudFJ1bnRpbWVBcnRpZmFjdDtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSByb2xlIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5XG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgcm9sZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIE5ldHdvcmsgY29uZmlndXJhdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGRlZmF1bHQgLSBSdW50aW1lTmV0d29ya0NvbmZpZ3VyYXRpb24udXNpbmdQdWJsaWNOZXR3b3JrKClcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtDb25maWd1cmF0aW9uPzogUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKiBMZW5ndGggTWluaW11bTogMSAsIE1heGltdW06IDEyMDBcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcm90b2NvbCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAZGVmYXVsdCAtIFByb3RvY29sVHlwZS5IVFRQXG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb24/OiBQcm90b2NvbFR5cGU7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogLSBNYXhpbXVtIDUwIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiAtIEtleTogTXVzdCBiZSAxLTEwMCBjaGFyYWN0ZXJzLCBzdGFydCB3aXRoIGxldHRlciBvciB1bmRlcnNjb3JlLCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzXG4gICAqIC0gVmFsdWU6IE11c3QgYmUgMC0yMDQ4IGNoYXJhY3RlcnMgKHBlciBDbG91ZEZvcm1hdGlvbiBzcGVjaWZpY2F0aW9uKVxuICAgKiBAZGVmYXVsdCAtIE5vIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBBdXRob3JpemVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIFVzZSBSdW50aW1lQXV0aG9yaXplckNvbmZpZ3VyYXRpb24gc3RhdGljIG1ldGhvZHMgdG8gY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uXG4gICAqIEBkZWZhdWx0IC0gUnVudGltZUF1dGhvcml6ZXJDb25maWd1cmF0aW9uLmlhbSgpIChJQU0gYXV0aGVudGljYXRpb24pXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemVyQ29uZmlndXJhdGlvbj86IFJ1bnRpbWVBdXRob3JpemVyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGFncyBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQSBsaXN0IG9mIGtleTp2YWx1ZSBwYWlycyBvZiB0YWdzIHRvIGFwcGx5IHRvIHRoaXMgUnVudGltZSByZXNvdXJjZVxuICAgKiBAZGVmYXVsdCB7fSAtIG5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIGZvciBIVFRQIHJlcXVlc3QgaGVhZGVycyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHJ1bnRpbWUuXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVxdWVzdCBoZWFkZXJzIGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uPzogUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaWZlIGN5Y2xlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBBZ2VudENvcmUgUnVudGltZS5cbiAgICogQGRlZmF1bHQgLSBObyBsaWZlY3ljbGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbGlmZWN5Y2xlQ29uZmlndXJhdGlvbj86IExpZmVjeWNsZUNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYWRkaW5nIGFuIGVuZHBvaW50IHRvIHRoZSBydW50aW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIGZvciB0aGUgZW5kcG9pbnQsIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjAwIGNoYXJhY3RlcnNcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgcnVudGltZSB2ZXJzaW9uIGZvciB0aGlzIGVuZHBvaW50XG4gICAqIEBkZWZhdWx0ICAxXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBCZWRyb2NrIEFnZW50IENvcmUgUnVudGltZVxuICogRW5hYmxlcyBydW5uaW5nIGNvbnRhaW5lcml6ZWQgYWdlbnRzIHdpdGggc3BlY2lmaWMgbmV0d29yayBjb25maWd1cmF0aW9ucyxcbiAqIHNlY3VyaXR5IHNldHRpbmdzLCBhbmQgcnVudGltZSBhcnRpZmFjdHMuXG4gKlxuICogQHJlc291cmNlIEFXUzo6QmVkcm9ja0FnZW50Q29yZTo6UnVudGltZVxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL3J1bnRpbWUuaHRtbFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgUnVudGltZSBleHRlbmRzIFJ1bnRpbWVCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtYmVkcm9jay1hZ2VudGNvcmUtYWxwaGEuUnVudGltZSc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBBZ2VudCBSdW50aW1lIHVzaW5nIGF0dHJpYnV0ZXNcbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIHJlZmVyZW5jZSBhbiBBZ2VudCBSdW50aW1lIHRoYXQgd2FzIGNyZWF0ZWQgb3V0c2lkZSBvZiBDREtcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBleGlzdGluZyBBZ2VudCBSdW50aW1lXG4gICAqIEByZXR1cm5zIEFuIElCZWRyb2NrQWdlbnRSdW50aW1lIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgaW1wb3J0ZWQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQWdlbnRSdW50aW1lQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IEFnZW50UnVudGltZUF0dHJpYnV0ZXMsXG4gICk6IElCZWRyb2NrQWdlbnRSdW50aW1lIHtcbiAgICBjbGFzcyBJbXBvcnRlZEJlZHJvY2tBZ2VudFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lQXJuID0gYXR0cnMuYWdlbnRSdW50aW1lQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZUlkID0gYXR0cnMuYWdlbnRSdW50aW1lSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lTmFtZSA9IGF0dHJzLmFnZW50UnVudGltZU5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSdW50aW1lVmVyc2lvbiA9IGF0dHJzLmFnZW50UnVudGltZVZlcnNpb247XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRTdGF0dXMgPSBhdHRycy5hZ2VudFN0YXR1cztcbiAgICAgIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbiA9IGF0dHJzLmRlc2NyaXB0aW9uO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IGF0dHJzLmNyZWF0ZWRBdDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBsYXN0VXBkYXRlZEF0ID0gYXR0cnMubGFzdFVwZGF0ZWRBdDtcblxuICAgICAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuICAgICAgICB0aGlzLnJvbGUgPSBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnUm9sZScsIGF0dHJzLnJvbGVBcm4pO1xuICAgICAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuICAgICAgICBpZiAoYXR0cnMuc2VjdXJpdHlHcm91cHMpIHtcbiAgICAgICAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBlYzIuQ29ubmVjdGlvbnMoe1xuICAgICAgICAgICAgc2VjdXJpdHlHcm91cHM6IGF0dHJzLnNlY3VyaXR5R3JvdXBzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZEJlZHJvY2tBZ2VudFJ1bnRpbWUoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIEFSTiBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBJRCBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFJ1bnRpbWVOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIG9mIHRoaXMgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZVZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhZ2VudFN0YXR1cz86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBhZ2VudCBydW50aW1lIHdhcyBjcmVhdGVkXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGNyZWF0aW9uIHRpbWVzdGFtcCBvZiB0aGlzIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGFnZW50IHJ1bnRpbWUgd2FzIGxhc3QgdXBkYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBsYXN0IHVwZGF0ZSB0aW1lc3RhbXAgb2YgdGhpcyBhZ2VudCBydW50aW1lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lUmVzb3VyY2U6IGJlZHJvY2thZ2VudGNvcmUuQ2ZuUnVudGltZTtcbiAgLyoqXG4gICAqIFRoZSBhcnRpZmFjdCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFnZW50UnVudGltZUFydGlmYWN0OiBBZ2VudFJ1bnRpbWVBcnRpZmFjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrQ29uZmlndXJhdGlvbjogUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIDtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb246IFByb3RvY29sVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRob3JpemVyQ29uZmlndXJhdGlvbj86IFJ1bnRpbWVBdXRob3JpemVyQ29uZmlndXJhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaWZlY3ljbGVDb25maWd1cmF0aW9uPzogTGlmZWN5Y2xlQ29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUnVudGltZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5hZ2VudFJ1bnRpbWVOYW1lID0gcHJvcHMucnVudGltZU5hbWU7XG4gICAgdGhpcy52YWxpZGF0ZVJ1bnRpbWVOYW1lKCk7XG5cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVEZXNjcmlwdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcykge1xuICAgICAgdGhpcy52YWxpZGF0ZUVudmlyb25tZW50VmFyaWFibGVzKHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudGFncykge1xuICAgICAgdGhpcy52YWxpZGF0ZVRhZ3MocHJvcHMudGFncyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24ocHJvcHMucmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24pO1xuICAgIH1cblxuICAgIHRoaXMubGlmZWN5Y2xlQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQ6IHByb3BzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/LmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQgPz8gTElGRUNZQ0xFX01JTl9USU1FT1VULFxuICAgICAgbWF4TGlmZXRpbWU6IHByb3BzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/Lm1heExpZmV0aW1lID8/IExJRkVDWUNMRV9NQVhfTElGRVRJTUUsXG4gICAgfTtcbiAgICB0aGlzLnZhbGlkYXRlTGlmZWN5Y2xlQ29uZmlndXJhdGlvbih0aGlzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24pO1xuXG4gICAgaWYgKHByb3BzLmV4ZWN1dGlvblJvbGUpIHtcbiAgICAgIHRoaXMucm9sZSA9IHByb3BzLmV4ZWN1dGlvblJvbGU7XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5leGVjdXRpb25Sb2xlLnJvbGVBcm4pKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVSb2xlQXJuKHByb3BzLmV4ZWN1dGlvblJvbGUucm9sZUFybik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnRXhlY3V0aW9uUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2JlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdFeGVjdXRpb24gcm9sZSBmb3IgQmVkcm9jayBBZ2VudCBDb3JlIFJ1bnRpbWUnLFxuICAgICAgICBtYXhTZXNzaW9uRHVyYXRpb246IER1cmF0aW9uLmhvdXJzKDgpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuYWRkRXhlY3V0aW9uUm9sZVBlcm1pc3Npb25zKCk7XG5cbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuICAgIHRoaXMuYWdlbnRSdW50aW1lQXJ0aWZhY3QgPSBwcm9wcy5hZ2VudFJ1bnRpbWVBcnRpZmFjdDtcbiAgICAvLyBTZXQgdXAgbmV0d29yayBjb25maWd1cmF0aW9uIHdpdGggVlBDIHN1cHBvcnRcbiAgICB0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uID0gcHJvcHMubmV0d29ya0NvbmZpZ3VyYXRpb24gPz8gUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uLnVzaW5nUHVibGljTmV0d29yaygpO1xuICAgIC8vIFNldCBjb25uZWN0aW9ucyAtIGNyZWF0ZSBhIHNoYXJlZCBjb25uZWN0aW9ucyBvYmplY3RcbiAgICBpZiAodGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbi5jb25uZWN0aW9ucykge1xuICAgICAgLy8gVXNlIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24ncyBjb25uZWN0aW9ucyBhcyB0aGUgc2hhcmVkIG9iamVjdFxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMgPSB0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uLmNvbm5lY3Rpb25zO1xuICAgIH1cbiAgICB0aGlzLnByb3RvY29sQ29uZmlndXJhdGlvbiA9IHByb3BzLnByb3RvY29sQ29uZmlndXJhdGlvbiA/PyBQcm90b2NvbFR5cGUuSFRUUDtcbiAgICB0aGlzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uID0gcHJvcHMuYXV0aG9yaXplckNvbmZpZ3VyYXRpb247XG5cbiAgICBjb25zdCBjZm5Qcm9wczogYW55ID0ge1xuICAgICAgYWdlbnRSdW50aW1lTmFtZTogdGhpcy5hZ2VudFJ1bnRpbWVOYW1lLFxuICAgICAgcm9sZUFybjogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBhZ2VudFJ1bnRpbWVBcnRpZmFjdDogTGF6eS5hbnkoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnJlbmRlckFnZW50UnVudGltZUFydGlmYWN0KCksXG4gICAgICB9KSxcbiAgICAgIG5ldHdvcmtDb25maWd1cmF0aW9uOiBMYXp5LmFueSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uX3JlbmRlcih0aGlzLl9jb25uZWN0aW9ucyksXG4gICAgICB9KSxcbiAgICAgIHByb3RvY29sQ29uZmlndXJhdGlvbjogTGF6eS5zdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLnByb3RvY29sQ29uZmlndXJhdGlvbixcbiAgICAgIH0pLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IExhenkuYW55KHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5yZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcyksXG4gICAgICB9KSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MgPz8ge30sXG4gICAgICBsaWZlY3ljbGVDb25maWd1cmF0aW9uOiB0aGlzLnJlbmRlckxpZmVjeWNsZUNvbmZpZ3VyYXRpb24oKSxcbiAgICB9O1xuICAgIGlmIChwcm9wcy5yZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbikge1xuICAgICAgY2ZuUHJvcHMucmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24gPSB0aGlzLnJlbmRlclJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKHByb3BzLnJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmF1dGhvcml6ZXJDb25maWd1cmF0aW9uKSB7XG4gICAgICBjZm5Qcm9wcy5hdXRob3JpemVyQ29uZmlndXJhdGlvbiA9IExhenkuYW55KHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5hdXRob3JpemVyQ29uZmlndXJhdGlvbiEuX3JlbmRlcigpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5ydW50aW1lUmVzb3VyY2UgPSBuZXcgYmVkcm9ja2FnZW50Y29yZS5DZm5SdW50aW1lKHRoaXMsICdSZXNvdXJjZScsIGNmblByb3BzIGFzIGJlZHJvY2thZ2VudGNvcmUuQ2ZuUnVudGltZVByb3BzKTtcblxuICAgIC8vIEFkZCBkZXBlbmRlbmN5IG9uIHRoZSByb2xlIChmb3IgYm90aCBjdXN0b20gYW5kIGF1dG8tY3JlYXRlZCByb2xlcylcbiAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIFJ1bnRpbWUgd2FpdHMgZm9yIHRoZSByb2xlIGFuZCBhbGwgaXRzIHBvbGljaWVzIChpbmNsdWRpbmcgRUNSIHBlcm1pc3Npb25zKSB0byBiZSBjcmVhdGVkXG4gICAgdGhpcy5ydW50aW1lUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucm9sZSk7XG5cbiAgICB0aGlzLmFnZW50UnVudGltZUlkID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckFnZW50UnVudGltZUlkO1xuICAgIHRoaXMuYWdlbnRSdW50aW1lQXJuID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckFnZW50UnVudGltZUFybjtcbiAgICB0aGlzLmFnZW50U3RhdHVzID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0clN0YXR1cztcbiAgICB0aGlzLmFnZW50UnVudGltZVZlcnNpb24gPSB0aGlzLnJ1bnRpbWVSZXNvdXJjZS5hdHRyQWdlbnRSdW50aW1lVmVyc2lvbjtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IHRoaXMucnVudGltZVJlc291cmNlLmF0dHJDcmVhdGVkQXQ7XG4gICAgdGhpcy5sYXN0VXBkYXRlZEF0ID0gdGhpcy5ydW50aW1lUmVzb3VyY2UuYXR0ckxhc3RVcGRhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBhbnkge1xuICAgIGlmICghZW52VmFycyB8fCBPYmplY3Qua2V5cyhlbnZWYXJzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBlbnZWYXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcHJvcGVyIHBlcm1pc3Npb25zIHRvIHRoZSBleGVjdXRpb24gcm9sZSBmb3IgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICogQmFzZWQgb246IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcnVudGltZS1wZXJtaXNzaW9ucy5odG1sXG4gICAqL1xuICBwcml2YXRlIGFkZEV4ZWN1dGlvblJvbGVQZXJtaXNzaW9ucygpIHtcbiAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgY29uc3QgYWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG5cbiAgICAvLyBDbG91ZFdhdGNoIExvZ3MgLSBMb2cgR3JvdXAgb3BlcmF0aW9uc1xuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdMb2dHcm91cEFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX0xPR1NfR1JPVVBfQUNUSU9OUyxcbiAgICAgIHJlc291cmNlczogW2Bhcm46JHtTdGFjay5vZih0aGlzKS5wYXJ0aXRpb259OmxvZ3M6JHtyZWdpb259OiR7YWNjb3VudH06bG9nLWdyb3VwOi9hd3MvYmVkcm9jay1hZ2VudGNvcmUvcnVudGltZXMvKmBdLFxuICAgIH0pKTtcblxuICAgIC8vIENsb3VkV2F0Y2ggTG9ncyAtIERlc2NyaWJlIGFsbCBsb2cgZ3JvdXBzXG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ0Rlc2NyaWJlTG9nR3JvdXBzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfTE9HU19ERVNDUklCRV9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06bG9nczoke3JlZ2lvbn06JHthY2NvdW50fTpsb2ctZ3JvdXA6KmBdLFxuICAgIH0pKTtcblxuICAgIC8vIENsb3VkV2F0Y2ggTG9ncyAtIExvZyBTdHJlYW0gb3BlcmF0aW9uc1xuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdMb2dTdHJlYW1BY2Nlc3MnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogUlVOVElNRV9MT0dTX1NUUkVBTV9BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06bG9nczoke3JlZ2lvbn06JHthY2NvdW50fTpsb2ctZ3JvdXA6L2F3cy9iZWRyb2NrLWFnZW50Y29yZS9ydW50aW1lcy8qOmxvZy1zdHJlYW06KmBdLFxuICAgIH0pKTtcblxuICAgIC8vIFgtUmF5IFRyYWNpbmcgLSBtdXN0IGJlICogZm9yIHRyYWNpbmdcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnWFJheUFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX1hSQVlfQUNUSU9OUyxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgLy8gQ2xvdWRXYXRjaCBNZXRyaWNzIC0gc2NvcGVkIHRvIGJlZHJvY2stYWdlbnRjb3JlIG5hbWVzcGFjZVxuICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdDbG91ZFdhdGNoTWV0cmljcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX0NMT1VEV0FUQ0hfTUVUUklDU19BQ1RJT05TLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2Nsb3Vkd2F0Y2g6bmFtZXNwYWNlJzogUlVOVElNRV9DTE9VRFdBVENIX05BTUVTUEFDRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkpO1xuXG4gICAgLy8gQmVkcm9jayBBZ2VudENvcmUgV29ya2xvYWQgSWRlbnRpdHkgQWNjZXNzXG4gICAgLy8gTm90ZTogVGhlIGFnZW50IG5hbWUgd2lsbCBiZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUsIHNvIHdlIHVzZSBhIHdpbGRjYXJkIHBhdHRlcm5cbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnR2V0QWdlbnRBY2Nlc3NUb2tlbicsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBSVU5USU1FX1dPUktMT0FEX0lERU5USVRZX0FDVElPTlMsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjoke1N0YWNrLm9mKHRoaXMpLnBhcnRpdGlvbn06YmVkcm9jay1hZ2VudGNvcmU6JHtyZWdpb259OiR7YWNjb3VudH06d29ya2xvYWQtaWRlbnRpdHktZGlyZWN0b3J5L2RlZmF1bHRgLFxuICAgICAgICBgYXJuOiR7U3RhY2sub2YodGhpcykucGFydGl0aW9ufTpiZWRyb2NrLWFnZW50Y29yZToke3JlZ2lvbn06JHthY2NvdW50fTp3b3JrbG9hZC1pZGVudGl0eS1kaXJlY3RvcnkvZGVmYXVsdC93b3JrbG9hZC1pZGVudGl0eS8qYCxcbiAgICAgIF0sXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGFydGlmYWN0IGNvbmZpZ3VyYXRpb24gZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJBZ2VudFJ1bnRpbWVBcnRpZmFjdCgpOiBhbnkge1xuICAgIC8vIHNldCBwZXJtaXNzaW9uIHdpdGggYmluZFxuICAgIHRoaXMuYWdlbnRSdW50aW1lQXJ0aWZhY3QuYmluZCh0aGlzLCB0aGlzKTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmFnZW50UnVudGltZUFydGlmYWN0Ll9yZW5kZXIoKTtcbiAgICBpZiAoKGNvbmZpZyBhcyBhbnkpLmNvZGUpIHsgLy8gUzNJbWFnZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZUNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb2RlOiAoY29uZmlnIGFzIGFueSkuY29kZSxcbiAgICAgICAgICBydW50aW1lOiAoY29uZmlnIGFzIGFueSkucnVudGltZSxcbiAgICAgICAgICBlbnRyeVBvaW50OiAoY29uZmlnIGFzIGFueSkuZW50cnlQb2ludCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVjckltYWdlIG9yIEFzc2V0SW1hZ2VcbiAgICAgIGNvbnN0IGNvbnRhaW5lclVyaSA9IChjb25maWcgYXMgYW55KS5jb250YWluZXJVcmk7XG4gICAgICBpZiAoY29udGFpbmVyVXJpKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVDb250YWluZXJVcmkoY29udGFpbmVyVXJpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRhaW5lckNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb250YWluZXJVcmk6IGNvbnRhaW5lclVyaSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHJlcXVlc3QgaGVhZGVyIGNvbmZpZ3VyYXRpb24gZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbihyZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbj86IFJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uKTogYW55IHtcbiAgICBpZiAoIXJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uPy5hbGxvd2xpc3RlZEhlYWRlcnMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0SGVhZGVyQWxsb3dsaXN0OiByZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbi5hbGxvd2xpc3RlZEhlYWRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBsaWZlY3ljbGUgY29uZmlndXJhdGlvbiBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckxpZmVjeWNsZUNvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWRsZVJ1bnRpbWVTZXNzaW9uVGltZW91dDogdGhpcy5saWZlY3ljbGVDb25maWd1cmF0aW9uPy5pZGxlUnVudGltZVNlc3Npb25UaW1lb3V0Py50b1NlY29uZHMoKSxcbiAgICAgIG1heExpZmV0aW1lOiB0aGlzLmxpZmVjeWNsZUNvbmZpZ3VyYXRpb24/Lm1heExpZmV0aW1lPy50b1NlY29uZHMoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcmVxdWVzdCBoZWFkZXIgY29uZmlndXJhdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbihyZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbjogUmVxdWVzdEhlYWRlckNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBhbGxFcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycykge1xuICAgICAgaWYgKHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycy5sZW5ndGggPCAxIHx8IHJlcXVlc3RIZWFkZXJDb25maWd1cmF0aW9uLmFsbG93bGlzdGVkSGVhZGVycy5sZW5ndGggPiAyMCkge1xuICAgICAgICBhbGxFcnJvcnMucHVzaCgnUmVxdWVzdCBoZWFkZXIgYWxsb3cgbGlzdCBjb250YWluIGJldHdlZW4gMSBhbmQgMjAgaGVhZGVycycpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiByZXF1ZXN0SGVhZGVyQ29uZmlndXJhdGlvbi5hbGxvd2xpc3RlZEhlYWRlcnMpIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgbGVuZ3RoXG4gICAgICAgIGNvbnN0IGxlbmd0aEVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICAgIHZhbHVlOiBoZWFkZXIsXG4gICAgICAgICAgZmllbGROYW1lOiAnUmVxdWVzdCBoZWFkZXInLFxuICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgICAgfSk7XG4gICAgICAgIGFsbEVycm9ycy5wdXNoKC4uLmxlbmd0aEVycm9ycyk7XG5cbiAgICAgICAgY29uc3QgcGF0dGVybkVycm9ycyA9IHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICAgICAgICAgIGhlYWRlcixcbiAgICAgICAgICAnUmVxdWVzdCBoZWFkZXInLFxuICAgICAgICAgIC8oQXV0aG9yaXphdGlvbnxYLUFtem4tQmVkcm9jay1BZ2VudENvcmUtUnVudGltZS1DdXN0b20tW2EtekEtWjAtOS1dKykvLFxuICAgICAgICAgICdSZXF1ZXN0IGhlYWRlciBtdXN0IGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgaHlwaGVucycsXG4gICAgICAgICk7XG4gICAgICAgIGFsbEVycm9ycy5wdXNoKC4uLnBhdHRlcm5FcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYWxsRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBsaWZlY3ljbGUgY29uZmlndXJhdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVMaWZlY3ljbGVDb25maWd1cmF0aW9uKGxpZmVjeWNsZUNvbmZpZ3VyYXRpb246IExpZmVjeWNsZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAobGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5pZGxlUnVudGltZVNlc3Npb25UaW1lb3V0ICYmICFsaWZlY3ljbGVDb25maWd1cmF0aW9uLmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQuaXNVbnJlc29sdmVkKCkpIHtcbiAgICAgIGlmIChsaWZlY3ljbGVDb25maWd1cmF0aW9uLmlkbGVSdW50aW1lU2Vzc2lvblRpbWVvdXQudG9TZWNvbmRzKCkgPCBMSUZFQ1lDTEVfTUlOX1RJTUVPVVQudG9TZWNvbmRzKClcbiAgICAgICAgfHwgbGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5pZGxlUnVudGltZVNlc3Npb25UaW1lb3V0LnRvU2Vjb25kcygpID4gTElGRUNZQ0xFX01BWF9MSUZFVElNRS50b1NlY29uZHMoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBJZGxlIHJ1bnRpbWUgc2Vzc2lvbiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAke0xJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKX0gc2Vjb25kcyBhbmQgJHtMSUZFQ1lDTEVfTUFYX0xJRkVUSU1FLnRvU2Vjb25kcygpfSBzZWNvbmRzYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lICYmICFsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lLmlzVW5yZXNvbHZlZCgpKSB7XG4gICAgICBpZiAobGlmZWN5Y2xlQ29uZmlndXJhdGlvbi5tYXhMaWZldGltZS50b1NlY29uZHMoKSA8IExJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKVxuICAgICAgICB8fCBsaWZlY3ljbGVDb25maWd1cmF0aW9uLm1heExpZmV0aW1lLnRvU2Vjb25kcygpID4gTElGRUNZQ0xFX01BWF9MSUZFVElNRS50b1NlY29uZHMoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBNYXhpbXVtIGxpZmV0aW1lIG11c3QgYmUgYmV0d2VlbiAke0xJRkVDWUNMRV9NSU5fVElNRU9VVC50b1NlY29uZHMoKX0gc2Vjb25kcyBhbmQgJHtMSUZFQ1lDTEVfTUFYX0xJRkVUSU1FLnRvU2Vjb25kcygpfSBzZWNvbmRzYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcnVudGltZSBuYW1lIGZvcm1hdFxuICAgKiBQYXR0ZXJuOiBeW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJ1bnRpbWVOYW1lKCk6IHZvaWQge1xuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiB0aGUgbmFtZSBjb250YWlucyBDREsgdG9rZW5zICh1bnJlc29sdmVkIHZhbHVlcylcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMuYWdlbnRSdW50aW1lTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsZW5ndGhcbiAgICBjb25zdCBsZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgIHZhbHVlOiB0aGlzLmFnZW50UnVudGltZU5hbWUsXG4gICAgICBmaWVsZE5hbWU6ICdSdW50aW1lIG5hbWUnLFxuICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgbWF4TGVuZ3RoOiA0OCxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIHBhdHRlcm5cbiAgICBjb25zdCBwYXR0ZXJuRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICB0aGlzLmFnZW50UnVudGltZU5hbWUsXG4gICAgICAnUnVudGltZSBuYW1lJyxcbiAgICAgIC9eW2EtekEtWl1bYS16QS1aMC05X117MCw0N30kLyxcbiAgICAgICdSdW50aW1lIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzJyxcbiAgICApO1xuXG4gICAgLy8gQ29tYmluZSBhbmQgdGhyb3cgaWYgYW55IGVycm9yc1xuICAgIGNvbnN0IGFsbEVycm9ycyA9IFsuLi5sZW5ndGhFcnJvcnMsIC4uLnBhdHRlcm5FcnJvcnNdO1xuICAgIGlmIChhbGxFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihhbGxFcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIGZvcm1hdFxuICAgKiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMTIwMCBjaGFyYWN0ZXJzIChwZXIgQ2xvdWRGb3JtYXRpb24gc3BlY2lmaWNhdGlvbilcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRGVzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIHRoZSBkZXNjcmlwdGlvbiBjb250YWlucyBDREsgdG9rZW5zICh1bnJlc29sdmVkIHZhbHVlcylcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMuZGVzY3JpcHRpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZTogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgZmllbGROYW1lOiAnRGVzY3JpcHRpb24nLFxuICAgICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICAgIG1heExlbmd0aDogMTIwMCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIC0gTWF4aW11bSA1MCBlbnRyaWVzXG4gICAqIC0gS2V5OiAxLTEwMCBjaGFyYWN0ZXJzXG4gICAqIC0gVmFsdWU6IDAtMjA0OCBjaGFyYWN0ZXJzIChwZXIgQ2xvdWRGb3JtYXRpb24gc3BlY2lmaWNhdGlvbilcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKTtcblxuICAgIC8vIFZhbGlkYXRlIG51bWJlciBvZiBlbnRyaWVzICgwLTUwKVxuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDUwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVG9vIG1hbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzOiAke2VudHJpZXMubGVuZ3RofS4gTWF4aW11bSBhbGxvd2VkIGlzIDUwYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIGtleSBvciB2YWx1ZSBjb250YWlucyBDREsgdG9rZW5zXG4gICAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGtleSkgfHwgVG9rZW4uaXNVbnJlc29sdmVkKHZhbHVlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUga2V5IGxlbmd0aFxuICAgICAgY29uc3QgbGVuZ3RoRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiBrZXksXG4gICAgICAgIGZpZWxkTmFtZTogYEVudmlyb25tZW50IHZhcmlhYmxlIGtleSAnJHtrZXl9J2AsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAxMDAsXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUga2V5IHBhdHRlcm5cbiAgICAgIGNvbnN0IHBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgICAga2V5LFxuICAgICAgICBgRW52aXJvbm1lbnQgdmFyaWFibGUga2V5ICcke2tleX0nYCxcbiAgICAgICAgL15bYS16QS1aX11bYS16QS1aMC05X10qJC8sXG4gICAgICAgIGBFbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkgJyR7a2V5fScgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUgYW5kIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgdW5kZXJzY29yZXNgLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSBhbmQgdGhyb3cgaWYgYW55IGVycm9yc1xuICAgICAgY29uc3QgYWxsRXJyb3JzID0gWy4uLmxlbmd0aEVycm9ycywgLi4ucGF0dGVybkVycm9yc107XG4gICAgICBpZiAoYWxsRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihhbGxFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB2YWx1ZSBsZW5ndGggKDAtMjA0OCBjaGFyYWN0ZXJzIHBlciBDbG91ZEZvcm1hdGlvbilcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAyMDQ4KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgbGVuZ3RoIGZvciBrZXkgJyR7a2V5fSc6ICR7dmFsdWUubGVuZ3RofSBjaGFyYWN0ZXJzLiBgICtcbiAgICAgICAgICAnVmFsdWVzIG11c3Qgbm90IGV4Y2VlZCAyMDQ4IGNoYXJhY3RlcnMnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHRhZ3MgZm9ybWF0XG4gICAqIEBwYXJhbSB0YWdzIFRoZSB0YWdzIG9iamVjdCB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHRhZyBrZXkgYW5kIHZhbHVlXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiBrZXkgb3IgdmFsdWUgY29udGFpbnMgQ0RLIHRva2Vuc1xuICAgICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXkpIHx8IFRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyBrZXkgbGVuZ3RoXG4gICAgICBjb25zdCBrZXlMZW5ndGhFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgZmllbGROYW1lOiBgVGFnIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDI1NixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcga2V5IHBhdHRlcm5cbiAgICAgIGNvbnN0IGtleVBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgICAga2V5LFxuICAgICAgICBgVGFnIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgL15bYS16QS1aMC05XFxzLl86Lz0rQC1dKiQvLFxuICAgICAgICBgVGFnIGtleSBcIiR7a2V5fVwiIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycyAoYS16LCBBLVopLCBudW1iZXJzICgwLTkpLCBzcGFjZXMsIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMgKC5fOi89K0AtKWAsXG4gICAgICApO1xuXG4gICAgICAvLyBDb21iaW5lIGtleSBlcnJvcnMgYW5kIHRocm93IGlmIGFueVxuICAgICAgY29uc3Qga2V5RXJyb3JzID0gWy4uLmtleUxlbmd0aEVycm9ycywgLi4ua2V5UGF0dGVybkVycm9yc107XG4gICAgICBpZiAoa2V5RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihrZXlFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiIGNhbm5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZGApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcgdmFsdWUgbGVuZ3RoXG4gICAgICBjb25zdCB2YWx1ZUxlbmd0aEVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZTogYFRhZyB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCJgLFxuICAgICAgICBtaW5MZW5ndGg6IDAsXG4gICAgICAgIG1heExlbmd0aDogMjU2LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyB2YWx1ZSBwYXR0ZXJuXG4gICAgICBjb25zdCB2YWx1ZVBhdHRlcm5FcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGBUYWcgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiYCxcbiAgICAgICAgL15bYS16QS1aMC05XFxzLl86Lz0rQC1dKiQvLFxuICAgICAgICBgVGFnIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBjYW4gb25seSBjb250YWluIGxldHRlcnMgKGEteiwgQS1aKSwgbnVtYmVycyAoMC05KSwgc3BhY2VzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzICguXzovPStALSlgLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSB2YWx1ZSBlcnJvcnMgYW5kIHRocm93IGlmIGFueVxuICAgICAgY29uc3QgdmFsdWVFcnJvcnMgPSBbLi4udmFsdWVMZW5ndGhFcnJvcnMsIC4uLnZhbHVlUGF0dGVybkVycm9yc107XG4gICAgICBpZiAodmFsdWVFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZhbHVlRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjb250YWluZXIgVVJJIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbnRhaW5lclVyaSh1cmk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiB0aGUgVVJJIGNvbnRhaW5zIENESyB0b2tlbnMgKHVucmVzb2x2ZWQgdmFsdWVzKVxuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodXJpKSkge1xuICAgICAgLy8gQWRkIGEgd2FybmluZyB0aGF0IHZhbGlkYXRpb24gd2lsbCBiZSBza2lwcGVkIGZvciB0b2tlbi1iYXNlZCBVUklzXG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRJbmZvKFxuICAgICAgICAnQ29udGFpbmVyIFVSSSB2YWxpZGF0aW9uIHNraXBwZWQgYXMgaXQgY29udGFpbnMgdW5yZXNvbHZlZCBDREsgdG9rZW5zLiAnICtcbiAgICAgICAgJ1RoZSBVUkkgd2lsbCBiZSB2YWxpZGF0ZWQgYXQgZGVwbG95bWVudCB0aW1lLicsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdmFsaWRhdGUgaWYgdGhlIFVSSSBpcyBhIGNvbmNyZXRlIHN0cmluZyAobm90IGEgdG9rZW4pXG4gICAgY29uc3QgcGF0dGVybiA9IC9eXFxkezEyfVxcLmRrclxcLmVjclxcLihbYS16MC05LV0rKVxcLmFtYXpvbmF3c1xcLmNvbVxcLygoPzpbYS16MC05XSsoPzpbLl8tXVthLXowLTldKykqXFwvKSpbYS16MC05XSsoPzpbLl8tXVthLXowLTldKykqKShbOkBdXFxTKykkLztcbiAgICBpZiAoIXBhdHRlcm4udGVzdCh1cmkpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBjb250YWluZXIgVVJJIGZvcm1hdDogJHt1cml9LiBNdXN0IGJlIGEgdmFsaWQgRUNSIFVSSSAoZS5nLiwgMTIzNDU2Nzg5MDEyLmRrci5lY3IudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20vbXktYWdlbnQ6bGF0ZXN0KWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIElBTSByb2xlIEFSTiBmb3JtYXQgYW5kIHN0cnVjdHVyZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSb2xlQXJuKHJvbGVBcm46IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIGJhc2ljIEFSTiBmb3JtYXQgZm9yIElBTSByb2xlc1xuICAgIGNvbnN0IGFyblBhdHRlcm4gPSAvXmFybjpbYS16XFwtXSs6aWFtOjpcXGR7MTJ9OnJvbGVcXC9bYS16QS1aMC05Kz0sLkBcXC1fXFwvXSskLztcbiAgICBpZiAoIWFyblBhdHRlcm4udGVzdChyb2xlQXJuKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCBJQU0gcm9sZSBBUk4gZm9ybWF0OiAke3JvbGVBcm59LiBgICtcbiAgJ0V4cGVjdGVkIGZvcm1hdDogYXJuOjxwYXJ0aXRpb24+OmlhbTo6PGFjY291bnQtaWQ+OnJvbGUvPHJvbGUtbmFtZT4gb3IgYXJuOjxwYXJ0aXRpb24+OmlhbTo6PGFjY291bnQtaWQ+OnJvbGUvPHBhdGg+Lzxyb2xlLW5hbWU+Jyk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgdGhlIEFSTiBjb21wb25lbnRzIHVzaW5nIENESydzIEFybi5zcGxpdCgpXG4gICAgLy8gVXNlIFNMQVNIX1JFU09VUkNFX05BTUUgZm9ybWF0IGZvciBJQU0gcm9sZXMgKHdoaWNoIHVzZSBmb3JtYXQ6IHJvbGUvcm9sZS1uYW1lIG9yIHJvbGUvcGF0aC90by9yb2xlLW5hbWUpXG4gICAgY29uc3QgYXJuQ29tcG9uZW50cyA9IEFybi5zcGxpdChyb2xlQXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSk7XG5cbiAgICBpZiAoYXJuQ29tcG9uZW50cy5zZXJ2aWNlICE9PSAnaWFtJykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCBzZXJ2aWNlIGluIEFSTjogJHthcm5Db21wb25lbnRzLnNlcnZpY2V9LiBFeHBlY3RlZCAnaWFtJyBmb3IgSUFNIHJvbGUgQVJOLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY291bnRJZCA9IGFybkNvbXBvbmVudHMuYWNjb3VudDtcbiAgICBpZiAoIWFjY291bnRJZCB8fCAhL15cXGR7MTJ9JC8udGVzdChhY2NvdW50SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIEFXUyBhY2NvdW50IElEIGluIHJvbGUgQVJOOiAke2FjY291bnRJZH0uIE11c3QgYmUgYSAxMi1kaWdpdCBudW1iZXIuYCk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCByb2xlIG5hbWUgZnJvbSByZXNvdXJjZVxuICAgIC8vIEZvciBJQU0gcm9sZXMsIHJlc291cmNlIHdpbGwgYmUgXCJyb2xlXCIgYW5kIHJlc291cmNlTmFtZSB3aWxsIGJlIHRoZSByb2xlIG5hbWUgKHdpdGggb3B0aW9uYWwgcGF0aClcbiAgICBjb25zdCByZXNvdXJjZSA9IGFybkNvbXBvbmVudHMucmVzb3VyY2U7XG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gYXJuQ29tcG9uZW50cy5yZXNvdXJjZU5hbWU7XG5cbiAgICBpZiAocmVzb3VyY2UgIT09ICdyb2xlJykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCByZXNvdXJjZSB0eXBlIGluIEFSTjogJHtyZXNvdXJjZX0uIEV4cGVjdGVkICdyb2xlJyBmb3IgSUFNIHJvbGUgQVJOLmApO1xuICAgIH1cblxuICAgIGlmICghcmVzb3VyY2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdSb2xlIG5hbWUgaXMgbWlzc2luZyBpbiB0aGUgQVJOJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJvbGVQYXRoUGFydHMgPSByZXNvdXJjZU5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHJvbGVOYW1lID0gcm9sZVBhdGhQYXJ0c1tyb2xlUGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAocm9sZU5hbWUubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgUm9sZSBuYW1lIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgNjQgY2hhcmFjdGVyczogJHtyb2xlTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdGFja0FjY291bnQgPSBTdGFjay5vZih0aGlzKS5hY2NvdW50O1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHN0YWNrQWNjb3VudCkgJiYgYWNjb3VudElkICE9PSBzdGFja0FjY291bnQpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoXG4gICAgICAgIGBJQU0gcm9sZSBpcyBmcm9tIGEgZGlmZmVyZW50IGFjY291bnQgKCR7YWNjb3VudElkfSkgdGhhbiB0aGUgc3RhY2sgYWNjb3VudCAoJHtzdGFja0FjY291bnR9KS4gYCArXG4gICAgICAgICdFbnN1cmUgY3Jvc3MtYWNjb3VudCBwZXJtaXNzaW9ucyBhcmUgcHJvcGVybHkgY29uZmlndXJlZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVnaW9uIChJQU0gaXMgZ2xvYmFsLCBzbyByZWdpb24gc2hvdWxkIGJlIGVtcHR5KVxuICAgIGNvbnN0IHJlZ2lvbiA9IGFybkNvbXBvbmVudHMucmVnaW9uO1xuICAgIGNvbnN0IHN0YWNrUmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSAnJyAmJiByZWdpb24gIT09IHN0YWNrUmVnaW9uICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2tSZWdpb24pKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBgSUFNIHJvbGUgQVJOIGNvbnRhaW5zIGEgcmVnaW9uICgke3JlZ2lvbn0pIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUgc3RhY2sgcmVnaW9uICgke3N0YWNrUmVnaW9ufSkuIGAgK1xuICAgICAgICAnSUFNIGlzIGEgZ2xvYmFsIHNlcnZpY2UsIHNvIHRoaXMgbWlnaHQgYmUgaW50ZW50aW9uYWwuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBlbmRwb2ludCB0byB0aGlzIHJ1bnRpbWVcbiAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBSdW50aW1lRW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVudGltZVxuICAgKlxuICAgKiBAcGFyYW0gZW5kcG9pbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgZW5kcG9pbnRcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgUnVudGltZUVuZHBvaW50XG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkRW5kcG9pbnQoXG4gICAgZW5kcG9pbnROYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEFkZEVuZHBvaW50T3B0aW9ucyxcbiAgKTogUnVudGltZUVuZHBvaW50IHtcbiAgICAvLyBDcmVhdGUgdGhlIGVuZHBvaW50IChzZWN1cml0eSBjb25maWd1cmF0aW9uIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpXG4gICAgY29uc3QgZW5kcG9pbnQgPSBuZXcgUnVudGltZUVuZHBvaW50KHRoaXMsIGBFbmRwb2ludCR7ZW5kcG9pbnROYW1lfWAsIHtcbiAgICAgIGVuZHBvaW50TmFtZTogZW5kcG9pbnROYW1lLFxuICAgICAgYWdlbnRSdW50aW1lSWQ6IHRoaXMuYWdlbnRSdW50aW1lSWQsXG4gICAgICBhZ2VudFJ1bnRpbWVWZXJzaW9uOiBvcHRpb25zPy52ZXJzaW9uID8/IHRoaXMuYWdlbnRSdW50aW1lVmVyc2lvbiA/PyAnMScsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucz8uZGVzY3JpcHRpb24sXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgZGVwZW5kZW5jeTogZW5kcG9pbnQgbXVzdCB3YWl0IGZvciBydW50aW1lIHRvIGJlIGNyZWF0ZWRcbiAgICBlbmRwb2ludC5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5ydW50aW1lUmVzb3VyY2UpO1xuXG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG59XG4iXX0=
|