axidio-styleguide-library1-v2 0.2.24 → 0.2.26
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/esm2022/lib/group-chart/group-chart.component.mjs +189 -2
- package/esm2022/lib/horizontal-bars-with-scroll-zoom/horizontal-bars-with-scroll-zoom.component.mjs +1081 -519
- package/esm2022/lib/horizontal-grouped-bar-with-scroll-zoom/horizontal-grouped-bar-with-scroll-zoom.component.mjs +348 -314
- package/fesm2022/axidio-styleguide-library1-v2.mjs +1767 -984
- package/fesm2022/axidio-styleguide-library1-v2.mjs.map +1 -1
- package/lib/horizontal-bars-with-scroll-zoom/horizontal-bars-with-scroll-zoom.component.d.ts +12 -74
- package/lib/horizontal-grouped-bar-with-scroll-zoom/horizontal-grouped-bar-with-scroll-zoom.component.d.ts +10 -0
- package/package.json +1 -1
package/esm2022/lib/horizontal-bars-with-scroll-zoom/horizontal-bars-with-scroll-zoom.component.mjs
CHANGED
|
@@ -18,18 +18,6 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
|
|
|
18
18
|
this.isTopCaptionVisible = true;
|
|
19
19
|
this.uniqueId = this.getUniqueId();
|
|
20
20
|
this.isTransparentBackground = false;
|
|
21
|
-
this.isCC = false;
|
|
22
|
-
this.isZoomedOut = true;
|
|
23
|
-
this.TICK_LENGTHS = {
|
|
24
|
-
short: 4,
|
|
25
|
-
long: 16,
|
|
26
|
-
shortBg: 5,
|
|
27
|
-
longBg: 30,
|
|
28
|
-
};
|
|
29
|
-
this.SPACING = {
|
|
30
|
-
rightSvgWidth: 60,
|
|
31
|
-
leftAndRight: 50,
|
|
32
|
-
};
|
|
33
21
|
this.defaultConfiguration = {
|
|
34
22
|
margin: { top: 20, right: 20, bottom: 20, left: 40 },
|
|
35
23
|
svgHeight: 70,
|
|
@@ -45,38 +33,83 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
|
|
|
45
33
|
forComparison: true,
|
|
46
34
|
headerMenuOptions: HeaderConfigHelper.headerConfig.headerMenuOptions,
|
|
47
35
|
yAxisGrid: false,
|
|
36
|
+
isHeaderVisible: undefined,
|
|
37
|
+
isTransparentBackground: undefined,
|
|
38
|
+
isTopCaptionVisible: undefined,
|
|
39
|
+
isMultiChartGridLine: undefined,
|
|
40
|
+
isFullScreen: undefined,
|
|
41
|
+
customYscale: undefined,
|
|
42
|
+
isXaxisLabelHidden: undefined,
|
|
43
|
+
isYaxisLabelHidden: undefined,
|
|
44
|
+
isYaxisHidden: undefined,
|
|
45
|
+
isYaxisDashed: undefined,
|
|
46
|
+
isXaxisColor: undefined,
|
|
47
|
+
textFormatter: undefined,
|
|
48
|
+
showTotalOnTop: undefined,
|
|
49
|
+
backendFormatterHasPriority: undefined,
|
|
50
|
+
showAngledLabels: undefined,
|
|
51
|
+
isNoAlternateXaxisText: undefined,
|
|
52
|
+
isXgridBetweenLabels: undefined,
|
|
53
|
+
showXaxisTop: undefined,
|
|
54
|
+
xAxisGrid: undefined,
|
|
55
|
+
xLabelsOnSameLine: undefined,
|
|
56
|
+
hideXaxisTick: undefined,
|
|
57
|
+
isDrilldownChart: undefined,
|
|
58
|
+
isTargetLine: undefined,
|
|
59
|
+
displayTitleOnTop: undefined,
|
|
60
|
+
isToggleVisible: undefined,
|
|
61
|
+
isTitleHidden: undefined,
|
|
48
62
|
};
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
ngOnChanges(changes) {
|
|
52
|
-
this.redrawChart();
|
|
53
|
-
}
|
|
54
|
-
onResized(event) {
|
|
55
|
-
setTimeout(() => this.redrawChart(), 10);
|
|
63
|
+
this.isCC = false;
|
|
64
|
+
this.isZoomedOut = true;
|
|
56
65
|
}
|
|
57
66
|
isZoomOutSelected(isZoomOut) {
|
|
58
67
|
this.isZoomedOut = isZoomOut;
|
|
59
|
-
this.
|
|
68
|
+
this.ngOnChanges();
|
|
60
69
|
}
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
ngOnChanges() {
|
|
71
|
+
let self = this;
|
|
72
|
+
d3.select('#' + self.uniqueId).remove();
|
|
63
73
|
this.initializeStackedChart();
|
|
64
74
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
};
|
|
75
|
+
onResized(event) {
|
|
76
|
+
let self = this;
|
|
77
|
+
setTimeout(function () {
|
|
78
|
+
d3.select('#' + self.uniqueId).remove();
|
|
79
|
+
self.initializeStackedChart();
|
|
80
|
+
}.bind(self), 10);
|
|
72
81
|
}
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
ngOnInit() { }
|
|
83
|
+
initializeStackedChart() {
|
|
84
|
+
var self = this;
|
|
85
|
+
let data = [];
|
|
86
|
+
let metaData = null;
|
|
87
|
+
let keyList = null;
|
|
88
|
+
let lineData = null;
|
|
89
|
+
let colors = null;
|
|
90
|
+
var alternate_text = false;
|
|
91
|
+
var alternate_label = false;
|
|
92
|
+
var short_tick_length = 4;
|
|
93
|
+
var long_tick_length = 16;
|
|
94
|
+
var short_tick_length_bg = 5;
|
|
95
|
+
var long_tick_length_bg = 30;
|
|
96
|
+
var formatFromBackend;
|
|
97
|
+
var formatForHugeNumbers;
|
|
98
|
+
var tempObjectHolder = {};
|
|
99
|
+
var rightSvgWidth = 60;
|
|
100
|
+
var leftAndRightSpaces = 50;
|
|
101
|
+
let isria = this.customChartConfiguration.isRia;
|
|
102
|
+
// Responsive breakpoints
|
|
103
|
+
const isMobile = window.innerWidth < 576;
|
|
104
|
+
const isTablet = window.innerWidth >= 576 && window.innerWidth < 992;
|
|
105
|
+
const isDesktop = window.innerWidth >= 992;
|
|
106
|
+
// Adjust margins and font sizes based on device
|
|
107
|
+
if (isMobile) {
|
|
75
108
|
this.chartConfiguration.margin = { top: 20, right: 10, bottom: 40, left: 30 };
|
|
76
109
|
this.chartConfiguration.numberOfYTicks = 4;
|
|
77
110
|
this.chartConfiguration.svgHeight = 60;
|
|
78
111
|
}
|
|
79
|
-
else if (
|
|
112
|
+
else if (isTablet) {
|
|
80
113
|
this.chartConfiguration.margin = { top: 25, right: 20, bottom: 45, left: 40 };
|
|
81
114
|
this.chartConfiguration.numberOfYTicks = 6;
|
|
82
115
|
this.chartConfiguration.svgHeight = 70;
|
|
@@ -86,199 +119,102 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
|
|
|
86
119
|
this.chartConfiguration.numberOfYTicks = 7;
|
|
87
120
|
this.chartConfiguration.svgHeight = 80;
|
|
88
121
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
prepareMetaData(metaData) {
|
|
96
|
-
if (!metaData.unit)
|
|
122
|
+
for (var i in this.defaultConfiguration) {
|
|
123
|
+
this.chartConfiguration[i] = ChartHelper.getValueByConfigurationType(i, this.defaultConfiguration, this.customChartConfiguration);
|
|
124
|
+
}
|
|
125
|
+
data = this.chartData.data;
|
|
126
|
+
metaData = this.chartData.metaData;
|
|
127
|
+
if (metaData.unit == undefined)
|
|
97
128
|
metaData.unit = '';
|
|
98
|
-
if (metaData.isCC)
|
|
129
|
+
if (metaData.isCC) {
|
|
99
130
|
this.isCC = metaData.isCC;
|
|
100
|
-
|
|
101
|
-
|
|
131
|
+
}
|
|
132
|
+
if (metaData.barWithoutClick && metaData.barWithoutClick.length) {
|
|
133
|
+
metaData.barWithoutClick = metaData.barWithoutClick.map((ele) => ele.toLowerCase());
|
|
102
134
|
}
|
|
103
135
|
else {
|
|
104
136
|
metaData.barWithoutClick = [];
|
|
105
137
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (isNaN(parsedNum))
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
let width = containerWidth - margin.left - margin.right;
|
|
120
|
-
let height = containerHeight * (this.chartConfiguration.svgHeight / 100) - margin.top - margin.bottom;
|
|
121
|
-
// Adjust width for zoom levels
|
|
122
|
-
const dataLength = this.chartData.data.length;
|
|
123
|
-
if (dataLength > 30 && this.isZoomedOut) {
|
|
124
|
-
const minWidth = dataLength * (device.isMobile ? 15 : 25);
|
|
125
|
-
width = Math.max(width, minWidth);
|
|
138
|
+
lineData = this.chartData.lineData;
|
|
139
|
+
colors = metaData.colors;
|
|
140
|
+
keyList = metaData.keyList;
|
|
141
|
+
var chartContainer = d3.select(this.containerElt.nativeElement);
|
|
142
|
+
var verticalstackedcontainer = d3.select(this.verticalstackedcontainerElt.nativeElement);
|
|
143
|
+
let parsedNum = parseFloat(this.chartData?.targetLineData?.target);
|
|
144
|
+
if (!isNaN(parsedNum)) {
|
|
145
|
+
if (Number.isInteger(parsedNum)) {
|
|
146
|
+
parsedNum = parseInt(this.chartData.targetLineData.target);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
parsedNum = parseFloat(this.chartData.targetLineData.target);
|
|
150
|
+
}
|
|
126
151
|
}
|
|
127
|
-
|
|
128
|
-
|
|
152
|
+
var margin = this.chartConfiguration.margin;
|
|
153
|
+
// Responsive width and height
|
|
154
|
+
var containerWidth = chartContainer.node().getBoundingClientRect().width;
|
|
155
|
+
var containerHeight = verticalstackedcontainer.node().getBoundingClientRect().height;
|
|
156
|
+
var width = containerWidth - margin.left - margin.right;
|
|
157
|
+
var height = containerHeight * (self.chartConfiguration.svgHeight / 100) - margin.top - margin.bottom;
|
|
158
|
+
// Adjust width for large datasets and zoom
|
|
159
|
+
if (this.chartData.data.length > 30 && this.isZoomedOut) {
|
|
160
|
+
width = width > this.chartData.data.length * (isMobile ? 15 : 25)
|
|
161
|
+
? width
|
|
162
|
+
: this.chartData.data.length * (isMobile ? 15 : 25);
|
|
129
163
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
height = this.chartConfiguration.svgHeight;
|
|
164
|
+
if (this.chartData.data.length > 8 && !this.isZoomedOut) {
|
|
165
|
+
width = this.chartData.data.length * (isMobile ? 60 : 130);
|
|
133
166
|
}
|
|
134
|
-
|
|
135
|
-
|
|
167
|
+
// Fullscreen and drilldown adjustments
|
|
168
|
+
if (this.chartConfiguration.isFullScreen != undefined && this.chartConfiguration.isFullScreen) {
|
|
169
|
+
height = this.chartConfiguration.svgHeight != 80
|
|
170
|
+
? this.chartConfiguration.svgHeight
|
|
171
|
+
: containerHeight;
|
|
136
172
|
}
|
|
137
173
|
if (this.chartConfiguration.isDrilldownChart) {
|
|
138
|
-
height = containerHeight - margin.top - margin.bottom - (
|
|
139
|
-
}
|
|
140
|
-
return { width, height };
|
|
141
|
-
}
|
|
142
|
-
calculateBarDimensions(width, dataLength, device) {
|
|
143
|
-
let barWidth;
|
|
144
|
-
let barPadding;
|
|
145
|
-
let requiredSvgWidth;
|
|
146
|
-
if (device.isMobile) {
|
|
147
|
-
const minBarWidth = 32;
|
|
148
|
-
barWidth = minBarWidth;
|
|
149
|
-
barPadding = 12;
|
|
150
|
-
requiredSvgWidth = Math.max(width - this.SPACING.rightSvgWidth, (barWidth + barPadding) * dataLength + this.SPACING.leftAndRight * 2 +
|
|
151
|
-
this.SPACING.rightSvgWidth - barPadding);
|
|
174
|
+
height = containerHeight - margin.top - margin.bottom - (isMobile ? 60 : 130);
|
|
152
175
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
createScales(data, height, width, device) {
|
|
161
|
-
const xScale = d3
|
|
162
|
-
.scaleBand()
|
|
163
|
-
.rangeRound([
|
|
164
|
-
this.SPACING.leftAndRight,
|
|
165
|
-
width - this.SPACING.rightSvgWidth - this.SPACING.leftAndRight
|
|
166
|
-
])
|
|
167
|
-
.domain(data.map(d => d.name).reverse())
|
|
168
|
-
.padding(device.isMobile ? 0.2 : 0.5);
|
|
169
|
-
const yScale = d3.scaleLinear().rangeRound([height, 0]);
|
|
170
|
-
return { xScale, yScale };
|
|
171
|
-
}
|
|
172
|
-
calculateYScaleDomain(layers, targetValue) {
|
|
173
|
-
let maxValue = d3.max(layers, (d) => d3.max(d, (d) => d[1])) || 0;
|
|
174
|
-
if (maxValue === 0) {
|
|
175
|
-
maxValue = targetValue ? targetValue + 20 : 100;
|
|
176
|
-
}
|
|
177
|
-
if (this.chartConfiguration.customYscale) {
|
|
178
|
-
maxValue *= this.chartConfiguration.customYscale;
|
|
179
|
-
}
|
|
180
|
-
if (targetValue && maxValue < targetValue) {
|
|
181
|
-
maxValue = maxValue < 10 && targetValue < 10
|
|
182
|
-
? targetValue + 3
|
|
183
|
-
: targetValue + 20;
|
|
184
|
-
}
|
|
185
|
-
return maxValue;
|
|
186
|
-
}
|
|
187
|
-
shouldShowTargetLineColor(d, targetValue) {
|
|
188
|
-
return !!(!isNaN(d[0]) &&
|
|
189
|
-
!isNaN(d[1]) &&
|
|
190
|
-
this.chartData.targetLineData &&
|
|
191
|
-
targetValue &&
|
|
192
|
-
parseFloat(d[1]) - parseFloat(d[0]) >= targetValue);
|
|
193
|
-
}
|
|
194
|
-
getBarFillColor(d, key, metaData, targetValue) {
|
|
195
|
-
if (this.shouldShowTargetLineColor(d, targetValue)) {
|
|
196
|
-
return this.chartData.targetLineData?.barAboveTargetColor || metaData.colors[key];
|
|
197
|
-
}
|
|
198
|
-
return metaData.colors[key];
|
|
199
|
-
}
|
|
200
|
-
isAcronym(label) {
|
|
201
|
-
const alphaOnly = label.replace(/[^A-Za-z]/g, '');
|
|
202
|
-
return (label.length <= 4 && /^[A-Z]+$/.test(label)) ||
|
|
203
|
-
(label === label.toUpperCase() && /[A-Z]/.test(label));
|
|
204
|
-
}
|
|
205
|
-
formatAxisLabel(text) {
|
|
206
|
-
const isAcr = this.isAcronym(text);
|
|
207
|
-
return {
|
|
208
|
-
formatted: isAcr ? text.toUpperCase() : text.toLowerCase(),
|
|
209
|
-
isAcronym: isAcr
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
initializeStackedChart() {
|
|
213
|
-
const device = this.getDeviceBreakpoints();
|
|
214
|
-
this.applyResponsiveConfig(device);
|
|
215
|
-
this.mergeConfigurations();
|
|
216
|
-
const { data, metaData, lineData } = this.chartData;
|
|
217
|
-
const preparedMetaData = this.prepareMetaData(metaData);
|
|
218
|
-
const targetValue = this.parseTargetValue(this.chartData.targetLineData);
|
|
219
|
-
const chartContainer = d3.select(this.containerElt.nativeElement);
|
|
220
|
-
const verticalstackedcontainer = d3.select(this.verticalstackedcontainerElt.nativeElement);
|
|
221
|
-
const margin = this.chartConfiguration.margin;
|
|
222
|
-
const containerWidth = chartContainer.node().getBoundingClientRect().width;
|
|
223
|
-
const containerHeight = verticalstackedcontainer.node().getBoundingClientRect().height;
|
|
224
|
-
const { width, height } = this.calculateDimensions(containerWidth, containerHeight, margin, device);
|
|
225
|
-
// Apply visibility configurations
|
|
226
|
-
if (this.chartConfiguration.isHeaderVisible !== undefined) {
|
|
176
|
+
// ...existing code...
|
|
177
|
+
/**
|
|
178
|
+
* for hiding header
|
|
179
|
+
* used by weekly charts
|
|
180
|
+
*/
|
|
181
|
+
if (this.chartConfiguration.isHeaderVisible != undefined) {
|
|
227
182
|
this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
|
|
228
183
|
}
|
|
229
|
-
|
|
184
|
+
/**
|
|
185
|
+
* for hiding legends
|
|
186
|
+
* used by weekly charts
|
|
187
|
+
*/
|
|
188
|
+
if (this.chartConfiguration.isTopCaptionVisible != undefined) {
|
|
189
|
+
//UPDATENAME
|
|
230
190
|
this.isTopCaptionVisible = this.chartConfiguration.isTopCaptionVisible;
|
|
231
191
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const formatForHugeNumbers = ChartHelper.dataValueFormatter('.2s');
|
|
240
|
-
// Create SVG containers
|
|
241
|
-
const { barWidth, barPadding, requiredSvgWidth } = this.calculateBarDimensions(width, data.length, device);
|
|
242
|
-
const outerContainer = this.createOuterContainer(chartContainer, height, margin);
|
|
243
|
-
const { svgYAxisLeft, svgYAxisRight } = this.createAxisContainers(outerContainer, height, margin);
|
|
244
|
-
const { innerContainer, svg } = this.createInnerContainer(outerContainer, requiredSvgWidth, height, margin, device);
|
|
245
|
-
// Create scales
|
|
246
|
-
const { xScale, yScale } = this.createScales(data, height, width, device);
|
|
247
|
-
// Stack data
|
|
248
|
-
const stack = d3
|
|
249
|
-
.stack()
|
|
250
|
-
.keys(preparedMetaData.keyList)
|
|
251
|
-
.offset(d3.stackOffsetNone);
|
|
252
|
-
const layers = stack(data);
|
|
253
|
-
// Set Y scale domain
|
|
254
|
-
const maxValue = this.calculateYScaleDomain(layers, targetValue || undefined);
|
|
255
|
-
yScale.domain([0, maxValue]).nice();
|
|
256
|
-
// Render chart elements
|
|
257
|
-
this.renderGrids(svg, xScale, yScale, height, width);
|
|
258
|
-
this.renderBars(svg, layers, xScale, yScale, preparedMetaData, device, barWidth, barPadding, targetValue, formatFromBackend, formatForHugeNumbers);
|
|
259
|
-
this.renderAxes(svg, svgYAxisLeft, svgYAxisRight, xScale, yScale, data, height, width, device);
|
|
260
|
-
this.renderLabels(svg, svgYAxisLeft, preparedMetaData, height, width, margin);
|
|
261
|
-
if (this.chartData.targetLineData && targetValue) {
|
|
262
|
-
this.renderTargetLine(svg, svgYAxisRight, yScale, width, targetValue, preparedMetaData);
|
|
192
|
+
/**
|
|
193
|
+
* for removing background color so that it can take parents color
|
|
194
|
+
*
|
|
195
|
+
*/
|
|
196
|
+
if (this.chartConfiguration.isTransparentBackground != undefined) {
|
|
197
|
+
this.isTransparentBackground =
|
|
198
|
+
this.chartConfiguration.isTransparentBackground;
|
|
263
199
|
}
|
|
264
|
-
|
|
265
|
-
|
|
200
|
+
/**
|
|
201
|
+
* format data values based on configuration received
|
|
202
|
+
*/
|
|
203
|
+
if (this.chartConfiguration.textFormatter != undefined) {
|
|
204
|
+
formatFromBackend = ChartHelper.dataValueFormatter(this.chartConfiguration.textFormatter);
|
|
205
|
+
formatForHugeNumbers = ChartHelper.dataValueFormatter('.2s');
|
|
266
206
|
}
|
|
267
|
-
|
|
268
|
-
createOuterContainer(chartContainer, height, margin) {
|
|
269
|
-
return chartContainer
|
|
207
|
+
var outerContainer = chartContainer
|
|
270
208
|
.append('div')
|
|
271
|
-
.attr('id',
|
|
209
|
+
.attr('id', self.uniqueId)
|
|
272
210
|
.attr('class', 'outer-container')
|
|
273
211
|
.style('width', '100%')
|
|
274
212
|
.style('height', height)
|
|
275
213
|
.style('overflow-x', 'hidden')
|
|
276
214
|
.style('padding-left', `${margin.left}px`)
|
|
277
215
|
.style('margin-left', '10px')
|
|
278
|
-
.style('padding-right', `${
|
|
279
|
-
|
|
280
|
-
createAxisContainers(outerContainer, height, margin) {
|
|
281
|
-
const svgYAxisLeft = outerContainer
|
|
216
|
+
.style('padding-right', `${rightSvgWidth}px`);
|
|
217
|
+
var svgYAxisLeft = outerContainer
|
|
282
218
|
.append('svg')
|
|
283
219
|
.attr('width', '80')
|
|
284
220
|
.attr('height', height + margin.top + margin.bottom)
|
|
@@ -286,414 +222,1039 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
|
|
|
286
222
|
.style('left', '0')
|
|
287
223
|
.style('z-index', 1)
|
|
288
224
|
.append('g')
|
|
289
|
-
.attr('transform',
|
|
290
|
-
|
|
225
|
+
.attr('transform', 'translate(' + (margin.left + 10) + ',' + margin.top + ')');
|
|
226
|
+
var svgYAxisRight = outerContainer
|
|
291
227
|
.append('svg')
|
|
292
|
-
.attr('width',
|
|
228
|
+
.attr('width', rightSvgWidth)
|
|
293
229
|
.attr('height', height + margin.top + margin.bottom)
|
|
294
230
|
.style('position', 'absolute')
|
|
295
231
|
.style('right', '2px')
|
|
296
232
|
.style('z-index', 1)
|
|
297
233
|
.append('g')
|
|
298
|
-
.attr('transform',
|
|
299
|
-
|
|
300
|
-
}
|
|
301
|
-
createInnerContainer(outerContainer, requiredSvgWidth, height, margin, device) {
|
|
302
|
-
const innerContainer = outerContainer
|
|
234
|
+
.attr('transform', 'translate(' + 0 + ',' + margin.top + ')');
|
|
235
|
+
var innerContainer = outerContainer
|
|
303
236
|
.append('div')
|
|
304
237
|
.attr('class', 'inner-container')
|
|
305
238
|
.style('width', '100%')
|
|
306
|
-
.style('overflow-x',
|
|
307
|
-
|
|
239
|
+
.style('overflow-x', 'auto');
|
|
240
|
+
// Calculate bar width and padding for mobile to avoid overlap and add space between bars
|
|
241
|
+
let barWidth;
|
|
242
|
+
let barPadding = 12; // px, space between bars on mobile
|
|
243
|
+
let requiredSvgWidth;
|
|
244
|
+
if (isMobile) {
|
|
245
|
+
// Use a minimum width per bar and add padding between bars
|
|
246
|
+
const minBarWidth = 32; // px, can adjust as needed
|
|
247
|
+
barWidth = minBarWidth;
|
|
248
|
+
requiredSvgWidth = Math.max(width - rightSvgWidth, (barWidth + barPadding) * data.length + leftAndRightSpaces * 2 + rightSvgWidth - barPadding // no padding after last bar
|
|
249
|
+
);
|
|
250
|
+
innerContainer.style('overflow-x', 'auto');
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
barWidth = Math.max(40, (width - rightSvgWidth - leftAndRightSpaces * 2) / data.length);
|
|
254
|
+
barPadding = 0;
|
|
255
|
+
requiredSvgWidth = width - rightSvgWidth;
|
|
256
|
+
}
|
|
257
|
+
var svg = innerContainer
|
|
308
258
|
.append('svg')
|
|
309
259
|
.attr('width', requiredSvgWidth)
|
|
310
260
|
.attr('height', height + margin.top + margin.bottom + 30)
|
|
311
261
|
.append('g')
|
|
312
|
-
.attr('transform',
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
262
|
+
.attr('transform', 'translate(' + 0 + ',' + margin.top + ')');
|
|
263
|
+
let stackKey = keyList;
|
|
264
|
+
var stack = d3
|
|
265
|
+
.stack()
|
|
266
|
+
.keys(stackKey)
|
|
267
|
+
/*.order(d3.stackOrder)*/
|
|
268
|
+
.offset(d3.stackOffsetNone);
|
|
269
|
+
var layers = stack(data);
|
|
270
|
+
data.sort(function (a, b) {
|
|
271
|
+
return b.total - a.total;
|
|
272
|
+
});
|
|
273
|
+
let lineYscale;
|
|
274
|
+
if (lineData != null) {
|
|
275
|
+
lineYscale = d3
|
|
276
|
+
.scaleLinear()
|
|
277
|
+
.domain([
|
|
278
|
+
0,
|
|
279
|
+
d3.max(lineData, function (d) {
|
|
280
|
+
return +d.value;
|
|
281
|
+
}),
|
|
282
|
+
])
|
|
283
|
+
.range([height, 0]);
|
|
284
|
+
}
|
|
285
|
+
// Calculate bar width for mobile to avoid overlap
|
|
286
|
+
// ...barWidth is now calculated above, remove duplicate...
|
|
287
|
+
var xScale = d3
|
|
288
|
+
.scaleBand()
|
|
289
|
+
.rangeRound([
|
|
290
|
+
leftAndRightSpaces,
|
|
291
|
+
width - rightSvgWidth - leftAndRightSpaces
|
|
292
|
+
])
|
|
293
|
+
.domain(data.map(function (d) {
|
|
294
|
+
return d.name;
|
|
295
|
+
}).reverse())
|
|
296
|
+
.padding(isMobile ? 0.2 : 0.5);
|
|
297
|
+
var xScaleFromOrigin = d3
|
|
298
|
+
.scaleBand()
|
|
299
|
+
.rangeRound([width - rightSvgWidth, 0])
|
|
300
|
+
.domain(data.map(function (d) {
|
|
301
|
+
return d.name;
|
|
302
|
+
}).reverse());
|
|
303
|
+
// ...existing code...
|
|
304
|
+
/**
|
|
305
|
+
* draw second x axis on top
|
|
306
|
+
*/
|
|
307
|
+
if (self.chartConfiguration.showXaxisTop) {
|
|
308
|
+
svg
|
|
309
|
+
.append('g')
|
|
310
|
+
.attr('class', 'lib-line-axis-text lib-line-x-axis-text x-axis')
|
|
311
|
+
.attr('style', self.chartConfiguration.xAxisCustomTextStyles)
|
|
312
|
+
.call(d3.axisBottom(xScale).tickSize(0));
|
|
313
|
+
svg.selectAll('.x-axis > g > text').attr('class', 'lib-display-hidden');
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* draw second x axis on top
|
|
317
|
+
*/
|
|
318
|
+
// if (self.chartConfiguration.showXaxisAtTarget) {
|
|
319
|
+
// svg
|
|
320
|
+
// .append('g')
|
|
321
|
+
// .attr('class', 'lib-line-axis-text lib-line-x-axis-text x-axis')
|
|
322
|
+
// .attr('style', self.chartConfiguration.xAxisCustomTextStyles)
|
|
323
|
+
// .call(d3.axisBottom(xScale).tickSize(0));
|
|
324
|
+
// svg.selectAll('.x-axis > g > text').attr('class', 'lib-display-hidden');
|
|
325
|
+
// }
|
|
326
|
+
if (this.chartConfiguration.xAxisGrid) {
|
|
327
|
+
for (var j = 0; j < this.chartConfiguration.xAxisGrid.length; j++) {
|
|
328
|
+
svg
|
|
329
|
+
.append('g')
|
|
330
|
+
.attr('class', `x${j + 2} axis${j + 2}`)
|
|
331
|
+
.style('color', 'var(--chart-grid-color)') // Use CSS variable instead of hardcoded
|
|
332
|
+
.attr('transform', 'translate(0,' + height * this.chartConfiguration.xAxisGrid[j] + ')')
|
|
333
|
+
.call(d3.axisBottom(xScale).tickSize(0).ticks(5).tickFormat(''))
|
|
334
|
+
.style('fill', 'var(--chart-text-color)');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
let yScale = d3.scaleLinear().rangeRound([height, 0]);
|
|
338
|
+
/**
|
|
339
|
+
* update max vakues so that the vakue wont exceed the max limit
|
|
340
|
+
* used by weekly charts
|
|
341
|
+
*/
|
|
342
|
+
var maxValue = d3.max(layers, (d) => d3.max(d, (d) => d[1]));
|
|
343
|
+
if (maxValue == 0) {
|
|
344
|
+
if (this.chartData.targetLineData) {
|
|
345
|
+
maxValue = this.chartData.targetLineData.target + 20;
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
maxValue = 100;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (this.chartConfiguration.customYscale) {
|
|
352
|
+
maxValue = maxValue * this.chartConfiguration.customYscale;
|
|
353
|
+
}
|
|
354
|
+
if (this.chartData.targetLineData &&
|
|
355
|
+
maxValue < this.chartData.targetLineData.target) {
|
|
356
|
+
maxValue =
|
|
357
|
+
maxValue < 10 && this.chartData.targetLineData.target < 10
|
|
358
|
+
? this.chartData.targetLineData.target + 3
|
|
359
|
+
: this.chartData.targetLineData.target + 20;
|
|
360
|
+
}
|
|
361
|
+
yScale.domain([0, maxValue]).nice();
|
|
362
|
+
let xAxis = d3
|
|
363
|
+
.axisBottom(xScale)
|
|
364
|
+
.tickSize(0)
|
|
365
|
+
.tickFormat(self.chartConfiguration.xAxisLabelFomatter);
|
|
366
|
+
let yAxis = d3
|
|
367
|
+
.axisLeft(yScale)
|
|
368
|
+
.ticks(self.chartConfiguration.numberOfYTicks)
|
|
369
|
+
.tickSize(0)
|
|
370
|
+
.tickFormat(self.chartConfiguration.yAxisLabelFomatter);
|
|
371
|
+
let yLineAxis;
|
|
372
|
+
if (lineYscale != null) {
|
|
373
|
+
yLineAxis = d3
|
|
374
|
+
.axisRight(lineYscale)
|
|
375
|
+
.ticks(self.chartConfiguration.numberOfYTicks)
|
|
376
|
+
.tickSize(0)
|
|
377
|
+
.tickFormat(self.chartConfiguration.yLineAxisLabelFomatter);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* between x-axis label used by weekly charts
|
|
381
|
+
* isXgridBetweenLabels will be undefined for dashboard charts
|
|
382
|
+
*/
|
|
383
|
+
if (self.chartConfiguration.isXgridBetweenLabels) {
|
|
317
384
|
svg
|
|
318
385
|
.append('g')
|
|
319
386
|
.attr('class', 'grid')
|
|
320
|
-
.attr('transform',
|
|
387
|
+
.attr('transform', 'translate(' + xScale.bandwidth() / 2 + ',' + height + ')')
|
|
321
388
|
.call(d3.axisBottom(xScale).tickSize(-height).tickFormat(''))
|
|
322
389
|
.style('stroke-dasharray', '5 5')
|
|
323
390
|
.style('color', '#999999')
|
|
391
|
+
// .style("opacity", "0.5")
|
|
324
392
|
.call((g) => g.select('.domain').remove());
|
|
325
393
|
}
|
|
326
|
-
|
|
394
|
+
/**
|
|
395
|
+
* used to draw y-axis grid
|
|
396
|
+
*/
|
|
397
|
+
if (self.chartConfiguration.yAxisGrid) {
|
|
327
398
|
svg
|
|
328
399
|
.append('g')
|
|
329
400
|
.attr('class', 'grid')
|
|
330
401
|
.call(d3
|
|
331
402
|
.axisLeft(yScale)
|
|
332
|
-
.ticks(
|
|
403
|
+
.ticks(self.chartConfiguration.numberOfYTicks)
|
|
333
404
|
.tickSize(-width)
|
|
334
405
|
.tickFormat(''))
|
|
406
|
+
// Remove hardcoded colors and use CSS variables
|
|
335
407
|
.style('color', 'var(--chart-grid-color)')
|
|
336
408
|
.style('opacity', '1');
|
|
409
|
+
// .call((g) => g.select('.domain').remove());
|
|
337
410
|
}
|
|
338
|
-
|
|
339
|
-
this.chartConfiguration.xAxisGrid.forEach((gridPos, index) => {
|
|
340
|
-
svg
|
|
341
|
-
.append('g')
|
|
342
|
-
.attr('class', `x${index + 2} axis${index + 2}`)
|
|
343
|
-
.style('color', 'var(--chart-grid-color)')
|
|
344
|
-
.attr('transform', `translate(0,${height * gridPos})`)
|
|
345
|
-
.call(d3.axisBottom(xScale).tickSize(0).ticks(5).tickFormat(''))
|
|
346
|
-
.style('fill', 'var(--chart-text-color)');
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
renderBars(svg, layers, xScale, yScale, metaData, device, barWidth, barPadding, targetValue, formatFromBackend, formatForHugeNumbers) {
|
|
351
|
-
const layer = svg
|
|
411
|
+
var layer = svg
|
|
352
412
|
.selectAll('.layer')
|
|
353
413
|
.data(layers)
|
|
354
414
|
.enter()
|
|
355
415
|
.append('g')
|
|
356
416
|
.attr('class', 'layer')
|
|
357
|
-
.style('fill', (d)
|
|
358
|
-
|
|
417
|
+
.style('fill', function (d, i) {
|
|
418
|
+
return metaData.colors[d.key];
|
|
419
|
+
});
|
|
420
|
+
var rect = layer
|
|
421
|
+
.selectAll('rect')
|
|
422
|
+
.data(function (d) {
|
|
423
|
+
return d;
|
|
424
|
+
})
|
|
425
|
+
.enter();
|
|
359
426
|
rect
|
|
360
427
|
.append('rect')
|
|
361
|
-
.on('click', (d)
|
|
362
|
-
if (!
|
|
363
|
-
if (!metaData.barWithoutClick
|
|
364
|
-
|
|
365
|
-
|
|
428
|
+
.on('click', function (d) {
|
|
429
|
+
if (!lineData || self.chartConfiguration.forComparison) {
|
|
430
|
+
if (!metaData.barWithoutClick ||
|
|
431
|
+
!metaData.barWithoutClick.length ||
|
|
432
|
+
!metaData.barWithoutClick.includes(d.data.name.toLowerCase()))
|
|
433
|
+
self.handleClick(d.data.name);
|
|
366
434
|
}
|
|
367
435
|
})
|
|
368
|
-
.attr('y', (d)
|
|
436
|
+
.attr('y', function (d) {
|
|
369
437
|
if (!isNaN(d[0]) && !isNaN(d[1])) {
|
|
370
438
|
const actualHeight = yScale(d[0]) - yScale(d[1]);
|
|
371
439
|
return actualHeight < 3 ? yScale(d[0]) - 3 : yScale(d[1]);
|
|
372
440
|
}
|
|
373
441
|
return 0;
|
|
374
442
|
})
|
|
375
|
-
.attr('x', (d, i)
|
|
376
|
-
if (
|
|
377
|
-
|
|
443
|
+
.attr('x', function (d, i) {
|
|
444
|
+
if (isMobile) {
|
|
445
|
+
// On mobile, position bars with padding
|
|
446
|
+
return leftAndRightSpaces + i * (barWidth + barPadding);
|
|
378
447
|
}
|
|
379
|
-
if (
|
|
448
|
+
if (self.chartConfiguration.isMultiChartGridLine == undefined) {
|
|
380
449
|
return xScale(d.data.name);
|
|
381
450
|
}
|
|
382
|
-
|
|
383
|
-
|
|
451
|
+
else {
|
|
452
|
+
if (self.chartConfiguration.isDrilldownChart &&
|
|
453
|
+
self.chartData.data.length <= 3) {
|
|
454
|
+
return xScale(d.data.name) + xScale.bandwidth() / 2 - 35;
|
|
455
|
+
}
|
|
456
|
+
return xScale(d.data.name) + xScale.bandwidth() * 0.1;
|
|
384
457
|
}
|
|
385
|
-
return xScale(d.data.name) + xScale.bandwidth() * 0.1;
|
|
386
458
|
})
|
|
387
|
-
.attr('height', (d)
|
|
459
|
+
.attr('height', function (d) {
|
|
388
460
|
if (!isNaN(d[0]) && !isNaN(d[1])) {
|
|
389
461
|
const actualHeight = yScale(d[0]) - yScale(d[1]);
|
|
390
462
|
return actualHeight < 3 ? 3 : actualHeight;
|
|
391
463
|
}
|
|
392
464
|
return 0;
|
|
393
465
|
})
|
|
394
|
-
.attr('width', (d)
|
|
395
|
-
|
|
466
|
+
.attr('width', function (d) {
|
|
467
|
+
// Use calculated barWidth for mobile, otherwise scale
|
|
468
|
+
if (isMobile) {
|
|
396
469
|
return barWidth;
|
|
397
|
-
if (this.chartConfiguration.isMultiChartGridLine === undefined) {
|
|
398
|
-
return xScale.bandwidth();
|
|
399
470
|
}
|
|
400
|
-
return
|
|
401
|
-
?
|
|
402
|
-
:
|
|
471
|
+
return self.chartConfiguration.isMultiChartGridLine == undefined
|
|
472
|
+
? xScale.bandwidth()
|
|
473
|
+
: self.chartConfiguration.isDrilldownChart &&
|
|
474
|
+
self.chartData.data.length <= 3
|
|
475
|
+
? 70
|
|
476
|
+
: xScale.bandwidth() * 0.8;
|
|
403
477
|
})
|
|
404
|
-
.style('cursor',
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
478
|
+
// .style('cursor', 'pointer');
|
|
479
|
+
.style('cursor', function (d) {
|
|
480
|
+
if (metaData.hasDrillDown) {
|
|
481
|
+
if (metaData.barWithoutClick.length > 0 &&
|
|
482
|
+
metaData.barWithoutClick.includes(d.data.name.toLowerCase())) {
|
|
483
|
+
return 'default';
|
|
484
|
+
}
|
|
485
|
+
return 'pointer';
|
|
409
486
|
}
|
|
410
|
-
|
|
487
|
+
else
|
|
488
|
+
return 'default';
|
|
411
489
|
})
|
|
412
|
-
.style('fill', (d)
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
490
|
+
.style('fill', function (d) {
|
|
491
|
+
if (!isNaN(d[0]) &&
|
|
492
|
+
!isNaN(d[1]) &&
|
|
493
|
+
self.chartData.targetLineData &&
|
|
494
|
+
parseFloat(d[1]) - parseFloat(d[0]) >=
|
|
495
|
+
parseFloat(self.chartData.targetLineData.target))
|
|
496
|
+
return self.chartData?.targetLineData?.barAboveTargetColor;
|
|
497
|
+
return metaData.colors[d.key];
|
|
498
|
+
});
|
|
499
|
+
/**
|
|
500
|
+
* do not show valus on hover as its alreay dislayed
|
|
501
|
+
*/
|
|
502
|
+
if (!this.isCC && !self.chartConfiguration.isMultiChartGridLine) {
|
|
503
|
+
rect
|
|
504
|
+
.append('svg:title') // TITLE APPENDED HERE
|
|
505
|
+
.text(function (d) {
|
|
506
|
+
return d[1] - d[0];
|
|
507
|
+
});
|
|
416
508
|
}
|
|
417
|
-
this.
|
|
418
|
-
}
|
|
419
|
-
addBarLabels(rect, xScale, yScale, metaData, formatFromBackend, formatForHugeNumbers) {
|
|
420
|
-
if (this.chartConfiguration.showTotalOnTop) {
|
|
509
|
+
if (this.isCC) {
|
|
421
510
|
rect
|
|
422
511
|
.append('text')
|
|
423
|
-
.attr('x',
|
|
512
|
+
.attr('x', function (d) {
|
|
513
|
+
return xScale(d.data.name);
|
|
514
|
+
})
|
|
515
|
+
.attr('text-anchor', function (d) {
|
|
516
|
+
if (!d[0]) {
|
|
517
|
+
return 'end';
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
return 'start';
|
|
521
|
+
}
|
|
522
|
+
})
|
|
523
|
+
.attr('class', 'verticalbar__text')
|
|
524
|
+
.attr('y', function (d) {
|
|
525
|
+
if (!d[0]) {
|
|
526
|
+
return yScale(d[1]);
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
return yScale(d[1]) - 7;
|
|
530
|
+
}
|
|
531
|
+
})
|
|
532
|
+
// .attr("y", function (d) { return yScale(d[0]) - yScale(d[1]); })
|
|
533
|
+
.attr('dy', function (d) {
|
|
534
|
+
return d.class;
|
|
535
|
+
})
|
|
536
|
+
.text(function (d) {
|
|
537
|
+
if (!d[0]) {
|
|
538
|
+
if (!isNaN(d[1] - d[0])) {
|
|
539
|
+
return Math.round((d[1] - d[0]) * 100) / 100;
|
|
540
|
+
}
|
|
541
|
+
else
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
if (!isNaN(d[1])) {
|
|
546
|
+
return Math.round(d[1] * 100) / 100;
|
|
547
|
+
}
|
|
548
|
+
else
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
svg
|
|
555
|
+
.append('foreignObject')
|
|
556
|
+
.attr('transform', 'translate(' + 0 + ',' + (yZero - 25) + ')')
|
|
557
|
+
.attr('width', width)
|
|
558
|
+
.attr('height', 30)
|
|
559
|
+
.append('xhtml:div')
|
|
560
|
+
.attr('class', 'target-display')
|
|
561
|
+
.style('color', this.chartData.targetLineData.color)
|
|
562
|
+
*/
|
|
563
|
+
/**
|
|
564
|
+
* on hover, display title on top
|
|
565
|
+
*/
|
|
566
|
+
function handleMouseOver(d, i) {
|
|
567
|
+
if (!self.chartConfiguration.displayTitleOnTop) {
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
svg
|
|
571
|
+
.selectAll('rect')
|
|
572
|
+
.filter(function (data) {
|
|
573
|
+
return data == d;
|
|
574
|
+
})
|
|
575
|
+
.style('fill', function (d) {
|
|
576
|
+
if (!isNaN(d[0]) &&
|
|
577
|
+
!isNaN(d[1]) &&
|
|
578
|
+
self.chartData.targetLineData &&
|
|
579
|
+
parseFloat(d[1]) - parseFloat(d[0]) >=
|
|
580
|
+
parseFloat(self.chartData.targetLineData.target))
|
|
581
|
+
return self.chartData.targetLineData.barAboveTargetHoverColor
|
|
582
|
+
? self.chartData.targetLineData.barAboveTargetHoverColor
|
|
583
|
+
: self.chartData?.targetLineData?.barAboveTargetColor
|
|
584
|
+
? self.chartData?.targetLineData?.barAboveTargetColor
|
|
585
|
+
: '';
|
|
586
|
+
return metaData.hoverColor ? metaData.hoverColor : '';
|
|
587
|
+
});
|
|
588
|
+
svg
|
|
589
|
+
.append('foreignObject')
|
|
590
|
+
.attr('x', function () {
|
|
591
|
+
if (xScale.bandwidth() + leftAndRightSpaces * 2 > 180) {
|
|
592
|
+
return (xScale(d.data.name) -
|
|
593
|
+
leftAndRightSpaces +
|
|
594
|
+
(xScale.bandwidth() + leftAndRightSpaces * 2 - 180) / 2);
|
|
595
|
+
}
|
|
596
|
+
return xScale(d.data.name) - leftAndRightSpaces;
|
|
597
|
+
})
|
|
598
|
+
.attr('class', 'lib-verticalstack-title-ontop')
|
|
599
|
+
.attr('y', function () {
|
|
600
|
+
// Increase the gap between the bar and the tooltip (was -1 - 40)
|
|
601
|
+
return yScale(d[1]) - 1 - 50; // 10px more gap
|
|
602
|
+
})
|
|
603
|
+
.attr('dy', function () {
|
|
604
|
+
return d.class;
|
|
605
|
+
})
|
|
606
|
+
.attr('width', function () {
|
|
607
|
+
if (d.data.name && /week/i.test(d.data.name) && /\d{4}-\d{2}-\d{2}/.test(d.data.name)) {
|
|
608
|
+
return '250px'; // increase for week + date
|
|
609
|
+
}
|
|
610
|
+
if (xScale.bandwidth() + leftAndRightSpaces * 2 > 180) {
|
|
611
|
+
return '180px';
|
|
612
|
+
}
|
|
613
|
+
return xScale.bandwidth() + leftAndRightSpaces * 2;
|
|
614
|
+
})
|
|
615
|
+
.attr('height', 40)
|
|
616
|
+
.append('xhtml:div')
|
|
617
|
+
.attr('class', 'title')
|
|
618
|
+
.style('z-index', 99)
|
|
619
|
+
.html(function () {
|
|
620
|
+
// Tooltip content without any arrow mark
|
|
621
|
+
if (!isNaN(d[1] - d[0])) {
|
|
622
|
+
if (d[1] - d[0] === 0) {
|
|
623
|
+
return '<span class="title-top-text">0</span>';
|
|
624
|
+
}
|
|
625
|
+
var dataType = metaData.dataType ? metaData.dataType : '';
|
|
626
|
+
var desiredText = '';
|
|
627
|
+
// Always show the full x-axis label (category name) in the tooltip
|
|
628
|
+
desiredText =
|
|
629
|
+
'<span class="title-bar-name">' +
|
|
630
|
+
(d.data.name ? d.data.name : '') +
|
|
631
|
+
'</span>';
|
|
632
|
+
desiredText += metaData.unit
|
|
633
|
+
? '<span class="title-top-text">' +
|
|
634
|
+
metaData.unit +
|
|
635
|
+
(d[1] - d[0]) + ' ' +
|
|
636
|
+
dataType +
|
|
637
|
+
'</span>'
|
|
638
|
+
: '<span class="title-top-text">' +
|
|
639
|
+
(d[1] - d[0]) + ' ' +
|
|
640
|
+
dataType +
|
|
641
|
+
'</span>';
|
|
642
|
+
// No arrow mark or arrow HTML/CSS in tooltip
|
|
643
|
+
return desiredText;
|
|
644
|
+
}
|
|
645
|
+
else
|
|
646
|
+
return;
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
function handleMouseOut(d, i) {
|
|
650
|
+
if (!self.chartConfiguration.displayTitleOnTop) {
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
// svg.selectAll('rect').style('fill', metaData.colors[d.key]);
|
|
654
|
+
svg.selectAll('rect').style('fill', function (d) {
|
|
655
|
+
if (!isNaN(d[0]) &&
|
|
656
|
+
!isNaN(d[1]) &&
|
|
657
|
+
self.chartData.targetLineData &&
|
|
658
|
+
parseFloat(d[1]) - parseFloat(d[0]) >=
|
|
659
|
+
parseFloat(self.chartData.targetLineData.target))
|
|
660
|
+
return self.chartData?.targetLineData?.barAboveTargetColor;
|
|
661
|
+
return metaData.colors[d.key];
|
|
662
|
+
});
|
|
663
|
+
svg.selectAll('.lib-verticalstack-title-ontop').remove();
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* used to show value on top of the bars
|
|
667
|
+
* need to be used by bar charts only(one bar should contain one value)
|
|
668
|
+
* used by weekly charts
|
|
669
|
+
*/
|
|
670
|
+
if (this.chartConfiguration.showTotalOnTop != undefined) {
|
|
671
|
+
rect
|
|
672
|
+
.append('text')
|
|
673
|
+
.attr('x', function (d) {
|
|
674
|
+
return xScale(d.data.name) + xScale.bandwidth() / 2;
|
|
675
|
+
})
|
|
424
676
|
.attr('class', 'lib-verticalstack-labels-ontop-weklycharts')
|
|
425
|
-
.attr('y',
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
677
|
+
.attr('y', function (d) {
|
|
678
|
+
return yScale(d[1]) - 3;
|
|
679
|
+
})
|
|
680
|
+
.attr('dy', function (d) {
|
|
681
|
+
return d.class;
|
|
682
|
+
})
|
|
683
|
+
.text(function (d) {
|
|
684
|
+
if (!isNaN(d[1] - d[0])) {
|
|
685
|
+
if (d[1] - d[0] == 0) {
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
if (d[1] - d[0] <= 999)
|
|
689
|
+
return metaData.unit
|
|
690
|
+
? metaData.unit + formatFromBackend(d[1] - d[0])
|
|
691
|
+
: formatFromBackend(d[1] - d[0]);
|
|
692
|
+
else
|
|
693
|
+
return metaData.unit
|
|
694
|
+
? metaData.unit + formatForHugeNumbers(d[1] - d[0])
|
|
695
|
+
: formatForHugeNumbers(d[1] - d[0]);
|
|
431
696
|
}
|
|
697
|
+
else
|
|
698
|
+
return;
|
|
432
699
|
});
|
|
433
700
|
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
701
|
+
/**
|
|
702
|
+
* used to show angled values on top of the bars
|
|
703
|
+
* used by weekly charts
|
|
704
|
+
*/
|
|
705
|
+
if (this.chartConfiguration.showAngledLabels != undefined) {
|
|
706
|
+
rect
|
|
707
|
+
.append('text')
|
|
708
|
+
.attr('x', 0)
|
|
709
|
+
.attr('fill', function (d, i) {
|
|
710
|
+
return metaData.colors[d.key];
|
|
711
|
+
})
|
|
712
|
+
.attr('class', 'lib-data-labels-angled-weeklycharts')
|
|
713
|
+
.attr('y', 0)
|
|
714
|
+
.attr('dy', function (d) {
|
|
715
|
+
return d.class;
|
|
716
|
+
})
|
|
717
|
+
.text(function (d) {
|
|
718
|
+
if (!isNaN(d[1] - d[0]) && d[1] - d[0] > 0) {
|
|
719
|
+
if (d[1] - d[0] <= 999)
|
|
720
|
+
return metaData.unit
|
|
721
|
+
? metaData.unit + formatFromBackend(d[1] - d[0])
|
|
722
|
+
: formatFromBackend(d[1] - d[0]);
|
|
723
|
+
else
|
|
724
|
+
return metaData.unit + formatForHugeNumbers(d[1] - d[0]);
|
|
725
|
+
}
|
|
726
|
+
else
|
|
727
|
+
return;
|
|
728
|
+
})
|
|
729
|
+
.attr('transform', function (d) {
|
|
730
|
+
if (!isNaN(d[1] - d[0]) && d[1] - d[0] > 0) {
|
|
731
|
+
var total = 0;
|
|
732
|
+
var incrementer = 1;
|
|
733
|
+
metaData.keyList.forEach((key) => {
|
|
734
|
+
if (d.data[key])
|
|
735
|
+
total = total + d.data[key];
|
|
736
|
+
else
|
|
737
|
+
incrementer = 2;
|
|
738
|
+
});
|
|
739
|
+
if (tempObjectHolder[d.data.name] == undefined) {
|
|
740
|
+
tempObjectHolder[d.data.name] = 1;
|
|
741
|
+
}
|
|
742
|
+
else {
|
|
743
|
+
tempObjectHolder[d.data.name] =
|
|
744
|
+
tempObjectHolder[d.data.name] + incrementer;
|
|
745
|
+
}
|
|
746
|
+
switch (tempObjectHolder[d.data.name]) {
|
|
747
|
+
case 1:
|
|
748
|
+
return ('translate(' +
|
|
749
|
+
(xScale(d.data.name) + xScale.bandwidth() / 3) +
|
|
750
|
+
',' +
|
|
751
|
+
(yScale(total) - 3) +
|
|
752
|
+
') rotate(270)');
|
|
753
|
+
case 2:
|
|
754
|
+
return ('translate(' +
|
|
755
|
+
(xScale(d.data.name) + xScale.bandwidth() / 2 + 2) +
|
|
756
|
+
',' +
|
|
757
|
+
(yScale(total) - 3) +
|
|
758
|
+
') rotate(270)');
|
|
759
|
+
default:
|
|
760
|
+
return ('translate(' +
|
|
761
|
+
(xScale(d.data.name) + (xScale.bandwidth() * 3) / 4) +
|
|
762
|
+
',' +
|
|
763
|
+
(yScale(total) - 3) +
|
|
764
|
+
') rotate(270)');
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
return 'rotate(0)';
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
if (this.chartConfiguration.isMultiChartGridLine == undefined) {
|
|
771
|
+
if (isMobile) {
|
|
772
|
+
// Custom x-axis label rendering for mobile: evenly distribute under each bar
|
|
773
|
+
svg.selectAll('.custom-x-label').remove();
|
|
774
|
+
data.forEach(function (d, i) {
|
|
775
|
+
const xVal = leftAndRightSpaces + i * (barWidth + barPadding) + barWidth / 2;
|
|
776
|
+
svg.append('text')
|
|
777
|
+
.attr('class', 'custom-x-label')
|
|
778
|
+
.attr('x', 0)
|
|
779
|
+
.attr('y', height + 18)
|
|
780
|
+
.attr('text-anchor', 'middle')
|
|
781
|
+
.attr('transform', 'translate(' + (xVal + 20) + ',0)') // current value + 20
|
|
782
|
+
.style('font-size', '10px')
|
|
783
|
+
.style('fill', 'var(--chart-text-color)')
|
|
784
|
+
.style('writing-mode', 'sideways-lr') // writing mode for mobile
|
|
785
|
+
.text(d.name.substring(0, 3));
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
else {
|
|
789
|
+
svg
|
|
790
|
+
.append('g')
|
|
791
|
+
.attr('transform', 'translate(0,' + height + ')')
|
|
792
|
+
.attr('class', 'lib-stacked-x-axis-text')
|
|
793
|
+
.call(xAxis)
|
|
794
|
+
.selectAll('text')
|
|
795
|
+
.style('fill', 'var(--chart-text-color)')
|
|
796
|
+
.style('font-size', '12px')
|
|
797
|
+
.attr('text-anchor', 'middle')
|
|
798
|
+
.attr('dx', '0')
|
|
799
|
+
.attr('dy', '0.71em')
|
|
800
|
+
.attr('transform', null)
|
|
801
|
+
.text(function (d) {
|
|
802
|
+
return d;
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
svg
|
|
806
|
+
.append('g')
|
|
807
|
+
.attr('class', 'lib-stacked-y-axis-text')
|
|
808
|
+
.attr('style', self.chartConfiguration.yAxisCustomTextStyles)
|
|
809
|
+
.attr('transform', 'translate(0,0)')
|
|
810
|
+
.call(yAxis)
|
|
811
|
+
.selectAll('text')
|
|
812
|
+
.style('fill', 'var(--chart-text-color)');
|
|
448
813
|
}
|
|
449
814
|
else if (this.chartConfiguration.isDrilldownChart) {
|
|
450
|
-
|
|
815
|
+
svg
|
|
816
|
+
.append('g')
|
|
817
|
+
.attr('transform', 'translate(0,' + height + ')')
|
|
818
|
+
.attr('class', 'lib-stacked-x-axis-text multichart1')
|
|
819
|
+
.call(xAxis)
|
|
820
|
+
.style('display', 'none');
|
|
821
|
+
svgYAxisLeft
|
|
822
|
+
.append('g')
|
|
823
|
+
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
824
|
+
.attr('style', self.chartConfiguration.yAxisCustomTextStyles)
|
|
825
|
+
.attr('transform', 'translate(0,0)')
|
|
826
|
+
.call(yAxis)
|
|
827
|
+
.selectAll('text')
|
|
828
|
+
.style('fill', 'var(--chart-text-color)');
|
|
829
|
+
svgYAxisRight
|
|
830
|
+
.append('g')
|
|
831
|
+
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
832
|
+
.attr('style', self.chartConfiguration.yAxisCustomTextStyles)
|
|
833
|
+
.attr('transform', 'translate(0,0)')
|
|
834
|
+
.call(yAxis)
|
|
835
|
+
.style('display', 'none');
|
|
451
836
|
}
|
|
452
837
|
else {
|
|
453
|
-
|
|
838
|
+
svg
|
|
839
|
+
.append('g')
|
|
840
|
+
.attr('transform', 'translate(0,' + height + ')')
|
|
841
|
+
.attr('class', 'lib-stacked-x-axis-text multichart')
|
|
842
|
+
.attr('transform', 'translate(0,' + height + ')')
|
|
843
|
+
.call(xAxis)
|
|
844
|
+
.selectAll('text')
|
|
845
|
+
.style('fill', 'var(--chart-text-color)');
|
|
846
|
+
svg
|
|
847
|
+
.append('g')
|
|
848
|
+
.attr('class', 'lib-stacked-y-axis-text yaxis-dashed')
|
|
849
|
+
.attr('style', self.chartConfiguration.yAxisCustomTextStyles)
|
|
850
|
+
.attr('transform', 'translate(0,0)')
|
|
851
|
+
.call(yAxis)
|
|
852
|
+
.selectAll('text')
|
|
853
|
+
.style('fill', 'var(--chart-text-color)');
|
|
454
854
|
}
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
855
|
+
/**
|
|
856
|
+
* for existing charts, place xaxis labels nearer to xaxis
|
|
857
|
+
* used by existing charts
|
|
858
|
+
*/
|
|
859
|
+
if (this.chartConfiguration.isMultiChartGridLine == undefined) {
|
|
860
|
+
d3.selectAll('g.lib-stacked-x-axis-text g.tick text').attr('y', function () {
|
|
861
|
+
if (alternate_text) {
|
|
862
|
+
alternate_text = false;
|
|
863
|
+
return long_tick_length + 1;
|
|
864
|
+
}
|
|
865
|
+
else {
|
|
866
|
+
alternate_text = true;
|
|
867
|
+
return short_tick_length + 1;
|
|
868
|
+
}
|
|
869
|
+
});
|
|
460
870
|
}
|
|
461
871
|
else {
|
|
872
|
+
d3.selectAll('.multichart > g > text').attr('class', 'lib-display-hidden');
|
|
873
|
+
}
|
|
874
|
+
/**
|
|
875
|
+
* based of the flag, hide or show xaxis texts
|
|
876
|
+
* used by weekly charts
|
|
877
|
+
*/
|
|
878
|
+
if (this.chartConfiguration.isXaxisLabelHidden != undefined &&
|
|
879
|
+
this.chartConfiguration.isXaxisLabelHidden) {
|
|
880
|
+
d3.selectAll('.multichart > g > text').attr('class', 'lib-display-hidden');
|
|
881
|
+
}
|
|
882
|
+
else if (this.chartConfiguration.isXaxisLabelHidden != undefined) {
|
|
462
883
|
svg
|
|
463
884
|
.append('g')
|
|
464
|
-
.attr('
|
|
465
|
-
.attr('
|
|
466
|
-
.
|
|
467
|
-
.
|
|
468
|
-
.
|
|
469
|
-
|
|
470
|
-
.
|
|
885
|
+
.attr('class', 'x1 axis1')
|
|
886
|
+
.attr('transform', 'translate(0,' + height + ')')
|
|
887
|
+
.style('color', '#000')
|
|
888
|
+
.call(d3.axisBottom(xScale).tickSize(0))
|
|
889
|
+
.call((g) => g.select('.domain').attr('fill', 'none'));
|
|
890
|
+
svg
|
|
891
|
+
.append('g')
|
|
892
|
+
.attr('class', 'x2 axis2')
|
|
893
|
+
.attr('transform', 'translate(0,' + height + ')')
|
|
894
|
+
.style('color', '#000')
|
|
895
|
+
.call(d3.axisBottom(xScaleFromOrigin).tickSize(0))
|
|
896
|
+
.call((g) => g.select('.domain').attr('fill', 'none'));
|
|
897
|
+
svg.selectAll('.axis2 > g > text').attr('class', 'lib-display-hidden');
|
|
898
|
+
// svg.selectAll('g.x2.axis2 g.tick text').style('display', 'none');
|
|
899
|
+
svg.selectAll('.x1.axis1 .tick line').attr('y2', function () {
|
|
900
|
+
if (self.chartConfiguration.hideXaxisTick) {
|
|
901
|
+
return 0;
|
|
902
|
+
}
|
|
903
|
+
/**
|
|
904
|
+
* isNoAlternateXaxisText is used to prevent x-axis label to be displayed in alternate fashion
|
|
905
|
+
* for future use
|
|
906
|
+
*/
|
|
907
|
+
if (alternate_text &&
|
|
908
|
+
self.chartConfiguration.isNoAlternateXaxisText == undefined) {
|
|
909
|
+
alternate_text = false;
|
|
910
|
+
return long_tick_length_bg - 7;
|
|
911
|
+
}
|
|
912
|
+
else {
|
|
913
|
+
alternate_text = true;
|
|
914
|
+
return short_tick_length_bg - 4;
|
|
915
|
+
}
|
|
916
|
+
});
|
|
917
|
+
/**
|
|
918
|
+
* reset the flag so that texts also follow the pattern of ticks
|
|
919
|
+
* used by weekly charts
|
|
920
|
+
*/
|
|
921
|
+
alternate_text = false;
|
|
922
|
+
svg
|
|
923
|
+
.selectAll('g.x1.axis1 g.tick text')
|
|
924
|
+
// .attr('class', 'lib-xaxis-labels-texts-weeklycharts')
|
|
925
|
+
.attr('class', function () {
|
|
926
|
+
if (self.chartConfiguration.isDrilldownChart) {
|
|
927
|
+
if (data && data.length > 8) {
|
|
928
|
+
return 'lib-xaxis-labels-texts-drilldown-alt';
|
|
929
|
+
}
|
|
930
|
+
return 'lib-xaxis-labels-texts-drilldown';
|
|
931
|
+
}
|
|
932
|
+
else
|
|
933
|
+
return 'lib-xaxis-labels-texts-weeklycharts';
|
|
934
|
+
})
|
|
935
|
+
.attr('y', function () {
|
|
936
|
+
if (alternate_text) {
|
|
937
|
+
alternate_text = false;
|
|
938
|
+
return long_tick_length_bg;
|
|
939
|
+
}
|
|
940
|
+
else {
|
|
941
|
+
alternate_text = true;
|
|
942
|
+
return short_tick_length_bg;
|
|
943
|
+
}
|
|
944
|
+
});
|
|
471
945
|
}
|
|
472
|
-
|
|
473
|
-
.append('g')
|
|
474
|
-
.attr('class', 'lib-stacked-y-axis-text')
|
|
475
|
-
.call(yAxis)
|
|
476
|
-
.selectAll('text')
|
|
477
|
-
.style('fill', 'var(--chart-text-color)');
|
|
478
|
-
}
|
|
479
|
-
renderMobileXAxis(svg, data, height, device) {
|
|
480
|
-
const barWidth = 32;
|
|
481
|
-
const barPadding = 12;
|
|
482
|
-
svg.selectAll('.custom-x-label').remove();
|
|
483
|
-
data.forEach((d, i) => {
|
|
484
|
-
const xVal = this.SPACING.leftAndRight + i * (barWidth + barPadding) + barWidth / 2;
|
|
946
|
+
if (self.chartConfiguration.xLabelsOnSameLine) {
|
|
485
947
|
svg
|
|
948
|
+
.selectAll('g.x1.axis1 g.tick text')
|
|
949
|
+
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
950
|
+
.attr('y', short_tick_length_bg)
|
|
951
|
+
.text(function (d, i) {
|
|
952
|
+
if (isMobile) {
|
|
953
|
+
// If label has more than one word, show only first 3 letters of first word
|
|
954
|
+
var firstWord = d.split(' ')[0];
|
|
955
|
+
return firstWord.substring(0, 3);
|
|
956
|
+
}
|
|
957
|
+
if (d.trim().indexOf(' ') > -1) {
|
|
958
|
+
return d.trim().substring(0, d.indexOf(' ')).toLowerCase();
|
|
959
|
+
}
|
|
960
|
+
return d.toLowerCase();
|
|
961
|
+
})
|
|
962
|
+
.attr('transform', function (d, i) {
|
|
963
|
+
if (isMobile) {
|
|
964
|
+
var totalBars = 0;
|
|
965
|
+
if (this.parentNode && this.parentNode.parentNode) {
|
|
966
|
+
totalBars = d3.select(this.parentNode.parentNode).selectAll('g.tick').size();
|
|
967
|
+
}
|
|
968
|
+
if (totalBars === 2) {
|
|
969
|
+
return 'translate(0,0)';
|
|
970
|
+
}
|
|
971
|
+
else {
|
|
972
|
+
return 'translate(' + (i * 30) + ',0)';
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
return null;
|
|
976
|
+
});
|
|
977
|
+
svg
|
|
978
|
+
.selectAll('g.x1.axis1 g.tick')
|
|
486
979
|
.append('text')
|
|
487
|
-
.attr('class', '
|
|
488
|
-
.attr('
|
|
489
|
-
.attr('
|
|
490
|
-
.
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
.append('g')
|
|
507
|
-
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
508
|
-
.call(yAxis)
|
|
509
|
-
.selectAll('text')
|
|
510
|
-
.style('fill', 'var(--chart-text-color)');
|
|
511
|
-
svgYAxisRight
|
|
512
|
-
.append('g')
|
|
513
|
-
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
514
|
-
.call(yAxis)
|
|
515
|
-
.style('display', 'none');
|
|
516
|
-
}
|
|
517
|
-
renderMultiChartAxes(svg, xAxis, yAxis, height) {
|
|
518
|
-
svg
|
|
519
|
-
.append('g')
|
|
520
|
-
.attr('transform', `translate(0,${height})`)
|
|
521
|
-
.attr('class', 'lib-stacked-x-axis-text multichart')
|
|
522
|
-
.call(xAxis)
|
|
523
|
-
.selectAll('text')
|
|
524
|
-
.style('fill', 'var(--chart-text-color)');
|
|
525
|
-
svg
|
|
526
|
-
.append('g')
|
|
527
|
-
.attr('class', 'lib-stacked-y-axis-text yaxis-dashed')
|
|
528
|
-
.call(yAxis)
|
|
529
|
-
.selectAll('text')
|
|
530
|
-
.style('fill', 'var(--chart-text-color)');
|
|
531
|
-
}
|
|
532
|
-
styleAxisDomains(svg, svgYAxisLeft, svgYAxisRight) {
|
|
533
|
-
const axisStyle = {
|
|
534
|
-
stroke: 'var(--chart-axis-color)',
|
|
535
|
-
'stroke-width': '1px'
|
|
536
|
-
};
|
|
537
|
-
[svg, svgYAxisLeft, svgYAxisRight].forEach(element => {
|
|
538
|
-
element.selectAll('.domain')
|
|
539
|
-
.style('stroke', axisStyle.stroke)
|
|
540
|
-
.style('stroke-width', axisStyle['stroke-width']);
|
|
541
|
-
});
|
|
542
|
-
}
|
|
543
|
-
renderLabels(svg, svgYAxisLeft, metaData, height, width, margin) {
|
|
544
|
-
if (metaData.yLabel) {
|
|
545
|
-
this.renderYAxisLabel(svgYAxisLeft, metaData.yLabel, height, margin);
|
|
980
|
+
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
981
|
+
.attr('y', long_tick_length_bg)
|
|
982
|
+
.attr('fill', 'currentColor')
|
|
983
|
+
.text(function (d) {
|
|
984
|
+
// For mobile, do not print the second word at all
|
|
985
|
+
if (isMobile) {
|
|
986
|
+
return '';
|
|
987
|
+
}
|
|
988
|
+
if (d.trim().indexOf(' ') > -1) {
|
|
989
|
+
return d.trim().substring(d.indexOf(' '), d.length).toLowerCase();
|
|
990
|
+
}
|
|
991
|
+
return '';
|
|
992
|
+
})
|
|
993
|
+
.attr('transform', function (d, i) {
|
|
994
|
+
if (isMobile && i === 0) {
|
|
995
|
+
return 'translate(20,0)';
|
|
996
|
+
}
|
|
997
|
+
return null;
|
|
998
|
+
});
|
|
546
999
|
}
|
|
547
|
-
|
|
548
|
-
|
|
1000
|
+
/**
|
|
1001
|
+
* hide yaxis values
|
|
1002
|
+
* used by weekly charts
|
|
1003
|
+
*/
|
|
1004
|
+
if (this.chartConfiguration.isYaxisLabelHidden != undefined &&
|
|
1005
|
+
this.chartConfiguration.isYaxisLabelHidden) {
|
|
1006
|
+
svg
|
|
1007
|
+
.selectAll('.yaxis-dashed > g > text')
|
|
1008
|
+
.attr('class', 'lib-display-hidden');
|
|
549
1009
|
}
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
let labelClass = 'lib-axis-group-label font-size-1';
|
|
557
|
-
if (this.chartConfiguration.isDrilldownChart) {
|
|
558
|
-
labelClass += ' lib-ylabel-drilldowncharts';
|
|
1010
|
+
/** hide y axis labels
|
|
1011
|
+
* config is there for future use
|
|
1012
|
+
*/
|
|
1013
|
+
if (this.chartConfiguration.isYaxisHidden != undefined &&
|
|
1014
|
+
this.chartConfiguration.isYaxisHidden) {
|
|
1015
|
+
d3.selectAll('.yaxis-dashed').attr('class', 'lib-display-hidden');
|
|
559
1016
|
}
|
|
560
|
-
|
|
561
|
-
|
|
1017
|
+
/**
|
|
1018
|
+
* dashed y axis
|
|
1019
|
+
* used by weekly charts
|
|
1020
|
+
*/
|
|
1021
|
+
if (this.chartConfiguration.isYaxisDashed != undefined &&
|
|
1022
|
+
this.chartConfiguration.isYaxisDashed) {
|
|
1023
|
+
d3.selectAll('.yaxis-dashed')
|
|
1024
|
+
.style('stroke-dasharray', '5 5')
|
|
1025
|
+
.style('color', 'var(--chart-grid-color)'); // Use CSS variable
|
|
562
1026
|
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
.
|
|
569
|
-
.attr('style', this.chartConfiguration.yAxisCustomlabelStyles)
|
|
570
|
-
.attr('transform', 'rotate(-90)')
|
|
571
|
-
.attr('y', yPosition)
|
|
572
|
-
.attr('x', -height / 2)
|
|
573
|
-
.attr('dy', '1em')
|
|
574
|
-
.style('text-anchor', 'middle')
|
|
575
|
-
.style('fill', 'var(--chart-text-color)')
|
|
576
|
-
.text(formatted)
|
|
577
|
-
.style('text-transform', isAcronym ? 'none' : 'capitalize');
|
|
578
|
-
}
|
|
579
|
-
renderXAxisLabel(svg, xLabel, height, width, margin) {
|
|
580
|
-
const { formatted, isAcronym } = this.formatAxisLabel(xLabel);
|
|
581
|
-
const isRia = this.customChartConfiguration?.isRia;
|
|
582
|
-
const xPosition = isRia
|
|
583
|
-
? height + margin.top + margin.bottom
|
|
584
|
-
: height + margin.top + margin.bottom + 10;
|
|
585
|
-
let labelClass = 'lib-axis-group-label font-size-1';
|
|
586
|
-
if (this.chartConfiguration.isDrilldownChart) {
|
|
587
|
-
labelClass += ' lib-xlabel-drilldowncharts';
|
|
1027
|
+
/**
|
|
1028
|
+
* x axis color
|
|
1029
|
+
* used by weekly charts
|
|
1030
|
+
*/
|
|
1031
|
+
if (this.chartConfiguration.isXaxisColor != undefined) {
|
|
1032
|
+
d3.selectAll('.multichart').style('color', this.chartConfiguration.isXaxisColor || 'var(--chart-text-color)');
|
|
588
1033
|
}
|
|
589
|
-
|
|
590
|
-
|
|
1034
|
+
/**
|
|
1035
|
+
* used to display y label
|
|
1036
|
+
*/
|
|
1037
|
+
if (this.isZoomedOut && this.chartData.data.length > 9) {
|
|
1038
|
+
svg
|
|
1039
|
+
.selectAll('.lib-xaxis-labels-texts-drilldown')
|
|
1040
|
+
.attr('transform', 'rotate(-90)')
|
|
1041
|
+
.attr('text-anchor', 'end')
|
|
1042
|
+
.attr('x', '-5')
|
|
1043
|
+
.attr('dy', null);
|
|
591
1044
|
}
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
.
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
.
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
.
|
|
610
|
-
.
|
|
611
|
-
.
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
.domain([0, d3.max(lineData, (d) => +d.value) || 0])
|
|
636
|
-
.range([height, 0]);
|
|
637
|
-
const dataGroup = d3
|
|
638
|
-
.nest()
|
|
639
|
-
.key((d) => d.category)
|
|
640
|
-
.entries(lineData);
|
|
641
|
-
const lineGen = d3
|
|
642
|
-
.line()
|
|
643
|
-
.x((d) => xScale(d.name) + xScale.bandwidth() / 2)
|
|
644
|
-
.y((d) => lineYscale(d.value));
|
|
645
|
-
dataGroup.forEach((group) => {
|
|
646
|
-
// Draw line
|
|
1045
|
+
function styleAxisDomain() {
|
|
1046
|
+
svg.selectAll('.domain')
|
|
1047
|
+
.style('stroke', 'var(--chart-axis-color)')
|
|
1048
|
+
.style('stroke-width', '1px');
|
|
1049
|
+
svgYAxisLeft.selectAll('.domain')
|
|
1050
|
+
.style('stroke', 'var(--chart-axis-color)')
|
|
1051
|
+
.style('stroke-width', '1px');
|
|
1052
|
+
svgYAxisRight.selectAll('.domain')
|
|
1053
|
+
.style('stroke', 'var(--chart-axis-color)')
|
|
1054
|
+
.style('stroke-width', '1px');
|
|
1055
|
+
}
|
|
1056
|
+
styleAxisDomain();
|
|
1057
|
+
if (metaData.yLabel) {
|
|
1058
|
+
svgYAxisLeft.selectAll('.lib-axis-group-label, .lib-ylabel-drilldowncharts, .lib-ylabel-weeklyCharts').remove();
|
|
1059
|
+
function isAcronym(label) {
|
|
1060
|
+
return (label.length <= 4 && /^[A-Z]+$/.test(label)) || (label === label.toUpperCase() && /[A-Z]/.test(label));
|
|
1061
|
+
}
|
|
1062
|
+
const yLabelText = metaData.yLabel;
|
|
1063
|
+
const isAcr = isAcronym(yLabelText.replace(/[^A-Za-z]/g, ''));
|
|
1064
|
+
const yPosition = isria ? 0 - margin.left / 2 - 30 : 0 - margin.left / 2 - 40;
|
|
1065
|
+
svgYAxisLeft
|
|
1066
|
+
.append('text')
|
|
1067
|
+
.attr('class', function () {
|
|
1068
|
+
let baseClass = 'lib-axis-group-label font-size-1';
|
|
1069
|
+
if (self.chartConfiguration.isDrilldownChart)
|
|
1070
|
+
return baseClass + ' lib-ylabel-drilldowncharts';
|
|
1071
|
+
if (self.chartConfiguration.isMultiChartGridLine != undefined)
|
|
1072
|
+
return baseClass + ' lib-ylabel-weeklyCharts';
|
|
1073
|
+
return baseClass + ' lib-axis-waterfall-label';
|
|
1074
|
+
})
|
|
1075
|
+
.attr('style', self.chartConfiguration.yAxisCustomlabelStyles)
|
|
1076
|
+
.attr('transform', 'rotate(-90)')
|
|
1077
|
+
.attr('y', yPosition)
|
|
1078
|
+
.attr('x', 0 - height / 2)
|
|
1079
|
+
.attr('dy', '1em')
|
|
1080
|
+
.style('text-anchor', 'middle')
|
|
1081
|
+
.style('fill', 'var(--chart-text-color)')
|
|
1082
|
+
.style('color', 'var(--chart-text-color)')
|
|
1083
|
+
.text(isAcr ? yLabelText.toUpperCase() : yLabelText.toLowerCase())
|
|
1084
|
+
.style('text-transform', isAcr ? 'none' : 'capitalize');
|
|
1085
|
+
}
|
|
1086
|
+
if (this.chartData.targetLineData) {
|
|
1087
|
+
const yZero = yScale(parsedNum);
|
|
647
1088
|
svg
|
|
648
|
-
.append('
|
|
649
|
-
.
|
|
650
|
-
.attr('
|
|
651
|
-
.attr('
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
1089
|
+
.append('line')
|
|
1090
|
+
.attr('x1', 0)
|
|
1091
|
+
.attr('x2', width)
|
|
1092
|
+
.attr('y1', yZero)
|
|
1093
|
+
.attr('y2', yZero)
|
|
1094
|
+
.style('stroke-dasharray', '5 5')
|
|
1095
|
+
.style('stroke', this.chartData.targetLineData.color);
|
|
1096
|
+
// svgYAxisRight
|
|
1097
|
+
// .append('line')
|
|
1098
|
+
// .attr('x1', 0)
|
|
1099
|
+
// .attr('x2', rightSvgWidth)
|
|
1100
|
+
// .attr('y1', yZero)
|
|
1101
|
+
// .attr('y2', yZero)
|
|
1102
|
+
// .style('stroke', this.chartData.targetLineData.color);
|
|
1103
|
+
svgYAxisRight
|
|
1104
|
+
.append('foreignObject')
|
|
1105
|
+
// .attr('transform', 'translate(' + 0 + ',' + (yZero - 30) + ')')
|
|
1106
|
+
.attr('transform', 'translate(' + 0 + ',' + (yZero - 13) + ')')
|
|
1107
|
+
.attr('width', rightSvgWidth)
|
|
1108
|
+
.attr('height', 50)
|
|
1109
|
+
.append('xhtml:div')
|
|
1110
|
+
.attr('class', 'target-display')
|
|
1111
|
+
.style('color', 'var(--chart-text-color)')
|
|
1112
|
+
.html(function (d, i) {
|
|
1113
|
+
let dataTypeTemp = '';
|
|
1114
|
+
let targetLineName = 'target';
|
|
1115
|
+
if (metaData.dataType) {
|
|
1116
|
+
dataTypeTemp = metaData.dataType;
|
|
1117
|
+
}
|
|
1118
|
+
if (self.chartData.targetLineData &&
|
|
1119
|
+
self.chartData.targetLineData.targetName) {
|
|
1120
|
+
targetLineName = self.chartData.targetLineData.targetName;
|
|
1121
|
+
}
|
|
1122
|
+
return (`<div>${targetLineName}</div>` +
|
|
1123
|
+
'<div>' +
|
|
1124
|
+
self.chartData.targetLineData.target +
|
|
1125
|
+
'' +
|
|
1126
|
+
dataTypeTemp +
|
|
1127
|
+
'</div>');
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1130
|
+
rect
|
|
1131
|
+
.selectAll('rect')
|
|
1132
|
+
.on('mouseenter', handleMouseOver)
|
|
1133
|
+
.on('mouseout', handleMouseOut);
|
|
1134
|
+
if (metaData.lineyLabel) {
|
|
1135
|
+
svg
|
|
1136
|
+
.append('text')
|
|
1137
|
+
.attr('class', 'lib-axis-group-label lib-line-axis')
|
|
1138
|
+
.attr('style', self.chartConfiguration.yAxisCustomlabelStyles)
|
|
1139
|
+
.attr('transform', 'translate(' + (width - 20) + ',0) rotate(90)')
|
|
1140
|
+
.attr('y', 0 - margin.right * 3)
|
|
1141
|
+
.attr('x', height / 2)
|
|
1142
|
+
.attr('dy', '5em')
|
|
1143
|
+
.style('text-anchor', 'middle')
|
|
1144
|
+
.text(metaData.lineyLabel);
|
|
1145
|
+
}
|
|
1146
|
+
if (metaData.xLabel) {
|
|
1147
|
+
function isAcronym(label) {
|
|
1148
|
+
return ((label.length <= 4 && /^[A-Z]+$/.test(label)) ||
|
|
1149
|
+
(label === label.toUpperCase() && /[A-Z]/.test(label)));
|
|
1150
|
+
}
|
|
1151
|
+
const xLabelText = metaData.xLabel;
|
|
1152
|
+
const isAcr = isAcronym(xLabelText.replace(/[^A-Za-z]/g, ''));
|
|
1153
|
+
const xPosition = isria ? (height + margin.top + margin.bottom) : (height + margin.top + margin.bottom + 10);
|
|
1154
|
+
svg
|
|
1155
|
+
.append('text')
|
|
1156
|
+
.attr('class', function () {
|
|
1157
|
+
let baseClass = 'lib-axis-group-label font-size-1';
|
|
1158
|
+
if (self.chartConfiguration.isDrilldownChart)
|
|
1159
|
+
return baseClass + ' lib-xlabel-drilldowncharts';
|
|
1160
|
+
if (self.chartConfiguration.isMultiChartGridLine != undefined)
|
|
1161
|
+
return baseClass + ' lib-xlabel-weeklyCharts';
|
|
1162
|
+
return baseClass + ' lib-axis-waterfall-label';
|
|
656
1163
|
})
|
|
657
|
-
.attr('
|
|
658
|
-
.attr('
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
.
|
|
662
|
-
.
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
.
|
|
668
|
-
|
|
669
|
-
if ('category' in d) {
|
|
670
|
-
return colors[d.category];
|
|
671
|
-
}
|
|
672
|
-
return this.chartConfiguration.lineGraphColor;
|
|
1164
|
+
.attr('style', self.chartConfiguration.xAxisCustomlabelStyles)
|
|
1165
|
+
.attr('transform', 'translate(' + width / 2 + ' ,' + xPosition + ')')
|
|
1166
|
+
.style('text-anchor', 'middle')
|
|
1167
|
+
.style('fill', 'var(--chart-text-color)')
|
|
1168
|
+
.text(isAcr ? xLabelText.toUpperCase() : xLabelText.toLowerCase())
|
|
1169
|
+
.style('text-transform', isAcr ? 'none' : 'capitalize');
|
|
1170
|
+
}
|
|
1171
|
+
if (lineData && colors) {
|
|
1172
|
+
var dataGroup = d3
|
|
1173
|
+
.nest()
|
|
1174
|
+
.key(function (d) {
|
|
1175
|
+
return d.category;
|
|
673
1176
|
})
|
|
674
|
-
.
|
|
675
|
-
|
|
676
|
-
.
|
|
677
|
-
.
|
|
678
|
-
.
|
|
679
|
-
|
|
680
|
-
|
|
1177
|
+
.entries(lineData);
|
|
1178
|
+
var lineGen = d3
|
|
1179
|
+
.line()
|
|
1180
|
+
.x(function (d) {
|
|
1181
|
+
return xScale(d.name) + xScale.bandwidth() / 2;
|
|
1182
|
+
})
|
|
1183
|
+
.y(function (d) {
|
|
1184
|
+
return lineYscale(d.value);
|
|
1185
|
+
});
|
|
1186
|
+
var calculateCX = (d) => {
|
|
1187
|
+
return xScale(d.name) + xScale.bandwidth() / 2;
|
|
1188
|
+
};
|
|
1189
|
+
var calculateCY = (d) => {
|
|
1190
|
+
return lineYscale(d.value);
|
|
1191
|
+
};
|
|
1192
|
+
dataGroup.forEach(function (d, i) {
|
|
1193
|
+
svg
|
|
1194
|
+
.append('path')
|
|
1195
|
+
.datum(d.values)
|
|
1196
|
+
.attr('fill', 'none')
|
|
1197
|
+
.attr('stroke', function (d) {
|
|
1198
|
+
if ('category' in d[0]) {
|
|
1199
|
+
return colors[d[0].category];
|
|
1200
|
+
}
|
|
1201
|
+
else {
|
|
1202
|
+
return self.chartConfiguration.lineGraphColor;
|
|
1203
|
+
}
|
|
1204
|
+
})
|
|
1205
|
+
.attr('stroke-width', 2.5) /**line thinkness */
|
|
1206
|
+
.attr('d', lineGen(d.values));
|
|
1207
|
+
var dot = svg
|
|
1208
|
+
.selectAll('myCircles')
|
|
1209
|
+
.data(d.values)
|
|
1210
|
+
.enter()
|
|
1211
|
+
.append('g')
|
|
1212
|
+
.on('click', function (d) {
|
|
1213
|
+
self.handleClick(d);
|
|
1214
|
+
});
|
|
681
1215
|
dot
|
|
682
|
-
.append('
|
|
683
|
-
.attr('
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
1216
|
+
.append('circle')
|
|
1217
|
+
.attr('fill', function (d) {
|
|
1218
|
+
if ('category' in d) {
|
|
1219
|
+
return colors[d.category];
|
|
1220
|
+
}
|
|
1221
|
+
else {
|
|
1222
|
+
return self.chartConfiguration.lineGraphColor;
|
|
1223
|
+
}
|
|
1224
|
+
})
|
|
1225
|
+
.attr('stroke', 'none')
|
|
1226
|
+
.attr('cx', function (d, i) {
|
|
1227
|
+
return xScale(d.name) + xScale.bandwidth() / 2;
|
|
1228
|
+
})
|
|
1229
|
+
.attr('cy', function (d, i) {
|
|
1230
|
+
return lineYscale(d.value);
|
|
1231
|
+
})
|
|
1232
|
+
.attr('r', 3) /**radius of circle=5 */
|
|
1233
|
+
.style('cursor', 'pointer');
|
|
1234
|
+
if (self.chartConfiguration.lineGraphColor) {
|
|
1235
|
+
dot
|
|
1236
|
+
.append('text')
|
|
1237
|
+
.attr('class', 'dots')
|
|
1238
|
+
.attr('fill', self.chartConfiguration.lineGraphColor)
|
|
1239
|
+
.attr('style', 'font-size: ' + '.85em;' + 'font-weight:' + 'bold')
|
|
1240
|
+
.attr('x', function (d, i) {
|
|
1241
|
+
return xScale(d.name) + xScale.bandwidth() / 2;
|
|
1242
|
+
})
|
|
1243
|
+
.attr('y', function (d, i) {
|
|
1244
|
+
return lineYscale(d.value);
|
|
1245
|
+
})
|
|
1246
|
+
.attr('dy', '-1em')
|
|
1247
|
+
.text(function (d, i) {
|
|
1248
|
+
return self.chartConfiguration.labelFormatter(d.value);
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
});
|
|
696
1252
|
}
|
|
1253
|
+
// svg.attr('width', 150).style('max-width', 150).style('overflow-x', 'auto');
|
|
1254
|
+
}
|
|
1255
|
+
handleClick(d) {
|
|
1256
|
+
if (this.chartData?.metaData?.hasDrillDown || d?.toggleFrom)
|
|
1257
|
+
this.clickEvent.emit(d);
|
|
697
1258
|
}
|
|
698
1259
|
handleHeaderMenuClick(id) {
|
|
699
1260
|
this.headerMenuclickEvent.emit(id);
|
|
@@ -702,14 +1263,15 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
|
|
|
702
1263
|
this.clickEvent.emit(event);
|
|
703
1264
|
}
|
|
704
1265
|
handleZoominZoomoutClick({ isZoomOut, event }) {
|
|
1266
|
+
// this.isZoomOutSelected(isZoomOut, event);
|
|
705
1267
|
this.isZoomOutSelected(isZoomOut);
|
|
706
1268
|
}
|
|
707
1269
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HorizontalBarsWithScrollZoomComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
708
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HorizontalBarsWithScrollZoomComponent, selector: "lib-horizontal-bars-with-scroll-zoom", inputs: { chartData: "chartData", customChartConfiguration: "customChartConfiguration" }, outputs: { clickEvent: "clickEvent", headerMenuclickEvent: "headerMenuclickEvent" }, viewQueries: [{ propertyName: "containerElt", first: true, predicate: ["verticalstackedchartcontainer"], descendants: true, static: true }, { propertyName: "verticalstackedcontainerElt", first: true, predicate: ["verticalstackedcontainer"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<meta http-equiv=\"CACHE-CONTROL\" content=\"NO-CACHE\" />\r\n<meta http-equiv=\"EXPIRES\" content=\"Sat, 01 Jun 2004 11:12:01 GMT\" />\r\n<div\r\n #verticalstackedcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n\r\n (resized)=\"onResized($event)\"\r\n>\r\n <div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n </div>\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"verticalstackedchartcontainer\"\r\n #verticalstackedchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n</div>\r\n", styles: [".lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1;font-size:1.2em}.lib-axis-group-label{font-size:.85em;font-weight:600;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.dots{font-size:10px}.inline__display{display:flex;justify-content:space-around;padding-top:2%}.verticalbar__text{font-style:normal;font-variant:normal;font-weight:400;font-size:13px;line-height:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;opacity:1}.lib-line-label-item{display:inline-block!important;font-size:.85em;margin-right:10px;font-weight:600}.lib-line-label-wrapper-vertical{display:flex;justify-content:center}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.title{background-color:#d9d9d9;height:40px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1}.title-top-text{color:var(--font-color)!important;font-size:14px;font-weight:600}.title-bar-name{color:var(--font-color)!important;font-size:17px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:var(--font-color)!important;font-size:12px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}@media (max-width: 575px){.lib-xaxis-labels-texts-drilldown{writing-mode:sideways-lr}}@media screen and (min-width: 1024px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1366px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1920px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 2560px) and (min-height: 500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}}.bottom__text{position:absolute!important;bottom:0!important;display:flex!important;justify-content:center!important;align-items:center!important;width:100%!important}.box__heightwidth{opacity:1;height:10px;width:10px;border:none!important;border-radius:50%}.label__text{margin-right:10px;display:flex;justify-content:center;align-items:center;font-style:normal;font-variant:normal;font-weight:400;font-size:10px;line-height:13px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.2px;color:#707070!important}.lib-verticalstack-labels-ontop-weklycharts{font-style:normal;font-variant:normal;font-weight:700;font-size:10px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.lib-verticalstack-title-ontop{font-style:normal;font-variant:normal;font-size:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.marginLeft-20{margin-left:20px}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ResizedDirective, selector: "[resized]", outputs: ["resized"] }, { kind: "component", type: i3.ChartHeaderV2Component, selector: "lib-chart-header-v2", inputs: ["chartData", "chartConfiguration"], outputs: ["clickEvent", "zoomInZoomOutClick"] }, { kind: "component", type: i4.ChartHeaderV3Component, selector: "lib-chart-header-v3", inputs: ["chartData", "chartConfiguration"], outputs: ["compareByFilterSelection", "zoomInZoomOutClick"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
1270
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HorizontalBarsWithScrollZoomComponent, selector: "lib-horizontal-bars-with-scroll-zoom", inputs: { chartData: "chartData", customChartConfiguration: "customChartConfiguration" }, outputs: { clickEvent: "clickEvent", headerMenuclickEvent: "headerMenuclickEvent" }, viewQueries: [{ propertyName: "containerElt", first: true, predicate: ["verticalstackedchartcontainer"], descendants: true, static: true }, { propertyName: "verticalstackedcontainerElt", first: true, predicate: ["verticalstackedcontainer"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<meta http-equiv=\"CACHE-CONTROL\" content=\"NO-CACHE\" />\r\n<meta http-equiv=\"EXPIRES\" content=\"Sat, 01 Jun 2004 11:12:01 GMT\" />\r\n<div\r\n #verticalstackedcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n\r\n (resized)=\"onResized($event)\"\r\n>\r\n <div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n\r\n <!-- <span *ngIf=\"chartConfiguration.isComparebyDropdownVisible\">\r\n <lib-dropdown></lib-dropdown>\r\n </span> -->\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n </div>\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"verticalstackedchartcontainer\"\r\n #verticalstackedchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n</div>\r\n", styles: [".lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1;font-size:1.2em}.lib-axis-group-label{font-size:.85em;font-weight:600;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.dots{font-size:10px}.inline__display{display:flex;justify-content:space-around;padding-top:2%}.verticalbar__text{font-style:normal;font-variant:normal;font-weight:400;font-size:13px;line-height:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;opacity:1}.lib-line-label-item{display:inline-block!important;font-size:.85em;margin-right:10px;font-weight:600}.lib-line-label-wrapper-vertical{display:flex;justify-content:center}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.title{background-color:#d9d9d9;height:40px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1}.title-top-text{color:var(--font-color)!important;font-size:14px;font-weight:600}.title-bar-name{color:var(--font-color)!important;font-size:17px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:var(--font-color)!important;font-size:12px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}@media (max-width: 575px){.lib-xaxis-labels-texts-drilldown{writing-mode:sideways-lr}}@media screen and (min-width: 1024px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1366px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1920px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 2560px) and (min-height: 500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}}.bottom__text{position:absolute!important;bottom:0!important;display:flex!important;justify-content:center!important;align-items:center!important;width:100%!important}.box__heightwidth{opacity:1;height:10px;width:10px;border:none!important;border-radius:50%}.label__text{margin-right:10px;display:flex;justify-content:center;align-items:center;font-style:normal;font-variant:normal;font-weight:400;font-size:10px;line-height:13px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.2px;color:#707070!important}.lib-verticalstack-labels-ontop-weklycharts{font-style:normal;font-variant:normal;font-weight:700;font-size:10px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.lib-verticalstack-title-ontop{font-style:normal;font-variant:normal;font-size:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.marginLeft-20{margin-left:20px}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ResizedDirective, selector: "[resized]", outputs: ["resized"] }, { kind: "component", type: i3.ChartHeaderV2Component, selector: "lib-chart-header-v2", inputs: ["chartData", "chartConfiguration"], outputs: ["clickEvent", "zoomInZoomOutClick"] }, { kind: "component", type: i4.ChartHeaderV3Component, selector: "lib-chart-header-v3", inputs: ["chartData", "chartConfiguration"], outputs: ["compareByFilterSelection", "zoomInZoomOutClick"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
709
1271
|
}
|
|
710
1272
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HorizontalBarsWithScrollZoomComponent, decorators: [{
|
|
711
1273
|
type: Component,
|
|
712
|
-
args: [{ selector: 'lib-horizontal-bars-with-scroll-zoom', encapsulation: ViewEncapsulation.None, template: "<meta http-equiv=\"CACHE-CONTROL\" content=\"NO-CACHE\" />\r\n<meta http-equiv=\"EXPIRES\" content=\"Sat, 01 Jun 2004 11:12:01 GMT\" />\r\n<div\r\n #verticalstackedcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n\r\n (resized)=\"onResized($event)\"\r\n>\r\n <div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n </div>\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"verticalstackedchartcontainer\"\r\n #verticalstackedchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n</div>\r\n", styles: [".lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1;font-size:1.2em}.lib-axis-group-label{font-size:.85em;font-weight:600;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.dots{font-size:10px}.inline__display{display:flex;justify-content:space-around;padding-top:2%}.verticalbar__text{font-style:normal;font-variant:normal;font-weight:400;font-size:13px;line-height:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;opacity:1}.lib-line-label-item{display:inline-block!important;font-size:.85em;margin-right:10px;font-weight:600}.lib-line-label-wrapper-vertical{display:flex;justify-content:center}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.title{background-color:#d9d9d9;height:40px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1}.title-top-text{color:var(--font-color)!important;font-size:14px;font-weight:600}.title-bar-name{color:var(--font-color)!important;font-size:17px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:var(--font-color)!important;font-size:12px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}@media (max-width: 575px){.lib-xaxis-labels-texts-drilldown{writing-mode:sideways-lr}}@media screen and (min-width: 1024px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1366px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1920px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 2560px) and (min-height: 500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}}.bottom__text{position:absolute!important;bottom:0!important;display:flex!important;justify-content:center!important;align-items:center!important;width:100%!important}.box__heightwidth{opacity:1;height:10px;width:10px;border:none!important;border-radius:50%}.label__text{margin-right:10px;display:flex;justify-content:center;align-items:center;font-style:normal;font-variant:normal;font-weight:400;font-size:10px;line-height:13px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.2px;color:#707070!important}.lib-verticalstack-labels-ontop-weklycharts{font-style:normal;font-variant:normal;font-weight:700;font-size:10px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.lib-verticalstack-title-ontop{font-style:normal;font-variant:normal;font-size:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.marginLeft-20{margin-left:20px}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"] }]
|
|
1274
|
+
args: [{ selector: 'lib-horizontal-bars-with-scroll-zoom', encapsulation: ViewEncapsulation.None, template: "<meta http-equiv=\"CACHE-CONTROL\" content=\"NO-CACHE\" />\r\n<meta http-equiv=\"EXPIRES\" content=\"Sat, 01 Jun 2004 11:12:01 GMT\" />\r\n<div\r\n #verticalstackedcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n\r\n (resized)=\"onResized($event)\"\r\n>\r\n <div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n\r\n <!-- <span *ngIf=\"chartConfiguration.isComparebyDropdownVisible\">\r\n <lib-dropdown></lib-dropdown>\r\n </span> -->\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n </div>\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"verticalstackedchartcontainer\"\r\n #verticalstackedchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n</div>\r\n", styles: [".lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1;font-size:1.2em}.lib-axis-group-label{font-size:.85em;font-weight:600;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.dots{font-size:10px}.inline__display{display:flex;justify-content:space-around;padding-top:2%}.verticalbar__text{font-style:normal;font-variant:normal;font-weight:400;font-size:13px;line-height:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;opacity:1}.lib-line-label-item{display:inline-block!important;font-size:.85em;margin-right:10px;font-weight:600}.lib-line-label-wrapper-vertical{display:flex;justify-content:center}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.title{background-color:#d9d9d9;height:40px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1}.title-top-text{color:var(--font-color)!important;font-size:14px;font-weight:600}.title-bar-name{color:var(--font-color)!important;font-size:17px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:var(--font-color)!important;font-size:12px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}@media (max-width: 575px){.lib-xaxis-labels-texts-drilldown{writing-mode:sideways-lr}}@media screen and (min-width: 1024px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1366px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1920px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 2560px) and (min-height: 500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}}.bottom__text{position:absolute!important;bottom:0!important;display:flex!important;justify-content:center!important;align-items:center!important;width:100%!important}.box__heightwidth{opacity:1;height:10px;width:10px;border:none!important;border-radius:50%}.label__text{margin-right:10px;display:flex;justify-content:center;align-items:center;font-style:normal;font-variant:normal;font-weight:400;font-size:10px;line-height:13px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.2px;color:#707070!important}.lib-verticalstack-labels-ontop-weklycharts{font-style:normal;font-variant:normal;font-weight:700;font-size:10px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.lib-verticalstack-title-ontop{font-style:normal;font-variant:normal;font-size:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.marginLeft-20{margin-left:20px}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"] }]
|
|
713
1275
|
}], ctorParameters: () => [], propDecorators: { containerElt: [{
|
|
714
1276
|
type: ViewChild,
|
|
715
1277
|
args: ['verticalstackedchartcontainer', { static: true }]
|
|
@@ -725,4 +1287,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
725
1287
|
}], headerMenuclickEvent: [{
|
|
726
1288
|
type: Output
|
|
727
1289
|
}] } });
|
|
728
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2hvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tL2hvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQThDbEQsTUFBTSxPQUFPLHFDQUNYLFNBQVEsaUJBQWlCO0lBbUR6QjtRQUNFLEtBQUssRUFBRSxDQUFDO1FBekNBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUMzQixhQUFRLEdBQVcsSUFBSSxDQUFDLFdBQVcsRUFBRSxD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QUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRVbmlxdWVJZCB9IGZyb20gJy4uL3VuaXF1ZS1pZCc7XHJcbmltcG9ydCBDaGFydEhlbHBlciBmcm9tICcuLi9jaGFydC1oZWxwZXInO1xyXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XHJcbmltcG9ydCB7IFJlc2l6ZWRFdmVudCB9IGZyb20gJ2FuZ3VsYXItcmVzaXplLWV2ZW50JztcclxuaW1wb3J0IEhlYWRlckNvbmZpZ0hlbHBlciBmcm9tICcuLi9oZWFkZXItY29uZmlnJztcclxuXHJcbmludGVyZmFjZSBDaGFydERhdGEge1xyXG4gIGRhdGE6IGFueVtdO1xyXG4gIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhO1xyXG4gIGxpbmVEYXRhPzogYW55W107XHJcbiAgdGFyZ2V0TGluZURhdGE/OiBUYXJnZXRMaW5lRGF0YTtcclxufVxyXG5cclxuaW50ZXJmYWNlIENoYXJ0TWV0YURhdGEge1xyXG4gIGNvbG9yczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICBrZXlMaXN0OiBzdHJpbmdbXTtcclxuICB1bml0Pzogc3RyaW5nO1xyXG4gIGlzQ0M/OiBib29sZWFuO1xyXG4gIGJhcldpdGhvdXRDbGljaz86IHN0cmluZ1tdO1xyXG4gIGhhc0RyaWxsRG93bj86IGJvb2xlYW47XHJcbiAgaG92ZXJDb2xvcj86IHN0cmluZztcclxuICBkYXRhVHlwZT86IHN0cmluZztcclxuICB5TGFiZWw/OiBzdHJpbmc7XHJcbiAgbGluZXlMYWJlbD86IHN0cmluZztcclxuICB4TGFiZWw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBUYXJnZXRMaW5lRGF0YSB7XHJcbiAgdGFyZ2V0OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgdGFyZ2V0TmFtZT86IHN0cmluZztcclxuICBjb2xvcjogc3RyaW5nO1xyXG4gIGJhckFib3ZlVGFyZ2V0Q29sb3I/OiBzdHJpbmc7XHJcbiAgYmFyQWJvdmVUYXJnZXRIb3ZlckNvbG9yPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRGV2aWNlQnJlYWtwb2ludHMge1xyXG4gIGlzTW9iaWxlOiBib29sZWFuO1xyXG4gIGlzVGFibGV0OiBib29sZWFuO1xyXG4gIGlzRGVza3RvcDogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbXHJcbiAgICAnLi9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQubGVzcycsXHJcbiAgICAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJyxcclxuICBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIb3Jpem9udGFsQmFyc1dpdGhTY3JvbGxab29tQ29tcG9uZW50XHJcbiAgZXh0ZW5kcyBDb21wb25lbnRVbmlxdWVJZFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIFxyXG4gIEBWaWV3Q2hpbGQoJ3ZlcnRpY2Fsc3RhY2tlZGNoYXJ0Y29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCd2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YSE6IENoYXJ0RGF0YTtcclxuICBASW5wdXQoKSBjdXN0b21DaGFydENvbmZpZ3VyYXRpb24/OiBhbnk7XHJcbiAgQE91dHB1dCgpIGNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaGVhZGVyTWVudWNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgY2hhcnRDb25maWd1cmF0aW9uOiBhbnkgPSB7fTtcclxuICBpc0hlYWRlclZpc2libGUgPSB0cnVlO1xyXG4gIGlzVG9wQ2FwdGlvblZpc2libGUgPSB0cnVlO1xyXG4gIHVuaXF1ZUlkOiBzdHJpbmcgPSB0aGlzLmdldFVuaXF1ZUlkKCk7XHJcbiAgaXNUcmFuc3BhcmVudEJhY2tncm91bmQgPSBmYWxzZTtcclxuICBpc0NDID0gZmFsc2U7XHJcbiAgaXNab29tZWRPdXQgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IFRJQ0tfTEVOR1RIUyA9IHtcclxuICAgIHNob3J0OiA0LFxyXG4gICAgbG9uZzogMTYsXHJcbiAgICBzaG9ydEJnOiA1LFxyXG4gICAgbG9uZ0JnOiAzMCxcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IFNQQUNJTkcgPSB7XHJcbiAgICByaWdodFN2Z1dpZHRoOiA2MCxcclxuICAgIGxlZnRBbmRSaWdodDogNTAsXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0Q29uZmlndXJhdGlvbiA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDQwIH0sXHJcbiAgICBzdmdIZWlnaHQ6IDcwLFxyXG4gICAgbGVnZW5kSGVpZ2h0OiAnMTAlJyxcclxuICAgIG51bWJlck9mWVRpY2tzOiA1LFxyXG4gICAgbGFiZWxGb3JtYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB4QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB5QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB5TGluZUF4aXNMYWJlbEZvbWF0dGVyOiBDaGFydEhlbHBlci5kZWZhdWx0Rm9ybWF0dGVyLFxyXG4gICAgbGluZUdyYXBoQ29sb3I6ICcjRjZEMjgzJyxcclxuICAgIHNob3dMaW5lQ2hhcnRBeGlzOiB0cnVlLFxyXG4gICAgc2hvd0xlZ2VuZDogZmFsc2UsXHJcbiAgICBmb3JDb21wYXJpc29uOiB0cnVlLFxyXG4gICAgaGVhZGVyTWVudU9wdGlvbnM6IEhlYWRlckNvbmZpZ0hlbHBlci5oZWFkZXJDb25maWcuaGVhZGVyTWVudU9wdGlvbnMsXHJcbiAgICB5QXhpc0dyaWQ6IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge31cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWRyYXdDaGFydCgpO1xyXG4gIH1cclxuXHJcbiAgb25SZXNpemVkKGV2ZW50OiBSZXNpemVkRXZlbnQpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWRyYXdDaGFydCgpLCAxMCk7XHJcbiAgfVxyXG5cclxuICBpc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNab29tZWRPdXQgPSBpc1pvb21PdXQ7XHJcbiAgICB0aGlzLnJlZHJhd0NoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZHJhd0NoYXJ0KCk6IHZvaWQge1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHRoaXMudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplU3RhY2tlZENoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERldmljZUJyZWFrcG9pbnRzKCk6IERldmljZUJyZWFrcG9pbnRzIHtcclxuICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpc01vYmlsZTogd2lkdGggPCA1NzYsXHJcbiAgICAgIGlzVGFibGV0OiB3aWR0aCA+PSA1NzYgJiYgd2lkdGggPCA5OTIsXHJcbiAgICAgIGlzRGVza3RvcDogd2lkdGggPj0gOTkyLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlSZXNwb25zaXZlQ29uZmlnKGRldmljZTogRGV2aWNlQnJlYWtwb2ludHMpOiB2b2lkIHtcclxuICAgIGlmIChkZXZpY2UuaXNNb2JpbGUpIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luID0geyB0b3A6IDIwLCByaWdodDogMTAsIGJvdHRvbTogNDAsIGxlZnQ6IDMwIH07XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzID0gNDtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ID0gNjA7XHJcbiAgICB9IGVsc2UgaWYgKGRldmljZS5pc1RhYmxldCkge1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4gPSB7IHRvcDogMjUsIHJpZ2h0OiAyMCwgYm90dG9tOiA0NSwgbGVmdDogNDAgfTtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MgPSA2O1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgPSA3MDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbiA9IHsgdG9wOiAzMCwgcmlnaHQ6IDMwLCBib3R0b206IDUwLCBsZWZ0OiA2MCB9O1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcyA9IDc7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCA9IDgwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ3VyYXRpb25zKCk6IHZvaWQge1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbikuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlTWV0YURhdGEobWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiBDaGFydE1ldGFEYXRhIHtcclxuICAgIGlmICghbWV0YURhdGEudW5pdCkgbWV0YURhdGEudW5pdCA9ICcnO1xyXG4gICAgaWYgKG1ldGFEYXRhLmlzQ0MpIHRoaXMuaXNDQyA9IG1ldGFEYXRhLmlzQ0M7XHJcbiAgICBcclxuICAgIGlmIChtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2s/Lmxlbmd0aCkge1xyXG4gICAgICBtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgPSBtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subWFwKGVsID0+IGVsLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWV0YURhdGEuYmFyV2l0aG91dENsaWNrID0gW107XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBtZXRhRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VUYXJnZXRWYWx1ZSh0YXJnZXRMaW5lRGF0YT86IFRhcmdldExpbmVEYXRhKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRhcmdldExpbmVEYXRhPy50YXJnZXQpIHJldHVybiBudWxsO1xyXG4gICAgXHJcbiAgICBjb25zdCBwYXJzZWROdW0gPSBwYXJzZUZsb2F0KFN0cmluZyh0YXJnZXRMaW5lRGF0YS50YXJnZXQpKTtcclxuICAgIGlmIChpc05hTihwYXJzZWROdW0pKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGFyc2VkTnVtKSBcclxuICAgICAgPyBwYXJzZUludChTdHJpbmcodGFyZ2V0TGluZURhdGEudGFyZ2V0KSkgXHJcbiAgICAgIDogcGFyc2VkTnVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVEaW1lbnNpb25zKFxyXG4gICAgY29udGFpbmVyV2lkdGg6IG51bWJlcixcclxuICAgIGNvbnRhaW5lckhlaWdodDogbnVtYmVyLFxyXG4gICAgbWFyZ2luOiBhbnksXHJcbiAgICBkZXZpY2U6IERldmljZUJyZWFrcG9pbnRzXHJcbiAgKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcclxuICAgIGxldCB3aWR0aCA9IGNvbnRhaW5lcldpZHRoIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgICBsZXQgaGVpZ2h0ID0gY29udGFpbmVySGVpZ2h0ICogKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCAvIDEwMCkgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbTtcclxuXHJcbiAgICAvLyBBZGp1c3Qgd2lkdGggZm9yIHpvb20gbGV2ZWxzXHJcbiAgICBjb25zdCBkYXRhTGVuZ3RoID0gdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGg7XHJcbiAgICBpZiAoZGF0YUxlbmd0aCA+IDMwICYmIHRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgICAgY29uc3QgbWluV2lkdGggPSBkYXRhTGVuZ3RoICogKGRldmljZS5pc01vYmlsZSA/IDE1IDogMjUpO1xyXG4gICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBtaW5XaWR0aCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YUxlbmd0aCA+IDggJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgICAgd2lkdGggPSBkYXRhTGVuZ3RoICogKGRldmljZS5pc01vYmlsZSA/IDYwIDogMTMwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBzcGVjaWFsIGhlaWdodCBjb25maWd1cmF0aW9uc1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbiAmJiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgIT09IDgwKSB7XHJcbiAgICAgIGhlaWdodCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgIGhlaWdodCA9IGNvbnRhaW5lckhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICBoZWlnaHQgPSBjb250YWluZXJIZWlnaHQgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbSAtIChkZXZpY2UuaXNNb2JpbGUgPyA2MCA6IDEzMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVCYXJEaW1lbnNpb25zKFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGRhdGFMZW5ndGg6IG51bWJlcixcclxuICAgIGRldmljZTogRGV2aWNlQnJlYWtwb2ludHNcclxuICApOiB7IGJhcldpZHRoOiBudW1iZXI7IGJhclBhZGRpbmc6IG51bWJlcjsgcmVxdWlyZWRTdmdXaWR0aDogbnVtYmVyIH0ge1xyXG4gICAgbGV0IGJhcldpZHRoOiBudW1iZXI7XHJcbiAgICBsZXQgYmFyUGFkZGluZzogbnVtYmVyO1xyXG4gICAgbGV0IHJlcXVpcmVkU3ZnV2lkdGg6IG51bWJlcjtcclxuXHJcbiAgICBpZiAoZGV2aWNlLmlzTW9iaWxlKSB7XHJcbiAgICAgIGNvbnN0IG1pbkJhcldpZHRoID0gMzI7XHJcbiAgICAgIGJhcldpZHRoID0gbWluQmFyV2lkdGg7XHJcbiAgICAgIGJhclBhZGRpbmcgPSAxMjtcclxuICAgICAgcmVxdWlyZWRTdmdXaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgIHdpZHRoIC0gdGhpcy5TUEFDSU5HLnJpZ2h0U3ZnV2lkdGgsXHJcbiAgICAgICAgKGJhcldpZHRoICsgYmFyUGFkZGluZykgKiBkYXRhTGVuZ3RoICsgdGhpcy5TUEFDSU5HLmxlZnRBbmRSaWdodCAqIDIgKyBcclxuICAgICAgICB0aGlzLlNQQUNJTkcucmlnaHRTdmdXaWR0aCAtIGJhclBhZGRpbmdcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJhcldpZHRoID0gTWF0aC5tYXgoXHJcbiAgICAgICAgNDAsXHJcbiAgICAgICAgKHdpZHRoIC0gdGhpcy5TUEFDSU5HLnJpZ2h0U3ZnV2lkdGggLSB0aGlzLlNQQUNJTkcubGVmdEFuZFJpZ2h0ICogMikgLyBkYXRhTGVuZ3RoXHJcbiAgICAgICk7XHJcbiAgICAgIGJhclBhZGRpbmcgPSAwO1xyXG4gICAgICByZXF1aXJlZFN2Z1dpZHRoID0gd2lkdGggLSB0aGlzLlNQQUNJTkcucmlnaHRTdmdXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBiYXJXaWR0aCwgYmFyUGFkZGluZywgcmVxdWlyZWRTdmdXaWR0aCB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTY2FsZXMoZGF0YTogYW55W10sIGhlaWdodDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBkZXZpY2U6IERldmljZUJyZWFrcG9pbnRzKSB7XHJcbiAgICBjb25zdCB4U2NhbGUgPSBkM1xyXG4gICAgICAuc2NhbGVCYW5kKClcclxuICAgICAgLnJhbmdlUm91bmQoW1xyXG4gICAgICAgIHRoaXMuU1BBQ0lORy5sZWZ0QW5kUmlnaHQsXHJcbiAgICAgICAgd2lkdGggLSB0aGlzLlNQQUNJTkcucmlnaHRTdmdXaWR0aCAtIHRoaXMuU1BBQ0lORy5sZWZ0QW5kUmlnaHRcclxuICAgICAgXSlcclxuICAgICAgLmRvbWFpbihkYXRhLm1hcChkID0+IGQubmFtZSkucmV2ZXJzZSgpKVxyXG4gICAgICAucGFkZGluZyhkZXZpY2UuaXNNb2JpbGUgPyAwLjIgOiAwLjUpO1xyXG5cclxuICAgIGNvbnN0IHlTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCkucmFuZ2VSb3VuZChbaGVpZ2h0LCAwXSk7XHJcblxyXG4gICAgcmV0dXJuIHsgeFNjYWxlLCB5U2NhbGUgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlWVNjYWxlRG9tYWluKGxheWVyczogYW55W10sIHRhcmdldFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBtYXhWYWx1ZSA9IGQzLm1heChsYXllcnMsIChkOiBhbnkpID0+IGQzLm1heChkLCAoZDogYW55KSA9PiBkWzFdKSkgfHwgMDtcclxuXHJcbiAgICBpZiAobWF4VmFsdWUgPT09IDApIHtcclxuICAgICAgbWF4VmFsdWUgPSB0YXJnZXRWYWx1ZSA/IHRhcmdldFZhbHVlICsgMjAgOiAxMDA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZSkge1xyXG4gICAgICBtYXhWYWx1ZSAqPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRhcmdldFZhbHVlICYmIG1heFZhbHVlIDwgdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSA8IDEwICYmIHRhcmdldFZhbHVlIDwgMTAgXHJcbiAgICAgICAgPyB0YXJnZXRWYWx1ZSArIDMgXHJcbiAgICAgICAgOiB0YXJnZXRWYWx1ZSArIDIwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYXhWYWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvdWxkU2hvd1RhcmdldExpbmVDb2xvcihkOiBhbnksIHRhcmdldFZhbHVlPzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEoXHJcbiAgICAgICFpc05hTihkWzBdKSAmJlxyXG4gICAgICAhaXNOYU4oZFsxXSkgJiZcclxuICAgICAgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiZcclxuICAgICAgdGFyZ2V0VmFsdWUgJiZcclxuICAgICAgcGFyc2VGbG9hdChkWzFdKSAtIHBhcnNlRmxvYXQoZFswXSkgPj0gdGFyZ2V0VmFsdWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhckZpbGxDb2xvcihkOiBhbnksIGtleTogc3RyaW5nLCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSwgdGFyZ2V0VmFsdWU/OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuc2hvdWxkU2hvd1RhcmdldExpbmVDb2xvcihkLCB0YXJnZXRWYWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhPy5iYXJBYm92ZVRhcmdldENvbG9yIHx8IG1ldGFEYXRhLmNvbG9yc1trZXldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1ldGFEYXRhLmNvbG9yc1trZXldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0Fjcm9ueW0obGFiZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYWxwaGFPbmx5ID0gbGFiZWwucmVwbGFjZSgvW15BLVphLXpdL2csICcnKTtcclxuICAgIHJldHVybiAobGFiZWwubGVuZ3RoIDw9IDQgJiYgL15bQS1aXSskLy50ZXN0KGxhYmVsKSkgfHwgXHJcbiAgICAgICAgICAgKGxhYmVsID09PSBsYWJlbC50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChsYWJlbCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRBeGlzTGFiZWwodGV4dDogc3RyaW5nKTogeyBmb3JtYXR0ZWQ6IHN0cmluZzsgaXNBY3JvbnltOiBib29sZWFuIH0ge1xyXG4gICAgY29uc3QgaXNBY3IgPSB0aGlzLmlzQWNyb255bSh0ZXh0KTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZvcm1hdHRlZDogaXNBY3IgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIGlzQWNyb255bTogaXNBY3JcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplU3RhY2tlZENoYXJ0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZGV2aWNlID0gdGhpcy5nZXREZXZpY2VCcmVha3BvaW50cygpO1xyXG4gICAgdGhpcy5hcHBseVJlc3BvbnNpdmVDb25maWcoZGV2aWNlKTtcclxuICAgIHRoaXMubWVyZ2VDb25maWd1cmF0aW9ucygpO1xyXG5cclxuICAgIGNvbnN0IHsgZGF0YSwgbWV0YURhdGEsIGxpbmVEYXRhIH0gPSB0aGlzLmNoYXJ0RGF0YTtcclxuICAgIGNvbnN0IHByZXBhcmVkTWV0YURhdGEgPSB0aGlzLnByZXBhcmVNZXRhRGF0YShtZXRhRGF0YSk7XHJcbiAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRoaXMucGFyc2VUYXJnZXRWYWx1ZSh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSk7XHJcblxyXG4gICAgY29uc3QgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy52ZXJ0aWNhbHN0YWNrZWRjb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjaGFydENvbnRhaW5lci5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcclxuXHJcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuY2FsY3VsYXRlRGltZW5zaW9ucyhcclxuICAgICAgY29udGFpbmVyV2lkdGgsXHJcbiAgICAgIGNvbnRhaW5lckhlaWdodCxcclxuICAgICAgbWFyZ2luLFxyXG4gICAgICBkZXZpY2VcclxuICAgICk7XHJcblxyXG4gICAgLy8gQXBwbHkgdmlzaWJpbGl0eSBjb25maWd1cmF0aW9uc1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaXNIZWFkZXJWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVG9wQ2FwdGlvblZpc2libGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmlzVG9wQ2FwdGlvblZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RvcENhcHRpb25WaXNpYmxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBmb3JtYXR0ZXJzXHJcbiAgICBjb25zdCBmb3JtYXRGcm9tQmFja2VuZCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXJcclxuICAgICAgPyBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlcilcclxuICAgICAgOiBudWxsO1xyXG4gICAgY29uc3QgZm9ybWF0Rm9ySHVnZU51bWJlcnMgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoJy4ycycpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBTVkcgY29udGFpbmVyc1xyXG4gICAgY29uc3QgeyBiYXJXaWR0aCwgYmFyUGFkZGluZywgcmVxdWlyZWRTdmdXaWR0aCB9ID0gdGhpcy5jYWxjdWxhdGVCYXJEaW1lbnNpb25zKFxyXG4gICAgICB3aWR0aCxcclxuICAgICAgZGF0YS5sZW5ndGgsXHJcbiAgICAgIGRldmljZVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBvdXRlckNvbnRhaW5lciA9IHRoaXMuY3JlYXRlT3V0ZXJDb250YWluZXIoY2hhcnRDb250YWluZXIsIGhlaWdodCwgbWFyZ2luKTtcclxuICAgIGNvbnN0IHsgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0IH0gPSB0aGlzLmNyZWF0ZUF4aXNDb250YWluZXJzKFxyXG4gICAgICBvdXRlckNvbnRhaW5lcixcclxuICAgICAgaGVpZ2h0LFxyXG4gICAgICBtYXJnaW5cclxuICAgICk7XHJcbiAgICBjb25zdCB7IGlubmVyQ29udGFpbmVyLCBzdmcgfSA9IHRoaXMuY3JlYXRlSW5uZXJDb250YWluZXIoXHJcbiAgICAgIG91dGVyQ29udGFpbmVyLFxyXG4gICAgICByZXF1aXJlZFN2Z1dpZHRoLFxyXG4gICAgICBoZWlnaHQsXHJcbiAgICAgIG1hcmdpbixcclxuICAgICAgZGV2aWNlXHJcbiAgICApO1xyXG5cclxuICAgIC8vIENyZWF0ZSBzY2FsZXNcclxuICAgIGNvbnN0IHsgeFNjYWxlLCB5U2NhbGUgfSA9IHRoaXMuY3JlYXRlU2NhbGVzKGRhdGEsIGhlaWdodCwgd2lkdGgsIGRldmljZSk7XHJcbiAgICBcclxuICAgIC8vIFN0YWNrIGRhdGFcclxuICAgIGNvbnN0IHN0YWNrOiBhbnkgPSBkM1xyXG4gICAgICAuc3RhY2soKVxyXG4gICAgICAua2V5cyhwcmVwYXJlZE1ldGFEYXRhLmtleUxpc3QpXHJcbiAgICAgIC5vZmZzZXQoZDMuc3RhY2tPZmZzZXROb25lKTtcclxuICAgIGNvbnN0IGxheWVyczogYW55ID0gc3RhY2soZGF0YSk7XHJcblxyXG4gICAgLy8gU2V0IFkgc2NhbGUgZG9tYWluXHJcbiAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlWVNjYWxlRG9tYWluKGxheWVycywgdGFyZ2V0VmFsdWUgfHwgdW5kZWZpbmVkKTtcclxuICAgIHlTY2FsZS5kb21haW4oWzAsIG1heFZhbHVlXSkubmljZSgpO1xyXG5cclxuICAgIC8vIFJlbmRlciBjaGFydCBlbGVtZW50c1xyXG4gICAgdGhpcy5yZW5kZXJHcmlkcyhzdmcsIHhTY2FsZSwgeVNjYWxlLCBoZWlnaHQsIHdpZHRoKTtcclxuICAgIHRoaXMucmVuZGVyQmFycyhcclxuICAgICAgc3ZnLFxyXG4gICAgICBsYXllcnMsXHJcbiAgICAgIHhTY2FsZSxcclxuICAgICAgeVNjYWxlLFxyXG4gICAgICBwcmVwYXJlZE1ldGFEYXRhLFxyXG4gICAgICBkZXZpY2UsXHJcbiAgICAgIGJhcldpZHRoLFxyXG4gICAgICBiYXJQYWRkaW5nLFxyXG4gICAgICB0YXJnZXRWYWx1ZSxcclxuICAgICAgZm9ybWF0RnJvbUJhY2tlbmQsXHJcbiAgICAgIGZvcm1hdEZvckh1Z2VOdW1iZXJzXHJcbiAgICApO1xyXG4gICAgdGhpcy5yZW5kZXJBeGVzKHN2Zywgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0LCB4U2NhbGUsIHlTY2FsZSwgZGF0YSwgaGVpZ2h0LCB3aWR0aCwgZGV2aWNlKTtcclxuICAgIHRoaXMucmVuZGVyTGFiZWxzKHN2Zywgc3ZnWUF4aXNMZWZ0LCBwcmVwYXJlZE1ldGFEYXRhLCBoZWlnaHQsIHdpZHRoLCBtYXJnaW4pO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiYgdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRMaW5lKHN2Zywgc3ZnWUF4aXNSaWdodCwgeVNjYWxlLCB3aWR0aCwgdGFyZ2V0VmFsdWUsIHByZXBhcmVkTWV0YURhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChsaW5lRGF0YSkge1xyXG4gICAgICB0aGlzLnJlbmRlckxpbmVDaGFydChzdmcsIGxpbmVEYXRhLCB4U2NhbGUsIGhlaWdodCwgcHJlcGFyZWRNZXRhRGF0YS5jb2xvcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVPdXRlckNvbnRhaW5lcihjaGFydENvbnRhaW5lcjogYW55LCBoZWlnaHQ6IG51bWJlciwgbWFyZ2luOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGNoYXJ0Q29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgIC5hdHRyKCdpZCcsIHRoaXMudW5pcXVlSWQpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdvdXRlci1jb250YWluZXInKVxyXG4gICAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgICAuc3R5bGUoJ2hlaWdodCcsIGhlaWdodClcclxuICAgICAgLnN0eWxlKCdvdmVyZmxvdy14JywgJ2hpZGRlbicpXHJcbiAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgYCR7bWFyZ2luLmxlZnR9cHhgKVxyXG4gICAgICAuc3R5bGUoJ21hcmdpbi1sZWZ0JywgJzEwcHgnKVxyXG4gICAgICAuc3R5bGUoJ3BhZGRpbmctcmlnaHQnLCBgJHt0aGlzLlNQQUNJTkcucmlnaHRTdmdXaWR0aH1weGApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVBeGlzQ29udGFpbmVycyhvdXRlckNvbnRhaW5lcjogYW55LCBoZWlnaHQ6IG51bWJlciwgbWFyZ2luOiBhbnkpOiBhbnkge1xyXG4gICAgY29uc3Qgc3ZnWUF4aXNMZWZ0ID0gb3V0ZXJDb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzgwJylcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKVxyXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgICAgLnN0eWxlKCdsZWZ0JywgJzAnKVxyXG4gICAgICAuc3R5bGUoJ3otaW5kZXgnLCAxKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdCArIDEwfSwke21hcmdpbi50b3B9KWApO1xyXG5cclxuICAgIGNvbnN0IHN2Z1lBeGlzUmlnaHQgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB0aGlzLlNQQUNJTkcucmlnaHRTdmdXaWR0aClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKVxyXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgICAgLnN0eWxlKCdyaWdodCcsICcycHgnKVxyXG4gICAgICAuc3R5bGUoJ3otaW5kZXgnLCAxKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke21hcmdpbi50b3B9KWApO1xyXG5cclxuICAgIHJldHVybiB7IHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVJbm5lckNvbnRhaW5lcihcclxuICAgIG91dGVyQ29udGFpbmVyOiBhbnksXHJcbiAgICByZXF1aXJlZFN2Z1dpZHRoOiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgIG1hcmdpbjogYW55LFxyXG4gICAgZGV2aWNlOiBEZXZpY2VCcmVha3BvaW50c1xyXG4gICk6IGFueSB7XHJcbiAgICBjb25zdCBpbm5lckNvbnRhaW5lciA9IG91dGVyQ29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdpbm5lci1jb250YWluZXInKVxyXG4gICAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgICAuc3R5bGUoJ292ZXJmbG93LXgnLCBkZXZpY2UuaXNNb2JpbGUgPyAnYXV0bycgOiAnYXV0bycpO1xyXG5cclxuICAgIGNvbnN0IHN2ZyA9IGlubmVyQ29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHJlcXVpcmVkU3ZnV2lkdGgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDMwKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke21hcmdpbi50b3B9KWApO1xyXG5cclxuICAgIHJldHVybiB7IGlubmVyQ29udGFpbmVyLCBzdmcgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyR3JpZHMoc3ZnOiBhbnksIHhTY2FsZTogYW55LCB5U2NhbGU6IGFueSwgaGVpZ2h0OiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hncmlkQmV0d2VlbkxhYmVscykge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCcpXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt4U2NhbGUuYmFuZHdpZHRoKCkgLyAyfSwke2hlaWdodH0pYClcclxuICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHhTY2FsZSkudGlja1NpemUoLWhlaWdodCkudGlja0Zvcm1hdCgnJykpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgICAgLnN0eWxlKCdjb2xvcicsICcjOTk5OTk5JylcclxuICAgICAgICAuY2FsbCgoZzogYW55KSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNHcmlkKSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkJylcclxuICAgICAgICAuY2FsbChcclxuICAgICAgICAgIGQzXHJcbiAgICAgICAgICAgIC5heGlzTGVmdCh5U2NhbGUpXHJcbiAgICAgICAgICAgIC50aWNrcyh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgICAgICAgLnRpY2tTaXplKC13aWR0aClcclxuICAgICAgICAgICAgLnRpY2tGb3JtYXQoJycpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciknKVxyXG4gICAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcxJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnhBeGlzR3JpZCkge1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0dyaWQuZm9yRWFjaCgoZ3JpZFBvczogbnVtYmVyLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgc3ZnXHJcbiAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGB4JHtpbmRleCArIDJ9IGF4aXMke2luZGV4ICsgMn1gKVxyXG4gICAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yKScpXHJcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7aGVpZ2h0ICogZ3JpZFBvc30pYClcclxuICAgICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeFNjYWxlKS50aWNrU2l6ZSgwKS50aWNrcyg1KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQmFycyhcclxuICAgIHN2ZzogYW55LFxyXG4gICAgbGF5ZXJzOiBhbnksXHJcbiAgICB4U2NhbGU6IGFueSxcclxuICAgIHlTY2FsZTogYW55LFxyXG4gICAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsXHJcbiAgICBkZXZpY2U6IERldmljZUJyZWFrcG9pbnRzLFxyXG4gICAgYmFyV2lkdGg6IG51bWJlcixcclxuICAgIGJhclBhZGRpbmc6IG51bWJlcixcclxuICAgIHRhcmdldFZhbHVlOiBudW1iZXIgfCBudWxsLFxyXG4gICAgZm9ybWF0RnJvbUJhY2tlbmQ6IGFueSxcclxuICAgIGZvcm1hdEZvckh1Z2VOdW1iZXJzOiBhbnlcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGxheWVyID0gc3ZnXHJcbiAgICAgIC5zZWxlY3RBbGwoJy5sYXllcicpXHJcbiAgICAgIC5kYXRhKGxheWVycylcclxuICAgICAgLmVudGVyKClcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsYXllcicpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsIChkOiBhbnkpID0+IG1ldGFEYXRhLmNvbG9yc1tkLmtleV0pO1xyXG5cclxuICAgIGNvbnN0IHJlY3QgPSBsYXllci5zZWxlY3RBbGwoJ3JlY3QnKS5kYXRhKChkOiBhbnkpID0+IGQpLmVudGVyKCk7XHJcblxyXG4gICAgcmVjdFxyXG4gICAgICAuYXBwZW5kKCdyZWN0JylcclxuICAgICAgLm9uKCdjbGljaycsIChkOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hhcnREYXRhLmxpbmVEYXRhIHx8IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmZvckNvbXBhcmlzb24pIHtcclxuICAgICAgICAgIGlmICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrPy5pbmNsdWRlcyhkLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKGQuZGF0YS5uYW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hdHRyKCd5JywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghaXNOYU4oZFswXSkgJiYgIWlzTmFOKGRbMV0pKSB7XHJcbiAgICAgICAgICBjb25zdCBhY3R1YWxIZWlnaHQgPSB5U2NhbGUoZFswXSkgLSB5U2NhbGUoZFsxXSk7XHJcbiAgICAgICAgICByZXR1cm4gYWN0dWFsSGVpZ2h0IDwgMyA/IHlTY2FsZShkWzBdKSAtIDMgOiB5U2NhbGUoZFsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cigneCcsIChkOiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmIChkZXZpY2UuaXNNb2JpbGUpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLlNQQUNJTkcubGVmdEFuZFJpZ2h0ICsgaSAqIChiYXJXaWR0aCArIGJhclBhZGRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHhTY2FsZShkLmRhdGEubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0ICYmIHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoIDw9IDMpIHtcclxuICAgICAgICAgIHJldHVybiB4U2NhbGUoZC5kYXRhLm5hbWUpICsgeFNjYWxlLmJhbmR3aWR0aCgpIC8gMiAtIDM1O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geFNjYWxlKGQuZGF0YS5uYW1lKSArIHhTY2FsZS5iYW5kd2lkdGgoKSAqIDAuMTtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIChkOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWlzTmFOKGRbMF0pICYmICFpc05hTihkWzFdKSkge1xyXG4gICAgICAgICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0geVNjYWxlKGRbMF0pIC0geVNjYWxlKGRbMV0pO1xyXG4gICAgICAgICAgcmV0dXJuIGFjdHVhbEhlaWdodCA8IDMgPyAzIDogYWN0dWFsSGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChkZXZpY2UuaXNNb2JpbGUpIHJldHVybiBiYXJXaWR0aDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHhTY2FsZS5iYW5kd2lkdGgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiYgdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggPD0gM1xyXG4gICAgICAgICAgPyA3MFxyXG4gICAgICAgICAgOiB4U2NhbGUuYmFuZHdpZHRoKCkgKiAwLjg7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghbWV0YURhdGEuaGFzRHJpbGxEb3duKSByZXR1cm4gJ2RlZmF1bHQnO1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2s/LmluY2x1ZGVzKGQuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICByZXR1cm4gJ2RlZmF1bHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJ3BvaW50ZXInO1xyXG4gICAgICB9KVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAoZDogYW55KSA9PiB0aGlzLmdldEJhckZpbGxDb2xvcihkLCBkLmtleSwgbWV0YURhdGEsIHRhcmdldFZhbHVlIHx8IHVuZGVmaW5lZCkpO1xyXG5cclxuICAgIC8vIEFkZCB0b29sdGlwcyBhbmQgbGFiZWxzXHJcbiAgICBpZiAoIXRoaXMuaXNDQyAmJiAhdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUpIHtcclxuICAgICAgcmVjdC5hcHBlbmQoJ3N2Zzp0aXRsZScpLnRleHQoKGQ6IGFueSkgPT4gZFsxXSAtIGRbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkQmFyTGFiZWxzKHJlY3QsIHhTY2FsZSwgeVNjYWxlLCBtZXRhRGF0YSwgZm9ybWF0RnJvbUJhY2tlbmQsIGZvcm1hdEZvckh1Z2VOdW1iZXJzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkQmFyTGFiZWxzKFxyXG4gICAgcmVjdDogYW55LFxyXG4gICAgeFNjYWxlOiBhbnksXHJcbiAgICB5U2NhbGU6IGFueSxcclxuICAgIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhLFxyXG4gICAgZm9ybWF0RnJvbUJhY2tlbmQ6IGFueSxcclxuICAgIGZvcm1hdEZvckh1Z2VOdW1iZXJzOiBhbnlcclxuICApOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zaG93VG90YWxPblRvcCkge1xyXG4gICAgICByZWN0XHJcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgLmF0dHIoJ3gnLCAoZDogYW55KSA9PiB4U2NhbGUoZC5kYXRhLm5hbWUpICsgeFNjYWxlLmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXZlcnRpY2Fsc3RhY2stbGFiZWxzLW9udG9wLXdla2x5Y2hhcnRzJylcclxuICAgICAgICAuYXR0cigneScsIChkOiBhbnkpID0+IHlTY2FsZShkWzFdKSAtIDMpXHJcbiAgICAgICAgLnRleHQoKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFpc05hTihkWzFdIC0gZFswXSkgJiYgZFsxXSAtIGRbMF0gIT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkWzFdIC0gZFswXTtcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gdmFsdWUgPD0gOTk5ID8gZm9ybWF0RnJvbUJhY2tlbmQgOiBmb3JtYXRGb3JIdWdlTnVtYmVycztcclxuICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhLnVuaXQgPyBtZXRhRGF0YS51bml0ICsgZm9ybWF0dGVyKHZhbHVlKSA6IGZvcm1hdHRlcih2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckF4ZXMoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIHN2Z1lBeGlzTGVmdDogYW55LFxyXG4gICAgc3ZnWUF4aXNSaWdodDogYW55LFxyXG4gICAgeFNjYWxlOiBhbnksXHJcbiAgICB5U2NhbGU6IGFueSxcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgZGV2aWNlOiBEZXZpY2VCcmVha3BvaW50c1xyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgeEF4aXMgPSBkM1xyXG4gICAgICAuYXhpc0JvdHRvbSh4U2NhbGUpXHJcbiAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAudGlja0Zvcm1hdCh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0xhYmVsRm9tYXR0ZXIpO1xyXG5cclxuICAgIGNvbnN0IHlBeGlzID0gZDNcclxuICAgICAgLmF4aXNMZWZ0KHlTY2FsZSlcclxuICAgICAgLnRpY2tzKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4gICAgICAudGlja1NpemUoMClcclxuICAgICAgLnRpY2tGb3JtYXQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuXHJcbiAgICAvLyBSZW5kZXIgYmFzZWQgb24gY2hhcnQgdHlwZVxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJTdGFuZGFyZEF4ZXMoc3ZnLCB4QXhpcywgeUF4aXMsIGRhdGEsIGhlaWdodCwgZGV2aWNlKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICB0aGlzLnJlbmRlckRyaWxsZG93bkF4ZXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIHhBeGlzLCB5QXhpcywgaGVpZ2h0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyTXVsdGlDaGFydEF4ZXMoc3ZnLCB4QXhpcywgeUF4aXMsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdHlsZUF4aXNEb21haW5zKHN2Zywgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyU3RhbmRhcmRBeGVzKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICB4QXhpczogYW55LFxyXG4gICAgeUF4aXM6IGFueSxcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICBkZXZpY2U6IERldmljZUJyZWFrcG9pbnRzXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoZGV2aWNlLmlzTW9iaWxlKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyTW9iaWxlWEF4aXMoc3ZnLCBkYXRhLCBoZWlnaHQsIGRldmljZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7aGVpZ2h0fSlgKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC14LWF4aXMtdGV4dCcpXHJcbiAgICAgICAgLmNhbGwoeEF4aXMpXHJcbiAgICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMnB4JylcclxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQnKVxyXG4gICAgICAuY2FsbCh5QXhpcylcclxuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJNb2JpbGVYQXhpcyhzdmc6IGFueSwgZGF0YTogYW55W10sIGhlaWdodDogbnVtYmVyLCBkZXZpY2U6IERldmljZUJyZWFrcG9pbnRzKTogdm9pZCB7XHJcbiAgICBjb25zdCBiYXJXaWR0aCA9IDMyO1xyXG4gICAgY29uc3QgYmFyUGFkZGluZyA9IDEyO1xyXG4gICAgXHJcbiAgICBzdmcuc2VsZWN0QWxsKCcuY3VzdG9tLXgtbGFiZWwnKS5yZW1vdmUoKTtcclxuICAgIGRhdGEuZm9yRWFjaCgoZDogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgeFZhbCA9IHRoaXMuU1BBQ0lORy5sZWZ0QW5kUmlnaHQgKyBpICogKGJhcldpZHRoICsgYmFyUGFkZGluZykgKyBiYXJXaWR0aCAvIDI7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdjdXN0b20teC1sYWJlbCcpXHJcbiAgICAgICAgLmF0dHIoJ3gnLCAwKVxyXG4gICAgICAgIC5hdHRyKCd5JywgaGVpZ2h0ICsgMTgpXHJcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt4VmFsICsgMjB9LDApYClcclxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMHB4JylcclxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ3NpZGV3YXlzLWxyJylcclxuICAgICAgICAudGV4dChkLm5hbWUuc3Vic3RyaW5nKDAsIDMpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEcmlsbGRvd25BeGVzKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBzdmdZQXhpc0xlZnQ6IGFueSxcclxuICAgIHN2Z1lBeGlzUmlnaHQ6IGFueSxcclxuICAgIHhBeGlzOiBhbnksXHJcbiAgICB5QXhpczogYW55LFxyXG4gICAgaGVpZ2h0OiBudW1iZXJcclxuICApOiB2b2lkIHtcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke2hlaWdodH0pYClcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXgtYXhpcy10ZXh0IG11bHRpY2hhcnQxJylcclxuICAgICAgLmNhbGwoeEF4aXMpXHJcbiAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gICAgc3ZnWUF4aXNMZWZ0XHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgICAgLmNhbGwoeUF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbiAgICBzdmdZQXhpc1JpZ2h0XHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgICAgLmNhbGwoeUF4aXMpXHJcbiAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck11bHRpQ2hhcnRBeGVzKHN2ZzogYW55LCB4QXhpczogYW55LCB5QXhpczogYW55LCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7aGVpZ2h0fSlgKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteC1heGlzLXRleHQgbXVsdGljaGFydCcpXHJcbiAgICAgIC5jYWxsKHhBeGlzKVxyXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQgeWF4aXMtZGFzaGVkJylcclxuICAgICAgLmNhbGwoeUF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3R5bGVBeGlzRG9tYWlucyhzdmc6IGFueSwgc3ZnWUF4aXNMZWZ0OiBhbnksIHN2Z1lBeGlzUmlnaHQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgYXhpc1N0eWxlID0ge1xyXG4gICAgICBzdHJva2U6ICd2YXIoLS1jaGFydC1heGlzLWNvbG9yKScsXHJcbiAgICAgICdzdHJva2Utd2lkdGgnOiAnMXB4J1xyXG4gICAgfTtcclxuXHJcbiAgICBbc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHRdLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGVsZW1lbnQuc2VsZWN0QWxsKCcuZG9tYWluJylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIGF4aXNTdHlsZS5zdHJva2UpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCBheGlzU3R5bGVbJ3N0cm9rZS13aWR0aCddKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMYWJlbHMoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIHN2Z1lBeGlzTGVmdDogYW55LFxyXG4gICAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBtYXJnaW46IGFueVxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKG1ldGFEYXRhLnlMYWJlbCkge1xyXG4gICAgICB0aGlzLnJlbmRlcllBeGlzTGFiZWwoc3ZnWUF4aXNMZWZ0LCBtZXRhRGF0YS55TGFiZWwsIGhlaWdodCwgbWFyZ2luKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWV0YURhdGEueExhYmVsKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyWEF4aXNMYWJlbChzdmcsIG1ldGFEYXRhLnhMYWJlbCwgaGVpZ2h0LCB3aWR0aCwgbWFyZ2luKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWUF4aXNMYWJlbChcclxuICAgIHN2Z1lBeGlzTGVmdDogYW55LFxyXG4gICAgeUxhYmVsOiBzdHJpbmcsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgIG1hcmdpbjogYW55XHJcbiAgKTogdm9pZCB7XHJcbiAgICBzdmdZQXhpc0xlZnQuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwsIC5saWIteWxhYmVsLWRyaWxsZG93bmNoYXJ0cywgLmxpYi15bGFiZWwtd2Vla2x5Q2hhcnRzJykucmVtb3ZlKCk7XHJcbiAgICBcclxuICAgIGNvbnN0IHsgZm9ybWF0dGVkLCBpc0Fjcm9ueW0gfSA9IHRoaXMuZm9ybWF0QXhpc0xhYmVsKHlMYWJlbCk7XHJcbiAgICBjb25zdCBpc1JpYSA9IHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uPy5pc1JpYTtcclxuICAgIGNvbnN0IHlQb3NpdGlvbiA9IGlzUmlhID8gLW1hcmdpbi5sZWZ0IC8gMiAtIDMwIDogLW1hcmdpbi5sZWZ0IC8gMiAtIDQwO1xyXG5cclxuICAgIGxldCBsYWJlbENsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICAgIGxhYmVsQ2xhc3MgKz0gJyBsaWIteWxhYmVsLWRyaWxsZG93bmNoYXJ0cyc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGFiZWxDbGFzcyArPSAnIGxpYi15bGFiZWwtd2Vla2x5Q2hhcnRzJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxhYmVsQ2xhc3MgKz0gJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG4gICAgfVxyXG5cclxuICAgIHN2Z1lBeGlzTGVmdFxyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgbGFiZWxDbGFzcylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgeVBvc2l0aW9uKVxyXG4gICAgICAuYXR0cigneCcsIC1oZWlnaHQgLyAyKVxyXG4gICAgICAuYXR0cignZHknLCAnMWVtJylcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAudGV4dChmb3JtYXR0ZWQpXHJcbiAgICAgIC5zdHlsZSgndGV4dC10cmFuc2Zvcm0nLCBpc0Fjcm9ueW0gPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJYQXhpc0xhYmVsKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICB4TGFiZWw6IHN0cmluZyxcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIG1hcmdpbjogYW55XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGZvcm1hdHRlZCwgaXNBY3JvbnltIH0gPSB0aGlzLmZvcm1hdEF4aXNMYWJlbCh4TGFiZWwpO1xyXG4gICAgY29uc3QgaXNSaWEgPSB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbj8uaXNSaWE7XHJcbiAgICBjb25zdCB4UG9zaXRpb24gPSBpc1JpYSBcclxuICAgICAgPyBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSBcclxuICAgICAgOiBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDEwO1xyXG5cclxuICAgIGxldCBsYWJlbENsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICAgIGxhYmVsQ2xhc3MgKz0gJyBsaWIteGxhYmVsLWRyaWxsZG93bmNoYXJ0cyc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGFiZWxDbGFzcyArPSAnIGxpYi14bGFiZWwtd2Vla2x5Q2hhcnRzJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxhYmVsQ2xhc3MgKz0gJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG4gICAgfVxyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgbGFiZWxDbGFzcylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCR7eFBvc2l0aW9ufSlgKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC50ZXh0KGZvcm1hdHRlZClcclxuICAgICAgLnN0eWxlKCd0ZXh0LXRyYW5zZm9ybScsIGlzQWNyb255bSA/ICdub25lJyA6ICdjYXBpdGFsaXplJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRhcmdldExpbmUoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIHN2Z1lBeGlzUmlnaHQ6IGFueSxcclxuICAgIHlTY2FsZTogYW55LFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIHRhcmdldFZhbHVlOiBudW1iZXIsXHJcbiAgICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YVxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgeVplcm8gPSB5U2NhbGUodGFyZ2V0VmFsdWUpO1xyXG4gICAgXHJcbiAgICAvLyBEcmF3IHRhcmdldCBsaW5lXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnbGluZScpXHJcbiAgICAgIC5hdHRyKCd4MScsIDApXHJcbiAgICAgIC5hdHRyKCd4MicsIHdpZHRoKVxyXG4gICAgICAuYXR0cigneTEnLCB5WmVybylcclxuICAgICAgLmF0dHIoJ3kyJywgeVplcm8pXHJcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhIS5jb2xvcik7XHJcblxyXG4gICAgLy8gQWRkIHRhcmdldCBsYWJlbFxyXG4gICAgY29uc3QgdGFyZ2V0TGluZU5hbWUgPSB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YT8udGFyZ2V0TmFtZSB8fCAndGFyZ2V0JztcclxuICAgIGNvbnN0IGRhdGFUeXBlID0gbWV0YURhdGEuZGF0YVR5cGUgfHwgJyc7XHJcblxyXG4gICAgc3ZnWUF4aXNSaWdodFxyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke3laZXJvIC0gMTN9KWApXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuU1BBQ0lORy5yaWdodFN2Z1dpZHRoKVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgNTApXHJcbiAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd0YXJnZXQtZGlzcGxheScpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuaHRtbChgXHJcbiAgICAgICAgPGRpdj4ke3RhcmdldExpbmVOYW1lfTwvZGl2PlxyXG4gICAgICAgIDxkaXY+JHt0YXJnZXRWYWx1ZX0ke2RhdGFUeXBlfTwvZGl2PlxyXG4gICAgICBgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTGluZUNoYXJ0KFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBsaW5lRGF0YTogYW55W10sXHJcbiAgICB4U2NhbGU6IGFueSxcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgY29sb3JzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBsaW5lWXNjYWxlID0gZDNcclxuICAgICAgLnNjYWxlTGluZWFyKClcclxuICAgICAgLmRvbWFpbihbMCwgZDMubWF4KGxpbmVEYXRhLCAoZDogYW55KSA9PiArZC52YWx1ZSkgfHwgMF0pXHJcbiAgICAgIC5yYW5nZShbaGVpZ2h0LCAwXSk7XHJcblxyXG4gICAgY29uc3QgZGF0YUdyb3VwID0gZDNcclxuICAgICAgLm5lc3QoKVxyXG4gICAgICAua2V5KChkOiBhbnkpID0+IGQuY2F0ZWdvcnkpXHJcbiAgICAgIC5lbnRyaWVzKGxpbmVEYXRhKTtcclxuXHJcbiAgICBjb25zdCBsaW5lR2VuID0gZDNcclxuICAgICAgLmxpbmUoKVxyXG4gICAgICAueCgoZDogYW55KSA9PiB4U2NhbGUoZC5uYW1lKSArIHhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgIC55KChkOiBhbnkpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpO1xyXG5cclxuICAgIGRhdGFHcm91cC5mb3JFYWNoKChncm91cDogYW55KSA9PiB7XHJcbiAgICAgIC8vIERyYXcgbGluZVxyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcclxuICAgICAgICAuZGF0dW0oZ3JvdXAudmFsdWVzKVxyXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAoZDogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZFswXSAmJiAnY2F0ZWdvcnknIGluIGRbMF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yc1tkWzBdLmNhdGVnb3J5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcjtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAyLjUpXHJcbiAgICAgICAgLmF0dHIoJ2QnLCBsaW5lR2VuKGdyb3VwLnZhbHVlcykpO1xyXG5cclxuICAgICAgLy8gRHJhdyBkb3RzXHJcbiAgICAgIGNvbnN0IGRvdCA9IHN2Z1xyXG4gICAgICAgIC5zZWxlY3RBbGwoJ215Q2lyY2xlcycpXHJcbiAgICAgICAgLmRhdGEoZ3JvdXAudmFsdWVzKVxyXG4gICAgICAgIC5lbnRlcigpXHJcbiAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgLm9uKCdjbGljaycsIChkOiBhbnkpID0+IHRoaXMuaGFuZGxlQ2xpY2soZCkpO1xyXG5cclxuICAgICAgZG90XHJcbiAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcclxuICAgICAgICAuYXR0cignZmlsbCcsIChkOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICgnY2F0ZWdvcnknIGluIGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yc1tkLmNhdGVnb3J5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcjtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAnbm9uZScpXHJcbiAgICAgICAgLmF0dHIoJ2N4JywgKGQ6IGFueSkgPT4geFNjYWxlKGQubmFtZSkgKyB4U2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgICAgIC5hdHRyKCdjeScsIChkOiBhbnkpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAgICAgLmF0dHIoJ3InLCAzKVxyXG4gICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKTtcclxuXHJcbiAgICAgIC8vIEFkZCBsYWJlbHMgaWYgY29uZmlndXJlZFxyXG4gICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpIHtcclxuICAgICAgICBkb3RcclxuICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RvdHMnKVxyXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuICAgICAgICAgIC5hdHRyKCdzdHlsZScsICdmb250LXNpemU6IDAuODVlbTsgZm9udC13ZWlnaHQ6IGJvbGQnKVxyXG4gICAgICAgICAgLmF0dHIoJ3gnLCAoZDogYW55KSA9PiB4U2NhbGUoZC5uYW1lKSArIHhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgICAgICAuYXR0cigneScsIChkOiBhbnkpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAgICAgICAuYXR0cignZHknLCAnLTFlbScpXHJcbiAgICAgICAgICAudGV4dCgoZDogYW55KSA9PiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sYWJlbEZvcm1hdHRlcihkLnZhbHVlKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGE/Lm1ldGFEYXRhPy5oYXNEcmlsbERvd24gfHwgZGF0YT8udG9nZ2xlRnJvbSkge1xyXG4gICAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVpvb21pblpvb21vdXRDbGljayh7IGlzWm9vbU91dCwgZXZlbnQgfTogeyBpc1pvb21PdXQ6IGJvb2xlYW47IGV2ZW50OiBhbnkgfSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQpO1xyXG4gIH1cclxufSIsIjxtZXRhIGh0dHAtZXF1aXY9XCJDQUNIRS1DT05UUk9MXCIgY29udGVudD1cIk5PLUNBQ0hFXCIgLz5cclxuPG1ldGEgaHR0cC1lcXVpdj1cIkVYUElSRVNcIiBjb250ZW50PVwiU2F0LCAwMSBKdW4gMjAwNCAxMToxMjowMSBHTVRcIiAvPlxyXG48ZGl2XHJcbiAgI3ZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lclxyXG4gIGNsYXNzPVwibGliLWNoYXJ0LXdyYXBwZXJcIlxyXG4gIFtuZ0NsYXNzXT1cInsgJ2xpYi1uby1iYWNrZ3JvdW5kJzogaXNUcmFuc3BhcmVudEJhY2tncm91bmQgfVwiXHJcbiAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHZhcigtLWNhcmQtYmcpO1wiXHJcblxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCJcclxuPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXItYWx0XCIgKm5nSWY9XCIhaXNIZWFkZXJWaXNpYmxlXCI+XHJcbiAgICA8bGliLWNoYXJ0LWhlYWRlci12MlxyXG4gICAgICBbY2hhcnREYXRhXT1cImNoYXJ0RGF0YVwiXHJcbiAgICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICA+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYzXHJcbiAgICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgICAgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKT1cImhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbigkZXZlbnQpXCJcclxuICAgICAgKHpvb21Jblpvb21PdXRDbGljayk9XCJoYW5kbGVab29taW5ab29tb3V0Q2xpY2soJGV2ZW50KVwiXHJcbiAgICA+PC9saWItY2hhcnQtaGVhZGVyLXYzPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXZcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFwiXHJcbiAgICBpZD1cInZlcnRpY2Fsc3RhY2tlZGNoYXJ0Y29udGFpbmVyXCJcclxuICAgICN2ZXJ0aWNhbHN0YWNrZWRjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnXCJcclxuICA+PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
1290
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2hvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tL2hvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVdsRCxNQUFNLE9BQU8scUNBQ1gsU0FBUSxpQkFBaUI7SUE4RHpCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFyREEsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN6RCx1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDN0Isb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFDaEMsd0JBQW1CLEdBQVksSUFBSSxDQUFDO1FBQ3BDLGFBQVEsR0FBUSxJQUFJLENBQUMsV0FBVyxFQUFFLENB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QUNELHFCQUFxQixDQUFDLEVBQUU7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsOEJBQThCLENBQUMsS0FBSztRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0Qsd0JBQXdCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQzNDLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsQ0FBQzsrR0FoMkNVLHFDQUFxQzttR0FBckMscUNBQXFDLDRqQkN6QmxELHl2Q0FrQ0E7OzRGRFRhLHFDQUFxQztrQkFUakQsU0FBUzsrQkFDRSxzQ0FBc0MsaUJBTWpDLGlCQUFpQixDQUFDLElBQUk7d0RBTXJDLFlBQVk7c0JBRFgsU0FBUzt1QkFBQywrQkFBK0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTVELDJCQUEyQjtzQkFEMUIsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRzlDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFVuaXF1ZUlkIH0gZnJvbSAnLi4vdW5pcXVlLWlkJztcclxuaW1wb3J0IENoYXJ0SGVscGVyIGZyb20gJy4uL2NoYXJ0LWhlbHBlcic7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbXHJcbiAgICAnLi9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQubGVzcycsXHJcbiAgICAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJyxcclxuICBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIb3Jpem9udGFsQmFyc1dpdGhTY3JvbGxab29tQ29tcG9uZW50XHJcbiAgZXh0ZW5kcyBDb21wb25lbnRVbmlxdWVJZFxyXG4gIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKCd2ZXJ0aWNhbHN0YWNrZWRjaGFydGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgY29udGFpbmVyRWx0ITogRWxlbWVudFJlZjtcclxuXHJcbiAgQFZpZXdDaGlsZCgndmVydGljYWxzdGFja2VkY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBjaGFydERhdGE6IGFueTtcclxuICBASW5wdXQoKSBjdXN0b21DaGFydENvbmZpZ3VyYXRpb246IGFueTtcclxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBoZWFkZXJNZW51Y2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgaXNIZWFkZXJWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc1RvcENhcHRpb25WaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICB1bmlxdWVJZDogYW55ID0gdGhpcy5nZXRVbmlxdWVJZCgpO1xyXG4gIGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGVmYXVsdENvbmZpZ3VyYXRpb246IGFueSA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDQwIH0sXHJcbiAgICBzdmdIZWlnaHQ6IDcwLFxyXG4gICAgbGVnZW5kSGVpZ2h0OiAnMTAlJyxcclxuICAgIG51bWJlck9mWVRpY2tzOiA1LFxyXG4gICAgbGFiZWxGb3JtYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB4QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB5QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB5TGluZUF4aXNMYWJlbEZvbWF0dGVyOiBDaGFydEhlbHBlci5kZWZhdWx0Rm9ybWF0dGVyLFxyXG4gICAgbGluZUdyYXBoQ29sb3I6ICcjRjZEMjgzJyxcclxuICAgIHNob3dMaW5lQ2hhcnRBeGlzOiB0cnVlLFxyXG4gICAgc2hvd0xlZ2VuZDogZmFsc2UsXHJcbiAgICBmb3JDb21wYXJpc29uOiB0cnVlLFxyXG4gICAgaGVhZGVyTWVudU9wdGlvbnM6IEhlYWRlckNvbmZpZ0hlbHBlci5oZWFkZXJDb25maWcuaGVhZGVyTWVudU9wdGlvbnMsXHJcbiAgICB5QXhpc0dyaWQ6IGZhbHNlLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZDogdW5kZWZpbmVkLFxyXG4gICAgaXNUb3BDYXB0aW9uVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgaXNNdWx0aUNoYXJ0R3JpZExpbmU6IHVuZGVmaW5lZCxcclxuICAgIGlzRnVsbFNjcmVlbjogdW5kZWZpbmVkLFxyXG4gICAgY3VzdG9tWXNjYWxlOiB1bmRlZmluZWQsXHJcbiAgICBpc1hheGlzTGFiZWxIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGlzWWF4aXNMYWJlbEhpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNZYXhpc0hpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNZYXhpc0Rhc2hlZDogdW5kZWZpbmVkLFxyXG4gICAgaXNYYXhpc0NvbG9yOiB1bmRlZmluZWQsXHJcbiAgICB0ZXh0Rm9ybWF0dGVyOiB1bmRlZmluZWQsXHJcbiAgICBzaG93VG90YWxPblRvcDogdW5kZWZpbmVkLFxyXG4gICAgYmFja2VuZEZvcm1hdHRlckhhc1ByaW9yaXR5OiB1bmRlZmluZWQsXHJcbiAgICBzaG93QW5nbGVkTGFiZWxzOiB1bmRlZmluZWQsXHJcbiAgICBpc05vQWx0ZXJuYXRlWGF4aXNUZXh0OiB1bmRlZmluZWQsXHJcbiAgICBpc1hncmlkQmV0d2VlbkxhYmVsczogdW5kZWZpbmVkLFxyXG4gICAgc2hvd1hheGlzVG9wOiB1bmRlZmluZWQsXHJcbiAgICB4QXhpc0dyaWQ6IHVuZGVmaW5lZCxcclxuICAgIHhMYWJlbHNPblNhbWVMaW5lOiB1bmRlZmluZWQsXHJcbiAgICBoaWRlWGF4aXNUaWNrOiB1bmRlZmluZWQsXHJcbiAgICBpc0RyaWxsZG93bkNoYXJ0OiB1bmRlZmluZWQsXHJcbiAgICBpc1RhcmdldExpbmU6IHVuZGVmaW5lZCxcclxuICAgIGRpc3BsYXlUaXRsZU9uVG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1RvZ2dsZVZpc2libGU6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICB9O1xyXG4gIGlzQ0M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1pvb21lZE91dDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcbiAgaXNab29tT3V0U2VsZWN0ZWQoaXNab29tT3V0KSB7XHJcbiAgICB0aGlzLmlzWm9vbWVkT3V0ID0gaXNab29tT3V0O1xyXG4gICAgdGhpcy5uZ09uQ2hhbmdlcygpO1xyXG4gIH1cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgIGQzLnNlbGVjdCgnIycgKyBzZWxmLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZVN0YWNrZWRDaGFydCgpO1xyXG4gIH1cclxuICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgc2V0VGltZW91dChcclxuICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGQzLnNlbGVjdCgnIycgKyBzZWxmLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICAgICAgICBzZWxmLmluaXRpYWxpemVTdGFja2VkQ2hhcnQoKTtcclxuICAgICAgfS5iaW5kKHNlbGYpLFxyXG4gICAgICAxMFxyXG4gICAgKTtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7IH1cclxuXHJcbiAgaW5pdGlhbGl6ZVN0YWNrZWRDaGFydCgpIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgIGxldCBkYXRhOiBhbnkgPSBbXTtcclxuICAgIGxldCBtZXRhRGF0YTogYW55ID0gbnVsbDtcclxuICAgIGxldCBrZXlMaXN0ID0gbnVsbDtcclxuICAgIGxldCBsaW5lRGF0YSA9IG51bGw7XHJcbiAgICBsZXQgY29sb3JzOiBhbnkgPSBudWxsO1xyXG4gICAgdmFyIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICB2YXIgYWx0ZXJuYXRlX2xhYmVsID0gZmFsc2U7XHJcbiAgICB2YXIgc2hvcnRfdGlja19sZW5ndGggPSA0O1xyXG4gICAgdmFyIGxvbmdfdGlja19sZW5ndGggPSAxNjtcclxuICAgIHZhciBzaG9ydF90aWNrX2xlbmd0aF9iZyA9IDU7XHJcbiAgICB2YXIgbG9uZ190aWNrX2xlbmd0aF9iZyA9IDMwO1xyXG4gICAgdmFyIGZvcm1hdEZyb21CYWNrZW5kO1xyXG4gICAgdmFyIGZvcm1hdEZvckh1Z2VOdW1iZXJzO1xyXG4gICAgdmFyIHRlbXBPYmplY3RIb2xkZXIgPSB7fTtcclxuICAgIHZhciByaWdodFN2Z1dpZHRoID0gNjA7XHJcbiAgICB2YXIgbGVmdEFuZFJpZ2h0U3BhY2VzID0gNTA7XHJcblxyXG4gICAgICAgbGV0IGlzcmlhID0gdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWFcclxuXHJcbiAgICAvLyBSZXNwb25zaXZlIGJyZWFrcG9pbnRzXHJcbiAgICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNTc2O1xyXG4gICAgY29uc3QgaXNUYWJsZXQgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA1NzYgJiYgd2luZG93LmlubmVyV2lkdGggPCA5OTI7XHJcbiAgICBjb25zdCBpc0Rlc2t0b3AgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA5OTI7XHJcblxyXG4gICAgLy8gQWRqdXN0IG1hcmdpbnMgYW5kIGZvbnQgc2l6ZXMgYmFzZWQgb24gZGV2aWNlXHJcbiAgICBpZiAoaXNNb2JpbGUpIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luID0geyB0b3A6IDIwLCByaWdodDogMTAsIGJvdHRvbTogNDAsIGxlZnQ6IDMwIH07XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzID0gNDtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ID0gNjA7XHJcbiAgICB9IGVsc2UgaWYgKGlzVGFibGV0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbiA9IHsgdG9wOiAyNSwgcmlnaHQ6IDIwLCBib3R0b206IDQ1LCBsZWZ0OiA0MCB9O1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcyA9IDY7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCA9IDcwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luID0geyB0b3A6IDMwLCByaWdodDogMzAsIGJvdHRvbTogNTAsIGxlZnQ6IDYwIH07XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzID0gNztcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ID0gODA7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2ldID0gQ2hhcnRIZWxwZXIuZ2V0VmFsdWVCeUNvbmZpZ3VyYXRpb25UeXBlKFxyXG4gICAgICAgIGksXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbixcclxuICAgICAgICB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvblxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgZGF0YSA9IHRoaXMuY2hhcnREYXRhLmRhdGE7XHJcbiAgICBtZXRhRGF0YSA9IHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhO1xyXG4gICAgaWYgKG1ldGFEYXRhLnVuaXQgPT0gdW5kZWZpbmVkKSBtZXRhRGF0YS51bml0ID0gJyc7XHJcbiAgICBpZiAobWV0YURhdGEuaXNDQykge1xyXG4gICAgICB0aGlzLmlzQ0MgPSBtZXRhRGF0YS5pc0NDO1xyXG4gICAgfVxyXG4gICAgaWYgKG1ldGFEYXRhLmJhcldpdGhvdXRDbGljayAmJiBtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoKSB7XHJcbiAgICAgIG1ldGFEYXRhLmJhcldpdGhvdXRDbGljayA9IG1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5tYXAoKGVsZSkgPT5cclxuICAgICAgICBlbGUudG9Mb3dlckNhc2UoKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWV0YURhdGEuYmFyV2l0aG91dENsaWNrID0gW107XHJcbiAgICB9XHJcbiAgICBsaW5lRGF0YSA9IHRoaXMuY2hhcnREYXRhLmxpbmVEYXRhO1xyXG4gICAgY29sb3JzID0gbWV0YURhdGEuY29sb3JzO1xyXG4gICAga2V5TGlzdCA9IG1ldGFEYXRhLmtleUxpc3Q7XHJcblxyXG4gICAgdmFyIGNoYXJ0Q29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdmFyIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lciA9IGQzLnNlbGVjdChcclxuICAgICAgdGhpcy52ZXJ0aWNhbHN0YWNrZWRjb250YWluZXJFbHQubmF0aXZlRWxlbWVudFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgcGFyc2VkTnVtID0gcGFyc2VGbG9hdCh0aGlzLmNoYXJ0RGF0YT8udGFyZ2V0TGluZURhdGE/LnRhcmdldCk7XHJcbiAgICBpZiAoIWlzTmFOKHBhcnNlZE51bSkpIHtcclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIocGFyc2VkTnVtKSkge1xyXG4gICAgICAgIHBhcnNlZE51bSA9IHBhcnNlSW50KHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGFyc2VkTnVtID0gcGFyc2VGbG9hdCh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG5cclxuICAgIC8vIFJlc3BvbnNpdmUgd2lkdGggYW5kIGhlaWdodFxyXG4gICAgdmFyIGNvbnRhaW5lcldpZHRoID0gY2hhcnRDb250YWluZXIubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xyXG4gICAgdmFyIGNvbnRhaW5lckhlaWdodCA9IHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xyXG4gICAgdmFyIHdpZHRoID0gY29udGFpbmVyV2lkdGggLSBtYXJnaW4ubGVmdCAtIG1hcmdpbi5yaWdodDtcclxuICAgIHZhciBoZWlnaHQgPSBjb250YWluZXJIZWlnaHQgKiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0IC8gMTAwKSAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tO1xyXG5cclxuICAgIC8vIEFkanVzdCB3aWR0aCBmb3IgbGFyZ2UgZGF0YXNldHMgYW5kIHpvb21cclxuICAgIGlmICh0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDMwICYmIHRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgICAgd2lkdGggPSB3aWR0aCA+IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoICogKGlzTW9iaWxlID8gMTUgOiAyNSlcclxuICAgICAgICA/IHdpZHRoXHJcbiAgICAgICAgOiB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCAqIChpc01vYmlsZSA/IDE1IDogMjUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgICB3aWR0aCA9IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoICogKGlzTW9iaWxlID8gNjAgOiAxMzApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZ1bGxzY3JlZW4gYW5kIGRyaWxsZG93biBhZGp1c3RtZW50c1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbiAhPSB1bmRlZmluZWQgJiYgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgIGhlaWdodCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCAhPSA4MFxyXG4gICAgICAgID8gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0XHJcbiAgICAgICAgOiBjb250YWluZXJIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICBoZWlnaHQgPSBjb250YWluZXJIZWlnaHQgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbSAtIChpc01vYmlsZSA/IDYwIDogMTMwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAuLi5leGlzdGluZyBjb2RlLi4uXHJcbiAgICAvKipcclxuICAgICAqIGZvciBoaWRpbmcgaGVhZGVyXHJcbiAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuICAgICAqL1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGZvciBoaWRpbmcgbGVnZW5kc1xyXG4gICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbiAgICAgKi9cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RvcENhcHRpb25WaXNpYmxlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAvL1VQREFURU5BTUVcclxuICAgICAgdGhpcy5pc1RvcENhcHRpb25WaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUb3BDYXB0aW9uVmlzaWJsZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZm9yIHJlbW92aW5nIGJhY2tncm91bmQgY29sb3Igc28gdGhhdCBpdCBjYW4gdGFrZSBwYXJlbnRzIGNvbG9yXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaXNUcmFuc3BhcmVudEJhY2tncm91bmQgPVxyXG4gICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBmb3JtYXQgZGF0YSB2YWx1ZXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiByZWNlaXZlZFxyXG4gICAgICovXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlciAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9ybWF0RnJvbUJhY2tlbmQgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoXHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlclxyXG4gICAgICApO1xyXG4gICAgICBmb3JtYXRGb3JIdWdlTnVtYmVycyA9IENoYXJ0SGVscGVyLmRhdGFWYWx1ZUZvcm1hdHRlcignLjJzJyk7XHJcbiAgICB9XHJcbiAgICB2YXIgb3V0ZXJDb250YWluZXIgPSBjaGFydENvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAuYXR0cignaWQnLCBzZWxmLnVuaXF1ZUlkKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnb3V0ZXItY29udGFpbmVyJylcclxuICAgICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgICAgLnN0eWxlKCdoZWlnaHQnLCBoZWlnaHQpXHJcblxyXG4gICAgICAuc3R5bGUoJ292ZXJmbG93LXgnLCAnaGlkZGVuJylcclxuICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCBgJHttYXJnaW4ubGVmdH1weGApXHJcbiAgICAgIC5zdHlsZSgnbWFyZ2luLWxlZnQnLCAnMTBweCcpXHJcbiAgICAgIC5zdHlsZSgncGFkZGluZy1yaWdodCcsIGAke3JpZ2h0U3ZnV2lkdGh9cHhgKTtcclxuXHJcbiAgICB2YXIgc3ZnWUF4aXNMZWZ0ID0gb3V0ZXJDb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzgwJylcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKVxyXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgICAgLnN0eWxlKCdsZWZ0JywgJzAnKVxyXG4gICAgICAuc3R5bGUoJ3otaW5kZXgnLCAxKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIChtYXJnaW4ubGVmdCArIDEwKSArICcsJyArIG1hcmdpbi50b3AgKyAnKScpO1xyXG5cclxuICAgIHZhciBzdmdZQXhpc1JpZ2h0ID0gb3V0ZXJDb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgcmlnaHRTdmdXaWR0aClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKVxyXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgICAgLnN0eWxlKCdyaWdodCcsICcycHgnKVxyXG4gICAgICAuc3R5bGUoJ3otaW5kZXgnLCAxKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIDAgKyAnLCcgKyBtYXJnaW4udG9wICsgJyknKTtcclxuXHJcbiAgICB2YXIgaW5uZXJDb250YWluZXIgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnaW5uZXItY29udGFpbmVyJylcclxuICAgICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgICAgLnN0eWxlKCdvdmVyZmxvdy14JywgJ2F1dG8nKTtcclxuXHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIGJhciB3aWR0aCBhbmQgcGFkZGluZyBmb3IgbW9iaWxlIHRvIGF2b2lkIG92ZXJsYXAgYW5kIGFkZCBzcGFjZSBiZXR3ZWVuIGJhcnNcclxuICAgIGxldCBiYXJXaWR0aDtcclxuICAgIGxldCBiYXJQYWRkaW5nID0gMTI7IC8vIHB4LCBzcGFjZSBiZXR3ZWVuIGJhcnMgb24gbW9iaWxlXHJcbiAgICBsZXQgcmVxdWlyZWRTdmdXaWR0aDtcclxuICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICAvLyBVc2UgYSBtaW5pbXVtIHdpZHRoIHBlciBiYXIgYW5kIGFkZCBwYWRkaW5nIGJldHdlZW4gYmFyc1xyXG4gICAgICBjb25zdCBtaW5CYXJXaWR0aCA9IDMyOyAvLyBweCwgY2FuIGFkanVzdCBhcyBuZWVkZWRcclxuICAgICAgYmFyV2lkdGggPSBtaW5CYXJXaWR0aDtcclxuICAgICAgcmVxdWlyZWRTdmdXaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgIHdpZHRoIC0gcmlnaHRTdmdXaWR0aCxcclxuICAgICAgICAoYmFyV2lkdGggKyBiYXJQYWRkaW5nKSAqIGRhdGEubGVuZ3RoICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiArIHJpZ2h0U3ZnV2lkdGggLSBiYXJQYWRkaW5nIC8vIG5vIHBhZGRpbmcgYWZ0ZXIgbGFzdCBiYXJcclxuICAgICAgKTtcclxuICAgICAgaW5uZXJDb250YWluZXIuc3R5bGUoJ292ZXJmbG93LXgnLCAnYXV0bycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYmFyV2lkdGggPSBNYXRoLm1heCg0MCwgKHdpZHRoIC0gcmlnaHRTdmdXaWR0aCAtIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIpIC8gZGF0YS5sZW5ndGgpO1xyXG4gICAgICBiYXJQYWRkaW5nID0gMDtcclxuICAgICAgcmVxdWlyZWRTdmdXaWR0aCA9IHdpZHRoIC0gcmlnaHRTdmdXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgc3ZnID0gaW5uZXJDb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgcmVxdWlyZWRTdmdXaWR0aClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgMzApXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgMCArICcsJyArIG1hcmdpbi50b3AgKyAnKScpO1xyXG5cclxuICAgIGxldCBzdGFja0tleSA9IGtleUxpc3Q7XHJcbiAgICB2YXIgc3RhY2s6IGFueSA9IGQzXHJcbiAgICAgIC5zdGFjaygpXHJcbiAgICAgIC5rZXlzKHN0YWNrS2V5KVxyXG4gICAgICAvKi5vcmRlcihkMy5zdGFja09yZGVyKSovXHJcbiAgICAgIC5vZmZzZXQoZDMuc3RhY2tPZmZzZXROb25lKTtcclxuICAgIHZhciBsYXllcnM6IGFueSA9IHN0YWNrKGRhdGEpO1xyXG4gICAgZGF0YS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgIHJldHVybiBiLnRvdGFsIC0gYS50b3RhbDtcclxuICAgIH0pO1xyXG4gICAgbGV0IGxpbmVZc2NhbGU7XHJcbiAgICBpZiAobGluZURhdGEgIT0gbnVsbCkge1xyXG4gICAgICBsaW5lWXNjYWxlID0gZDNcclxuICAgICAgICAuc2NhbGVMaW5lYXIoKVxyXG4gICAgICAgIC5kb21haW4oW1xyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIGQzLm1heChsaW5lRGF0YSwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICtkLnZhbHVlO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgXSlcclxuICAgICAgICAucmFuZ2UoW2hlaWdodCwgMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbGN1bGF0ZSBiYXIgd2lkdGggZm9yIG1vYmlsZSB0byBhdm9pZCBvdmVybGFwXHJcbiAgICAvLyAuLi5iYXJXaWR0aCBpcyBub3cgY2FsY3VsYXRlZCBhYm92ZSwgcmVtb3ZlIGR1cGxpY2F0ZS4uLlxyXG5cclxuICAgIHZhciB4U2NhbGUgPSBkM1xyXG4gICAgICAuc2NhbGVCYW5kKClcclxuICAgICAgLnJhbmdlUm91bmQoW1xyXG4gICAgICAgIGxlZnRBbmRSaWdodFNwYWNlcyxcclxuICAgICAgICB3aWR0aCAtIHJpZ2h0U3ZnV2lkdGggLSBsZWZ0QW5kUmlnaHRTcGFjZXNcclxuICAgICAgXSlcclxuICAgICAgLmRvbWFpbihcclxuICAgICAgICBkYXRhLm1hcChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGQubmFtZTtcclxuICAgICAgICB9KS5yZXZlcnNlKClcclxuICAgICAgKVxyXG4gICAgICAucGFkZGluZyhpc01vYmlsZSA/IDAuMiA6IDAuNSk7XHJcblxyXG4gICAgdmFyIHhTY2FsZUZyb21PcmlnaW4gPSBkM1xyXG4gICAgICAuc2NhbGVCYW5kKClcclxuICAgICAgLnJhbmdlUm91bmQoW3dpZHRoIC0gcmlnaHRTdmdXaWR0aCwgMF0pXHJcbiAgICAgIC5kb21haW4oXHJcbiAgICAgICAgZGF0YS5tYXAoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgIHJldHVybiBkLm5hbWU7XHJcbiAgICAgICAgfSkucmV2ZXJzZSgpXHJcbiAgICAgICk7XHJcbiAgICAvLyAuLi5leGlzdGluZyBjb2RlLi4uXHJcbiAgICAvKipcclxuICAgICAqIGRyYXcgc2Vjb25kIHggYXhpcyBvbiB0b3BcclxuICAgICAqL1xyXG4gICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnNob3dYYXhpc1RvcCkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWxpbmUtYXhpcy10ZXh0IGxpYi1saW5lLXgtYXhpcy10ZXh0IHgtYXhpcycpXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeFNjYWxlKS50aWNrU2l6ZSgwKSk7XHJcbiAgICAgIHN2Zy5zZWxlY3RBbGwoJy54LWF4aXMgPiBnID4gdGV4dCcpLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBkcmF3IHNlY29uZCB4IGF4aXMgb24gdG9wXHJcbiAgICAgKi9cclxuICAgIC8vIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5zaG93WGF4aXNBdFRhcmdldCkge1xyXG4gICAgLy8gICBzdmdcclxuICAgIC8vICAgICAuYXBwZW5kKCdnJylcclxuICAgIC8vICAgICAuYXR0cignY2xhc3MnLCAnbGliLWxpbmUtYXhpcy10ZXh0IGxpYi1saW5lLXgtYXhpcy10ZXh0IHgtYXhpcycpXHJcbiAgICAvLyAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgLy8gICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeFNjYWxlKS50aWNrU2l6ZSgwKSk7XHJcbiAgICAvLyAgIHN2Zy5zZWxlY3RBbGwoJy54LWF4aXMgPiBnID4gdGV4dCcpLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4gICAgLy8gfVxyXG5pZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNHcmlkKSB7XHJcbiAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0dyaWQubGVuZ3RoOyBqKyspIHtcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgYHgke2ogKyAyfSBheGlzJHtqICsgMn1gKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWdyaWQtY29sb3IpJykgLy8gVXNlIENTUyB2YXJpYWJsZSBpbnN0ZWFkIG9mIGhhcmRjb2RlZFxyXG4gICAgICAuYXR0cihcclxuICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICAndHJhbnNsYXRlKDAsJyArIGhlaWdodCAqIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnhBeGlzR3JpZFtqXSArICcpJ1xyXG4gICAgICApXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeFNjYWxlKS50aWNrU2l6ZSgwKS50aWNrcyg1KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcbiAgfVxyXG59XHJcblxyXG4gICAgbGV0IHlTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCkucmFuZ2VSb3VuZChbaGVpZ2h0LCAwXSk7XHJcbiAgICAvKipcclxuICAgICAqIHVwZGF0ZSBtYXggdmFrdWVzIHNvIHRoYXQgdGhlIHZha3VlIHdvbnQgZXhjZWVkIHRoZSBtYXggbGltaXRcclxuICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4gICAgICovXHJcbiAgICB2YXIgbWF4VmFsdWUgPSBkMy5tYXgobGF5ZXJzLCAoZCkgPT4gZDMubWF4KGQsIChkKSA9PiBkWzFdKSk7XHJcbiAgICBpZiAobWF4VmFsdWUgPT0gMCkge1xyXG4gICAgICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHtcclxuICAgICAgICBtYXhWYWx1ZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1heFZhbHVlID0gMTAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VzdG9tWXNjYWxlKSB7XHJcbiAgICAgIG1heFZhbHVlID0gbWF4VmFsdWUgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbiAgICAgIG1heFZhbHVlIDwgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0XHJcbiAgICApIHtcclxuICAgICAgbWF4VmFsdWUgPVxyXG4gICAgICAgIG1heFZhbHVlIDwgMTAgJiYgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0IDwgMTBcclxuICAgICAgICAgID8gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICsgM1xyXG4gICAgICAgICAgOiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAyMDtcclxuICAgIH1cclxuICAgIHlTY2FsZS5kb21haW4oWzAsIG1heFZhbHVlXSkubmljZSgpO1xyXG5cclxuICAgIGxldCB4QXhpcyA9IGQzXHJcbiAgICAgIC5heGlzQm90dG9tKHhTY2FsZSlcclxuICAgICAgLnRpY2tTaXplKDApXHJcbiAgICAgIC50aWNrRm9ybWF0KHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnhBeGlzTGFiZWxGb21hdHRlcik7XHJcblxyXG4gICAgbGV0IHlBeGlzID0gZDNcclxuICAgICAgLmF4aXNMZWZ0KHlTY2FsZSlcclxuICAgICAgLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4gICAgICAudGlja1NpemUoMClcclxuICAgICAgLnRpY2tGb3JtYXQoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuXHJcbiAgICBsZXQgeUxpbmVBeGlzO1xyXG4gICAgaWYgKGxpbmVZc2NhbGUgIT0gbnVsbCkge1xyXG4gICAgICB5TGluZUF4aXMgPSBkM1xyXG4gICAgICAgIC5heGlzUmlnaHQobGluZVlzY2FsZSlcclxuICAgICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgICAgLnRpY2tTaXplKDApXHJcbiAgICAgICAgLnRpY2tGb3JtYXQoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUxpbmVBeGlzTGFiZWxGb21hdHRlcik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGJldHdlZW4geC1heGlzIGxhYmVsIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4gICAgICogaXNYZ3JpZEJldHdlZW5MYWJlbHMgd2lsbCBiZSB1bmRlZmluZWQgZm9yIGRhc2hib2FyZCBjaGFydHNcclxuICAgICAqL1xyXG4gICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWGdyaWRCZXR3ZWVuTGFiZWxzKSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkJylcclxuICAgICAgICAuYXR0cihcclxuICAgICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgICAgJ3RyYW5zbGF0ZSgnICsgeFNjYWxlLmJhbmR3aWR0aCgpIC8gMiArICcsJyArIGhlaWdodCArICcpJ1xyXG4gICAgICAgIClcclxuICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHhTY2FsZSkudGlja1NpemUoLWhlaWdodCkudGlja0Zvcm1hdCgnJykpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgICAgLnN0eWxlKCdjb2xvcicsICcjOTk5OTk5JylcclxuICAgICAgICAvLyAuc3R5bGUoXCJvcGFjaXR5XCIsIFwiMC41XCIpXHJcbiAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiB1c2VkIHRvIGRyYXcgeS1heGlzIGdyaWRcclxuICAgICAqL1xyXG5pZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNHcmlkKSB7XHJcbiAgc3ZnXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCdjbGFzcycsICdncmlkJylcclxuICAgIC5jYWxsKFxyXG4gICAgICBkM1xyXG4gICAgICAgIC5heGlzTGVmdCh5U2NhbGUpXHJcbiAgICAgICAgLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4gICAgICAgIC50aWNrU2l6ZSgtd2lkdGgpXHJcbiAgICAgICAgLnRpY2tGb3JtYXQoJycpXHJcbiAgICApXHJcbiAgICAvLyBSZW1vdmUgaGFyZGNvZGVkIGNvbG9ycyBhbmQgdXNlIENTUyB2YXJpYWJsZXNcclxuICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciknKVxyXG4gICAgLnN0eWxlKCdvcGFjaXR5JywgJzEnKVxyXG4gICAgLy8gLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG59XHJcblxyXG5cclxuICAgIHZhciBsYXllciA9IHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCcubGF5ZXInKVxyXG4gICAgICAuZGF0YShsYXllcnMpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGF5ZXInKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCBmdW5jdGlvbiAoZCwgaSkge1xyXG4gICAgICAgIHJldHVybiBtZXRhRGF0YS5jb2xvcnNbZC5rZXldO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB2YXIgcmVjdCA9IGxheWVyXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgICAuZGF0YShmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgICB9KVxyXG4gICAgICAuZW50ZXIoKTtcclxuXHJcbiAgICByZWN0XHJcbiAgICAgIC5hcHBlbmQoJ3JlY3QnKVxyXG4gICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICBpZiAoIWxpbmVEYXRhIHx8IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmZvckNvbXBhcmlzb24pIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljayB8fFxyXG4gICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmxlbmd0aCB8fFxyXG4gICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAgIHNlbGYuaGFuZGxlQ2xpY2soZC5kYXRhLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgIGlmICghaXNOYU4oZFswXSkgJiYgIWlzTmFOKGRbMV0pKSB7XHJcbiAgICAgICAgICBjb25zdCBhY3R1YWxIZWlnaHQgPSB5U2NhbGUoZFswXSkgLSB5U2NhbGUoZFsxXSk7XHJcbiAgICAgICAgICByZXR1cm4gYWN0dWFsSGVpZ2h0IDwgMyA/IHlTY2FsZShkWzBdKSAtIDMgOiB5U2NhbGUoZFsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICAgICAgICAvLyBPbiBtb2JpbGUsIHBvc2l0aW9uIGJhcnMgd2l0aCBwYWRkaW5nXHJcbiAgICAgICAgICByZXR1cm4gbGVmdEFuZFJpZ2h0U3BhY2VzICsgaSAqIChiYXJXaWR0aCArIGJhclBhZGRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICByZXR1cm4geFNjYWxlKGQuZGF0YS5uYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0ICYmXHJcbiAgICAgICAgICAgIHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoIDw9IDNcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4geFNjYWxlKGQuZGF0YS5uYW1lKSArIHhTY2FsZS5iYW5kd2lkdGgoKSAvIDIgLSAzNTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB4U2NhbGUoZC5kYXRhLm5hbWUpICsgeFNjYWxlLmJhbmR3aWR0aCgpICogMC4xO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgaWYgKCFpc05hTihkWzBdKSAmJiAhaXNOYU4oZFsxXSkpIHtcclxuICAgICAgICAgIGNvbnN0IGFjdHVhbEhlaWdodCA9IHlTY2FsZShkWzBdKSAtIHlTY2FsZShkWzFdKTtcclxuICAgICAgICAgIHJldHVybiBhY3R1YWxIZWlnaHQgPCAzID8gMyA6IGFjdHVhbEhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgLy8gVXNlIGNhbGN1bGF0ZWQgYmFyV2lkdGggZm9yIG1vYmlsZSwgb3RoZXJ3aXNlIHNjYWxlXHJcbiAgICAgICAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICAgICAgICByZXR1cm4gYmFyV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PSB1bmRlZmluZWRcclxuICAgICAgICAgID8geFNjYWxlLmJhbmR3aWR0aCgpXHJcbiAgICAgICAgICA6IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiZcclxuICAgICAgICAgICAgc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPD0gM1xyXG4gICAgICAgICAgICA/IDcwXHJcbiAgICAgICAgICAgIDogeFNjYWxlLmJhbmR3aWR0aCgpICogMC44O1xyXG4gICAgICB9KVxyXG4gICAgICAvLyAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XHJcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgIG1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnZGVmYXVsdCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gJ3BvaW50ZXInO1xyXG4gICAgICAgIH0gZWxzZSByZXR1cm4gJ2RlZmF1bHQnO1xyXG4gICAgICB9KVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICFpc05hTihkWzBdKSAmJlxyXG4gICAgICAgICAgIWlzTmFOKGRbMV0pICYmXHJcbiAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4gICAgICAgICAgcGFyc2VGbG9hdChkWzFdKSAtIHBhcnNlRmxvYXQoZFswXSkgPj1cclxuICAgICAgICAgIHBhcnNlRmxvYXQoc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KVxyXG4gICAgICAgIClcclxuICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJ0RGF0YT8udGFyZ2V0TGluZURhdGE/LmJhckFib3ZlVGFyZ2V0Q29sb3I7XHJcblxyXG4gICAgICAgIHJldHVybiBtZXRhRGF0YS5jb2xvcnNbZC5rZXldO1xyXG4gICAgICB9KTtcclxuICAgIC8qKlxyXG4gICAgICogZG8gbm90IHNob3cgdmFsdXMgb24gaG92ZXIgYXMgaXRzIGFscmVheSBkaXNsYXllZFxyXG4gICAgICovXHJcbiAgICBpZiAoIXRoaXMuaXNDQyAmJiAhc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUpIHtcclxuICAgICAgcmVjdFxyXG4gICAgICAgIC5hcHBlbmQoJ3N2Zzp0aXRsZScpIC8vIFRJVExFIEFQUEVOREVEIEhFUkVcclxuICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGRbMV0gLSBkWzBdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNDQykge1xyXG4gICAgICByZWN0XHJcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHhTY2FsZShkLmRhdGEubmFtZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgaWYgKCFkWzBdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnZW5kJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnc3RhcnQnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3ZlcnRpY2FsYmFyX190ZXh0JylcclxuICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICBpZiAoIWRbMF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHlTY2FsZShkWzFdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB5U2NhbGUoZFsxXSkgLSA3O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gLmF0dHIoXCJ5XCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiB5U2NhbGUoZFswXSkgLSB5U2NhbGUoZFsxXSk7IH0pXHJcbiAgICAgICAgLmF0dHIoJ2R5JywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgIHJldHVybiBkLmNsYXNzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgIGlmICghZFswXSkge1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKGRbMV0gLSBkWzBdKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKChkWzFdIC0gZFswXSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICB9IGVsc2UgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFpc05hTihkWzFdKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGRbMV0gKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICB9IGVsc2UgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIDAgKyAnLCcgKyAoeVplcm8gLSAyNSkgKyAnKScpXHJcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDMwKVxyXG4gICAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RhcmdldC1kaXNwbGF5JylcclxuICAgICAgICAuc3R5bGUoJ2NvbG9yJywgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEuY29sb3IpXHJcbiAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogb24gaG92ZXIsIGRpc3BsYXkgdGl0bGUgb24gdG9wXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlT3ZlcihkLCBpKSB7XHJcbiAgICAgIGlmICghc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uZGlzcGxheVRpdGxlT25Ub3ApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgc3ZnXHJcbiAgICAgICAgLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGEgPT0gZDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICFpc05hTihkWzBdKSAmJlxyXG4gICAgICAgICAgICAhaXNOYU4oZFsxXSkgJiZcclxuICAgICAgICAgICAgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiZcclxuICAgICAgICAgICAgcGFyc2VGbG9hdChkWzFdKSAtIHBhcnNlRmxvYXQoZFswXSkgPj1cclxuICAgICAgICAgICAgcGFyc2VGbG9hdChzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5iYXJBYm92ZVRhcmdldEhvdmVyQ29sb3JcclxuICAgICAgICAgICAgICA/IHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmJhckFib3ZlVGFyZ2V0SG92ZXJDb2xvclxyXG4gICAgICAgICAgICAgIDogc2VsZi5jaGFydERhdGE/LnRhcmdldExpbmVEYXRhPy5iYXJBYm92ZVRhcmdldENvbG9yXHJcbiAgICAgICAgICAgICAgICA/IHNlbGYuY2hhcnREYXRhPy50YXJnZXRMaW5lRGF0YT8uYmFyQWJvdmVUYXJnZXRDb2xvclxyXG4gICAgICAgICAgICAgICAgOiAnJztcclxuXHJcbiAgICAgICAgICByZXR1cm4gbWV0YURhdGEuaG92ZXJDb2xvciA/IG1ldGFEYXRhLmhvdmVyQ29sb3IgOiAnJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgaWYgKHhTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIgPiAxODApIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICB4U2NhbGUoZC5kYXRhLm5hbWUpIC1cclxuICAgICAgICAgICAgICBsZWZ0QW5kUmlnaHRTcGFjZXMgK1xyXG4gICAgICAgICAgICAgICh4U2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyIC0gMTgwKSAvIDJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB4U2NhbGUoZC5kYXRhLm5hbWUpIC0gbGVmdEFuZFJpZ2h0U3BhY2VzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJylcclxuICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIC8vIEluY3JlYXNlIHRoZSBnYXAgYmV0d2VlbiB0aGUgYmFyIGFuZCB0aGUgdG9vbHRpcCAod2FzIC0xIC0gNDApXHJcbiAgICAgICAgICByZXR1cm4geVNjYWxlKGRbMV0pIC0gMSAtIDUwOyAvLyAxMHB4IG1vcmUgZ2FwXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXR0cignZHknLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gZC5jbGFzcztcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hdHRyKCd3aWR0aCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGQuZGF0YS5uYW1lICYmIC93ZWVrL2kudGVzdChkLmRhdGEubmFtZSkgJiYgL1xcZHs0fS1cXGR7Mn0tXFxkezJ9Ly50ZXN0KGQuZGF0YS5uYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgIHJldHVybiAnMjUwcHgnOyAvLyBpbmNyZWFzZSBmb3Igd2VlayArIGRhdGVcclxuICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh4U2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyID4gMTgwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnMTgwcHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHhTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXR0cignaGVpZ2h0JywgNDApXHJcbiAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxyXG4gICAgICAgIC5zdHlsZSgnei1pbmRleCcsIDk5KVxyXG4gICAgICAgIC5odG1sKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIC8vIFRvb2x0aXAgY29udGVudCB3aXRob3V0IGFueSBhcnJvdyBtYXJrXHJcbiAgICAgICAgICBpZiAoIWlzTmFOKGRbMV0gLSBkWzBdKSkge1xyXG4gICAgICAgICAgICBpZiAoZFsxXSAtIGRbMF0gPT09IDApIHtcclxuICAgICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwidGl0bGUtdG9wLXRleHRcIj4wPC9zcGFuPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGRhdGFUeXBlID0gbWV0YURhdGEuZGF0YVR5cGUgPyBtZXRhRGF0YS5kYXRhVHlwZSA6ICcnO1xyXG4gICAgICAgICAgICB2YXIgZGVzaXJlZFRleHQgPSAnJztcclxuICAgICAgICAgICAgLy8gQWx3YXlzIHNob3cgdGhlIGZ1bGwgeC1heGlzIGxhYmVsIChjYXRlZ29yeSBuYW1lKSBpbiB0aGUgdG9vbHRpcFxyXG4gICAgICAgICAgICBkZXNpcmVkVGV4dCA9XHJcbiAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwidGl0bGUtYmFyLW5hbWVcIj4nICtcclxuICAgICAgICAgICAgICAoZC5kYXRhLm5hbWUgPyBkLmRhdGEubmFtZSA6ICcnKSArXHJcbiAgICAgICAgICAgICAgJzwvc3Bhbj4nO1xyXG5cclxuICAgICAgICAgICAgZGVzaXJlZFRleHQgKz0gbWV0YURhdGEudW5pdFxyXG4gICAgICAgICAgICAgID8gJzxzcGFuIGNsYXNzPVwidGl0bGUtdG9wLXRleHRcIj4nICtcclxuICAgICAgICAgICAgICBtZXRhRGF0YS51bml0ICtcclxuICAgICAgICAgICAgICAoZFsxXSAtIGRbMF0pICsgJyAnICtcclxuICAgICAgICAgICAgICBkYXRhVHlwZSArXHJcbiAgICAgICAgICAgICAgJzwvc3Bhbj4nXHJcbiAgICAgICAgICAgICAgOiAnPHNwYW4gY2xhc3M9XCJ0aXRsZS10b3AtdGV4dFwiPicgK1xyXG4gICAgICAgICAgICAgIChkWzFdIC0gZFswXSkgKyAnICcgK1xyXG4gICAgICAgICAgICAgIGRhdGFUeXBlICtcclxuICAgICAgICAgICAgICAnPC9zcGFuPic7XHJcblxyXG4gICAgICAgICAgICAvLyBObyBhcnJvdyBtYXJrIG9yIGFycm93IEhUTUwvQ1NTIGluIHRvb2x0aXBcclxuICAgICAgICAgICAgcmV0dXJuIGRlc2lyZWRUZXh0O1xyXG4gICAgICAgICAgfSBlbHNlIHJldHVybjtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU91dChkLCBpKSB7XHJcbiAgICAgIGlmICghc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uZGlzcGxheVRpdGxlT25Ub3ApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgLy8gc3ZnLnNlbGVjdEFsbCgncmVjdCcpLnN0eWxlKCdmaWxsJywgbWV0YURhdGEuY29sb3JzW2Qua2V5XSk7XHJcbiAgICAgIHN2Zy5zZWxlY3RBbGwoJ3JlY3QnKS5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgIWlzTmFOKGRbMF0pICYmXHJcbiAgICAgICAgICAhaXNOYU4oZFsxXSkgJiZcclxuICAgICAgICAgIHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbiAgICAgICAgICBwYXJzZUZsb2F0KGRbMV0pIC0gcGFyc2VGbG9hdChkWzBdKSA+PVxyXG4gICAgICAgICAgcGFyc2VGbG9hdChzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnREYXRhPy50YXJnZXRMaW5lRGF0YT8uYmFyQWJvdmVUYXJnZXRDb2xvcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbiAgICAgIH0pO1xyXG4gICAgICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHVzZWQgdG8gc2hvdyB2YWx1ZSBvbiB0b3Agb2YgdGhlIGJhcnNcclxuICAgICAqIG5lZWQgdG8gYmUgdXNlZCBieSBiYXIgY2hhcnRzIG9ubHkob25lIGJhciBzaG91bGQgY29udGFpbiBvbmUgdmFsdWUpXHJcbiAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuICAgICAqL1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnNob3dUb3RhbE9uVG9wICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICByZWN0XHJcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHhTY2FsZShkLmRhdGEubmFtZSkgKyB4U2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLWxhYmVscy1vbnRvcC13ZWtseWNoYXJ0cycpXHJcbiAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHlTY2FsZShkWzFdKSAtIDM7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXR0cignZHknLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGQuY2xhc3M7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgaWYgKCFpc05hTihkWzFdIC0gZFswXSkpIHtcclxuICAgICAgICAgICAgaWYgKGRbMV0gLSBkWzBdID09IDApIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRbMV0gLSBkWzBdIDw9IDk5OSlcclxuICAgICAgICAgICAgICByZXR1cm4gbWV0YURhdGEudW5pdFxyXG4gICAgICAgICAgICAgICAgPyBtZXRhRGF0YS51bml0ICsgZm9ybWF0RnJvbUJhY2tlbmQoZFsxXSAtIGRbMF0pXHJcbiAgICAgICAgICAgICAgICA6IGZvcm1hdEZyb21CYWNrZW5kKGRbMV0gLSBkWzBdKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHJldHVybiBtZXRhRGF0YS51bml0XHJcbiAgICAgICAgICAgICAgICA/IG1ldGFEYXRhLnVuaXQgKyBmb3JtYXRGb3JIdWdlTnVtYmVycyhkWzFdIC0gZFswXSlcclxuICAgICAgICAgICAgICAgIDogZm9ybWF0Rm9ySHVnZU51bWJlcnMoZFsxXSAtIGRbMF0pO1xyXG4gICAgICAgICAgfSBlbHNlIHJldHVybjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogdXNlZCB0byBzaG93IGFuZ2xlZCB2YWx1ZXMgb24gdG9wIG9mIHRoZSBiYXJzXHJcbiAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuICAgICAqL1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnNob3dBbmdsZWRMYWJlbHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlY3RcclxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAuYXR0cigneCcsIDApXHJcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCBmdW5jdGlvbiAoZCwgaSkge1xyXG4gICAgICAgICAgcmV0dXJuIG1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRhdGEtbGFiZWxzLWFuZ2xlZC13ZWVrbHljaGFydHMnKVxyXG4gICAgICAgIC5hdHRyKCd5JywgMClcclxuICAgICAgICAuYXR0cignZHknLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGQuY2xhc3M7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgaWYgKCFpc05hTihkWzFdIC0gZFswXSkgJiYgZFsxXSAtIGRbMF0gPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChkWzFdIC0gZFswXSA8PSA5OTkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhLnVuaXRcclxuICAgICAgICAgICAgICAgID8gbWV0YURhdGEudW5pdCArIGZvcm1hdEZyb21CYWNrZW5kKGRbMV0gLSBkWzBdKVxyXG4gICAgICAgICAgICAgICAgOiBmb3JtYXRGcm9tQmFja2VuZChkWzFdIC0gZFswXSk7XHJcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIG1ldGFEYXRhLnVuaXQgKyBmb3JtYXRGb3JIdWdlTnVtYmVycyhkWzFdIC0gZFswXSk7XHJcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICBpZiAoIWlzTmFOKGRbMV0gLSBkWzBdKSAmJiBkWzFdIC0gZFswXSA+IDApIHtcclxuICAgICAgICAgICAgdmFyIHRvdGFsID0gMDtcclxuICAgICAgICAgICAgdmFyIGluY3JlbWVudGVyOiBudW1iZXIgPSAxO1xyXG4gICAgICAgICAgICBtZXRhRGF0YS5rZXlMaXN0LmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChkLmRhdGFba2V5XSkgdG90YWwgPSB0b3RhbCArIGQuZGF0YVtrZXldO1xyXG4gICAgICAgICAgICAgIGVsc2UgaW5jcmVtZW50ZXIgPSAyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHRlbXBPYmplY3RIb2xkZXJbZC5kYXRhLm5hbWVdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIHRlbXBPYmplY3RIb2xkZXJbZC5kYXRhLm5hbWVdID0gMTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0ZW1wT2JqZWN0SG9sZGVyW2QuZGF0YS5uYW1lXSA9XHJcbiAgICAgICAgICAgICAgICB0ZW1wT2JqZWN0SG9sZGVyW2QuZGF0YS5uYW1lXSArIGluY3JlbWVudGVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGVtcE9iamVjdEhvbGRlcltkLmRhdGEubmFtZV0pIHtcclxuICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAndHJhbnNsYXRlKCcgK1xyXG4gICAgICAgICAgICAgICAgICAoeFNjYWxlKGQuZGF0YS5uYW1lKSArIHhTY2FsZS5iYW5kd2lkdGgoKSAvIDMpICtcclxuICAgICAgICAgICAgICAgICAgJywnICtcclxuICAgICAgICAgICAgICAgICAgKHlTY2FsZSh0b3RhbCkgLSAzKSArXHJcbiAgICAgICAgICAgICAgICAgICcpIHJvdGF0ZSgyNzApJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAndHJhbnNsYXRlKCcgK1xyXG4gICAgICAgICAgICAgICAgICAoeFNjYWxlKGQuZGF0YS5uYW1lKSArIHhTY2FsZS5iYW5kd2lkdGgoKSAvIDIgKyAyKSArXHJcbiAgICAgICAgICAgICAgICAgICcsJyArXHJcbiAgICAgICAgICAgICAgICAgICh5U2NhbGUodG90YWwpIC0gMykgK1xyXG4gICAgICAgICAgICAgICAgICAnKSByb3RhdGUoMjcwKSdcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICd0cmFuc2xhdGUoJyArXHJcbiAgICAgICAgICAgICAgICAgICh4U2NhbGUoZC5kYXRhLm5hbWUpICsgKHhTY2FsZS5iYW5kd2lkdGgoKSAqIDMpIC8gNCkgK1xyXG4gICAgICAgICAgICAgICAgICAnLCcgK1xyXG4gICAgICAgICAgICAgICAgICAoeVNjYWxlKHRvdGFsKSAtIDMpICtcclxuICAgICAgICAgICAgICAgICAgJykgcm90YXRlKDI3MCknXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gJ3JvdGF0ZSgwKSc7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbmlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PSB1bmRlZmluZWQpIHtcclxuICBpZiAoaXNNb2JpbGUpIHtcclxuICAgIC8vIEN1c3RvbSB4LWF4aXMgbGFiZWwgcmVuZGVyaW5nIGZvciBtb2JpbGU6IGV2ZW5seSBkaXN0cmlidXRlIHVuZGVyIGVhY2ggYmFyXHJcbiAgICBzdmcuc2VsZWN0QWxsKCcuY3VzdG9tLXgtbGFiZWwnKS5yZW1vdmUoKTtcclxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkge1xyXG4gICAgICBjb25zdCB4VmFsID0gbGVmdEFuZFJpZ2h0U3BhY2VzICsgaSAqIChiYXJXaWR0aCArIGJhclBhZGRpbmcpICsgYmFyV2lkdGggLyAyO1xyXG4gICAgICBzdmcuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnY3VzdG9tLXgtbGFiZWwnKVxyXG4gICAgICAgIC5hdHRyKCd4JywgMClcclxuICAgICAgICAuYXR0cigneScsIGhlaWdodCArIDE4KVxyXG4gICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAoeFZhbCArIDIwKSArICcsMCknKSAvLyBjdXJyZW50IHZhbHVlICsgMjBcclxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMHB4JylcclxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ3NpZGV3YXlzLWxyJykgLy8gd3JpdGluZyBtb2RlIGZvciBtb2JpbGVcclxuICAgICAgICAudGV4dChkLm5hbWUuc3Vic3RyaW5nKDAsIDMpKTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXgtYXhpcy10ZXh0JylcclxuICAgICAgLmNhbGwoeEF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMnB4JylcclxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5hdHRyKCdkeCcsICcwJylcclxuICAgICAgLmF0dHIoJ2R5JywgJzAuNzFlbScpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKVxyXG4gICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHN2Z1xyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQnKVxyXG4gICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAuY2FsbCh5QXhpcylcclxuICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG59ZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gIHN2Z1xyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLCcgKyBoZWlnaHQgKyAnKScpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteC1heGlzLXRleHQgbXVsdGljaGFydDEnKVxyXG4gICAgLmNhbGwoeEF4aXMpXHJcbiAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpXHJcblxyXG4gIHN2Z1lBeGlzTGVmdFxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgLmNhbGwoeUF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4gICAgXHJcbiAgc3ZnWUF4aXNSaWdodFxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgLmNhbGwoeUF4aXMpXHJcbiAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpXHJcbn1cclxuZWxzZSB7XHJcbiAgc3ZnXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC14LWF4aXMtdGV4dCBtdWx0aWNoYXJ0JylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuICAgIC5jYWxsKHhBeGlzKVxyXG4gICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcblxyXG4gIHN2Z1xyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQgeWF4aXMtZGFzaGVkJylcclxuICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgLmNhbGwoeUF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG59XHJcbiAgICAvKipcclxuICAgICAqIGZvciBleGlzdGluZyBjaGFydHMsIHBsYWNlIHhheGlzIGxhYmVscyBuZWFyZXIgdG8geGF4aXNcclxuICAgICAqIHVzZWQgYnkgZXhpc3RpbmcgY2hhcnRzXHJcbiAgICAgKi9cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCdnLmxpYi1zdGFja2VkLXgtYXhpcy10ZXh0IGcudGljayB0ZXh0JykuYXR0cihcclxuICAgICAgICAneScsXHJcbiAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgaWYgKGFsdGVybmF0ZV90ZXh0KSB7XHJcbiAgICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBsb25nX3RpY2tfbGVuZ3RoICsgMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHNob3J0X3RpY2tfbGVuZ3RoICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy5tdWx0aWNoYXJ0ID4gZyA+IHRleHQnKS5hdHRyKFxyXG4gICAgICAgICdjbGFzcycsXHJcbiAgICAgICAgJ2xpYi1kaXNwbGF5LWhpZGRlbidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogYmFzZWQgb2YgdGhlIGZsYWcsIGhpZGUgb3Igc2hvdyB4YXhpcyB0ZXh0c1xyXG4gICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbiAgICAgKi9cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0xhYmVsSGlkZGVuICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzTGFiZWxIaWRkZW5cclxuICAgICkge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy5tdWx0aWNoYXJ0ID4gZyA+IHRleHQnKS5hdHRyKFxyXG4gICAgICAgICdjbGFzcycsXHJcbiAgICAgICAgJ2xpYi1kaXNwbGF5LWhpZGRlbidcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0xhYmVsSGlkZGVuICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAneDEgYXhpczEnKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJyMwMDAnKVxyXG5cclxuICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHhTY2FsZSkudGlja1NpemUoMCkpXHJcbiAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykuYXR0cignZmlsbCcsICdub25lJykpO1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAneDIgYXhpczInKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJyMwMDAnKVxyXG5cclxuICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHhTY2FsZUZyb21PcmlnaW4pLnRpY2tTaXplKDApKVxyXG4gICAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLmF0dHIoJ2ZpbGwnLCAnbm9uZScpKTtcclxuICAgICAgc3ZnLnNlbGVjdEFsbCgnLmF4aXMyID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgICAgLy8gc3ZnLnNlbGVjdEFsbCgnZy54Mi5heGlzMiBnLnRpY2sgdGV4dCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgICAgc3ZnLnNlbGVjdEFsbCgnLngxLmF4aXMxIC50aWNrIGxpbmUnKS5hdHRyKCd5MicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaGlkZVhheGlzVGljaykge1xyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGlzTm9BbHRlcm5hdGVYYXhpc1RleHQgaXMgdXNlZCB0byBwcmV2ZW50IHgtYXhpcyBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgaW4gYWx0ZXJuYXRlIGZhc2hpb25cclxuICAgICAgICAgKiBmb3IgZnV0dXJlIHVzZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ICYmXHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc05vQWx0ZXJuYXRlWGF4aXNUZXh0ID09IHVuZGVmaW5lZFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybiBsb25nX3RpY2tfbGVuZ3RoX2JnIC0gNztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHNob3J0X3RpY2tfbGVuZ3RoX2JnIC0gNDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICAvKipcclxuICAgICAgICogcmVzZXQgdGhlIGZsYWcgc28gdGhhdCB0ZXh0cyBhbHNvIGZvbGxvdyB0aGUgcGF0dGVybiBvZiB0aWNrc1xyXG4gICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuICAgICAgICovXHJcbiAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgICAgIC8vIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLXdlZWtseWNoYXJ0cycpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiA4KSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bi1hbHQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nO1xyXG4gICAgICAgICAgfSBlbHNlIHJldHVybiAnbGliLXhheGlzLWxhYmVscy10ZXh0cy13ZWVrbHljaGFydHMnO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBpZiAoYWx0ZXJuYXRlX3RleHQpIHtcclxuICAgICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGxvbmdfdGlja19sZW5ndGhfYmc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiBzaG9ydF90aWNrX2xlbmd0aF9iZztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi54TGFiZWxzT25TYW1lTGluZSkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAgIC5hdHRyKCd5Jywgc2hvcnRfdGlja19sZW5ndGhfYmcpXHJcbiAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQsIGkpIHtcclxuICAgICAgICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICAgICAgICAvLyBJZiBsYWJlbCBoYXMgbW9yZSB0aGFuIG9uZSB3b3JkLCBzaG93IG9ubHkgZmlyc3QgMyBsZXR0ZXJzIG9mIGZpcnN0IHdvcmRcclxuICAgICAgICAgICAgdmFyIGZpcnN0V29yZCA9IGQuc3BsaXQoJyAnKVswXTtcclxuICAgICAgICAgICAgcmV0dXJuIGZpcnN0V29yZC5zdWJzdHJpbmcoMCwgMyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGQudHJpbSgpLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBkLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24odGhpczogU1ZHVGV4dEVsZW1lbnQsIGQsIGkpIHtcclxuICAgICAgICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICAgICAgICB2YXIgdG90YWxCYXJzID0gMDtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSAmJiB0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgIHRvdGFsQmFycyA9IGQzLnNlbGVjdCh0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCdnLnRpY2snKS5zaXplKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRvdGFsQmFycyA9PT0gMikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKDAsMCknO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyAoaSAqIDMwKSArICcsMCknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2snKVxyXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbiAgICAgICAgLmF0dHIoJ3knLCBsb25nX3RpY2tfbGVuZ3RoX2JnKVxyXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ2N1cnJlbnRDb2xvcicpXHJcbiAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgIC8vIEZvciBtb2JpbGUsIGRvIG5vdCBwcmludCB0aGUgc2Vjb25kIHdvcmQgYXQgYWxsXHJcbiAgICAgICAgICBpZiAoaXNNb2JpbGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGQudHJpbSgpLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoZC5pbmRleE9mKCcgJyksIGQubGVuZ3RoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcclxuICAgICAgICAgIGlmIChpc01vYmlsZSAmJiBpID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKDIwLDApJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBoaWRlIHlheGlzIHZhbHVlc1xyXG4gICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbiAgICAgKi9cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0xhYmVsSGlkZGVuICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzTGFiZWxIaWRkZW5cclxuICAgICkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkID4gZyA+IHRleHQnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuICAgIC8qKiBoaWRlIHkgYXhpcyBsYWJlbHNcclxuICAgICAqIGNvbmZpZyBpcyB0aGVyZSBmb3IgZnV0dXJlIHVzZVxyXG4gICAgICovXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNIaWRkZW4gIT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNIaWRkZW5cclxuICAgICkge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogZGFzaGVkIHkgYXhpc1xyXG4gICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbiAgICAgKi9cclxuaWYgKFxyXG4gIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNEYXNoZWQgIT0gdW5kZWZpbmVkICYmXHJcbiAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZFxyXG4pIHtcclxuICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKVxyXG4gICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWdyaWQtY29sb3IpJyk7IC8vIFVzZSBDU1MgdmFyaWFibGVcclxufVxyXG4gICAgLyoqXHJcbiAgICAgKiB4IGF4aXMgY29sb3JcclxuICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4gICAgICovXHJcbmlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzQ29sb3IgIT0gdW5kZWZpbmVkKSB7XHJcbiAgZDMuc2VsZWN0QWxsKCcubXVsdGljaGFydCcpLnN0eWxlKFxyXG4gICAgJ2NvbG9yJyxcclxuICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNDb2xvciB8fCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknXHJcbiAgKTtcclxufVxyXG4gICAgLyoqXHJcbiAgICAgKiB1c2VkIHRvIGRpc3BsYXkgeSBsYWJlbFxyXG4gICAgICovXHJcbmlmICh0aGlzLmlzWm9vbWVkT3V0ICYmIHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOSkge1xyXG4gIHN2Z1xyXG4gICAgLnNlbGVjdEFsbCgnLmxpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKC05MCknKVxyXG4gICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ2VuZCcpXHJcbiAgICAuYXR0cigneCcsICctNScpXHJcbiAgICAuYXR0cignZHknLCBudWxsKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc3R5bGVBeGlzRG9tYWluKCkge1xyXG4gIHN2Zy5zZWxlY3RBbGwoJy5kb21haW4nKVxyXG4gICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciknKVxyXG4gICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMXB4Jyk7XHJcbiAgXHJcbiAgc3ZnWUF4aXNMZWZ0LnNlbGVjdEFsbCgnLmRvbWFpbicpXHJcbiAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yKScpXHJcbiAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKTtcclxuICAgIFxyXG4gIHN2Z1lBeGlzUmlnaHQuc2VsZWN0QWxsKCcuZG9tYWluJylcclxuICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IpJylcclxuICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzFweCcpO1xyXG59XHJcblxyXG5zdHlsZUF4aXNEb21haW4oKTtcclxuXHJcbiAgICBpZiAobWV0YURhdGEueUxhYmVsKSB7XHJcbiAgICAgIHN2Z1lBeGlzTGVmdC5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCwgLmxpYi15bGFiZWwtZHJpbGxkb3duY2hhcnRzLCAubGliLXlsYWJlbC13ZWVrbHlDaGFydHMnKS5yZW1vdmUoKTtcclxuICAgICAgZnVuY3Rpb24gaXNBY3JvbnltKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIChsYWJlbC5sZW5ndGggPD0gNCAmJiAvXltBLVpdKyQvLnRlc3QobGFiZWwpKSB8fCAobGFiZWwgPT09IGxhYmVsLnRvVXBwZXJDYXNlKCkgJiYgL1tBLVpdLy50ZXN0KGxhYmVsKSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgeUxhYmVsVGV4dCA9IG1ldGFEYXRhLnlMYWJlbDtcclxuICAgICAgY29uc3QgaXNBY3IgPSBpc0Fjcm9ueW0oeUxhYmVsVGV4dC5yZXBsYWNlKC9bXkEtWmEtel0vZywgJycpKTtcclxuXHJcbiAgICAgY29uc3QgeVBvc2l0aW9uID0gaXNyaWEgPyAwIC0gbWFyZ2luLmxlZnQgLyAyIC0gMzAgOiAwIC0gbWFyZ2luLmxlZnQgLyAyIC0gNDA7XHJcblxyXG4gICAgICBzdmdZQXhpc0xlZnRcclxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuXHJcbiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KVxyXG4gICAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWIteWxhYmVsLWRyaWxsZG93bmNoYXJ0cyc7XHJcbiAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWIteWxhYmVsLXdlZWtseUNoYXJ0cyc7XHJcbiAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcclxuICAgICAgICAuYXR0cigneScsIHlQb3NpdGlvbilcclxuICAgICAgICAuYXR0cigneCcsIDAgLSBoZWlnaHQgLyAyKVxyXG4gICAgICAgIC5hdHRyKCdkeScsICcxZW0nKVxyXG4gICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAgIC50ZXh0KGlzQWNyID8geUxhYmVsVGV4dC50b1VwcGVyQ2FzZSgpIDogeUxhYmVsVGV4dC50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgIC5zdHlsZSgndGV4dC10cmFuc2Zvcm0nLCBpc0FjciA/ICdub25lJyA6ICdjYXBpdGFsaXplJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHtcclxuICAgICAgY29uc3QgeVplcm8gPSB5U2NhbGUocGFyc2VkTnVtKTtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnbGluZScpXHJcbiAgICAgICAgLmF0dHIoJ3gxJywgMClcclxuICAgICAgICAuYXR0cigneDInLCB3aWR0aClcclxuICAgICAgICAuYXR0cigneTEnLCB5WmVybylcclxuICAgICAgICAuYXR0cigneTInLCB5WmVybylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmNvbG9yKTtcclxuICAgICAgLy8gc3ZnWUF4aXNSaWdodFxyXG4gICAgICAvLyAgIC5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgICAvLyAgIC5hdHRyKCd4MScsIDApXHJcbiAgICAgIC8vICAgLmF0dHIoJ3gyJywgcmlnaHRTdmdXaWR0aClcclxuICAgICAgLy8gICAuYXR0cigneTEnLCB5WmVybylcclxuICAgICAgLy8gICAuYXR0cigneTInLCB5WmVybylcclxuICAgICAgLy8gICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmNvbG9yKTtcclxuICAgICAgc3ZnWUF4aXNSaWdodFxyXG4gICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAgIC8vIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAwICsgJywnICsgKHlaZXJvIC0gMzApICsgJyknKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAwICsgJywnICsgKHlaZXJvIC0gMTMpICsgJyknKVxyXG4gICAgICAgIC5hdHRyKCd3aWR0aCcsIHJpZ2h0U3ZnV2lkdGgpXHJcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4gICAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RhcmdldC1kaXNwbGF5JylcclxuICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuXHJcbiAgICAgICAgLmh0bWwoZnVuY3Rpb24gKGQsIGkpIHtcclxuICAgICAgICAgIGxldCBkYXRhVHlwZVRlbXAgPSAnJztcclxuICAgICAgICAgIGxldCB0YXJnZXRMaW5lTmFtZSA9ICd0YXJnZXQnO1xyXG4gICAgICAgICAgaWYgKG1ldGFEYXRhLmRhdGFUeXBlKSB7XHJcbiAgICAgICAgICAgIGRhdGFUeXBlVGVtcCA9IG1ldGFEYXRhLmRhdGFUeXBlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4gICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXROYW1lXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdGFyZ2V0TGluZU5hbWUgPSBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXROYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgYDxkaXY+JHt0YXJnZXRMaW5lTmFtZX08L2Rpdj5gICtcclxuICAgICAgICAgICAgJzxkaXY+JyArXHJcbiAgICAgICAgICAgIHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArXHJcbiAgICAgICAgICAgICcnICtcclxuICAgICAgICAgICAgZGF0YVR5cGVUZW1wICtcclxuICAgICAgICAgICAgJzwvZGl2PidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZWN0XHJcbiAgICAgIC5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgICAub24oJ21vdXNlZW50ZXInLCBoYW5kbGVNb3VzZU92ZXIpXHJcbiAgICAgIC5vbignbW91c2VvdXQnLCBoYW5kbGVNb3VzZU91dCk7XHJcbiAgICBpZiAobWV0YURhdGEubGluZXlMYWJlbCkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgbGliLWxpbmUtYXhpcycpXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgKHdpZHRoIC0gMjApICsgJywwKSByb3RhdGUoOTApJylcclxuICAgICAgICAuYXR0cigneScsIDAgLSBtYXJnaW4ucmlnaHQgKiAzKVxyXG4gICAgICAgIC5hdHRyKCd4JywgaGVpZ2h0IC8gMilcclxuICAgICAgICAuYXR0cignZHknLCAnNWVtJylcclxuICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgICAgLnRleHQobWV0YURhdGEubGluZXlMYWJlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgICAgIGlmIChtZXRhRGF0YS54TGFiZWwpIHtcclxuICAgICAgZnVuY3Rpb24gaXNBY3JvbnltKGxhYmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIChsYWJlbC5sZW5ndGggPD0gNCAmJiAvXltBLVpdKyQvLnRlc3QobGFiZWwpKSB8fFxyXG4gICAgICAgICAgKGxhYmVsID09PSBsYWJlbC50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChsYWJlbCkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB4TGFiZWxUZXh0ID0gbWV0YURhdGEueExhYmVsO1xyXG4gICAgICBjb25zdCBpc0FjciA9IGlzQWNyb255bSh4TGFiZWxUZXh0LnJlcGxhY2UoL1teQS1aYS16XS9nLCAnJykpO1xyXG5cclxuICAgICAgICBjb25zdCB4UG9zaXRpb24gPSBpc3JpYSA/IChoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSkgOiAoaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAxMCk7XHJcblxyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KVxyXG4gICAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWIteGxhYmVsLWRyaWxsZG93bmNoYXJ0cyc7XHJcbiAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWIteGxhYmVsLXdlZWtseUNoYXJ0cyc7XHJcbiAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgICAuYXR0cihcclxuICAgICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgICAgJ3RyYW5zbGF0ZSgnICsgd2lkdGggLyAyICsgJyAsJyArIHhQb3NpdGlvbiArICcpJ1xyXG4gICAgICAgIClcclxuICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgICAudGV4dChpc0FjciA/IHhMYWJlbFRleHQudG9VcHBlckNhc2UoKSA6IHhMYWJlbFRleHQudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICAuc3R5bGUoJ3RleHQtdHJhbnNmb3JtJywgaXNBY3IgPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAobGluZURhdGEgJiYgY29sb3JzKSB7XHJcbiAgICAgIHZhciBkYXRhR3JvdXAgPSBkM1xyXG4gICAgICAgIC5uZXN0KClcclxuICAgICAgICAua2V5KGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICByZXR1cm4gZC5jYXRlZ29yeTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5lbnRyaWVzKGxpbmVEYXRhKTtcclxuXHJcbiAgICAgIHZhciBsaW5lR2VuID0gZDNcclxuICAgICAgICAubGluZSgpXHJcbiAgICAgICAgLngoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgIHJldHVybiB4U2NhbGUoZC5uYW1lKSArIHhTY2FsZS5iYW5kd2lkdGgoKSAvIDI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAueShmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGxpbmVZc2NhbGUoZC52YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB2YXIgY2FsY3VsYXRlQ1ggPSAoZCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB4U2NhbGUoZC5uYW1lKSArIHhTY2FsZS5iYW5kd2lkdGgoKSAvIDI7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB2YXIgY2FsY3VsYXRlQ1kgPSAoZCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBsaW5lWXNjYWxlKGQudmFsdWUpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgZGF0YUdyb3VwLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHtcclxuICAgICAgICBzdmdcclxuICAgICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAgICAgLmRhdHVtKGQudmFsdWVzKVxyXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXHJcbiAgICAgICAgICAuYXR0cignc3Ryb2tlJywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgaWYgKCdjYXRlZ29yeScgaW4gZFswXSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBjb2xvcnNbZFswXS5jYXRlZ29yeV07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIuNSkgLyoqbGluZSB0aGlua25lc3MgKi9cclxuICAgICAgICAgIC5hdHRyKCdkJywgbGluZUdlbihkLnZhbHVlcykpO1xyXG5cclxuICAgICAgICB2YXIgZG90ID0gc3ZnXHJcbiAgICAgICAgICAuc2VsZWN0QWxsKCdteUNpcmNsZXMnKVxyXG4gICAgICAgICAgLmRhdGEoZC52YWx1ZXMpXHJcbiAgICAgICAgICAuZW50ZXIoKVxyXG4gICAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgc2VsZi5oYW5kbGVDbGljayhkKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb3RcclxuICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXHJcbiAgICAgICAgICAuYXR0cignZmlsbCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIGlmICgnY2F0ZWdvcnknIGluIGQpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzW2QuY2F0ZWdvcnldO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnbm9uZScpXHJcbiAgICAgICAgICAuYXR0cignY3gnLCBmdW5jdGlvbiAoZCwgaSkge1xyXG4gICAgICAgICAgICByZXR1cm4geFNjYWxlKGQubmFtZSkgKyB4U2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5hdHRyKCdjeScsIGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsaW5lWXNjYWxlKGQudmFsdWUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5hdHRyKCdyJywgMykgLyoqcmFkaXVzIG9mIGNpcmNsZT01ICovXHJcbiAgICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XHJcblxyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcikge1xyXG4gICAgICAgICAgZG90XHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZG90cycpXHJcbiAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAgICAgICAgIC5hdHRyKCdzdHlsZScsICdmb250LXNpemU6ICcgKyAnLjg1ZW07JyArICdmb250LXdlaWdodDonICsgJ2JvbGQnKVxyXG4gICAgICAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHhTY2FsZShkLm5hbWUpICsgeFNjYWxlLmJhbmR3aWR0aCgpIC8gMjtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoZCwgaSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBsaW5lWXNjYWxlKGQudmFsdWUpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuYXR0cignZHknLCAnLTFlbScpXHJcbiAgICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxhYmVsRm9ybWF0dGVyKGQudmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gc3ZnLmF0dHIoJ3dpZHRoJywgMTUwKS5zdHlsZSgnbWF4LXdpZHRoJywgMTUwKS5zdHlsZSgnb3ZlcmZsb3cteCcsICdhdXRvJyk7XHJcbiAgfVxyXG4gIGhhbmRsZUNsaWNrKGQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnREYXRhPy5tZXRhRGF0YT8uaGFzRHJpbGxEb3duIHx8IGQ/LnRvZ2dsZUZyb20pXHJcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGQpO1xyXG4gIH1cclxuICBoYW5kbGVIZWFkZXJNZW51Q2xpY2soaWQpIHtcclxuICAgIHRoaXMuaGVhZGVyTWVudWNsaWNrRXZlbnQuZW1pdChpZCk7XHJcbiAgfVxyXG4gIGhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbihldmVudCkge1xyXG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuICBoYW5kbGVab29taW5ab29tb3V0Q2xpY2soeyBpc1pvb21PdXQsIGV2ZW50IH0pIHtcclxuICAgIC8vIHRoaXMuaXNab29tT3V0U2VsZWN0ZWQoaXNab29tT3V0LCBldmVudCk7XHJcbiAgICB0aGlzLmlzWm9vbU91dFNlbGVjdGVkKGlzWm9vbU91dCk7XHJcbiAgfVxyXG59XHJcbiIsIjxtZXRhIGh0dHAtZXF1aXY9XCJDQUNIRS1DT05UUk9MXCIgY29udGVudD1cIk5PLUNBQ0hFXCIgLz5cclxuPG1ldGEgaHR0cC1lcXVpdj1cIkVYUElSRVNcIiBjb250ZW50PVwiU2F0LCAwMSBKdW4gMjAwNCAxMToxMjowMSBHTVRcIiAvPlxyXG48ZGl2XHJcbiAgI3ZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lclxyXG4gIGNsYXNzPVwibGliLWNoYXJ0LXdyYXBwZXJcIlxyXG4gIFtuZ0NsYXNzXT1cInsgJ2xpYi1uby1iYWNrZ3JvdW5kJzogaXNUcmFuc3BhcmVudEJhY2tncm91bmQgfVwiXHJcbiAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHZhcigtLWNhcmQtYmcpO1wiXHJcblxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCJcclxuPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXItYWx0XCIgKm5nSWY9XCIhaXNIZWFkZXJWaXNpYmxlXCI+XHJcbiAgICA8bGliLWNoYXJ0LWhlYWRlci12MlxyXG4gICAgICBbY2hhcnREYXRhXT1cImNoYXJ0RGF0YVwiXHJcbiAgICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICA+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG5cclxuICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJjaGFydENvbmZpZ3VyYXRpb24uaXNDb21wYXJlYnlEcm9wZG93blZpc2libGVcIj5cclxuICAgICAgPGxpYi1kcm9wZG93bj48L2xpYi1kcm9wZG93bj5cclxuICAgIDwvc3Bhbj4gLS0+XHJcbiAgICA8bGliLWNoYXJ0LWhlYWRlci12M1xyXG4gICAgICBbY2hhcnREYXRhXT1cImNoYXJ0RGF0YVwiXHJcbiAgICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgICAgKGNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbik9XCJoYW5kbGVDb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICh6b29tSW5ab29tT3V0Q2xpY2spPVwiaGFuZGxlWm9vbWluWm9vbW91dENsaWNrKCRldmVudClcIlxyXG4gICAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mz5cclxuICA8L2Rpdj5cclxuICA8ZGl2XHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIlxyXG4gICAgaWQ9XCJ2ZXJ0aWNhbHN0YWNrZWRjaGFydGNvbnRhaW5lclwiXHJcbiAgICAjdmVydGljYWxzdGFja2VkY2hhcnRjb250YWluZXJcclxuICAgIGNsYXNzPVwibGliLWNoYXJ0LXN2Z1wiXHJcbiAgPjwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|