cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
204 lines • 30.9 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KinesisDataAnalyticsMonitoring = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const KinesisDataAnalyticsMetricFactory_1 = require("./KinesisDataAnalyticsMetricFactory");
const common_1 = require("../../common");
const dashboard_1 = require("../../dashboard");
class KinesisDataAnalyticsMonitoring extends common_1.Monitoring {
constructor(scope, props) {
super(scope, props);
const namingStrategy = new dashboard_1.MonitoringNamingStrategy({
...props,
fallbackConstructName: props.application,
});
this.title = namingStrategy.resolveHumanReadableName();
this.kinesisDataAnalyticsUrl = scope
.createAwsConsoleUrlFactory()
.getKinesisAnalyticsUrl(props.application);
const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName());
this.kdaAlarmFactory = new common_1.KinesisDataAnalyticsAlarmFactory(alarmFactory);
this.downtimeAnnotations = [];
this.fullRestartAnnotations = [];
this.checkpointFailureCountAnnotations = [];
this.checkpointFailureRateAnnotations = [];
const metricFactory = new KinesisDataAnalyticsMetricFactory_1.KinesisDataAnalyticsMetricFactory(scope.createMetricFactory(), props);
this.cpuUtilizationPercentMetric =
metricFactory.metricCpuUtilizationPercent();
this.downtimeMsMetric = metricFactory.metricDowntimeMs();
this.fullRestartsCountMetric = metricFactory.metricFullRestartsCount();
this.heapMemoryUtilizationPercentMetric =
metricFactory.metricHeapMemoryUtilizationPercent();
this.kpusCountMetric = metricFactory.metricKPUsCount();
this.lastCheckpointDurationMsMetric =
metricFactory.metricLastCheckpointDurationMs();
this.lastCheckpointSizeBytesMetric =
metricFactory.metricLastCheckpointSizeBytes();
this.numberOfFailedCheckpointsCountMetric =
metricFactory.metricNumberOfFailedCheckpointsCount();
this.oldGenerationGCCountMetric =
metricFactory.metricOldGenerationGCCount();
this.oldGenerationGCTimeMsMetric =
metricFactory.metricOldGenerationGCTimeMs();
this.checkpointFailureRateMetric =
metricFactory.metricCheckpointFailureRate();
for (const disambiguator in props.addDowntimeAlarm) {
const alarmProps = props.addDowntimeAlarm[disambiguator];
const createdAlarm = this.kdaAlarmFactory.addDowntimeAlarm(this.downtimeMsMetric, alarmProps, disambiguator);
this.downtimeAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addFullRestartCountAlarm) {
const alarmProps = props.addFullRestartCountAlarm[disambiguator];
const createdAlarm = this.kdaAlarmFactory.addFullRestartAlarm(this.fullRestartsCountMetric, alarmProps, disambiguator);
this.fullRestartAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addCheckpointFailureCountAlarm) {
const alarmProps = props.addCheckpointFailureCountAlarm[disambiguator];
const createdAlarm = this.kdaAlarmFactory.addCheckpointFailureCountAlarm(this.numberOfFailedCheckpointsCountMetric, alarmProps, disambiguator);
this.checkpointFailureCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addCheckpointFailureRateAlarm) {
const alarmProps = props.addCheckpointFailureRateAlarm[disambiguator];
const createdAlarm = this.kdaAlarmFactory.addCheckpointFailureRateAlarm(this.checkpointFailureRateMetric, alarmProps, disambiguator);
this.checkpointFailureRateAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
props.useCreatedAlarms?.consume(this.createdAlarms());
}
summaryWidgets() {
return [
this.createTitleWidget(),
...this.createSummaryWidgetRow(common_1.DefaultSummaryWidgetHeight),
];
}
widgets() {
return [
this.createTitleWidget(),
...this.createSummaryWidgetRow(common_1.DefaultGraphWidgetHeight),
...this.createCheckpointAndGcWidgets(),
];
}
createTitleWidget() {
return new dashboard_1.MonitoringHeaderWidget({
family: "Kinesis Data Analytics",
title: this.title,
goToLinkUrl: this.kinesisDataAnalyticsUrl,
});
}
createKPUWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "KPU Usage",
left: [this.kpusCountMetric],
leftYAxis: common_1.CountAxisFromZero,
});
}
createResourceUtilizationWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Resource Utilization",
left: [
this.cpuUtilizationPercentMetric,
this.heapMemoryUtilizationPercentMetric,
],
leftYAxis: common_1.PercentageAxisFromZeroToHundred,
});
}
createDownTimeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Down Time",
left: [this.downtimeMsMetric],
leftYAxis: common_1.TimeAxisMillisFromZero,
leftAnnotations: this.downtimeAnnotations,
});
}
createFullRestartsWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Full Restarts",
left: [this.fullRestartsCountMetric],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.fullRestartAnnotations,
});
}
createNumberOfFailedCheckpointsWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Checkpoint Failures",
left: [this.numberOfFailedCheckpointsCountMetric],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.checkpointFailureCountAnnotations,
right: [this.checkpointFailureRateMetric],
rightYAxis: common_1.RateAxisFromZero,
rightAnnotations: this.checkpointFailureRateAnnotations,
});
}
createLastCheckpointDurationWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Checkpoint Duration",
left: [this.lastCheckpointDurationMsMetric],
leftYAxis: common_1.TimeAxisMillisFromZero,
});
}
createLastCheckpointSizeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Checkpoint Size",
left: [this.lastCheckpointSizeBytesMetric],
leftYAxis: common_1.SizeAxisBytesFromZero,
});
}
createGarbageCollectionWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Garbage Collection",
left: [this.oldGenerationGCCountMetric],
leftYAxis: common_1.CountAxisFromZero,
right: [this.oldGenerationGCTimeMsMetric],
rightYAxis: common_1.TimeAxisMillisFromZero,
});
}
createSummaryWidgetRow(height) {
return [
// KPUs
this.createKPUWidget(common_1.QuarterWidth, height),
// CPU And Heap Usage
this.createResourceUtilizationWidget(common_1.QuarterWidth, height),
// Down Time and Up Time
this.createDownTimeWidget(common_1.QuarterWidth, height),
// Full Restarts
this.createFullRestartsWidget(common_1.QuarterWidth, height),
];
}
createCheckpointAndGcWidgets() {
return [
// Checkpointing
this.createNumberOfFailedCheckpointsWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight),
// Checkpoint Duration
this.createLastCheckpointDurationWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight),
// Checkpoint Size
this.createLastCheckpointSizeWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight),
// Garbage Collection
this.createGarbageCollectionWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight),
];
}
}
exports.KinesisDataAnalyticsMonitoring = KinesisDataAnalyticsMonitoring;
_a = JSII_RTTI_SYMBOL_1;
KinesisDataAnalyticsMonitoring[_a] = { fqn: "cdk-monitoring-constructs.KinesisDataAnalyticsMonitoring", version: "9.15.2" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2luZXNpc0RhdGFBbmFseXRpY3NNb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiS2luZXNpc0RhdGFBbmFseXRpY3NNb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0RBSW9DO0FBRXBDLDJGQUc2QztBQUM3Qyx5Q0FrQnNCO0FBQ3RCLCtDQUd5QjtBQWlCekIsTUFBYSw4QkFBK0IsU0FBUSxtQkFBVTtJQXNCNUQsWUFDRSxLQUFzQixFQUN0QixLQUEwQztRQUUxQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXBCLE1BQU0sY0FBYyxHQUFHLElBQUksb0NBQXdCLENBQUM7WUFDbEQsR0FBRyxLQUFLO1lBQ1IscUJBQXFCLEVBQUUsS0FBSyxDQUFDLFdBQVc7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSzthQUNqQywwQkFBMEIsRUFBRTthQUM1QixzQkFBc0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUMxQyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSx5Q0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO1FBRTNDLE1BQU0sYUFBYSxHQUFHLElBQUkscUVBQWlDLENBQ3pELEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUMz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Q0osQ0FBQztJQUVPLDRCQUE0QjtRQUNsQyxPQUFPO1lBQ0wsZ0JBQWdCO1lBQ2hCLElBQUksQ0FBQyxxQ0FBcUMsQ0FDeEMscUJBQVksRUFDWixpQ0FBd0IsQ0FDekI7WUFDRCxzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLGtDQUFrQyxDQUNyQyxxQkFBWSxFQUNaLGlDQUF3QixDQUN6QjtZQUNELGtCQUFrQjtZQUNsQixJQUFJLENBQUMsOEJBQThCLENBQ2pDLHFCQUFZLEVBQ1osaUNBQXdCLENBQ3pCO1lBQ0QscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyw2QkFBNkIsQ0FDaEMscUJBQVksRUFDWixpQ0FBd0IsQ0FDekI7U0FDRixDQUFDO0lBQ0osQ0FBQzs7QUE1UUgsd0VBNlFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JhcGhXaWRnZXQsXG4gIEhvcml6b250YWxBbm5vdGF0aW9uLFxuICBJV2lkZ2V0LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcblxuaW1wb3J0IHtcbiAgS2luZXNpc0RhdGFBbmFseXRpY3NNZXRyaWNGYWN0b3J5LFxuICBLaW5lc2lzRGF0YUFuYWx5dGljc01ldHJpY0ZhY3RvcnlQcm9wcyxcbn0gZnJvbSBcIi4vS2luZXNpc0RhdGFBbmFseXRpY3NNZXRyaWNGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBCYXNlTW9uaXRvcmluZ1Byb3BzLFxuICBDb3VudEF4aXNGcm9tWmVybyxcbiAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCxcbiAgRXJyb3JDb3VudFRocmVzaG9sZCxcbiAgRXJyb3JSYXRlVGhyZXNob2xkLFxuICBGdWxsUmVzdGFydENvdW50VGhyZXNob2xkLFxuICBLaW5lc2lzRGF0YUFuYWx5dGljc0FsYXJtRmFjdG9yeSxcbiAgTWF4RG93bnRpbWVUaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1vbml0b3JpbmcsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUGVyY2VudGFnZUF4aXNGcm9tWmVyb1RvSHVuZHJlZCxcbiAgUXVhcnRlcldpZHRoLFxuICBSYXRlQXhpc0Zyb21aZXJvLFxuICBTaXplQXhpc0J5dGVzRnJvbVplcm8sXG4gIFRpbWVBeGlzTWlsbGlzRnJvbVplcm8sXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdIZWFkZXJXaWRnZXQsXG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtpbmVzaXNEYXRhQW5hbHl0aWNzTW9uaXRvcmluZ09wdGlvbnNcbiAgZXh0ZW5kcyBCYXNlTW9uaXRvcmluZ1Byb3BzIHtcbiAgcmVhZG9ubHkgYWRkRG93bnRpbWVBbGFybT86IFJlY29yZDxzdHJpbmcsIE1heERvd250aW1lVGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRGdWxsUmVzdGFydENvdW50QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBGdWxsUmVzdGFydENvdW50VGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRDaGVja3BvaW50RmFpbHVyZUNvdW50QWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBFcnJvckNvdW50VGhyZXNob2xkPjtcblxuICByZWFkb25seSBhZGRDaGVja3BvaW50RmFpbHVyZVJhdGVBbGFybT86IFJlY29yZDxzdHJpbmcsIEVycm9yUmF0ZVRocmVzaG9sZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2luZXNpc0RhdGFBbmFseXRpY3NNb25pdG9yaW5nUHJvcHNcbiAgZXh0ZW5kcyBLaW5lc2lzRGF0YUFuYWx5dGljc01ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBLaW5lc2lzRGF0YUFuYWx5dGljc01vbml0b3JpbmdPcHRpb25zIHt9XG5cbmV4cG9ydCBjbGFzcyBLaW5lc2lzRGF0YUFuYWx5dGljc01vbml0b3JpbmcgZXh0ZW5kcyBNb25pdG9yaW5nIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcmVhZG9ubHkga2luZXNpc0RhdGFBbmFseXRpY3NVcmw/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkga2RhQWxhcm1GYWN0b3J5OiBLaW5lc2lzRGF0YUFuYWx5dGljc0FsYXJtRmFjdG9yeTtcbiAgcmVhZG9ubHkgZG93bnRpbWVBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgZnVsbFJlc3RhcnRBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludEZhaWx1cmVDb3VudEFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBjaGVja3BvaW50RmFpbHVyZVJhdGVBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICByZWFkb25seSBjcHVVdGlsaXphdGlvblBlcmNlbnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGRvd250aW1lTXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGZ1bGxSZXN0YXJ0c0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBoZWFwTWVtb3J5VXRpbGl6YXRpb25QZXJjZW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBrcHVzQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGxhc3RDaGVja3BvaW50RHVyYXRpb25Nc01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgbGFzdENoZWNrcG9pbnRTaXplQnl0ZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG51bWJlck9mRmFpbGVkQ2hlY2twb2ludHNDb3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgb2xkR2VuZXJhdGlvbkdDQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG9sZEdlbmVyYXRpb25HQ1RpbWVNc01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgY2hlY2twb2ludEZhaWx1cmVSYXRlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBNb25pdG9yaW5nU2NvcGUsXG4gICAgcHJvcHM6IEtpbmVzaXNEYXRhQW5hbHl0aWNzTW9uaXRvcmluZ1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgcHJvcHMpO1xuXG4gICAgY29uc3QgbmFtaW5nU3RyYXRlZ3kgPSBuZXcgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5KHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZmFsbGJhY2tDb25zdHJ1Y3ROYW1lOiBwcm9wcy5hcHBsaWNhdGlvbixcbiAgICB9KTtcbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5raW5lc2lzRGF0YUFuYWx5dGljc1VybCA9IHNjb3BlXG4gICAgICAuY3JlYXRlQXdzQ29uc29sZVVybEZhY3RvcnkoKVxuICAgICAgLmdldEtpbmVzaXNBbmFseXRpY3NVcmwocHJvcHMuYXBwbGljYXRpb24pO1xuXG4gICAgY29uc3QgYWxhcm1GYWN0b3J5ID0gdGhpcy5jcmVhdGVBbGFybUZhY3RvcnkoXG4gICAgICBuYW1pbmdTdHJhdGVneS5yZXNvbHZlQWxhcm1GcmllbmRseU5hbWUoKSxcbiAgICApO1xuICAgIHRoaXMua2RhQWxhcm1GYWN0b3J5ID0gbmV3IEtpbmVzaXNEYXRhQW5hbHl0aWNzQWxhcm1GYWN0b3J5KGFsYXJtRmFjdG9yeSk7XG4gICAgdGhpcy5kb3dudGltZUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5mdWxsUmVzdGFydEFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5jaGVja3BvaW50RmFpbHVyZUNvdW50QW5ub3RhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmNoZWNrcG9pbnRGYWlsdXJlUmF0ZUFubm90YXRpb25zID0gW107XG5cbiAgICBjb25zdCBtZXRyaWNGYWN0b3J5ID0gbmV3IEtpbmVzaXNEYXRhQW5hbHl0aWNzTWV0cmljRmFjdG9yeShcbiAgICAgIHNjb3BlLmNyZWF0ZU1ldHJpY0ZhY3RvcnkoKSxcbiAgICAgIHByb3BzLFxuICAgICk7XG5cbiAgICB0aGlzLmNwdVV0aWxpemF0aW9uUGVyY2VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0NwdVV0aWxpemF0aW9uUGVyY2VudCgpO1xuICAgIHRoaXMuZG93bnRpbWVNc01ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljRG93bnRpbWVNcygpO1xuICAgIHRoaXMuZnVsbFJlc3RhcnRzQ291bnRNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0Z1bGxSZXN0YXJ0c0NvdW50KCk7XG4gICAgdGhpcy5oZWFwTWVtb3J5VXRpbGl6YXRpb25QZXJjZW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljSGVhcE1lbW9yeVV0aWxpemF0aW9uUGVyY2VudCgpO1xuICAgIHRoaXMua3B1c0NvdW50TWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNLUFVzQ291bnQoKTtcbiAgICB0aGlzLmxhc3RDaGVja3BvaW50RHVyYXRpb25Nc01ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0xhc3RDaGVja3BvaW50RHVyYXRpb25NcygpO1xuICAgIHRoaXMubGFzdENoZWNrcG9pbnRTaXplQnl0ZXNNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNMYXN0Q2hlY2twb2ludFNpemVCeXRlcygpO1xuICAgIHRoaXMubnVtYmVyT2ZGYWlsZWRDaGVja3BvaW50c0NvdW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljTnVtYmVyT2ZGYWlsZWRDaGVja3BvaW50c0NvdW50KCk7XG4gICAgdGhpcy5vbGRHZW5lcmF0aW9uR0NDb3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY09sZEdlbmVyYXRpb25HQ0NvdW50KCk7XG4gICAgdGhpcy5vbGRHZW5lcmF0aW9uR0NUaW1lTXNNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNPbGRHZW5lcmF0aW9uR0NUaW1lTXMoKTtcbiAgICB0aGlzLmNoZWNrcG9pbnRGYWlsdXJlUmF0ZU1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0NoZWNrcG9pbnRGYWlsdXJlUmF0ZSgpO1xuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZERvd250aW1lQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGREb3dudGltZUFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5rZGFBbGFybUZhY3RvcnkuYWRkRG93bnRpbWVBbGFybShcbiAgICAgICAgdGhpcy5kb3dudGltZU1zTWV0cmljLFxuICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZG93bnRpbWVBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkRnVsbFJlc3RhcnRDb3VudEFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkRnVsbFJlc3RhcnRDb3VudEFsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID0gdGhpcy5rZGFBbGFybUZhY3RvcnkuYWRkRnVsbFJlc3RhcnRBbGFybShcbiAgICAgICAgdGhpcy5mdWxsUmVzdGFydHNDb3VudE1ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLmZ1bGxSZXN0YXJ0QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZENoZWNrcG9pbnRGYWlsdXJlQ291bnRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZENoZWNrcG9pbnRGYWlsdXJlQ291bnRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMua2RhQWxhcm1GYWN0b3J5LmFkZENoZWNrcG9pbnRGYWlsdXJlQ291bnRBbGFybShcbiAgICAgICAgdGhpcy5udW1iZXJPZkZhaWxlZENoZWNrcG9pbnRzQ291bnRNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5jaGVja3BvaW50RmFpbHVyZUNvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZENoZWNrcG9pbnRGYWlsdXJlUmF0ZUFsYXJtKSB7XG4gICAgICBjb25zdCBhbGFybVByb3BzID0gcHJvcHMuYWRkQ2hlY2twb2ludEZhaWx1cmVSYXRlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmtkYUFsYXJtRmFjdG9yeS5hZGRDaGVja3BvaW50RmFpbHVyZVJhdGVBbGFybShcbiAgICAgICAgdGhpcy5jaGVja3BvaW50RmFpbHVyZVJhdGVNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5jaGVja3BvaW50RmFpbHVyZVJhdGVBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG5cbiAgICBwcm9wcy51c2VDcmVhdGVkQWxhcm1zPy5jb25zdW1lKHRoaXMuY3JlYXRlZEFsYXJtcygpKTtcbiAgfVxuXG4gIHN1bW1hcnlXaWRnZXRzKCk6IElXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlVGl0bGVXaWRnZXQoKSxcbiAgICAgIC4uLnRoaXMuY3JlYXRlU3VtbWFyeVdpZGdldFJvdyhEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgLi4udGhpcy5jcmVhdGVTdW1tYXJ5V2lkZ2V0Um93KERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICAuLi50aGlzLmNyZWF0ZUNoZWNrcG9pbnRBbmRHY1dpZGdldHMoKSxcbiAgICBdO1xuICB9XG5cbiAgY3JlYXRlVGl0bGVXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0KHtcbiAgICAgIGZhbWlseTogXCJLaW5lc2lzIERhdGEgQW5hbHl0aWNzXCIsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGdvVG9MaW5rVXJsOiB0aGlzLmtpbmVzaXNEYXRhQW5hbHl0aWNzVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlS1BVV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIktQVSBVc2FnZVwiLFxuICAgICAgbGVmdDogW3RoaXMua3B1c0NvdW50TWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVSZXNvdXJjZVV0aWxpemF0aW9uV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlJlc291cmNlIFV0aWxpemF0aW9uXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMuY3B1VXRpbGl6YXRpb25QZXJjZW50TWV0cmljLFxuICAgICAgICB0aGlzLmhlYXBNZW1vcnlVdGlsaXphdGlvblBlcmNlbnRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBQZXJjZW50YWdlQXhpc0Zyb21aZXJvVG9IdW5kcmVkLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRG93blRpbWVXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRG93biBUaW1lXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5kb3dudGltZU1zTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5kb3dudGltZUFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRnVsbFJlc3RhcnRzV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkZ1bGwgUmVzdGFydHNcIixcbiAgICAgIGxlZnQ6IFt0aGlzLmZ1bGxSZXN0YXJ0c0NvdW50TWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuZnVsbFJlc3RhcnRBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZU51bWJlck9mRmFpbGVkQ2hlY2twb2ludHNXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiQ2hlY2twb2ludCBGYWlsdXJlc1wiLFxuICAgICAgbGVmdDogW3RoaXMubnVtYmVyT2ZGYWlsZWRDaGVja3BvaW50c0NvdW50TWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgICBsZWZ0QW5ub3RhdGlvbnM6IHRoaXMuY2hlY2twb2ludEZhaWx1cmVDb3VudEFubm90YXRpb25zLFxuICAgICAgcmlnaHQ6IFt0aGlzLmNoZWNrcG9pbnRGYWlsdXJlUmF0ZU1ldHJpY10sXG4gICAgICByaWdodFlBeGlzOiBSYXRlQXhpc0Zyb21aZXJvLFxuICAgICAgcmlnaHRBbm5vdGF0aW9uczogdGhpcy5jaGVja3BvaW50RmFpbHVyZVJhdGVBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUxhc3RDaGVja3BvaW50RHVyYXRpb25XaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiQ2hlY2twb2ludCBEdXJhdGlvblwiLFxuICAgICAgbGVmdDogW3RoaXMubGFzdENoZWNrcG9pbnREdXJhdGlvbk1zTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUxhc3RDaGVja3BvaW50U2l6ZVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJDaGVja3BvaW50IFNpemVcIixcbiAgICAgIGxlZnQ6IFt0aGlzLmxhc3RDaGVja3BvaW50U2l6ZUJ5dGVzTWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlR2FyYmFnZUNvbGxlY3Rpb25XaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiR2FyYmFnZSBDb2xsZWN0aW9uXCIsXG4gICAgICBsZWZ0OiBbdGhpcy5vbGRHZW5lcmF0aW9uR0NDb3VudE1ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgICAgcmlnaHQ6IFt0aGlzLm9sZEdlbmVyYXRpb25HQ1RpbWVNc01ldHJpY10sXG4gICAgICByaWdodFlBeGlzOiBUaW1lQXhpc01pbGxpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdW1tYXJ5V2lkZ2V0Um93KGhlaWdodDogbnVtYmVyKTogR3JhcGhXaWRnZXRbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIEtQVXNcbiAgICAgIHRoaXMuY3JlYXRlS1BVV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgaGVpZ2h0KSxcbiAgICAgIC8vIENQVSBBbmQgSGVhcCBVc2FnZVxuICAgICAgdGhpcy5jcmVhdGVSZXNvdXJjZVV0aWxpemF0aW9uV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgaGVpZ2h0KSxcbiAgICAgIC8vIERvd24gVGltZSBhbmQgVXAgVGltZVxuICAgICAgdGhpcy5jcmVhdGVEb3duVGltZVdpZGdldChRdWFydGVyV2lkdGgsIGhlaWdodCksXG4gICAgICAvLyBGdWxsIFJlc3RhcnRzXG4gICAgICB0aGlzLmNyZWF0ZUZ1bGxSZXN0YXJ0c1dpZGdldChRdWFydGVyV2lkdGgsIGhlaWdodCksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2hlY2twb2ludEFuZEdjV2lkZ2V0cygpOiBHcmFwaFdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gQ2hlY2twb2ludGluZ1xuICAgICAgdGhpcy5jcmVhdGVOdW1iZXJPZkZhaWxlZENoZWNrcG9pbnRzV2lkZ2V0KFxuICAgICAgICBRdWFydGVyV2lkdGgsXG4gICAgICAgIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgICAgICksXG4gICAgICAvLyBDaGVja3BvaW50IER1cmF0aW9uXG4gICAgICB0aGlzLmNyZWF0ZUxhc3RDaGVja3BvaW50RHVyYXRpb25XaWRnZXQoXG4gICAgICAgIFF1YXJ0ZXJXaWR0aCxcbiAgICAgICAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICAgICAgKSxcbiAgICAgIC8vIENoZWNrcG9pbnQgU2l6ZVxuICAgICAgdGhpcy5jcmVhdGVMYXN0Q2hlY2twb2ludFNpemVXaWRnZXQoXG4gICAgICAgIFF1YXJ0ZXJXaWR0aCxcbiAgICAgICAgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0LFxuICAgICAgKSxcbiAgICAgIC8vIEdhcmJhZ2UgQ29sbGVjdGlvblxuICAgICAgdGhpcy5jcmVhdGVHYXJiYWdlQ29sbGVjdGlvbldpZGdldChcbiAgICAgICAgUXVhcnRlcldpZHRoLFxuICAgICAgICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cbiJdfQ==