@cdklabs/multi-az-observability 0.0.1-alpha.2 → 0.0.1-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +372 -115
- package/API.md +292 -74
- package/README.md +21 -14
- package/cdk.json +1 -1
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +6 -6
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +31 -28
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +0 -4
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +6 -5
- package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +8 -6
- package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +0 -4
- package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/OperationAlarmsAndRules.js +10 -12
- package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +14 -12
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +2 -2
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +1 -1
- package/lib/azmapper/AvailabilityZoneMapper.js +4 -3
- package/lib/basic_observability/BasicServiceDashboard.d.ts +1 -2
- package/lib/basic_observability/BasicServiceDashboard.js +58 -78
- package/lib/basic_observability/BasicServiceMultiAZObservability.d.ts +8 -9
- package/lib/basic_observability/BasicServiceMultiAZObservability.js +100 -312
- package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.d.ts +50 -0
- package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.js +3 -0
- package/lib/basic_observability/props/BasicServiceDashboardProps.d.ts +27 -13
- package/lib/basic_observability/props/BasicServiceDashboardProps.js +1 -1
- package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.d.ts +10 -38
- package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.js +1 -1
- package/lib/basic_observability/props/NatGatewayDetectionProps.d.ts +31 -0
- package/lib/basic_observability/props/NatGatewayDetectionProps.js +3 -0
- package/lib/canaries/CanaryFunction.js +7 -6
- package/lib/canaries/src/canary.zip +0 -0
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +3 -6
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +359 -498
- package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +0 -1
- package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +56 -113
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +4 -8
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +1 -1
- package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +7 -2
- package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +1 -1
- package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +7 -2
- package/lib/dashboards/props/OperationLatencyWidgetProps.js +1 -1
- package/lib/index.d.ts +5 -0
- package/lib/index.js +8 -2
- package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +65 -4
- package/lib/metrics/ApplicationLoadBalancerMetrics.js +629 -40
- package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +23 -0
- package/lib/metrics/AvailabilityAndLatencyMetrics.js +115 -24
- package/lib/metrics/NatGatewayMetrics.d.ts +110 -0
- package/lib/metrics/NatGatewayMetrics.js +300 -0
- package/lib/metrics/RegionalLatencyMetrics.d.ts +1 -1
- package/lib/metrics/RegionalLatencyMetrics.js +27 -20
- package/lib/metrics/ZonalAvailabilityMetrics.d.ts +2 -8
- package/lib/metrics/ZonalAvailabilityMetrics.js +10 -25
- package/lib/metrics/ZonalLatencyMetrics.d.ts +2 -1
- package/lib/metrics/ZonalLatencyMetrics.js +33 -23
- package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +4 -0
- package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +1 -1
- package/lib/metrics/props/LatencyMetricProps.d.ts +6 -0
- package/lib/metrics/props/LatencyMetricProps.js +1 -1
- package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +4 -0
- package/lib/metrics/props/ZonalAvailabilityMetricProps.js +1 -1
- package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +4 -0
- package/lib/metrics/props/ZonalLatencyMetricProps.js +1 -1
- package/lib/monitoring/src/monitoring-layer.zip +0 -0
- package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.d.ts +10 -0
- package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.js +15 -0
- package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.d.ts +18 -0
- package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.js +23 -0
- package/lib/outlier-detection/OutlierDetectionFunction.js +6 -5
- package/lib/outlier-detection/PacketLossOutlierAlgorithm.d.ts +10 -0
- package/lib/outlier-detection/PacketLossOutlierAlgorithm.js +15 -0
- package/lib/outlier-detection/src/outlier-detection.zip +0 -0
- package/lib/outlier-detection/src/scipy-layer.zip +0 -0
- package/lib/services/CanaryMetrics.js +1 -1
- package/lib/services/CanaryTestMetricsOverride.js +1 -1
- package/lib/services/ContributorInsightRuleDetails.js +1 -1
- package/lib/services/InstrumentedServiceMultiAZObservability.js +3 -3
- package/lib/services/Operation.js +1 -1
- package/lib/services/OperationMetricDetails.js +1 -1
- package/lib/services/Service.js +1 -1
- package/lib/services/ServiceMetricDetails.js +1 -1
- package/lib/services/props/MetricDimensions.js +1 -1
- package/lib/utilities/MetricsHelper.d.ts +14 -10
- package/lib/utilities/MetricsHelper.js +18 -11
- package/package.json +8 -8
|
@@ -15,7 +15,6 @@ export declare class ServiceAvailabilityAndLatencyDashboard extends Construct im
|
|
|
15
15
|
private static createRegionalLatencyMetricProps;
|
|
16
16
|
private static createZonalAvailabilityMetricProps;
|
|
17
17
|
private static createZonalLatencyMetricProps;
|
|
18
|
-
private static generateLoadBalancerWidgets;
|
|
19
18
|
/**
|
|
20
19
|
* The service level dashboard
|
|
21
20
|
*/
|
|
@@ -14,11 +14,12 @@ const ZonalLatencyMetrics_1 = require("../metrics/ZonalLatencyMetrics");
|
|
|
14
14
|
const AvailabilityMetricType_1 = require("../utilities/AvailabilityMetricType");
|
|
15
15
|
const LatencyMetricType_1 = require("../utilities/LatencyMetricType");
|
|
16
16
|
const MetricsHelper_1 = require("../utilities/MetricsHelper");
|
|
17
|
+
const AvailabilityAndLatencyMetrics_1 = require("../metrics/AvailabilityAndLatencyMetrics");
|
|
17
18
|
/**
|
|
18
19
|
* Creates a service level availability and latency dashboard
|
|
19
20
|
*/
|
|
20
21
|
class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
21
|
-
static generateTPSWidgets(props
|
|
22
|
+
static generateTPSWidgets(props) {
|
|
22
23
|
let widgets = [];
|
|
23
24
|
widgets.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: '**TPS Metrics**' }));
|
|
24
25
|
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
@@ -45,74 +46,71 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
45
46
|
showUnits: false,
|
|
46
47
|
},
|
|
47
48
|
}));
|
|
48
|
-
|
|
49
|
-
let
|
|
50
|
-
let
|
|
51
|
-
|
|
49
|
+
props.service.availabilityZoneNames.forEach((availabilityZone) => {
|
|
50
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
51
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
52
|
+
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
53
|
+
height: 6,
|
|
54
|
+
width: 8,
|
|
55
|
+
title: availabilityZoneId + ' TPS',
|
|
56
|
+
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
57
|
+
left: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics(props.service.operations
|
|
52
58
|
.filter((x) => x.critical)
|
|
53
59
|
.map((x) => {
|
|
54
60
|
return {
|
|
55
61
|
availabilityZoneId: availabilityZoneId,
|
|
62
|
+
availabilityZone: availabilityZone,
|
|
56
63
|
label: x.operationName,
|
|
57
64
|
metricDetails: x.serverSideAvailabilityMetricDetails,
|
|
58
65
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
59
66
|
};
|
|
60
|
-
}),
|
|
61
|
-
period: props.service.period,
|
|
62
|
-
label: availabilityZoneId + 'tps',
|
|
63
|
-
};
|
|
64
|
-
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
65
|
-
height: 6,
|
|
66
|
-
width: 8,
|
|
67
|
-
title: availabilityZoneId + ' TPS',
|
|
68
|
-
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
69
|
-
left: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics(zonalMetricProps),
|
|
67
|
+
}), props.service.period, availabilityZoneId),
|
|
70
68
|
statistic: 'Sum',
|
|
71
69
|
leftYAxis: {
|
|
72
70
|
label: 'TPS',
|
|
73
71
|
showUnits: false,
|
|
74
72
|
},
|
|
75
73
|
}));
|
|
76
|
-
}
|
|
74
|
+
});
|
|
77
75
|
return widgets;
|
|
78
76
|
}
|
|
79
|
-
static generateServerSideAndCanaryAvailabilityWidgets(props
|
|
77
|
+
static generateServerSideAndCanaryAvailabilityWidgets(props) {
|
|
80
78
|
let widgets = [];
|
|
81
79
|
widgets.push(new aws_cloudwatch_1.TextWidget({
|
|
82
80
|
height: 2,
|
|
83
81
|
width: 24,
|
|
84
82
|
markdown: '**Server-side Availability**\n(Each critical operation is equally weighted regardless of request volume)',
|
|
85
83
|
}));
|
|
86
|
-
widgets
|
|
84
|
+
widgets.push(...ServiceAvailabilityAndLatencyDashboard.generateAvailabilityWidgets(props, false));
|
|
87
85
|
if (props.service.operations.filter((x) => x.critical && x.canaryMetricDetails !== undefined).length > 0) {
|
|
88
86
|
widgets.push(new aws_cloudwatch_1.TextWidget({
|
|
89
87
|
height: 2,
|
|
90
88
|
width: 24,
|
|
91
89
|
markdown: '**Canary Measured Availability**\n(Each operation is equally weighted regardless of request volume)',
|
|
92
90
|
}));
|
|
93
|
-
widgets
|
|
91
|
+
widgets.push(...ServiceAvailabilityAndLatencyDashboard.generateAvailabilityWidgets(props, true));
|
|
94
92
|
}
|
|
95
93
|
return widgets;
|
|
96
94
|
}
|
|
97
|
-
static generateServerSideAndCanaryLatencyWidgets(props
|
|
95
|
+
static generateServerSideAndCanaryLatencyWidgets(props) {
|
|
98
96
|
let widgets = [];
|
|
99
97
|
widgets.push(new aws_cloudwatch_1.TextWidget({
|
|
100
98
|
height: 2,
|
|
101
99
|
width: 24,
|
|
102
100
|
markdown: '**Server-side Latency**\n(Counts of requests exceeding the per-operation latency threshold)',
|
|
103
101
|
}));
|
|
104
|
-
widgets = widgets.concat(ServiceAvailabilityAndLatencyDashboard.generateLatencyMetricWidgets(props, false
|
|
102
|
+
widgets = widgets.concat(ServiceAvailabilityAndLatencyDashboard.generateLatencyMetricWidgets(props, false));
|
|
105
103
|
if (props.service.operations.filter((x) => x.critical && x.canaryMetricDetails !== undefined).length > 0) {
|
|
106
104
|
widgets.push(new aws_cloudwatch_1.TextWidget({
|
|
107
105
|
height: 2,
|
|
108
106
|
width: 24,
|
|
109
107
|
markdown: '**Canary Measured Latency**\n(Counts of requests exceeding the per-operation latency threshold)',
|
|
110
108
|
}));
|
|
111
|
-
widgets = widgets.concat(ServiceAvailabilityAndLatencyDashboard.generateLatencyMetricWidgets(props, true
|
|
109
|
+
widgets = widgets.concat(ServiceAvailabilityAndLatencyDashboard.generateLatencyMetricWidgets(props, true));
|
|
112
110
|
}
|
|
113
111
|
return widgets;
|
|
114
112
|
}
|
|
115
|
-
static generateAvailabilityWidgets(props, isCanary
|
|
113
|
+
static generateAvailabilityWidgets(props, isCanary) {
|
|
116
114
|
let widgets = [];
|
|
117
115
|
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
118
116
|
height: 6,
|
|
@@ -150,18 +148,15 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
150
148
|
},
|
|
151
149
|
],
|
|
152
150
|
}));
|
|
153
|
-
|
|
154
|
-
let
|
|
151
|
+
props.service.availabilityZoneNames.forEach((availabilityZone) => {
|
|
152
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
153
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
155
154
|
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
156
155
|
height: 6,
|
|
157
156
|
width: 8,
|
|
158
157
|
title: availabilityZoneId + ' Availability',
|
|
159
158
|
region: aws_cdk_lib_1.Fn.ref('AWS::Region'),
|
|
160
|
-
left: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics(
|
|
161
|
-
label: availabilityZoneId + ' availability',
|
|
162
|
-
period: props.service.period,
|
|
163
|
-
availabilityMetricProps: this.createZonalAvailabilityMetricProps(props.service.operations.filter((x) => x.critical), availabilityZoneId, isCanary, AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE),
|
|
164
|
-
}),
|
|
159
|
+
left: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics(this.createZonalAvailabilityMetricProps(props.service.operations.filter((x) => x.critical), availabilityZone, availabilityZoneId, isCanary, AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE), props.service.period, availabilityZoneId),
|
|
165
160
|
statistic: 'Sum',
|
|
166
161
|
leftYAxis: {
|
|
167
162
|
max: 100,
|
|
@@ -169,11 +164,7 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
169
164
|
label: 'Availability',
|
|
170
165
|
showUnits: false,
|
|
171
166
|
},
|
|
172
|
-
right: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics(
|
|
173
|
-
label: availabilityZoneId + ' faults',
|
|
174
|
-
period: props.service.period,
|
|
175
|
-
availabilityMetricProps: this.createZonalAvailabilityMetricProps(props.service.operations.filter((x) => x.critical), availabilityZoneId, isCanary, AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT),
|
|
176
|
-
}),
|
|
167
|
+
right: ZonalAvailabilityMetrics_1.ZonalAvailabilityMetrics.createZonalServiceAvailabilityMetrics(this.createZonalAvailabilityMetricProps(props.service.operations.filter((x) => x.critical), availabilityZone, availabilityZoneId, isCanary, AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT), props.service.period, availabilityZoneId),
|
|
177
168
|
rightYAxis: {
|
|
178
169
|
label: 'Faults',
|
|
179
170
|
showUnits: false,
|
|
@@ -188,10 +179,10 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
188
179
|
},
|
|
189
180
|
],
|
|
190
181
|
}));
|
|
191
|
-
}
|
|
182
|
+
});
|
|
192
183
|
return widgets;
|
|
193
184
|
}
|
|
194
|
-
static generateLatencyMetricWidgets(props, isCanary
|
|
185
|
+
static generateLatencyMetricWidgets(props, isCanary) {
|
|
195
186
|
let widgets = [];
|
|
196
187
|
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
197
188
|
height: 6,
|
|
@@ -207,7 +198,7 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
207
198
|
leftYAxis: {
|
|
208
199
|
max: props.service.faultCountThreshold * 1.5,
|
|
209
200
|
min: 0,
|
|
210
|
-
label: '
|
|
201
|
+
label: 'Sum',
|
|
211
202
|
showUnits: false,
|
|
212
203
|
},
|
|
213
204
|
leftAnnotations: [
|
|
@@ -218,8 +209,9 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
218
209
|
},
|
|
219
210
|
],
|
|
220
211
|
}));
|
|
221
|
-
|
|
222
|
-
let
|
|
212
|
+
props.service.availabilityZoneNames.forEach((availabilityZone) => {
|
|
213
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
214
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
223
215
|
widgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
224
216
|
height: 6,
|
|
225
217
|
width: 8,
|
|
@@ -234,7 +226,7 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
234
226
|
leftYAxis: {
|
|
235
227
|
max: props.service.faultCountThreshold * 1.5,
|
|
236
228
|
min: 0,
|
|
237
|
-
label: '
|
|
229
|
+
label: 'Sum',
|
|
238
230
|
showUnits: false,
|
|
239
231
|
},
|
|
240
232
|
leftAnnotations: [
|
|
@@ -245,7 +237,7 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
245
237
|
},
|
|
246
238
|
],
|
|
247
239
|
}));
|
|
248
|
-
}
|
|
240
|
+
});
|
|
249
241
|
return widgets;
|
|
250
242
|
}
|
|
251
243
|
static createRegionalAvailabilityMetricProps(criticalOperations, isCanary, metricType) {
|
|
@@ -280,14 +272,14 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
280
272
|
}, [])
|
|
281
273
|
.map((x) => {
|
|
282
274
|
return {
|
|
283
|
-
label: x.operationName
|
|
275
|
+
label: x.operationName,
|
|
284
276
|
metricDetails: x,
|
|
285
277
|
metricType: metricType,
|
|
286
278
|
statistic: 'TC(' + x.successAlarmThreshold + ':)',
|
|
287
279
|
};
|
|
288
280
|
});
|
|
289
281
|
}
|
|
290
|
-
static createZonalAvailabilityMetricProps(criticalOperations, availabilityZoneId, isCanary, metricType) {
|
|
282
|
+
static createZonalAvailabilityMetricProps(criticalOperations, availabilityZone, availabilityZoneId, isCanary, metricType) {
|
|
291
283
|
return criticalOperations
|
|
292
284
|
.reduce((filtered, value) => {
|
|
293
285
|
if (isCanary &&
|
|
@@ -306,6 +298,7 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
306
298
|
metricDetails: x,
|
|
307
299
|
metricType: metricType,
|
|
308
300
|
availabilityZoneId: availabilityZoneId,
|
|
301
|
+
availabilityZone: availabilityZone
|
|
309
302
|
};
|
|
310
303
|
});
|
|
311
304
|
}
|
|
@@ -332,60 +325,9 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
332
325
|
};
|
|
333
326
|
});
|
|
334
327
|
}
|
|
335
|
-
static generateLoadBalancerWidgets(props, title, availabilityZoneNames) {
|
|
336
|
-
let albWidgets = [];
|
|
337
|
-
albWidgets.push(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: title }));
|
|
338
|
-
let keyprefix = MetricsHelper_1.MetricsHelper.nextChar('');
|
|
339
|
-
let metrics = [
|
|
340
|
-
ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.getRegionalAvailabilityMetric(props.service.loadBalancer, {
|
|
341
|
-
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_RATE,
|
|
342
|
-
label: aws_cdk_lib_1.Aws.REGION + "-fault-rate",
|
|
343
|
-
period: props.service.period,
|
|
344
|
-
keyprefix: keyprefix
|
|
345
|
-
})
|
|
346
|
-
];
|
|
347
|
-
availabilityZoneNames.forEach((availabilityZoneName) => {
|
|
348
|
-
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(availabilityZoneName.substring(availabilityZoneName.length - 1));
|
|
349
|
-
keyprefix = MetricsHelper_1.MetricsHelper.nextChar(keyprefix);
|
|
350
|
-
let metric = ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.getPerAZAvailabilityMetric(props.service.loadBalancer, {
|
|
351
|
-
availabilityZone: availabilityZoneName,
|
|
352
|
-
availabilityZoneId: availabilityZoneId,
|
|
353
|
-
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_RATE,
|
|
354
|
-
label: availabilityZoneId,
|
|
355
|
-
period: props.service.period,
|
|
356
|
-
keyprefix: keyprefix
|
|
357
|
-
});
|
|
358
|
-
metrics.push(metric);
|
|
359
|
-
});
|
|
360
|
-
albWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
361
|
-
height: 8,
|
|
362
|
-
width: 24,
|
|
363
|
-
title: aws_cdk_lib_1.Fn.sub('${AWS::Region} Fault Rate'),
|
|
364
|
-
region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
|
|
365
|
-
left: metrics,
|
|
366
|
-
leftYAxis: {
|
|
367
|
-
max: 35,
|
|
368
|
-
min: 0,
|
|
369
|
-
label: 'Fault Rate',
|
|
370
|
-
showUnits: false,
|
|
371
|
-
},
|
|
372
|
-
leftAnnotations: [
|
|
373
|
-
{
|
|
374
|
-
value: 1,
|
|
375
|
-
visible: true,
|
|
376
|
-
color: aws_cloudwatch_1.Color.RED,
|
|
377
|
-
label: 'High severity',
|
|
378
|
-
},
|
|
379
|
-
],
|
|
380
|
-
}));
|
|
381
|
-
return albWidgets;
|
|
382
|
-
}
|
|
383
328
|
constructor(scope, id, props) {
|
|
384
329
|
super(scope, id);
|
|
385
330
|
let topLevelAggregateAlarmWidgets = [];
|
|
386
|
-
let availabilityZoneIds = props.service.availabilityZoneNames.map((x) => {
|
|
387
|
-
return props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(x.substring(x.length - 1));
|
|
388
|
-
});
|
|
389
331
|
topLevelAggregateAlarmWidgets.push(new aws_cloudwatch_1.TextWidget({
|
|
390
332
|
height: 2,
|
|
391
333
|
width: 24,
|
|
@@ -397,40 +339,40 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
397
339
|
alarms: [props.aggregateRegionalAlarm],
|
|
398
340
|
title: 'Customer Experience - Regional Aggregate Impact Alarm (measures fault count in aggregate across all critical operations)',
|
|
399
341
|
}));
|
|
400
|
-
let keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(
|
|
342
|
+
let keyPrefix = MetricsHelper_1.MetricsHelper.nextChar();
|
|
401
343
|
let perOperationAZFaultsMetrics = [];
|
|
402
|
-
|
|
403
|
-
let
|
|
404
|
-
let availabilityZoneId =
|
|
344
|
+
props.service.availabilityZoneNames.forEach((availabilityZone, index) => {
|
|
345
|
+
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
346
|
+
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
405
347
|
topLevelAggregateAlarmWidgets.push(new aws_cloudwatch_1.AlarmStatusWidget({
|
|
406
348
|
height: 2,
|
|
407
349
|
width: 8,
|
|
408
|
-
alarms: [props.zonalAggregateAlarms[
|
|
350
|
+
alarms: [props.zonalAggregateAlarms[index]],
|
|
409
351
|
title: availabilityZoneId +
|
|
410
352
|
' Zonal Isolated Impact Alarm (any critical operation in this AZ shows impact from server-side or canary)',
|
|
411
353
|
}));
|
|
412
354
|
let usingMetrics = {};
|
|
413
355
|
props.service.operations
|
|
414
356
|
.filter((x) => x.critical == true)
|
|
415
|
-
.forEach((x) => {
|
|
416
|
-
usingMetrics[`${keyPrefix}${
|
|
417
|
-
|
|
357
|
+
.forEach((x, index) => {
|
|
358
|
+
usingMetrics[`${keyPrefix}${index}`] =
|
|
359
|
+
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
418
360
|
availabilityZoneId: availabilityZoneId,
|
|
419
361
|
metricDetails: x.serverSideAvailabilityMetricDetails,
|
|
420
362
|
label: availabilityZoneId + ' ' + x.operationName + ' fault count',
|
|
421
363
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
422
|
-
|
|
423
|
-
});
|
|
364
|
+
availabilityZone: availabilityZone
|
|
365
|
+
}, x.serverSideAvailabilityMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
424
366
|
});
|
|
425
367
|
let zonalFaultCount = new aws_cloudwatch_1.MathExpression({
|
|
426
368
|
expression: Object.keys(usingMetrics).join('+'),
|
|
427
|
-
label: availabilityZoneId
|
|
369
|
+
label: availabilityZoneId,
|
|
428
370
|
usingMetrics: usingMetrics,
|
|
429
371
|
period: props.service.period
|
|
430
372
|
});
|
|
431
373
|
perOperationAZFaultsMetrics.push(zonalFaultCount);
|
|
432
374
|
keyPrefix = MetricsHelper_1.MetricsHelper.nextChar(keyPrefix);
|
|
433
|
-
}
|
|
375
|
+
});
|
|
434
376
|
let azContributorWidgets = [
|
|
435
377
|
new aws_cloudwatch_1.TextWidget({
|
|
436
378
|
height: 2,
|
|
@@ -445,7 +387,7 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
445
387
|
left: perOperationAZFaultsMetrics,
|
|
446
388
|
}),
|
|
447
389
|
];
|
|
448
|
-
topLevelAggregateAlarmWidgets.concat(ServiceAvailabilityAndLatencyDashboard.generateTPSWidgets(props
|
|
390
|
+
topLevelAggregateAlarmWidgets.concat(ServiceAvailabilityAndLatencyDashboard.generateTPSWidgets(props));
|
|
449
391
|
this.dashboard = new aws_cloudwatch_1.Dashboard(this, 'TopLevelDashboard', {
|
|
450
392
|
dashboardName: props.service.serviceName.toLowerCase() +
|
|
451
393
|
aws_cdk_lib_1.Fn.sub('-availability-and-latency-${AWS::Region}'),
|
|
@@ -454,16 +396,17 @@ class ServiceAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
454
396
|
widgets: [
|
|
455
397
|
topLevelAggregateAlarmWidgets,
|
|
456
398
|
azContributorWidgets,
|
|
457
|
-
ServiceAvailabilityAndLatencyDashboard.generateServerSideAndCanaryAvailabilityWidgets(props
|
|
458
|
-
ServiceAvailabilityAndLatencyDashboard.generateServerSideAndCanaryLatencyWidgets(props
|
|
399
|
+
ServiceAvailabilityAndLatencyDashboard.generateServerSideAndCanaryAvailabilityWidgets(props),
|
|
400
|
+
ServiceAvailabilityAndLatencyDashboard.generateServerSideAndCanaryLatencyWidgets(props),
|
|
459
401
|
],
|
|
460
402
|
});
|
|
461
403
|
let lb = props.service.loadBalancer?.node
|
|
462
404
|
.defaultChild;
|
|
463
|
-
if (lb
|
|
464
|
-
this.dashboard.addWidgets(
|
|
405
|
+
if (lb && lb.type == 'application') {
|
|
406
|
+
this.dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: "**Load Balancer Metrics**" }));
|
|
407
|
+
this.dashboard.addWidgets(...ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.generateLoadBalancerWidgets([props.service.loadBalancer], props.azMapper, props.service.period, props.service.defaultLatencyMetricDetails.alarmStatistic, props.service.defaultLatencyMetricDetails.successAlarmThreshold, props.service.defaultLatencyMetricDetails.faultAlarmThreshold));
|
|
465
408
|
}
|
|
466
409
|
}
|
|
467
410
|
}
|
|
468
411
|
exports.ServiceAvailabilityAndLatencyDashboard = ServiceAvailabilityAndLatencyDashboard;
|
|
469
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGFzaGJvYXJkcy9TZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBQ3RDLDZDQUFzQztBQUN0QywrREFVb0M7QUFLcEMsMkNBQXVDO0FBR3ZDLDhGQUEyRjtBQUczRix3RkFBcUY7QUFDckYsOEVBQTJFO0FBQzNFLGtGQUErRTtBQUMvRSx3RUFBcUU7QUFHckUsZ0ZBQTZFO0FBQzdFLHNFQUFtRTtBQUNuRSw4REFBMkQ7QUFFM0Q7O0dBRUc7QUFDSCxNQUFhLHNDQUNYLFNBQVEsc0JBQVM7SUFFVCxNQUFNLENBQUMsa0JBQWtCLENBQy9CLEtBQWtELEVBQ2xELG1CQUE2QjtRQUU3QixJQUFJLE9BQU8sR0FBYyxFQUFFLENBQUM7UUFFNUIsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLDJCQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FDdEUsQ0FBQztRQUVGLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSw0QkFBVyxDQUFDO1lBQ2QsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxnQkFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNO1lBQ3JDLE1BQU0sRUFBRSxnQkFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFDN0IsSUFBSSxFQUFFLHlEQUEyQixDQUFDLHdDQUF3QyxDQUN4RTtnQkFDRSxLQUFLLEVBQUUsZ0JBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTTtnQkFDckMsTUFBTSxFQUFFLEtBQUssQ0FB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SUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDdkIsR0FBRyxzQ0FBc0MsQ0FBQywyQkFBMkIsQ0FDbkUsS0FBSyxFQUNMLG1DQUFtQyxFQUNuQyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUNwQyxDQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBM3JCRCx3RkEyckJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuaW1wb3J0IHsgQXdzLCBGbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIEFsYXJtU3RhdHVzV2lkZ2V0LFxuICBDb2xvcixcbiAgRGFzaGJvYXJkLFxuICBHcmFwaFdpZGdldCxcbiAgSU1ldHJpYyxcbiAgSVdpZGdldCxcbiAgTWF0aEV4cHJlc3Npb24sXG4gIFBlcmlvZE92ZXJyaWRlLFxuICBUZXh0V2lkZ2V0LFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQge1xuICBDZm5Mb2FkQmFsYW5jZXIsXG4gIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQgfSBmcm9tICcuL0lTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCc7XG5pbXBvcnQgeyBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzIH0gZnJvbSAnLi9wcm9wcy9TZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzIH0gZnJvbSAnLi4vbWV0cmljcy9wcm9wcy9BdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyc7XG5pbXBvcnQgeyBMYXRlbmN5TWV0cmljUHJvcHMgfSBmcm9tICcuLi9tZXRyaWNzL3Byb3BzL0xhdGVuY3lNZXRyaWNQcm9wcyc7XG5pbXBvcnQgeyBSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL1JlZ2lvbmFsQXZhaWxhYmlsaXR5TWV0cmljcyc7XG5pbXBvcnQgeyBSZWdpb25hbExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9SZWdpb25hbExhdGVuY3lNZXRyaWNzJztcbmltcG9ydCB7IFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzJztcbmltcG9ydCB7IFpvbmFsTGF0ZW5jeU1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL1pvbmFsTGF0ZW5jeU1ldHJpY3MnO1xuaW1wb3J0IHsgSU9wZXJhdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL0lPcGVyYXRpb24nO1xuaW1wb3J0IHsgSU9wZXJhdGlvbk1ldHJpY0RldGFpbHMgfSBmcm9tICcuLi9zZXJ2aWNlcy9JT3BlcmF0aW9uTWV0cmljRGV0YWlscyc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL0F2YWlsYWJpbGl0eU1ldHJpY1R5cGUnO1xuaW1wb3J0IHsgTGF0ZW5jeU1ldHJpY1R5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvTGF0ZW5jeU1ldHJpY1R5cGUnO1xuaW1wb3J0IHsgTWV0cmljc0hlbHBlciB9IGZyb20gJy4uL3V0aWxpdGllcy9NZXRyaWNzSGVscGVyJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2VydmljZSBsZXZlbCBhdmFpbGFiaWxpdHkgYW5kIGxhdGVuY3kgZGFzaGJvYXJkXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFxuICBleHRlbmRzIENvbnN0cnVjdFxuICBpbXBsZW1lbnRzIElTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCB7XG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlVFBTV2lkZ2V0cyhcbiAgICBwcm9wczogU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyxcbiAgICBhdmFpbGFiaWxpdHlab25lSWRzOiBzdHJpbmdbXSxcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7IGhlaWdodDogMiwgd2lkdGg6IDI0LCBtYXJrZG93bjogJyoqVFBTIE1ldHJpY3MqKicgfSksXG4gICAgKTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogRm4ucmVmKCdBV1M6OlJlZ2lvbicpICsgJyBUUFMnLFxuICAgICAgICByZWdpb246IEZuLnJlZignQVdTOjpSZWdpb24nKSxcbiAgICAgICAgbGVmdDogUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3MoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgdHBzJyxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogcHJvcHMuc2VydmljZS5vcGVyYXRpb25zXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpXG4gICAgICAgICAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbGFiZWw6IHgub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHguc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbGFiZWw6ICdUUFMnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdmFpbGFiaWxpdHlab25lSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lSWRzW2ldO1xuXG4gICAgICBsZXQgem9uYWxNZXRyaWNQcm9wcyA9IHtcbiAgICAgICAgYXZhaWxhYmlsaXR5TWV0cmljUHJvcHM6IHByb3BzLnNlcnZpY2Uub3BlcmF0aW9uc1xuICAgICAgICAgIC5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpXG4gICAgICAgICAgLm1hcCgoeCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGxhYmVsOiB4Lm9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHguc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuUkVRVUVTVF9DT1VOVCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyAndHBzJyxcbiAgICAgIH07XG5cbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgdGl0bGU6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgVFBTJyxcbiAgICAgICAgICByZWdpb246IEZuLnJlZignQVdTOjpSZWdpb24nKSxcbiAgICAgICAgICBsZWZ0OiBab25hbEF2YWlsYWJpbGl0eU1ldHJpY3MuY3JlYXRlWm9uYWxTZXJ2aWNlQXZhaWxhYmlsaXR5TWV0cmljcyhcbiAgICAgICAgICAgIHpvbmFsTWV0cmljUHJvcHMsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbGFiZWw6ICdUUFMnLFxuICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVNlcnZlclNpZGVBbmRDYW5hcnlBdmFpbGFiaWxpdHlXaWRnZXRzKFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZHM6IHN0cmluZ1tdLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIG1hcmtkb3duOlxuICAgICAgICAgICcqKlNlcnZlci1zaWRlIEF2YWlsYWJpbGl0eSoqXFxuKEVhY2ggY3JpdGljYWwgb3BlcmF0aW9uIGlzIGVxdWFsbHkgd2VpZ2h0ZWQgcmVnYXJkbGVzcyBvZiByZXF1ZXN0IHZvbHVtZSknLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHdpZGdldHMgPSB3aWRnZXRzLmNvbmNhdChcbiAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlQXZhaWxhYmlsaXR5V2lkZ2V0cyhcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWRzLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKHgpID0+IHguY3JpdGljYWwgJiYgeC5jYW5hcnlNZXRyaWNEZXRhaWxzICE9PSB1bmRlZmluZWQsXG4gICAgICApLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgICAgbWFya2Rvd246XG4gICAgICAgICAgICAnKipDYW5hcnkgTWVhc3VyZWQgQXZhaWxhYmlsaXR5KipcXG4oRWFjaCBvcGVyYXRpb24gaXMgZXF1YWxseSB3ZWlnaHRlZCByZWdhcmRsZXNzIG9mIHJlcXVlc3Qgdm9sdW1lKScsXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgd2lkZ2V0cyA9IHdpZGdldHMuY29uY2F0KFxuICAgICAgICBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5nZW5lcmF0ZUF2YWlsYWJpbGl0eVdpZGdldHMoXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWRzLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlU2VydmVyU2lkZUFuZENhbmFyeUxhdGVuY3lXaWRnZXRzKFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZHM6IHN0cmluZ1tdLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIG1hcmtkb3duOlxuICAgICAgICAgICcqKlNlcnZlci1zaWRlIExhdGVuY3kqKlxcbihDb3VudHMgb2YgcmVxdWVzdHMgZXhjZWVkaW5nIHRoZSBwZXItb3BlcmF0aW9uIGxhdGVuY3kgdGhyZXNob2xkKScsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgd2lkZ2V0cyA9IHdpZGdldHMuY29uY2F0KFxuICAgICAgU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuZ2VuZXJhdGVMYXRlbmN5TWV0cmljV2lkZ2V0cyhcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWRzLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKHgpID0+IHguY3JpdGljYWwgJiYgeC5jYW5hcnlNZXRyaWNEZXRhaWxzICE9PSB1bmRlZmluZWQsXG4gICAgICApLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgICAgbWFya2Rvd246XG4gICAgICAgICAgICAnKipDYW5hcnkgTWVhc3VyZWQgTGF0ZW5jeSoqXFxuKENvdW50cyBvZiByZXF1ZXN0cyBleGNlZWRpbmcgdGhlIHBlci1vcGVyYXRpb24gbGF0ZW5jeSB0aHJlc2hvbGQpJyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB3aWRnZXRzID0gd2lkZ2V0cy5jb25jYXQoXG4gICAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlTGF0ZW5jeU1ldHJpY1dpZGdldHMoXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWRzLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlQXZhaWxhYmlsaXR5V2lkZ2V0cyhcbiAgICBwcm9wczogU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyxcbiAgICBpc0NhbmFyeTogYm9vbGVhbixcbiAgICBhdmFpbGFiaWxpdHlab25lSWRzOiBzdHJpbmdbXSxcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgdGl0bGU6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgIGxlZnQ6IFJlZ2lvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVSZWdpb25hbFNlcnZpY2VBdmFpbGFiaWxpdHlNZXRyaWNzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJykgKyAnIGF2YWlsYWJpbGl0eScsXG4gICAgICAgICAgICBwZXJpb2Q6IHByb3BzLnNlcnZpY2UucGVyaW9kLFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5TWV0cmljUHJvcHM6IHRoaXMuY3JlYXRlUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyhcbiAgICAgICAgICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbCksXG4gICAgICAgICAgICAgIGlzQ2FuYXJ5LFxuICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbWF4OiAxMDAsXG4gICAgICAgICAgbWluOiA5NSxcbiAgICAgICAgICBsYWJlbDogJ0F2YWlsYWJpbGl0eScsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgcmlnaHQ6XG4gICAgICAgICAgUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3Moe1xuICAgICAgICAgICAgbGFiZWw6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgZmF1bHRzJyxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKCh4KSA9PiB4LmNyaXRpY2FsKSxcbiAgICAgICAgICAgICAgaXNDYW5hcnksXG4gICAgICAgICAgICAgIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICByaWdodFlBeGlzOiB7XG4gICAgICAgICAgbGFiZWw6ICdGYXVsdHMnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgbWluOiAwLFxuICAgICAgICAgIG1heDogTWF0aC5jZWlsKHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCAqIDEuNSksXG4gICAgICAgIH0sXG4gICAgICAgIHJpZ2h0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgbGFiZWw6ICdIaWdoIHNldmVyaXR5JyxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcy5zZXJ2aWNlLmZhdWx0Q291bnRUaHJlc2hvbGQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF2YWlsYWJpbGl0eVpvbmVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQgPSBhdmFpbGFiaWxpdHlab25lSWRzW2ldO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIEF2YWlsYWJpbGl0eScsXG4gICAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgICAgbGVmdDogWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVpvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3Moe1xuICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgYXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKCh4KSA9PiB4LmNyaXRpY2FsKSxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBpc0NhbmFyeSxcbiAgICAgICAgICAgICAgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX1JBVEUsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgICAgIG1pbjogOTUsXG4gICAgICAgICAgICBsYWJlbDogJ0F2YWlsYWJpbGl0eScsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmlnaHQ6IFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljcy5jcmVhdGVab25hbFNlcnZpY2VBdmFpbGFiaWxpdHlNZXRyaWNzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBmYXVsdHMnLFxuICAgICAgICAgICAgICBwZXJpb2Q6IHByb3BzLnNlcnZpY2UucGVyaW9kLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgICAgICAgICAgICAgIHByb3BzLnNlcnZpY2Uub3BlcmF0aW9ucy5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgICBpc0NhbmFyeSxcbiAgICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHJpZ2h0WUF4aXM6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnRmF1bHRzJyxcbiAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICBtYXg6IE1hdGguY2VpbChwcm9wcy5zZXJ2aWNlLmZhdWx0Q291bnRUaHJlc2hvbGQgKiAxLjUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmlnaHRBbm5vdGF0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgICBsYWJlbDogJ0hpZ2ggc2V2ZXJpdHknLFxuICAgICAgICAgICAgICB2YWx1ZTogcHJvcHMuc2VydmljZS5mYXVsdENvdW50VGhyZXNob2xkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUxhdGVuY3lNZXRyaWNXaWRnZXRzKFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICAgIGlzQ2FuYXJ5OiBib29sZWFuLFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZHM6IHN0cmluZ1tdLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogRm4ucmVmKCdBV1M6OlJlZ2lvbicpICsgJyBIaWdoIExhdGVuY3kgQ291bnQnLFxuICAgICAgICByZWdpb246IEZuLnJlZignQVdTOjpSZWdpb24nKSxcbiAgICAgICAgbGVmdDogUmVnaW9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVSZWdpb25hbFNlcnZpY2VMYXRlbmN5Q291bnRNZXRyaWNzKHtcbiAgICAgICAgICBsYWJlbDogRm4ucmVmKCdBV1M6OlJlZ2lvbicpLFxuICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgbGF0ZW5jeU1ldHJpY1Byb3BzOiB0aGlzLmNyZWF0ZVJlZ2lvbmFsTGF0ZW5jeU1ldHJpY1Byb3BzKFxuICAgICAgICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbCksXG4gICAgICAgICAgICBpc0NhbmFyeSxcbiAgICAgICAgICAgIExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgICApLFxuICAgICAgICB9KSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbWF4OiBwcm9wcy5zZXJ2aWNlLmZhdWx0Q291bnRUaHJlc2hvbGQgKiAxLjUsXG4gICAgICAgICAgbWluOiAwLFxuICAgICAgICAgIGxhYmVsOiAnSGlnaCBsYXRlbmN5IGNvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgbGFiZWw6ICdIaWdoIHNldmVyaXR5JyxcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcy5zZXJ2aWNlLmZhdWx0Q291bnRUaHJlc2hvbGQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF2YWlsYWJpbGl0eVpvbmVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQgPSBhdmFpbGFiaWxpdHlab25lSWRzW2ldO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIEhpZ2ggTGF0ZW5jeSBDb3VudCcsXG4gICAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgICAgbGVmdDogWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbFNlcnZpY2VMYXRlbmN5TWV0cmljcyh7XG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICAgIGxhdGVuY3lNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVab25hbExhdGVuY3lNZXRyaWNQcm9wcyhcbiAgICAgICAgICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbCksXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgaXNDYW5hcnksXG4gICAgICAgICAgICAgIExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICAgIG1heDogcHJvcHMuc2VydmljZS5mYXVsdENvdW50VGhyZXNob2xkICogMS41LFxuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbGFiZWw6ICdIaWdoIGxhdGVuY3kgY291bnQnLFxuICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgICBsYWJlbDogJ0hpZ2ggc2V2ZXJpdHknLFxuICAgICAgICAgICAgICB2YWx1ZTogcHJvcHMuc2VydmljZS5mYXVsdENvdW50VGhyZXNob2xkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgIGNyaXRpY2FsT3BlcmF0aW9uczogSU9wZXJhdGlvbltdLFxuICAgIGlzQ2FuYXJ5OiBib29sZWFuLFxuICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUsXG4gICk6IEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzW10ge1xuICAgIHJldHVybiBjcml0aWNhbE9wZXJhdGlvbnNcbiAgICAgIC5yZWR1Y2UoKGZpbHRlcmVkLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXNDYW5hcnkgJiYgdmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscykge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2goXG4gICAgICAgICAgICB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYW5hcnkpIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHZhbHVlLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgICB9LCBbXSBhcyBJT3BlcmF0aW9uTWV0cmljRGV0YWlsc1tdKVxuICAgICAgLm1hcCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgeC5vcGVyYXRpb25OYW1lICsgJyAnICsgbWV0cmljVHlwZS50b1N0cmluZygpLnJlcGxhY2UoJ18nLCAnICcpLFxuICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHgsXG4gICAgICAgICAgbWV0cmljVHlwZTogbWV0cmljVHlwZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUmVnaW9uYWxMYXRlbmN5TWV0cmljUHJvcHMoXG4gICAgY3JpdGljYWxPcGVyYXRpb25zOiBJT3BlcmF0aW9uW10sXG4gICAgaXNDYW5hcnk6IGJvb2xlYW4sXG4gICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUsXG4gICk6IExhdGVuY3lNZXRyaWNQcm9wc1tdIHtcbiAgICByZXR1cm4gY3JpdGljYWxPcGVyYXRpb25zXG4gICAgICAucmVkdWNlKChmaWx0ZXJlZCwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzQ2FuYXJ5ICYmIHZhbHVlLmNhbmFyeU1ldHJpY0RldGFpbHMpIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHZhbHVlLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbmFyeSkge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2godmFsdWUuc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgICB9LCBbXSBhcyBJT3BlcmF0aW9uTWV0cmljRGV0YWlsc1tdKVxuICAgICAgLm1hcCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgeC5vcGVyYXRpb25OYW1lICsgJyAnICsgbWV0cmljVHlwZS50b1N0cmluZygpLnJlcGxhY2UoJ18nLCAnICcpLFxuICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHgsXG4gICAgICAgICAgbWV0cmljVHlwZTogbWV0cmljVHlwZSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdUQygnICsgeC5zdWNjZXNzQWxhcm1UaHJlc2hvbGQgKyAnOiknLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgIGNyaXRpY2FsT3BlcmF0aW9uczogSU9wZXJhdGlvbltdLFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nLFxuICAgIGlzQ2FuYXJ5OiBib29sZWFuLFxuICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUsXG4gICk6IEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzW10ge1xuICAgIHJldHVybiBjcml0aWNhbE9wZXJhdGlvbnNcbiAgICAgIC5yZWR1Y2UoKGZpbHRlcmVkLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDYW5hcnkgJiZcbiAgICAgICAgICB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzICE9IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaChcbiAgICAgICAgICAgIHZhbHVlLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbmFyeSkge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2godmFsdWUuc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICAgIH0sIFtdIGFzIElPcGVyYXRpb25NZXRyaWNEZXRhaWxzW10pXG4gICAgICAubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICB4Lm9wZXJhdGlvbk5hbWUgKyAnICcgKyBtZXRyaWNUeXBlLnRvU3RyaW5nKCkucmVwbGFjZSgnXycsICcgJyksXG4gICAgICAgICAgbWV0cmljRGV0YWlsczogeCxcbiAgICAgICAgICBtZXRyaWNUeXBlOiBtZXRyaWNUeXBlLFxuICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVab25hbExhdGVuY3lNZXRyaWNQcm9wcyhcbiAgICBjcml0aWNhbE9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSxcbiAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICBpc0NhbmFyeTogYm9vbGVhbixcbiAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZSxcbiAgKTogTGF0ZW5jeU1ldHJpY1Byb3BzW10ge1xuICAgIHJldHVybiBjcml0aWNhbE9wZXJhdGlvbnNcbiAgICAgIC5yZWR1Y2UoKGZpbHRlcmVkLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDYW5hcnkgJiZcbiAgICAgICAgICB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzICE9IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaCh2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYW5hcnkpIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHZhbHVlLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgfSwgW10gYXMgSU9wZXJhdGlvbk1ldHJpY0RldGFpbHNbXSlcbiAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgIHgub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICBtZXRyaWNEZXRhaWxzOiB4LFxuICAgICAgICAgIG1ldHJpY1R5cGU6IG1ldHJpY1R5cGUsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgc3RhdGlzdGljOiAnVEMoJyArIHguc3VjY2Vzc0FsYXJtVGhyZXNob2xkICsgJzopJyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVMb2FkQmFsYW5jZXJXaWRnZXRzKFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgYXZhaWxhYmlsaXR5Wm9uZU5hbWVzOiBzdHJpbmdbXSxcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgYWxiV2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICBhbGJXaWRnZXRzLnB1c2gobmV3IFRleHRXaWRnZXQoeyBoZWlnaHQ6IDIsIHdpZHRoOiAyNCwgbWFya2Rvd246IHRpdGxlIH0pKTtcblxuICAgIGxldCBrZXlwcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCcnKTtcblxuICAgIGxldCBtZXRyaWNzOiBJTWV0cmljW10gPSBbXG4gICAgICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MuZ2V0UmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoXG4gICAgICAgIHByb3BzLnNlcnZpY2UubG9hZEJhbGFuY2VyIGFzIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgICAgICAge1xuICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfUkFURSxcbiAgICAgICAgICBsYWJlbDogQXdzLlJFR0lPTiArIFwiLWZhdWx0LXJhdGVcIixcbiAgICAgICAgICBwZXJpb2Q6IHByb3BzLnNlcnZpY2UucGVyaW9kLFxuICAgICAgICAgIGtleXByZWZpeDoga2V5cHJlZml4XG4gICAgICAgIH1cbiAgICAgIClcbiAgICBdO1xuXG4gICAgYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmVOYW1lKSA9PiB7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPVxuICAgICAgICBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lTmFtZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZU5hbWUubGVuZ3RoIC0gMSksXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAga2V5cHJlZml4ID0gTWV0cmljc0hlbHBlci5uZXh0Q2hhcihrZXlwcmVmaXgpO1xuXG4gICAgICBsZXQgbWV0cmljOiBJTWV0cmljID0gQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJNZXRyaWNzLmdldFBlckFaQXZhaWxhYmlsaXR5TWV0cmljKFxuICAgICAgICBwcm9wcy5zZXJ2aWNlLmxvYWRCYWxhbmNlciBhcyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gICAgICAgIHtcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lTmFtZSxcbiAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX1JBVEUsXG4gICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICBwZXJpb2Q6IHByb3BzLnNlcnZpY2UucGVyaW9kLFxuICAgICAgICAgIGtleXByZWZpeDoga2V5cHJlZml4XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIG1ldHJpY3MucHVzaChtZXRyaWMpO1xuICAgIH0pO1xuXG4gICAgYWxiV2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIHRpdGxlOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259IEZhdWx0IFJhdGUnKSxcbiAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgIGxlZnQ6IG1ldHJpY3MsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIG1heDogMzUsXG4gICAgICAgICAgbWluOiAwLFxuICAgICAgICAgIGxhYmVsOiAnRmF1bHQgUmF0ZScsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgbGVmdEFubm90YXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29sb3I6IENvbG9yLlJFRCxcbiAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBzZXZlcml0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gYWxiV2lkZ2V0cztcbiAgfVxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgbGV2ZWwgZGFzaGJvYXJkXG4gICAqL1xuICBkYXNoYm9hcmQ6IERhc2hib2FyZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBsZXQgdG9wTGV2ZWxBZ2dyZWdhdGVBbGFybVdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZHM6IHN0cmluZ1tdID0gcHJvcHMuc2VydmljZS5hdmFpbGFiaWxpdHlab25lTmFtZXMubWFwKFxuICAgICAgKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKFxuICAgICAgICAgIHguc3Vic3RyaW5nKHgubGVuZ3RoIC0gMSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgbWFya2Rvd246ICcqKipBdmFpbGFiaWxpdHkgYW5kIExhdGVuY3kgQWxhcm1zKioqJyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IEFsYXJtU3RhdHVzV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIGFsYXJtczogW3Byb3BzLmFnZ3JlZ2F0ZVJlZ2lvbmFsQWxhcm1dLFxuICAgICAgICB0aXRsZTpcbiAgICAgICAgICAnQ3VzdG9tZXIgRXhwZXJpZW5jZSAtIFJlZ2lvbmFsIEFnZ3JlZ2F0ZSBJbXBhY3QgQWxhcm0gKG1lYXN1cmVzIGZhdWx0IGNvdW50IGluIGFnZ3JlZ2F0ZSBhY3Jvc3MgYWxsIGNyaXRpY2FsIG9wZXJhdGlvbnMpJyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBsZXQga2V5UHJlZml4OiBzdHJpbmcgPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKCcnKTtcbiAgICBsZXQgcGVyT3BlcmF0aW9uQVpGYXVsdHNNZXRyaWNzOiBJTWV0cmljW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXZhaWxhYmlsaXR5Wm9uZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNvdW50ZXI6IG51bWJlciA9IDE7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lSWRzW2ldO1xuXG4gICAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICBhbGFybXM6IFtwcm9wcy56b25hbEFnZ3JlZ2F0ZUFsYXJtc1tpXV0sXG4gICAgICAgICAgdGl0bGU6XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQgK1xuICAgICAgICAgICAgJyBab25hbCBJc29sYXRlZCBJbXBhY3QgQWxhcm0gKGFueSBjcml0aWNhbCBvcGVyYXRpb24gaW4gdGhpcyBBWiBzaG93cyBpbXBhY3QgZnJvbSBzZXJ2ZXItc2lkZSBvciBjYW5hcnkpJyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBsZXQgdXNpbmdNZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSA9IHt9O1xuXG4gICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnNcbiAgICAgICAgLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbCA9PSB0cnVlKVxuICAgICAgICAuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICAgIHVzaW5nTWV0cmljc1tgJHtrZXlQcmVmaXh9JHtjb3VudGVyKyt9YF0gPVxuICAgICAgICAgICAgWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHguc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCArICcgJyArIHgub3BlcmF0aW9uTmFtZSArICcgZmF1bHQgY291bnQnLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgICBrZXlQcmVmaXg6IGtleVByZWZpeCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgbGV0IHpvbmFsRmF1bHRDb3VudDogSU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbignKycpLFxuICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBmYXVsdCBjb3VudCcsXG4gICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgICBwZXJpb2Q6IHByb3BzLnNlcnZpY2UucGVyaW9kXG4gICAgICB9KTtcblxuICAgICAgcGVyT3BlcmF0aW9uQVpGYXVsdHNNZXRyaWNzLnB1c2goem9uYWxGYXVsdENvdW50KTtcbiAgICAgIGtleVByZWZpeCA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoa2V5UHJlZml4KTtcbiAgICB9XG5cbiAgICBsZXQgYXpDb250cmlidXRvcldpZGdldHM6IElXaWRnZXRbXSA9IFtcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIG1hcmtkb3duOiAnKipBWiBDb250cmlidXRvcnMgVG8gRmF1bHRzKionLFxuICAgICAgfSksXG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgdGl0bGU6ICdBWiBGYXVsdCBDb3VudCcsXG4gICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgIGxlZnQ6IHBlck9wZXJhdGlvbkFaRmF1bHRzTWV0cmljcyxcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0cy5jb25jYXQoXG4gICAgICBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5nZW5lcmF0ZVRQU1dpZGdldHMoXG4gICAgICAgIHByb3BzLFxuICAgICAgICBhdmFpbGFiaWxpdHlab25lSWRzLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKHRoaXMsICdUb3BMZXZlbERhc2hib2FyZCcsIHtcbiAgICAgIGRhc2hib2FyZE5hbWU6XG4gICAgICAgIHByb3BzLnNlcnZpY2Uuc2VydmljZU5hbWUudG9Mb3dlckNhc2UoKSArXG4gICAgICAgIEZuLnN1YignLWF2YWlsYWJpbGl0eS1hbmQtbGF0ZW5jeS0ke0FXUzo6UmVnaW9ufScpLFxuICAgICAgZGVmYXVsdEludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIHBlcmlvZE92ZXJyaWRlOiBQZXJpb2RPdmVycmlkZS5BVVRPLFxuICAgICAgd2lkZ2V0czogW1xuICAgICAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0cyxcbiAgICAgICAgYXpDb250cmlidXRvcldpZGdldHMsXG4gICAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlU2VydmVyU2lkZUFuZENhbmFyeUF2YWlsYWJpbGl0eVdpZGdldHMoXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICAgU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuZ2VuZXJhdGVTZXJ2ZXJTaWRlQW5kQ2FuYXJ5TGF0ZW5jeVdpZGdldHMoXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkcyxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBsZXQgbGI6IENmbkxvYWRCYWxhbmNlciA9IHByb3BzLnNlcnZpY2UubG9hZEJhbGFuY2VyPy5ub2RlXG4gICAgICAuZGVmYXVsdENoaWxkIGFzIENmbkxvYWRCYWxhbmNlcjtcblxuICAgIGlmIChsYiAhPT0gdW5kZWZpbmVkICYmIGxiICE9IG51bGwgJiYgbGIudHlwZSA9PSAnYXBwbGljYXRpb24nKSB7XG4gICAgICB0aGlzLmRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgICAuLi5TZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5nZW5lcmF0ZUxvYWRCYWxhbmNlcldpZGdldHMoXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgJ0FwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIgTWV0cmljcycsXG4gICAgICAgICAgcHJvcHMuc2VydmljZS5hdmFpbGFiaWxpdHlab25lTmFtZXMsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
412
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGFzaGJvYXJkcy9TZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBQ3RDLDZDQUFzQztBQUN0QywrREFVb0M7QUFLcEMsMkNBQXVDO0FBR3ZDLDhGQUEyRjtBQUczRix3RkFBcUY7QUFDckYsOEVBQTJFO0FBQzNFLGtGQUErRTtBQUMvRSx3RUFBcUU7QUFHckUsZ0ZBQTZFO0FBQzdFLHNFQUFtRTtBQUNuRSw4REFBMkQ7QUFDM0QsNEZBQXlGO0FBR3pGOztHQUVHO0FBQ0gsTUFBYSxzQ0FDWCxTQUFRLHNCQUFTO0lBR1QsTUFBTSxDQUFDLGtCQUFrQixDQUMvQixLQUFrRDtRQUVsRCxJQUFJLE9BQU8sR0FBYyxFQUFFLENBQUM7UUFFNUIsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLDJCQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FDdEUsQ0FBQztRQUVGLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSw0QkFBVyxDQUFDO1lBQ2QsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxnQkFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNO1lBQ3JDLE1BQU0sRUFBRSxnQkFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFDN0IsSUFBSSxFQUFFLHlEQUEyQixDQUFDLHdDQUF3QyxDQUN4RTtnQkFDRSxLQUFLLEVBQUUsZ0JBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTTtnQkFDckMsTUFBTSxFQUFFLEtBQUssQ0FB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eUNBQXlDLENBQzlFLEtBQUssQ0FDTjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxFQUFFLEdBQW9CLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUk7YUFDdkQsWUFBK0IsQ0FBQztRQUVuQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUN2QixJQUFJLDJCQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLDJCQUEyQixFQUFFLENBQUMsQ0FDaEYsQ0FBQztZQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUN2QixHQUFHLCtEQUE4QixDQUFDLDJCQUEyQixDQUMzRCxDQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBd0MsQ0FBRSxFQUMxRCxLQUFLLENBQUMsUUFBUSxFQUNkLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUNwQixLQUFLLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLGNBQWMsRUFDeEQsS0FBSyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxxQkFBcUIsRUFDL0QsS0FBSyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FDOUQsQ0FDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTltQkQsd0ZBOG1CQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IEF3cywgRm4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBBbGFybVN0YXR1c1dpZGdldCxcbiAgQ29sb3IsXG4gIERhc2hib2FyZCxcbiAgR3JhcGhXaWRnZXQsXG4gIElNZXRyaWMsXG4gIElXaWRnZXQsXG4gIE1hdGhFeHByZXNzaW9uLFxuICBQZXJpb2RPdmVycmlkZSxcbiAgVGV4dFdpZGdldCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHtcbiAgQ2ZuTG9hZEJhbGFuY2VyLFxuICBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSVNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkIH0gZnJvbSAnLi9JU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQnO1xuaW1wb3J0IHsgU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyB9IGZyb20gJy4vcHJvcHMvU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL0FwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcyc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyB9IGZyb20gJy4uL21ldHJpY3MvcHJvcHMvQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgTGF0ZW5jeU1ldHJpY1Byb3BzIH0gZnJvbSAnLi4vbWV0cmljcy9wcm9wcy9MYXRlbmN5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9SZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY3MnO1xuaW1wb3J0IHsgUmVnaW9uYWxMYXRlbmN5TWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvUmVnaW9uYWxMYXRlbmN5TWV0cmljcyc7XG5pbXBvcnQgeyBab25hbEF2YWlsYWJpbGl0eU1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL1pvbmFsQXZhaWxhYmlsaXR5TWV0cmljcyc7XG5pbXBvcnQgeyBab25hbExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9ab25hbExhdGVuY3lNZXRyaWNzJztcbmltcG9ydCB7IElPcGVyYXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9JT3BlcmF0aW9uJztcbmltcG9ydCB7IElPcGVyYXRpb25NZXRyaWNEZXRhaWxzIH0gZnJvbSAnLi4vc2VydmljZXMvSU9wZXJhdGlvbk1ldHJpY0RldGFpbHMnO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5TWV0cmljVHlwZSB9IGZyb20gJy4uL3V0aWxpdGllcy9BdmFpbGFiaWxpdHlNZXRyaWNUeXBlJztcbmltcG9ydCB7IExhdGVuY3lNZXRyaWNUeXBlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL0xhdGVuY3lNZXRyaWNUeXBlJztcbmltcG9ydCB7IE1ldHJpY3NIZWxwZXIgfSBmcm9tICcuLi91dGlsaXRpZXMvTWV0cmljc0hlbHBlcic7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MnO1xuaW1wb3J0IHsgWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyB9IGZyb20gJy4uL21ldHJpY3MvcHJvcHMvWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNlcnZpY2UgbGV2ZWwgYXZhaWxhYmlsaXR5IGFuZCBsYXRlbmN5IGRhc2hib2FyZFxuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRcbiAgZXh0ZW5kcyBDb25zdHJ1Y3RcbiAgaW1wbGVtZW50cyBJU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQge1xuIFxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVRQU1dpZGdldHMoXG4gICAgcHJvcHM6IFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHNcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7IGhlaWdodDogMiwgd2lkdGg6IDI0LCBtYXJrZG93bjogJyoqVFBTIE1ldHJpY3MqKicgfSksXG4gICAgKTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogRm4ucmVmKCdBV1M6OlJlZ2lvbicpICsgJyBUUFMnLFxuICAgICAgICByZWdpb246IEZuLnJlZignQVdTOjpSZWdpb24nKSxcbiAgICAgICAgbGVmdDogUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3MoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgdHBzJyxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogcHJvcHMuc2VydmljZS5vcGVyYXRpb25zXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpXG4gICAgICAgICAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbGFiZWw6IHgub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHguc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbGFiZWw6ICdUUFMnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcHJvcHMuc2VydmljZS5hdmFpbGFiaWxpdHlab25lTmFtZXMuZm9yRWFjaCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICBoZWlnaHQ6IDYsXG4gICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgdGl0bGU6IGF2YWlsYWJpbGl0eVpvbmVJZCArICcgVFBTJyxcbiAgICAgICAgICByZWdpb246IEZuLnJlZignQVdTOjpSZWdpb24nKSxcbiAgICAgICAgICBsZWZ0OiBab25hbEF2YWlsYWJpbGl0eU1ldHJpY3MuY3JlYXRlWm9uYWxTZXJ2aWNlQXZhaWxhYmlsaXR5TWV0cmljcyhcbiAgICAgICAgICAgIHByb3BzLnNlcnZpY2Uub3BlcmF0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbClcbiAgICAgICAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB4Lm9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogeC5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb3BzLnNlcnZpY2UucGVyaW9kLFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkXG4gICAgICAgICAgKSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbGFiZWw6ICdUUFMnLFxuICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlU2VydmVyU2lkZUFuZENhbmFyeUF2YWlsYWJpbGl0eVdpZGdldHMoXG4gICAgcHJvcHM6IFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHNcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBtYXJrZG93bjpcbiAgICAgICAgICAnKipTZXJ2ZXItc2lkZSBBdmFpbGFiaWxpdHkqKlxcbihFYWNoIGNyaXRpY2FsIG9wZXJhdGlvbiBpcyBlcXVhbGx5IHdlaWdodGVkIHJlZ2FyZGxlc3Mgb2YgcmVxdWVzdCB2b2x1bWUpJyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICAuLi5TZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5nZW5lcmF0ZUF2YWlsYWJpbGl0eVdpZGdldHMoXG4gICAgICAgIHByb3BzLFxuICAgICAgICBmYWxzZVxuICAgICAgKVxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKFxuICAgICAgICAoeCkgPT4geC5jcml0aWNhbCAmJiB4LmNhbmFyeU1ldHJpY0RldGFpbHMgIT09IHVuZGVmaW5lZCxcbiAgICAgICkubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgICBtYXJrZG93bjpcbiAgICAgICAgICAgICcqKkNhbmFyeSBNZWFzdXJlZCBBdmFpbGFiaWxpdHkqKlxcbihFYWNoIG9wZXJhdGlvbiBpcyBlcXVhbGx5IHdlaWdodGVkIHJlZ2FyZGxlc3Mgb2YgcmVxdWVzdCB2b2x1bWUpJyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIC4uLlNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlQXZhaWxhYmlsaXR5V2lkZ2V0cyhcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB3aWRnZXRzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVTZXJ2ZXJTaWRlQW5kQ2FuYXJ5TGF0ZW5jeVdpZGdldHMoXG4gICAgcHJvcHM6IFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHNcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBtYXJrZG93bjpcbiAgICAgICAgICAnKipTZXJ2ZXItc2lkZSBMYXRlbmN5KipcXG4oQ291bnRzIG9mIHJlcXVlc3RzIGV4Y2VlZGluZyB0aGUgcGVyLW9wZXJhdGlvbiBsYXRlbmN5IHRocmVzaG9sZCknLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHdpZGdldHMgPSB3aWRnZXRzLmNvbmNhdChcbiAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlTGF0ZW5jeU1ldHJpY1dpZGdldHMoXG4gICAgICAgIHByb3BzLFxuICAgICAgICBmYWxzZVxuICAgICAgKSxcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKHgpID0+IHguY3JpdGljYWwgJiYgeC5jYW5hcnlNZXRyaWNEZXRhaWxzICE9PSB1bmRlZmluZWQsXG4gICAgICApLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgICAgbWFya2Rvd246XG4gICAgICAgICAgICAnKipDYW5hcnkgTWVhc3VyZWQgTGF0ZW5jeSoqXFxuKENvdW50cyBvZiByZXF1ZXN0cyBleGNlZWRpbmcgdGhlIHBlci1vcGVyYXRpb24gbGF0ZW5jeSB0aHJlc2hvbGQpJyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB3aWRnZXRzID0gd2lkZ2V0cy5jb25jYXQoXG4gICAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlTGF0ZW5jeU1ldHJpY1dpZGdldHMoXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlQXZhaWxhYmlsaXR5V2lkZ2V0cyhcbiAgICBwcm9wczogU2VydmljZUF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wcyxcbiAgICBpc0NhbmFyeTogYm9vbGVhblxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogRm4ucmVmKCdBV1M6OlJlZ2lvbicpICsgJyBBdmFpbGFiaWxpdHknLFxuICAgICAgICByZWdpb246IEZuLnJlZignQVdTOjpSZWdpb24nKSxcbiAgICAgICAgbGVmdDogUmVnaW9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3MoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IEZuLnJlZignQVdTOjpSZWdpb24nKSArICcgYXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMuc2VydmljZS5wZXJpb2QsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzKFxuICAgICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKCh4KSA9PiB4LmNyaXRpY2FsKSxcbiAgICAgICAgICAgICAgaXNDYW5hcnksXG4gICAgICAgICAgICAgIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19SQVRFLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgICBtaW46IDk1LFxuICAgICAgICAgIGxhYmVsOiAnQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICByaWdodDpcbiAgICAgICAgICBSZWdpb25hbEF2YWlsYWJpbGl0eU1ldHJpY3MuY3JlYXRlUmVnaW9uYWxTZXJ2aWNlQXZhaWxhYmlsaXR5TWV0cmljcyh7XG4gICAgICAgICAgICBsYWJlbDogRm4ucmVmKCdBV1M6OlJlZ2lvbicpICsgJyBmYXVsdHMnLFxuICAgICAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzOiB0aGlzLmNyZWF0ZVJlZ2lvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMoXG4gICAgICAgICAgICAgIHByb3BzLnNlcnZpY2Uub3BlcmF0aW9ucy5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpLFxuICAgICAgICAgICAgICBpc0NhbmFyeSxcbiAgICAgICAgICAgICAgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5GQVVMVF9DT1VOVCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgIHJpZ2h0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0ZhdWx0cycsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiBNYXRoLmNlaWwocHJvcHMuc2VydmljZS5mYXVsdENvdW50VGhyZXNob2xkICogMS41KSxcbiAgICAgICAgfSxcbiAgICAgICAgcmlnaHRBbm5vdGF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICBsYWJlbDogJ0hpZ2ggc2V2ZXJpdHknLFxuICAgICAgICAgICAgdmFsdWU6IHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHByb3BzLnNlcnZpY2UuYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIEF2YWlsYWJpbGl0eScsXG4gICAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgICAgbGVmdDogWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVpvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3MoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMoXG4gICAgICAgICAgICAgIHByb3BzLnNlcnZpY2Uub3BlcmF0aW9ucy5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGlzQ2FuYXJ5LFxuICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZFxuICAgICAgICAgICksXG4gICAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICAgIG1heDogMTAwLFxuICAgICAgICAgICAgbWluOiA5NSxcbiAgICAgICAgICAgIGxhYmVsOiAnQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByaWdodDogWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWNzLmNyZWF0ZVpvbmFsU2VydmljZUF2YWlsYWJpbGl0eU1ldHJpY3MoXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMoXG4gICAgICAgICAgICAgIHByb3BzLnNlcnZpY2Uub3BlcmF0aW9ucy5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwpLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGlzQ2FuYXJ5LFxuICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHByb3BzLnNlcnZpY2UucGVyaW9kLFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkXG4gICAgICAgICAgKSxcbiAgICAgICAgICByaWdodFlBeGlzOiB7XG4gICAgICAgICAgICBsYWJlbDogJ0ZhdWx0cycsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbWF4OiBNYXRoLmNlaWwocHJvcHMuc2VydmljZS5mYXVsdENvdW50VGhyZXNob2xkICogMS41KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJpZ2h0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sb3I6IENvbG9yLlJFRCxcbiAgICAgICAgICAgICAgbGFiZWw6ICdIaWdoIHNldmVyaXR5JyxcbiAgICAgICAgICAgICAgdmFsdWU6IHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUxhdGVuY3lNZXRyaWNXaWRnZXRzKFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICAgIGlzQ2FuYXJ5OiBib29sZWFuXG4gICk6IElXaWRnZXRbXSB7XG4gICAgbGV0IHdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIHRpdGxlOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJykgKyAnIEhpZ2ggTGF0ZW5jeSBDb3VudCcsXG4gICAgICAgIHJlZ2lvbjogRm4ucmVmKCdBV1M6OlJlZ2lvbicpLFxuICAgICAgICBsZWZ0OiBSZWdpb25hbExhdGVuY3lNZXRyaWNzLmNyZWF0ZVJlZ2lvbmFsU2VydmljZUxhdGVuY3lDb3VudE1ldHJpY3Moe1xuICAgICAgICAgIGxhYmVsOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICBsYXRlbmN5TWV0cmljUHJvcHM6IHRoaXMuY3JlYXRlUmVnaW9uYWxMYXRlbmN5TWV0cmljUHJvcHMoXG4gICAgICAgICAgICBwcm9wcy5zZXJ2aWNlLm9wZXJhdGlvbnMuZmlsdGVyKCh4KSA9PiB4LmNyaXRpY2FsKSxcbiAgICAgICAgICAgIGlzQ2FuYXJ5LFxuICAgICAgICAgICAgTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtYXg6IHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCAqIDEuNSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbGFiZWw6ICdTdW0nLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICBsYWJlbDogJ0hpZ2ggc2V2ZXJpdHknLFxuICAgICAgICAgICAgdmFsdWU6IHByb3BzLnNlcnZpY2UuZmF1bHRDb3VudFRocmVzaG9sZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHByb3BzLnNlcnZpY2UuYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIEhpZ2ggTGF0ZW5jeSBDb3VudCcsXG4gICAgICAgICAgcmVnaW9uOiBGbi5yZWYoJ0FXUzo6UmVnaW9uJyksXG4gICAgICAgICAgbGVmdDogWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbFNlcnZpY2VMYXRlbmN5TWV0cmljcyh7XG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICAgIGxhdGVuY3lNZXRyaWNQcm9wczogdGhpcy5jcmVhdGVab25hbExhdGVuY3lNZXRyaWNQcm9wcyhcbiAgICAgICAgICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zLmZpbHRlcigoeCkgPT4geC5jcml0aWNhbCksXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgaXNDYW5hcnksXG4gICAgICAgICAgICAgIExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICAgIG1heDogcHJvcHMuc2VydmljZS5mYXVsdENvdW50VGhyZXNob2xkICogMS41LFxuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbGFiZWw6ICdTdW0nLFxuICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgICBsYWJlbDogJ0hpZ2ggc2V2ZXJpdHknLFxuICAgICAgICAgICAgICB2YWx1ZTogcHJvcHMuc2VydmljZS5mYXVsdENvdW50VGhyZXNob2xkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlZ2lvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMoXG4gICAgY3JpdGljYWxPcGVyYXRpb25zOiBJT3BlcmF0aW9uW10sXG4gICAgaXNDYW5hcnk6IGJvb2xlYW4sXG4gICAgbWV0cmljVHlwZTogQXZhaWxhYmlsaXR5TWV0cmljVHlwZSxcbiAgKTogQXZhaWxhYmlsaXR5TWV0cmljUHJvcHNbXSB7XG4gICAgcmV0dXJuIGNyaXRpY2FsT3BlcmF0aW9uc1xuICAgICAgLnJlZHVjZSgoZmlsdGVyZWQsIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc0NhbmFyeSAmJiB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzKSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaChcbiAgICAgICAgICAgIHZhbHVlLmNhbmFyeU1ldHJpY0RldGFpbHMuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbmFyeSkge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2godmFsdWUuc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICAgIH0sIFtdIGFzIElPcGVyYXRpb25NZXRyaWNEZXRhaWxzW10pXG4gICAgICAubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICB4Lm9wZXJhdGlvbk5hbWUgKyAnICcgKyBtZXRyaWNUeXBlLnRvU3RyaW5nKCkucmVwbGFjZSgnXycsICcgJyksXG4gICAgICAgICAgbWV0cmljRGV0YWlsczogeCxcbiAgICAgICAgICBtZXRyaWNUeXBlOiBtZXRyaWNUeXBlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpb25hbExhdGVuY3lNZXRyaWNQcm9wcyhcbiAgICBjcml0aWNhbE9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSxcbiAgICBpc0NhbmFyeTogYm9vbGVhbixcbiAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZSxcbiAgKTogTGF0ZW5jeU1ldHJpY1Byb3BzW10ge1xuICAgIHJldHVybiBjcml0aWNhbE9wZXJhdGlvbnNcbiAgICAgIC5yZWR1Y2UoKGZpbHRlcmVkLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXNDYW5hcnkgJiYgdmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscykge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2godmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FuYXJ5KSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaCh2YWx1ZS5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICAgIH0sIFtdIGFzIElPcGVyYXRpb25NZXRyaWNEZXRhaWxzW10pXG4gICAgICAubWFwKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICB4Lm9wZXJhdGlvbk5hbWUsXG4gICAgICAgICAgbWV0cmljRGV0YWlsczogeCxcbiAgICAgICAgICBtZXRyaWNUeXBlOiBtZXRyaWNUeXBlLFxuICAgICAgICAgIHN0YXRpc3RpYzogJ1RDKCcgKyB4LnN1Y2Nlc3NBbGFybVRocmVzaG9sZCArICc6KScsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMoXG4gICAgY3JpdGljYWxPcGVyYXRpb25zOiBJT3BlcmF0aW9uW10sXG4gICAgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLFxuICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nLFxuICAgIGlzQ2FuYXJ5OiBib29sZWFuLFxuICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUsXG4gICk6IFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHNbXSB7XG4gICAgcmV0dXJuIGNyaXRpY2FsT3BlcmF0aW9uc1xuICAgICAgLnJlZHVjZSgoZmlsdGVyZWQsIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0NhbmFyeSAmJlxuICAgICAgICAgIHZhbHVlLmNhbmFyeU1ldHJpY0RldGFpbHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHZhbHVlLmNhbmFyeU1ldHJpY0RldGFpbHMgIT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKFxuICAgICAgICAgICAgdmFsdWUuY2FuYXJ5TWV0cmljRGV0YWlscy5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FuYXJ5KSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaCh2YWx1ZS5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgfSwgW10gYXMgSU9wZXJhdGlvbk1ldHJpY0RldGFpbHNbXSlcbiAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgIHgub3BlcmF0aW9uTmFtZSArICcgJyArIG1ldHJpY1R5cGUudG9TdHJpbmcoKS5yZXBsYWNlKCdfJywgJyAnKSxcbiAgICAgICAgICBtZXRyaWNEZXRhaWxzOiB4LFxuICAgICAgICAgIG1ldHJpY1R5cGU6IG1ldHJpY1R5cGUsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVab25hbExhdGVuY3lNZXRyaWNQcm9wcyhcbiAgICBjcml0aWNhbE9wZXJhdGlvbnM6IElPcGVyYXRpb25bXSxcbiAgICBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyxcbiAgICBpc0NhbmFyeTogYm9vbGVhbixcbiAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZSxcbiAgKTogTGF0ZW5jeU1ldHJpY1Byb3BzW10ge1xuICAgIHJldHVybiBjcml0aWNhbE9wZXJhdGlvbnNcbiAgICAgIC5yZWR1Y2UoKGZpbHRlcmVkLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNDYW5hcnkgJiZcbiAgICAgICAgICB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICB2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzICE9IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlsdGVyZWQucHVzaCh2YWx1ZS5jYW5hcnlNZXRyaWNEZXRhaWxzLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYW5hcnkpIHtcbiAgICAgICAgICBmaWx0ZXJlZC5wdXNoKHZhbHVlLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgICAgfSwgW10gYXMgSU9wZXJhdGlvbk1ldHJpY0RldGFpbHNbXSlcbiAgICAgIC5tYXAoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgIHgub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICBtZXRyaWNEZXRhaWxzOiB4LFxuICAgICAgICAgIG1ldHJpY1R5cGU6IG1ldHJpY1R5cGUsXG4gICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgc3RhdGlzdGljOiAnVEMoJyArIHguc3VjY2Vzc0FsYXJtVGhyZXNob2xkICsgJzopJyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIGxldmVsIGRhc2hib2FyZFxuICAgKi9cbiAgZGFzaGJvYXJkOiBEYXNoYm9hcmQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbGV0IHRvcExldmVsQWdncmVnYXRlQWxhcm1XaWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1XaWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBtYXJrZG93bjogJyoqKkF2YWlsYWJpbGl0eSBhbmQgTGF0ZW5jeSBBbGFybXMqKionLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1XaWRnZXRzLnB1c2goXG4gICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgYWxhcm1zOiBbcHJvcHMuYWdncmVnYXRlUmVnaW9uYWxBbGFybV0sXG4gICAgICAgIHRpdGxlOlxuICAgICAgICAgICdDdXN0b21lciBFeHBlcmllbmNlIC0gUmVnaW9uYWwgQWdncmVnYXRlIEltcGFjdCBBbGFybSAobWVhc3VyZXMgZmF1bHQgY291bnQgaW4gYWdncmVnYXRlIGFjcm9zcyBhbGwgY3JpdGljYWwgb3BlcmF0aW9ucyknLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCBrZXlQcmVmaXg6IHN0cmluZyA9IE1ldHJpY3NIZWxwZXIubmV4dENoYXIoKTtcbiAgICBsZXQgcGVyT3BlcmF0aW9uQVpGYXVsdHNNZXRyaWNzOiBJTWV0cmljW10gPSBbXTtcblxuICAgIHByb3BzLnNlcnZpY2UuYXZhaWxhYmlsaXR5Wm9uZU5hbWVzLmZvckVhY2goKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuICAgICAgXG4gICAgICB0b3BMZXZlbEFnZ3JlZ2F0ZUFsYXJtV2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICBhbGFybXM6IFtwcm9wcy56b25hbEFnZ3JlZ2F0ZUFsYXJtc1tpbmRleF1dLFxuICAgICAgICAgIHRpdGxlOlxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkICtcbiAgICAgICAgICAgICcgWm9uYWwgSXNvbGF0ZWQgSW1wYWN0IEFsYXJtIChhbnkgY3JpdGljYWwgb3BlcmF0aW9uIGluIHRoaXMgQVogc2hvd3MgaW1wYWN0IGZyb20gc2VydmVyLXNpZGUgb3IgY2FuYXJ5KScsXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgbGV0IHVzaW5nTWV0cmljczogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH0gPSB7fTtcblxuICAgICAgcHJvcHMuc2VydmljZS5vcGVyYXRpb25zXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguY3JpdGljYWwgPT0gdHJ1ZSlcbiAgICAgICAgLmZvckVhY2goKHg6IElPcGVyYXRpb24sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICB1c2luZ01ldHJpY3NbYCR7a2V5UHJlZml4fSR7aW5kZXh9YF0gPVxuICAgICAgICAgICAgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogeC5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyAnICsgeC5vcGVyYXRpb25OYW1lICsgJyBmYXVsdCBjb3VudCcsXG4gICAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4LnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMuem9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICAgICkpO1xuICAgICAgICB9KTtcblxuICAgICAgbGV0IHpvbmFsRmF1bHRDb3VudDogSU1ldHJpYyA9IG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbignKycpLFxuICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICB1c2luZ01ldHJpY3M6IHVzaW5nTWV0cmljcyxcbiAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZFxuICAgICAgfSk7XG5cbiAgICAgIHBlck9wZXJhdGlvbkFaRmF1bHRzTWV0cmljcy5wdXNoKHpvbmFsRmF1bHRDb3VudCk7XG4gICAgICBrZXlQcmVmaXggPSBNZXRyaWNzSGVscGVyLm5leHRDaGFyKGtleVByZWZpeCk7XG5cbiAgICB9KTtcblxuICAgIGxldCBhekNvbnRyaWJ1dG9yV2lkZ2V0czogSVdpZGdldFtdID0gW1xuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgbWFya2Rvd246ICcqKkFaIENvbnRyaWJ1dG9ycyBUbyBGYXVsdHMqKicsXG4gICAgICB9KSxcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICB0aXRsZTogJ0FaIEZhdWx0IENvdW50JyxcbiAgICAgICAgcGVyaW9kOiBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgbGVmdDogcGVyT3BlcmF0aW9uQVpGYXVsdHNNZXRyaWNzLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIHRvcExldmVsQWdncmVnYXRlQWxhcm1XaWRnZXRzLmNvbmNhdChcbiAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlVFBTV2lkZ2V0cyhcbiAgICAgICAgcHJvcHNcbiAgICAgICksXG4gICAgKTtcblxuICAgIHRoaXMuZGFzaGJvYXJkID0gbmV3IERhc2hib2FyZCh0aGlzLCAnVG9wTGV2ZWxEYXNoYm9hcmQnLCB7XG4gICAgICBkYXNoYm9hcmROYW1lOlxuICAgICAgICBwcm9wcy5zZXJ2aWNlLnNlcnZpY2VOYW1lLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICBGbi5zdWIoJy1hdmFpbGFiaWxpdHktYW5kLWxhdGVuY3ktJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgIGRlZmF1bHRJbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwsXG4gICAgICBwZXJpb2RPdmVycmlkZTogUGVyaW9kT3ZlcnJpZGUuQVVUTyxcbiAgICAgIHdpZGdldHM6IFtcbiAgICAgICAgdG9wTGV2ZWxBZ2dyZWdhdGVBbGFybVdpZGdldHMsXG4gICAgICAgIGF6Q29udHJpYnV0b3JXaWRnZXRzLFxuICAgICAgICBTZXJ2aWNlQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5nZW5lcmF0ZVNlcnZlclNpZGVBbmRDYW5hcnlBdmFpbGFiaWxpdHlXaWRnZXRzKFxuICAgICAgICAgIHByb3BzXG4gICAgICAgICksXG4gICAgICAgIFNlcnZpY2VBdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmdlbmVyYXRlU2VydmVyU2lkZUFuZENhbmFyeUxhdGVuY3lXaWRnZXRzKFxuICAgICAgICAgIHByb3BzXG4gICAgICAgICksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgbGV0IGxiOiBDZm5Mb2FkQmFsYW5jZXIgPSBwcm9wcy5zZXJ2aWNlLmxvYWRCYWxhbmNlcj8ubm9kZVxuICAgICAgLmRlZmF1bHRDaGlsZCBhcyBDZm5Mb2FkQmFsYW5jZXI7XG5cbiAgICBpZiAobGIgJiYgbGIudHlwZSA9PSAnYXBwbGljYXRpb24nKSB7XG4gICAgICB0aGlzLmRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgICBuZXcgVGV4dFdpZGdldCh7IGhlaWdodDogMiwgd2lkdGg6IDI0LCBtYXJrZG93bjogXCIqKkxvYWQgQmFsYW5jZXIgTWV0cmljcyoqXCIgfSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICAgIC4uLkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcy5nZW5lcmF0ZUxvYWRCYWxhbmNlcldpZGdldHMoXG4gICAgICAgICAgWyBwcm9wcy5zZXJ2aWNlLmxvYWRCYWxhbmNlciBhcyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgXSxcbiAgICAgICAgICBwcm9wcy5hek1hcHBlcixcbiAgICAgICAgICBwcm9wcy5zZXJ2aWNlLnBlcmlvZCxcbiAgICAgICAgICBwcm9wcy5zZXJ2aWNlLmRlZmF1bHRMYXRlbmN5TWV0cmljRGV0YWlscy5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICBwcm9wcy5zZXJ2aWNlLmRlZmF1bHRMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgcHJvcHMuc2VydmljZS5kZWZhdWx0TGF0ZW5jeU1ldHJpY0RldGFpbHMuZmF1bHRBbGFybVRocmVzaG9sZFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Duration } from 'aws-cdk-lib';
|
|
2
2
|
import { IAlarm, CfnInsightRule } from 'aws-cdk-lib/aws-cloudwatch';
|
|
3
|
-
import { ILoadBalancerV2 } from 'aws-cdk-lib/aws-elasticloadbalancingv2';
|
|
4
3
|
import { IAvailabilityZoneMapper } from '../../azmapper/IAvailabilityZoneMapper';
|
|
5
4
|
import { IOperation } from '../../services/IOperation';
|
|
6
5
|
/**
|
|
@@ -16,13 +15,6 @@ export interface OperationAvailabilityAndLatencyDashboardProps {
|
|
|
16
15
|
* The interval of the dashboard
|
|
17
16
|
*/
|
|
18
17
|
readonly interval: Duration;
|
|
19
|
-
/**
|
|
20
|
-
* The load balancer supporting this operation, if this is not
|
|
21
|
-
* provided, no load balancer metrics will be shown
|
|
22
|
-
*
|
|
23
|
-
* @default - No load balancer metrics will be shown on the dashboard
|
|
24
|
-
*/
|
|
25
|
-
readonly loadBalancer?: ILoadBalancerV2;
|
|
26
18
|
/**
|
|
27
19
|
* Per AZ server-side availability alarms
|
|
28
20
|
*/
|
|
@@ -81,4 +73,8 @@ export interface OperationAvailabilityAndLatencyDashboardProps {
|
|
|
81
73
|
* The AZ Mapper
|
|
82
74
|
*/
|
|
83
75
|
readonly azMapper: IAvailabilityZoneMapper;
|
|
76
|
+
/**
|
|
77
|
+
* The Availability Zones used for this operation
|
|
78
|
+
*/
|
|
79
|
+
readonly availabilityZones: string[];
|
|
84
80
|
}
|