@aws-cdk/aws-bedrock-agentcore-alpha 2.237.1-alpha.0 → 2.239.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 +2128 -856
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +119 -1
- package/README.md +109 -47
- package/lib/gateway/gateway-base.d.ts +14 -7
- package/lib/gateway/gateway-base.js +13 -4
- package/lib/gateway/gateway.d.ts +66 -10
- package/lib/gateway/gateway.js +38 -3
- package/lib/gateway/inbound-auth/authorizer.d.ts +2 -2
- package/lib/gateway/inbound-auth/authorizer.js +4 -4
- package/lib/gateway/inbound-auth/custom-claim.d.ts +1 -1
- package/lib/gateway/inbound-auth/custom-claim.js +2 -2
- package/lib/gateway/interceptor.d.ts +3 -3
- package/lib/gateway/interceptor.js +2 -2
- package/lib/gateway/outbound-auth/api-key.d.ts +4 -2
- package/lib/gateway/outbound-auth/api-key.js +2 -2
- package/lib/gateway/outbound-auth/credential-provider.d.ts +5 -5
- package/lib/gateway/outbound-auth/credential-provider.js +2 -2
- package/lib/gateway/outbound-auth/iam-role.d.ts +3 -2
- package/lib/gateway/outbound-auth/iam-role.js +1 -1
- package/lib/gateway/outbound-auth/oauth.d.ts +4 -2
- package/lib/gateway/outbound-auth/oauth.js +1 -1
- package/lib/gateway/protocol.d.ts +1 -1
- package/lib/gateway/protocol.js +3 -3
- package/lib/gateway/targets/schema/api-schema.d.ts +3 -3
- package/lib/gateway/targets/schema/api-schema.js +5 -5
- package/lib/gateway/targets/schema/base-schema.d.ts +2 -2
- package/lib/gateway/targets/schema/base-schema.js +1 -1
- package/lib/gateway/targets/schema/tool-schema.d.ts +3 -3
- package/lib/gateway/targets/schema/tool-schema.js +5 -5
- package/lib/gateway/targets/target-base.d.ts +13 -5
- package/lib/gateway/targets/target-base.js +13 -2
- package/lib/gateway/targets/target-configuration.d.ts +251 -5
- package/lib/gateway/targets/target-configuration.js +344 -8
- package/lib/gateway/targets/target.d.ts +59 -9
- package/lib/gateway/targets/target.js +46 -3
- package/lib/memory/memory-strategy.d.ts +6 -4
- package/lib/memory/memory-strategy.js +2 -3
- package/lib/memory/memory.d.ts +12 -5
- package/lib/memory/memory.js +13 -17
- package/lib/memory/strategies/managed-strategy.d.ts +5 -4
- package/lib/memory/strategies/managed-strategy.js +2 -2
- package/lib/memory/strategies/self-managed-strategy.d.ts +4 -4
- package/lib/memory/strategies/self-managed-strategy.js +2 -2
- package/lib/memory/validation-helpers.d.ts +1 -1
- package/lib/memory/validation-helpers.js +1 -1
- package/lib/network/network-configuration.d.ts +2 -2
- package/lib/network/network-configuration.js +5 -5
- package/lib/runtime/inbound-auth/custom-claim.d.ts +1 -1
- package/lib/runtime/inbound-auth/custom-claim.js +2 -2
- package/lib/runtime/inbound-auth/runtime-authorizer-configuration.d.ts +3 -3
- package/lib/runtime/inbound-auth/runtime-authorizer-configuration.js +2 -2
- package/lib/runtime/runtime-artifact.d.ts +27 -4
- package/lib/runtime/runtime-artifact.js +67 -2
- package/lib/runtime/runtime-base.d.ts +12 -5
- package/lib/runtime/runtime-base.js +15 -18
- package/lib/runtime/runtime-endpoint-base.d.ts +9 -3
- package/lib/runtime/runtime-endpoint-base.js +10 -14
- package/lib/runtime/runtime-endpoint.d.ts +3 -2
- package/lib/runtime/runtime-endpoint.js +2 -2
- package/lib/runtime/runtime.d.ts +7 -5
- package/lib/runtime/runtime.js +2 -2
- package/lib/runtime/types.d.ts +1 -1
- package/lib/runtime/types.js +1 -1
- package/lib/tools/browser.d.ts +12 -5
- package/lib/tools/browser.js +14 -5
- package/lib/tools/code-interpreter.d.ts +11 -4
- package/lib/tools/code-interpreter.js +14 -5
- package/package.json +12 -12
- package/rosetta/default.ts-fixture +1 -0
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.McpServerTargetConfiguration = exports.SmithyTargetConfiguration = exports.OpenApiTargetConfiguration = exports.LambdaTargetConfiguration = exports.McpTargetConfiguration = void 0;
|
|
3
|
+
exports.ApiGatewayTargetConfiguration = exports.ApiGatewayHttpMethod = exports.McpServerTargetConfiguration = exports.SmithyTargetConfiguration = exports.OpenApiTargetConfiguration = exports.LambdaTargetConfiguration = exports.McpTargetConfiguration = void 0;
|
|
4
4
|
const jsiiDeprecationWarnings = require("../../../.warnings.jsii.js");
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
const fs = require("fs");
|
|
7
7
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
9
|
+
const validation_helpers_1 = require("../validation-helpers");
|
|
8
10
|
const api_schema_1 = require("./schema/api-schema");
|
|
9
11
|
const target_base_1 = require("./target-base");
|
|
10
|
-
const validation_helpers_1 = require("../validation-helpers");
|
|
11
12
|
/******************************************************************************
|
|
12
13
|
* MCP Target Configuration Base
|
|
13
14
|
*****************************************************************************/
|
|
@@ -16,7 +17,7 @@ const validation_helpers_1 = require("../validation-helpers");
|
|
|
16
17
|
* Provides common functionality for all MCP target types
|
|
17
18
|
*/
|
|
18
19
|
class McpTargetConfiguration {
|
|
19
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.McpTargetConfiguration", version: "2.
|
|
20
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.McpTargetConfiguration", version: "2.239.0-alpha.0" };
|
|
20
21
|
/**
|
|
21
22
|
* Renders the configuration as CloudFormation properties
|
|
22
23
|
* @internal
|
|
@@ -38,7 +39,7 @@ exports.McpTargetConfiguration = McpTargetConfiguration;
|
|
|
38
39
|
* allowing the gateway to invoke the function to provide tool capabilities.
|
|
39
40
|
*/
|
|
40
41
|
class LambdaTargetConfiguration extends McpTargetConfiguration {
|
|
41
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.LambdaTargetConfiguration", version: "2.
|
|
42
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.LambdaTargetConfiguration", version: "2.239.0-alpha.0" };
|
|
42
43
|
/**
|
|
43
44
|
* Create a Lambda target configuration
|
|
44
45
|
*
|
|
@@ -128,7 +129,7 @@ exports.LambdaTargetConfiguration = LambdaTargetConfiguration;
|
|
|
128
129
|
* allowing the gateway to transform API operations into tool calls.
|
|
129
130
|
*/
|
|
130
131
|
class OpenApiTargetConfiguration extends McpTargetConfiguration {
|
|
131
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.OpenApiTargetConfiguration", version: "2.
|
|
132
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.OpenApiTargetConfiguration", version: "2.239.0-alpha.0" };
|
|
132
133
|
/**
|
|
133
134
|
* Create an OpenAPI target configuration
|
|
134
135
|
*
|
|
@@ -246,7 +247,7 @@ exports.OpenApiTargetConfiguration = OpenApiTargetConfiguration;
|
|
|
246
247
|
* allowing the gateway to transform Smithy operations into tool calls.
|
|
247
248
|
*/
|
|
248
249
|
class SmithyTargetConfiguration extends McpTargetConfiguration {
|
|
249
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.SmithyTargetConfiguration", version: "2.
|
|
250
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.SmithyTargetConfiguration", version: "2.239.0-alpha.0" };
|
|
250
251
|
/**
|
|
251
252
|
* Create a Smithy target configuration
|
|
252
253
|
*
|
|
@@ -328,7 +329,7 @@ exports.SmithyTargetConfiguration = SmithyTargetConfiguration;
|
|
|
328
329
|
* synchronization.
|
|
329
330
|
*/
|
|
330
331
|
class McpServerTargetConfiguration extends McpTargetConfiguration {
|
|
331
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.McpServerTargetConfiguration", version: "2.
|
|
332
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.McpServerTargetConfiguration", version: "2.239.0-alpha.0" };
|
|
332
333
|
/**
|
|
333
334
|
* Create an MCP server target configuration
|
|
334
335
|
*
|
|
@@ -404,4 +405,339 @@ class McpServerTargetConfiguration extends McpTargetConfiguration {
|
|
|
404
405
|
}
|
|
405
406
|
}
|
|
406
407
|
exports.McpServerTargetConfiguration = McpServerTargetConfiguration;
|
|
407
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YXJnZXQtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2Q0FBb0M7QUFJcEMsb0RBQWdFO0FBRWhFLCtDQUE4QztBQUM5Qyw4REFBcUc7QUFzQ3JHOzsrRUFFK0U7QUFFL0U7OztHQUdHO0FBQ0gsTUFBc0Isc0JBQXNCOztJQWlCMUM7OztPQUdHO0lBQ0ksT0FBTztRQUNaLE9BQU87WUFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1NBQ25DLENBQUM7S0FDSDs7QUF6Qkgsd0RBMEJDO0FBRUQ7OytFQUUrRTtBQUUvRTs7Ozs7R0FLRztBQUNILE1BQWEseUJBQTBCLFNBQVEsc0JBQXNCOztJQUNuRTs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUNsQixjQUF5QixFQUN6QixVQUFzQjs7Ozs7Ozs7OztRQUV0QixPQUFPLElBQUkseUJBQXlCLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQ2xFO0lBRWUsVUFBVSxHQUFHLDJCQUFhLENBQUMsTUFBTSxDQUFDO0lBRWxEOztPQUVHO0lBQ2EsY0FBYyxDQUFZO0lBRTFDOztPQUVHO0lBQ2EsVUFBVSxDQUFhO0lBRXZDLFlBQVksY0FBeUIsRUFBRSxVQUFzQjtRQUMzRCxLQUFLLEVBQUUsQ0FBQzs7Ozs7OytDQTVCQyx5QkFBeUI7Ozs7UUE2QmxDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0tBQzlCO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksSUFBSSxDQUFDLEtBQWdCLEVBQUUsT0FBaUI7Ozs7Ozs7Ozs7UUFDN0MsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLG9DQUFvQztR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O1lBQ2pDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBQSx5Q0FBb0IsRUFDakMsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixlQUFlLEVBQ2Ysd0hBQXdILENBQ3pILENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLG9DQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCwrREFBK0Q7UUFDL0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9FLE1BQU0sSUFBSSxvQ0FBZSxDQUN2QixzRUFBc0U7Z0JBQ3RFLDRFQUE0RSxDQUM3RSxDQUFDO1FBQ0osQ0FBQztLQUNGOztBQWhGSCxvRUFpRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJR2F0ZXdheSB9IGZyb20gJy4uL2dhdGV3YXktYmFzZSc7XG5pbXBvcnQgeyBBcGlTY2hlbWEsIEFzc2V0QXBpU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEvYXBpLXNjaGVtYSc7XG5pbXBvcnQgeyBUb29sU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEvdG9vbC1zY2hlbWEnO1xuaW1wb3J0IHsgTWNwVGFyZ2V0VHlwZSB9IGZyb20gJy4vdGFyZ2V0LWJhc2UnO1xuaW1wb3J0IHsgdmFsaWRhdGVPcGVuQXBpU2NoZW1hLCB2YWxpZGF0ZUZpZWxkUGF0dGVybiwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi1oZWxwZXJzJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcmV0dXJuZWQgYnkgYmluZGluZyBhIHRhcmdldCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYm91bmRcbiAgICovXG4gIHJlYWRvbmx5IGJvdW5kOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciB0YXJnZXQgY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHR5cGVcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFR5cGU6IE1jcFRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgcGVybWlzc2lvbnMgYW5kIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWc7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGNvbmZpZ3VyYXRpb24gYXMgQ2xvdWRGb3JtYXRpb24gcHJvcGVydGllc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9yZW5kZXIoKTogYW55O1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIE1DUCBUYXJnZXQgQ29uZmlndXJhdGlvbiBCYXNlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgTUNQIHRhcmdldCBjb25maWd1cmF0aW9uc1xuICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBNQ1AgdGFyZ2V0IHR5cGVzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIGltcGxlbWVudHMgSVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIHRhcmdldCB0eXBlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdGFyZ2V0VHlwZTogTWNwVGFyZ2V0VHlwZTtcblxuICAvKipcbiAgICogQmluZHMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBwZXJtaXNzaW9ucyBhbmQgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWc7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnk7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGNvbmZpZ3VyYXRpb24gYXMgQ2xvdWRGb3JtYXRpb24gcHJvcGVydGllc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfcmVuZGVyKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1jcDogdGhpcy5yZW5kZXJNY3BDb25maWd1cmF0aW9uKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIExhbWJkYSBUYXJnZXQgQ29uZmlndXJhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIExhbWJkYS1iYXNlZCBNQ1AgdGFyZ2V0c1xuICpcbiAqIFRoaXMgY29uZmlndXJhdGlvbiB3cmFwcyBhIExhbWJkYSBmdW5jdGlvbiBhcyBNQ1AgdG9vbHMsXG4gKiBhbGxvd2luZyB0aGUgZ2F0ZXdheSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHRvIHByb3ZpZGUgdG9vbCBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFUYXJnZXRDb25maWd1cmF0aW9uIGV4dGVuZHMgTWNwVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBMYW1iZGEgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUZ1bmN0aW9uIFRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gaW52b2tlXG4gICAqIEBwYXJhbSB0b29sU2NoZW1hIFRoZSBzY2hlbWEgZGVmaW5pbmcgdGhlIHRvb2xzXG4gICAqIEByZXR1cm5zIEEgbmV3IExhbWJkYVRhcmdldENvbmZpZ3VyYXRpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgIGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24sXG4gICAgdG9vbFNjaGVtYTogVG9vbFNjaGVtYSxcbiAgKTogTGFtYmRhVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFUYXJnZXRDb25maWd1cmF0aW9uKGxhbWJkYUZ1bmN0aW9uLCB0b29sU2NoZW1hKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRUeXBlID0gTWNwVGFyZ2V0VHlwZS5MQU1CREE7XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBNQ1Agc2VydmVyIGxvZ2ljXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHRvb2wgc2NoZW1hIHRoYXQgZGVmaW5lcyB0aGUgYXZhaWxhYmxlIHRvb2xzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9vbFNjaGVtYTogVG9vbFNjaGVtYTtcblxuICBjb25zdHJ1Y3RvcihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uLCB0b29sU2NoZW1hOiBUb29sU2NoZW1hKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gbGFtYmRhRnVuY3Rpb247XG4gICAgdGhpcy50b29sU2NoZW1hID0gdG9vbFNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGludm9rZSB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBnYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGdhdGV3YXk6IElHYXRld2F5KTogVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gICAgLy8gQmluZCB0aGUgdG9vbCBzY2hlbWFcbiAgICB0aGlzLnRvb2xTY2hlbWEuYmluZChzY29wZSk7XG4gICAgLy8gR3JhbnQgcGVybWlzc2lvbnMgdG8gZ2F0ZXdheSByb2xlXG4gICAgdGhpcy50b29sU2NoZW1hLmdyYW50UGVybWlzc2lvbnNUb1JvbGUoZ2F0ZXdheS5yb2xlKTtcbiAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uLmdyYW50SW52b2tlKGdhdGV3YXkucm9sZSk7XG5cbiAgICByZXR1cm4geyBib3VuZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBsYW1iZGE6IHtcbiAgICAgICAgbGFtYmRhQXJuOiB0aGlzLmxhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgICB0b29sU2NoZW1hOiB0aGlzLnRvb2xTY2hlbWEuX3JlbmRlcigpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgT3BlbkFQSSBUYXJnZXQgQ29uZmlndXJhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIE9wZW5BUEktYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gZXhwb3NlcyBhbiBPcGVuQVBJL1JFU1QgQVBJIGFzIE1DUCB0b29scyxcbiAqIGFsbG93aW5nIHRoZSBnYXRld2F5IHRvIHRyYW5zZm9ybSBBUEkgb3BlcmF0aW9ucyBpbnRvIHRvb2wgY2FsbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuQXBpVGFyZ2V0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1jcFRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIE9wZW5BUEkgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGFwaVNjaGVtYSBUaGUgT3BlbkFQSSBzY2hlbWFcbiAgICogQHBhcmFtIHZhbGlkYXRlU2NoZW1hIFdoZXRoZXIgdG8gdmFsaWRhdGUgdGhlIE9wZW5BUEkgc2NoZW1hIChvbmx5IGFwcGxpZXMgdG8gaW5saW5lIHNjaGVtYXMpXG4gICAqIEByZXR1cm5zIEEgbmV3IE9wZW5BcGlUYXJnZXRDb25maWd1cmF0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShhcGlTY2hlbWE6IEFwaVNjaGVtYSwgdmFsaWRhdGVTY2hlbWE/OiBib29sZWFuKTogT3BlbkFwaVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgT3BlbkFwaVRhcmdldENvbmZpZ3VyYXRpb24oYXBpU2NoZW1hLCB2YWxpZGF0ZVNjaGVtYSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0VHlwZSA9IE1jcFRhcmdldFR5cGUuT1BFTkFQSV9TQ0hFTUE7XG5cbiAgLyoqXG4gICAqIFRoZSBPcGVuQVBJIHNjaGVtYSB0aGF0IGRlZmluZXMgdGhlIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaVNjaGVtYTogQXBpU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBPcGVuQVBJIHNjaGVtYVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRWYWxpZGF0ZVNjaGVtYTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihhcGlTY2hlbWE6IEFwaVNjaGVtYSwgdmFsaWRhdGVTY2hlbWE/OiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwaVNjaGVtYSA9IGFwaVNjaGVtYTtcbiAgICB0aGlzLnNob3VsZFZhbGlkYXRlU2NoZW1hID0gdmFsaWRhdGVTY2hlbWEgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGFjY2VzcyB0aGUgQVBJIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gZ2F0ZXdheSBUaGUgZ2F0ZXdheSB0aGF0IHdpbGwgdXNlIHRoaXMgdGFyZ2V0XG4gICAqL1xuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWcge1xuICAgIGlmICh0aGlzLnNob3VsZFZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICAvLyBGb3IgaW5saW5lIHNjaGVtYXNcbiAgICAgIGlmICh0aGlzLmFwaVNjaGVtYS5pbmxpbmVTY2hlbWEpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVPcGVuQXBpU2NoZW1hKHtcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuYXBpU2NoZW1hLmlubGluZVNjaGVtYSxcbiAgICAgICAgICBzY2hlbWFOYW1lOiAnT3BlbkFQSSBzY2hlbWEgZm9yIHRhcmdldCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBPcGVuQVBJIHNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZDpcXG4ke2Vycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwaVNjaGVtYSBpbnN0YW5jZW9mIEFzc2V0QXBpU2NoZW1hKSB7XG4gICAgICAgIC8vIEZvciBhc3NldCBzY2hlbWFzIChsb2NhbCBmaWxlcylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzY2hlbWFDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9wZW5BcGlTY2hlbWEoe1xuICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFDb250ZW50LFxuICAgICAgICAgICAgc2NoZW1hTmFtZTogYE9wZW5BUEkgc2NoZW1hIGZyb20gZmlsZSAke3RoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBPcGVuQVBJIHNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZDpcXG4ke2Vycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCBPcGVuQVBJIHNjaGVtYSBmcm9tICR7dGhpcy5hcGlTY2hlbWEuX2dldEZpbGVQYXRoKCl9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFMzIHNjaGVtYXMgY2Fubm90IGJlIHZhbGlkYXRlZCBhdCBzeW50aGVzaXMgdGltZVxuICAgIH1cblxuICAgIC8vIEJpbmQgdGhlIEFQSSBzY2hlbWFcbiAgICB0aGlzLmFwaVNjaGVtYS5iaW5kKHNjb3BlKTtcbiAgICAvLyBHcmFudCBwZXJtaXNzaW9ucyB0byBnYXRld2F5IHJvbGUgaWYgc2NoZW1hIGlzIGluIFMzXG4gICAgdGhpcy5hcGlTY2hlbWEuZ3JhbnRQZXJtaXNzaW9uc1RvUm9sZShnYXRld2F5LnJvbGUpO1xuXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlbkFwaVNjaGVtYTogdGhpcy5hcGlTY2hlbWEuX3JlbmRlcigpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBTbWl0aHkgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBTbWl0aHktYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gZXhwb3NlcyBhIFNtaXRoeS1tb2RlbGVkIEFQSSBhcyBNQ1AgdG9vbHMsXG4gKiBhbGxvd2luZyB0aGUgZ2F0ZXdheSB0byB0cmFuc2Zvcm0gU21pdGh5IG9wZXJhdGlvbnMgaW50byB0b29sIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgU21pdGh5VGFyZ2V0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1jcFRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU21pdGh5IHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBzbWl0aHlNb2RlbCBUaGUgU21pdGh5IG1vZGVsIHNjaGVtYVxuICAgKiBAcmV0dXJucyBBIG5ldyBTbWl0aHlUYXJnZXRDb25maWd1cmF0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShzbWl0aHlNb2RlbDogQXBpU2NoZW1hKTogU21pdGh5VGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTbWl0aHlUYXJnZXRDb25maWd1cmF0aW9uKHNtaXRoeU1vZGVsKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRUeXBlID0gTWNwVGFyZ2V0VHlwZS5TTUlUSFlfTU9ERUw7XG5cbiAgLyoqXG4gICAqIFRoZSBTbWl0aHkgbW9kZWwgdGhhdCBkZWZpbmVzIHRoZSBBUElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzbWl0aHlNb2RlbDogQXBpU2NoZW1hO1xuXG4gIGNvbnN0cnVjdG9yKHNtaXRoeU1vZGVsOiBBcGlTY2hlbWEpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc21pdGh5TW9kZWwgPSBzbWl0aHlNb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGFjY2VzcyB0aGUgU21pdGh5IG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBnYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGdhdGV3YXk6IElHYXRld2F5KTogVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gICAgLy8gQmluZCB0aGUgU21pdGh5IG1vZGVsXG4gICAgdGhpcy5zbWl0aHlNb2RlbC5iaW5kKHNjb3BlKTtcbiAgICAvLyBHcmFudCBwZXJtaXNzaW9ucyB0byBnYXRld2F5IHJvbGUgaWYgc2NoZW1hIGlzIGluIFMzXG4gICAgdGhpcy5zbWl0aHlNb2RlbC5ncmFudFBlcm1pc3Npb25zVG9Sb2xlKGdhdGV3YXkucm9sZSk7XG5cbiAgICByZXR1cm4geyBib3VuZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBzbWl0aHlNb2RlbDogdGhpcy5zbWl0aHlNb2RlbC5fcmVuZGVyKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIE1DUCBTZXJ2ZXIgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBNQ1AgU2VydmVyLWJhc2VkIHRhcmdldHNcbiAqXG4gKiBNQ1AgKE1vZGVsIENvbnRleHQgUHJvdG9jb2wpIHNlcnZlcnMgcHJvdmlkZSB0b29scywgZGF0YSBhY2Nlc3MsIGFuZCBjdXN0b21cbiAqIGZ1bmN0aW9ucyBmb3IgQUkgYWdlbnRzLiBXaGVuIHlvdSBjb25maWd1cmUgYW4gTUNQIHNlcnZlciBhcyBhIGdhdGV3YXkgdGFyZ2V0LFxuICogdGhlIGdhdGV3YXkgYXV0b21hdGljYWxseSBkaXNjb3ZlcnMgYW5kIGluZGV4ZXMgYXZhaWxhYmxlIHRvb2xzIHRocm91Z2hcbiAqIHN5bmNocm9uaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBNQ1Agc2VydmVyIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgSFRUUFMgZW5kcG9pbnQgVVJMIG9mIHRoZSBNQ1Agc2VydmVyXG4gICAqIEByZXR1cm5zIEEgbmV3IE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGVuZHBvaW50OiBzdHJpbmcpOiBNY3BTZXJ2ZXJUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24oZW5kcG9pbnQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFR5cGUgPSBNY3BUYXJnZXRUeXBlLk1DUF9TRVJWRVI7XG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQUyBlbmRwb2ludCBVUkwgb2YgdGhlIE1DUCBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDtcbiAgICB0aGlzLnZhbGlkYXRlRW5kcG9pbnQoZW5kcG9pbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoaXMgY29uZmlndXJhdGlvbiB0byBhIGNvbnN0cnVjdCBzY29wZVxuICAgKiBObyBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBuZWVkZWQgZm9yIE1DUCBzZXJ2ZXIgdGFyZ2V0c1xuICAgKlxuICAgKiBAcGFyYW0gX3Njb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIF9nYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKF9zY29wZTogQ29uc3RydWN0LCBfZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnIHtcbiAgICAvLyBNQ1Agc2VydmVyIHRhcmdldHMgZG9uJ3QgcmVxdWlyZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHNldHVwXG4gICAgLy8gQXV0aGVudGljYXRpb24gaXMgaGFuZGxlZCB0aHJvdWdoIGNyZWRlbnRpYWwgcHJvdmlkZXIgY29uZmlndXJhdGlvbnNcbiAgICByZXR1cm4geyBib3VuZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtY3BTZXJ2ZXI6IHtcbiAgICAgICAgZW5kcG9pbnQ6IHRoaXMuZW5kcG9pbnQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBNQ1Agc2VydmVyIGVuZHBvaW50XG4gICAqIC0gTXVzdCB1c2UgSFRUUFMgcHJvdG9jb2xcbiAgICogLSBTaG91bGQgYmUgcHJvcGVybHkgVVJMIGVuY29kZWRcbiAgICpcbiAgICogQHBhcmFtIGVuZHBvaW50IFRoZSBlbmRwb2ludCBVUkwgdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBWYWxpZGF0aW9uRXJyb3IgaWYgdGhlIGVuZHBvaW50IGlzIGludmFsaWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoZW5kcG9pbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICBlbmRwb2ludCxcbiAgICAgICdNQ1Agc2VydmVyIGVuZHBvaW50JyxcbiAgICAgIC9eaHR0cHM6XFwvXFwvLisvLFxuICAgICAgJ01DUCBzZXJ2ZXIgZW5kcG9pbnQgbXVzdCB1c2UgSFRUUFMgcHJvdG9jb2wgKGUuZy4sIGh0dHBzOi8vbXktc2VydmVyLmV4YW1wbGUuY29tKS4gRW5zdXJlIHRoZSBVUkwgaXMgcHJvcGVybHkgZW5jb2RlZC4nLFxuICAgICk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpdGlvbmFsIGhlbHBmdWwgdmFsaWRhdGlvbiBmb3IgY29tbW9uIFVSTCBlbmNvZGluZyBpc3N1ZXNcbiAgICBpZiAoZW5kcG9pbnQuaW5jbHVkZXMoJyAnKSB8fCBlbmRwb2ludC5pbmNsdWRlcygnPCcpIHx8IGVuZHBvaW50LmluY2x1ZGVzKCc+JykpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdNQ1Agc2VydmVyIGVuZHBvaW50IGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgVVJMLWVuY29kZWQuICcgK1xuICAgICAgICAnUGxlYXNlIGVuc3VyZSB0aGUgVVJMIGlzIHByb3Blcmx5IGVuY29kZWQgYmVmb3JlIHBhc3NpbmcgdG8gdGhlIGNvbnN0cnVjdC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
408
|
+
/******************************************************************************
|
|
409
|
+
* API Gateway Target Configuration
|
|
410
|
+
*****************************************************************************/
|
|
411
|
+
/**
|
|
412
|
+
* HTTP methods supported by API Gateway
|
|
413
|
+
*/
|
|
414
|
+
var ApiGatewayHttpMethod;
|
|
415
|
+
(function (ApiGatewayHttpMethod) {
|
|
416
|
+
/** GET method */
|
|
417
|
+
ApiGatewayHttpMethod["GET"] = "GET";
|
|
418
|
+
/** POST method */
|
|
419
|
+
ApiGatewayHttpMethod["POST"] = "POST";
|
|
420
|
+
/** PUT method */
|
|
421
|
+
ApiGatewayHttpMethod["PUT"] = "PUT";
|
|
422
|
+
/** DELETE method */
|
|
423
|
+
ApiGatewayHttpMethod["DELETE"] = "DELETE";
|
|
424
|
+
/** PATCH method */
|
|
425
|
+
ApiGatewayHttpMethod["PATCH"] = "PATCH";
|
|
426
|
+
/** HEAD method */
|
|
427
|
+
ApiGatewayHttpMethod["HEAD"] = "HEAD";
|
|
428
|
+
/** OPTIONS method */
|
|
429
|
+
ApiGatewayHttpMethod["OPTIONS"] = "OPTIONS";
|
|
430
|
+
})(ApiGatewayHttpMethod || (exports.ApiGatewayHttpMethod = ApiGatewayHttpMethod = {}));
|
|
431
|
+
/**
|
|
432
|
+
* Configuration for API Gateway-based MCP targets
|
|
433
|
+
*
|
|
434
|
+
* This configuration connects your gateway to an Amazon API Gateway REST API stage.
|
|
435
|
+
* The gateway translates incoming MCP requests into HTTP requests to your REST API
|
|
436
|
+
* and handles response formatting.
|
|
437
|
+
*
|
|
438
|
+
* Key considerations:
|
|
439
|
+
* - API must be in the same account and region as the gateway
|
|
440
|
+
* - Only REST APIs are supported (no HTTP or WebSocket APIs)
|
|
441
|
+
* - API must use a public endpoint type
|
|
442
|
+
* - Methods with both AWS_IAM authorization and API key requirements are not supported
|
|
443
|
+
* - Proxy resources (e.g., `/pets/{proxy+}`) are not supported
|
|
444
|
+
*/
|
|
445
|
+
class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
446
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.ApiGatewayTargetConfiguration", version: "2.239.0-alpha.0" };
|
|
447
|
+
/**
|
|
448
|
+
* Create an API Gateway target configuration
|
|
449
|
+
*
|
|
450
|
+
* @param props The configuration properties
|
|
451
|
+
* @returns A new ApiGatewayTargetConfiguration instance
|
|
452
|
+
*/
|
|
453
|
+
static create(props) {
|
|
454
|
+
try {
|
|
455
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_ApiGatewayTargetConfigurationProps(props);
|
|
456
|
+
}
|
|
457
|
+
catch (error) {
|
|
458
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
459
|
+
Error.captureStackTrace(error, this.create);
|
|
460
|
+
}
|
|
461
|
+
throw error;
|
|
462
|
+
}
|
|
463
|
+
return new ApiGatewayTargetConfiguration(props);
|
|
464
|
+
}
|
|
465
|
+
targetType = target_base_1.McpTargetType.API_GATEWAY;
|
|
466
|
+
/**
|
|
467
|
+
* The REST API reference
|
|
468
|
+
*/
|
|
469
|
+
_restApi;
|
|
470
|
+
/**
|
|
471
|
+
* The ID of the REST API
|
|
472
|
+
*/
|
|
473
|
+
restApiId;
|
|
474
|
+
/**
|
|
475
|
+
* The stage name of the REST API
|
|
476
|
+
*/
|
|
477
|
+
stage;
|
|
478
|
+
/**
|
|
479
|
+
* Tool configuration for the API Gateway target
|
|
480
|
+
*/
|
|
481
|
+
apiGatewayToolConfiguration;
|
|
482
|
+
/**
|
|
483
|
+
* Metadata configuration for the API Gateway target
|
|
484
|
+
*/
|
|
485
|
+
metadataConfiguration;
|
|
486
|
+
constructor(props) {
|
|
487
|
+
super();
|
|
488
|
+
try {
|
|
489
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_ApiGatewayTargetConfigurationProps(props);
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
493
|
+
Error.captureStackTrace(error, ApiGatewayTargetConfiguration);
|
|
494
|
+
}
|
|
495
|
+
throw error;
|
|
496
|
+
}
|
|
497
|
+
this._restApi = props.restApi;
|
|
498
|
+
this.restApiId = props.restApi.restApiId;
|
|
499
|
+
this.stage = props.stage ?? props.restApi.deploymentStage.stageName;
|
|
500
|
+
this.apiGatewayToolConfiguration = props.apiGatewayToolConfiguration;
|
|
501
|
+
this.metadataConfiguration = props.metadataConfiguration;
|
|
502
|
+
this.validateConfiguration();
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Binds this configuration to a construct scope
|
|
506
|
+
* Sets up necessary permissions for the gateway to access the API Gateway
|
|
507
|
+
*
|
|
508
|
+
* @param _scope The construct scope
|
|
509
|
+
* @param gateway The gateway that will use this target
|
|
510
|
+
*/
|
|
511
|
+
bind(_scope, gateway) {
|
|
512
|
+
try {
|
|
513
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_IGateway(gateway);
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
517
|
+
Error.captureStackTrace(error, this.bind);
|
|
518
|
+
}
|
|
519
|
+
throw error;
|
|
520
|
+
}
|
|
521
|
+
// Grant permission to invoke the API Gateway REST API
|
|
522
|
+
// The gateway role needs this permission to make API calls to the REST API endpoints
|
|
523
|
+
// For more info on granting permission: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-api-gateway.html#gateway-target-api-gateway-outbound
|
|
524
|
+
gateway.role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
525
|
+
effect: iam.Effect.ALLOW,
|
|
526
|
+
actions: ['execute-api:Invoke'],
|
|
527
|
+
resources: [
|
|
528
|
+
this._restApi.arnForExecuteApi('*', '/*', this.stage),
|
|
529
|
+
],
|
|
530
|
+
}));
|
|
531
|
+
return { bound: true };
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Renders the MCP-specific configuration
|
|
535
|
+
*/
|
|
536
|
+
renderMcpConfiguration() {
|
|
537
|
+
return {
|
|
538
|
+
apiGateway: {
|
|
539
|
+
restApiId: this.restApiId,
|
|
540
|
+
stage: this.stage,
|
|
541
|
+
apiGatewayToolConfiguration: {
|
|
542
|
+
toolFilters: this.apiGatewayToolConfiguration.toolFilters.map(filter => ({
|
|
543
|
+
filterPath: filter.filterPath,
|
|
544
|
+
methods: filter.methods,
|
|
545
|
+
})),
|
|
546
|
+
...(this.apiGatewayToolConfiguration.toolOverrides && {
|
|
547
|
+
toolOverrides: this.apiGatewayToolConfiguration.toolOverrides.map(override => ({
|
|
548
|
+
path: override.path,
|
|
549
|
+
method: override.method,
|
|
550
|
+
name: override.name,
|
|
551
|
+
...(override.description && { description: override.description }),
|
|
552
|
+
})),
|
|
553
|
+
}),
|
|
554
|
+
},
|
|
555
|
+
...(this.metadataConfiguration && {
|
|
556
|
+
metadataConfiguration: {
|
|
557
|
+
...(this.metadataConfiguration.allowedQueryParameters && {
|
|
558
|
+
allowedQueryParameters: this.metadataConfiguration.allowedQueryParameters,
|
|
559
|
+
}),
|
|
560
|
+
...(this.metadataConfiguration.allowedRequestHeaders && {
|
|
561
|
+
allowedRequestHeaders: this.metadataConfiguration.allowedRequestHeaders,
|
|
562
|
+
}),
|
|
563
|
+
...(this.metadataConfiguration.allowedResponseHeaders && {
|
|
564
|
+
allowedResponseHeaders: this.metadataConfiguration.allowedResponseHeaders,
|
|
565
|
+
}),
|
|
566
|
+
},
|
|
567
|
+
}),
|
|
568
|
+
},
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Validates the configuration
|
|
573
|
+
* @internal
|
|
574
|
+
*/
|
|
575
|
+
validateConfiguration() {
|
|
576
|
+
// Validate REST API ID (skip if token)
|
|
577
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(this.restApiId)) {
|
|
578
|
+
const restApiIdErrors = (0, validation_helpers_1.validateStringField)({
|
|
579
|
+
value: this.restApiId,
|
|
580
|
+
fieldName: 'REST API ID',
|
|
581
|
+
minLength: 1,
|
|
582
|
+
maxLength: 256,
|
|
583
|
+
});
|
|
584
|
+
if (restApiIdErrors.length > 0) {
|
|
585
|
+
throw new validation_helpers_1.ValidationError(restApiIdErrors.join('\n'));
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
// Validate stage name (skip if token)
|
|
589
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(this.stage)) {
|
|
590
|
+
const stageErrors = (0, validation_helpers_1.validateStringField)({
|
|
591
|
+
value: this.stage,
|
|
592
|
+
fieldName: 'Stage name',
|
|
593
|
+
minLength: 1,
|
|
594
|
+
maxLength: 128,
|
|
595
|
+
});
|
|
596
|
+
if (stageErrors.length > 0) {
|
|
597
|
+
throw new validation_helpers_1.ValidationError(stageErrors.join('\n'));
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
// Validate tool filters
|
|
601
|
+
if (!this.apiGatewayToolConfiguration.toolFilters || this.apiGatewayToolConfiguration.toolFilters.length === 0) {
|
|
602
|
+
throw new validation_helpers_1.ValidationError('At least one tool filter is required for API Gateway target configuration');
|
|
603
|
+
}
|
|
604
|
+
// Validate each tool filter
|
|
605
|
+
for (const filter of this.apiGatewayToolConfiguration.toolFilters) {
|
|
606
|
+
this.validateToolFilter(filter);
|
|
607
|
+
}
|
|
608
|
+
// Validate tool overrides if provided
|
|
609
|
+
if (this.apiGatewayToolConfiguration.toolOverrides) {
|
|
610
|
+
for (const override of this.apiGatewayToolConfiguration.toolOverrides) {
|
|
611
|
+
this.validateToolOverride(override);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
// Validate metadata configuration if provided
|
|
615
|
+
if (this.metadataConfiguration) {
|
|
616
|
+
this.validateMetadataConfiguration(this.metadataConfiguration);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Validates metadata configuration
|
|
621
|
+
* @internal
|
|
622
|
+
*/
|
|
623
|
+
validateMetadataConfiguration(config) {
|
|
624
|
+
// Validate allowedQueryParameters
|
|
625
|
+
if (config.allowedQueryParameters !== undefined) {
|
|
626
|
+
this.validateMetadataArray(config.allowedQueryParameters, 'allowedQueryParameters', 1, 10, 1, 40);
|
|
627
|
+
}
|
|
628
|
+
// Validate allowedRequestHeaders
|
|
629
|
+
if (config.allowedRequestHeaders !== undefined) {
|
|
630
|
+
this.validateMetadataArray(config.allowedRequestHeaders, 'allowedRequestHeaders', 1, 10, 1, 100);
|
|
631
|
+
}
|
|
632
|
+
// Validate allowedResponseHeaders
|
|
633
|
+
if (config.allowedResponseHeaders !== undefined) {
|
|
634
|
+
this.validateMetadataArray(config.allowedResponseHeaders, 'allowedResponseHeaders', 1, 10, 1, 100);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Validates a metadata configuration array (query parameters or headers)
|
|
639
|
+
* @param array The array to validate
|
|
640
|
+
* @param fieldName The name of the field for error messages
|
|
641
|
+
* @param minItems Minimum number of items allowed in the array
|
|
642
|
+
* @param maxItems Maximum number of items allowed in the array
|
|
643
|
+
* @param minStringLength Minimum length for each string in the array
|
|
644
|
+
* @param maxStringLength Maximum length for each string in the array
|
|
645
|
+
* @internal
|
|
646
|
+
*/
|
|
647
|
+
validateMetadataArray(array, fieldName, minItems, maxItems, minStringLength, maxStringLength) {
|
|
648
|
+
// Skip validation if the entire array is an unresolved token
|
|
649
|
+
if (aws_cdk_lib_1.Token.isUnresolved(array)) {
|
|
650
|
+
return;
|
|
651
|
+
}
|
|
652
|
+
// Check if array is empty
|
|
653
|
+
if (array.length === 0) {
|
|
654
|
+
throw new validation_helpers_1.ValidationError(`${fieldName} cannot be an empty array. It must contain at least ${minItems} item(s)`);
|
|
655
|
+
}
|
|
656
|
+
// Check array size constraints
|
|
657
|
+
if (array.length < minItems) {
|
|
658
|
+
throw new validation_helpers_1.ValidationError(`${fieldName} must contain at least ${minItems} item(s). Found ${array.length} item(s)`);
|
|
659
|
+
}
|
|
660
|
+
if (array.length > maxItems) {
|
|
661
|
+
throw new validation_helpers_1.ValidationError(`${fieldName} cannot exceed ${maxItems} items. Found ${array.length} items`);
|
|
662
|
+
}
|
|
663
|
+
// Validate each string in the array
|
|
664
|
+
array.forEach((item, index) => {
|
|
665
|
+
if (aws_cdk_lib_1.Token.isUnresolved(item)) {
|
|
666
|
+
return; // Skip validation for unresolved tokens
|
|
667
|
+
}
|
|
668
|
+
const errors = (0, validation_helpers_1.validateStringField)({
|
|
669
|
+
value: item,
|
|
670
|
+
fieldName: `${fieldName}[${index}]`,
|
|
671
|
+
minLength: minStringLength,
|
|
672
|
+
maxLength: maxStringLength,
|
|
673
|
+
});
|
|
674
|
+
if (errors.length > 0) {
|
|
675
|
+
throw new validation_helpers_1.ValidationError(errors.join('\n'));
|
|
676
|
+
}
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Validates a tool filter
|
|
681
|
+
* @internal
|
|
682
|
+
*/
|
|
683
|
+
validateToolFilter(filter) {
|
|
684
|
+
if (aws_cdk_lib_1.Token.isUnresolved(filter.filterPath)) {
|
|
685
|
+
return;
|
|
686
|
+
}
|
|
687
|
+
// Validate filter path
|
|
688
|
+
const pathErrors = (0, validation_helpers_1.validateFieldPattern)(filter.filterPath, 'Filter path', /^\/[\w\-{}/*]*$/, 'Filter path must start with a forward slash and contain only alphanumeric characters, hyphens, underscores, curly braces, forward slashes, and asterisks');
|
|
689
|
+
if (pathErrors.length > 0) {
|
|
690
|
+
throw new validation_helpers_1.ValidationError(pathErrors.join('\n'));
|
|
691
|
+
}
|
|
692
|
+
// Validate methods
|
|
693
|
+
if (!filter.methods || filter.methods.length === 0) {
|
|
694
|
+
throw new validation_helpers_1.ValidationError(`At least one HTTP method is required for filter path: ${filter.filterPath}`);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Validates a tool override
|
|
699
|
+
* @internal
|
|
700
|
+
*/
|
|
701
|
+
validateToolOverride(override) {
|
|
702
|
+
if (aws_cdk_lib_1.Token.isUnresolved(override.path)) {
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
// Validate that override path is explicit (no wildcards)
|
|
706
|
+
if (override.path.includes('*')) {
|
|
707
|
+
throw new validation_helpers_1.ValidationError(`Tool override path cannot contain wildcards. Path: ${override.path}. ` +
|
|
708
|
+
'Tool overrides must specify an explicit path that matches an existing operation in your API.');
|
|
709
|
+
}
|
|
710
|
+
// Validate override path format
|
|
711
|
+
const pathErrors = (0, validation_helpers_1.validateFieldPattern)(override.path, 'Override path', /^\/[\w\-{}/]*$/, 'Override path must start with a forward slash and contain only alphanumeric characters, hyphens, underscores, curly braces, and forward slashes');
|
|
712
|
+
if (pathErrors.length > 0) {
|
|
713
|
+
throw new validation_helpers_1.ValidationError(pathErrors.join('\n'));
|
|
714
|
+
}
|
|
715
|
+
// Validate override name
|
|
716
|
+
if (aws_cdk_lib_1.Token.isUnresolved(override.name)) {
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
const nameErrors = (0, validation_helpers_1.validateStringField)({
|
|
720
|
+
value: override.name,
|
|
721
|
+
fieldName: 'Override tool name',
|
|
722
|
+
minLength: 1,
|
|
723
|
+
maxLength: 64,
|
|
724
|
+
});
|
|
725
|
+
if (nameErrors.length > 0) {
|
|
726
|
+
throw new validation_helpers_1.ValidationError(nameErrors.join('\n'));
|
|
727
|
+
}
|
|
728
|
+
// Validate override description if provided
|
|
729
|
+
if (override.description && !aws_cdk_lib_1.Token.isUnresolved(override.description)) {
|
|
730
|
+
const descErrors = (0, validation_helpers_1.validateStringField)({
|
|
731
|
+
value: override.description,
|
|
732
|
+
fieldName: 'Override description',
|
|
733
|
+
minLength: 1,
|
|
734
|
+
maxLength: 200,
|
|
735
|
+
});
|
|
736
|
+
if (descErrors.length > 0) {
|
|
737
|
+
throw new validation_helpers_1.ValidationError(descErrors.join('\n'));
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
exports.ApiGatewayTargetConfiguration = ApiGatewayTargetConfiguration;
|
|
743
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YXJnZXQtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2Q0FBb0M7QUFFcEMsMkNBQTJDO0FBSTNDLDhEQUEwSDtBQUUxSCxvREFBcUQ7QUFFckQsK0NBQThDO0FBc0M5Qzs7K0VBRStFO0FBRS9FOzs7R0FHRztBQUNILE1BQXNCLHNCQUFzQjs7SUFpQjFDOzs7T0FHRztJQUNJLE9BQU87UUFDWixPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtTQUNuQyxDQUFDO0tBQ0g7O0FBekJILHdEQTBCQztBQUVEOzsrRUFFK0U7QUFFL0U7Ozs7O0dBS0c7QUFDSCxNQUFhLHlCQUEwQixTQUFRLHNCQUFzQjs7SUFDbkU7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FDbEIsY0FBeUIsRUFDekIsVUFBc0I7Ozs7Ozs7Ozs7UUFFdEIsT0FBTyxJQUFJLHlCQUF5QixDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUNsRTtJQUVlLFVBQVUsR0FBRywyQkFBYSxDQUFDLE1BQU0sQ0FBQztJQUVsRDs7T0FFRztJQUNhLGNBQWMsQ0FBWTtJQUUxQzs7T0FFRztJQUNhLFVBQVUsQ0FBYTtJQUV2QyxZQUFZLGNBQXlCLEVBQUUsVUFBc0I7UUFDM0QsS0FBSyxFQUFFLENBQUM7Ozs7OzsrQ0E1QkMseUJBQXlCOzs7O1FBNkJsQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztLQUM5QjtJQUVEOzs7Ozs7T0FNRztJQUNJLElBQUksQ0FBQyxLQUFnQixFQUFFLE9BQWlCOzs7Ozs7Ozs7O1FBQzdDLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztR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RUFBRSxvQkFBb0I7WUFDL0IsU0FBUyxFQUFFLENBQUM7WUFDWixTQUFTLEVBQUUsRUFBRTtTQUNkLENBQUMsQ0FBQztRQUVILElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksb0NBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELDRDQUE0QztRQUM1QyxJQUFJLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxNQUFNLFVBQVUsR0FBRyxJQUFBLHdDQUFtQixFQUFDO2dCQUNyQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFdBQVc7Z0JBQzNCLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFNBQVMsRUFBRSxHQUFHO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQixNQUFNLElBQUksb0NBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUM7S0FDRjs7QUF0V0gsc0VBdVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IElSZXN0QXBpIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBJRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElHYXRld2F5IH0gZnJvbSAnLi4vZ2F0ZXdheS1iYXNlJztcbmltcG9ydCB7IHZhbGlkYXRlT3BlbkFwaVNjaGVtYSwgdmFsaWRhdGVGaWVsZFBhdHRlcm4sIHZhbGlkYXRlU3RyaW5nRmllbGQsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uL3ZhbGlkYXRpb24taGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IEFwaVNjaGVtYSB9IGZyb20gJy4vc2NoZW1hL2FwaS1zY2hlbWEnO1xuaW1wb3J0IHsgQXNzZXRBcGlTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS9hcGktc2NoZW1hJztcbmltcG9ydCB0eXBlIHsgVG9vbFNjaGVtYSB9IGZyb20gJy4vc2NoZW1hL3Rvb2wtc2NoZW1hJztcbmltcG9ydCB7IE1jcFRhcmdldFR5cGUgfSBmcm9tICcuL3RhcmdldC1iYXNlJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcmV0dXJuZWQgYnkgYmluZGluZyBhIHRhcmdldCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYm91bmRcbiAgICovXG4gIHJlYWRvbmx5IGJvdW5kOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciB0YXJnZXQgY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHR5cGVcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFR5cGU6IE1jcFRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgcGVybWlzc2lvbnMgYW5kIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWc7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGNvbmZpZ3VyYXRpb24gYXMgQ2xvdWRGb3JtYXRpb24gcHJvcGVydGllc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9yZW5kZXIoKTogYW55O1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIE1DUCBUYXJnZXQgQ29uZmlndXJhdGlvbiBCYXNlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgTUNQIHRhcmdldCBjb25maWd1cmF0aW9uc1xuICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBNQ1AgdGFyZ2V0IHR5cGVzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIGltcGxlbWVudHMgSVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIHRhcmdldCB0eXBlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdGFyZ2V0VHlwZTogTWNwVGFyZ2V0VHlwZTtcblxuICAvKipcbiAgICogQmluZHMgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBwZXJtaXNzaW9ucyBhbmQgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWc7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnk7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGNvbmZpZ3VyYXRpb24gYXMgQ2xvdWRGb3JtYXRpb24gcHJvcGVydGllc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfcmVuZGVyKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1jcDogdGhpcy5yZW5kZXJNY3BDb25maWd1cmF0aW9uKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIExhbWJkYSBUYXJnZXQgQ29uZmlndXJhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIExhbWJkYS1iYXNlZCBNQ1AgdGFyZ2V0c1xuICpcbiAqIFRoaXMgY29uZmlndXJhdGlvbiB3cmFwcyBhIExhbWJkYSBmdW5jdGlvbiBhcyBNQ1AgdG9vbHMsXG4gKiBhbGxvd2luZyB0aGUgZ2F0ZXdheSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHRvIHByb3ZpZGUgdG9vbCBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFUYXJnZXRDb25maWd1cmF0aW9uIGV4dGVuZHMgTWNwVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBMYW1iZGEgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUZ1bmN0aW9uIFRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gaW52b2tlXG4gICAqIEBwYXJhbSB0b29sU2NoZW1hIFRoZSBzY2hlbWEgZGVmaW5pbmcgdGhlIHRvb2xzXG4gICAqIEByZXR1cm5zIEEgbmV3IExhbWJkYVRhcmdldENvbmZpZ3VyYXRpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgIGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb24sXG4gICAgdG9vbFNjaGVtYTogVG9vbFNjaGVtYSxcbiAgKTogTGFtYmRhVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFUYXJnZXRDb25maWd1cmF0aW9uKGxhbWJkYUZ1bmN0aW9uLCB0b29sU2NoZW1hKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRUeXBlID0gTWNwVGFyZ2V0VHlwZS5MQU1CREE7XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBNQ1Agc2VydmVyIGxvZ2ljXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHRvb2wgc2NoZW1hIHRoYXQgZGVmaW5lcyB0aGUgYXZhaWxhYmxlIHRvb2xzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9vbFNjaGVtYTogVG9vbFNjaGVtYTtcblxuICBjb25zdHJ1Y3RvcihsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uLCB0b29sU2NoZW1hOiBUb29sU2NoZW1hKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gbGFtYmRhRnVuY3Rpb247XG4gICAgdGhpcy50b29sU2NoZW1hID0gdG9vbFNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGludm9rZSB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBnYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGdhdGV3YXk6IElHYXRld2F5KTogVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gICAgLy8gQmluZCB0aGUgdG9vbCBzY2hlbWFcbiAgICB0aGlzLnRvb2xTY2hlbWEuYmluZChzY29wZSk7XG4gICAgLy8gR3JhbnQgcGVybWlzc2lvbnMgdG8gZ2F0ZXdheSByb2xlXG4gICAgdGhpcy50b29sU2NoZW1hLmdyYW50UGVybWlzc2lvbnNUb1JvbGUoZ2F0ZXdheS5yb2xlKTtcbiAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uLmdyYW50SW52b2tlKGdhdGV3YXkucm9sZSk7XG5cbiAgICByZXR1cm4geyBib3VuZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBsYW1iZGE6IHtcbiAgICAgICAgbGFtYmRhQXJuOiB0aGlzLmxhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgICB0b29sU2NoZW1hOiB0aGlzLnRvb2xTY2hlbWEuX3JlbmRlcigpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgT3BlbkFQSSBUYXJnZXQgQ29uZmlndXJhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIE9wZW5BUEktYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gZXhwb3NlcyBhbiBPcGVuQVBJL1JFU1QgQVBJIGFzIE1DUCB0b29scyxcbiAqIGFsbG93aW5nIHRoZSBnYXRld2F5IHRvIHRyYW5zZm9ybSBBUEkgb3BlcmF0aW9ucyBpbnRvIHRvb2wgY2FsbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuQXBpVGFyZ2V0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1jcFRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIE9wZW5BUEkgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGFwaVNjaGVtYSBUaGUgT3BlbkFQSSBzY2hlbWFcbiAgICogQHBhcmFtIHZhbGlkYXRlU2NoZW1hIFdoZXRoZXIgdG8gdmFsaWRhdGUgdGhlIE9wZW5BUEkgc2NoZW1hIChvbmx5IGFwcGxpZXMgdG8gaW5saW5lIHNjaGVtYXMpXG4gICAqIEByZXR1cm5zIEEgbmV3IE9wZW5BcGlUYXJnZXRDb25maWd1cmF0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShhcGlTY2hlbWE6IEFwaVNjaGVtYSwgdmFsaWRhdGVTY2hlbWE/OiBib29sZWFuKTogT3BlbkFwaVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgT3BlbkFwaVRhcmdldENvbmZpZ3VyYXRpb24oYXBpU2NoZW1hLCB2YWxpZGF0ZVNjaGVtYSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0VHlwZSA9IE1jcFRhcmdldFR5cGUuT1BFTkFQSV9TQ0hFTUE7XG5cbiAgLyoqXG4gICAqIFRoZSBPcGVuQVBJIHNjaGVtYSB0aGF0IGRlZmluZXMgdGhlIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaVNjaGVtYTogQXBpU2NoZW1hO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBPcGVuQVBJIHNjaGVtYVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRWYWxpZGF0ZVNjaGVtYTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihhcGlTY2hlbWE6IEFwaVNjaGVtYSwgdmFsaWRhdGVTY2hlbWE/OiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwaVNjaGVtYSA9IGFwaVNjaGVtYTtcbiAgICB0aGlzLnNob3VsZFZhbGlkYXRlU2NoZW1hID0gdmFsaWRhdGVTY2hlbWEgPz8gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGFjY2VzcyB0aGUgQVBJIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gZ2F0ZXdheSBUaGUgZ2F0ZXdheSB0aGF0IHdpbGwgdXNlIHRoaXMgdGFyZ2V0XG4gICAqL1xuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWcge1xuICAgIGlmICh0aGlzLnNob3VsZFZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICAvLyBGb3IgaW5saW5lIHNjaGVtYXNcbiAgICAgIGlmICh0aGlzLmFwaVNjaGVtYS5pbmxpbmVTY2hlbWEpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVPcGVuQXBpU2NoZW1hKHtcbiAgICAgICAgICBzY2hlbWE6IHRoaXMuYXBpU2NoZW1hLmlubGluZVNjaGVtYSxcbiAgICAgICAgICBzY2hlbWFOYW1lOiAnT3BlbkFQSSBzY2hlbWEgZm9yIHRhcmdldCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBPcGVuQVBJIHNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZDpcXG4ke2Vycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwaVNjaGVtYSBpbnN0YW5jZW9mIEFzc2V0QXBpU2NoZW1hKSB7XG4gICAgICAgIC8vIEZvciBhc3NldCBzY2hlbWFzIChsb2NhbCBmaWxlcylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzY2hlbWFDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9wZW5BcGlTY2hlbWEoe1xuICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFDb250ZW50LFxuICAgICAgICAgICAgc2NoZW1hTmFtZTogYE9wZW5BUEkgc2NoZW1hIGZyb20gZmlsZSAke3RoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBPcGVuQVBJIHNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZDpcXG4ke2Vycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCBPcGVuQVBJIHNjaGVtYSBmcm9tICR7dGhpcy5hcGlTY2hlbWEuX2dldEZpbGVQYXRoKCl9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFMzIHNjaGVtYXMgY2Fubm90IGJlIHZhbGlkYXRlZCBhdCBzeW50aGVzaXMgdGltZVxuICAgIH1cblxuICAgIC8vIEJpbmQgdGhlIEFQSSBzY2hlbWFcbiAgICB0aGlzLmFwaVNjaGVtYS5iaW5kKHNjb3BlKTtcbiAgICAvLyBHcmFudCBwZXJtaXNzaW9ucyB0byBnYXRld2F5IHJvbGUgaWYgc2NoZW1hIGlzIGluIFMzXG4gICAgdGhpcy5hcGlTY2hlbWEuZ3JhbnRQZXJtaXNzaW9uc1RvUm9sZShnYXRld2F5LnJvbGUpO1xuXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlbkFwaVNjaGVtYTogdGhpcy5hcGlTY2hlbWEuX3JlbmRlcigpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBTbWl0aHkgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBTbWl0aHktYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gZXhwb3NlcyBhIFNtaXRoeS1tb2RlbGVkIEFQSSBhcyBNQ1AgdG9vbHMsXG4gKiBhbGxvd2luZyB0aGUgZ2F0ZXdheSB0byB0cmFuc2Zvcm0gU21pdGh5IG9wZXJhdGlvbnMgaW50byB0b29sIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgU21pdGh5VGFyZ2V0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1jcFRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU21pdGh5IHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBzbWl0aHlNb2RlbCBUaGUgU21pdGh5IG1vZGVsIHNjaGVtYVxuICAgKiBAcmV0dXJucyBBIG5ldyBTbWl0aHlUYXJnZXRDb25maWd1cmF0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShzbWl0aHlNb2RlbDogQXBpU2NoZW1hKTogU21pdGh5VGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTbWl0aHlUYXJnZXRDb25maWd1cmF0aW9uKHNtaXRoeU1vZGVsKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRUeXBlID0gTWNwVGFyZ2V0VHlwZS5TTUlUSFlfTU9ERUw7XG5cbiAgLyoqXG4gICAqIFRoZSBTbWl0aHkgbW9kZWwgdGhhdCBkZWZpbmVzIHRoZSBBUElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzbWl0aHlNb2RlbDogQXBpU2NoZW1hO1xuXG4gIGNvbnN0cnVjdG9yKHNtaXRoeU1vZGVsOiBBcGlTY2hlbWEpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc21pdGh5TW9kZWwgPSBzbWl0aHlNb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGFjY2VzcyB0aGUgU21pdGh5IG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBnYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGdhdGV3YXk6IElHYXRld2F5KTogVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gICAgLy8gQmluZCB0aGUgU21pdGh5IG1vZGVsXG4gICAgdGhpcy5zbWl0aHlNb2RlbC5iaW5kKHNjb3BlKTtcbiAgICAvLyBHcmFudCBwZXJtaXNzaW9ucyB0byBnYXRld2F5IHJvbGUgaWYgc2NoZW1hIGlzIGluIFMzXG4gICAgdGhpcy5zbWl0aHlNb2RlbC5ncmFudFBlcm1pc3Npb25zVG9Sb2xlKGdhdGV3YXkucm9sZSk7XG5cbiAgICByZXR1cm4geyBib3VuZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBzbWl0aHlNb2RlbDogdGhpcy5zbWl0aHlNb2RlbC5fcmVuZGVyKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIE1DUCBTZXJ2ZXIgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBNQ1AgU2VydmVyLWJhc2VkIHRhcmdldHNcbiAqXG4gKiBNQ1AgKE1vZGVsIENvbnRleHQgUHJvdG9jb2wpIHNlcnZlcnMgcHJvdmlkZSB0b29scywgZGF0YSBhY2Nlc3MsIGFuZCBjdXN0b21cbiAqIGZ1bmN0aW9ucyBmb3IgQUkgYWdlbnRzLiBXaGVuIHlvdSBjb25maWd1cmUgYW4gTUNQIHNlcnZlciBhcyBhIGdhdGV3YXkgdGFyZ2V0LFxuICogdGhlIGdhdGV3YXkgYXV0b21hdGljYWxseSBkaXNjb3ZlcnMgYW5kIGluZGV4ZXMgYXZhaWxhYmxlIHRvb2xzIHRocm91Z2hcbiAqIHN5bmNocm9uaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBNQ1Agc2VydmVyIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgSFRUUFMgZW5kcG9pbnQgVVJMIG9mIHRoZSBNQ1Agc2VydmVyXG4gICAqIEByZXR1cm5zIEEgbmV3IE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGVuZHBvaW50OiBzdHJpbmcpOiBNY3BTZXJ2ZXJUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24oZW5kcG9pbnQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFR5cGUgPSBNY3BUYXJnZXRUeXBlLk1DUF9TRVJWRVI7XG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQUyBlbmRwb2ludCBVUkwgb2YgdGhlIE1DUCBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDtcbiAgICB0aGlzLnZhbGlkYXRlRW5kcG9pbnQoZW5kcG9pbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoaXMgY29uZmlndXJhdGlvbiB0byBhIGNvbnN0cnVjdCBzY29wZVxuICAgKiBObyBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBuZWVkZWQgZm9yIE1DUCBzZXJ2ZXIgdGFyZ2V0c1xuICAgKlxuICAgKiBAcGFyYW0gX3Njb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIF9nYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKF9zY29wZTogQ29uc3RydWN0LCBfZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnIHtcbiAgICAvLyBNQ1Agc2VydmVyIHRhcmdldHMgZG9uJ3QgcmVxdWlyZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHNldHVwXG4gICAgLy8gQXV0aGVudGljYXRpb24gaXMgaGFuZGxlZCB0aHJvdWdoIGNyZWRlbnRpYWwgcHJvdmlkZXIgY29uZmlndXJhdGlvbnNcbiAgICByZXR1cm4geyBib3VuZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtY3BTZXJ2ZXI6IHtcbiAgICAgICAgZW5kcG9pbnQ6IHRoaXMuZW5kcG9pbnQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBNQ1Agc2VydmVyIGVuZHBvaW50XG4gICAqIC0gTXVzdCB1c2UgSFRUUFMgcHJvdG9jb2xcbiAgICogLSBTaG91bGQgYmUgcHJvcGVybHkgVVJMIGVuY29kZWRcbiAgICpcbiAgICogQHBhcmFtIGVuZHBvaW50IFRoZSBlbmRwb2ludCBVUkwgdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBWYWxpZGF0aW9uRXJyb3IgaWYgdGhlIGVuZHBvaW50IGlzIGludmFsaWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoZW5kcG9pbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICBlbmRwb2ludCxcbiAgICAgICdNQ1Agc2VydmVyIGVuZHBvaW50JyxcbiAgICAgIC9eaHR0cHM6XFwvXFwvLisvLFxuICAgICAgJ01DUCBzZXJ2ZXIgZW5kcG9pbnQgbXVzdCB1c2UgSFRUUFMgcHJvdG9jb2wgKGUuZy4sIGh0dHBzOi8vbXktc2VydmVyLmV4YW1wbGUuY29tKS4gRW5zdXJlIHRoZSBVUkwgaXMgcHJvcGVybHkgZW5jb2RlZC4nLFxuICAgICk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpdGlvbmFsIGhlbHBmdWwgdmFsaWRhdGlvbiBmb3IgY29tbW9uIFVSTCBlbmNvZGluZyBpc3N1ZXNcbiAgICBpZiAoZW5kcG9pbnQuaW5jbHVkZXMoJyAnKSB8fCBlbmRwb2ludC5pbmNsdWRlcygnPCcpIHx8IGVuZHBvaW50LmluY2x1ZGVzKCc+JykpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdNQ1Agc2VydmVyIGVuZHBvaW50IGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgVVJMLWVuY29kZWQuICcgK1xuICAgICAgICAnUGxlYXNlIGVuc3VyZSB0aGUgVVJMIGlzIHByb3Blcmx5IGVuY29kZWQgYmVmb3JlIHBhc3NpbmcgdG8gdGhlIGNvbnN0cnVjdC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBBUEkgR2F0ZXdheSBUYXJnZXQgQ29uZmlndXJhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEhUVFAgbWV0aG9kcyBzdXBwb3J0ZWQgYnkgQVBJIEdhdGV3YXlcbiAqL1xuZXhwb3J0IGVudW0gQXBpR2F0ZXdheUh0dHBNZXRob2Qge1xuICAvKiogR0VUIG1ldGhvZCAqL1xuICBHRVQgPSAnR0VUJyxcbiAgLyoqIFBPU1QgbWV0aG9kICovXG4gIFBPU1QgPSAnUE9TVCcsXG4gIC8qKiBQVVQgbWV0aG9kICovXG4gIFBVVCA9ICdQVVQnLFxuICAvKiogREVMRVRFIG1ldGhvZCAqL1xuICBERUxFVEUgPSAnREVMRVRFJyxcbiAgLyoqIFBBVENIIG1ldGhvZCAqL1xuICBQQVRDSCA9ICdQQVRDSCcsXG4gIC8qKiBIRUFEIG1ldGhvZCAqL1xuICBIRUFEID0gJ0hFQUQnLFxuICAvKiogT1BUSU9OUyBtZXRob2QgKi9cbiAgT1BUSU9OUyA9ICdPUFRJT05TJyxcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBmaWx0ZXJpbmcgQVBJIEdhdGV3YXkgdG9vbHNcbiAqXG4gKiBUb29sIGZpbHRlcnMgYWxsb3cgeW91IHRvIHNlbGVjdCBSRVNUIEFQSSBvcGVyYXRpb25zIHVzaW5nIHBhdGggYW5kIG1ldGhvZCBjb21iaW5hdGlvbnMuXG4gKiBFYWNoIGZpbHRlciBzdXBwb3J0cyB0d28gcGF0aCBtYXRjaGluZyBzdHJhdGVnaWVzOlxuICogLSAqKkV4cGxpY2l0IHBhdGhzKio6IE1hdGNoZXMgYSBzaW5nbGUgc3BlY2lmaWMgcGF0aCwgc3VjaCBhcyBgL3BldHMve3BldElkfWBcbiAqIC0gKipXaWxkY2FyZCBwYXRocyoqOiBNYXRjaGVzIGFsbCBwYXRocyBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBzdWNoIGFzIGAvcGV0cy8qYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUdhdGV3YXlUb29sRmlsdGVyIHtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwYXRoIHRvIGZpbHRlclxuICAgKiBDYW4gYmUgYW4gZXhwbGljaXQgcGF0aCAoZS5nLiwgYC9wZXRzL3twZXRJZH1gKSBvciBhIHdpbGRjYXJkIHBhdGggKGUuZy4sIGAvcGV0cy8qYClcbiAgICogTXVzdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIEhUVFAgbWV0aG9kcyB0byBpbmNsdWRlIGZvciB0aGlzIHBhdGhcbiAgICogRWFjaCBmaWx0ZXIgc3BlY2lmaWVzIGJvdGggYSBwYXRoIGFuZCBhIGxpc3Qgb2YgSFRUUCBtZXRob2RzXG4gICAqIE11bHRpcGxlIGZpbHRlcnMgY2FuIG92ZXJsYXAgYW5kIGR1cGxpY2F0ZXMgYXJlIGF1dG9tYXRpY2FsbHkgZGUtZHVwbGljYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kczogQXBpR2F0ZXdheUh0dHBNZXRob2RbXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBvdmVycmlkaW5nIEFQSSBHYXRld2F5IHRvb2wgbWV0YWRhdGFcbiAqXG4gKiBUb29sIG92ZXJyaWRlcyBhbGxvdyB5b3UgdG8gY3VzdG9taXplIHRoZSB0b29sIG5hbWUgb3IgZGVzY3JpcHRpb24gZm9yIHNwZWNpZmljIG9wZXJhdGlvbnNcbiAqIGFmdGVyIGZpbHRlcmluZy4gRWFjaCBvdmVycmlkZSBtdXN0IHNwZWNpZnkgYW4gZXhwbGljaXQgcGF0aCBhbmQgYSBzaW5nbGUgSFRUUCBtZXRob2QuXG4gKiBUaGUgb3ZlcnJpZGUgbXVzdCBtYXRjaCBhbiBvcGVyYXRpb24gdGhhdCBleGlzdHMgaW4geW91ciBBUEkgYW5kIG11c3QgY29ycmVzcG9uZCB0byBvbmVcbiAqIG9mIHRoZSBvcGVyYXRpb25zIHJlc29sdmVkIGJ5IHlvdXIgZmlsdGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlHYXRld2F5VG9vbE92ZXJyaWRlIHtcbiAgLyoqXG4gICAqIFRoZSBleHBsaWNpdCByZXNvdXJjZSBwYXRoIChubyB3aWxkY2FyZHMpXG4gICAqIE11c3QgbWF0Y2ggYW4gb3BlcmF0aW9uIHRoYXQgZXhpc3RzIGluIHlvdXIgQVBJXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIG1ldGhvZCBmb3IgdGhpcyBvdmVycmlkZVxuICAgKiBNdXN0IGJlIGEgc2luZ2xlIG1ldGhvZCAobm8gd2lsZGNhcmRzKVxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kOiBBcGlHYXRld2F5SHR0cE1ldGhvZDtcblxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0b29sIG5hbWVcbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgb3BlcmF0aW9uSWQgZnJvbSB0aGUgT3BlbkFQSSBkZWZpbml0aW9uIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gZGVzY3JpcHRpb24gZm9yIHRoZSB0b29sXG4gICAqIEBkZWZhdWx0IC0gTm8gY3VzdG9tIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwYXNzaW5nIG1ldGFkYXRhIChoZWFkZXJzIGFuZCBxdWVyeSBwYXJhbWV0ZXJzKSB0byB0aGUgQVBJIEdhdGV3YXkgdGFyZ2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgcXVlcnkgcGFyYW1ldGVyIG5hbWVzIHRvIHBhc3MgdGhyb3VnaCB0byB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIENvbnN0cmFpbnRzOlxuICAgKiAtIEFycmF5IG11c3QgY29udGFpbiAxLTEwIGl0ZW1zXG4gICAqIC0gRWFjaCBwYXJhbWV0ZXIgbmFtZSBtdXN0IGJlIDEtNDAgY2hhcmFjdGVyc1xuICAgKiAtIENhbm5vdCBiZSBhbiBlbXB0eSBhcnJheVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHF1ZXJ5IHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aHJvdWdoXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcmVxdWVzdCBoZWFkZXIgbmFtZXMgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSB0YXJnZXRcbiAgICpcbiAgICogQ29uc3RyYWludHM6XG4gICAqIC0gQXJyYXkgbXVzdCBjb250YWluIDEtMTAgaXRlbXNcbiAgICogLSBFYWNoIGhlYWRlciBuYW1lIG11c3QgYmUgMS0xMDAgY2hhcmFjdGVyc1xuICAgKiAtIENhbm5vdCBiZSBhbiBlbXB0eSBhcnJheVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHJlcXVlc3QgaGVhZGVycyBhcmUgcGFzc2VkIHRocm91Z2hcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRSZXF1ZXN0SGVhZGVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHJlc3BvbnNlIGhlYWRlciBuYW1lcyB0byBwYXNzIHRocm91Z2ggZnJvbSB0aGUgdGFyZ2V0XG4gICAqXG4gICAqIENvbnN0cmFpbnRzOlxuICAgKiAtIEFycmF5IG11c3QgY29udGFpbiAxLTEwIGl0ZW1zXG4gICAqIC0gRWFjaCBoZWFkZXIgbmFtZSBtdXN0IGJlIDEtMTAwIGNoYXJhY3RlcnNcbiAgICogLSBDYW5ub3QgYmUgYW4gZW1wdHkgYXJyYXlcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyByZXNwb25zZSBoZWFkZXJzIGFyZSBwYXNzZWQgdGhyb3VnaFxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFJlc3BvbnNlSGVhZGVycz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIEFQSSBHYXRld2F5IHRvb2xzXG4gKlxuICogVGhlIEFQSSBHYXRld2F5IHRvb2wgY29uZmlndXJhdGlvbiBkZWZpbmVzIHdoaWNoIG9wZXJhdGlvbnMgZnJvbSB5b3VyIFJFU1QgQVBJXG4gKiBhcmUgZXhwb3NlZCBhcyB0b29scy4gSXQgcmVxdWlyZXMgYSBsaXN0IG9mIHRvb2wgZmlsdGVycyB0byBzZWxlY3Qgb3BlcmF0aW9uc1xuICogdG8gZXhwb3NlLCBhbmQgb3B0aW9uYWxseSBhY2NlcHRzIHRvb2wgb3ZlcnJpZGVzIHRvIGN1c3RvbWl6ZSB0b29sIG1ldGFkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHRvb2wgZmlsdGVycyB0byBzZWxlY3Qgb3BlcmF0aW9uc1xuICAgKiBBdCBsZWFzdCBvbmUgZmlsdGVyIGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSB0b29sRmlsdGVyczogQXBpR2F0ZXdheVRvb2xGaWx0ZXJbXTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgbGlzdCBvZiB0b29sIG92ZXJyaWRlcyB0byBjdXN0b21pemUgdG9vbCBtZXRhZGF0YVxuICAgKiBFYWNoIG92ZXJyaWRlIG11c3QgY29ycmVzcG9uZCB0byBhbiBvcGVyYXRpb24gc2VsZWN0ZWQgYnkgdGhlIGZpbHRlcnNcbiAgICogQGRlZmF1bHQgLSBObyB0b29sIG92ZXJyaWRlc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9vbE92ZXJyaWRlcz86IEFwaUdhdGV3YXlUb29sT3ZlcnJpZGVbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhbiBBUEkgR2F0ZXdheSB0YXJnZXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUdhdGV3YXlUYXJnZXRDb25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIFJFU1QgQVBJIHRvIGludGVncmF0ZSB3aXRoXG4gICAqIE11c3QgYmUgaW4gdGhlIHNhbWUgYWNjb3VudCBhbmQgcmVnaW9uIGFzIHRoZSBnYXRld2F5XG4gICAqL1xuICByZWFkb25seSByZXN0QXBpOiBJUmVzdEFwaTtcblxuICAvKipcbiAgICogVGhlIHN0YWdlIG5hbWUgb2YgdGhlIFJFU1QgQVBJXG4gICAqIEBkZWZhdWx0IC0gVXNlcyB0aGUgZGVwbG95bWVudCBzdGFnZSBmcm9tIHRoZSBSZXN0QXBpIChyZXN0QXBpLmRlcGxveW1lbnRTdGFnZS5zdGFnZU5hbWUpXG4gICAqL1xuICByZWFkb25seSBzdGFnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVG9vbCBjb25maWd1cmF0aW9uIGRlZmluaW5nIHdoaWNoIG9wZXJhdGlvbnMgdG8gZXhwb3NlXG4gICAqL1xuICByZWFkb25seSBhcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb246IEFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogTWV0YWRhdGEgY29uZmlndXJhdGlvbiBmb3IgcGFzc2luZyBoZWFkZXJzIGFuZCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEFsbG93cyB5b3UgdG8gcGFzcyBhZGRpdGlvbmFsIGNvbnRleHQgdGhyb3VnaCBoZWFkZXJzIGFuZCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEBkZWZhdWx0IC0gTm8gbWV0YWRhdGEgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YWRhdGFDb25maWd1cmF0aW9uPzogTWV0YWRhdGFDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIEFQSSBHYXRld2F5LWJhc2VkIE1DUCB0YXJnZXRzXG4gKlxuICogVGhpcyBjb25maWd1cmF0aW9uIGNvbm5lY3RzIHlvdXIgZ2F0ZXdheSB0byBhbiBBbWF6b24gQVBJIEdhdGV3YXkgUkVTVCBBUEkgc3RhZ2UuXG4gKiBUaGUgZ2F0ZXdheSB0cmFuc2xhdGVzIGluY29taW5nIE1DUCByZXF1ZXN0cyBpbnRvIEhUVFAgcmVxdWVzdHMgdG8geW91ciBSRVNUIEFQSVxuICogYW5kIGhhbmRsZXMgcmVzcG9uc2UgZm9ybWF0dGluZy5cbiAqXG4gKiBLZXkgY29uc2lkZXJhdGlvbnM6XG4gKiAtIEFQSSBtdXN0IGJlIGluIHRoZSBzYW1lIGFjY291bnQgYW5kIHJlZ2lvbiBhcyB0aGUgZ2F0ZXdheVxuICogLSBPbmx5IFJFU1QgQVBJcyBhcmUgc3VwcG9ydGVkIChubyBIVFRQIG9yIFdlYlNvY2tldCBBUElzKVxuICogLSBBUEkgbXVzdCB1c2UgYSBwdWJsaWMgZW5kcG9pbnQgdHlwZVxuICogLSBNZXRob2RzIHdpdGggYm90aCBBV1NfSUFNIGF1dGhvcml6YXRpb24gYW5kIEFQSSBrZXkgcmVxdWlyZW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkXG4gKiAtIFByb3h5IHJlc291cmNlcyAoZS5nLiwgYC9wZXRzL3twcm94eSt9YCkgYXJlIG5vdCBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUdhdGV3YXlUYXJnZXRDb25maWd1cmF0aW9uIGV4dGVuZHMgTWNwVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gQVBJIEdhdGV3YXkgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgQSBuZXcgQXBpR2F0ZXdheVRhcmdldENvbmZpZ3VyYXRpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKHByb3BzOiBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvblByb3BzKTogQXBpR2F0ZXdheVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgQXBpR2F0ZXdheVRhcmdldENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFR5cGUgPSBNY3BUYXJnZXRUeXBlLkFQSV9HQVRFV0FZO1xuXG4gIC8qKlxuICAgKiBUaGUgUkVTVCBBUEkgcmVmZXJlbmNlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXN0QXBpOiBJUmVzdEFwaTtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBSRVNUIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3RBcGlJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhZ2UgbmFtZSBvZiB0aGUgUkVTVCBBUElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGFnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUb29sIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBBUEkgR2F0ZXdheSB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb246IEFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogTWV0YWRhdGEgY29uZmlndXJhdGlvbiBmb3IgdGhlIEFQSSBHYXRld2F5IHRhcmdldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhQ29uZmlndXJhdGlvbj86IE1ldGFkYXRhQ29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQXBpR2F0ZXdheVRhcmdldENvbmZpZ3VyYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmVzdEFwaSA9IHByb3BzLnJlc3RBcGk7XG4gICAgdGhpcy5yZXN0QXBpSWQgPSBwcm9wcy5yZXN0QXBpLnJlc3RBcGlJZDtcbiAgICB0aGlzLnN0YWdlID0gcHJvcHMuc3RhZ2UgPz8gcHJvcHMucmVzdEFwaS5kZXBsb3ltZW50U3RhZ2Uuc3RhZ2VOYW1lO1xuICAgIHRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uID0gcHJvcHMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uO1xuICAgIHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uID0gcHJvcHMubWV0YWRhdGFDb25maWd1cmF0aW9uO1xuXG4gICAgdGhpcy52YWxpZGF0ZUNvbmZpZ3VyYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGFjY2VzcyB0aGUgQVBJIEdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIF9zY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBnYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKF9zY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWcge1xuICAgIC8vIEdyYW50IHBlcm1pc3Npb24gdG8gaW52b2tlIHRoZSBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICAgIC8vIFRoZSBnYXRld2F5IHJvbGUgbmVlZHMgdGhpcyBwZXJtaXNzaW9uIHRvIG1ha2UgQVBJIGNhbGxzIHRvIHRoZSBSRVNUIEFQSSBlbmRwb2ludHNcbiAgICAvLyBGb3IgbW9yZSBpbmZvIG9uIGdyYW50aW5nIHBlcm1pc3Npb246IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvZ2F0ZXdheS10YXJnZXQtYXBpLWdhdGV3YXkuaHRtbCNnYXRld2F5LXRhcmdldC1hcGktZ2F0ZXdheS1vdXRib3VuZFxuXG4gICAgZ2F0ZXdheS5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFsnZXhlY3V0ZS1hcGk6SW52b2tlJ10sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIHRoaXMuX3Jlc3RBcGkuYXJuRm9yRXhlY3V0ZUFwaSgnKicsICcvKicsIHRoaXMuc3RhZ2UpLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB7IGJvdW5kOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgTUNQLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXJNY3BDb25maWd1cmF0aW9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaUdhdGV3YXk6IHtcbiAgICAgICAgcmVzdEFwaUlkOiB0aGlzLnJlc3RBcGlJZCxcbiAgICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2UsXG4gICAgICAgIGFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHRvb2xGaWx0ZXJzOiB0aGlzLmFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbi50b29sRmlsdGVycy5tYXAoZmlsdGVyID0+ICh7XG4gICAgICAgICAgICBmaWx0ZXJQYXRoOiBmaWx0ZXIuZmlsdGVyUGF0aCxcbiAgICAgICAgICAgIG1ldGhvZHM6IGZpbHRlci5tZXRob2RzLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICAuLi4odGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbE92ZXJyaWRlcyAmJiB7XG4gICAgICAgICAgICB0b29sT3ZlcnJpZGVzOiB0aGlzLmFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbi50b29sT3ZlcnJpZGVzLm1hcChvdmVycmlkZSA9PiAoe1xuICAgICAgICAgICAgICBwYXRoOiBvdmVycmlkZS5wYXRoLFxuICAgICAgICAgICAgICBtZXRob2Q6IG92ZXJyaWRlLm1ldGhvZCxcbiAgICAgICAgICAgICAgbmFtZTogb3ZlcnJpZGUubmFtZSxcbiAgICAgICAgICAgICAgLi4uKG92ZXJyaWRlLmRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb246IG92ZXJyaWRlLmRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICAuLi4odGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24gJiYge1xuICAgICAgICAgIG1ldGFkYXRhQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgLi4uKHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgJiYge1xuICAgICAgICAgICAgICBhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzOiB0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbi5hbGxvd2VkUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi4odGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24uYWxsb3dlZFJlcXVlc3RIZWFkZXJzICYmIHtcbiAgICAgICAgICAgICAgYWxsb3dlZFJlcXVlc3RIZWFkZXJzOiB0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbi5hbGxvd2VkUmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLih0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbi5hbGxvd2VkUmVzcG9uc2VIZWFkZXJzICYmIHtcbiAgICAgICAgICAgICAgYWxsb3dlZFJlc3BvbnNlSGVhZGVyczogdGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24uYWxsb3dlZFJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgY29uZmlndXJhdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDb25maWd1cmF0aW9uKCk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIFJFU1QgQVBJIElEIChza2lwIGlmIHRva2VuKVxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMucmVzdEFwaUlkKSkge1xuICAgICAgY29uc3QgcmVzdEFwaUlkRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiB0aGlzLnJlc3RBcGlJZCxcbiAgICAgICAgZmllbGROYW1lOiAnUkVTVCBBUEkgSUQnLFxuICAgICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICAgIG1heExlbmd0aDogMjU2LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN0QXBpSWRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHJlc3RBcGlJZEVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgc3RhZ2UgbmFtZSAoc2tpcCBpZiB0b2tlbilcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLnN0YWdlKSkge1xuICAgICAgY29uc3Qgc3RhZ2VFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHRoaXMuc3RhZ2UsXG4gICAgICAgIGZpZWxkTmFtZTogJ1N0YWdlIG5hbWUnLFxuICAgICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICAgIG1heExlbmd0aDogMTI4LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGFnZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3Ioc3RhZ2VFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRvb2wgZmlsdGVyc1xuICAgIGlmICghdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbEZpbHRlcnMgfHwgdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbEZpbHRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdBdCBsZWFzdCBvbmUgdG9vbCBmaWx0ZXIgaXMgcmVxdWlyZWQgZm9yIEFQSSBHYXRld2F5IHRhcmdldCBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZWFjaCB0b29sIGZpbHRlclxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uLnRvb2xGaWx0ZXJzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlVG9vbEZpbHRlcihmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRvb2wgb3ZlcnJpZGVzIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uLnRvb2xPdmVycmlkZXMpIHtcbiAgICAgIGZvciAoY29uc3Qgb3ZlcnJpZGUgb2YgdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbE92ZXJyaWRlcykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVG9vbE92ZXJyaWRlKG92ZXJyaWRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZXRhZGF0YSBjb25maWd1cmF0aW9uIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTWV0YWRhdGFDb25maWd1cmF0aW9uKHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIG1ldGFkYXRhIGNvbmZpZ3VyYXRpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTWV0YWRhdGFDb25maWd1cmF0aW9uKGNvbmZpZzogTWV0YWRhdGFDb25maWd1cmF0aW9uKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgYWxsb3dlZFF1ZXJ5UGFyYW1ldGVyc1xuICAgIGlmIChjb25maWcuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTWV0YWRhdGFBcnJheShcbiAgICAgICAgY29uZmlnLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICdhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzJyxcbiAgICAgICAgMSxcbiAgICAgICAgMTAsXG4gICAgICAgIDEsXG4gICAgICAgIDQwLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhbGxvd2VkUmVxdWVzdEhlYWRlcnNcbiAgICBpZiAoY29uZmlnLmFsbG93ZWRSZXF1ZXN0SGVhZGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTWV0YWRhdGFBcnJheShcbiAgICAgICAgY29uZmlnLmFsbG93ZWRSZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgJ2FsbG93ZWRSZXF1ZXN0SGVhZGVycycsXG4gICAgICAgIDEsXG4gICAgICAgIDEwLFxuICAgICAgICAxLFxuICAgICAgICAxMDAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFsbG93ZWRSZXNwb25zZUhlYWRlcnNcbiAgICBpZiAoY29uZmlnLmFsbG93ZWRSZXNwb25zZUhlYWRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52YWxpZGF0ZU1ldGFkYXRhQXJyYXkoXG4gICAgICAgIGNvbmZpZy5hbGxvd2VkUmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICAnYWxsb3dlZFJlc3BvbnNlSGVhZGVycycsXG4gICAgICAgIDEsXG4gICAgICAgIDEwLFxuICAgICAgICAxLFxuICAgICAgICAxMDAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBtZXRhZGF0YSBjb25maWd1cmF0aW9uIGFycmF5IChxdWVyeSBwYXJhbWV0ZXJzIG9yIGhlYWRlcnMpXG4gICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgZm9yIGVycm9yIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSBtaW5JdGVtcyBNaW5pbXVtIG51bWJlciBvZiBpdGVtcyBhbGxvd2VkIGluIHRoZSBhcnJheVxuICAgKiBAcGFyYW0gbWF4SXRlbXMgTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgYWxsb3dlZCBpbiB0aGUgYXJyYXlcbiAgICogQHBhcmFtIG1pblN0cmluZ0xlbmd0aCBNaW5pbXVtIGxlbmd0aCBmb3IgZWFjaCBzdHJpbmcgaW4gdGhlIGFycmF5XG4gICAqIEBwYXJhbSBtYXhTdHJpbmdMZW5ndGggTWF4aW11bSBsZW5ndGggZm9yIGVhY2ggc3RyaW5nIGluIHRoZSBhcnJheVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVNZXRhZGF0YUFycmF5KFxuICAgIGFycmF5OiBzdHJpbmdbXSxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBtaW5JdGVtczogbnVtYmVyLFxuICAgIG1heEl0ZW1zOiBudW1iZXIsXG4gICAgbWluU3RyaW5nTGVuZ3RoOiBudW1iZXIsXG4gICAgbWF4U3RyaW5nTGVuZ3RoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIFNraXAgdmFsaWRhdGlvbiBpZiB0aGUgZW50aXJlIGFycmF5IGlzIGFuIHVucmVzb2x2ZWQgdG9rZW5cbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGFycmF5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGFycmF5IGlzIGVtcHR5XG4gICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYCR7ZmllbGROYW1lfSBjYW5ub3QgYmUgYW4gZW1wdHkgYXJyYXkuIEl0IG11c3QgY29udGFpbiBhdCBsZWFzdCAke21pbkl0ZW1zfSBpdGVtKHMpYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYXJyYXkgc2l6ZSBjb25zdHJhaW50c1xuICAgIGlmIChhcnJheS5sZW5ndGggPCBtaW5JdGVtcykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYCR7ZmllbGROYW1lfSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5JdGVtc30gaXRlbShzKS4gRm91bmQgJHthcnJheS5sZW5ndGh9IGl0ZW0ocylgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXkubGVuZ3RoID4gbWF4SXRlbXMpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGAke2ZpZWxkTmFtZX0gY2Fubm90IGV4Y2VlZCAke21heEl0ZW1zfSBpdGVtcy4gRm91bmQgJHthcnJheS5sZW5ndGh9IGl0ZW1zYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZWFjaCBzdHJpbmcgaW4gdGhlIGFycmF5XG4gICAgYXJyYXkuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBTa2lwIHZhbGlkYXRpb24gZm9yIHVucmVzb2x2ZWQgdG9rZW5zXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgZmllbGROYW1lOiBgJHtmaWVsZE5hbWV9WyR7aW5kZXh9XWAsXG4gICAgICAgIG1pbkxlbmd0aDogbWluU3RyaW5nTGVuZ3RoLFxuICAgICAgICBtYXhMZW5ndGg6IG1heFN0cmluZ0xlbmd0aCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHRvb2wgZmlsdGVyXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRvb2xGaWx0ZXIoZmlsdGVyOiBBcGlHYXRld2F5VG9vbEZpbHRlcik6IHZvaWQge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoZmlsdGVyLmZpbHRlclBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZmlsdGVyIHBhdGhcbiAgICBjb25zdCBwYXRoRXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICBmaWx0ZXIuZmlsdGVyUGF0aCxcbiAgICAgICdGaWx0ZXIgcGF0aCcsXG4gICAgICAvXlxcL1tcXHdcXC17fS8qXSokLyxcbiAgICAgICdGaWx0ZXIgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBmb3J3YXJkIHNsYXNoIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBjdXJseSBicmFjZXMsIGZvcndhcmQgc2xhc2hlcywgYW5kIGFzdGVyaXNrcycsXG4gICAgKTtcblxuICAgIGlmIChwYXRoRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IocGF0aEVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWV0aG9kc1xuICAgIGlmICghZmlsdGVyLm1ldGhvZHMgfHwgZmlsdGVyLm1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBBdCBsZWFzdCBvbmUgSFRUUCBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIGZpbHRlciBwYXRoOiAke2ZpbHRlci5maWx0ZXJQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSB0b29sIG92ZXJyaWRlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRvb2xPdmVycmlkZShvdmVycmlkZTogQXBpR2F0ZXdheVRvb2xPdmVycmlkZSk6IHZvaWQge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQob3ZlcnJpZGUucGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IG92ZXJyaWRlIHBhdGggaXMgZXhwbGljaXQgKG5vIHdpbGRjYXJkcylcbiAgICBpZiAob3ZlcnJpZGUucGF0aC5pbmNsdWRlcygnKicpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVG9vbCBvdmVycmlkZSBwYXRoIGNhbm5vdCBjb250YWluIHdpbGRjYXJkcy4gUGF0aDogJHtvdmVycmlkZS5wYXRofS4gYCArXG4gICAgICAgICdUb29sIG92ZXJyaWRlcyBtdXN0IHNwZWNpZnkgYW4gZXhwbGljaXQgcGF0aCB0aGF0IG1hdGNoZXMgYW4gZXhpc3Rpbmcgb3BlcmF0aW9uIGluIHlvdXIgQVBJLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG92ZXJyaWRlIHBhdGggZm9ybWF0XG4gICAgY29uc3QgcGF0aEVycm9ycyA9IHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICAgICAgb3ZlcnJpZGUucGF0aCxcbiAgICAgICdPdmVycmlkZSBwYXRoJyxcbiAgICAgIC9eXFwvW1xcd1xcLXt9L10qJC8sXG4gICAgICAnT3ZlcnJpZGUgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBmb3J3YXJkIHNsYXNoIGFuZCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBjdXJseSBicmFjZXMsIGFuZCBmb3J3YXJkIHNsYXNoZXMnLFxuICAgICk7XG5cbiAgICBpZiAocGF0aEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHBhdGhFcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG92ZXJyaWRlIG5hbWVcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKG92ZXJyaWRlLm5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZUVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgdmFsdWU6IG92ZXJyaWRlLm5hbWUsXG4gICAgICBmaWVsZE5hbWU6ICdPdmVycmlkZSB0b29sIG5hbWUnLFxuICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgbWF4TGVuZ3RoOiA2NCxcbiAgICB9KTtcblxuICAgIGlmIChuYW1lRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobmFtZUVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgb3ZlcnJpZGUgZGVzY3JpcHRpb24gaWYgcHJvdmlkZWRcbiAgICBpZiAob3ZlcnJpZGUuZGVzY3JpcHRpb24gJiYgIVRva2VuLmlzVW5yZXNvbHZlZChvdmVycmlkZS5kZXNjcmlwdGlvbikpIHtcbiAgICAgIGNvbnN0IGRlc2NFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IG92ZXJyaWRlLmRlc2NyaXB0aW9uLFxuICAgICAgICBmaWVsZE5hbWU6ICdPdmVycmlkZSBkZXNjcmlwdGlvbicsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAyMDAsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlc2NFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGRlc2NFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|