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

562 lines 79.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.MonitoringFacade = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const MonitoringAspect_1 = require("./MonitoringAspect"); const common_1 = require("../common"); const dashboard_1 = require("../dashboard"); const DynamicDashboardSegment_1 = require("../dashboard/DynamicDashboardSegment"); const monitoring_1 = require("../monitoring"); /** * An implementation of a {@link MonitoringScope}. * * This is a convenient main entrypoint to monitor resources. * * Provides methods for retrieving and creating alarms based on added segments that are subclasses of * {@link Monitoring}. */ class MonitoringFacade extends common_1.MonitoringScope { constructor(scope, id, props) { super(scope, id); this.metricFactoryDefaults = props?.metricFactoryDefaults ?? {}; this.alarmFactoryDefaults = props?.alarmFactoryDefaults ?? { alarmNamePrefix: id, actionsEnabled: true, }; this.dashboardFactory = props?.dashboardFactory ?? new dashboard_1.DefaultDashboardFactory(this, `${id}-Dashboards`, { dashboardNamePrefix: id, }); this.createdSegments = []; this.createdComposites = []; this.createdClones = []; } // FACTORIES // ========= createAlarmFactory(alarmNamePrefix) { return new common_1.AlarmFactory(this, { globalAlarmDefaults: this.alarmFactoryDefaults, globalMetricDefaults: this.metricFactoryDefaults, localAlarmNamePrefix: alarmNamePrefix, }); } createAwsConsoleUrlFactory() { const stack = aws_cdk_lib_1.Stack.of(this); const awsAccountId = this.metricFactoryDefaults.account ?? stack.account; const awsAccountRegion = this.metricFactoryDefaults.region ?? stack.region; return new common_1.AwsConsoleUrlFactory({ awsAccountRegion, awsAccountId }); } createMetricFactory() { return new common_1.MetricFactory(this, { globalDefaults: this.metricFactoryDefaults, }); } createWidgetFactory() { return new dashboard_1.DefaultWidgetFactory(); } // GENERIC // ======= /** * Adds a dashboard segment which returns dynamic content depending on dashboard type. * * @param segment dynamic segment to add. */ addDynamicSegment(segment) { this.dashboardFactory?.addDynamicSegment(segment); this.createdSegments.push(segment); return this; } /** * Adds a dashboard segment to go on one of the {@link DefaultDashboards}. * * @param segment segment to add * @param overrideProps props to specify which default dashboards this segment is added to. */ addSegment(segment, overrideProps) { const adaptedSegment = new DynamicDashboardSegment_1.StaticSegmentDynamicAdapter({ segment, overrideProps, }); this.dashboardFactory?.addDynamicSegment(adaptedSegment); this.createdSegments.push(segment); return this; } /** * @deprecated - prefer calling dashboardFactory.getDashboard directly. * * @returns default detail dashboard */ createdDashboard() { return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.DETAIL); } /** * @deprecated - prefer calling dashboardFactory.getDashboard directly. * * @returns default summary dashboard */ createdSummaryDashboard() { return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.SUMMARY); } /** * @deprecated - prefer calling dashboardFactory.getDashboard directly. * * @returns default alarms dashboard */ createdAlarmDashboard() { return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.ALARMS); } /** * Returns the created alarms across all added segments that subclass {@link Monitoring} * added up until now. */ createdAlarms() { const monitoringAlarms = this.createdMonitorings().flatMap((monitoring) => monitoring.createdAlarms()); return monitoringAlarms.concat(this.createdClones); } /** * Returns a subset of created alarms that are marked by a specific custom tag. * * @param customTag tag to filter alarms by */ createdAlarmsWithTag(customTag) { return this.createdAlarms().filter((alarm) => alarm.customTags?.includes(customTag)); } /** * Returns a subset of created alarms that are marked by a specific disambiguator. * * @param disambiguator disambiguator to filter alarms by */ createdAlarmsWithDisambiguator(disambiguator) { return this.createdAlarms().filter((alarm) => alarm.disambiguator === disambiguator); } /** * Returns the added composite alarms. */ createdCompositeAlarms() { return this.createdComposites; } /** * Returns the added segments that subclass {@link Monitoring}. */ createdMonitorings() { return this.createdSegments .filter((s) => s instanceof common_1.Monitoring) .map((s) => s); } /** * Returns all the added segments. */ createdDashboardSegments() { return Array.from(this.createdSegments); } // COMPOSITE ALARM CREATORS // ======================== /** * Finds a subset of created alarms that are marked by a specific custom tag and creates a composite alarm. * This composite alarm is created with an 'OR' condition, so it triggers with any child alarm. * NOTE: This composite alarm is not added among other alarms, so it is not returned by createdAlarms() calls. * * @param customTag tag to filter alarms by * @param props customization options */ createCompositeAlarmUsingTag(customTag, props) { const alarms = this.createdAlarmsWithTag(customTag); if (alarms.length > 0) { const disambiguator = props?.disambiguator ?? customTag; const alarmFactory = this.createAlarmFactory("Composite"); const composite = alarmFactory.addCompositeAlarm(alarms, { ...(props ?? {}), disambiguator, }); this.createdComposites.push(composite); return composite; } return undefined; } /** * Finds a subset of created alarms that are marked by a specific disambiguator and creates a composite alarm. * This composite alarm is created with an 'OR' condition, so it triggers with any child alarm. * NOTE: This composite alarm is not added among other alarms, so it is not returned by createdAlarms() calls. * * @param alarmDisambiguator disambiguator to filter alarms by * @param props customization options */ createCompositeAlarmUsingDisambiguator(alarmDisambiguator, props) { const alarms = this.createdAlarmsWithDisambiguator(alarmDisambiguator); if (alarms.length > 0) { const disambiguator = props?.disambiguator ?? alarmDisambiguator; const alarmFactory = this.createAlarmFactory("Composite"); const composite = alarmFactory.addCompositeAlarm(alarms, { ...(props ?? {}), disambiguator, }); this.createdComposites.push(composite); return composite; } return undefined; } // CLONE ALARMS // ============ /** * Applies a cloning function to each of the given alarms, creating a new collection of alarms * that are adjusted by the function. * * @param sourceAlarms The alarms that should be used as sources for the clones. * @param cloneFunction A function that will accept a source alarm and determine whether and how a new alarm should be cloned from it. * @returns The list of clone alarms. */ cloneAlarms(sourceAlarms, cloneFunction) { const cloned = []; sourceAlarms.forEach((alarm) => { const cloneAlarmProps = cloneFunction(alarm); if (cloneAlarmProps) { cloned.push(alarm.alarmDefinition.alarmFactory.addAlarm(alarm.alarmDefinition.metric, cloneAlarmProps)); } }); this.createdClones.push(...cloned); return cloned; } // BASIC WIDGETS // ============= addLargeHeader(text, addToSummary, addToAlarm) { this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.LARGE), addToSummary ?? false, addToAlarm ?? false); return this; } addMediumHeader(text, addToSummary, addToAlarm) { this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.MEDIUM), addToSummary ?? false, addToAlarm ?? false); return this; } addSmallHeader(text, addToSummary, addToAlarm) { this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.SMALL), addToSummary ?? false, addToAlarm ?? false); return this; } addWidget(widget, addToSummary, addToAlarm) { this.addSegment(new dashboard_1.SingleWidgetDashboardSegment(widget), { addToAlarmDashboard: addToAlarm ?? true, addToSummaryDashboard: addToSummary ?? true, addToDetailDashboard: true, }); return this; } // RESOURCE MONITORING // =================== /** * Uses an aspect to automatically monitor all resources in the given scope. * * @param scope Scope with resources to monitor. * @param aspectProps Optional configuration. * * @experimental */ monitorScope(scope, aspectProps) { const aspect = new MonitoringAspect_1.MonitoringAspect(this, aspectProps); aws_cdk_lib_1.Aspects.of(scope).add(aspect); return this; } monitorApiGateway(props) { const segment = new monitoring_1.ApiGatewayMonitoring(this, props); this.addSegment(segment, props); return this; } monitorApiGatewayV2HttpApi(props) { const segment = new monitoring_1.ApiGatewayV2HttpApiMonitoring(this, props); this.addSegment(segment, props); return this; } monitorAppSyncApi(props) { const segment = new monitoring_1.AppSyncMonitoring(this, props); this.addSegment(segment, props); return this; } monitorAuroraCluster(props) { const segment = new monitoring_1.AuroraClusterMonitoring(this, props); this.addSegment(segment, props); return this; } monitorCertificate(props) { const segment = new monitoring_1.CertificateManagerMonitoring(this, props); this.addSegment(segment, props); return this; } monitorCloudFrontDistribution(props) { const segment = new monitoring_1.CloudFrontDistributionMonitoring(this, props); this.addSegment(segment, props); return this; } monitorCodeBuildProject(props) { const segment = new monitoring_1.CodeBuildProjectMonitoring(this, props); this.addSegment(segment, props); return this; } monitorDocumentDbCluster(props) { const segment = new monitoring_1.DocumentDbMonitoring(this, props); this.addSegment(segment, props); return this; } monitorDynamoTable(props) { const segment = new monitoring_1.DynamoTableMonitoring(this, props); this.addSegment(segment, props); return this; } monitorDynamoTableGlobalSecondaryIndex(props) { const segment = new monitoring_1.DynamoTableGlobalSecondaryIndexMonitoring(this, props); this.addSegment(segment, props); return this; } monitorEC2Instances(props) { const segment = new monitoring_1.EC2Monitoring(this, props); this.addSegment(segment, props); return this; } monitorElasticsearchCluster(props) { const segment = new monitoring_1.OpenSearchClusterMonitoring(this, props); this.addSegment(segment, props); return this; } monitorOpenSearchCluster(props) { const segment = new monitoring_1.OpenSearchClusterMonitoring(this, props); this.addSegment(segment, props); return this; } monitorOpenSearchIngestionPipeline(props) { const segment = new monitoring_1.OpenSearchIngestionPipelineMonitoring(this, props); this.addSegment(segment, props); return this; } monitorOpenSearchServerlessCollection(props) { const segment = new monitoring_1.OpenSearchServerlessMonitoring(this, props); this.addSegment(segment, props); return this; } monitorOpenSearchServerlessIndex(props) { const segment = new monitoring_1.OpenSearchServerlessIndexMonitoring(this, props); this.addSegment(segment, props); return this; } monitorElastiCacheCluster(props) { const segment = new monitoring_1.ElastiCacheClusterMonitoring(this, props); this.addSegment(segment, props); return this; } monitorGlueJob(props) { const segment = new monitoring_1.GlueJobMonitoring(this, props); this.addSegment(segment, props); return this; } monitorFargateService(props) { const segment = new monitoring_1.FargateServiceMonitoring(this, { ...props, fargateService: props.fargateService.service, loadBalancer: props.fargateService.loadBalancer, targetGroup: props.fargateService.targetGroup, }); this.addSegment(segment, props); return this; } monitorSimpleFargateService(props) { const segment = new monitoring_1.FargateServiceMonitoring(this, { ...props, fargateService: props.fargateService, }); this.addSegment(segment, props); return this; } monitorFargateNetworkLoadBalancer(props) { const segment = new monitoring_1.FargateServiceMonitoring(this, { ...props, fargateService: props.fargateService, loadBalancer: props.networkLoadBalancer, targetGroup: props.networkTargetGroup, }); this.addSegment(segment, props); return this; } monitorFargateApplicationLoadBalancer(props) { const segment = new monitoring_1.FargateServiceMonitoring(this, { ...props, fargateService: props.fargateService, loadBalancer: props.applicationLoadBalancer, targetGroup: props.applicationTargetGroup, }); this.addSegment(segment, props); return this; } monitorEc2Service(props) { const segment = new monitoring_1.Ec2ServiceMonitoring(this, { ...props, ec2Service: props.ec2Service.service, loadBalancer: props.ec2Service.loadBalancer, targetGroup: props.ec2Service.targetGroup, }); this.addSegment(segment, props); return this; } monitorSimpleEc2Service(props) { const segment = new monitoring_1.Ec2ServiceMonitoring(this, { ...props, ec2Service: props.ec2Service, }); this.addSegment(segment, props); return this; } monitorEc2NetworkLoadBalancer(props) { const segment = new monitoring_1.Ec2ServiceMonitoring(this, { ...props, ec2Service: props.ec2Service, loadBalancer: props.networkLoadBalancer, targetGroup: props.networkTargetGroup, }); this.addSegment(segment, props); return this; } monitorEc2ApplicationLoadBalancer(props) { const segment = new monitoring_1.Ec2ServiceMonitoring(this, { ...props, ec2Service: props.ec2Service, loadBalancer: props.applicationLoadBalancer, targetGroup: props.applicationTargetGroup, }); this.addSegment(segment, props); return this; } monitorQueueProcessingFargateService(props) { monitoring_1.getQueueProcessingFargateServiceMonitoring(this, props).forEach((segment) => this.addSegment(segment)); return this; } monitorQueueProcessingEc2Service(props) { monitoring_1.getQueueProcessingEc2ServiceMonitoring(this, props).forEach((segment) => this.addSegment(segment)); return this; } monitorAutoScalingGroup(props) { const segment = new monitoring_1.AutoScalingGroupMonitoring(this, props); this.addSegment(segment, props); return this; } monitorKinesisFirehose(props) { const segment = new monitoring_1.KinesisFirehoseMonitoring(this, props); this.addSegment(segment, props); return this; } monitorKinesisDataStream(props) { const segment = new monitoring_1.KinesisDataStreamMonitoring(this, props); this.addSegment(segment, props); return this; } monitorKinesisDataAnalytics(props) { const segment = new monitoring_1.KinesisDataAnalyticsMonitoring(this, props); this.addSegment(segment, props); return this; } monitorLambdaFunction(props) { const segment = new monitoring_1.LambdaFunctionMonitoring(this, props); this.addSegment(segment, props); return this; } monitorNetworkLoadBalancer(props) { const segment = new monitoring_1.NetworkLoadBalancerMonitoring(this, props); this.addSegment(segment, props); return this; } monitorRdsCluster(props) { const segment = new monitoring_1.RdsClusterMonitoring(this, props); this.addSegment(segment, props); return this; } monitorRdsInstance(props) { const segment = new monitoring_1.RdsInstanceMonitoring(this, props); this.addSegment(segment, props); return this; } monitorRedshiftCluster(props) { const segment = new monitoring_1.RedshiftClusterMonitoring(this, props); this.addSegment(segment, props); return this; } monitorSecretsManager(props) { const segment = new monitoring_1.SecretsManagerMonitoring(this, props); this.addSegment(segment, props); return this; } monitorSecretsManagerSecret(props) { const segment = new monitoring_1.SecretsManagerSecretMonitoring(this, props); this.addSegment(segment, props); return this; } monitorSnsTopic(props) { const segment = new monitoring_1.SnsTopicMonitoring(this, props); this.addSegment(segment, props); return this; } monitorSqsQueue(props) { const segment = new monitoring_1.SqsQueueMonitoring(this, props); this.addSegment(segment, props); return this; } monitorSqsQueueWithDlq(props) { const segment = new monitoring_1.SqsQueueMonitoringWithDlq(this, props); this.addSegment(segment, props); return this; } monitorStepFunction(props) { const segment = new monitoring_1.StepFunctionMonitoring(this, props); this.addSegment(segment, props); return this; } monitorStepFunctionActivity(props) { const segment = new monitoring_1.StepFunctionActivityMonitoring(this, props); this.addSegment(segment, props); return this; } monitorStepFunctionLambdaIntegration(props) { const segment = new monitoring_1.StepFunctionLambdaIntegrationMonitoring(this, props); this.addSegment(segment, props); return this; } monitorStepFunctionServiceIntegration(props) { const segment = new monitoring_1.StepFunctionServiceIntegrationMonitoring(this, props); this.addSegment(segment, props); return this; } monitorS3Bucket(props) { const segment = new monitoring_1.S3BucketMonitoring(this, props); this.addSegment(segment, props); return this; } monitorLog(props) { const segment = new monitoring_1.LogMonitoring(this, props); this.addSegment(segment, props); return this; } monitorSyntheticsCanary(props) { const segment = new monitoring_1.SyntheticsCanaryMonitoring(this, props); this.addSegment(segment, props); return this; } monitorWebApplicationFirewallAclV2(props) { const segment = new monitoring_1.WafV2Monitoring(this, props); this.addSegment(segment, props); return this; } monitorBilling(props) { const segment = new monitoring_1.BillingMonitoring(this, props ?? {}); this.addSegment(segment, props); return this; } monitorCustom(props) { const segment = new monitoring_1.CustomMonitoring(this, props); this.addSegment(segment, props); return this; } monitorFluentBit(props) { const segment = new monitoring_1.FluentBitMonitoring(this, props); this.addSegment(segment, props); return this; } } exports.MonitoringFacade = MonitoringFacade; _a = JSII_RTTI_SYMBOL_1; MonitoringFacade[_a] = { fqn: "cdk-monitoring-constructs.MonitoringFacade", version: "9.15.2" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uaXRvcmluZ0ZhY2FkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIk1vbml0b3JpbmdGYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNkM7QUFLN0MseURBQXNEO0FBQ3RELHNDQVdtQjtBQUNuQiw0Q0FVc0I7QUFDdEIsa0ZBRzhDO0FBRTlDLDhDQW1HdUI7QUFxQ3ZCOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLGdCQUFpQixTQUFRLHdCQUFlO0lBV25ELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxFQUFFLHFCQUFxQixJQUFJLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxFQUFFLG9CQUFvQixJQUFJO1lBQ3pELGVBQWUsRUFBRSxFQUFFO1lBQ25CLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCO1lBQ25CLEtBQUssRUFBRSxnQkFBZ0I7Z0JBQ3ZCLElBQUksbUNBQXVCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUU7b0JBQ3BELG1CQUFtQixFQUFFLEVBQUU7aUJBQ3hCLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVk7SUFDWixZQUFZO0lBRVosa0JBQWtCLENBQUMsZUFBdUI7UUFDeEMsT0FBTyxJQUFJLHFCQUFZLENBQUMsSUFBSSxFQUFFO1lBQzVCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDOUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUNo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QUksQ0FBQztJQUNkLENBQUM7O0FBaHRCSCw0Q0FpdEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNwZWN0cywgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbXBvc2l0ZUFsYXJtLCBEYXNoYm9hcmQsIElXaWRnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB7IE1vbml0b3JpbmdBc3BlY3RQcm9wcyB9IGZyb20gXCIuL0lNb25pdG9yaW5nQXNwZWN0XCI7XG5pbXBvcnQgeyBNb25pdG9yaW5nQXNwZWN0IH0gZnJvbSBcIi4vTW9uaXRvcmluZ0FzcGVjdFwiO1xuaW1wb3J0IHtcbiAgQWRkQWxhcm1Qcm9wcyxcbiAgQWRkQ29tcG9zaXRlQWxhcm1Qcm9wcyxcbiAgQWxhcm1GYWN0b3J5LFxuICBBbGFybUZhY3RvcnlEZWZhdWx0cyxcbiAgQWxhcm1XaXRoQW5ub3RhdGlvbixcbiAgQXdzQ29uc29sZVVybEZhY3RvcnksXG4gIE1ldHJpY0ZhY3RvcnksXG4gIE1ldHJpY0ZhY3RvcnlEZWZhdWx0cyxcbiAgTW9uaXRvcmluZyxcbiAgTW9uaXRvcmluZ1Njb3BlLFxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBEZWZhdWx0RGFzaGJvYXJkRmFjdG9yeSxcbiAgRGVmYXVsdERhc2hib2FyZHMsXG4gIERlZmF1bHRXaWRnZXRGYWN0b3J5LFxuICBIZWFkZXJMZXZlbCxcbiAgSGVhZGVyV2lkZ2V0LFxuICBJRGFzaGJvYXJkU2VnbWVudCxcbiAgSVdpZGdldEZhY3RvcnksXG4gIE1vbml0b3JpbmdEYXNoYm9hcmRzT3ZlcnJpZGVQcm9wcyxcbiAgU2luZ2xlV2lkZ2V0RGFzaGJvYXJkU2VnbWVudCxcbn0gZnJvbSBcIi4uL2Rhc2hib2FyZFwiO1xuaW1wb3J0IHtcbiAgSUR5bmFtaWNEYXNoYm9hcmRTZWdtZW50LFxuICBTdGF0aWNTZWdtZW50RHluYW1pY0FkYXB0ZXIsXG59IGZyb20gXCIuLi9kYXNoYm9hcmQvRHluYW1pY0Rhc2hib2FyZFNlZ21lbnRcIjtcbmltcG9ydCB7IElEeW5hbWljRGFzaGJvYXJkRmFjdG9yeSB9IGZyb20gXCIuLi9kYXNoYm9hcmQvSUR5bmFtaWNEYXNoYm9hcmRGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBBcGlHYXRld2F5TW9uaXRvcmluZyxcbiAgQXBpR2F0ZXdheU1vbml0b3JpbmdQcm9wcyxcbiAgQXBpR2F0ZXdheVYySHR0cEFwaU1vbml0b3JpbmcsXG4gIEFwaUdhdGV3YXlWMkh0dHBBcGlNb25pdG9yaW5nUHJvcHMsXG4gIEFwcFN5bmNNb25pdG9yaW5nLFxuICBBcHBTeW5jTW9uaXRvcmluZ1Byb3BzLFxuICBBdXJvcmFDbHVzdGVyTW9uaXRvcmluZyxcbiAgQXVyb3JhQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyxcbiAgQXV0b1NjYWxpbmdHcm91cE1vbml0b3JpbmcsXG4gIEF1dG9TY2FsaW5nR3JvdXBNb25pdG9yaW5nUHJvcHMsXG4gIEJpbGxpbmdNb25pdG9yaW5nLFxuICBCaWxsaW5nTW9uaXRvcmluZ1Byb3BzLFxuICBDZXJ0aWZpY2F0ZU1hbmFnZXJNb25pdG9yaW5nLFxuICBDZXJ0aWZpY2F0ZU1hbmFnZXJNb25pdG9yaW5nUHJvcHMsXG4gIENsb3VkRnJvbnREaXN0cmlidXRpb25Nb25pdG9yaW5nLFxuICBDbG91ZEZyb250RGlzdHJpYnV0aW9uTW9uaXRvcmluZ1Byb3BzLFxuICBDb2RlQnVpbGRQcm9qZWN0TW9uaXRvcmluZyxcbiAgQ29kZUJ1aWxkUHJvamVjdE1vbml0b3JpbmdQcm9wcyxcbiAgQ3VzdG9tTW9uaXRvcmluZyxcbiAgQ3VzdG9tTW9uaXRvcmluZ1Byb3BzLFxuICBEb2N1bWVudERiTW9uaXRvcmluZyxcbiAgRG9jdW1lbnREYk1vbml0b3JpbmdQcm9wcyxcbiAgRHluYW1vVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleE1vbml0b3JpbmcsXG4gIER5bmFtb1RhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhNb25pdG9yaW5nUHJvcHMsXG4gIER5bmFtb1RhYmxlTW9uaXRvcmluZyxcbiAgRHluYW1vVGFibGVNb25pdG9yaW5nUHJvcHMsXG4gIEVjMkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTW9uaXRvcmluZ1Byb3BzLFxuICBFQzJNb25pdG9yaW5nLFxuICBFQzJNb25pdG9yaW5nUHJvcHMsXG4gIEVjMk5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nUHJvcHMsXG4gIEVjMlNlcnZpY2VNb25pdG9yaW5nLFxuICBFYzJTZXJ2aWNlTW9uaXRvcmluZ1Byb3BzLFxuICBFbGFzdGlDYWNoZUNsdXN0ZXJNb25pdG9yaW5nLFxuICBFbGFzdGlDYWNoZUNsdXN0ZXJNb25pdG9yaW5nUHJvcHMsXG4gIEZhcmdhdGVBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1vbml0b3JpbmdQcm9wcyxcbiAgRmFyZ2F0ZU5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nUHJvcHMsXG4gIEZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZyxcbiAgRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIEZsdWVudEJpdE1vbml0b3JpbmcsXG4gIEZsdWVudEJpdE1vbml0b3JpbmdQcm9wcyxcbiAgZ2V0UXVldWVQcm9jZXNzaW5nRWMyU2VydmljZU1vbml0b3JpbmcsXG4gIGdldFF1ZXVlUHJvY2Vzc2luZ0ZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZyxcbiAgR2x1ZUpvYk1vbml0b3JpbmcsXG4gIEdsdWVKb2JNb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNEYXRhQW5hbHl0aWNzTW9uaXRvcmluZyxcbiAgS2luZXNpc0RhdGFBbmFseXRpY3NNb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZyxcbiAgS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNGaXJlaG9zZU1vbml0b3JpbmcsXG4gIEtpbmVzaXNGaXJlaG9zZU1vbml0b3JpbmdQcm9wcyxcbiAgTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nLFxuICBMYW1iZGFGdW5jdGlvbk1vbml0b3JpbmdQcm9wcyxcbiAgTG9nTW9uaXRvcmluZyxcbiAgTG9nTW9uaXRvcmluZ1Byb3BzLFxuICBOZXR3b3JrTG9hZEJhbGFuY2VyTW9uaXRvcmluZyxcbiAgTmV0d29ya0xvYWRCYWxhbmNlck1vbml0b3JpbmdQcm9wcyxcbiAgT3BlblNlYXJjaENsdXN0ZXJNb25pdG9yaW5nLFxuICBPcGVuU2VhcmNoQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyxcbiAgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTW9uaXRvcmluZyxcbiAgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTW9uaXRvcmluZ1Byb3BzLFxuICBPcGVuU2VhcmNoU2VydmVybGVzc0luZGV4TW9uaXRvcmluZyxcbiAgT3BlblNlYXJjaFNlcnZlcmxlc3NJbmRleE1vbml0b3JpbmdQcm9wcyxcbiAgT3BlblNlYXJjaFNlcnZlcmxlc3NNb25pdG9yaW5nLFxuICBPcGVuU2VhcmNoU2VydmVybGVzc01vbml0b3JpbmdQcm9wcyxcbiAgUXVldWVQcm9jZXNzaW5nRWMyU2VydmljZU1vbml0b3JpbmdQcm9wcyxcbiAgUXVldWVQcm9jZXNzaW5nRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIFJkc0NsdXN0ZXJNb25pdG9yaW5nLFxuICBSZHNDbHVzdGVyTW9uaXRvcmluZ1Byb3BzLFxuICBSZHNJbnN0YW5jZU1vbml0b3JpbmcsXG4gIFJkc0luc3RhbmNlTW9uaXRvcmluZ1Byb3BzLFxuICBSZWRzaGlmdENsdXN0ZXJNb25pdG9yaW5nLFxuICBSZWRzaGlmdENsdXN0ZXJNb25pdG9yaW5nUHJvcHMsXG4gIFMzQnVja2V0TW9uaXRvcmluZyxcbiAgUzNCdWNrZXRNb25pdG9yaW5nUHJvcHMsXG4gIFNlY3JldHNNYW5hZ2VyTW9uaXRvcmluZyxcbiAgU2VjcmV0c01hbmFnZXJNb25pdG9yaW5nUHJvcHMsXG4gIFNlY3JldHNNYW5hZ2VyU2VjcmV0TW9uaXRvcmluZyxcbiAgU2VjcmV0c01hbmFnZXJTZWNyZXRNb25pdG9yaW5nUHJvcHMsXG4gIFNpbXBsZUVjMlNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIFNpbXBsZUZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZ1Byb3BzLFxuICBTbnNUb3BpY01vbml0b3JpbmcsXG4gIFNuc1RvcGljTW9uaXRvcmluZ1Byb3BzLFxuICBTcXNRdWV1ZU1vbml0b3JpbmcsXG4gIFNxc1F1ZXVlTW9uaXRvcmluZ1Byb3BzLFxuICBTcXNRdWV1ZU1vbml0b3JpbmdXaXRoRGxxLFxuICBTcXNRdWV1ZU1vbml0b3JpbmdXaXRoRGxxUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbkFjdGl2aXR5TW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uQWN0aXZpdHlNb25pdG9yaW5nUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbkxhbWJkYUludGVncmF0aW9uTW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uTGFtYmRhSW50ZWdyYXRpb25Nb25pdG9yaW5nUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbk1vbml0b3JpbmcsXG4gIFN0ZXBGdW5jdGlvbk1vbml0b3JpbmdQcm9wcyxcbiAgU3RlcEZ1bmN0aW9uU2VydmljZUludGVncmF0aW9uTW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uU2VydmljZUludGVncmF0aW9uTW9uaXRvcmluZ1Byb3BzLFxuICBTeW50aGV0aWNzQ2FuYXJ5TW9uaXRvcmluZyxcbiAgU3ludGhldGljc0NhbmFyeU1vbml0b3JpbmdQcm9wcyxcbiAgV2FmVjJNb25pdG9yaW5nLFxuICBXYWZWMk1vbml0b3JpbmdQcm9wcyxcbn0gZnJvbSBcIi4uL21vbml0b3JpbmdcIjtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gZ2l2ZW4gYW4gYWxhcm0sIHJldHVybnMgbW9kaWZpZWQgaW5wdXRzIHRoYXRcbiAqIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIGFsYXJtcywgc2xpZ2h0bHkgYWRqdXN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgb25lLlxuICogVGhlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNsb25lIGFsYXJtcy5cbiAqXG4gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBmdW5jdGlvbiBjYW4gdXNlIHRoZSBvcmlnaW5hbCBhbGFybSBjb25maWd1cmF0aW9uIHRvIHNwZWNpZnkgYSBuZXcgYWxhcm0sXG4gKiBvciB0aGV5IGNhbiByZXR1cm4gdW5kZWZpbmVkIHRvIHNraXAgdGhlIGNyZWF0aW9uIG9mIGFuIGFsYXJtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtQ2xvbmVGdW5jdGlvbiB7XG4gIChhbGFybTogQWxhcm1XaXRoQW5ub3RhdGlvbik6IEFkZEFsYXJtUHJvcHMgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0ZhY2FkZVByb3BzIHtcbiAgLyoqXG4gICAqIERlZmF1bHRzIGZvciBtZXRyaWMgZmFjdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBlbXB0eSAobm8gcHJlZmVyZW5jZXMpXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNGYWN0b3J5RGVmYXVsdHM/OiBNZXRyaWNGYWN0b3J5RGVmYXVsdHM7XG5cbiAgLyoqXG4gICAqIERlZmF1bHRzIGZvciBhbGFybSBmYWN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjdGlvbnMgZW5hYmxlZCwgZmFjYWRlIGxvZ2ljYWwgSUQgdXNlZCBhcyBkZWZhdWx0IGFsYXJtIG5hbWUgcHJlZml4XG4gICAqL1xuICByZWFkb25seSBhbGFybUZhY3RvcnlEZWZhdWx0cz86IEFsYXJtRmFjdG9yeURlZmF1bHRzO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgZGFzaGJvYXJkIGZhY3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIER5bmFtaWNEYXNoYm9hcmRGYWN0b3J5fTsgZmFjYWRlIGxvZ2ljYWwgSUQgdXNlZCBhcyBkZWZhdWx0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGRhc2hib2FyZEZhY3Rvcnk/OiBJRHluYW1pY0Rhc2hib2FyZEZhY3Rvcnk7XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgTW9uaXRvcmluZ1Njb3BlfS5cbiAqXG4gKiBUaGlzIGlzIGEgY29udmVuaWVudCBtYWluIGVudHJ5cG9pbnQgdG8gbW9uaXRvciByZXNvdXJjZXMuXG4gKlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBhbmQgY3JlYXRpbmcgYWxhcm1zIGJhc2VkIG9uIGFkZGVkIHNlZ21lbnRzIHRoYXQgYXJlIHN1YmNsYXNzZXMgb2ZcbiAqIHtAbGluayBNb25pdG9yaW5nfS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vbml0b3JpbmdGYWNhZGUgZXh0ZW5kcyBNb25pdG9yaW5nU2NvcGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljRmFjdG9yeURlZmF1bHRzOiBNZXRyaWNGYWN0b3J5RGVmYXVsdHM7XG4gIHByb3RlY3RlZCByZWFkb25seSBhbGFybUZhY3RvcnlEZWZhdWx0czogQWxhcm1GYWN0b3J5RGVmYXVsdHM7XG4gIHB1YmxpYyByZWFkb25seSBkYXNoYm9hcmRGYWN0b3J5PzogSUR5bmFtaWNEYXNoYm9hcmRGYWN0b3J5O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlZFNlZ21lbnRzOiAoXG4gICAgfCBJRGFzaGJvYXJkU2VnbWVudFxuICAgIHwgSUR5bmFtaWNEYXNoYm9hcmRTZWdtZW50XG4gIClbXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNyZWF0ZWRD