@cdklabs/multi-az-observability 0.0.1-alpha.26 → 0.0.1-alpha.28
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 +3 -3
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +1 -1
- package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +4 -7
- package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.js +2 -2
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +3 -4
- package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +2 -9
- package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.d.ts +11 -3
- package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +19 -14
- package/lib/alarmsandrules/IOperationAlarmsAndRules.d.ts +19 -22
- package/lib/alarmsandrules/IOperationAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.d.ts +2 -1
- package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/IServiceAlarmsAndRules.d.ts +0 -6
- package/lib/alarmsandrules/IServiceAlarmsAndRules.js +1 -1
- package/lib/alarmsandrules/OperationAlarmsAndRules.d.ts +14 -17
- package/lib/alarmsandrules/OperationAlarmsAndRules.js +34 -52
- package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.d.ts +2 -1
- package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.js +4 -4
- package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.d.ts +16 -8
- package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +28 -24
- package/lib/alarmsandrules/ServiceAlarmsAndRules.js +9 -13
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +4 -63
- package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +1 -1
- package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.d.ts +28 -7
- package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.js +1 -1
- package/lib/azmapper/AvailabilityZoneMapper.js +1 -1
- package/lib/basic_observability/BasicServiceDashboard.d.ts +0 -1
- package/lib/basic_observability/BasicServiceDashboard.js +19 -30
- package/lib/basic_observability/BasicServiceMultiAZObservability.js +1 -1
- package/lib/canaries/src/canary.zip +0 -0
- package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +83 -76
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +3 -50
- package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +1 -1
- package/lib/monitoring/src/monitoring-layer.zip +0 -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 +7 -22
- 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/package.json +1 -1
|
@@ -12,13 +12,13 @@ const AvailabilityMetricType_1 = require("../utilities/AvailabilityMetricType");
|
|
|
12
12
|
const LatencyMetricType_1 = require("../utilities/LatencyMetricType");
|
|
13
13
|
const MetricsHelper_1 = require("../utilities/MetricsHelper");
|
|
14
14
|
const AvailabilityAndLatencyMetrics_1 = require("../metrics/AvailabilityAndLatencyMetrics");
|
|
15
|
-
// TODO: Create two sections in the dashboard, one for regional level metrics and one for zonal level metrics
|
|
16
|
-
// then regional level availability and latency alarms can be used through a composite alarm like (ALARM(availability) OR (ALARM(latency)) AND NOT(ALARM(az1) OR ALARM(az2))
|
|
17
15
|
/**
|
|
18
16
|
* Creates an operation level availability and latency dashboard
|
|
19
17
|
*/
|
|
20
18
|
class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
21
19
|
static createServerSideWidgets(dashboard, props) {
|
|
20
|
+
let operation = props.operationAlarmsAndRules.operation;
|
|
21
|
+
let availabilityZones = props.operationAlarmsAndRules.operation.service.availabilityZoneNames;
|
|
22
22
|
dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({
|
|
23
23
|
markdown: "## **Server-side Metrics**",
|
|
24
24
|
background: aws_cloudwatch_1.TextWidgetBackground.TRANSPARENT,
|
|
@@ -33,24 +33,24 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
33
33
|
title: 'Server-side Availability',
|
|
34
34
|
region: aws_cdk_lib_1.Aws.REGION,
|
|
35
35
|
left: [
|
|
36
|
-
...
|
|
36
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
37
37
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
38
38
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
39
39
|
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
40
40
|
availabilityZoneId: availabilityZoneId,
|
|
41
41
|
availabilityZone: availabilityZone,
|
|
42
42
|
label: availabilityZoneId + " (avg: ${AVG} min: ${MIN})",
|
|
43
|
-
metricDetails:
|
|
43
|
+
metricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
44
44
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
45
45
|
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
46
|
-
},
|
|
46
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
47
47
|
}),
|
|
48
48
|
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric({
|
|
49
49
|
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} min: ${MIN})",
|
|
50
|
-
metricDetails:
|
|
50
|
+
metricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
51
51
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
52
52
|
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
53
|
-
},
|
|
53
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
54
54
|
],
|
|
55
55
|
statistic: 'Sum',
|
|
56
56
|
leftYAxis: {
|
|
@@ -61,7 +61,7 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
61
61
|
},
|
|
62
62
|
leftAnnotations: [
|
|
63
63
|
{
|
|
64
|
-
value:
|
|
64
|
+
value: operation.serverSideAvailabilityMetricDetails.successAlarmThreshold,
|
|
65
65
|
visible: true,
|
|
66
66
|
color: aws_cloudwatch_1.Color.RED,
|
|
67
67
|
label: 'High Severity',
|
|
@@ -74,17 +74,17 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
74
74
|
width: 6,
|
|
75
75
|
title: 'Server-side Fault Count',
|
|
76
76
|
region: aws_cdk_lib_1.Aws.REGION,
|
|
77
|
-
left:
|
|
77
|
+
left: availabilityZones.map((availabilityZone, index) => {
|
|
78
78
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
79
79
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
80
80
|
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
81
81
|
availabilityZoneId: availabilityZoneId,
|
|
82
82
|
availabilityZone: availabilityZone,
|
|
83
83
|
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
84
|
-
metricDetails:
|
|
84
|
+
metricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
85
85
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
86
86
|
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
87
|
-
},
|
|
87
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
88
88
|
}),
|
|
89
89
|
statistic: 'Sum',
|
|
90
90
|
leftYAxis: {
|
|
@@ -99,17 +99,17 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
99
99
|
width: 6,
|
|
100
100
|
title: "Server-side Request Count",
|
|
101
101
|
region: aws_cdk_lib_1.Aws.REGION,
|
|
102
|
-
left:
|
|
102
|
+
left: availabilityZones.map((availabilityZone, index) => {
|
|
103
103
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
104
104
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
105
105
|
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
106
106
|
availabilityZoneId: availabilityZoneId,
|
|
107
107
|
availabilityZone: availabilityZone,
|
|
108
108
|
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
109
|
-
metricDetails:
|
|
109
|
+
metricDetails: operation.serverSideAvailabilityMetricDetails,
|
|
110
110
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
111
111
|
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
112
|
-
},
|
|
112
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
113
113
|
}),
|
|
114
114
|
statistic: 'Sum',
|
|
115
115
|
leftYAxis: {
|
|
@@ -118,14 +118,14 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
118
118
|
},
|
|
119
119
|
}),
|
|
120
120
|
// Server-side instance contributors to faults
|
|
121
|
-
...props.
|
|
121
|
+
...props.operationAlarmsAndRules.serverSideRegionalAlarmsAndRules.instanceContributorsToRegionalFaults ?
|
|
122
122
|
[
|
|
123
123
|
new ContributorInsightsWidget_1.ContributorInsightsWidget({
|
|
124
124
|
height: 8,
|
|
125
125
|
width: 6,
|
|
126
126
|
title: 'Individual Instance Contributors to Fault Count',
|
|
127
|
-
insightRule: props.
|
|
128
|
-
period:
|
|
127
|
+
insightRule: props.operationAlarmsAndRules.serverSideRegionalAlarmsAndRules.instanceContributorsToRegionalFaults,
|
|
128
|
+
period: operation.serverSideAvailabilityMetricDetails.period,
|
|
129
129
|
legendPosition: aws_cloudwatch_1.LegendPosition.BOTTOM,
|
|
130
130
|
orderStatistic: 'Sum',
|
|
131
131
|
accountId: aws_cdk_lib_1.Aws.ACCOUNT_ID,
|
|
@@ -134,21 +134,21 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
134
134
|
] : []);
|
|
135
135
|
// Server-side latency
|
|
136
136
|
let latencyWidgets = [];
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
operation.serverSideLatencyMetricDetails.successMetricNames.forEach((metricName) => {
|
|
138
|
+
operation.serverSideLatencyMetricDetails.graphedSuccessStatistics?.forEach((statistic) => {
|
|
139
139
|
latencyWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
140
140
|
height: 8,
|
|
141
141
|
width: 6,
|
|
142
142
|
title: `Server-side ${metricName} ${statistic} Latency`,
|
|
143
143
|
region: aws_cdk_lib_1.Aws.REGION,
|
|
144
144
|
left: [
|
|
145
|
-
...
|
|
145
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
146
146
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
147
147
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
148
148
|
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalLatencyMetric({
|
|
149
149
|
metricName: metricName,
|
|
150
150
|
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
151
|
-
metricDetails:
|
|
151
|
+
metricDetails: operation.serverSideLatencyMetricDetails,
|
|
152
152
|
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
153
153
|
statistic: statistic,
|
|
154
154
|
availabilityZoneId: availabilityZoneId,
|
|
@@ -159,21 +159,21 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
159
159
|
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createLatencyMetric({
|
|
160
160
|
metricName: metricName,
|
|
161
161
|
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
162
|
-
metricDetails:
|
|
162
|
+
metricDetails: operation.serverSideLatencyMetricDetails,
|
|
163
163
|
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
164
164
|
statistic: statistic,
|
|
165
165
|
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
166
|
-
},
|
|
166
|
+
}, operation.serverSideLatencyMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
167
167
|
],
|
|
168
168
|
leftYAxis: {
|
|
169
|
-
max:
|
|
169
|
+
max: operation.serverSideLatencyMetricDetails.successAlarmThreshold * 1.5,
|
|
170
170
|
min: 0,
|
|
171
|
-
label:
|
|
171
|
+
label: operation.serverSideLatencyMetricDetails.unit,
|
|
172
172
|
showUnits: false,
|
|
173
173
|
},
|
|
174
174
|
leftAnnotations: [
|
|
175
175
|
{
|
|
176
|
-
value:
|
|
176
|
+
value: operation.serverSideLatencyMetricDetails.successAlarmThreshold,
|
|
177
177
|
visible: true,
|
|
178
178
|
color: aws_cloudwatch_1.Color.RED,
|
|
179
179
|
label: 'High Severity',
|
|
@@ -188,16 +188,16 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
188
188
|
height: 8,
|
|
189
189
|
width: 6,
|
|
190
190
|
title: 'Server-side High Latency Request Count',
|
|
191
|
-
left:
|
|
191
|
+
left: availabilityZones.map((availabilityZone, index) => {
|
|
192
192
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
193
193
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
194
194
|
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalCountLatencyMetric({
|
|
195
195
|
availabilityZoneId: availabilityZoneId,
|
|
196
196
|
availabilityZone: availabilityZone,
|
|
197
|
-
metricDetails:
|
|
197
|
+
metricDetails: operation.serverSideLatencyMetricDetails,
|
|
198
198
|
label: availabilityZoneId,
|
|
199
199
|
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
200
|
-
statistic: `TC(${
|
|
200
|
+
statistic: `TC(${operation.serverSideLatencyMetricDetails.successAlarmThreshold}:)`,
|
|
201
201
|
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
202
202
|
});
|
|
203
203
|
}),
|
|
@@ -208,14 +208,14 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
208
208
|
},
|
|
209
209
|
}),
|
|
210
210
|
// Server-side instance contributors to latency
|
|
211
|
-
...props.
|
|
211
|
+
...props.operationAlarmsAndRules.serverSideRegionalAlarmsAndRules.instanceContributorsToRegionalHighLatency ?
|
|
212
212
|
[
|
|
213
213
|
new ContributorInsightsWidget_1.ContributorInsightsWidget({
|
|
214
214
|
height: 8,
|
|
215
215
|
width: 6,
|
|
216
216
|
title: 'Individual Instance Contributors to High Latency',
|
|
217
|
-
insightRule: props.
|
|
218
|
-
period:
|
|
217
|
+
insightRule: props.operationAlarmsAndRules.serverSideRegionalAlarmsAndRules.instanceContributorsToRegionalHighLatency,
|
|
218
|
+
period: operation.serverSideLatencyMetricDetails.period,
|
|
219
219
|
legendPosition: aws_cloudwatch_1.LegendPosition.BOTTOM,
|
|
220
220
|
orderStatistic: 'Sum',
|
|
221
221
|
accountId: aws_cdk_lib_1.Aws.ACCOUNT_ID,
|
|
@@ -223,13 +223,14 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
223
223
|
})
|
|
224
224
|
] : []);
|
|
225
225
|
dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({
|
|
226
|
-
height:
|
|
226
|
+
height: 1,
|
|
227
227
|
width: 24,
|
|
228
228
|
markdown: "### Alarms",
|
|
229
229
|
background: aws_cloudwatch_1.TextWidgetBackground.TRANSPARENT
|
|
230
230
|
}));
|
|
231
231
|
let availabilityAlarmWidgets = [];
|
|
232
|
-
props.
|
|
232
|
+
Object.keys(props.operationAlarmsAndRules.serverSideZonalAlarmsAndRulesMap).forEach((availabilityZone) => {
|
|
233
|
+
let alarm = props.operationAlarmsAndRules.serverSideZonalAlarmsAndRulesMap[availabilityZone].availabilityAlarm;
|
|
233
234
|
availabilityAlarmWidgets.push(new aws_cloudwatch_1.AlarmWidget({
|
|
234
235
|
alarm: alarm,
|
|
235
236
|
title: "Zonal Availability",
|
|
@@ -239,7 +240,8 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
239
240
|
});
|
|
240
241
|
dashboard.addWidgets(...availabilityAlarmWidgets);
|
|
241
242
|
let latencyAlarmWidgets = [];
|
|
242
|
-
props.
|
|
243
|
+
Object.keys(props.operationAlarmsAndRules.serverSideZonalAlarmsAndRulesMap).forEach((availabilityZone) => {
|
|
244
|
+
let alarm = props.operationAlarmsAndRules.serverSideZonalAlarmsAndRulesMap[availabilityZone].latencyAlarm;
|
|
243
245
|
latencyAlarmWidgets.push(new aws_cloudwatch_1.AlarmWidget({
|
|
244
246
|
alarm: alarm,
|
|
245
247
|
title: "Zonal Latency",
|
|
@@ -250,6 +252,8 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
250
252
|
dashboard.addWidgets(...latencyAlarmWidgets);
|
|
251
253
|
}
|
|
252
254
|
static createCanaryWidgets(dashboard, props) {
|
|
255
|
+
let operation = props.operationAlarmsAndRules.operation;
|
|
256
|
+
let availabilityZones = operation.service.availabilityZoneNames;
|
|
253
257
|
dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({
|
|
254
258
|
markdown: "## **Canary Metrics**",
|
|
255
259
|
background: aws_cloudwatch_1.TextWidgetBackground.TRANSPARENT,
|
|
@@ -264,24 +268,24 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
264
268
|
title: 'Canary Measured Availability',
|
|
265
269
|
region: aws_cdk_lib_1.Aws.REGION,
|
|
266
270
|
left: [
|
|
267
|
-
...
|
|
271
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
268
272
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
269
273
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
270
274
|
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
271
275
|
availabilityZoneId: availabilityZoneId,
|
|
272
276
|
availabilityZone: availabilityZone,
|
|
273
277
|
label: availabilityZoneId + " (avg: ${AVG} min: ${MIN})",
|
|
274
|
-
metricDetails:
|
|
278
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
275
279
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
276
280
|
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
277
|
-
},
|
|
281
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
278
282
|
}),
|
|
279
283
|
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric({
|
|
280
284
|
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} min: ${MIN})",
|
|
281
|
-
metricDetails:
|
|
285
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
282
286
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE,
|
|
283
287
|
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
284
|
-
},
|
|
288
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
285
289
|
],
|
|
286
290
|
statistic: 'Sum',
|
|
287
291
|
leftYAxis: {
|
|
@@ -292,7 +296,7 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
292
296
|
},
|
|
293
297
|
leftAnnotations: [
|
|
294
298
|
{
|
|
295
|
-
value:
|
|
299
|
+
value: operation.canaryMetricDetails.canaryAvailabilityMetricDetails.successAlarmThreshold,
|
|
296
300
|
visible: true,
|
|
297
301
|
color: aws_cloudwatch_1.Color.RED,
|
|
298
302
|
label: 'High Severity',
|
|
@@ -306,24 +310,24 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
306
310
|
title: 'Canary Measured Fault Count',
|
|
307
311
|
region: aws_cdk_lib_1.Aws.REGION,
|
|
308
312
|
left: [
|
|
309
|
-
...
|
|
313
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
310
314
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
311
315
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
312
316
|
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
313
317
|
availabilityZoneId: availabilityZoneId,
|
|
314
318
|
availabilityZone: availabilityZone,
|
|
315
|
-
metricDetails:
|
|
319
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
316
320
|
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
317
321
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
318
322
|
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
319
|
-
},
|
|
323
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
320
324
|
}),
|
|
321
325
|
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric({
|
|
322
|
-
metricDetails:
|
|
326
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
323
327
|
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
324
328
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT,
|
|
325
329
|
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
326
|
-
},
|
|
330
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
327
331
|
],
|
|
328
332
|
statistic: 'Sum',
|
|
329
333
|
leftYAxis: {
|
|
@@ -339,24 +343,24 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
339
343
|
title: 'Canary Measured Request Count',
|
|
340
344
|
region: aws_cdk_lib_1.Aws.REGION,
|
|
341
345
|
left: [
|
|
342
|
-
...
|
|
346
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
343
347
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
344
348
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
345
349
|
return AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createZonalAvailabilityMetric({
|
|
346
350
|
availabilityZoneId: availabilityZoneId,
|
|
347
351
|
availabilityZone: availabilityZone,
|
|
348
|
-
metricDetails:
|
|
352
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
349
353
|
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
350
354
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
351
355
|
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
352
|
-
},
|
|
356
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.zonalDimensions(availabilityZoneId, aws_cdk_lib_1.Aws.REGION));
|
|
353
357
|
}),
|
|
354
358
|
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createAvailabilityMetric({
|
|
355
|
-
metricDetails:
|
|
359
|
+
metricDetails: operation.canaryMetricDetails.canaryAvailabilityMetricDetails,
|
|
356
360
|
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
357
361
|
metricType: AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT,
|
|
358
362
|
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
359
|
-
},
|
|
363
|
+
}, operation.canaryMetricDetails.canaryAvailabilityMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
360
364
|
],
|
|
361
365
|
statistic: 'Sum',
|
|
362
366
|
leftYAxis: {
|
|
@@ -366,21 +370,21 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
366
370
|
}));
|
|
367
371
|
let latencyWidgets = [];
|
|
368
372
|
// Canary latency
|
|
369
|
-
|
|
370
|
-
|
|
373
|
+
operation.canaryMetricDetails.canaryLatencyMetricDetails.successMetricNames.forEach((metricName) => {
|
|
374
|
+
operation.canaryMetricDetails.canaryLatencyMetricDetails.graphedSuccessStatistics?.forEach((statistic) => {
|
|
371
375
|
latencyWidgets.push(new aws_cloudwatch_1.GraphWidget({
|
|
372
376
|
height: 8,
|
|
373
377
|
width: 6,
|
|
374
378
|
title: `Canary Measured ${metricName} ${statistic} Latency`,
|
|
375
379
|
region: aws_cdk_lib_1.Aws.REGION,
|
|
376
380
|
left: [
|
|
377
|
-
...
|
|
381
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
378
382
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
379
383
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
380
384
|
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalLatencyMetric({
|
|
381
385
|
metricName: metricName,
|
|
382
386
|
label: availabilityZoneId + " (avg: ${AVG} max: ${MAX})",
|
|
383
|
-
metricDetails:
|
|
387
|
+
metricDetails: operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
384
388
|
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
385
389
|
statistic: statistic,
|
|
386
390
|
availabilityZoneId: availabilityZoneId,
|
|
@@ -391,21 +395,21 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
391
395
|
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createLatencyMetric({
|
|
392
396
|
metricName: metricName,
|
|
393
397
|
label: aws_cdk_lib_1.Aws.REGION + " (avg: ${AVG} max: ${MAX})",
|
|
394
|
-
metricDetails:
|
|
398
|
+
metricDetails: operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
395
399
|
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
396
400
|
statistic: statistic,
|
|
397
401
|
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
398
|
-
},
|
|
402
|
+
}, operation.canaryMetricDetails.canaryLatencyMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
399
403
|
],
|
|
400
404
|
leftYAxis: {
|
|
401
|
-
max:
|
|
405
|
+
max: operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold * 1.5,
|
|
402
406
|
min: 0,
|
|
403
|
-
label:
|
|
407
|
+
label: operation.canaryMetricDetails.canaryLatencyMetricDetails.unit,
|
|
404
408
|
showUnits: false,
|
|
405
409
|
},
|
|
406
410
|
leftAnnotations: [
|
|
407
411
|
{
|
|
408
|
-
value:
|
|
412
|
+
value: operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold,
|
|
409
413
|
visible: true,
|
|
410
414
|
color: aws_cloudwatch_1.Color.RED,
|
|
411
415
|
label: 'High Severity',
|
|
@@ -421,26 +425,26 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
421
425
|
width: 6,
|
|
422
426
|
title: 'Canary Measured High Latency Request Count',
|
|
423
427
|
left: [
|
|
424
|
-
...
|
|
428
|
+
...availabilityZones.map((availabilityZone, index) => {
|
|
425
429
|
let azLetter = availabilityZone.substring(availabilityZone.length - 1);
|
|
426
430
|
let availabilityZoneId = props.azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
|
|
427
431
|
return ZonalLatencyMetrics_1.ZonalLatencyMetrics.createZonalCountLatencyMetric({
|
|
428
432
|
availabilityZoneId: availabilityZoneId,
|
|
429
433
|
availabilityZone: availabilityZone,
|
|
430
|
-
metricDetails:
|
|
434
|
+
metricDetails: operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
431
435
|
label: availabilityZoneId,
|
|
432
436
|
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
433
|
-
statistic: `TC(${
|
|
437
|
+
statistic: `TC(${operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold}:)`,
|
|
434
438
|
color: MetricsHelper_1.MetricsHelper.colors[index]
|
|
435
439
|
});
|
|
436
440
|
}),
|
|
437
441
|
AvailabilityAndLatencyMetrics_1.AvailabilityAndLatencyMetrics.createLatencyCountMetric({
|
|
438
442
|
label: aws_cdk_lib_1.Aws.REGION,
|
|
439
|
-
metricDetails:
|
|
443
|
+
metricDetails: operation.canaryMetricDetails.canaryLatencyMetricDetails,
|
|
440
444
|
metricType: LatencyMetricType_1.LatencyMetricType.SUCCESS_LATENCY,
|
|
441
|
-
statistic: `TC(${
|
|
445
|
+
statistic: `TC(${operation.canaryMetricDetails.canaryLatencyMetricDetails.successAlarmThreshold}:)`,
|
|
442
446
|
color: MetricsHelper_1.MetricsHelper.regionColor
|
|
443
|
-
},
|
|
447
|
+
}, operation.canaryMetricDetails.canaryLatencyMetricDetails.metricDimensions.regionalDimensions(aws_cdk_lib_1.Aws.REGION))
|
|
444
448
|
],
|
|
445
449
|
statistic: 'Sum',
|
|
446
450
|
leftYAxis: {
|
|
@@ -449,24 +453,25 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
449
453
|
},
|
|
450
454
|
}));
|
|
451
455
|
dashboard.addWidgets(new aws_cloudwatch_1.TextWidget({
|
|
452
|
-
height:
|
|
456
|
+
height: 1,
|
|
453
457
|
width: 24,
|
|
454
458
|
markdown: "### Alarms",
|
|
455
459
|
background: aws_cloudwatch_1.TextWidgetBackground.TRANSPARENT
|
|
456
460
|
}));
|
|
457
461
|
dashboard.addWidgets(new aws_cloudwatch_1.AlarmWidget({
|
|
458
|
-
alarm: props.
|
|
462
|
+
alarm: props.operationAlarmsAndRules.canaryRegionalAlarmsAndRules.availabilityAlarm,
|
|
459
463
|
title: "Regional Availability",
|
|
460
464
|
height: 2,
|
|
461
465
|
width: 8
|
|
462
466
|
}), new aws_cloudwatch_1.AlarmWidget({
|
|
463
|
-
alarm: props.
|
|
467
|
+
alarm: props.operationAlarmsAndRules.canaryRegionalAlarmsAndRules.latencyAlarm,
|
|
464
468
|
title: "Regional Latency",
|
|
465
469
|
height: 2,
|
|
466
470
|
width: 8
|
|
467
471
|
}));
|
|
468
472
|
let availabilityAlarmWidgets = [];
|
|
469
|
-
props.
|
|
473
|
+
Object.keys(props.operationAlarmsAndRules.canaryZonalAlarmsAndRulesMap).forEach((availabiltiyZone) => {
|
|
474
|
+
let alarm = props.operationAlarmsAndRules.canaryZonalAlarmsAndRulesMap[availabiltiyZone].availabilityAlarm;
|
|
470
475
|
availabilityAlarmWidgets.push(new aws_cloudwatch_1.AlarmWidget({
|
|
471
476
|
alarm: alarm,
|
|
472
477
|
title: "Zonal Availability",
|
|
@@ -476,7 +481,8 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
476
481
|
});
|
|
477
482
|
dashboard.addWidgets(...availabilityAlarmWidgets);
|
|
478
483
|
let latencyAlarmWidgets = [];
|
|
479
|
-
props.
|
|
484
|
+
Object.keys(props.operationAlarmsAndRules.canaryZonalAlarmsAndRulesMap).forEach((availabiltiyZone) => {
|
|
485
|
+
let alarm = props.operationAlarmsAndRules.canaryZonalAlarmsAndRulesMap[availabiltiyZone].latencyAlarm;
|
|
480
486
|
latencyAlarmWidgets.push(new aws_cloudwatch_1.AlarmWidget({
|
|
481
487
|
alarm: alarm,
|
|
482
488
|
title: "Zonal Latency",
|
|
@@ -488,9 +494,9 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
488
494
|
constructor(scope, id, props) {
|
|
489
495
|
super(scope, id);
|
|
490
496
|
this.dashboard = new aws_cloudwatch_1.Dashboard(this, 'Dashboard', {
|
|
491
|
-
dashboardName: props.operation.service.serviceName.toLowerCase() +
|
|
497
|
+
dashboardName: props.operationAlarmsAndRules.operation.service.serviceName.toLowerCase() +
|
|
492
498
|
'-' +
|
|
493
|
-
props.operation.operationName.toLowerCase() +
|
|
499
|
+
props.operationAlarmsAndRules.operation.operationName.toLowerCase() +
|
|
494
500
|
aws_cdk_lib_1.Fn.sub('-availability-and-latency-${AWS::Region}'),
|
|
495
501
|
defaultInterval: props.interval,
|
|
496
502
|
periodOverride: aws_cloudwatch_1.PeriodOverride.AUTO
|
|
@@ -499,15 +505,16 @@ class OperationAvailabilityAndLatencyDashboard extends constructs_1.Construct {
|
|
|
499
505
|
height: 2,
|
|
500
506
|
width: 24,
|
|
501
507
|
alarms: [
|
|
502
|
-
|
|
508
|
+
props.operationAlarmsAndRules.regionalImpactAlarm,
|
|
509
|
+
...Object.values(props.operationAlarmsAndRules.aggregateZonalAlarmsMap)
|
|
503
510
|
],
|
|
504
511
|
title: "Aggregate Alarms"
|
|
505
512
|
}));
|
|
506
513
|
OperationAvailabilityAndLatencyDashboard.createServerSideWidgets(this.dashboard, props);
|
|
507
|
-
if (props.operation.canaryMetricDetails) {
|
|
514
|
+
if (props.operationAlarmsAndRules.operation.canaryMetricDetails) {
|
|
508
515
|
OperationAvailabilityAndLatencyDashboard.createCanaryWidgets(this.dashboard, props);
|
|
509
516
|
}
|
|
510
517
|
}
|
|
511
518
|
}
|
|
512
519
|
exports.OperationAvailabilityAndLatencyDashboard = OperationAvailabilityAndLatencyDashboard;
|
|
513
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXNoYm9hcmRzL09wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUN0Qyw2Q0FBc0M7QUFDdEMsK0RBWW9DO0FBQ3BDLDJDQUF1QztBQUN2QywyRUFBd0U7QUFHeEUsd0VBQXFFO0FBQ3JFLGdGQUE2RTtBQUM3RSxzRUFBbUU7QUFDbkUsOERBQTJEO0FBQzNELDRGQUF5RjtBQUV6Riw2R0FBNkc7QUFDN0csNEtBQTRLO0FBQzVLOztHQUVHO0FBQ0gsTUFBYSx3Q0FDWCxTQUFRLHNCQUFTO0lBR1QsTUFBTSxDQUFDLHVCQUF1QixDQUNwQyxTQUFvQixFQUNwQixLQUFvRDtRQUdwRCxTQUFTLENBQUMsVUFBVSxDQUNsQixJQUFJLDJCQUFVLENBQUM7WUFDYixRQUFRLEVBQUUsNEJBQTRCO1lBQ3RDLFVBQVUsRUFBRSxxQ0FBb0IsQ0FBQyxXQUFXO1lBQzVDLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDLENBQ0gsQ0FBQztRQUVGLFNBQVMsQ0FBQyxVQUFVO1FBRWxCLDJCQUEyQjtRQUMzQixJQUFJLDRCQUFXLENBQUM7WUFDZCxNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLDBCQUEwQjtZQUNqQyxNQUFNLEVBQUUsaUJBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRTtnQkFDSixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBd0IsRUFBRSxLQUFhLEVBQUUsRUFBRTtvQkFDekUsSUFBSSxRQUFRLEdBQVcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0s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SyxDQUFDLHNCQUFzQjthQUNoQztZQUNELEtBQUssRUFBRSxrQkFBa0I7U0FDMUIsQ0FDRixDQUFDLENBQUM7UUFFSCx3Q0FBd0MsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhGLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hDLHdDQUF3QyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXBuQkQsNEZBb25CQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IEF3cywgRm4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBEYXNoYm9hcmQsXG4gIFBlcmlvZE92ZXJyaWRlLFxuICBJV2lkZ2V0LFxuICBBbGFybVN0YXR1c1dpZGdldCxcbiAgR3JhcGhXaWRnZXQsXG4gIENvbG9yLFxuICBMZWdlbmRQb3NpdGlvbixcbiAgVGV4dFdpZGdldCxcbiAgVGV4dFdpZGdldEJhY2tncm91bmQsXG4gIEFsYXJtV2lkZ2V0LFxuICBJQWxhcm0sXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ29udHJpYnV0b3JJbnNpZ2h0c1dpZGdldCB9IGZyb20gJy4vQ29udHJpYnV0b3JJbnNpZ2h0c1dpZGdldCc7XG5pbXBvcnQgeyBJT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCB9IGZyb20gJy4vSU9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQnO1xuaW1wb3J0IHsgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzIH0gZnJvbSAnLi9wcm9wcy9PcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMnO1xuaW1wb3J0IHsgWm9uYWxMYXRlbmN5TWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvWm9uYWxMYXRlbmN5TWV0cmljcyc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL0F2YWlsYWJpbGl0eU1ldHJpY1R5cGUnO1xuaW1wb3J0IHsgTGF0ZW5jeU1ldHJpY1R5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvTGF0ZW5jeU1ldHJpY1R5cGUnO1xuaW1wb3J0IHsgTWV0cmljc0hlbHBlciB9IGZyb20gJy4uL3V0aWxpdGllcy9NZXRyaWNzSGVscGVyJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9BdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcyc7XG5cbi8vIFRPRE86IENyZWF0ZSB0d28gc2VjdGlvbnMgaW4gdGhlIGRhc2hib2FyZCwgb25lIGZvciByZWdpb25hbCBsZXZlbCBtZXRyaWNzIGFuZCBvbmUgZm9yIHpvbmFsIGxldmVsIG1ldHJpY3Ncbi8vIHRoZW4gcmVnaW9uYWwgbGV2ZWwgYXZhaWxhYmlsaXR5IGFuZCBsYXRlbmN5IGFsYXJtcyBjYW4gYmUgdXNlZCB0aHJvdWdoIGEgY29tcG9zaXRlIGFsYXJtIGxpa2UgKEFMQVJNKGF2YWlsYWJpbGl0eSkgT1IgKEFMQVJNKGxhdGVuY3kpKSBBTkQgTk9UKEFMQVJNKGF6MSkgT1IgQUxBUk0oYXoyKSlcbi8qKlxuICogQ3JlYXRlcyBhbiBvcGVyYXRpb24gbGV2ZWwgYXZhaWxhYmlsaXR5IGFuZCBsYXRlbmN5IGRhc2hib2FyZFxuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFxuICBleHRlbmRzIENvbnN0cnVjdFxuICBpbXBsZW1lbnRzIElPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkIHtcblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVTZXJ2ZXJTaWRlV2lkZ2V0cyhcbiAgICBkYXNoYm9hcmQ6IERhc2hib2FyZCxcbiAgICBwcm9wczogT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzXG4gICk6IHZvaWQge1xuICAgIFxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBtYXJrZG93bjogXCIjIyAqKlNlcnZlci1zaWRlIE1ldHJpY3MqKlwiLFxuICAgICAgICBiYWNrZ3JvdW5kOiBUZXh0V2lkZ2V0QmFja2dyb3VuZC5UUkFOU1BBUkVOVCxcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICB3aWR0aDogMjRcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSBhdmFpbGFiaWxpdHlcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnU2VydmVyLXNpZGUgQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICBsZWZ0OiBbXG4gICAgICAgICAgLi4ucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1pbjogJHtNSU59KVwiLFxuICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19SQVRFLFxuICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnpvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICApKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBsYWJlbDogQXdzLlJFR0lPTiArIFwiIChhdmc6ICR7QVZHfSAgbWluOiAke01JTn0pXCIsXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIG1heDogMTAwLFxuICAgICAgICAgIG1pbjogOTUsXG4gICAgICAgICAgbGFiZWw6ICdQZXJjZW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgbGFiZWw6ICdIaWdoIFNldmVyaXR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICB9KSxcblxuICAgICAgLy8gU2VydmVyLXNpZGUgZmF1bHQgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnU2VydmVyLXNpZGUgRmF1bHQgQ291bnQnLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IHByb3BzLmF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgIHJldHVybiBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHByb3BzLm9wZXJhdGlvbi5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMuem9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbGFiZWw6ICdDb3VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgICAgIC8vIFNlcnZlci1zaWRlIHJlcXVlc3QgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiBcIlNlcnZlci1zaWRlIFJlcXVlc3QgQ291bnRcIixcbiAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICBsZWZ0OiBwcm9wcy5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgICAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMuem9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIFNlcnZlci1zaWRlIGluc3RhbmNlIGNvbnRyaWJ1dG9ycyB0byBmYXVsdHNcbiAgICAgIC4uLiBwcm9wcy5pbnN0YW5jZUNvbnRyaWJ1dG9yc1RvRmF1bHRzID9cbiAgICAgICAgWyBcbiAgICAgICAgICBuZXcgQ29udHJpYnV0b3JJbnNpZ2h0c1dpZGdldCh7XG4gICAgICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgICAgICB3aWR0aDogNixcbiAgICAgICAgICAgIHRpdGxlOiAnSW5kaXZpZHVhbCBJbnN0YW5jZSBDb250cmlidXRvcnMgdG8gRmF1bHQgQ291bnQnLFxuICAgICAgICAgICAgaW5zaWdodFJ1bGU6IHByb3BzLmluc3RhbmNlQ29udHJpYnV0b3JzVG9GYXVsdHMsXG4gICAgICAgICAgICBwZXJpb2Q6IHByb3BzLm9wZXJhdGlvbi5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgICAgICBsZWdlbmRQb3NpdGlvbjogTGVnZW5kUG9zaXRpb24uQk9UVE9NLFxuICAgICAgICAgICAgb3JkZXJTdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgICAgYWNjb3VudElkOiBBd3MuQUNDT1VOVF9JRCwgXG4gICAgICAgICAgICB0b3BDb250cmlidXRvcnM6IDEwLFxuICAgICAgICAgIH0pIFxuICAgICAgICBdIDogW11cbiAgICAgICk7XG5cbiAgICAvLyBTZXJ2ZXItc2lkZSBsYXRlbmN5XG4gICAgbGV0IGxhdGVuY3lXaWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcbiAgICBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NNZXRyaWNOYW1lcy5mb3JFYWNoKChtZXRyaWNOYW1lOiBzdHJpbmcpID0+IHtcblxuICAgICAgcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5ncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3M/LmZvckVhY2goKHN0YXRpc3RpYzogc3RyaW5nKSA9PiB7XG5cbiAgICAgICAgbGF0ZW5jeVdpZGdldHMucHVzaChcbiAgICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgICAgICB0aXRsZTogYFNlcnZlci1zaWRlICR7bWV0cmljTmFtZX0gJHtzdGF0aXN0aWN9IExhdGVuY3lgLFxuICAgICAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICAgICAgbGVmdDogW1xuICAgICAgICAgICAgICAuLi5wcm9wcy5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBab25hbExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsTGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBtZXRyaWNOYW1lLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgICAgICAgc3RhdGlzdGljOiBzdGF0aXN0aWMsXG4gICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVMYXRlbmN5TWV0cmljKHtcbiAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBtZXRyaWNOYW1lLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICAgIG1ldHJpY1R5cGU6IExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgICAgICAgICBzdGF0aXN0aWM6IHN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5yZWdpb25Db2xvclxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICAgICAgbWF4OiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCAqIDEuNSxcbiAgICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgICBsYWJlbDogcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy51bml0LFxuICAgICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3BzLm9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29sb3I6IENvbG9yLlJFRCxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0hpZ2ggU2V2ZXJpdHknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICAuLi5sYXRlbmN5V2lkZ2V0cyxcblxuICAgICAgLy8gU2VydmVyLXNpZGUgaGlnaCBsYXRlbmN5IHJlcXVlc3QgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnU2VydmVyLXNpZGUgSGlnaCBMYXRlbmN5IFJlcXVlc3QgQ291bnQnLFxuICAgICAgICBsZWZ0OiBwcm9wcy5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgICAgICByZXR1cm4gWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbENvdW50TGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogYFRDKCR7cHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGR9OilgLFxuICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIuY29sb3JzW2luZGV4XVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIFNlcnZlci1zaWRlIGluc3RhbmNlIGNvbnRyaWJ1dG9ycyB0byBsYXRlbmN5XG4gICAgICAuLi4gcHJvcHMuaW5zdGFuY2VDb250cmlidXRvcnNUb0hpZ2hMYXRlbmN5ID9cbiAgICAgICAgW1xuICAgICAgICAgIG5ldyBDb250cmlidXRvckluc2lnaHRzV2lkZ2V0KHtcbiAgICAgICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgICAgIHdpZHRoOiA2LFxuICAgICAgICAgICAgdGl0bGU6ICdJbmRpdmlkdWFsIEluc3RhbmNlIENvbnRyaWJ1dG9ycyB0byBIaWdoIExhdGVuY3knLFxuICAgICAgICAgICAgaW5zaWdodFJ1bGU6IHByb3BzLmluc3RhbmNlQ29udHJpYnV0b3JzVG9IaWdoTGF0ZW5jeSxcbiAgICAgICAgICAgIHBlcmlvZDogcHJvcHMub3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgICAgICBsZWdlbmRQb3NpdGlvbjogTGVnZW5kUG9zaXRpb24uQk9UVE9NLFxuICAgICAgICAgICAgb3JkZXJTdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgICAgYWNjb3VudElkOiBBd3MuQUNDT1VOVF9JRCxcbiAgICAgICAgICAgIHRvcENvbnRyaWJ1dG9yczogMTAsXG4gICAgICAgICAgfSkgXG4gICAgICAgIF0gOiBbXVxuICAgICk7XG5cbiAgICBkYXNoYm9hcmQuYWRkV2lkZ2V0cyhcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIG1hcmtkb3duOiBcIiMjIyBBbGFybXNcIixcbiAgICAgICAgYmFja2dyb3VuZDogVGV4dFdpZGdldEJhY2tncm91bmQuVFJBTlNQQVJFTlRcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGxldCBhdmFpbGFiaWxpdHlBbGFybVdpZGdldHM6IElXaWRnZXRbXSA9IFtdXG5cbiAgICBwcm9wcy56b25hbEVuZHBvaW50U2VydmVyQXZhaWxhYmlsaXR5QWxhcm1zLmZvckVhY2goKGFsYXJtOiBJQWxhcm0pID0+IHtcbiAgICAgIGF2YWlsYWJpbGl0eUFsYXJtV2lkZ2V0cy5wdXNoKG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgIGFsYXJtOiBhbGFybSxcbiAgICAgICAgdGl0bGU6IFwiWm9uYWwgQXZhaWxhYmlsaXR5XCIsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDhcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKC4uLmF2YWlsYWJpbGl0eUFsYXJtV2lkZ2V0cyk7XG5cbiAgICBsZXQgbGF0ZW5jeUFsYXJtV2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICBwcm9wcy56b25hbEVuZHBvaW50U2VydmVyTGF0ZW5jeUFsYXJtcy5mb3JFYWNoKChhbGFybTogSUFsYXJtKSA9PiB7XG4gICAgICBsYXRlbmN5QWxhcm1XaWRnZXRzLnB1c2gobmV3IEFsYXJtV2lkZ2V0KHtcbiAgICAgICAgYWxhcm06IGFsYXJtLFxuICAgICAgICB0aXRsZTogXCJab25hbCBMYXRlbmN5XCIsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDhcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKC4uLmxhdGVuY3lBbGFybVdpZGdldHMpO1xuICB9XG4gIFxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDYW5hcnlXaWRnZXRzKFxuICAgIGRhc2hib2FyZDogRGFzaGJvYXJkLFxuICAgIHByb3BzOiBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHNcbiAgKTogdm9pZCB7XG5cbiAgICBkYXNoYm9hcmQuYWRkV2lkZ2V0cyhcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgbWFya2Rvd246IFwiIyMgKipDYW5hcnkgTWV0cmljcyoqXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFRleHRXaWRnZXRCYWNrZ3JvdW5kLlRSQU5TUEFSRU5ULFxuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIHdpZHRoOiAyNFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICAvLyBDYW5hcnkgYXZhaWxhYmlsaXR5XG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgIHdpZHRoOiA2LFxuICAgICAgICB0aXRsZTogJ0NhbmFyeSBNZWFzdXJlZCBBdmFpbGFiaWxpdHknLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAuLi5wcm9wcy5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiIChhdmc6ICR7QVZHfSAgbWluOiAke01JTn0pXCIsXG4gICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIuY29sb3JzW2luZGV4XVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMuem9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtaW46ICR7TUlOfSlcIixcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgbWV0cmljVHlwZTogQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX1JBVEUsXG4gICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5yZWdpb25Db2xvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy5yZWdpb25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgKSlcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbWF4OiAxMDAsXG4gICAgICAgICAgbWluOiA5NSxcbiAgICAgICAgICBsYWJlbDogJ1BlcmNlbnQnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29sb3I6IENvbG9yLlJFRCxcbiAgICAgICAgICAgIGxhYmVsOiAnSGlnaCBTZXZlcml0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgfSksXG5cbiAgICAgIC8vIENhbmFyeSBmYXVsdCBjb3VudFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogNixcbiAgICAgICAgdGl0bGU6ICdDYW5hcnkgTWVhc3VyZWQgRmF1bHQgQ291bnQnLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAuLi5wcm9wcy5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy56b25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICAgKSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBsYWJlbDogQXdzLlJFR0lPTiArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5ULFxuICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIucmVnaW9uQ29sb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgLy8gQ2FuYXJ5IHJlcXVlc3QgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnQ2FuYXJ5IE1lYXN1cmVkIFJlcXVlc3QgQ291bnQnLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAuLi5wcm9wcy5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgICAgbWV0cmljVHlwZTogQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5SRVFVRVNUX0NPVU5ULFxuICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy56b25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICAgKSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBsYWJlbDogQXdzLlJFR0lPTiArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5yZWdpb25Db2xvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy5yZWdpb25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgKSlcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbGFiZWw6ICdDb3VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGV0IGxhdGVuY3lXaWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIC8vIENhbmFyeSBsYXRlbmN5XG4gICAgcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NNZXRyaWNOYW1lcy5mb3JFYWNoKChtZXRyaWNOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy5ncmFwaGVkU3VjY2Vzc1N0YXRpc3RpY3M/LmZvckVhY2goKHN0YXRpc3RpYzogc3RyaW5nKSA9PiB7XG5cbiAgICAgICAgbGF0ZW5jeVdpZGdldHMucHVzaChcbiAgICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgICAgICB0aXRsZTogYENhbmFyeSBNZWFzdXJlZCAke21ldHJpY05hbWV9ICR7c3RhdGlzdGljfSBMYXRlbmN5YCxcbiAgICAgICAgICAgIHJlZ2lvbjogQXdzLlJFR0lPTixcbiAgICAgICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAgICAgLi4ucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbExhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogbWV0cmljTmFtZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgICAgICAgc3RhdGlzdGljOiBzdGF0aXN0aWMsXG4gICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVMYXRlbmN5TWV0cmljKHtcbiAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBtZXRyaWNOYW1lLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgICAgIHN0YXRpc3RpYzogc3RhdGlzdGljLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByb3BzLm9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICAgIG1heDogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCAqIDEuNSxcbiAgICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgICBsYWJlbDogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLnVuaXQsXG4gICAgICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVmdEFubm90YXRpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdIaWdoIFNldmVyaXR5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgLi4ubGF0ZW5jeVdpZGdldHMsXG5cbiAgICAgIC8vIENhbmFyeSBoaWdoLWxhdGVuY3kgcmVxdWVzdCBjb3VudFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogNixcbiAgICAgICAgdGl0bGU6ICdDYW5hcnkgTWVhc3VyZWQgSGlnaCBMYXRlbmN5IFJlcXVlc3QgQ291bnQnLFxuICAgICAgICBsZWZ0OiBbXG4gICAgICAgICAgLi4ucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIFpvbmFsTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxDb3VudExhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICAgIHN0YXRpc3RpYzogYFRDKCR7cHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZH06KWAsXG4gICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlTGF0ZW5jeUNvdW50TWV0cmljKHtcbiAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OLFxuICAgICAgICAgICAgbWV0cmljRGV0YWlsczogcHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLFxuICAgICAgICAgICAgbWV0cmljVHlwZTogTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZLFxuICAgICAgICAgICAgc3RhdGlzdGljOiBgVEMoJHtwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkfTopYCxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9wcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy5yZWdpb25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgKSlcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbGFiZWw6ICdDb3VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBkYXNoYm9hcmQuYWRkV2lkZ2V0cyhcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIG1hcmtkb3duOiBcIiMjIyBBbGFybXNcIixcbiAgICAgICAgYmFja2dyb3VuZDogVGV4dFdpZGdldEJhY2tncm91bmQuVFJBTlNQQVJFTlRcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgbmV3IEFsYXJtV2lkZ2V0KHtcbiAgICAgICAgYWxhcm06IHByb3BzLnJlZ2lvbmFsRW5kcG9pbnRDYW5hcnlBdmFpbGFiaWxpdHlBbGFybSEsXG4gICAgICAgIHRpdGxlOiBcIlJlZ2lvbmFsIEF2YWlsYWJpbGl0eVwiLFxuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiA4XG4gICAgICB9KSxcbiAgICAgIG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgIGFsYXJtOiBwcm9wcy5yZWdpb25hbEVuZHBvaW50Q2FuYXJ5TGF0ZW5jeUFsYXJtISxcbiAgICAgICAgdGl0bGU6IFwiUmVnaW9uYWwgTGF0ZW5jeVwiLFxuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiA4XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgbGV0IGF2YWlsYWJpbGl0eUFsYXJtV2lkZ2V0czogSVdpZGdldFtdID0gW11cblxuICAgIHByb3BzLnpvbmFsRW5kcG9pbnRDYW5hcnlBdmFpbGFiaWxpdHlBbGFybXMhLmZvckVhY2goKGFsYXJtOiBJQWxhcm0pID0+IHtcbiAgICAgIGF2YWlsYWJpbGl0eUFsYXJtV2lkZ2V0cy5wdXNoKG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgIGFsYXJtOiBhbGFybSxcbiAgICAgICAgdGl0bGU6IFwiWm9uYWwgQXZhaWxhYmlsaXR5XCIsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDhcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKC4uLmF2YWlsYWJpbGl0eUFsYXJtV2lkZ2V0cyk7XG5cbiAgICBsZXQgbGF0ZW5jeUFsYXJtV2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICBwcm9wcy56b25hbEVuZHBvaW50Q2FuYXJ5TGF0ZW5jeUFsYXJtcyEuZm9yRWFjaCgoYWxhcm06IElBbGFybSkgPT4ge1xuICAgICAgbGF0ZW5jeUFsYXJtV2lkZ2V0cy5wdXNoKG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgIGFsYXJtOiBhbGFybSxcbiAgICAgICAgdGl0bGU6IFwiWm9uYWwgTGF0ZW5jeVwiLFxuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiA4XG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbiBsZXZlbCBkYXNoYm9hcmRcbiAgICovXG4gIGRhc2hib2FyZDogRGFzaGJvYXJkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKHRoaXMsICdEYXNoYm9hcmQnLCB7XG4gICAgICBkYXNoYm9hcmROYW1lOlxuICAgICAgICBwcm9wcy5vcGVyYXRpb24uc2VydmljZS5zZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgJy0nICtcbiAgICAgICAgcHJvcHMub3BlcmF0aW9uLm9wZXJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKSArXG4gICAgICAgIEZuLnN1YignLWF2YWlsYWJpbGl0eS1hbmQtbGF0ZW5jeS0ke0FXUzo6UmVnaW9ufScpLFxuICAgICAgZGVmYXVsdEludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIHBlcmlvZE92ZXJyaWRlOiBQZXJpb2RPdmVycmlkZS5BVVRPXG4gICAgfSk7XG5cbiAgICB0aGlzLmRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgbmV3IEFsYXJtU3RhdHVzV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgIGFsYXJtczogW1xuICAgICAgICAgIC4uLnByb3BzLmlzb2xhdGVkQVpJbXBhY3RBbGFybXNcbiAgICAgICAgXSxcbiAgICAgICAgdGl0bGU6IFwiQWdncmVnYXRlIEFsYXJtc1wiXG4gICAgICB9XG4gICAgKSk7XG5cbiAgICBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkLmNyZWF0ZVNlcnZlclNpZGVXaWRnZXRzKHRoaXMuZGFzaGJvYXJkLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMub3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMpIHtcbiAgICAgIE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuY3JlYXRlQ2FuYXJ5V2lkZ2V0cyh0aGlzLmRhc2hib2FyZCwgcHJvcHMpO1xuICAgIH1cbiAgfVxufSJdfQ==
|
|
520
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXNoYm9hcmRzL09wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUN0Qyw2Q0FBc0M7QUFDdEMsK0RBWW9DO0FBQ3BDLDJDQUF1QztBQUN2QywyRUFBd0U7QUFHeEUsd0VBQXFFO0FBQ3JFLGdGQUE2RTtBQUM3RSxzRUFBbUU7QUFDbkUsOERBQTJEO0FBQzNELDRGQUF5RjtBQUd6Rjs7R0FFRztBQUNILE1BQWEsd0NBQ1gsU0FBUSxzQkFBUztJQUdULE1BQU0sQ0FBQyx1QkFBdUIsQ0FDcEMsU0FBb0IsRUFDcEIsS0FBb0Q7UUFHcEQsSUFBSSxTQUFTLEdBQWUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQztRQUNwRSxJQUFJLGlCQUFpQixHQUFhLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBRXhHLFNBQVMsQ0FBQyxVQUFVLENBQ2xCLElBQUksMkJBQVUsQ0FBQztZQUNiLFFBQVEsRUFBRSw0QkFBNEI7WUFDdEMsVUFBVSxFQUFFLHFDQUFvQixDQUFDLFdBQVc7WUFDNUMsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FDSCxDQUFDO1FBRUYsU0FBUyxDQUFDLFVBQVU7UUFFbEIsMkJBQTJCO1FBQzNCLElBQUksNEJBQVcsQ0FBQztZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsMEJBQTBCO1lBQ2pDLE1BQU0sRUFBRSxpQkFBRyxDQUFDLE1BQU07WUFDbEIsSUFBSSxFQUFFO2dCQUNKLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFD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SCxLQUFLLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUU7Z0JBQ25FLGdCQUFFLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDO1lBQ3BELGVBQWUsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUMvQixjQUFjLEVBQUUsK0JBQWMsQ0FBQyxJQUFJO1NBQ3BDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUN2QixJQUFJLGtDQUFpQixDQUFDO1lBQ3BCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxNQUFNLEVBQUU7Z0JBQ04sS0FBSyxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQjtnQkFDakQsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQzthQUN4RTtZQUNELEtBQUssRUFBRSxrQkFBa0I7U0FDMUIsQ0FDRixDQUFDLENBQUM7UUFFSCx3Q0FBd0MsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhGLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2hFLHdDQUF3QyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWxvQkQsNEZBa29CQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IEF3cywgRm4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBEYXNoYm9hcmQsXG4gIFBlcmlvZE92ZXJyaWRlLFxuICBJV2lkZ2V0LFxuICBBbGFybVN0YXR1c1dpZGdldCxcbiAgR3JhcGhXaWRnZXQsXG4gIENvbG9yLFxuICBMZWdlbmRQb3NpdGlvbixcbiAgVGV4dFdpZGdldCxcbiAgVGV4dFdpZGdldEJhY2tncm91bmQsXG4gIEFsYXJtV2lkZ2V0LFxuICBJQWxhcm0sXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ29udHJpYnV0b3JJbnNpZ2h0c1dpZGdldCB9IGZyb20gJy4vQ29udHJpYnV0b3JJbnNpZ2h0c1dpZGdldCc7XG5pbXBvcnQgeyBJT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZCB9IGZyb20gJy4vSU9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQnO1xuaW1wb3J0IHsgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzIH0gZnJvbSAnLi9wcm9wcy9PcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMnO1xuaW1wb3J0IHsgWm9uYWxMYXRlbmN5TWV0cmljcyB9IGZyb20gJy4uL21ldHJpY3MvWm9uYWxMYXRlbmN5TWV0cmljcyc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL0F2YWlsYWJpbGl0eU1ldHJpY1R5cGUnO1xuaW1wb3J0IHsgTGF0ZW5jeU1ldHJpY1R5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvTGF0ZW5jeU1ldHJpY1R5cGUnO1xuaW1wb3J0IHsgTWV0cmljc0hlbHBlciB9IGZyb20gJy4uL3V0aWxpdGllcy9NZXRyaWNzSGVscGVyJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9BdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcyc7XG5pbXBvcnQgeyBJT3BlcmF0aW9uIH0gZnJvbSAnLi4vc2VydmljZXMvSU9wZXJhdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvcGVyYXRpb24gbGV2ZWwgYXZhaWxhYmlsaXR5IGFuZCBsYXRlbmN5IGRhc2hib2FyZFxuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFxuICBleHRlbmRzIENvbnN0cnVjdFxuICBpbXBsZW1lbnRzIElPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkIHtcblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVTZXJ2ZXJTaWRlV2lkZ2V0cyhcbiAgICBkYXNoYm9hcmQ6IERhc2hib2FyZCxcbiAgICBwcm9wczogT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZFByb3BzXG4gICk6IHZvaWQge1xuXG4gICAgbGV0IG9wZXJhdGlvbjogSU9wZXJhdGlvbiA9IHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLm9wZXJhdGlvbjtcbiAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZXM6IHN0cmluZ1tdID0gcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMub3BlcmF0aW9uLnNlcnZpY2UuYXZhaWxhYmlsaXR5Wm9uZU5hbWVzO1xuICAgIFxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBtYXJrZG93bjogXCIjIyAqKlNlcnZlci1zaWRlIE1ldHJpY3MqKlwiLFxuICAgICAgICBiYWNrZ3JvdW5kOiBUZXh0V2lkZ2V0QmFja2dyb3VuZC5UUkFOU1BBUkVOVCxcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICB3aWR0aDogMjRcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSBhdmFpbGFiaWxpdHlcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnU2VydmVyLXNpZGUgQXZhaWxhYmlsaXR5JyxcbiAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICBsZWZ0OiBbXG4gICAgICAgICAgLi4uYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsQXZhaWxhYmlsaXR5TWV0cmljKHtcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1pbjogJHtNSU59KVwiLFxuICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19SQVRFLFxuICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnpvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICApKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBsYWJlbDogQXdzLlJFR0lPTiArIFwiIChhdmc6ICR7QVZHfSAgbWluOiAke01JTn0pXCIsXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIG1heDogMTAwLFxuICAgICAgICAgIG1pbjogOTUsXG4gICAgICAgICAgbGFiZWw6ICdQZXJjZW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogb3BlcmF0aW9uLnNlcnZlclNpZGVBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgbGFiZWw6ICdIaWdoIFNldmVyaXR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICB9KSxcblxuICAgICAgLy8gU2VydmVyLXNpZGUgZmF1bHQgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnU2VydmVyLXNpZGUgRmF1bHQgQ291bnQnLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IGF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IHByb3BzLmF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgICAgIHJldHVybiBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlQXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMuem9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbGFiZWw6ICdDb3VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgICAgIC8vIFNlcnZlci1zaWRlIHJlcXVlc3QgY291bnRcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiBcIlNlcnZlci1zaWRlIFJlcXVlc3QgQ291bnRcIixcbiAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICBsZWZ0OiBhdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgICAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMuem9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICkpXG4gICAgICAgIH0pLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIFNlcnZlci1zaWRlIGluc3RhbmNlIGNvbnRyaWJ1dG9ycyB0byBmYXVsdHNcbiAgICAgIC4uLiBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5zZXJ2ZXJTaWRlUmVnaW9uYWxBbGFybXNBbmRSdWxlcy5pbnN0YW5jZUNvbnRyaWJ1dG9yc1RvUmVnaW9uYWxGYXVsdHMgP1xuICAgICAgICBbIFxuICAgICAgICAgIG5ldyBDb250cmlidXRvckluc2lnaHRzV2lkZ2V0KHtcbiAgICAgICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgICAgIHdpZHRoOiA2LFxuICAgICAgICAgICAgdGl0bGU6ICdJbmRpdmlkdWFsIEluc3RhbmNlIENvbnRyaWJ1dG9ycyB0byBGYXVsdCBDb3VudCcsXG4gICAgICAgICAgICBpbnNpZ2h0UnVsZTogcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuc2VydmVyU2lkZVJlZ2lvbmFsQWxhcm1zQW5kUnVsZXMuaW5zdGFuY2VDb250cmlidXRvcnNUb1JlZ2lvbmFsRmF1bHRzLFxuICAgICAgICAgICAgcGVyaW9kOiBvcGVyYXRpb24uc2VydmVyU2lkZUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgICAgbGVnZW5kUG9zaXRpb246IExlZ2VuZFBvc2l0aW9uLkJPVFRPTSxcbiAgICAgICAgICAgIG9yZGVyU3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICAgIGFjY291bnRJZDogQXdzLkFDQ09VTlRfSUQsIFxuICAgICAgICAgICAgdG9wQ29udHJpYnV0b3JzOiAxMCxcbiAgICAgICAgICB9KSBcbiAgICAgICAgXSA6IFtdXG4gICAgICApO1xuXG4gICAgLy8gU2VydmVyLXNpZGUgbGF0ZW5jeVxuICAgIGxldCBsYXRlbmN5V2lkZ2V0czogSVdpZGdldFtdID0gW107XG4gICAgb3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzTWV0cmljTmFtZXMuZm9yRWFjaCgobWV0cmljTmFtZTogc3RyaW5nKSA9PiB7XG5cbiAgICAgIG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMuZ3JhcGhlZFN1Y2Nlc3NTdGF0aXN0aWNzPy5mb3JFYWNoKChzdGF0aXN0aWM6IHN0cmluZykgPT4ge1xuXG4gICAgICAgIGxhdGVuY3lXaWRnZXRzLnB1c2goXG4gICAgICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgICAgIHdpZHRoOiA2LFxuICAgICAgICAgICAgdGl0bGU6IGBTZXJ2ZXItc2lkZSAke21ldHJpY05hbWV9ICR7c3RhdGlzdGljfSBMYXRlbmN5YCxcbiAgICAgICAgICAgIHJlZ2lvbjogQXdzLlJFR0lPTixcbiAgICAgICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAgICAgLi4uYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbExhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogbWV0cmljTmFtZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgICAgIG1ldHJpY1R5cGU6IExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgICAgICAgICAgIHN0YXRpc3RpYzogc3RhdGlzdGljLFxuICAgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIuY29sb3JzW2luZGV4XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlTGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgICAgICAgbWV0cmljTmFtZTogbWV0cmljTmFtZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogQXdzLlJFR0lPTiArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICAgICAgc3RhdGlzdGljOiBzdGF0aXN0aWMsXG4gICAgICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIucmVnaW9uQ29sb3JcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgICAgIG1heDogb3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGQgKiAxLjUsXG4gICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgbGFiZWw6IG9wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMudW5pdCxcbiAgICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBDb2xvci5SRUQsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdIaWdoIFNldmVyaXR5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgLi4ubGF0ZW5jeVdpZGdldHMsXG5cbiAgICAgIC8vIFNlcnZlci1zaWRlIGhpZ2ggbGF0ZW5jeSByZXF1ZXN0IGNvdW50XG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgIHdpZHRoOiA2LFxuICAgICAgICB0aXRsZTogJ1NlcnZlci1zaWRlIEhpZ2ggTGF0ZW5jeSBSZXF1ZXN0IENvdW50JyxcbiAgICAgICAgbGVmdDogYXZhaWxhYmlsaXR5Wm9uZXMubWFwKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICAgICAgcmV0dXJuIFpvbmFsTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxDb3VudExhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLnNlcnZlclNpZGVMYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICBzdGF0aXN0aWM6IGBUQygke29wZXJhdGlvbi5zZXJ2ZXJTaWRlTGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkfTopYCxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICB9KVxuICAgICAgICB9KSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbGFiZWw6ICdDb3VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSBpbnN0YW5jZSBjb250cmlidXRvcnMgdG8gbGF0ZW5jeVxuICAgICAgLi4uIHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLnNlcnZlclNpZGVSZWdpb25hbEFsYXJtc0FuZFJ1bGVzLmluc3RhbmNlQ29udHJpYnV0b3JzVG9SZWdpb25hbEhpZ2hMYXRlbmN5ID9cbiAgICAgICAgW1xuICAgICAgICAgIG5ldyBDb250cmlidXRvckluc2lnaHRzV2lkZ2V0KHtcbiAgICAgICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgICAgIHdpZHRoOiA2LFxuICAgICAgICAgICAgdGl0bGU6ICdJbmRpdmlkdWFsIEluc3RhbmNlIENvbnRyaWJ1dG9ycyB0byBIaWdoIExhdGVuY3knLFxuICAgICAgICAgICAgaW5zaWdodFJ1bGU6IHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLnNlcnZlclNpZGVSZWdpb25hbEFsYXJtc0FuZFJ1bGVzLmluc3RhbmNlQ29udHJpYnV0b3JzVG9SZWdpb25hbEhpZ2hMYXRlbmN5LFxuICAgICAgICAgICAgcGVyaW9kOiBvcGVyYXRpb24uc2VydmVyU2lkZUxhdGVuY3lNZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uOiBMZWdlbmRQb3NpdGlvbi5CT1RUT00sXG4gICAgICAgICAgICBvcmRlclN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgICBhY2NvdW50SWQ6IEF3cy5BQ0NPVU5UX0lELFxuICAgICAgICAgICAgdG9wQ29udHJpYnV0b3JzOiAxMCxcbiAgICAgICAgICB9KSBcbiAgICAgICAgXSA6IFtdXG4gICAgKTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgbWFya2Rvd246IFwiIyMjIEFsYXJtc1wiLFxuICAgICAgICBiYWNrZ3JvdW5kOiBUZXh0V2lkZ2V0QmFja2dyb3VuZC5UUkFOU1BBUkVOVFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGV0IGF2YWlsYWJpbGl0eUFsYXJtV2lkZ2V0czogSVdpZGdldFtdID0gW11cblxuICAgIE9iamVjdC5rZXlzKHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLnNlcnZlclNpZGVab25hbEFsYXJtc0FuZFJ1bGVzTWFwKS5mb3JFYWNoKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcpID0+IHtcbiAgICAgIGxldCBhbGFybTogSUFsYXJtID0gcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuc2VydmVyU2lkZVpvbmFsQWxhcm1zQW5kUnVsZXNNYXBbYXZhaWxhYmlsaXR5Wm9uZV0uYXZhaWxhYmlsaXR5QWxhcm1cblxuICAgICAgYXZhaWxhYmlsaXR5QWxhcm1XaWRnZXRzLnB1c2gobmV3IEFsYXJtV2lkZ2V0KHtcbiAgICAgICAgYWxhcm06IGFsYXJtLFxuICAgICAgICB0aXRsZTogXCJab25hbCBBdmFpbGFiaWxpdHlcIixcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogOFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoLi4uYXZhaWxhYmlsaXR5QWxhcm1XaWRnZXRzKTtcblxuICAgIGxldCBsYXRlbmN5QWxhcm1XaWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIE9iamVjdC5rZXlzKHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLnNlcnZlclNpZGVab25hbEFsYXJtc0FuZFJ1bGVzTWFwKS5mb3JFYWNoKChhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcpID0+IHtcbiAgICAgIGxldCBhbGFybTogSUFsYXJtID0gcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuc2VydmVyU2lkZVpvbmFsQWxhcm1zQW5kUnVsZXNNYXBbYXZhaWxhYmlsaXR5Wm9uZV0ubGF0ZW5jeUFsYXJtXG5cbiAgICAgIGxhdGVuY3lBbGFybVdpZGdldHMucHVzaChuZXcgQWxhcm1XaWRnZXQoe1xuICAgICAgICBhbGFybTogYWxhcm0sXG4gICAgICAgIHRpdGxlOiBcIlpvbmFsIExhdGVuY3lcIixcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogOFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoLi4ubGF0ZW5jeUFsYXJtV2lkZ2V0cyk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNhbmFyeVdpZGdldHMoXG4gICAgZGFzaGJvYXJkOiBEYXNoYm9hcmQsXG4gICAgcHJvcHM6IE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmRQcm9wc1xuICApOiB2b2lkIHtcblxuICAgIGxldCBvcGVyYXRpb246IElPcGVyYXRpb24gPSBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5vcGVyYXRpb247XG4gICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVzOiBzdHJpbmdbXSA9IG9wZXJhdGlvbi5zZXJ2aWNlLmF2YWlsYWJpbGl0eVpvbmVOYW1lcztcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBtYXJrZG93bjogXCIjIyAqKkNhbmFyeSBNZXRyaWNzKipcIixcbiAgICAgICAgYmFja2dyb3VuZDogVGV4dFdpZGdldEJhY2tncm91bmQuVFJBTlNQQVJFTlQsXG4gICAgICAgIGhlaWdodDogMSxcbiAgICAgICAgd2lkdGg6IDI0XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBkYXNoYm9hcmQuYWRkV2lkZ2V0cyhcbiAgICAgIC8vIENhbmFyeSBhdmFpbGFiaWxpdHlcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogOCxcbiAgICAgICAgd2lkdGg6IDYsXG4gICAgICAgIHRpdGxlOiAnQ2FuYXJ5IE1lYXN1cmVkIEF2YWlsYWJpbGl0eScsXG4gICAgICAgIHJlZ2lvbjogQXdzLlJFR0lPTixcbiAgICAgICAgbGVmdDogW1xuICAgICAgICAgIC4uLmF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgICBsYWJlbDogYXZhaWxhYmlsaXR5Wm9uZUlkICsgXCIgKGF2ZzogJHtBVkd9ICBtaW46ICR7TUlOfSlcIixcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19SQVRFLFxuICAgICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5jb2xvcnNbaW5kZXhdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy56b25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgQXdzLlJFR0lPTlxuICAgICAgICAgICAgKSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgbGFiZWw6IEF3cy5SRUdJT04gKyBcIiAoYXZnOiAke0FWR30gIG1pbjogJHtNSU59KVwiLFxuICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURSxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICApKVxuICAgICAgICBdLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtYXg6IDEwMCxcbiAgICAgICAgICBtaW46IDk1LFxuICAgICAgICAgIGxhYmVsOiAnUGVyY2VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgbGVmdEFubm90YXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlBdmFpbGFiaWxpdHlNZXRyaWNEZXRhaWxzLnN1Y2Nlc3NBbGFybVRocmVzaG9sZCxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICBjb2xvcjogQ29sb3IuUkVELFxuICAgICAgICAgICAgbGFiZWw6ICdIaWdoIFNldmVyaXR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICB9KSxcblxuICAgICAgLy8gQ2FuYXJ5IGZhdWx0IGNvdW50XG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgIHdpZHRoOiA2LFxuICAgICAgICB0aXRsZTogJ0NhbmFyeSBNZWFzdXJlZCBGYXVsdCBDb3VudCcsXG4gICAgICAgIHJlZ2lvbjogQXdzLlJFR0lPTixcbiAgICAgICAgbGVmdDogW1xuICAgICAgICAgIC4uLmF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbEF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnpvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICApKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQsXG4gICAgICAgICAgICBjb2xvcjogTWV0cmljc0hlbHBlci5yZWdpb25Db2xvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMubWV0cmljRGltZW5zaW9ucy5yZWdpb25hbERpbWVuc2lvbnMoXG4gICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgKSlcbiAgICAgICAgXSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgbGVmdFlBeGlzOiB7XG4gICAgICAgICAgbWluOiAwLFxuICAgICAgICAgIGxhYmVsOiAnQ291bnQnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgIH0pLFxuXG4gICAgICAvLyBDYW5hcnkgcmVxdWVzdCBjb3VudFxuICAgICAgbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgICAgaGVpZ2h0OiA4LFxuICAgICAgICB3aWR0aDogNixcbiAgICAgICAgdGl0bGU6ICdDYW5hcnkgTWVhc3VyZWQgUmVxdWVzdCBDb3VudCcsXG4gICAgICAgIHJlZ2lvbjogQXdzLlJFR0lPTixcbiAgICAgICAgbGVmdDogW1xuICAgICAgICAgIC4uLmF2YWlsYWJpbGl0eVpvbmVzLm1hcCgoYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBsZXQgYXpMZXR0ZXI6IHN0cmluZyA9IGF2YWlsYWJpbGl0eVpvbmUuc3Vic3RyaW5nKGF2YWlsYWJpbGl0eVpvbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG4gICAgICAgICAgICByZXR1cm4gQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoe1xuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lSWQ6IGF2YWlsYWJpbGl0eVpvbmVJZCxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgbWV0cmljRGV0YWlsczogb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUF2YWlsYWJpbGl0eU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQgKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlJFUVVFU1RfQ09VTlQsXG4gICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnpvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBBd3MuUkVHSU9OXG4gICAgICAgICAgICApKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUF2YWlsYWJpbGl0eU1ldHJpYyh7XG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgIGxhYmVsOiBBd3MuUkVHSU9OICsgXCIgKGF2ZzogJHtBVkd9ICBtYXg6ICR7TUFYfSlcIixcbiAgICAgICAgICAgIG1ldHJpY1R5cGU6IEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuUkVRVUVTVF9DT1VOVCxcbiAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLnJlZ2lvbkNvbG9yXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5QXZhaWxhYmlsaXR5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICApKVxuICAgICAgICBdLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBsZXQgbGF0ZW5jeVdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgLy8gQ2FuYXJ5IGxhdGVuY3lcbiAgICBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc01ldHJpY05hbWVzLmZvckVhY2goKG1ldHJpY05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLmdyYXBoZWRTdWNjZXNzU3RhdGlzdGljcz8uZm9yRWFjaCgoc3RhdGlzdGljOiBzdHJpbmcpID0+IHtcblxuICAgICAgICBsYXRlbmN5V2lkZ2V0cy5wdXNoKFxuICAgICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgICAgICB3aWR0aDogNixcbiAgICAgICAgICAgIHRpdGxlOiBgQ2FuYXJ5IE1lYXN1cmVkICR7bWV0cmljTmFtZX0gJHtzdGF0aXN0aWN9IExhdGVuY3lgLFxuICAgICAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICAgICAgbGVmdDogW1xuICAgICAgICAgICAgICAuLi5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBhekxldHRlcjogc3RyaW5nID0gYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcoYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBsZXQgYXZhaWxhYmlsaXR5Wm9uZUlkOiBzdHJpbmcgPSBwcm9wcy5hek1hcHBlci5hdmFpbGFiaWxpdHlab25lSWRGcm9tQXZhaWxhYmlsaXR5Wm9uZUxldHRlcihhekxldHRlcik7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBab25hbExhdGVuY3lNZXRyaWNzLmNyZWF0ZVpvbmFsTGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBtZXRyaWNOYW1lLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6IGF2YWlsYWJpbGl0eVpvbmVJZCArIFwiIChhdmc6ICR7QVZHfSAgbWF4OiAke01BWH0pXCIsXG4gICAgICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICAgICAgICBzdGF0aXN0aWM6IHN0YXRpc3RpYyxcbiAgICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBNZXRyaWNzSGVscGVyLmNvbG9yc1tpbmRleF1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUxhdGVuY3lNZXRyaWMoe1xuICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IG1ldHJpY05hbWUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IEF3cy5SRUdJT04gKyBcIiAoYXZnOiAke0FWR30gIG1heDogJHtNQVh9KVwiLFxuICAgICAgICAgICAgICAgIG1ldHJpY0RldGFpbHM6IG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscyxcbiAgICAgICAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICAgICAgc3RhdGlzdGljOiBzdGF0aXN0aWMsXG4gICAgICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIucmVnaW9uQ29sb3JcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3BlcmF0aW9uLmNhbmFyeU1ldHJpY0RldGFpbHMhLmNhbmFyeUxhdGVuY3lNZXRyaWNEZXRhaWxzLm1ldHJpY0RpbWVuc2lvbnMucmVnaW9uYWxEaW1lbnNpb25zKFxuICAgICAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICAgICAgbWF4OiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkICogMS41LFxuICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgIGxhYmVsOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMudW5pdCxcbiAgICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWZ0QW5ub3RhdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkLFxuICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29sb3I6IENvbG9yLlJFRCxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0hpZ2ggU2V2ZXJpdHknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICAuLi5sYXRlbmN5V2lkZ2V0cyxcblxuICAgICAgLy8gQ2FuYXJ5IGhpZ2gtbGF0ZW5jeSByZXF1ZXN0IGNvdW50XG4gICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDgsXG4gICAgICAgIHdpZHRoOiA2LFxuICAgICAgICB0aXRsZTogJ0NhbmFyeSBNZWFzdXJlZCBIaWdoIExhdGVuY3kgUmVxdWVzdCBDb3VudCcsXG4gICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAuLi5hdmFpbGFiaWxpdHlab25lcy5tYXAoKGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IGF6TGV0dGVyOiBzdHJpbmcgPSBhdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhhdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gcHJvcHMuYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gWm9uYWxMYXRlbmN5TWV0cmljcy5jcmVhdGVab25hbENvdW50TGF0ZW5jeU1ldHJpYyh7XG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVJZDogYXZhaWxhYmlsaXR5Wm9uZUlkLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBhdmFpbGFiaWxpdHlab25lLFxuICAgICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICAgIGxhYmVsOiBhdmFpbGFiaWxpdHlab25lSWQsXG4gICAgICAgICAgICAgIG1ldHJpY1R5cGU6IExhdGVuY3lNZXRyaWNUeXBlLlNVQ0NFU1NfTEFURU5DWSxcbiAgICAgICAgICAgICAgc3RhdGlzdGljOiBgVEMoJHtvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMuc3VjY2Vzc0FsYXJtVGhyZXNob2xkfTopYCxcbiAgICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIuY29sb3JzW2luZGV4XVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBBdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy5jcmVhdGVMYXRlbmN5Q291bnRNZXRyaWMoe1xuICAgICAgICAgICAgbGFiZWw6IEF3cy5SRUdJT04sXG4gICAgICAgICAgICBtZXRyaWNEZXRhaWxzOiBvcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscyEuY2FuYXJ5TGF0ZW5jeU1ldHJpY0RldGFpbHMsXG4gICAgICAgICAgICBtZXRyaWNUeXBlOiBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1ksXG4gICAgICAgICAgICBzdGF0aXN0aWM6IGBUQygke29wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy5zdWNjZXNzQWxhcm1UaHJlc2hvbGR9OilgLFxuICAgICAgICAgICAgY29sb3I6IE1ldHJpY3NIZWxwZXIucmVnaW9uQ29sb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wZXJhdGlvbi5jYW5hcnlNZXRyaWNEZXRhaWxzIS5jYW5hcnlMYXRlbmN5TWV0cmljRGV0YWlscy5tZXRyaWNEaW1lbnNpb25zLnJlZ2lvbmFsRGltZW5zaW9ucyhcbiAgICAgICAgICAgIEF3cy5SRUdJT05cbiAgICAgICAgICApKVxuICAgICAgICBdLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvdW50JyxcbiAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGRhc2hib2FyZC5hZGRXaWRnZXRzKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgbWFya2Rvd246IFwiIyMjIEFsYXJtc1wiLFxuICAgICAgICBiYWNrZ3JvdW5kOiBUZXh0V2lkZ2V0QmFja2dyb3VuZC5UUkFOU1BBUkVOVFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICBuZXcgQWxhcm1XaWRnZXQoe1xuICAgICAgICBhbGFybTogcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuY2FuYXJ5UmVnaW9uYWxBbGFybXNBbmRSdWxlcyEuYXZhaWxhYmlsaXR5QWxhcm0sXG4gICAgICAgIHRpdGxlOiBcIlJlZ2lvbmFsIEF2YWlsYWJpbGl0eVwiLFxuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiA4XG4gICAgICB9KSxcbiAgICAgIG5ldyBBbGFybVdpZGdldCh7XG4gICAgICAgIGFsYXJtOiBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5jYW5hcnlSZWdpb25hbEFsYXJtc0FuZFJ1bGVzIS5sYXRlbmN5QWxhcm0sXG4gICAgICAgIHRpdGxlOiBcIlJlZ2lvbmFsIExhdGVuY3lcIixcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogOFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCBhdmFpbGFiaWxpdHlBbGFybVdpZGdldHM6IElXaWRnZXRbXSA9IFtdXG5cbiAgICBPYmplY3Qua2V5cyhwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5jYW5hcnlab25hbEFsYXJtc0FuZFJ1bGVzTWFwISkuZm9yRWFjaCgoYXZhaWxhYmlsdGl5Wm9uZTogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYWxhcm06IElBbGFybSA9IHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLmNhbmFyeVpvbmFsQWxhcm1zQW5kUnVsZXNNYXAhW2F2YWlsYWJpbHRpeVpvbmVdLmF2YWlsYWJpbGl0eUFsYXJtO1xuXG4gICAgICBhdmFpbGFiaWxpdHlBbGFybVdpZGdldHMucHVzaChuZXcgQWxhcm1XaWRnZXQoe1xuICAgICAgICBhbGFybTogYWxhcm0sXG4gICAgICAgIHRpdGxlOiBcIlpvbmFsIEF2YWlsYWJpbGl0eVwiLFxuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiA4XG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBkYXNoYm9hcmQuYWRkV2lkZ2V0cyguLi5hdmFpbGFiaWxpdHlBbGFybVdpZGdldHMpO1xuXG4gICAgbGV0IGxhdGVuY3lBbGFybVdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgT2JqZWN0LmtleXMocHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMuY2FuYXJ5Wm9uYWxBbGFybXNBbmRSdWxlc01hcCEpLmZvckVhY2goKGF2YWlsYWJpbHRpeVpvbmU6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGFsYXJtOiBJQWxhcm0gPSBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5jYW5hcnlab25hbEFsYXJtc0FuZFJ1bGVzTWFwIVthdmFpbGFiaWx0aXlab25lXS5sYXRlbmN5QWxhcm07XG4gICAgICBsYXRlbmN5QWxhcm1XaWRnZXRzLnB1c2gobmV3IEFsYXJtV2lkZ2V0KHtcbiAgICAgICAgYWxhcm06IGFsYXJtLFxuICAgICAgICB0aXRsZTogXCJab25hbCBMYXRlbmN5XCIsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDhcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGxldmVsIGRhc2hib2FyZFxuICAgKi9cbiAgZGFzaGJvYXJkOiBEYXNoYm9hcmQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBPcGVyYXRpb25BdmFpbGFiaWxpdHlBbmRMYXRlbmN5RGFzaGJvYXJkUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmRhc2hib2FyZCA9IG5ldyBEYXNoYm9hcmQodGhpcywgJ0Rhc2hib2FyZCcsIHtcbiAgICAgIGRhc2hib2FyZE5hbWU6XG4gICAgICAgIHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLm9wZXJhdGlvbi5zZXJ2aWNlLnNlcnZpY2VOYW1lLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAnLScgK1xuICAgICAgICBwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5vcGVyYXRpb24ub3BlcmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgRm4uc3ViKCctYXZhaWxhYmlsaXR5LWFuZC1sYXRlbmN5LSR7QVdTOjpSZWdpb259JyksXG4gICAgICBkZWZhdWx0SW50ZXJ2YWw6IHByb3BzLmludGVydmFsLFxuICAgICAgcGVyaW9kT3ZlcnJpZGU6IFBlcmlvZE92ZXJyaWRlLkFVVE9cbiAgICB9KTtcblxuICAgIHRoaXMuZGFzaGJvYXJkLmFkZFdpZGdldHMoXG4gICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgYWxhcm1zOiBbXG4gICAgICAgICAgcHJvcHMub3BlcmF0aW9uQWxhcm1zQW5kUnVsZXMucmVnaW9uYWxJbXBhY3RBbGFybSxcbiAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKHByb3BzLm9wZXJhdGlvbkFsYXJtc0FuZFJ1bGVzLmFnZ3JlZ2F0ZVpvbmFsQWxhcm1zTWFwKVxuICAgICAgICBdLFxuICAgICAgICB0aXRsZTogXCJBZ2dyZWdhdGUgQWxhcm1zXCJcbiAgICAgIH1cbiAgICApKTtcblxuICAgIE9wZXJhdGlvbkF2YWlsYWJpbGl0eUFuZExhdGVuY3lEYXNoYm9hcmQuY3JlYXRlU2VydmVyU2lkZVdpZGdldHModGhpcy5kYXNoYm9hcmQsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5vcGVyYXRpb25BbGFybXNBbmRSdWxlcy5vcGVyYXRpb24uY2FuYXJ5TWV0cmljRGV0YWlscykge1xuICAgICAgT3BlcmF0aW9uQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeURhc2hib2FyZC5jcmVhdGVDYW5hcnlXaWRnZXRzKHRoaXMuZGFzaGJvYXJkLCBwcm9wcyk7XG4gICAgfVxuICB9XG59Il19
|