@aws-cdk/aws-bedrock-agentcore-alpha
Version:
The CDK Construct Library for Amazon Bedrock
171 lines • 28.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GatewayBase = exports.GatewayExceptionLevel = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const iam = require("aws-cdk-lib/aws-iam");
const perms_1 = require("./perms");
/******************************************************************************
* Enums
*****************************************************************************/
/**
* Exception levels for gateway
*/
var GatewayExceptionLevel;
(function (GatewayExceptionLevel) {
/**
* Debug mode for granular exception messages. Allows the return of
* specific error messages related to the gateway target configuration
* to help you with debugging.
*/
GatewayExceptionLevel["DEBUG"] = "DEBUG";
})(GatewayExceptionLevel || (exports.GatewayExceptionLevel = GatewayExceptionLevel = {}));
/******************************************************************************
* Base Class
*****************************************************************************/
class GatewayBase extends aws_cdk_lib_1.Resource {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.GatewayBase", version: "2.227.0-alpha.0" };
constructor(scope, id) {
super(scope, id);
}
// ------------------------------------------------------
// Permission Methods
// ------------------------------------------------------
/**
* Grants IAM actions to the IAM Principal
*
* @param grantee The principal to grant permissions to
* @param actions The actions to grant
*/
grant(grantee, ...actions) {
return iam.Grant.addToPrincipal({
grantee: grantee,
resourceArns: [this.gatewayArn],
actions: actions,
});
}
/**
* Grants `Get` and `List` actions on the Gateway
*
* @param grantee The principal to grant read permissions to
*/
grantRead(grantee) {
const resourceSpecificGrant = this.grant(grantee, ...perms_1.GatewayPerms.GET_PERMS);
const allResourceGrant = iam.Grant.addToPrincipal({
grantee: grantee,
resourceArns: ['*'],
actions: [...perms_1.GatewayPerms.LIST_PERMS],
});
// Return combined grant
return resourceSpecificGrant.combine(allResourceGrant);
}
/**
* Grants `Create`, `Update`, and `Delete` actions on the Gateway
*
* @param grantee The principal to grant manage permissions to
*/
grantManage(grantee) {
return this.grant(grantee, ...perms_1.GatewayPerms.MANAGE_PERMS);
}
/**
* Grants permission to invoke this Gateway
*
* @param grantee The principal to grant invoke permissions to
*/
grantInvoke(grantee) {
return this.grant(grantee, ...perms_1.GatewayPerms.INVOKE_PERMS);
}
// ------------------------------------------------------
// Metric Methods
// ------------------------------------------------------
/**
* Return the given named metric for this gateway.
*
* By default, the metric will be calculated as a sum over a period of 5 minutes.
* You can customize this by using the `statistic` and `period` properties.
*
* @param metricName The name of the metric
* @param dimensions Additional dimensions for the metric
* @param props Optional metric configuration
*/
metric(metricName, dimensions, props) {
const metricProps = {
namespace: 'AWS/Bedrock-AgentCore',
metricName,
dimensionsMap: { ...dimensions, Resource: this.gatewayArn },
...props,
};
return this.configureMetric(metricProps);
}
/**
* Return a metric containing the total number of invocations for this gateway.
*/
metricInvocations(props) {
return this.metric('Invocations', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Return a metric containing the number of throttled requests (429 status code) for this gateway.
*/
metricThrottles(props) {
return this.metric('Throttles', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Return a metric containing the number of system errors (5xx status code) for this gateway.
*/
metricSystemErrors(props) {
return this.metric('SystemErrors', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Return a metric containing the number of user errors (4xx status code, excluding 429) for this gateway.
*/
metricUserErrors(props) {
return this.metric('UserErrors', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Return a metric measuring the latency of requests for this gateway.
*
* The latency metric represents the time elapsed between when the service receives
* the request and when it begins sending the first response token.
*/
metricLatency(props) {
return this.metric('Latency', {}, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
}
/**
* Return a metric measuring the duration of requests for this gateway.
*
* The duration metric represents the total time elapsed between receiving the request
* and sending the final response token, representing complete end-to-end processing time.
*/
metricDuration(props) {
return this.metric('Duration', {}, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
}
/**
* Return a metric measuring the target execution time for this gateway.
*
* This metric helps determine the contribution of the target (Lambda, OpenAPI, etc.)
* to the total latency.
*/
metricTargetExecutionTime(props) {
return this.metric('TargetExecutionTime', {}, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
}
/**
* Return a metric containing the number of requests served by each target type for this gateway.
*/
metricTargetType(targetType, props) {
return this.metric('TargetType', { TargetType: targetType }, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
}
/**
* Internal method to create a metric.
* @internal
*/
configureMetric(props) {
return new aws_cloudwatch_1.Metric({
...props,
region: props?.region ?? this.stack.region,
account: props?.account ?? this.stack.account,
});
}
}
exports.GatewayBase = GatewayBase;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2F0ZXdheS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBa0Q7QUFDbEQsK0RBQXNHO0FBQ3RHLDJDQUEyQztBQUszQyxtQ0FBdUM7QUFHdkM7OytFQUUrRTtBQUMvRTs7R0FFRztBQUNILElBQVkscUJBT1g7QUFQRCxXQUFZLHFCQUFxQjtJQUMvQjs7OztPQUlHO0lBQ0gsd0NBQWUsQ0FBQTtBQUNqQixDQUFDLEVBUFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFPaEM7QUF5TUQ7OytFQUUrRTtBQUUvRSxNQUFzQixXQUFZLFNBQVEsc0JBQVE7O0lBZ0JoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCO0lBRUQseURBQXlEO0lBQ3pELHFCQUFxQjtJQUNyQix5REFBeUQ7SUFDekQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsT0FBdUIsRUFBRSxHQUFHLE9BQWlCO1FBQ3hELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDOUIsT0FBTyxFQUFFLE9BQU87WUFDaEIsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMvQixPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDLENBQUM7S0FDSjtJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsT0FBdUI7UUFDdEMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLG9CQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0UsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUNoRCxPQUFPLEVBQUUsT0FBTztZQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUMsR0FBRyxvQkFB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QUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxzQkFBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDbEc7SUFFRDs7O09BR0c7SUFDSyxlQUFlLENBQUMsS0FBa0I7UUFDeEMsT0FBTyxJQUFJLHVCQUFNLENBQUM7WUFDaEIsR0FBRyxLQUFLO1lBQ1IsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTztTQUM5QyxDQUFDLENBQUM7S0FDSjs7QUExS0gsa0NBMktDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVJlc291cmNlLCBSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnNNYXAsIE1ldHJpYywgTWV0cmljT3B0aW9ucywgTWV0cmljUHJvcHMsIFN0YXRzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG4vLyBJbnRlcm5hbCBpbXBvcnRzXG5pbXBvcnQgeyBJR2F0ZXdheUF1dGhvcml6ZXJDb25maWcgfSBmcm9tICcuL2luYm91bmQtYXV0aC9hdXRob3JpemVyJztcbmltcG9ydCB7IEdhdGV3YXlQZXJtcyB9IGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHsgSUdhdGV3YXlQcm90b2NvbENvbmZpZyB9IGZyb20gJy4vcHJvdG9jb2wnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1zXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEV4Y2VwdGlvbiBsZXZlbHMgZm9yIGdhdGV3YXlcbiAqL1xuZXhwb3J0IGVudW0gR2F0ZXdheUV4Y2VwdGlvbkxldmVsIHtcbiAgLyoqXG4gICAqIERlYnVnIG1vZGUgZm9yIGdyYW51bGFyIGV4Y2VwdGlvbiBtZXNzYWdlcy4gQWxsb3dzIHRoZSByZXR1cm4gb2ZcbiAgICogc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgcmVsYXRlZCB0byB0aGUgZ2F0ZXdheSB0YXJnZXQgY29uZmlndXJhdGlvblxuICAgKiB0byBoZWxwIHlvdSB3aXRoIGRlYnVnZ2luZy5cbiAgICovXG4gIERFQlVHID0gJ0RFQlVHJyxcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIEdhdGV3YXkgcmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUdhdGV3YXkgZXh0ZW5kcyBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgZ2F0ZXdheSByZXNvdXJjZVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgZ2F0ZXdheVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGFjY2VzcyBBV1Mgc2VydmljZXNcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBnYXRld2F5XG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnYXRld2F5XG4gICAqL1xuICByZWFkb25seSBwcm90b2NvbENvbmZpZ3VyYXRpb246IElHYXRld2F5UHJvdG9jb2xDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRob3JpemVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnYXRld2F5XG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemVyQ29uZmlndXJhdGlvbjogSUdhdGV3YXlBdXRob3JpemVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhjZXB0aW9uIGxldmVsIGZvciB0aGUgZ2F0ZXdheVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjZXB0aW9uTGV2ZWw/OiBHYXRld2F5RXhjZXB0aW9uTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBLTVMga2V5IHVzZWQgZm9yIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIGVuZHBvaW50IGZvciB0aGUgZ2F0ZXdheVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBnYXRld2F5VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBnYXRld2F5XG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyByZWFzb25zIGZvciB0aGUgZ2F0ZXdheS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzUmVhc29uPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCB3aGVuIHRoZSBnYXRld2F5IHdhcyBjcmVhdGVkXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGdhdGV3YXkgd2FzIGxhc3QgdXBkYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBJQU0gYWN0aW9ucyB0byB0aGUgSUFNIFByaW5jaXBhbFxuICAgKi9cbiAgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudHMgYEdldGAgYW5kIGBMaXN0YCBhY3Rpb25zIG9uIHRoZSBHYXRld2F5XG4gICAqL1xuICBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBgQ3JlYXRlYCwgYFVwZGF0ZWAsIGFuZCBgRGVsZXRlYCBhY3Rpb25zIG9uIHRoZSBHYXRld2F5XG4gICAqL1xuICBncmFudE1hbmFnZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoaXMgR2F0ZXdheVxuICAgKi9cbiAgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE1ldHJpY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBnYXRld2F5LlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWV0cmljXG4gICAqIEBwYXJhbSBkaW1lbnNpb25zIEFkZGl0aW9uYWwgZGltZW5zaW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAcGFyYW0gcHJvcHMgT3B0aW9uYWwgbWV0cmljIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIGRpbWVuc2lvbnM6IERpbWVuc2lvbnNNYXAsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIHRvdGFsIG51bWJlciBvZiBpbnZvY2F0aW9ucyBmb3IgdGhpcyBnYXRld2F5LlxuICAgKlxuICAgKiBUaGlzIG1ldHJpYyB0cmFja3MgYWxsIHN1Y2Nlc3NmdWwgaW52b2NhdGlvbnMgb2YgdGhlIGdhdGV3YXkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBPcHRpb25hbCBtZXRyaWMgY29uZmlndXJhdGlvblxuICAgKiBAZGVmYXVsdCAtIFN1bSBzdGF0aXN0aWMgb3ZlciA1IG1pbnV0ZXNcbiAgICovXG4gIG1ldHJpY0ludm9jYXRpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB0aHJvdHRsZWQgcmVxdWVzdHMgKDQyOSBzdGF0dXMgY29kZSkgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICpcbiAgICogVGhpcyBtZXRyaWMgaGVscHMgaWRlbnRpZnkgd2hlbiB0aGUgZ2F0ZXdheSBpcyByYXRlIGxpbWl0aW5nIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgT3B0aW9uYWwgbWV0cmljIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBTdW0gc3RhdGlzdGljIG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBtZXRyaWNUaHJvdHRsZXMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHN5c3RlbSBlcnJvcnMgKDV4eCBzdGF0dXMgY29kZSkgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICpcbiAgICogVGhpcyBtZXRyaWMgdHJhY2tzIGludGVybmFsIHNlcnZlciBlcnJvcnMgYW5kIHN5c3RlbSBmYWlsdXJlcy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIE9wdGlvbmFsIG1ldHJpYyBjb25maWd1cmF0aW9uXG4gICAqIEBkZWZhdWx0IC0gU3VtIHN0YXRpc3RpYyBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgbWV0cmljU3lzdGVtRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB1c2VyIGVycm9ycyAoNHh4IHN0YXR1cyBjb2RlLCBleGNsdWRpbmcgNDI5KSBmb3IgdGhpcyBnYXRld2F5LlxuICAgKlxuICAgKiBUaGlzIG1ldHJpYyB0cmFja3MgY2xpZW50IGVycm9ycyBsaWtlIGJhZCByZXF1ZXN0cywgdW5hdXRob3JpemVkIGFjY2VzcywgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgT3B0aW9uYWwgbWV0cmljIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBTdW0gc3RhdGlzdGljIG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBtZXRyaWNVc2VyRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgbGF0ZW5jeSBvZiByZXF1ZXN0cyBmb3IgdGhpcyBnYXRld2F5LlxuICAgKlxuICAgKiBUaGUgbGF0ZW5jeSBtZXRyaWMgcmVwcmVzZW50cyB0aGUgdGltZSBlbGFwc2VkIGJldHdlZW4gd2hlbiB0aGUgc2VydmljZSByZWNlaXZlc1xuICAgKiB0aGUgcmVxdWVzdCBhbmQgd2hlbiBpdCBiZWdpbnMgc2VuZGluZyB0aGUgZmlyc3QgcmVzcG9uc2UgdG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBPcHRpb25hbCBtZXRyaWMgY29uZmlndXJhdGlvblxuICAgKiBAZGVmYXVsdCAtIEF2ZXJhZ2Ugc3RhdGlzdGljIG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBtZXRyaWNMYXRlbmN5KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgZHVyYXRpb24gb2YgcmVxdWVzdHMgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICpcbiAgICogVGhlIGR1cmF0aW9uIG1ldHJpYyByZXByZXNlbnRzIHRoZSB0b3RhbCB0aW1lIGVsYXBzZWQgYmV0d2VlbiByZWNlaXZpbmcgdGhlIHJlcXVlc3RcbiAgICogYW5kIHNlbmRpbmcgdGhlIGZpbmFsIHJlc3BvbnNlIHRva2VuLCByZXByZXNlbnRpbmcgY29tcGxldGUgZW5kLXRvLWVuZCBwcm9jZXNzaW5nIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBPcHRpb25hbCBtZXRyaWMgY29uZmlndXJhdGlvblxuICAgKiBAZGVmYXVsdCAtIEF2ZXJhZ2Ugc3RhdGlzdGljIG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBtZXRyaWNEdXJhdGlvbihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBtZWFzdXJpbmcgdGhlIHRhcmdldCBleGVjdXRpb24gdGltZSBmb3IgdGhpcyBnYXRld2F5LlxuICAgKlxuICAgKiBUaGlzIG1ldHJpYyBoZWxwcyBkZXRlcm1pbmUgdGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgdGFyZ2V0IChMYW1iZGEsIE9wZW5BUEksIGV0Yy4pXG4gICAqIHRvIHRoZSB0b3RhbCBsYXRlbmN5LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgT3B0aW9uYWwgbWV0cmljIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBBdmVyYWdlIHN0YXRpc3RpYyBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgbWV0cmljVGFyZ2V0RXhlY3V0aW9uVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgc2VydmVkIGJ5IGVhY2ggdGFyZ2V0IHR5cGUgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldFR5cGUgVGhlIHR5cGUgb2YgdGFyZ2V0IChlLmcuLCAnTGFtYmRhJywgJ09wZW5BUEknLCAnU21pdGh5JylcbiAgICogQHBhcmFtIHByb3BzIE9wdGlvbmFsIG1ldHJpYyBjb25maWd1cmF0aW9uXG4gICAqIEBkZWZhdWx0IC0gU3VtIHN0YXRpc3RpYyBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgbWV0cmljVGFyZ2V0VHlwZSh0YXJnZXRUeXBlOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdhdGV3YXlCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJR2F0ZXdheSB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBnYXRld2F5QXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBnYXRld2F5SWQ6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcHJvdG9jb2xDb25maWd1cmF0aW9uOiBJR2F0ZXdheVByb3RvY29sQ29uZmlnO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYXV0aG9yaXplckNvbmZpZ3VyYXRpb246IElHYXRld2F5QXV0aG9yaXplckNvbmZpZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGV4Y2VwdGlvbkxldmVsPzogR2F0ZXdheUV4Y2VwdGlvbkxldmVsO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkga21zS2V5Pzoga21zLklLZXk7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBnYXRld2F5VXJsPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgc3RhdHVzUmVhc29uPzogc3RyaW5nW107XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB1cGRhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUGVybWlzc2lvbiBNZXRob2RzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogR3JhbnRzIElBTSBhY3Rpb25zIHRvIHRoZSBJQU0gUHJpbmNpcGFsXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGFjdGlvbnMgdG8gZ3JhbnRcbiAgICovXG4gIHB1YmxpYyBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZTogZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuZ2F0ZXdheUFybl0sXG4gICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBgR2V0YCBhbmQgYExpc3RgIGFjdGlvbnMgb24gdGhlIEdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCByZWFkIHBlcm1pc3Npb25zIHRvXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBjb25zdCByZXNvdXJjZVNwZWNpZmljR3JhbnQgPSB0aGlzLmdyYW50KGdyYW50ZWUsIC4uLkdhdGV3YXlQZXJtcy5HRVRfUEVSTVMpO1xuXG4gICAgY29uc3QgYWxsUmVzb3VyY2VHcmFudCA9IGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlOiBncmFudGVlLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbJyonXSxcbiAgICAgIGFjdGlvbnM6IFsuLi5HYXRld2F5UGVybXMuTElTVF9QRVJNU10sXG4gICAgfSk7XG4gICAgLy8gUmV0dXJuIGNvbWJpbmVkIGdyYW50XG4gICAgcmV0dXJuIHJlc291cmNlU3BlY2lmaWNHcmFudC5jb21iaW5lKGFsbFJlc291cmNlR3JhbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBgQ3JlYXRlYCwgYFVwZGF0ZWAsIGFuZCBgRGVsZXRlYCBhY3Rpb25zIG9uIHRoZSBHYXRld2F5XG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgbWFuYWdlIHBlcm1pc3Npb25zIHRvXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRNYW5hZ2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGdyYW50ZWUsIC4uLkdhdGV3YXlQZXJtcy5NQU5BR0VfUEVSTVMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGlzIEdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbCB0byBncmFudCBpbnZva2UgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgLi4uR2F0ZXdheVBlcm1zLklOVk9LRV9QRVJNUyk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTWV0cmljIE1ldGhvZHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBnYXRld2F5LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRyaWNcbiAgICogQHBhcmFtIGRpbWVuc2lvbnMgQWRkaXRpb25hbCBkaW1lbnNpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBwYXJhbSBwcm9wcyBPcHRpb25hbCBtZXRyaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIGRpbWVuc2lvbnM6IERpbWVuc2lvbnNNYXAsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgY29uc3QgbWV0cmljUHJvcHM6IE1ldHJpY1Byb3BzID0ge1xuICAgICAgbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJyxcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7IC4uLmRpbWVuc2lvbnMsIFJlc291cmNlOiB0aGlzLmdhdGV3YXlBcm4gfSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJlTWV0cmljKG1ldHJpY1Byb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIGludm9jYXRpb25zIGZvciB0aGlzIGdhdGV3YXkuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljSW52b2NhdGlvbnMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0ludm9jYXRpb25zJywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdGhyb3R0bGVkIHJlcXVlc3RzICg0Mjkgc3RhdHVzIGNvZGUpIGZvciB0aGlzIGdhdGV3YXkuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVGhyb3R0bGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdUaHJvdHRsZXMnLCB7fSwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzeXN0ZW0gZXJyb3JzICg1eHggc3RhdHVzIGNvZGUpIGZvciB0aGlzIGdhdGV3YXkuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU3lzdGVtRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTeXN0ZW1FcnJvcnMnLCB7fSwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB1c2VyIGVycm9ycyAoNHh4IHN0YXR1cyBjb2RlLCBleGNsdWRpbmcgNDI5KSBmb3IgdGhpcyBnYXRld2F5LlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1VzZXJFcnJvcnMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1VzZXJFcnJvcnMnLCB7fSwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgbGF0ZW5jeSBvZiByZXF1ZXN0cyBmb3IgdGhpcyBnYXRld2F5LlxuICAgKlxuICAgKiBUaGUgbGF0ZW5jeSBtZXRyaWMgcmVwcmVzZW50cyB0aGUgdGltZSBlbGFwc2VkIGJldHdlZW4gd2hlbiB0aGUgc2VydmljZSByZWNlaXZlc1xuICAgKiB0aGUgcmVxdWVzdCBhbmQgd2hlbiBpdCBiZWdpbnMgc2VuZGluZyB0aGUgZmlyc3QgcmVzcG9uc2UgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTGF0ZW5jeShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnTGF0ZW5jeScsIHt9LCB7IHN0YXRpc3RpYzogU3RhdHMuQVZFUkFHRSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgZHVyYXRpb24gb2YgcmVxdWVzdHMgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICpcbiAgICogVGhlIGR1cmF0aW9uIG1ldHJpYyByZXByZXNlbnRzIHRoZSB0b3RhbCB0aW1lIGVsYXBzZWQgYmV0d2VlbiByZWNlaXZpbmcgdGhlIHJlcXVlc3RcbiAgICogYW5kIHNlbmRpbmcgdGhlIGZpbmFsIHJlc3BvbnNlIHRva2VuLCByZXByZXNlbnRpbmcgY29tcGxldGUgZW5kLXRvLWVuZCBwcm9jZXNzaW5nIHRpbWUuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRHVyYXRpb24ocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0R1cmF0aW9uJywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5BVkVSQUdFLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgbWVhc3VyaW5nIHRoZSB0YXJnZXQgZXhlY3V0aW9uIHRpbWUgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICpcbiAgICogVGhpcyBtZXRyaWMgaGVscHMgZGV0ZXJtaW5lIHRoZSBjb250cmlidXRpb24gb2YgdGhlIHRhcmdldCAoTGFtYmRhLCBPcGVuQVBJLCBldGMuKVxuICAgKiB0byB0aGUgdG90YWwgbGF0ZW5jeS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNUYXJnZXRFeGVjdXRpb25UaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdUYXJnZXRFeGVjdXRpb25UaW1lJywge30sIHsgc3RhdGlzdGljOiBTdGF0cy5BVkVSQUdFLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHNlcnZlZCBieSBlYWNoIHRhcmdldCB0eXBlIGZvciB0aGlzIGdhdGV3YXkuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVGFyZ2V0VHlwZSh0YXJnZXRUeXBlOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdUYXJnZXRUeXBlJywgeyBUYXJnZXRUeXBlOiB0YXJnZXRUeXBlIH0sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBjcmVhdGUgYSBtZXRyaWMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVNZXRyaWMocHJvcHM6IE1ldHJpY1Byb3BzKSB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICByZWdpb246IHByb3BzPy5yZWdpb24gPz8gdGhpcy5zdGFjay5yZWdpb24sXG4gICAgICBhY2NvdW50OiBwcm9wcz8uYWNjb3VudCA/PyB0aGlzLnN0YWNrLmFjY291bnQsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==