@aws-cdk/aws-bedrock-agentcore-alpha 2.221.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.
Files changed (43) hide show
  1. package/.eslintrc.js +4 -0
  2. package/.jsii +12000 -0
  3. package/.jsii.tabl.json.gz +0 -0
  4. package/.warnings.jsii.js +183 -0
  5. package/LICENSE +201 -0
  6. package/NOTICE +2 -0
  7. package/README.md +796 -0
  8. package/agentcore/index.d.ts +11 -0
  9. package/agentcore/index.js +36 -0
  10. package/agentcore/network/network-configuration.d.ts +152 -0
  11. package/agentcore/network/network-configuration.js +234 -0
  12. package/agentcore/runtime/perms.d.ts +67 -0
  13. package/agentcore/runtime/perms.js +101 -0
  14. package/agentcore/runtime/runtime-artifact.d.ts +42 -0
  15. package/agentcore/runtime/runtime-artifact.js +90 -0
  16. package/agentcore/runtime/runtime-authorizer-configuration.d.ts +62 -0
  17. package/agentcore/runtime/runtime-authorizer-configuration.js +165 -0
  18. package/agentcore/runtime/runtime-base.d.ts +309 -0
  19. package/agentcore/runtime/runtime-base.js +207 -0
  20. package/agentcore/runtime/runtime-endpoint-base.d.ts +130 -0
  21. package/agentcore/runtime/runtime-endpoint-base.js +31 -0
  22. package/agentcore/runtime/runtime-endpoint.d.ts +182 -0
  23. package/agentcore/runtime/runtime-endpoint.js +372 -0
  24. package/agentcore/runtime/runtime.d.ts +230 -0
  25. package/agentcore/runtime/runtime.js +590 -0
  26. package/agentcore/runtime/types.d.ts +16 -0
  27. package/agentcore/runtime/types.js +21 -0
  28. package/agentcore/runtime/validation-helpers.d.ts +37 -0
  29. package/agentcore/runtime/validation-helpers.js +85 -0
  30. package/agentcore/tools/browser.d.ts +519 -0
  31. package/agentcore/tools/browser.js +641 -0
  32. package/agentcore/tools/code-interpreter.d.ts +447 -0
  33. package/agentcore/tools/code-interpreter.js +553 -0
  34. package/agentcore/tools/perms.d.ts +74 -0
  35. package/agentcore/tools/perms.js +122 -0
  36. package/agentcore/tools/validation-helpers.d.ts +37 -0
  37. package/agentcore/tools/validation-helpers.js +85 -0
  38. package/jest.config.js +2 -0
  39. package/lib/index.d.ts +1 -0
  40. package/lib/index.js +22 -0
  41. package/package.json +122 -0
  42. package/rosetta/_generated.ts-fixture +6 -0
  43. package/rosetta/default.ts-fixture +19 -0
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5
+ * with the License. A copy of the License is located at
6
+ *
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
10
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
11
+ * and limitations under the License.
12
+ */
13
+ import { IResource, Resource } from 'aws-cdk-lib';
14
+ import { DimensionsMap, Metric, MetricOptions } from 'aws-cdk-lib/aws-cloudwatch';
15
+ import * as ec2 from 'aws-cdk-lib/aws-ec2';
16
+ import * as iam from 'aws-cdk-lib/aws-iam';
17
+ import { Construct } from 'constructs';
18
+ /******************************************************************************
19
+ * Interface
20
+ *****************************************************************************/
21
+ /**
22
+ * Interface for Agent Runtime resources
23
+ */
24
+ export interface IBedrockAgentRuntime extends IResource, iam.IGrantable, ec2.IConnectable {
25
+ /**
26
+ * The ARN of the agent runtime resource
27
+ * - Format `arn:${Partition}:bedrock-agentcore:${Region}:${Account}:runtime/${RuntimeId}`
28
+ *
29
+ * @attribute
30
+ * @example "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/runtime-abc123"
31
+ */
32
+ readonly agentRuntimeArn: string;
33
+ /**
34
+ * The ID of the agent runtime
35
+ * @attribute
36
+ * @example "runtime-abc123"
37
+ */
38
+ readonly agentRuntimeId: string;
39
+ /**
40
+ * The name of the agent runtime
41
+ */
42
+ readonly agentRuntimeName: string;
43
+ /**
44
+ * The IAM role that provides permissions for the agent runtime
45
+ *
46
+ */
47
+ readonly role: iam.IRole;
48
+ /**
49
+ * The version of the agent runtime
50
+ * @attribute
51
+ */
52
+ readonly agentRuntimeVersion?: string;
53
+ /**
54
+ * The current status of the agent runtime
55
+ */
56
+ readonly agentStatus?: string;
57
+ /**
58
+ * The time at which the runtime was created
59
+ * @attribute
60
+ * @example "2024-01-15T10:30:00Z"
61
+ */
62
+ readonly createdAt?: string;
63
+ /**
64
+ * The time at which the runtime was last updated
65
+ * @attribute
66
+ * @example "2024-01-15T14:45:00Z"
67
+ */
68
+ readonly lastUpdatedAt?: string;
69
+ /**
70
+ * Return the given named metric for this agent runtime.
71
+ */
72
+ metric(metricName: string, dimensions: DimensionsMap, props?: MetricOptions): Metric;
73
+ /**
74
+ * Return a metric containing the total number of invocations for this agent runtime.
75
+ */
76
+ metricInvocations(props?: MetricOptions): Metric;
77
+ /**
78
+ * Return a metric containing the total number of invocations across all resources.
79
+ */
80
+ metricInvocationsAggregated(props?: MetricOptions): Metric;
81
+ /**
82
+ * Return a metric containing the number of throttled requests for this agent runtime.
83
+ */
84
+ metricThrottles(props?: MetricOptions): Metric;
85
+ /**
86
+ * Return a metric containing the number of system errors for this agent runtime.
87
+ */
88
+ metricSystemErrors(props?: MetricOptions): Metric;
89
+ /**
90
+ * Return a metric containing the number of user errors for this agent runtime.
91
+ */
92
+ metricUserErrors(props?: MetricOptions): Metric;
93
+ /**
94
+ * Return a metric measuring the latency of requests for this agent runtime.
95
+ */
96
+ metricLatency(props?: MetricOptions): Metric;
97
+ /**
98
+ * Return a metric containing the total number of errors (system + user) for this agent runtime.
99
+ */
100
+ metricTotalErrors(props?: MetricOptions): Metric;
101
+ /**
102
+ * Return a metric containing the number of agent sessions for this agent runtime.
103
+ */
104
+ metricSessionCount(props?: MetricOptions): Metric;
105
+ /**
106
+ * Return a metric containing the total number of sessions across all resources.
107
+ */
108
+ metricSessionsAggregated(props?: MetricOptions): Metric;
109
+ /**
110
+ * Grant the runtime specific actions on AWS resources
111
+ *
112
+ * @param actions The actions to grant
113
+ * @param resources The resource ARNs to grant access to
114
+ * @returns The Grant object for chaining
115
+ */
116
+ grant(actions: string[], resources: string[]): iam.Grant;
117
+ /**
118
+ * Adds a policy statement to the runtime's execution role
119
+ *
120
+ * @param statement The IAM policy statement to add
121
+ * @returns The runtime instance for chaining
122
+ */
123
+ addToRolePolicy(statement: iam.PolicyStatement): IBedrockAgentRuntime;
124
+ /**
125
+ * Permits an IAM principal to invoke this runtime
126
+ * Grants the bedrock-agentcore:InvokeAgentRuntime permission
127
+ * @param grantee The principal to grant access to
128
+ */
129
+ grantInvokeRuntime(grantee: iam.IGrantable): iam.Grant;
130
+ /**
131
+ * Permits an IAM principal to invoke this runtime on behalf of a user
132
+ * Grants the bedrock-agentcore:InvokeAgentRuntimeForUser permission
133
+ * Required when using the X-Amzn-Bedrock-AgentCore-Runtime-User-Id header
134
+ * @param grantee The principal to grant access to
135
+ */
136
+ grantInvokeRuntimeForUser(grantee: iam.IGrantable): iam.Grant;
137
+ /**
138
+ * Permits an IAM principal to invoke this runtime both directly and on behalf of users
139
+ * Grants both bedrock-agentcore:InvokeAgentRuntime and bedrock-agentcore:InvokeAgentRuntimeForUser permissions
140
+ * @param grantee The principal to grant access to
141
+ */
142
+ grantInvoke(grantee: iam.IGrantable): iam.Grant;
143
+ }
144
+ /******************************************************************************
145
+ * Base Class
146
+ *****************************************************************************/
147
+ /**
148
+ * Base class for Agent Runtime
149
+ */
150
+ export declare abstract class RuntimeBase extends Resource implements IBedrockAgentRuntime {
151
+ abstract readonly agentRuntimeArn: string;
152
+ abstract readonly agentRuntimeId: string;
153
+ abstract readonly agentRuntimeName: string;
154
+ abstract readonly role: iam.IRole;
155
+ abstract readonly agentRuntimeVersion?: string;
156
+ abstract readonly agentStatus?: string;
157
+ abstract readonly createdAt?: string;
158
+ abstract readonly lastUpdatedAt?: string;
159
+ abstract readonly grantPrincipal: iam.IPrincipal;
160
+ /**
161
+ * An accessor for the Connections object that will fail if this Runtime does not have a VPC
162
+ * configured.
163
+ */
164
+ get connections(): ec2.Connections;
165
+ /**
166
+ * The actual Connections object for this Runtime. This may be unset in the event that a VPC has not
167
+ * been configured.
168
+ * @internal
169
+ */
170
+ protected _connections: ec2.Connections | undefined;
171
+ constructor(scope: Construct, id: string);
172
+ /**
173
+ * Grant the runtime specific actions on AWS resources
174
+ *
175
+ * @param actions The actions to grant
176
+ * @param resources The resource ARNs to grant access to
177
+ * @returns The Grant object for chaining
178
+ */
179
+ grant(actions: string[], resources: string[]): iam.Grant;
180
+ /**
181
+ * Adds a policy statement to the runtime's execution role
182
+ *
183
+ * @param statement The IAM policy statement to add
184
+ * @returns The runtime instance for chaining
185
+ */
186
+ addToRolePolicy(statement: iam.PolicyStatement): IBedrockAgentRuntime;
187
+ /**
188
+ * Permits an IAM principal to invoke this runtime
189
+ * Grants the bedrock-agentcore:InvokeAgentRuntime permission
190
+ * @param grantee The principal to grant access to
191
+ */
192
+ grantInvokeRuntime(grantee: iam.IGrantable): iam.Grant;
193
+ /**
194
+ * Permits an IAM principal to invoke this runtime on behalf of a user
195
+ * Grants the bedrock-agentcore:InvokeAgentRuntimeForUser permission
196
+ * Required when using the X-Amzn-Bedrock-AgentCore-Runtime-User-Id header
197
+ * @param grantee The principal to grant access to
198
+ */
199
+ grantInvokeRuntimeForUser(grantee: iam.IGrantable): iam.Grant;
200
+ /**
201
+ * Permits an IAM principal to invoke this runtime both directly and on behalf of users
202
+ * Grants both bedrock-agentcore:InvokeAgentRuntime and bedrock-agentcore:InvokeAgentRuntimeForUser permissions
203
+ * @param grantee The principal to grant access to
204
+ */
205
+ grantInvoke(grantee: iam.IGrantable): iam.Grant;
206
+ /**
207
+ * Return the given named metric for this agent runtime.
208
+ *
209
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
210
+ * You can customize this by using the `statistic` and `period` properties.
211
+ */
212
+ metric(metricName: string, dimensions: DimensionsMap, props?: MetricOptions): Metric;
213
+ /**
214
+ * Return a metric containing the total number of invocations for this agent runtime.
215
+ */
216
+ metricInvocations(props?: MetricOptions): Metric;
217
+ /**
218
+ * Return a metric containing the total number of invocations across all resources.
219
+ */
220
+ metricInvocationsAggregated(props?: MetricOptions): Metric;
221
+ /**
222
+ * Return a metric containing the number of throttled requests for this agent runtime.
223
+ */
224
+ metricThrottles(props?: MetricOptions): Metric;
225
+ /**
226
+ * Return a metric containing the number of system errors for this agent runtime.
227
+ */
228
+ metricSystemErrors(props?: MetricOptions): Metric;
229
+ /**
230
+ * Return a metric containing the number of user errors for this agent runtime.
231
+ */
232
+ metricUserErrors(props?: MetricOptions): Metric;
233
+ /**
234
+ * Return a metric measuring the latency of requests for this agent runtime.
235
+ *
236
+ * The latency metric represents the total time elapsed between receiving the request
237
+ * and sending the final response token, representing complete end-to-end processing time.
238
+ */
239
+ metricLatency(props?: MetricOptions): Metric;
240
+ /**
241
+ * Return a metric containing the total number of errors (system + user) for this agent runtime.
242
+ */
243
+ metricTotalErrors(props?: MetricOptions): Metric;
244
+ /**
245
+ * Return a metric containing the number of agent sessions for this agent runtime.
246
+ */
247
+ metricSessionCount(props?: MetricOptions): Metric;
248
+ /**
249
+ * Return a metric containing the total number of sessions across all resources.
250
+ */
251
+ metricSessionsAggregated(props?: MetricOptions): Metric;
252
+ /**
253
+ * Internal method to create a metric.
254
+ */
255
+ private configureMetric;
256
+ }
257
+ /**
258
+ * Attributes for importing an existing Agent Runtime
259
+ */
260
+ export interface AgentRuntimeAttributes {
261
+ /**
262
+ * The ARN of the agent runtime
263
+ */
264
+ readonly agentRuntimeArn: string;
265
+ /**
266
+ * The ID of the agent runtime
267
+ */
268
+ readonly agentRuntimeId: string;
269
+ /**
270
+ * The name of the agent runtime
271
+ */
272
+ readonly agentRuntimeName: string;
273
+ /**
274
+ * The IAM role ARN
275
+ */
276
+ readonly roleArn: string;
277
+ /**
278
+ * The version of the agent runtime
279
+ * When importing a runtime and this is not specified or undefined, endpoints created on this runtime
280
+ * will point to version "1" unless explicitly overridden.
281
+ * @default - undefined
282
+ */
283
+ readonly agentRuntimeVersion?: string;
284
+ /**
285
+ * The description of the agent runtime
286
+ * @default - No description
287
+ */
288
+ readonly description?: string;
289
+ /**
290
+ * The security groups for this runtime, if in a VPC.
291
+ * @default - By default, the runtime is not in a VPC.
292
+ */
293
+ readonly securityGroups?: ec2.ISecurityGroup[];
294
+ /**
295
+ * The current status of the agent runtime
296
+ * @default - Status not available
297
+ */
298
+ readonly agentStatus?: string;
299
+ /**
300
+ * The time at which the runtime was created
301
+ * @default - Creation time not available
302
+ */
303
+ readonly createdAt?: string;
304
+ /**
305
+ * The time at which the runtime was last updated
306
+ * @default - Last update time not available
307
+ */
308
+ readonly lastUpdatedAt?: string;
309
+ }
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RuntimeBase = void 0;
4
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ /**
6
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
9
+ * with the License. A copy of the License is located at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
14
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
15
+ * and limitations under the License.
16
+ */
17
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
18
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
19
+ const iam = require("aws-cdk-lib/aws-iam");
20
+ const perms_1 = require("./perms");
21
+ const validation_helpers_1 = require("./validation-helpers");
22
+ /******************************************************************************
23
+ * Base Class
24
+ *****************************************************************************/
25
+ /**
26
+ * Base class for Agent Runtime
27
+ */
28
+ class RuntimeBase extends aws_cdk_lib_1.Resource {
29
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.RuntimeBase", version: "2.221.0-alpha.0" };
30
+ /**
31
+ * An accessor for the Connections object that will fail if this Runtime does not have a VPC
32
+ * configured.
33
+ */
34
+ get connections() {
35
+ if (!this._connections) {
36
+ throw new validation_helpers_1.ValidationError('Cannot manage network access without configuring a VPC');
37
+ }
38
+ return this._connections;
39
+ }
40
+ /**
41
+ * The actual Connections object for this Runtime. This may be unset in the event that a VPC has not
42
+ * been configured.
43
+ * @internal
44
+ */
45
+ _connections;
46
+ constructor(scope, id) {
47
+ super(scope, id);
48
+ }
49
+ /**
50
+ * Grant the runtime specific actions on AWS resources
51
+ *
52
+ * @param actions The actions to grant
53
+ * @param resources The resource ARNs to grant access to
54
+ * @returns The Grant object for chaining
55
+ */
56
+ grant(actions, resources) {
57
+ return iam.Grant.addToPrincipal({
58
+ grantee: this.role,
59
+ actions,
60
+ resourceArns: resources,
61
+ });
62
+ }
63
+ /**
64
+ * Adds a policy statement to the runtime's execution role
65
+ *
66
+ * @param statement The IAM policy statement to add
67
+ * @returns The runtime instance for chaining
68
+ */
69
+ addToRolePolicy(statement) {
70
+ // Check if role is a concrete Role instance
71
+ if (this.role instanceof iam.Role) {
72
+ this.role.addToPolicy(statement);
73
+ }
74
+ else {
75
+ // For imported roles (IRole), we need to attach via a new policy
76
+ const policy = new iam.Policy(this, `CustomPolicy${Date.now()}`, {
77
+ statements: [statement],
78
+ });
79
+ this.role.attachInlinePolicy(policy);
80
+ }
81
+ return this;
82
+ }
83
+ /**
84
+ * Permits an IAM principal to invoke this runtime
85
+ * Grants the bedrock-agentcore:InvokeAgentRuntime permission
86
+ * @param grantee The principal to grant access to
87
+ */
88
+ grantInvokeRuntime(grantee) {
89
+ return iam.Grant.addToPrincipal({
90
+ grantee,
91
+ actions: perms_1.RUNTIME_INVOKE_PERMS,
92
+ resourceArns: [this.agentRuntimeArn],
93
+ });
94
+ }
95
+ /**
96
+ * Permits an IAM principal to invoke this runtime on behalf of a user
97
+ * Grants the bedrock-agentcore:InvokeAgentRuntimeForUser permission
98
+ * Required when using the X-Amzn-Bedrock-AgentCore-Runtime-User-Id header
99
+ * @param grantee The principal to grant access to
100
+ */
101
+ grantInvokeRuntimeForUser(grantee) {
102
+ return iam.Grant.addToPrincipal({
103
+ grantee,
104
+ actions: perms_1.RUNTIME_INVOKE_USER_PERMS,
105
+ resourceArns: [this.agentRuntimeArn],
106
+ });
107
+ }
108
+ /**
109
+ * Permits an IAM principal to invoke this runtime both directly and on behalf of users
110
+ * Grants both bedrock-agentcore:InvokeAgentRuntime and bedrock-agentcore:InvokeAgentRuntimeForUser permissions
111
+ * @param grantee The principal to grant access to
112
+ */
113
+ grantInvoke(grantee) {
114
+ return iam.Grant.addToPrincipal({
115
+ grantee,
116
+ actions: [...perms_1.RUNTIME_INVOKE_PERMS, ...perms_1.RUNTIME_INVOKE_USER_PERMS],
117
+ resourceArns: [this.agentRuntimeArn],
118
+ });
119
+ }
120
+ // ------------------------------------------------------
121
+ // Metrics
122
+ // ------------------------------------------------------
123
+ /**
124
+ * Return the given named metric for this agent runtime.
125
+ *
126
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
127
+ * You can customize this by using the `statistic` and `period` properties.
128
+ */
129
+ metric(metricName, dimensions, props) {
130
+ const metricProps = {
131
+ namespace: 'AWS/Bedrock-AgentCore',
132
+ metricName,
133
+ dimensionsMap: { ...dimensions, Resource: this.agentRuntimeArn },
134
+ ...props,
135
+ };
136
+ return this.configureMetric(metricProps);
137
+ }
138
+ /**
139
+ * Return a metric containing the total number of invocations for this agent runtime.
140
+ */
141
+ metricInvocations(props) {
142
+ return this.metric('Invocations', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
143
+ }
144
+ /**
145
+ * Return a metric containing the total number of invocations across all resources.
146
+ */
147
+ metricInvocationsAggregated(props) {
148
+ return this.metric('Invocations', { Resource: 'All' }, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
149
+ }
150
+ /**
151
+ * Return a metric containing the number of throttled requests for this agent runtime.
152
+ */
153
+ metricThrottles(props) {
154
+ return this.metric('Throttles', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
155
+ }
156
+ /**
157
+ * Return a metric containing the number of system errors for this agent runtime.
158
+ */
159
+ metricSystemErrors(props) {
160
+ return this.metric('SystemErrors', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
161
+ }
162
+ /**
163
+ * Return a metric containing the number of user errors for this agent runtime.
164
+ */
165
+ metricUserErrors(props) {
166
+ return this.metric('UserErrors', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
167
+ }
168
+ /**
169
+ * Return a metric measuring the latency of requests for this agent runtime.
170
+ *
171
+ * The latency metric represents the total time elapsed between receiving the request
172
+ * and sending the final response token, representing complete end-to-end processing time.
173
+ */
174
+ metricLatency(props) {
175
+ return this.metric('Latency', {}, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
176
+ }
177
+ /**
178
+ * Return a metric containing the total number of errors (system + user) for this agent runtime.
179
+ */
180
+ metricTotalErrors(props) {
181
+ return this.metric('TotalErrors', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
182
+ }
183
+ /**
184
+ * Return a metric containing the number of agent sessions for this agent runtime.
185
+ */
186
+ metricSessionCount(props) {
187
+ return this.metric('SessionCount', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
188
+ }
189
+ /**
190
+ * Return a metric containing the total number of sessions across all resources.
191
+ */
192
+ metricSessionsAggregated(props) {
193
+ return this.metric('Sessions', { Resource: 'All' }, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
194
+ }
195
+ /**
196
+ * Internal method to create a metric.
197
+ */
198
+ configureMetric(props) {
199
+ return new aws_cloudwatch_1.Metric({
200
+ ...props,
201
+ region: props?.region ?? this.stack.region,
202
+ account: props?.account ?? this.stack.account,
203
+ });
204
+ }
205
+ }
206
+ exports.RuntimeBase = RuntimeBase;
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicnVudGltZS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILDZDQUFrRDtBQUNsRCwrREFNb0M7QUFFcEMsMkNBQTJDO0FBRTNDLG1DQUEwRTtBQUMxRSw2REFBdUQ7QUErSnZEOzsrRUFFK0U7QUFFL0U7O0dBRUc7QUFDSCxNQUFzQixXQUFZLFNBQVEsc0JBQVE7O0lBWWhEOzs7T0FHRztJQUNILElBQVcsV0FBVztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxvQ0FBZSxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztLQUMxQjtJQUVEOzs7O09BSUc7SUFDTyxZQUFZLENBQThCO0lBRXBELFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDbEI7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsT0FBaUIsRUFBRSxTQUFtQjtRQUNqRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNsQixPQUFPO1lBQ1AsWUFBWSxFQUFFLFNBQVM7U0FDeEIsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7Ozs7T0FLRztJQUNJLGVBQWUsQ0FBQyxTQUE4QjtRQUNuRCw0Q0FBNEM7UUFDNUMsSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLGlFQUFpRTtZQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLEdB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ICogIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IElSZXNvdXJjZSwgUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBEaW1lbnNpb25zTWFwLFxuICBNZXRyaWMsXG4gIE1ldHJpY09wdGlvbnMsXG4gIE1ldHJpY1Byb3BzLFxuICBTdGF0cyxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSVU5USU1FX0lOVk9LRV9QRVJNUywgUlVOVElNRV9JTlZPS0VfVVNFUl9QRVJNUyB9IGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBBZ2VudCBSdW50aW1lIHJlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElCZWRyb2NrQWdlbnRSdW50aW1lIGV4dGVuZHMgSVJlc291cmNlLCBpYW0uSUdyYW50YWJsZSwgZWMyLklDb25uZWN0YWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhZ2VudCBydW50aW1lIHJlc291cmNlXG4gICAqIC0gRm9ybWF0IGBhcm46JHtQYXJ0aXRpb259OmJlZHJvY2stYWdlbnRjb3JlOiR7UmVnaW9ufToke0FjY291bnR9OnJ1bnRpbWUvJHtSdW50aW1lSWR9YFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqIEBleGFtcGxlIFwiYXJuOmF3czpiZWRyb2NrLWFnZW50Y29yZTp1cy13ZXN0LTI6MTIzNDU2Nzg5MDEyOnJ1bnRpbWUvcnVudGltZS1hYmMxMjNcIlxuICAgKi9cbiAgcmVhZG9ubHkgYWdlbnRSdW50aW1lQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAYXR0cmlidXRlXG4gICAqIEBleGFtcGxlIFwicnVudGltZS1hYmMxMjNcIlxuICAgKi9cbiAgcmVhZG9ubHkgYWdlbnRSdW50aW1lSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFnZW50IHJ1bnRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGFnZW50UnVudGltZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBhZ2VudCBydW50aW1lXG4gICAqXG4gICAqL1xuICByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGFnZW50UnVudGltZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcmVhZG9ubHkgYWdlbnRTdGF0dXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBydW50aW1lIHdhcyBjcmVhdGVkXG4gICAqIEBhdHRyaWJ1dGVcbiAgICogQGV4YW1wbGUgXCIyMDI0LTAxLTE1VDEwOjMwOjAwWlwiXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBydW50aW1lIHdhcyBsYXN0IHVwZGF0ZWRcbiAgICogQGF0dHJpYnV0ZVxuICAgKiBAZXhhbXBsZSBcIjIwMjQtMDEtMTVUMTQ6NDU6MDBaXCJcbiAgICovXG4gIHJlYWRvbmx5IGxhc3RVcGRhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE1ldHJpY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKi9cbiAgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgZGltZW5zaW9uczogRGltZW5zaW9uc01hcCwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIGludm9jYXRpb25zIGZvciB0aGlzIGFnZW50IHJ1bnRpbWUuXG4gICAqL1xuICBtZXRyaWNJbnZvY2F0aW9ucyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgaW52b2NhdGlvbnMgYWNyb3NzIGFsbCByZXNvdXJjZXMuXG4gICAqL1xuICBtZXRyaWNJbnZvY2F0aW9uc0FnZ3JlZ2F0ZWQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHRocm90dGxlZCByZXF1ZXN0cyBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKi9cbiAgbWV0cmljVGhyb3R0bGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzeXN0ZW0gZXJyb3JzIGZvciB0aGlzIGFnZW50IHJ1bnRpbWUuXG4gICAqL1xuICBtZXRyaWNTeXN0ZW1FcnJvcnMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHVzZXIgZXJyb3JzIGZvciB0aGlzIGFnZW50IHJ1bnRpbWUuXG4gICAqL1xuICBtZXRyaWNVc2VyRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgbGF0ZW5jeSBvZiByZXF1ZXN0cyBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKi9cbiAgbWV0cmljTGF0ZW5jeShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgZXJyb3JzIChzeXN0ZW0gKyB1c2VyKSBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKi9cbiAgbWV0cmljVG90YWxFcnJvcnMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGFnZW50IHNlc3Npb25zIGZvciB0aGlzIGFnZW50IHJ1bnRpbWUuXG4gICAqL1xuICBtZXRyaWNTZXNzaW9uQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGFjcm9zcyBhbGwgcmVzb3VyY2VzLlxuICAgKi9cbiAgbWV0cmljU2Vzc2lvbnNBZ2dyZWdhdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gR3JhbnQgTWV0aG9kc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogR3JhbnQgdGhlIHJ1bnRpbWUgc3BlY2lmaWMgYWN0aW9ucyBvbiBBV1MgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb25zIFRoZSBhY3Rpb25zIHRvIGdyYW50XG4gICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIHJlc291cmNlIEFSTnMgdG8gZ3JhbnQgYWNjZXNzIHRvXG4gICAqIEByZXR1cm5zIFRoZSBHcmFudCBvYmplY3QgZm9yIGNoYWluaW5nXG4gICAqL1xuICBncmFudChhY3Rpb25zOiBzdHJpbmdbXSwgcmVzb3VyY2VzOiBzdHJpbmdbXSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogQWRkcyBhIHBvbGljeSBzdGF0ZW1lbnQgdG8gdGhlIHJ1bnRpbWUncyBleGVjdXRpb24gcm9sZVxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IFRoZSBJQU0gcG9saWN5IHN0YXRlbWVudCB0byBhZGRcbiAgICogQHJldHVybnMgVGhlIHJ1bnRpbWUgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50KTogSUJlZHJvY2tBZ2VudFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFBlcm1pdHMgYW4gSUFNIHByaW5jaXBhbCB0byBpbnZva2UgdGhpcyBydW50aW1lXG4gICAqIEdyYW50cyB0aGUgYmVkcm9jay1hZ2VudGNvcmU6SW52b2tlQWdlbnRSdW50aW1lIHBlcm1pc3Npb25cbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCBhY2Nlc3MgdG9cbiAgICovXG4gIGdyYW50SW52b2tlUnVudGltZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIHRvIGludm9rZSB0aGlzIHJ1bnRpbWUgb24gYmVoYWxmIG9mIGEgdXNlclxuICAgKiBHcmFudHMgdGhlIGJlZHJvY2stYWdlbnRjb3JlOkludm9rZUFnZW50UnVudGltZUZvclVzZXIgcGVybWlzc2lvblxuICAgKiBSZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBYLUFtem4tQmVkcm9jay1BZ2VudENvcmUtUnVudGltZS1Vc2VyLUlkIGhlYWRlclxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgZ3JhbnRJbnZva2VSdW50aW1lRm9yVXNlcihncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIHRvIGludm9rZSB0aGlzIHJ1bnRpbWUgYm90aCBkaXJlY3RseSBhbmQgb24gYmVoYWxmIG9mIHVzZXJzXG4gICAqIEdyYW50cyBib3RoIGJlZHJvY2stYWdlbnRjb3JlOkludm9rZUFnZW50UnVudGltZSBhbmQgYmVkcm9jay1hZ2VudGNvcmU6SW52b2tlQWdlbnRSdW50aW1lRm9yVXNlciBwZXJtaXNzaW9uc1xuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlIENsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQWdlbnQgUnVudGltZVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUnVudGltZUJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElCZWRyb2NrQWdlbnRSdW50aW1lIHtcbiAgLy8gQWJzdHJhY3QgcHJvcGVydGllc1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYWdlbnRSdW50aW1lQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBhZ2VudFJ1bnRpbWVJZDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYWdlbnRSdW50aW1lTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYWdlbnRSdW50aW1lVmVyc2lvbj86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGFnZW50U3RhdHVzPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogQW4gYWNjZXNzb3IgZm9yIHRoZSBDb25uZWN0aW9ucyBvYmplY3QgdGhhdCB3aWxsIGZhaWwgaWYgdGhpcyBSdW50aW1lIGRvZXMgbm90IGhhdmUgYSBWUENcbiAgICogY29uZmlndXJlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbnMoKTogZWMyLkNvbm5lY3Rpb25zIHtcbiAgICBpZiAoIXRoaXMuX2Nvbm5lY3Rpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdDYW5ub3QgbWFuYWdlIG5ldHdvcmsgYWNjZXNzIHdpdGhvdXQgY29uZmlndXJpbmcgYSBWUEMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgQ29ubmVjdGlvbnMgb2JqZWN0IGZvciB0aGlzIFJ1bnRpbWUuIFRoaXMgbWF5IGJlIHVuc2V0IGluIHRoZSBldmVudCB0aGF0IGEgVlBDIGhhcyBub3RcbiAgICogYmVlbiBjb25maWd1cmVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfY29ubmVjdGlvbnM6IGVjMi5Db25uZWN0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgcnVudGltZSBzcGVjaWZpYyBhY3Rpb25zIG9uIEFXUyByZXNvdXJjZXNcbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGFjdGlvbnMgdG8gZ3JhbnRcbiAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgcmVzb3VyY2UgQVJOcyB0byBncmFudCBhY2Nlc3MgdG9cbiAgICogQHJldHVybnMgVGhlIEdyYW50IG9iamVjdCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHB1YmxpYyBncmFudChhY3Rpb25zOiBzdHJpbmdbXSwgcmVzb3VyY2VzOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlOiB0aGlzLnJvbGUsXG4gICAgICBhY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiByZXNvdXJjZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHBvbGljeSBzdGF0ZW1lbnQgdG8gdGhlIHJ1bnRpbWUncyBleGVjdXRpb24gcm9sZVxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IFRoZSBJQU0gcG9saWN5IHN0YXRlbWVudCB0byBhZGRcbiAgICogQHJldHVybnMgVGhlIHJ1bnRpbWUgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBwdWJsaWMgYWRkVG9Sb2xlUG9saWN5KHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCk6IElCZWRyb2NrQWdlbnRSdW50aW1lIHtcbiAgICAvLyBDaGVjayBpZiByb2xlIGlzIGEgY29uY3JldGUgUm9sZSBpbnN0YW5jZVxuICAgIGlmICh0aGlzLnJvbGUgaW5zdGFuY2VvZiBpYW0uUm9sZSkge1xuICAgICAgdGhpcy5yb2xlLmFkZFRvUG9saWN5KHN0YXRlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBpbXBvcnRlZCByb2xlcyAoSVJvbGUpLCB3ZSBuZWVkIHRvIGF0dGFjaCB2aWEgYSBuZXcgcG9saWN5XG4gICAgICBjb25zdCBwb2xpY3kgPSBuZXcgaWFtLlBvbGljeSh0aGlzLCBgQ3VzdG9tUG9saWN5JHtEYXRlLm5vdygpfWAsIHtcbiAgICAgICAgc3RhdGVtZW50czogW3N0YXRlbWVudF0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMucm9sZS5hdHRhY2hJbmxpbmVQb2xpY3kocG9saWN5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIHRvIGludm9rZSB0aGlzIHJ1bnRpbWVcbiAgICogR3JhbnRzIHRoZSBiZWRyb2NrLWFnZW50Y29yZTpJbnZva2VBZ2VudFJ1bnRpbWUgcGVybWlzc2lvblxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlUnVudGltZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogUlVOVElNRV9JTlZPS0VfUEVSTVMsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmFnZW50UnVudGltZUFybl0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIHRvIGludm9rZSB0aGlzIHJ1bnRpbWUgb24gYmVoYWxmIG9mIGEgdXNlclxuICAgKiBHcmFudHMgdGhlIGJlZHJvY2stYWdlbnRjb3JlOkludm9rZUFnZW50UnVudGltZUZvclVzZXIgcGVybWlzc2lvblxuICAgKiBSZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBYLUFtem4tQmVkcm9jay1BZ2VudENvcmUtUnVudGltZS1Vc2VyLUlkIGhlYWRlclxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlUnVudGltZUZvclVzZXIoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFJVTlRJTUVfSU5WT0tFX1VTRVJfUEVSTVMsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmFnZW50UnVudGltZUFybl0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVybWl0cyBhbiBJQU0gcHJpbmNpcGFsIHRvIGludm9rZSB0aGlzIHJ1bnRpbWUgYm90aCBkaXJlY3RseSBhbmQgb24gYmVoYWxmIG9mIHVzZXJzXG4gICAqIEdyYW50cyBib3RoIGJlZHJvY2stYWdlbnRjb3JlOkludm9rZUFnZW50UnVudGltZSBhbmQgYmVkcm9jay1hZ2VudGNvcmU6SW52b2tlQWdlbnRSdW50aW1lRm9yVXNlciBwZXJtaXNzaW9uc1xuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBbLi4uUlVOVElNRV9JTlZPS0VfUEVSTVMsIC4uLlJVTlRJTUVfSU5WT0tFX1VTRVJfUEVSTVNdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbdGhpcy5hZ2VudFJ1bnRpbWVBcm5dLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE1ldHJpY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgZGltZW5zaW9uczogRGltZW5zaW9uc01hcCwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICBjb25zdCBtZXRyaWNQcm9wczogTWV0cmljUHJvcHMgPSB7XG4gICAgICBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgLi4uZGltZW5zaW9ucywgUmVzb3VyY2U6IHRoaXMuYWdlbnRSdW50aW1lQXJuIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyZU1ldHJpYyhtZXRyaWNQcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIHRvdGFsIG51bWJlciBvZiBpbnZvY2F0aW9ucyBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0ludm9jYXRpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbnZvY2F0aW9ucycsIHt9LCB7IHN0YXRpc3RpYzogU3RhdHMuU1VNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIGludm9jYXRpb25zIGFjcm9zcyBhbGwgcmVzb3VyY2VzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0ludm9jYXRpb25zQWdncmVnYXRlZChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnSW52b2NhdGlvbnMnLCB7IFJlc291cmNlOiAnQWxsJyB9LCB7IHN0YXRpc3RpYzogU3RhdHMuU1VNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHRocm90dGxlZCByZXF1ZXN0cyBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1Rocm90dGxlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnVGhyb3R0bGVzJywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2Ygc3lzdGVtIGVycm9ycyBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1N5c3RlbUVycm9ycyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnU3lzdGVtRXJyb3JzJywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdXNlciBlcnJvcnMgZm9yIHRoaXMgYWdlbnQgcnVudGltZS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNVc2VyRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdVc2VyRXJyb3JzJywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBtZWFzdXJpbmcgdGhlIGxhdGVuY3kgb2YgcmVxdWVzdHMgZm9yIHRoaXMgYWdlbnQgcnVudGltZS5cbiAgICpcbiAgICogVGhlIGxhdGVuY3kgbWV0cmljIHJlcHJlc2VudHMgdGhlIHRvdGFsIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIHJlY2VpdmluZyB0aGUgcmVxdWVzdFxuICAgKiBhbmQgc2VuZGluZyB0aGUgZmluYWwgcmVzcG9uc2UgdG9rZW4sIHJlcHJlc2VudGluZyBjb21wbGV0ZSBlbmQtdG8tZW5kIHByb2Nlc3NpbmcgdGltZS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNMYXRlbmN5KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdMYXRlbmN5Jywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5BVkVSQUdFLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIGVycm9ycyAoc3lzdGVtICsgdXNlcikgZm9yIHRoaXMgYWdlbnQgcnVudGltZS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNUb3RhbEVycm9ycyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnVG90YWxFcnJvcnMnLCB7fSwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBhZ2VudCBzZXNzaW9ucyBmb3IgdGhpcyBhZ2VudCBydW50aW1lLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1Nlc3Npb25Db3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnU2Vzc2lvbkNvdW50Jywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgYWNyb3NzIGFsbCByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU2Vzc2lvbnNBZ2dyZWdhdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTZXNzaW9ucycsIHsgUmVzb3VyY2U6ICdBbGwnIH0sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBjcmVhdGUgYSBtZXRyaWMuXG4gICAqL1xuICBwcml2YXRlIGNvbmZpZ3VyZU1ldHJpYyhwcm9wczogTWV0cmljUHJvcHMpIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJlZ2lvbjogcHJvcHM/LnJlZ2lvbiA/PyB0aGlzLnN0YWNrLnJlZ2lvbixcbiAgICAgIGFjY291bnQ6IHByb3BzPy5hY2NvdW50ID8/IHRoaXMuc3RhY2suYWNjb3VudCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBBZ2VudCBSdW50aW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRSdW50aW1lQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqL1xuICByZWFkb25seSBhZ2VudFJ1bnRpbWVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqL1xuICByZWFkb25seSBhZ2VudFJ1bnRpbWVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKi9cbiAgcmVhZG9ubHkgYWdlbnRSdW50aW1lTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgQVJOXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIFdoZW4gaW1wb3J0aW5nIGEgcnVudGltZSBhbmQgdGhpcyBpcyBub3Qgc3BlY2lmaWVkIG9yIHVuZGVmaW5lZCwgZW5kcG9pbnRzIGNyZWF0ZWQgb24gdGhpcyBydW50aW1lXG4gICAqIHdpbGwgcG9pbnQgdG8gdmVyc2lvbiBcIjFcIiB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuLlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgYWdlbnRSdW50aW1lVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhZ2VudCBydW50aW1lXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgZ3JvdXBzIGZvciB0aGlzIHJ1bnRpbWUsIGlmIGluIGEgVlBDLlxuICAgKiBAZGVmYXVsdCAtIEJ5IGRlZmF1bHQsIHRoZSBydW50aW1lIGlzIG5vdCBpbiBhIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzPzogZWMyLklTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgYWdlbnQgcnVudGltZVxuICAgKiBAZGVmYXVsdCAtIFN0YXR1cyBub3QgYXZhaWxhYmxlXG4gICAqL1xuICByZWFkb25seSBhZ2VudFN0YXR1cz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWUgYXQgd2hpY2ggdGhlIHJ1bnRpbWUgd2FzIGNyZWF0ZWRcbiAgICogQGRlZmF1bHQgLSBDcmVhdGlvbiB0aW1lIG5vdCBhdmFpbGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWUgYXQgd2hpY2ggdGhlIHJ1bnRpbWUgd2FzIGxhc3QgdXBkYXRlZFxuICAgKiBAZGVmYXVsdCAtIExhc3QgdXBkYXRlIHRpbWUgbm90IGF2YWlsYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbn1cbiJdfQ==