@aws-cdk/aws-bedrock-agentcore-alpha 2.250.0-alpha.0 → 2.252.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 +11883 -7285
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +4 -0
- package/README.md +405 -0
- package/lib/gateway/gateway-base.js +1 -1
- package/lib/gateway/gateway.d.ts +58 -0
- package/lib/gateway/gateway.js +46 -3
- package/lib/gateway/inbound-auth/authorizer.d.ts +27 -1
- package/lib/gateway/inbound-auth/authorizer.js +37 -5
- package/lib/gateway/inbound-auth/custom-claim.js +1 -1
- package/lib/gateway/interceptor.js +1 -1
- package/lib/gateway/outbound-auth/api-key.js +1 -1
- package/lib/gateway/outbound-auth/credential-provider.js +1 -1
- package/lib/gateway/protocol.js +2 -2
- package/lib/gateway/targets/schema/api-schema.js +4 -4
- package/lib/gateway/targets/schema/tool-schema.js +4 -4
- package/lib/gateway/targets/target-base.js +1 -1
- package/lib/gateway/targets/target-configuration.js +6 -6
- package/lib/gateway/targets/target.js +1 -1
- package/lib/index.d.ts +8 -0
- package/lib/index.js +13 -1
- package/lib/memory/memory-strategy.js +1 -1
- package/lib/memory/memory.js +2 -2
- package/lib/memory/strategies/managed-strategy.js +1 -1
- package/lib/memory/strategies/self-managed-strategy.js +1 -1
- package/lib/network/network-configuration.js +4 -4
- package/lib/policy/perms.d.ts +50 -0
- package/lib/policy/perms.js +62 -0
- package/lib/policy/policy-base.d.ts +194 -0
- package/lib/policy/policy-base.js +120 -0
- package/lib/policy/policy-engine-base.d.ts +260 -0
- package/lib/policy/policy-engine-base.js +193 -0
- package/lib/policy/policy-engine.d.ts +150 -0
- package/lib/policy/policy-engine.js +290 -0
- package/lib/policy/policy-statement.d.ts +518 -0
- package/lib/policy/policy-statement.js +927 -0
- package/lib/policy/policy-types.d.ts +66 -0
- package/lib/policy/policy-types.js +30 -0
- package/lib/policy/policy.d.ts +127 -0
- package/lib/policy/policy.js +225 -0
- package/lib/policy/validation-helpers.d.ts +139 -0
- package/lib/policy/validation-helpers.js +276 -0
- package/lib/runtime/inbound-auth/custom-claim.js +1 -1
- package/lib/runtime/inbound-auth/runtime-authorizer-configuration.js +1 -1
- package/lib/runtime/observability.d.ts +105 -0
- package/lib/runtime/observability.js +317 -0
- package/lib/runtime/runtime-artifact.js +1 -1
- package/lib/runtime/runtime-base.js +1 -1
- package/lib/runtime/runtime-endpoint-base.js +1 -1
- package/lib/runtime/runtime-endpoint.js +1 -1
- package/lib/runtime/runtime.d.ts +17 -0
- package/lib/runtime/runtime.js +10 -2
- package/lib/tools/browser.js +2 -2
- package/lib/tools/code-interpreter.js +2 -2
- package/package.json +9 -9
- package/rosetta/default.ts-fixture +2 -0
|
@@ -0,0 +1,290 @@
|
|
|
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.PolicyEngine = void 0;
|
|
38
|
+
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
|
|
39
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
|
+
/**
|
|
41
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
42
|
+
*
|
|
43
|
+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
|
|
44
|
+
* with the License. A copy of the License is located at
|
|
45
|
+
*
|
|
46
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
47
|
+
*
|
|
48
|
+
* or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
|
|
49
|
+
* OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
|
|
50
|
+
* and limitations under the License.
|
|
51
|
+
*/
|
|
52
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
53
|
+
const aws_bedrockagentcore_1 = require("aws-cdk-lib/aws-bedrockagentcore");
|
|
54
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
55
|
+
const kms = require("aws-cdk-lib/aws-kms");
|
|
56
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
57
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
58
|
+
// Internal imports
|
|
59
|
+
const policy_1 = require("./policy");
|
|
60
|
+
const policy_engine_base_1 = require("./policy-engine-base");
|
|
61
|
+
const validation_helpers_1 = require("./validation-helpers");
|
|
62
|
+
/**
|
|
63
|
+
* Container that manages Cedar authorization policies associated with gateways.
|
|
64
|
+
* PolicyEngine enables deterministic authorization control for Bedrock agents,
|
|
65
|
+
* allowing fine-grained access control to tools and actions via Cedar policy language.
|
|
66
|
+
*
|
|
67
|
+
* @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/policy-engine.html
|
|
68
|
+
* @resource AWS::BedrockAgentCore::PolicyEngine
|
|
69
|
+
*/
|
|
70
|
+
let PolicyEngine = (() => {
|
|
71
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
72
|
+
let _classDescriptor;
|
|
73
|
+
let _classExtraInitializers = [];
|
|
74
|
+
let _classThis;
|
|
75
|
+
let _classSuper = policy_engine_base_1.PolicyEngineBase;
|
|
76
|
+
let _instanceExtraInitializers = [];
|
|
77
|
+
let _addPolicy_decorators;
|
|
78
|
+
var PolicyEngine = class extends _classSuper {
|
|
79
|
+
static { _classThis = this; }
|
|
80
|
+
static {
|
|
81
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
82
|
+
_addPolicy_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
83
|
+
__esDecorate(this, null, _addPolicy_decorators, { kind: "method", name: "addPolicy", static: false, private: false, access: { has: obj => "addPolicy" in obj, get: obj => obj.addPolicy }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
84
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
85
|
+
PolicyEngine = _classThis = _classDescriptor.value;
|
|
86
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
87
|
+
}
|
|
88
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.PolicyEngine", version: "2.252.0-alpha.0" };
|
|
89
|
+
/** Uniquely identifies this class. */
|
|
90
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.PolicyEngine';
|
|
91
|
+
/**
|
|
92
|
+
* Creates a PolicyEngine reference from an existing policy engine's attributes.
|
|
93
|
+
*
|
|
94
|
+
* @param scope - The construct scope
|
|
95
|
+
* @param id - Identifier of the construct
|
|
96
|
+
* @param attrs - Attributes of the existing policy engine
|
|
97
|
+
* @returns An IPolicyEngine reference to the existing policy engine
|
|
98
|
+
*/
|
|
99
|
+
static fromPolicyEngineAttributes(scope, id, attrs) {
|
|
100
|
+
try {
|
|
101
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_PolicyEngineAttributes(attrs);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
105
|
+
Error.captureStackTrace(error, this.fromPolicyEngineAttributes);
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
class Import extends policy_engine_base_1.PolicyEngineBase {
|
|
110
|
+
policyEngineArn = attrs.policyEngineArn;
|
|
111
|
+
policyEngineId = aws_cdk_lib_1.Arn.split(attrs.policyEngineArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
|
|
112
|
+
policyEngineName = this.policyEngineId;
|
|
113
|
+
description = undefined;
|
|
114
|
+
kmsKey = attrs.kmsKeyArn
|
|
115
|
+
? kms.Key.fromKeyArn(scope, `${id}Key`, attrs.kmsKeyArn)
|
|
116
|
+
: undefined;
|
|
117
|
+
grantPrincipal = new iam.UnknownPrincipal({ resource: this });
|
|
118
|
+
constructor(s, i) {
|
|
119
|
+
super(s, i);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return new Import(scope, id);
|
|
123
|
+
}
|
|
124
|
+
// ------------------------------------------------------
|
|
125
|
+
// Attributes
|
|
126
|
+
// ------------------------------------------------------
|
|
127
|
+
/**
|
|
128
|
+
* The ARN of the policy engine resource.
|
|
129
|
+
* @attribute
|
|
130
|
+
*/
|
|
131
|
+
policyEngineArn = __runInitializers(this, _instanceExtraInitializers);
|
|
132
|
+
/**
|
|
133
|
+
* The name of the policy engine.
|
|
134
|
+
*
|
|
135
|
+
* [disable-awslint:attribute-tag]
|
|
136
|
+
*/
|
|
137
|
+
policyEngineName;
|
|
138
|
+
/**
|
|
139
|
+
* The ID of the policy engine.
|
|
140
|
+
* @attribute
|
|
141
|
+
*/
|
|
142
|
+
policyEngineId;
|
|
143
|
+
/**
|
|
144
|
+
* The description of the policy engine.
|
|
145
|
+
*/
|
|
146
|
+
description;
|
|
147
|
+
/**
|
|
148
|
+
* Tags applied to this policy engine resource.
|
|
149
|
+
* @default - No tags applied
|
|
150
|
+
*/
|
|
151
|
+
tags;
|
|
152
|
+
/**
|
|
153
|
+
* The principal to grant permissions to.
|
|
154
|
+
*/
|
|
155
|
+
grantPrincipal;
|
|
156
|
+
/**
|
|
157
|
+
* The KMS key used to encrypt the policy engine.
|
|
158
|
+
*/
|
|
159
|
+
kmsKey;
|
|
160
|
+
/**
|
|
161
|
+
* List of policies added to this policy engine via addPolicy().
|
|
162
|
+
* @internal
|
|
163
|
+
*/
|
|
164
|
+
_policies = [];
|
|
165
|
+
/**
|
|
166
|
+
* The last policy added to this engine, used for automatic sequential chaining.
|
|
167
|
+
* @internal
|
|
168
|
+
*/
|
|
169
|
+
_lastPolicy;
|
|
170
|
+
/**
|
|
171
|
+
* Get the list of policies added to this policy engine.
|
|
172
|
+
*
|
|
173
|
+
* Returns an array of Policy constructs that were added using addPolicy().
|
|
174
|
+
* This allows you to iterate over all policies associated with this engine.
|
|
175
|
+
*
|
|
176
|
+
* @returns A copy of the policies array
|
|
177
|
+
*/
|
|
178
|
+
get policies() {
|
|
179
|
+
return [...this._policies];
|
|
180
|
+
}
|
|
181
|
+
__resource;
|
|
182
|
+
// ------------------------------------------------------
|
|
183
|
+
// CONSTRUCTOR
|
|
184
|
+
// ------------------------------------------------------
|
|
185
|
+
constructor(scope, id, props = {}) {
|
|
186
|
+
super(scope, id, {
|
|
187
|
+
// Maximum name length of 48 characters
|
|
188
|
+
physicalName: props?.policyEngineName ??
|
|
189
|
+
aws_cdk_lib_1.Lazy.string({
|
|
190
|
+
produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 48 }),
|
|
191
|
+
}),
|
|
192
|
+
});
|
|
193
|
+
try {
|
|
194
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_PolicyEngineProps(props);
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
198
|
+
Error.captureStackTrace(error, PolicyEngine);
|
|
199
|
+
}
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
// Enhanced CDK Analytics Telemetry
|
|
203
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
204
|
+
// ------------------------------------------------------
|
|
205
|
+
// Set properties and defaults
|
|
206
|
+
// ------------------------------------------------------
|
|
207
|
+
this.policyEngineName = this.physicalName;
|
|
208
|
+
this.description = props.description;
|
|
209
|
+
this.kmsKey = props.kmsKey;
|
|
210
|
+
this.tags = props.tags;
|
|
211
|
+
this.grantPrincipal = new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com');
|
|
212
|
+
// ------------------------------------------------------
|
|
213
|
+
// Validations
|
|
214
|
+
// ------------------------------------------------------
|
|
215
|
+
(0, validation_helpers_1.throwIfInvalidPolicyEngineName)(this.policyEngineName, this);
|
|
216
|
+
if (this.description) {
|
|
217
|
+
(0, validation_helpers_1.throwIfInvalidDescription)(this.description, this);
|
|
218
|
+
}
|
|
219
|
+
if (this.tags) {
|
|
220
|
+
(0, validation_helpers_1.throwIfInvalidTags)(this.tags, this.policyEngineName, this);
|
|
221
|
+
}
|
|
222
|
+
// ------------------------------------------------------
|
|
223
|
+
// CFN Props
|
|
224
|
+
// ------------------------------------------------------
|
|
225
|
+
const cfnProps = {
|
|
226
|
+
name: this.policyEngineName,
|
|
227
|
+
description: this.description,
|
|
228
|
+
encryptionKeyArn: this.kmsKey?.keyArn,
|
|
229
|
+
tags: this.tags
|
|
230
|
+
? Object.entries(this.tags).map(([key, value]) => ({
|
|
231
|
+
key,
|
|
232
|
+
value,
|
|
233
|
+
}))
|
|
234
|
+
: undefined,
|
|
235
|
+
};
|
|
236
|
+
this.__resource = new aws_bedrockagentcore_1.CfnPolicyEngine(this, 'Resource', cfnProps);
|
|
237
|
+
this.policyEngineId = this.__resource.attrPolicyEngineId;
|
|
238
|
+
this.policyEngineArn = this.__resource.attrPolicyEngineArn;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Add a policy to this policy engine.
|
|
242
|
+
* Convenience method that creates a Policy construct with this engine as the parent.
|
|
243
|
+
*
|
|
244
|
+
* **Automatic Sequential Chaining**: By default, policies are automatically chained
|
|
245
|
+
* sequentially to prevent concurrent creation issues with the AWS Bedrock AgentCore
|
|
246
|
+
* service. Each new policy will depend on the previous policy added to this engine.
|
|
247
|
+
*
|
|
248
|
+
* This ensures policies are created one at a time, avoiding "Resource stabilization
|
|
249
|
+
* failed" errors that occur with concurrent policy operations.
|
|
250
|
+
*
|
|
251
|
+
* @param id - Unique identifier for the policy construct
|
|
252
|
+
* @param options - Options for creating the policy
|
|
253
|
+
* @returns The created Policy construct
|
|
254
|
+
*
|
|
255
|
+
*/
|
|
256
|
+
addPolicy(id, options) {
|
|
257
|
+
try {
|
|
258
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddPolicyOptions(options);
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
262
|
+
Error.captureStackTrace(error, this.addPolicy);
|
|
263
|
+
}
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
const policy = new policy_1.Policy(this, id, {
|
|
267
|
+
policyEngine: this,
|
|
268
|
+
policyName: options.policyName,
|
|
269
|
+
definition: options.definition,
|
|
270
|
+
statement: options.statement,
|
|
271
|
+
description: options.description,
|
|
272
|
+
validationMode: options.validationMode,
|
|
273
|
+
});
|
|
274
|
+
// Automatically chain to previous policy if exists
|
|
275
|
+
// This prevents concurrent policy creation which causes service-level failures
|
|
276
|
+
if (this._lastPolicy) {
|
|
277
|
+
policy.node.addDependency(this._lastPolicy);
|
|
278
|
+
}
|
|
279
|
+
this._policies.push(policy);
|
|
280
|
+
this._lastPolicy = policy; // Track for next policy
|
|
281
|
+
return policy;
|
|
282
|
+
}
|
|
283
|
+
static {
|
|
284
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
return PolicyEngine = _classThis;
|
|
288
|
+
})();
|
|
289
|
+
exports.PolicyEngine = PolicyEngine;
|
|
290
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LWVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBvbGljeS1lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCw2Q0FBMEQ7QUFFMUQsMkVBQW1FO0FBQ25FLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MsOEVBQThGO0FBQzlGLDBFQUEwRTtBQUUxRSxtQkFBbUI7QUFDbkIscUNBQWtDO0FBQ2xDLDZEQUF3RDtBQUd4RCw2REFBcUg7QUF5Q3JIOzs7Ozs7O0dBT0c7SUFFVSxZQUFZOzRCQUR4QixvQ0FBa0I7Ozs7c0JBQ2UscUNBQWdCOzs7NEJBQXhCLFNBQVEsV0FBZ0I7Ozs7cUNBc0wvQyxJQUFBLGtDQUFjLEdBQUU7WUFDakIsOEtBQU8sU0FBUyw2REFvQmY7WUEzTUgsNktBNE1DOzs7OztRQTNNQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLG1EQUFtRCxDQUFDO1FBRTNHOzs7Ozs7O1dBT0c7UUFDSSxNQUFNLENBQUMsMEJBQTBCLENBQ3RDLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUE2Qjs7Ozs7Ozs7OztZQUU3QixNQUFNLE1BQU8sU0FBUSxxQ0FBZ0I7Z0JBQ25CLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO2dCQUN4QyxjQUFjLEdBQUcsaUJBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSx1QkFBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBYSxDQUFDO2dCQUMvRixnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUN2QyxXQUFXLEdBQUcsU0FBUyxDQUFDO2dCQUN4QixNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVM7b0JBQ3RDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxF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Q0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLHdCQUF3QjtZQUVuRCxPQUFPLE1BQU0sQ0FBQztTQUNmOztZQTNNVSx1REFBWTs7Ozs7QUFBWixvQ0FBWSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEFybiwgQXJuRm9ybWF0LCBMYXp5LCBOYW1lcyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgQ2ZuUG9saWN5RW5naW5lUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgeyBDZm5Qb2xpY3lFbmdpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbi8vIEludGVybmFsIGltcG9ydHNcbmltcG9ydCB7IFBvbGljeSB9IGZyb20gJy4vcG9saWN5JztcbmltcG9ydCB7IFBvbGljeUVuZ2luZUJhc2UgfSBmcm9tICcuL3BvbGljeS1lbmdpbmUtYmFzZSc7XG5pbXBvcnQgdHlwZSB7IElQb2xpY3lFbmdpbmUsIFBvbGljeUVuZ2luZUF0dHJpYnV0ZXMgfSBmcm9tICcuL3BvbGljeS1lbmdpbmUtYmFzZSc7XG5pbXBvcnQgdHlwZSB7IEFkZFBvbGljeU9wdGlvbnMgfSBmcm9tICcuL3BvbGljeS10eXBlcyc7XG5pbXBvcnQgeyB0aHJvd0lmSW52YWxpZFBvbGljeUVuZ2luZU5hbWUsIHRocm93SWZJbnZhbGlkRGVzY3JpcHRpb24sIHRocm93SWZJbnZhbGlkVGFncyB9IGZyb20gJy4vdmFsaWRhdGlvbi1oZWxwZXJzJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIFBvbGljeUVuZ2luZSByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbGljeUVuZ2luZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwb2xpY3kgZW5naW5lLlxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzOiBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKVxuICAgKiBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIDEtNDggY2hhcmFjdGVyc1xuICAgKiBQYXR0ZXJuOiBeW0EtWmEtel1bQS1aYS16MC05X10qJFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEF1dG8tZ2VuZXJhdGVkIHVuaXF1ZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBwb2xpY3lFbmdpbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHBvbGljeSBlbmdpbmUuXG4gICAqIE1heGltdW0gNCwwOTYgY2hhcmFjdGVycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBLTVMga2V5IGZvciBlbmNyeXB0aW9uLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnByZWZlci1yZWYtaW50ZXJmYWNlXVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFXUyBvd25lZCBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBUYWdzIGZvciB0aGUgcG9saWN5IGVuZ2luZS5cbiAgICogTWF4aW11bSA1MCB0YWdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnRhaW5lciB0aGF0IG1hbmFnZXMgQ2VkYXIgYXV0aG9yaXphdGlvbiBwb2xpY2llcyBhc3NvY2lhdGVkIHdpdGggZ2F0ZXdheXMuXG4gKiBQb2xpY3lFbmdpbmUgZW5hYmxlcyBkZXRlcm1pbmlzdGljIGF1dGhvcml6YXRpb24gY29udHJvbCBmb3IgQmVkcm9jayBhZ2VudHMsXG4gKiBhbGxvd2luZyBmaW5lLWdyYWluZWQgYWNjZXNzIGNvbnRyb2wgdG8gdG9vbHMgYW5kIGFjdGlvbnMgdmlhIENlZGFyIHBvbGljeSBsYW5ndWFnZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcG9saWN5LWVuZ2luZS5odG1sXG4gKiBAcmVzb3VyY2UgQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpQb2xpY3lFbmdpbmVcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFBvbGljeUVuZ2luZSBleHRlbmRzIFBvbGljeUVuZ2luZUJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1iZWRyb2NrLWFnZW50Y29yZS1hbHBoYS5Qb2xpY3lFbmdpbmUnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgUG9saWN5RW5naW5lIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIHBvbGljeSBlbmdpbmUncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCAtIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgLSBBdHRyaWJ1dGVzIG9mIHRoZSBleGlzdGluZyBwb2xpY3kgZW5naW5lXG4gICAqIEByZXR1cm5zIEFuIElQb2xpY3lFbmdpbmUgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBwb2xpY3kgZW5naW5lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Qb2xpY3lFbmdpbmVBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogUG9saWN5RW5naW5lQXR0cmlidXRlcyxcbiAgKTogSVBvbGljeUVuZ2luZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUG9saWN5RW5naW5lQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RW5naW5lQXJuID0gYXR0cnMucG9saWN5RW5naW5lQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBvbGljeUVuZ2luZUlkID0gQXJuLnNwbGl0KGF0dHJzLnBvbGljeUVuZ2luZUFybiwgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSE7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RW5naW5lTmFtZSA9IHRoaXMucG9saWN5RW5naW5lSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkga21zS2V5ID0gYXR0cnMua21zS2V5QXJuXG4gICAgICAgID8ga21zLktleS5mcm9tS2V5QXJuKHNjb3BlLCBgJHtpZH1LZXlgLCBhdHRycy5rbXNLZXlBcm4pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsID0gbmV3IGlhbS5Vbmtub3duUHJpbmNpcGFsKHsgcmVzb3VyY2U6IHRoaXMgfSk7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQXR0cmlidXRlc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcG9saWN5IGVuZ2luZSByZXNvdXJjZS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvbGljeUVuZ2luZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcG9saWN5IGVuZ2luZS5cbiAgICpcbiAgICogW2Rpc2FibGUtYXdzbGludDphdHRyaWJ1dGUtdGFnXVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvbGljeUVuZ2luZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBwb2xpY3kgZW5naW5lLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RW5naW5lSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwb2xpY3kgZW5naW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYWdzIGFwcGxpZWQgdG8gdGhpcyBwb2xpY3kgZW5naW5lIHJlc291cmNlLlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3MgYXBwbGllZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBwb2xpY3kgZW5naW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHBvbGljaWVzIGFkZGVkIHRvIHRoaXMgcG9saWN5IGVuZ2luZSB2aWEgYWRkUG9saWN5KCkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcG9saWNpZXM6IFBvbGljeVtdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IHBvbGljeSBhZGRlZCB0byB0aGlzIGVuZ2luZSwgdXNlZCBmb3IgYXV0b21hdGljIHNlcXVlbnRpYWwgY2hhaW5pbmcuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBfbGFzdFBvbGljeT86IFBvbGljeTtcblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIHBvbGljaWVzIGFkZGVkIHRvIHRoaXMgcG9saWN5IGVuZ2luZS5cbiAgICpcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBQb2xpY3kgY29uc3RydWN0cyB0aGF0IHdlcmUgYWRkZWQgdXNpbmcgYWRkUG9saWN5KCkuXG4gICAqIFRoaXMgYWxsb3dzIHlvdSB0byBpdGVyYXRlIG92ZXIgYWxsIHBvbGljaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVuZ2luZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBjb3B5IG9mIHRoZSBwb2xpY2llcyBhcnJheVxuICAgKi9cbiAgcHVibGljIGdldCBwb2xpY2llcygpOiBQb2xpY3lbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9wb2xpY2llc107XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9fcmVzb3VyY2U6IENmblBvbGljeUVuZ2luZTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ09OU1RSVUNUT1JcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQb2xpY3lFbmdpbmVQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAvLyBNYXhpbXVtIG5hbWUgbGVuZ3RoIG9mIDQ4IGNoYXJhY3RlcnNcbiAgICAgIHBoeXNpY2FsTmFtZTpcbiAgICAgICAgcHJvcHM/LnBvbGljeUVuZ2luZU5hbWUgPz9cbiAgICAgICAgTGF6eS5zdHJpbmcoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNDggfSksXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTZXQgcHJvcGVydGllcyBhbmQgZGVmYXVsdHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aGlzLnBvbGljeUVuZ2luZU5hbWUgPSB0aGlzLnBoeXNpY2FsTmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5rbXNLZXkgPSBwcm9wcy5rbXNLZXk7XG4gICAgdGhpcy50YWdzID0gcHJvcHMudGFncztcblxuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2JlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20nKTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFZhbGlkYXRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICB0aHJvd0lmSW52YWxpZFBvbGljeUVuZ2luZU5hbWUodGhpcy5wb2xpY3lFbmdpbmVOYW1lLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aHJvd0lmSW52YWxpZERlc2NyaXB0aW9uKHRoaXMuZGVzY3JpcHRpb24sIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhZ3MpIHtcbiAgICAgIHRocm93SWZJbnZhbGlkVGFncyh0aGlzLnRhZ3MsIHRoaXMucG9saWN5RW5naW5lTmFtZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ0ZOIFByb3BzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgY2ZuUHJvcHM6IENmblBvbGljeUVuZ2luZVByb3BzID0ge1xuICAgICAgbmFtZTogdGhpcy5wb2xpY3lFbmdpbmVOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBlbmNyeXB0aW9uS2V5QXJuOiB0aGlzLmttc0tleT8ua2V5QXJuLFxuICAgICAgdGFnczogdGhpcy50YWdzXG4gICAgICAgID8gT2JqZWN0LmVudHJpZXModGhpcy50YWdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgdGhpcy5fX3Jlc291cmNlID0gbmV3IENmblBvbGljeUVuZ2luZSh0aGlzLCAnUmVzb3VyY2UnLCBjZm5Qcm9wcyk7XG5cbiAgICB0aGlzLnBvbGljeUVuZ2luZUlkID0gdGhpcy5fX3Jlc291cmNlLmF0dHJQb2xpY3lFbmdpbmVJZDtcbiAgICB0aGlzLnBvbGljeUVuZ2luZUFybiA9IHRoaXMuX19yZXNvdXJjZS5hdHRyUG9saWN5RW5naW5lQXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBvbGljeSB0byB0aGlzIHBvbGljeSBlbmdpbmUuXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBQb2xpY3kgY29uc3RydWN0IHdpdGggdGhpcyBlbmdpbmUgYXMgdGhlIHBhcmVudC5cbiAgICpcbiAgICogKipBdXRvbWF0aWMgU2VxdWVudGlhbCBDaGFpbmluZyoqOiBCeSBkZWZhdWx0LCBwb2xpY2llcyBhcmUgYXV0b21hdGljYWxseSBjaGFpbmVkXG4gICAqIHNlcXVlbnRpYWxseSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgY3JlYXRpb24gaXNzdWVzIHdpdGggdGhlIEFXUyBCZWRyb2NrIEFnZW50Q29yZVxuICAgKiBzZXJ2aWNlLiBFYWNoIG5ldyBwb2xpY3kgd2lsbCBkZXBlbmQgb24gdGhlIHByZXZpb3VzIHBvbGljeSBhZGRlZCB0byB0aGlzIGVuZ2luZS5cbiAgICpcbiAgICogVGhpcyBlbnN1cmVzIHBvbGljaWVzIGFyZSBjcmVhdGVkIG9uZSBhdCBhIHRpbWUsIGF2b2lkaW5nIFwiUmVzb3VyY2Ugc3RhYmlsaXphdGlvblxuICAgKiBmYWlsZWRcIiBlcnJvcnMgdGhhdCBvY2N1ciB3aXRoIGNvbmN1cnJlbnQgcG9saWN5IG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcG9saWN5IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBwb2xpY3lcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgUG9saWN5IGNvbnN0cnVjdFxuICAgKlxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZFBvbGljeShpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRQb2xpY3lPcHRpb25zKTogUG9saWN5IHtcbiAgICBjb25zdCBwb2xpY3kgPSBuZXcgUG9saWN5KHRoaXMsIGlkLCB7XG4gICAgICBwb2xpY3lFbmdpbmU6IHRoaXMsXG4gICAgICBwb2xpY3lOYW1lOiBvcHRpb25zLnBvbGljeU5hbWUsXG4gICAgICBkZWZpbml0aW9uOiBvcHRpb25zLmRlZmluaXRpb24sXG4gICAgICBzdGF0ZW1lbnQ6IG9wdGlvbnMuc3RhdGVtZW50LFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICB2YWxpZGF0aW9uTW9kZTogb3B0aW9ucy52YWxpZGF0aW9uTW9kZSxcbiAgICB9KTtcblxuICAgIC8vIEF1dG9tYXRpY2FsbHkgY2hhaW4gdG8gcHJldmlvdXMgcG9saWN5IGlmIGV4aXN0c1xuICAgIC8vIFRoaXMgcHJldmVudHMgY29uY3VycmVudCBwb2xpY3kgY3JlYXRpb24gd2hpY2ggY2F1c2VzIHNlcnZpY2UtbGV2ZWwgZmFpbHVyZXNcbiAgICBpZiAodGhpcy5fbGFzdFBvbGljeSkge1xuICAgICAgcG9saWN5Lm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLl9sYXN0UG9saWN5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9wb2xpY2llcy5wdXNoKHBvbGljeSk7XG4gICAgdGhpcy5fbGFzdFBvbGljeSA9IHBvbGljeTsgLy8gVHJhY2sgZm9yIG5leHQgcG9saWN5XG5cbiAgICByZXR1cm4gcG9saWN5O1xuICB9XG59XG5cbiJdfQ==
|