UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

133 lines 22.8 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.KinesisDataStreamConsumerMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const KinesisDataStreamConsumerMetricFactory_1 = require("./KinesisDataStreamConsumerMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); class KinesisDataStreamConsumerMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope, props); const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, fallbackConstructName: `${props.streamName}-${props.consumerName}`, }); this.title = namingStrategy.resolveHumanReadableName(); this.streamUrl = scope .createAwsConsoleUrlFactory() .getKinesisDataStreamUrl(props.streamName); const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); this.kinesisAlarmFactory = new common_1.KinesisAlarmFactory(alarmFactory); this.ageAnnotations = []; this.rateExceededAnnotations = []; this.subscribeSuccessAnnotations = []; const metricFactory = new KinesisDataStreamConsumerMetricFactory_1.KinesisDataStreamConsumerMetricFactory(scope.createMetricFactory(), props); this.millisBehindLatestMetric = metricFactory.metricSubscribeToShardEventMillisBehindLatestMaxMs(); this.rateExceededMetric = metricFactory.metricSubscribeToShardRateExceededAverage(); this.subscribeToShardSuccessMetric = metricFactory.metricSubscribeToShardSuccessAverage(); this.subscribeToShardEventSuccessMetric = metricFactory.metricSubscribeToShardEventSuccessAverage(); this.recordsMetric = metricFactory.metricSubscribeToShardEventRecordsSumCount(); this.bytesMetric = metricFactory.metricSubscribeToShardEventSumBytes(); for (const disambiguator in props.addConsumerIteratorMaxAgeAlarm) { const alarmProps = props.addConsumerIteratorMaxAgeAlarm[disambiguator]; const createdAlarm = this.kinesisAlarmFactory.addConsumerIteratorMaxAgeAlarm(this.millisBehindLatestMetric, alarmProps, disambiguator); this.ageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addConsumerSubscribeToShardRateExceededAlarm) { const alarmProps = props.addConsumerSubscribeToShardRateExceededAlarm[disambiguator]; const createdAlarm = this.kinesisAlarmFactory.addConsumerSubscribeToShardRateExceededAlarm(this.rateExceededMetric, alarmProps, disambiguator); this.rateExceededAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addConsumerSubscribeToShardSuccessAlarm) { const alarmProps = props.addConsumerSubscribeToShardSuccessAlarm[disambiguator]; const createdAlarm = this.kinesisAlarmFactory.addConsumerSubscribeToShardSuccessAlarm(this.subscribeToShardSuccessMetric, alarmProps, disambiguator); this.subscribeSuccessAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); } summaryWidgets() { return [ this.createTitleWidget(), new aws_cloudwatch_1.Row(this.createMillisBehindLatestWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createSubscribeSuccessWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createRateExceededWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight)), ]; } widgets() { return [ this.createTitleWidget(), new aws_cloudwatch_1.Row(this.createMillisBehindLatestWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createSubscribeSuccessWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createRateExceededWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight)), new aws_cloudwatch_1.Row(this.createRecordsWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight), this.createBytesWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight)), ]; } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "Kinesis Data Stream Consumer", title: this.title, goToLinkUrl: this.streamUrl, }); } createMillisBehindLatestWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Iterator (Consumer)", left: [this.millisBehindLatestMetric], leftAnnotations: this.ageAnnotations, leftYAxis: common_1.TimeAxisMillisFromZero, }); } createSubscribeSuccessWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Subscribe Success", left: [ this.subscribeToShardSuccessMetric, this.subscribeToShardEventSuccessMetric, ], leftAnnotations: this.subscribeSuccessAnnotations, leftYAxis: common_1.RateAxisFromZeroToOne, }); } createRateExceededWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Rate Exceeded", left: [this.rateExceededMetric], leftAnnotations: this.rateExceededAnnotations, leftYAxis: common_1.RateAxisFromZeroToOne, }); } createRecordsWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Records", left: [this.recordsMetric], leftYAxis: common_1.CountAxisFromZero, }); } createBytesWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Bytes", left: [this.bytesMetric], leftYAxis: common_1.SizeAxisBytesFromZero, }); } } exports.KinesisDataStreamConsumerMonitoring = KinesisDataStreamConsumerMonitoring; _a = JSII_RTTI_SYMBOL_1; KinesisDataStreamConsumerMonitoring[_a] = { fqn: "cdk-monitoring-constructs.KinesisDataStreamConsumerMonitoring", version: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2luZXNpc0RhdGFTdHJlYW1Db25zdW1lck1vbml0b3JpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJLaW5lc2lzRGF0YVN0cmVhbUNvbnN1bWVyTW9uaXRvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtEQUtvQztBQUVwQyxxR0FHa0Q7QUFDbEQseUNBaUJzQjtBQUN0QiwrQ0FHeUI7QUFzQnpCLE1BQWEsbUNBQW9DLFNBQVEsbUJBQVU7SUFnQmpFLFlBQ0UsS0FBc0IsRUFDdEIsS0FBK0M7UUFFL0MsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwQixNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUF3QixDQUFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLHFCQUFxQixFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO1NBQ25FLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLO2FBQ25CLDBCQUEwQixFQUFFO2FBQzVCLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQzFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksNEJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsRUFBRSxDQUFDO1FBRXRDLE1BQU0sYUFBYSxHQUFHLElBQUksK0VBQXNDLENBQzlELEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUMzQixLQUFLLENBQ04sQ0FBQztRQUNGLElBQUksQ0FBQyx3QkFBd0I7WUFDM0IsYUFBYSxDQUFDLGtEQUFrRCxFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDLGtCQUFrQjtZQUNyQixhQUFhLENBQUMseUNBQXlDLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsNkJBQTZCO1lBQ2hDLGFBQWEsQ0FBQyxvQ0FBb0MsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxrQ0FBa0M7WUFDckMsYUFBYSxDQUFDLHlDQUF5QyxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGFBQWE7WUFDaEIsYUFBYSxDQUFDLDBDQUEwQyxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztRQUV2RSxLQUFLLE1BQU0sYUFBYSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RSxNQUFNLFlBQVksR0FDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLDhCQUE4QixDQUNyRCxJQUFJLENBQUMsd0JBQXdCLEVBQzdCLFVBQVUsRUFDVixhQUFhLENBQ2QsQ0FBQztZQUNKLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxLQUFLLE1BQU0sYUFBYSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsRUFBRSxDQUFDO1lBQy9FLE1BQU0sVUFBVSxHQUNkLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLDRDQUE0QyxDQUNuRSxJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLFVBQVUsRUFDVixhQUFhLENBQ2QsQ0FBQztZQUNKLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELEtBQUssTUFBTSxhQUFhLElBQUksS0FBSyxDQUFDLHVDQUF1QyxFQUFFLENBQUM7WUFDMUUsTUFBTSxVQUFVLEdBQ2QsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMsbUJBQW1CLENBQUMsdUNBQXVDLENBQzlELElBQUksQ0FBQyw2QkFBNkIsRUFDbEMsVUFBVSxFQUNWLGFBQWEsQ0FDZCxDQUFDO1lBQ0osSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU87WUFDTCxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSSxvQkFBRyxDQUNMLElBQUksQ0FBQyw4QkFBOEIsQ0FDakMscUJBQVksRUFDWixtQ0FBMEIsQ0FDM0IsRUFDRCxJQUFJLENBQUMsNEJBQTRCLENBQy9CLHFCQUFZLEVBQ1osbUNBQTBCLENBQzNCLEVBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFZLEVBQUUsbUNBQTBCLENBQUMsQ0FDeEU7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksb0JBQUcsQ0FDTCxJQUFJLENBQUMsOEJBQThCLENBQ2pDLHFCQUFZLEVBQ1osaUNBQXdCLENBQ3pCLEVBQ0QsSUFBSSxDQUFDLDRCQUE0QixDQUMvQixxQkFBWSxFQUNaLGlDQUF3QixDQUN6QixFQUNELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBWSxFQUFFLGlDQUF3QixDQUFDLENBQ3RFO1lBQ0QsSUFBSSxvQkFBRyxDQUNMLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBUyxFQUFFLGlDQUF3QixDQUFDLEVBQzdELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBUyxFQUFFLGlDQUF3QixDQUFDLENBQzVEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksa0NBQXNCLENBQUM7WUFDaEMsTUFBTSxFQUFFLDhCQUE4QjtZQUN0QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUMxRCxPQUFPLElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxxQkFBcUI7WUFDNUIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ3JDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNwQyxTQUFTLEVBQUUsK0JBQXNCO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUN4RCxPQUFPLElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsSUFBSSxFQUFFO2dCQUNKLElBQUksQ0FBQyw2QkFBNkI7Z0JBQ2xDLElBQUksQ0FBQyxrQ0FBa0M7YUFDeEM7WUFDRCxlQUFlLEVBQUUsSUFBSSxDQUFDLDJCQUEyQjtZQUNqRCxTQUFTLEVBQUUsOEJBQXFCO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNwRCxPQUFPLElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxlQUFlO1lBQ3RCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUMvQixlQUFlLEVBQUUsSUFBSSxDQUFDLHVCQUF1QjtZQUM3QyxTQUFTLEVBQUUsOEJBQXFCO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUMvQyxPQUFPLElBQUksNEJBQVcsQ0FBQztZQUNyQixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUssRUFBRSxTQUFTO1lBQ2hCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDMUIsU0FBUyxFQUFFLDBCQUFpQjtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBYSxFQUFFLE1BQWM7UUFDN0MsT0FBTyxJQUFJLDRCQUFXLENBQUM7WUFDckIsS0FBSztZQUNMLE1BQU07WUFDTixLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDeEIsU0FBUyxFQUFFLDhCQUFxQjtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQWxNSCxrRkFtTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHcmFwaFdpZGdldCxcbiAgSG9yaXpvbnRhbEFubm90YXRpb24sXG4gIElXaWRnZXQsXG4gIFJvdyxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB7XG4gIEtpbmVzaXNEYXRhU3RyZWFtQ29uc3VtZXJNZXRyaWNGYWN0b3J5LFxuICBLaW5lc2lzRGF0YVN0cmVhbUNvbnN1bWVyTWV0cmljRmFjdG9yeVByb3BzLFxufSBmcm9tIFwiLi9LaW5lc2lzRGF0YVN0cmVhbUNvbnN1bWVyTWV0cmljRmFjdG9yeVwiO1xuaW1wb3J0IHtcbiAgQmFzZU1vbml0b3JpbmdQcm9wcyxcbiAgQ29uc3VtZXJSYXRlRXhjZWVkZWRUaHJlc2hvbGQsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICBIYWxmV2lkdGgsXG4gIEtpbmVzaXNBbGFybUZhY3RvcnksXG4gIE1heEl0ZXJhdG9yQWdlVGhyZXNob2xkLFxuICBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0LFxuICBNaW5Db25zdW1lclN1YnNjcmliZVRvU2hhcmRTdWNjZXNzVGhyZXNob2xkLFxuICBNb25pdG9yaW5nLFxuICBNb25pdG9yaW5nU2NvcGUsXG4gIFF1YXJ0ZXJXaWR0aCxcbiAgUmF0ZUF4aXNGcm9tWmVyb1RvT25lLFxuICBTaXplQXhpc0J5dGVzRnJvbVplcm8sXG4gIFRpbWVBeGlzTWlsbGlzRnJvbVplcm8sXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdIZWFkZXJXaWRnZXQsXG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtpbmVzaXNEYXRhU3RyZWFtQ29uc3VtZXJNb25pdG9yaW5nT3B0aW9uc1xuICBleHRlbmRzIEJhc2VNb25pdG9yaW5nUHJvcHMge1xuICByZWFkb25seSBhZGRDb25zdW1lckl0ZXJhdG9yTWF4QWdlQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIE1heEl0ZXJhdG9yQWdlVGhyZXNob2xkXG4gID47XG4gIHJlYWRvbmx5IGFkZENvbnN1bWVyU3Vic2NyaWJlVG9TaGFyZFJhdGVFeGNlZWRlZEFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBDb25zdW1lclJhdGVFeGNlZWRlZFRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRDb25zdW1lclN1YnNjcmliZVRvU2hhcmRTdWNjZXNzQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIE1pbkNvbnN1bWVyU3Vic2NyaWJlVG9TaGFyZFN1Y2Nlc3NUaHJlc2hvbGRcbiAgPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLaW5lc2lzRGF0YVN0cmVhbUNvbnN1bWVyTW9uaXRvcmluZ1Byb3BzXG4gIGV4dGVuZHMgS2luZXNpc0RhdGFTdHJlYW1Db25zdW1lck1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBLaW5lc2lzRGF0YVN0cmVhbUNvbnN1bWVyTW9uaXRvcmluZ09wdGlvbnMge31cblxuZXhwb3J0IGNsYXNzIEtpbmVzaXNEYXRhU3RyZWFtQ29uc3VtZXJNb25pdG9yaW5nIGV4dGVuZHMgTW9uaXRvcmluZyB7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0cmVhbVVybD86IHN0cmluZztcblxuICByZWFkb25seSBraW5lc2lzQWxhcm1GYWN0b3J5OiBLaW5lc2lzQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSBhZ2VBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgcmF0ZUV4Y2VlZGVkQW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IHN1YnNjcmliZVN1Y2Nlc3NBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICByZWFkb25seSBtaWxsaXNCZWhpbmRMYXRlc3RNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHJhdGVFeGNlZWRlZE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgc3Vic2NyaWJlVG9TaGFyZFN1Y2Nlc3NNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHN1YnNjcmliZVRvU2hhcmRFdmVudFN1Y2Nlc3NNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHJlY29yZHNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGJ5dGVzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBNb25pdG9yaW5nU2NvcGUsXG4gICAgcHJvcHM6IEtpbmVzaXNEYXRhU3RyZWFtQ29uc3VtZXJNb25pdG9yaW5nUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBwcm9wcyk7XG5cbiAgICBjb25zdCBuYW1pbmdTdHJhdGVneSA9IG5ldyBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3koe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBmYWxsYmFja0NvbnN0cnVjdE5hbWU6IGAke3Byb3BzLnN0cmVhbU5hbWV9LSR7cHJvcHMuY29uc3VtZXJOYW1lfWAsXG4gICAgfSk7XG4gICAgdGhpcy50aXRsZSA9IG5hbWluZ1N0cmF0ZWd5LnJlc29sdmVIdW1hblJlYWRhYmxlTmFtZSgpO1xuICAgIHRoaXMuc3RyZWFtVXJsID0gc2NvcGVcbiAgICAgIC5jcmVhdGVBd3NDb25zb2xlVXJsRmFjdG9yeSgpXG4gICAgICAuZ2V0S2luZXNpc0RhdGFTdHJlYW1VcmwocHJvcHMuc3RyZWFtTmFtZSk7XG5cbiAgICBjb25zdCBhbGFybUZhY3RvcnkgPSB0aGlzLmNyZWF0ZUFsYXJtRmFjdG9yeShcbiAgICAgIG5hbWluZ1N0cmF0ZWd5LnJlc29sdmVBbGFybUZyaWVuZGx5TmFtZSgpLFxuICAgICk7XG4gICAgdGhpcy5raW5lc2lzQWxhcm1GYWN0b3J5ID0gbmV3IEtpbmVzaXNBbGFybUZhY3RvcnkoYWxhcm1GYWN0b3J5KTtcbiAgICB0aGlzLmFnZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5yYXRlRXhjZWVkZWRBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMuc3Vic2NyaWJlU3VjY2Vzc0Fubm90YXRpb25zID0gW107XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IEtpbmVzaXNEYXRhU3RyZWFtQ29uc3VtZXJNZXRyaWNGYWN0b3J5KFxuICAgICAgc2NvcGUuY3JlYXRlTWV0cmljRmFjdG9yeSgpLFxuICAgICAgcHJvcHMsXG4gICAgKTtcbiAgICB0aGlzLm1pbGxpc0JlaGluZExhdGVzdE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1N1YnNjcmliZVRvU2hhcmRFdmVudE1pbGxpc0JlaGluZExhdGVzdE1heE1zKCk7XG4gICAgdGhpcy5yYXRlRXhjZWVkZWRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNTdWJzY3JpYmVUb1NoYXJkUmF0ZUV4Y2VlZGVkQXZlcmFnZSgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9TaGFyZFN1Y2Nlc3NNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNTdWJzY3JpYmVUb1NoYXJkU3VjY2Vzc0F2ZXJhZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvU2hhcmRFdmVudFN1Y2Nlc3NNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNTdWJzY3JpYmVUb1NoYXJkRXZlbnRTdWNjZXNzQXZlcmFnZSgpO1xuICAgIHRoaXMucmVjb3Jkc01ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1N1YnNjcmliZVRvU2hhcmRFdmVudFJlY29yZHNTdW1Db3VudCgpO1xuICAgIHRoaXMuYnl0ZXNNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY1N1YnNjcmliZVRvU2hhcmRFdmVudFN1bUJ5dGVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkQ29uc3VtZXJJdGVyYXRvck1heEFnZUFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkQ29uc3VtZXJJdGVyYXRvck1heEFnZUFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID1cbiAgICAgICAgdGhpcy5raW5lc2lzQWxhcm1GYWN0b3J5LmFkZENvbnN1bWVySXRlcmF0b3JNYXhBZ2VBbGFybShcbiAgICAgICAgICB0aGlzLm1pbGxpc0JlaGluZExhdGVzdE1ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICB0aGlzLmFnZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkQ29uc3VtZXJTdWJzY3JpYmVUb1NoYXJkUmF0ZUV4Y2VlZGVkQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGRDb25zdW1lclN1YnNjcmliZVRvU2hhcmRSYXRlRXhjZWVkZWRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeS5hZGRDb25zdW1lclN1YnNjcmliZVRvU2hhcmRSYXRlRXhjZWVkZWRBbGFybShcbiAgICAgICAgICB0aGlzLnJhdGVFeGNlZWRlZE1ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICB0aGlzLnJhdGVFeGNlZWRlZEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkQ29uc3VtZXJTdWJzY3JpYmVUb1NoYXJkU3VjY2Vzc0FsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID1cbiAgICAgICAgcHJvcHMuYWRkQ29uc3VtZXJTdWJzY3JpYmVUb1NoYXJkU3VjY2Vzc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID1cbiAgICAgICAgdGhpcy5raW5lc2lzQWxhcm1GYWN0b3J5LmFkZENvbnN1bWVyU3Vic2NyaWJlVG9TaGFyZFN1Y2Nlc3NBbGFybShcbiAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvU2hhcmRTdWNjZXNzTWV0cmljLFxuICAgICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgIHRoaXMuc3Vic2NyaWJlU3VjY2Vzc0Fubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIHByb3BzLnVzZUNyZWF0ZWRBbGFybXM/LmNvbnN1bWUodGhpcy5jcmVhdGVkQWxhcm1zKCkpO1xuICB9XG5cbiAgc3VtbWFyeVdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVNaWxsaXNCZWhpbmRMYXRlc3RXaWRnZXQoXG4gICAgICAgICAgUXVhcnRlcldpZHRoLFxuICAgICAgICAgIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0aGlzLmNyZWF0ZVN1YnNjcmliZVN1Y2Nlc3NXaWRnZXQoXG4gICAgICAgICAgUXVhcnRlcldpZHRoLFxuICAgICAgICAgIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0aGlzLmNyZWF0ZVJhdGVFeGNlZWRlZFdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVNaWxsaXNCZWhpbmRMYXRlc3RXaWRnZXQoXG4gICAgICAgICAgUXVhcnRlcldpZHRoLFxuICAgICAgICAgIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5jcmVhdGVTdWJzY3JpYmVTdWNjZXNzV2lkZ2V0KFxuICAgICAgICAgIFF1YXJ0ZXJXaWR0aCxcbiAgICAgICAgICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuY3JlYXRlUmF0ZUV4Y2VlZGVkV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgICBuZXcgUm93KFxuICAgICAgICB0aGlzLmNyZWF0ZVJlY29yZHNXaWRnZXQoSGFsZldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZUJ5dGVzV2lkZ2V0KEhhbGZXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGNyZWF0ZVRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiS2luZXNpcyBEYXRhIFN0cmVhbSBDb25zdW1lclwiLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBnb1RvTGlua1VybDogdGhpcy5zdHJlYW1VcmwsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVNaWxsaXNCZWhpbmRMYXRlc3RXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiSXRlcmF0b3IgKENvbnN1bWVyKVwiLFxuICAgICAgbGVmdDogW3RoaXMubWlsbGlzQmVoaW5kTGF0ZXN0TWV0cmljXSxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5hZ2VBbm5vdGF0aW9ucyxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVN1YnNjcmliZVN1Y2Nlc3NXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiU3Vic2NyaWJlIFN1Y2Nlc3NcIixcbiAgICAgIGxlZnQ6IFtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1NoYXJkU3VjY2Vzc01ldHJpYyxcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1NoYXJkRXZlbnRTdWNjZXNzTWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5zdWJzY3JpYmVTdWNjZXNzQW5ub3RhdGlvbnMsXG4gICAgICBsZWZ0WUF4aXM6IFJhdGVBeGlzRnJvbVplcm9Ub09uZSxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVJhdGVFeGNlZWRlZFdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJSYXRlIEV4Y2VlZGVkXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5yYXRlRXhjZWVkZWRNZXRyaWNdLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLnJhdGVFeGNlZWRlZEFubm90YXRpb25zLFxuICAgICAgbGVmdFlBeGlzOiBSYXRlQXhpc0Zyb21aZXJvVG9PbmUsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVSZWNvcmRzV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlJlY29yZHNcIixcbiAgICAgIGxlZnQ6IFt0aGlzLnJlY29yZHNNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUJ5dGVzV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkJ5dGVzXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5ieXRlc01ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IFNpemVBeGlzQnl0ZXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxufVxuIl19