axidio-styleguide-library1-v2 0.3.13 → 0.3.15

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.
@@ -27,11 +27,9 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
27
27
  LONG_TICK_LENGTH: 16,
28
28
  SHORT_TICK_LENGTH_BG: 5,
29
29
  LONG_TICK_LENGTH_BG: 30,
30
- MIN_MOBILE_BAR_WIDTH: 28, // Adjusted for better mobile fit
31
- DESKTOP_MIN_BAR_WIDTH: 40,
32
- TABLET_MIN_BAR_WIDTH: 35, // Added tablet-specific width
33
- MOBILE_BAR_PADDING: 10, // Reduced padding for mobile
34
- TABLET_BAR_PADDING: 8, // Added tablet-specific padding
30
+ DESKTOP_BAR_WIDTH: 40, // Desktop bar width
31
+ MOBILE_BAR_WIDTH: 25, // Mobile/Tablet bar width (reduced)
32
+ BAR_GAP: 30, // Gap between bars (increased for better separation)
35
33
  ZOOM_THRESHOLD: 30,
36
34
  ZOOM_IN_THRESHOLD: 8,
37
35
  };
@@ -96,48 +94,6 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
96
94
  removeExistingChart() {
97
95
  d3.select('#' + this.uniqueId).remove();
98
96
  }
99
- getDeviceConfig() {
100
- const width = window.innerWidth;
101
- return {
102
- isMobile: width < 768, // Changed from 576 to 768 for better mobile coverage
103
- isTablet: width >= 768 && width < 1024, // Changed from 576-992 to 768-1024
104
- isDesktop: width >= 1024, // Changed from 992 to 1024
105
- };
106
- }
107
- configureResponsiveSettings(device) {
108
- if (device.isMobile) {
109
- this.chartConfiguration.margin = { top: 15, right: 5, bottom: 35, left: 25 };
110
- this.chartConfiguration.numberOfYTicks = 4;
111
- this.chartConfiguration.svgHeight = 55;
112
- }
113
- else if (device.isTablet) {
114
- this.chartConfiguration.margin = { top: 20, right: 15, bottom: 40, left: 35 };
115
- this.chartConfiguration.numberOfYTicks = 5;
116
- this.chartConfiguration.svgHeight = 65;
117
- }
118
- else {
119
- // Desktop/Large screens
120
- const width = window.innerWidth;
121
- if (width >= 1920) {
122
- // Large monitors
123
- this.chartConfiguration.margin = { top: 35, right: 35, bottom: 55, left: 70 };
124
- this.chartConfiguration.numberOfYTicks = 8;
125
- this.chartConfiguration.svgHeight = 85;
126
- }
127
- else if (width >= 1366) {
128
- // Medium monitors
129
- this.chartConfiguration.margin = { top: 30, right: 30, bottom: 50, left: 60 };
130
- this.chartConfiguration.numberOfYTicks = 7;
131
- this.chartConfiguration.svgHeight = 80;
132
- }
133
- else {
134
- // Small desktops/laptops
135
- this.chartConfiguration.margin = { top: 25, right: 25, bottom: 45, left: 50 };
136
- this.chartConfiguration.numberOfYTicks = 6;
137
- this.chartConfiguration.svgHeight = 75;
138
- }
139
- }
140
- }
141
97
  mergeConfigurations() {
142
98
  for (const key in this.defaultConfiguration) {
143
99
  this.chartConfiguration[key] = ChartHelper.getValueByConfigurationType(key, this.defaultConfiguration, this.customChartConfiguration);
@@ -156,26 +112,20 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
156
112
  }
157
113
  return metaData;
158
114
  }
159
- calculateDimensions(chartContainer, verticalContainer, margin, device, dataLength) {
115
+ calculateDimensions(chartContainer, verticalContainer, margin, dataLength) {
160
116
  const containerWidth = chartContainer.node().getBoundingClientRect().width;
161
117
  const containerHeight = verticalContainer.node().getBoundingClientRect().height;
162
- let width = containerWidth - margin.left - margin.right;
118
+ const leftAxisWidth = 80;
119
+ const rightAxisWidth = this.CONSTANTS.RIGHT_SVG_WIDTH;
120
+ const availableWidth = containerWidth - leftAxisWidth - rightAxisWidth;
121
+ let width = availableWidth - margin.left - margin.right;
163
122
  let height = containerHeight * (this.chartConfiguration.svgHeight / 100) - margin.top - margin.bottom;
164
- // Responsive zoom handling
165
123
  if (dataLength > this.CONSTANTS.ZOOM_THRESHOLD && this.isZoomedOut) {
166
- const minWidth = device.isMobile
167
- ? dataLength * 12
168
- : device.isTablet
169
- ? dataLength * 20
170
- : dataLength * 25;
124
+ const minWidth = dataLength * 25;
171
125
  width = Math.max(width, minWidth);
172
126
  }
173
127
  if (dataLength > this.CONSTANTS.ZOOM_IN_THRESHOLD && !this.isZoomedOut) {
174
- width = device.isMobile
175
- ? dataLength * 50
176
- : device.isTablet
177
- ? dataLength * 90
178
- : dataLength * 130;
128
+ width = dataLength * 130;
179
129
  }
180
130
  if (this.chartConfiguration.isFullScreen) {
181
131
  height = this.chartConfiguration.svgHeight !== 80
@@ -183,28 +133,41 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
183
133
  : containerHeight;
184
134
  }
185
135
  if (this.chartConfiguration.isDrilldownChart) {
186
- const offset = device.isMobile ? 60 : device.isTablet ? 90 : 130;
187
- height = containerHeight - margin.top - margin.bottom - offset;
136
+ height = containerHeight - margin.top - margin.bottom - 130;
188
137
  }
138
+ const isMobileOrTablet = window.innerWidth < 1024;
189
139
  let barWidth;
190
140
  let barPadding;
191
- let requiredSvgWidth;
192
- if (device.isMobile) {
193
- barWidth = this.CONSTANTS.MIN_MOBILE_BAR_WIDTH;
194
- barPadding = this.CONSTANTS.MOBILE_BAR_PADDING;
195
- requiredSvgWidth = Math.max(width - this.CONSTANTS.RIGHT_SVG_WIDTH, (barWidth + barPadding) * dataLength + this.CONSTANTS.LEFT_RIGHT_SPACES * 2 +
196
- this.CONSTANTS.RIGHT_SVG_WIDTH - barPadding);
197
- }
198
- else if (device.isTablet) {
199
- barWidth = this.CONSTANTS.TABLET_MIN_BAR_WIDTH;
200
- barPadding = this.CONSTANTS.TABLET_BAR_PADDING;
201
- requiredSvgWidth = Math.max(width - this.CONSTANTS.RIGHT_SVG_WIDTH, (barWidth + barPadding) * dataLength + this.CONSTANTS.LEFT_RIGHT_SPACES * 2);
141
+ if (isMobileOrTablet) {
142
+ if (dataLength === 1) {
143
+ barWidth = 60;
144
+ barPadding = 0;
145
+ }
146
+ else if (dataLength === 2) {
147
+ barWidth = 50;
148
+ barPadding = 45;
149
+ }
150
+ else if (dataLength === 3) {
151
+ barWidth = 45;
152
+ barPadding = 40;
153
+ }
154
+ else if (dataLength <= 5) {
155
+ barWidth = 35;
156
+ barPadding = 30;
157
+ }
158
+ else {
159
+ barWidth = 25;
160
+ barPadding = 25;
161
+ }
202
162
  }
203
163
  else {
204
- barWidth = Math.max(this.CONSTANTS.DESKTOP_MIN_BAR_WIDTH, (width - this.CONSTANTS.RIGHT_SVG_WIDTH - this.CONSTANTS.LEFT_RIGHT_SPACES * 2) / dataLength);
205
- barPadding = 0;
206
- requiredSvgWidth = width - this.CONSTANTS.RIGHT_SVG_WIDTH;
164
+ barWidth = this.CONSTANTS.DESKTOP_BAR_WIDTH;
165
+ barPadding = this.CONSTANTS.BAR_GAP;
207
166
  }
167
+ const totalBarsWidth = barWidth * dataLength;
168
+ const totalGaps = barPadding * (dataLength - 1);
169
+ const minRequiredWidth = totalBarsWidth + totalGaps + (this.CONSTANTS.LEFT_RIGHT_SPACES * 2);
170
+ const requiredSvgWidth = Math.max(availableWidth, minRequiredWidth);
208
171
  return {
209
172
  width,
210
173
  height,
@@ -215,63 +178,110 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
215
178
  requiredSvgWidth,
216
179
  };
217
180
  }
218
- createSvgContainers(chartContainer, dimensions, margin) {
219
- const outerContainer = chartContainer
181
+ createSvgContainers(chartContainer, dimensions, margin, hasXLabel // Add this parameter
182
+ ) {
183
+ // Calculate total height including space for X-axis label if present
184
+ const xLabelSpace = hasXLabel ? 30 : 0;
185
+ const totalHeight = dimensions.height + margin.top + margin.bottom + xLabelSpace;
186
+ // Main wrapper
187
+ const chartWrapper = chartContainer
220
188
  .append('div')
221
189
  .attr('id', this.uniqueId)
222
- .attr('class', 'outer-container')
190
+ .attr('class', 'chart-wrapper-main')
191
+ .style('position', 'relative')
223
192
  .style('width', '100%')
224
- .style('height', dimensions.height)
225
- .style('overflow-x', 'hidden')
226
- .style('padding-left', `${margin.left}px`)
227
- .style('margin-left', '10px')
228
- .style('padding-right', `${this.CONSTANTS.RIGHT_SVG_WIDTH}px`);
229
- const svgYAxisLeft = outerContainer
193
+ .style('height', `${totalHeight}px`); // Include X-label space
194
+ // Left Y-axis - Fixed
195
+ const leftAxisContainer = chartWrapper
196
+ .append('div')
197
+ .attr('class', 'left-axis-container')
198
+ .style('position', 'absolute')
199
+ .style('left', '0')
200
+ .style('top', '0')
201
+ .style('width', '80px')
202
+ .style('height', `${dimensions.height + margin.top + margin.bottom}px`) // Exclude X-label space
203
+ .style('background-color', 'var(--card-bg)')
204
+ .style('z-index', '10');
205
+ const svgYAxisLeft = leftAxisContainer
230
206
  .append('svg')
231
207
  .attr('width', '80')
232
208
  .attr('height', dimensions.height + margin.top + margin.bottom)
233
- .style('position', 'absolute')
234
- .style('left', '0')
235
- .style('z-index', 1)
236
209
  .append('g')
237
210
  .attr('transform', `translate(${margin.left + 10},${margin.top})`);
238
- const svgYAxisRight = outerContainer
211
+ // Right Y-axis - Fixed
212
+ const rightAxisContainer = chartWrapper
213
+ .append('div')
214
+ .attr('class', 'right-axis-container')
215
+ .style('position', 'absolute')
216
+ .style('right', '0')
217
+ .style('top', '0')
218
+ .style('width', `${this.CONSTANTS.RIGHT_SVG_WIDTH}px`)
219
+ .style('height', `${dimensions.height + margin.top + margin.bottom}px`) // Exclude X-label space
220
+ .style('background-color', 'var(--card-bg)')
221
+ .style('z-index', '10');
222
+ const svgYAxisRight = rightAxisContainer
239
223
  .append('svg')
240
224
  .attr('width', this.CONSTANTS.RIGHT_SVG_WIDTH)
241
225
  .attr('height', dimensions.height + margin.top + margin.bottom)
242
- .style('position', 'absolute')
243
- .style('right', '2px')
244
- .style('z-index', 1)
245
226
  .append('g')
246
227
  .attr('transform', `translate(0,${margin.top})`);
247
- const innerContainer = outerContainer
228
+ // Scrollable middle area
229
+ const scrollableContainer = chartWrapper
248
230
  .append('div')
249
- .attr('class', 'inner-container')
250
- .style('width', '100%')
251
- .style('overflow-x', 'auto');
231
+ .attr('class', 'scrollable-chart-container')
232
+ .style('position', 'absolute')
233
+ .style('left', '80px')
234
+ .style('right', `${this.CONSTANTS.RIGHT_SVG_WIDTH}px`)
235
+ .style('top', '0')
236
+ .style('width', 'auto')
237
+ .style('height', `${dimensions.height + margin.top + margin.bottom}px`) // Exclude X-label space
238
+ .style('overflow-x', 'auto')
239
+ .style('overflow-y', 'hidden');
240
+ const innerContainer = scrollableContainer
241
+ .append('div')
242
+ .attr('class', 'inner-chart-container')
243
+ .style('min-width', '100%');
252
244
  const svg = innerContainer
253
245
  .append('svg')
254
246
  .attr('width', dimensions.requiredSvgWidth)
255
247
  .attr('height', dimensions.height + margin.top + margin.bottom + 30)
256
248
  .append('g')
257
249
  .attr('transform', `translate(0,${margin.top})`);
258
- return { svg, svgYAxisLeft, svgYAxisRight, innerContainer };
250
+ // Fixed bottom container for X-axis label
251
+ const bottomLabelContainer = chartWrapper
252
+ .append('div')
253
+ .attr('class', 'bottom-label-container')
254
+ .style('position', 'absolute')
255
+ .style('left', '80px')
256
+ .style('right', `${this.CONSTANTS.RIGHT_SVG_WIDTH}px`)
257
+ .style('bottom', '0')
258
+ .style('height', `${xLabelSpace}px`)
259
+ .style('display', 'flex')
260
+ .style('justify-content', 'center')
261
+ .style('align-items', 'center')
262
+ .style('background-color', 'var(--card-bg)')
263
+ .style('z-index', '10');
264
+ return { svg, svgYAxisLeft, svgYAxisRight, innerContainer, bottomLabelContainer };
259
265
  }
260
- createScales(data, layers, lineData, dimensions, device) {
266
+ createScales(data, layers, lineData, dimensions) {
261
267
  const { width, height, barWidth, barPadding } = dimensions;
262
- // Adjust padding based on device
263
- const padding = device.isMobile ? 0.15 : device.isTablet ? 0.3 : 0.5;
268
+ // Calculate bar positioning
269
+ const totalBarsWidth = data.length * barWidth;
270
+ const totalSpacing = (data.length - 1) * barPadding;
271
+ const requiredWidth = totalBarsWidth + totalSpacing + (this.CONSTANTS.LEFT_RIGHT_SPACES * 2);
272
+ const effectiveWidth = Math.max(width, requiredWidth);
273
+ const paddingRatio = barPadding / (barWidth + barPadding);
274
+ // X-scale starts from 0 (no left spacing for grid alignment)
264
275
  const xScale = d3
265
276
  .scaleBand()
266
- .rangeRound([
267
- this.CONSTANTS.LEFT_RIGHT_SPACES,
268
- width - this.CONSTANTS.RIGHT_SVG_WIDTH - this.CONSTANTS.LEFT_RIGHT_SPACES
269
- ])
277
+ .rangeRound([0, dimensions.requiredSvgWidth]) // Full width from 0
270
278
  .domain(data.map(d => d.name).reverse())
271
- .padding(padding);
279
+ .paddingInner(paddingRatio)
280
+ .paddingOuter(0.05)
281
+ .align(0);
272
282
  const xScaleFromOrigin = d3
273
283
  .scaleBand()
274
- .rangeRound([width - this.CONSTANTS.RIGHT_SVG_WIDTH, 0])
284
+ .rangeRound([width, 0])
275
285
  .domain(data.map(d => d.name).reverse());
276
286
  const yScale = d3.scaleLinear().rangeRound([height, 0]);
277
287
  let maxValue = d3.max(layers, (d) => d3.max(d, (d) => d[1]));
@@ -317,7 +327,7 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
317
327
  }
318
328
  return { xAxis, yAxis, yLineAxis };
319
329
  }
320
- renderBars(svg, layers, scales, metaData, dimensions, device) {
330
+ renderBars(svg, layers, scales, metaData, dimensions) {
321
331
  const layer = svg
322
332
  .selectAll('.layer')
323
333
  .data(layers)
@@ -329,11 +339,11 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
329
339
  .selectAll('rect')
330
340
  .data((d) => d)
331
341
  .enter();
332
- this.appendRectangles(rect, scales, metaData, dimensions, device);
342
+ this.appendRectangles(rect, scales, metaData, dimensions);
333
343
  this.addInteractions(rect, svg, metaData, scales);
334
344
  return rect;
335
345
  }
336
- appendRectangles(rect, scales, metaData, dimensions, device) {
346
+ appendRectangles(rect, scales, metaData, dimensions) {
337
347
  const { barWidth, barPadding } = dimensions;
338
348
  const { xScale, yScale } = scales;
339
349
  rect
@@ -352,17 +362,17 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
352
362
  }
353
363
  return 0;
354
364
  })
355
- .attr('x', (d, i) => {
356
- if (device.isMobile) {
357
- return this.CONSTANTS.LEFT_RIGHT_SPACES + i * (barWidth + barPadding);
358
- }
365
+ .attr('x', (d) => {
366
+ const xPosition = xScale(d.data.name);
367
+ const bandwidth = xScale.bandwidth();
359
368
  if (!this.chartConfiguration.isMultiChartGridLine) {
360
- return xScale(d.data.name);
369
+ return xPosition + (bandwidth - barWidth) / 2;
361
370
  }
362
371
  if (this.chartConfiguration.isDrilldownChart && this.chartData.data.length <= 3) {
363
- return xScale(d.data.name) + xScale.bandwidth() / 2 - 35;
372
+ return xPosition + bandwidth / 2 - 35;
364
373
  }
365
- return xScale(d.data.name) + xScale.bandwidth() * 0.1;
374
+ const calculatedWidth = bandwidth * 0.8;
375
+ return xPosition + (bandwidth - calculatedWidth) / 2;
366
376
  })
367
377
  .attr('height', (d) => {
368
378
  if (!isNaN(d[0]) && !isNaN(d[1])) {
@@ -372,10 +382,8 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
372
382
  return 0;
373
383
  })
374
384
  .attr('width', (d) => {
375
- if (device.isMobile)
376
- return barWidth;
377
385
  if (!this.chartConfiguration.isMultiChartGridLine)
378
- return xScale.bandwidth();
386
+ return barWidth;
379
387
  if (this.chartConfiguration.isDrilldownChart && this.chartData.data.length <= 3) {
380
388
  return 70;
381
389
  }
@@ -431,23 +439,13 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
431
439
  const value = d[1] - d[0];
432
440
  if (isNaN(value))
433
441
  return;
434
- const device = this.getDeviceConfig();
435
442
  const bandwidth = xScale.bandwidth();
436
- // Responsive tooltip width
437
- let width;
438
- if (device.isMobile) {
439
- width = Math.min(bandwidth + 40, 150);
440
- }
441
- else if (device.isTablet) {
442
- width = Math.min(bandwidth + 60, 200);
443
- }
444
- else {
445
- width = /week/i.test(d.data.name) && /\d{4}-\d{2}-\d{2}/.test(d.data.name)
446
- ? '250px'
447
- : bandwidth + this.CONSTANTS.LEFT_RIGHT_SPACES * 2 > 180
448
- ? '180px'
449
- : bandwidth + this.CONSTANTS.LEFT_RIGHT_SPACES * 2;
450
- }
443
+ // Fixed tooltip width for all resolutions
444
+ const width = /week/i.test(d.data.name) && /\d{4}-\d{2}-\d{2}/.test(d.data.name)
445
+ ? '250px'
446
+ : bandwidth + this.CONSTANTS.LEFT_RIGHT_SPACES * 2 > 180
447
+ ? '180px'
448
+ : bandwidth + this.CONSTANTS.LEFT_RIGHT_SPACES * 2;
451
449
  svg
452
450
  .append('foreignObject')
453
451
  .attr('x', this.calculateTooltipX(d, xScale, width))
@@ -486,12 +484,12 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
486
484
  .style('fill', (d) => this.getBarColor(d, metaData));
487
485
  svg.selectAll('.lib-verticalstack-title-ontop').remove();
488
486
  }
489
- renderAxisLabels(svg, svgYAxisLeft, metaData, dimensions, margin) {
487
+ renderAxisLabels(svg, svgYAxisLeft, bottomLabelContainer, metaData, dimensions, margin) {
490
488
  if (metaData.yLabel) {
491
489
  this.addYAxisLabel(svgYAxisLeft, metaData.yLabel, dimensions.height, margin);
492
490
  }
493
491
  if (metaData.xLabel) {
494
- this.addXAxisLabel(svg, metaData.xLabel, dimensions.width, dimensions.height, margin);
492
+ this.addXAxisLabel(bottomLabelContainer, metaData.xLabel);
495
493
  }
496
494
  }
497
495
  addYAxisLabel(svgYAxisLeft, label, height, margin) {
@@ -512,21 +510,18 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
512
510
  .text(isAcronym ? label.toUpperCase() : label.toLowerCase())
513
511
  .style('text-transform', isAcronym ? 'none' : 'capitalize');
514
512
  }
515
- addXAxisLabel(svg, label, width, height, margin) {
516
- const isria = this.customChartConfiguration?.isRia;
513
+ addXAxisLabel(bottomLabelContainer, label) {
517
514
  const isAcronym = this.isAcronymLabel(label);
518
- const xPosition = isria
519
- ? height + margin.top + margin.bottom
520
- : height + margin.top + margin.bottom + 10;
521
- svg
522
- .append('text')
523
- .attr('class', this.getXAxisLabelClass())
524
- .attr('style', this.chartConfiguration.xAxisCustomlabelStyles)
525
- .attr('transform', `translate(${width / 2},${xPosition})`)
526
- .style('text-anchor', 'middle')
527
- .style('fill', 'var(--chart-text-color)')
528
- .text(isAcronym ? label.toUpperCase() : label.toLowerCase())
529
- .style('text-transform', isAcronym ? 'none' : 'capitalize');
515
+ bottomLabelContainer
516
+ .append('div')
517
+ .style('width', '100%')
518
+ .style('text-align', 'center')
519
+ .style('font-size', '12px')
520
+ .style('font-weight', '600')
521
+ .style('font-family', 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto')
522
+ .style('color', 'var(--chart-text-color)')
523
+ .style('text-transform', isAcronym ? 'none' : 'capitalize')
524
+ .text(isAcronym ? label.toUpperCase() : label.toLowerCase());
530
525
  }
531
526
  isAcronymLabel(label) {
532
527
  const cleanLabel = label.replace(/[^A-Za-z]/g, '');
@@ -565,8 +560,10 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
565
560
  }
566
561
  }
567
562
  initializeStackedChart() {
568
- const device = this.getDeviceConfig();
569
- this.configureResponsiveSettings(device);
563
+ // Use fixed configuration for all resolutions
564
+ this.chartConfiguration.margin = { top: 20, right: 20, bottom: 40, left: 40 };
565
+ this.chartConfiguration.numberOfYTicks = 5;
566
+ this.chartConfiguration.svgHeight = 70;
570
567
  this.mergeConfigurations();
571
568
  this.applyConfigurationFlags();
572
569
  const data = this.chartData.data;
@@ -577,17 +574,18 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
577
574
  const chartContainer = d3.select(this.containerElt.nativeElement);
578
575
  const verticalstackedcontainer = d3.select(this.verticalstackedcontainerElt.nativeElement);
579
576
  const margin = this.chartConfiguration.margin;
580
- const dimensions = this.calculateDimensions(chartContainer, verticalstackedcontainer, margin, device, data.length);
581
- const { svg, svgYAxisLeft, svgYAxisRight } = this.createSvgContainers(chartContainer, dimensions, margin);
577
+ const dimensions = this.calculateDimensions(chartContainer, verticalstackedcontainer, margin, data.length);
578
+ const hasXLabel = !!metaData.xLabel;
579
+ const { svg, svgYAxisLeft, svgYAxisRight, bottomLabelContainer } = this.createSvgContainers(chartContainer, dimensions, margin, hasXLabel);
582
580
  const stack = d3.stack().keys(keyList).offset(d3.stackOffsetNone);
583
581
  const layers = stack(data);
584
582
  data.sort((a, b) => b.total - a.total);
585
- const scales = this.createScales(data, layers, lineData, dimensions, device);
583
+ const scales = this.createScales(data, layers, lineData, dimensions);
586
584
  const axes = this.createAxes(scales);
587
585
  this.renderGrids(svg, scales, dimensions);
588
- const rect = this.renderBars(svg, layers, scales, metaData, dimensions, device);
589
- this.renderAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions, device, data);
590
- this.renderAxisLabels(svg, svgYAxisLeft, metaData, dimensions, margin);
586
+ const rect = this.renderBars(svg, layers, scales, metaData, dimensions);
587
+ this.renderAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions, data);
588
+ this.renderAxisLabels(svg, svgYAxisLeft, bottomLabelContainer, metaData, dimensions, margin);
591
589
  this.renderTargetLine(svg, svgYAxisRight, scales, dimensions, metaData);
592
590
  this.renderDataLabels(rect, scales, metaData, dimensions);
593
591
  this.renderLineChart(svg, lineData, scales, colors, metaData);
@@ -596,7 +594,7 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
596
594
  if (this.chartConfiguration.isXgridBetweenLabels) {
597
595
  svg
598
596
  .append('g')
599
- .attr('class', 'grid')
597
+ .attr('class', 'grid vertical-grid')
600
598
  .attr('transform', `translate(${scales.xScale.bandwidth() / 2},${dimensions.height})`)
601
599
  .call(d3.axisBottom(scales.xScale).tickSize(-dimensions.height).tickFormat(''))
602
600
  .style('stroke-dasharray', '5 5')
@@ -604,16 +602,21 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
604
602
  .call((g) => g.select('.domain').remove());
605
603
  }
606
604
  if (this.chartConfiguration.yAxisGrid) {
605
+ const gridWidth = dimensions.requiredSvgWidth;
607
606
  svg
608
607
  .append('g')
609
- .attr('class', 'grid')
608
+ .attr('class', 'grid horizontal-grid')
609
+ .attr('transform', 'translate(0,0)')
610
610
  .call(d3
611
611
  .axisLeft(scales.yScale)
612
612
  .ticks(this.chartConfiguration.numberOfYTicks)
613
- .tickSize(-dimensions.width)
613
+ .tickSize(-gridWidth)
614
614
  .tickFormat(''))
615
615
  .style('color', 'var(--chart-grid-color)')
616
- .style('opacity', '1');
616
+ .style('opacity', '1')
617
+ .call((g) => {
618
+ g.select('.domain').remove();
619
+ });
617
620
  }
618
621
  if (this.chartConfiguration.xAxisGrid) {
619
622
  for (let j = 0; j < this.chartConfiguration.xAxisGrid.length; j++) {
@@ -627,7 +630,7 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
627
630
  }
628
631
  }
629
632
  }
630
- renderAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions, device, data) {
633
+ renderAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions, data) {
631
634
  if (this.chartConfiguration.showXaxisTop) {
632
635
  svg
633
636
  .append('g')
@@ -637,7 +640,7 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
637
640
  svg.selectAll('.x-axis > g > text').attr('class', 'lib-display-hidden');
638
641
  }
639
642
  if (!this.chartConfiguration.isMultiChartGridLine) {
640
- this.renderStandardAxes(svg, axes, scales, dimensions, device, data);
643
+ this.renderStandardAxes(svg, axes, scales, dimensions, data);
641
644
  }
642
645
  else if (this.chartConfiguration.isDrilldownChart) {
643
646
  this.renderDrilldownAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions);
@@ -648,24 +651,35 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
648
651
  this.applyAxisStyling(svg, svgYAxisLeft, svgYAxisRight);
649
652
  this.applyAxisConfigurations(svg, scales, dimensions, data);
650
653
  }
651
- renderStandardAxes(svg, axes, scales, dimensions, device, data) {
652
- if (device.isMobile) {
653
- this.renderMobileXAxis(svg, data, dimensions);
654
- }
655
- else {
656
- svg
657
- .append('g')
658
- .attr('transform', `translate(0,${dimensions.height})`)
659
- .attr('class', 'lib-stacked-x-axis-text')
660
- .call(axes.xAxis)
661
- .selectAll('text')
662
- .style('fill', 'var(--chart-text-color)')
663
- .style('font-size', '12px')
664
- .attr('text-anchor', 'middle')
665
- .attr('dx', '0')
666
- .attr('dy', '0.71em')
667
- .attr('transform', null);
668
- }
654
+ renderStandardAxes(svg, axes, scales, dimensions, data) {
655
+ const isMobileOrTablet = window.innerWidth < 1024;
656
+ // X-axis with labels
657
+ const xAxisGroup = svg
658
+ .append('g')
659
+ .attr('transform', `translate(0,${dimensions.height})`)
660
+ .attr('class', 'lib-stacked-x-axis-text')
661
+ .call(axes.xAxis);
662
+ // Style X-axis labels
663
+ xAxisGroup
664
+ .selectAll('text')
665
+ .style('fill', 'var(--chart-text-color)')
666
+ .style('font-size', isMobileOrTablet ? '10px' : '12px')
667
+ .attr('text-anchor', 'middle')
668
+ .attr('dy', '1em')
669
+ .each(function (d) {
670
+ const textElement = d3.select(this);
671
+ const text = textElement.text();
672
+ if (isMobileOrTablet && text.length > 12) {
673
+ textElement.text(text.substring(0, 10) + '...');
674
+ }
675
+ });
676
+ // Ensure X-axis line is visible
677
+ xAxisGroup
678
+ .select('.domain')
679
+ .style('stroke', 'var(--chart-axis-color)')
680
+ .style('stroke-width', '1px')
681
+ .attr('d', `M0,0.5H${dimensions.requiredSvgWidth}`);
682
+ // Y-axis
669
683
  svg
670
684
  .append('g')
671
685
  .attr('class', 'lib-stacked-y-axis-text')
@@ -674,27 +688,6 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
674
688
  .selectAll('text')
675
689
  .style('fill', 'var(--chart-text-color)');
676
690
  }
677
- renderMobileXAxis(svg, data, dimensions) {
678
- svg.selectAll('.custom-x-label').remove();
679
- const maxLength = Math.max(...data.map(d => d.name.length));
680
- const fontSize = maxLength > 10 ? '8px' : '10px';
681
- data.forEach((d, i) => {
682
- const xVal = this.CONSTANTS.LEFT_RIGHT_SPACES +
683
- i * (dimensions.barWidth + dimensions.barPadding) +
684
- dimensions.barWidth / 2;
685
- svg
686
- .append('text')
687
- .attr('class', 'custom-x-label')
688
- .attr('x', 0)
689
- .attr('y', dimensions.height + 18)
690
- .attr('text-anchor', 'middle')
691
- .attr('transform', `translate(${xVal + 20},0)`)
692
- .style('font-size', fontSize)
693
- .style('fill', 'var(--chart-text-color)')
694
- .style('writing-mode', 'sideways-lr')
695
- .text(d.name.length > 6 ? d.name.substring(0, 4) + '...' : d.name);
696
- });
697
- }
698
691
  renderDrilldownAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions) {
699
692
  svg
700
693
  .append('g')
@@ -776,7 +769,6 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
776
769
  }
777
770
  }
778
771
  renderCustomXAxis(svg, scales, dimensions, data) {
779
- const device = this.getDeviceConfig();
780
772
  svg
781
773
  .append('g')
782
774
  .attr('class', 'x1 axis1')
@@ -784,12 +776,12 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
784
776
  .style('color', '#000')
785
777
  .call(d3.axisBottom(scales.xScale).tickSize(0))
786
778
  .call((g) => g.select('.domain').attr('fill', 'none'));
787
- this.styleCustomXAxisTicks(svg, data, device);
779
+ this.styleCustomXAxisTicks(svg, data);
788
780
  if (this.chartConfiguration.xLabelsOnSameLine) {
789
- this.applyXLabelsOnSameLine(svg, device);
781
+ this.applyXLabelsOnSameLine(svg);
790
782
  }
791
783
  }
792
- styleCustomXAxisTicks(svg, data, device) {
784
+ styleCustomXAxisTicks(svg, data) {
793
785
  let alternateText = false;
794
786
  svg.selectAll('.x1.axis1 .tick line').attr('y2', () => {
795
787
  if (this.chartConfiguration.hideXaxisTick)
@@ -821,28 +813,17 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
821
813
  return this.CONSTANTS.SHORT_TICK_LENGTH_BG;
822
814
  });
823
815
  }
824
- applyXLabelsOnSameLine(svg, device) {
816
+ applyXLabelsOnSameLine(svg) {
825
817
  svg
826
818
  .selectAll('g.x1.axis1 g.tick text')
827
819
  .attr('class', 'lib-xaxis-labels-texts-drilldown')
828
820
  .attr('y', this.CONSTANTS.SHORT_TICK_LENGTH_BG)
829
821
  .text((d) => {
830
- if (device.isMobile) {
831
- return d.split(' ')[0].substring(0, 3);
832
- }
833
822
  const trimmed = d.trim();
834
823
  const spaceIndex = trimmed.indexOf(' ');
835
824
  return spaceIndex > -1
836
825
  ? trimmed.substring(0, spaceIndex).toLowerCase()
837
826
  : trimmed.toLowerCase();
838
- })
839
- .attr('transform', function (d, i) {
840
- if (device.isMobile) {
841
- const parent = this.parentNode?.parentNode;
842
- const totalBars = parent ? d3.select(parent).selectAll('g.tick').size() : 0;
843
- return totalBars === 2 ? 'translate(0,0)' : `translate(${i * 30},0)`;
844
- }
845
- return null;
846
827
  });
847
828
  svg
848
829
  .selectAll('g.x1.axis1 g.tick')
@@ -851,16 +832,11 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
851
832
  .attr('y', this.CONSTANTS.LONG_TICK_LENGTH_BG)
852
833
  .attr('fill', 'currentColor')
853
834
  .text((d) => {
854
- if (device.isMobile)
855
- return '';
856
835
  const trimmed = d.trim();
857
836
  const spaceIndex = trimmed.indexOf(' ');
858
837
  return spaceIndex > -1
859
838
  ? trimmed.substring(spaceIndex).toLowerCase()
860
839
  : '';
861
- })
862
- .attr('transform', (d, i) => {
863
- return device.isMobile && i === 0 ? 'translate(20,0)' : null;
864
840
  });
865
841
  }
866
842
  renderDataLabels(rect, scales, metaData, dimensions) {
@@ -1051,11 +1027,11 @@ export class HorizontalBarsWithScrollZoomComponent extends ComponentUniqueId {
1051
1027
  this.isZoomOutSelected(isZoomOut);
1052
1028
  }
1053
1029
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HorizontalBarsWithScrollZoomComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1054
- 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:12px}.lib-axis-group-label{font-size:12px;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:11px;line-height:13px;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;padding:4px 8px;box-sizing:border-box}.title-top-text{color:var(--font-color)!important;font-size:12px;font-weight:600}.title-bar-name{color:var(--font-color)!important;font-size:14px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:var(--font-color)!important;font-size:11px}.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}.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}@media (max-width: 767px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:9px!important}.lib-axis-group-label{font-size:10px!important}.dots{font-size:8px!important}.lib-xaxis-labels-texts-drilldown{writing-mode:sideways-lr;font-size:9px!important}.target-display{font-size:9px;line-height:11px}.title-top-text{font-size:10px}.title-bar-name{font-size:12px}.zoomIcons{width:26px;height:26px}.lib-verticalstack-labels-ontop-weklycharts{font-size:9px}}@media (min-width: 768px) and (max-width: 1023px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.lib-axis-group-label{font-size:11px!important}.dots{font-size:9px!important}.target-display{font-size:10px;line-height:12px}.title-top-text{font-size:11px}.title-bar-name{font-size:13px}.zoomIcons{width:28px;height:28px}}@media (min-width: 1024px) and (max-width: 1365px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:11px!important}.lib-axis-group-label{font-size:12px!important}.dots{font-size:10px!important}}@media (min-width: 1366px) and (max-width: 1919px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.lib-axis-group-label{font-size:13px!important}.dots{font-size:11px!important}}@media (min-width: 1920px) and (max-width: 2559px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.lib-axis-group-label{font-size:14px!important}.dots{font-size:12px!important}.target-display{font-size:13px;line-height:15px}.title-top-text{font-size:14px}.title-bar-name{font-size:16px}}@media (min-width: 2560px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.lib-axis-group-label{font-size:15px!important}.dots{font-size:14px!important}.target-display{font-size:14px;line-height:16px}.title-top-text{font-size:15px}.title-bar-name{font-size:18px}.zoomIcons{width:34px;height:34px}}@media (orientation: portrait) and (max-width: 767px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:8px!important}.lib-xaxis-labels-texts-drilldown{font-size:8px!important}}@media (orientation: landscape) and (min-width: 768px) and (max-width: 1023px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:11px!important}}\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 }); }
1030
+ 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:12px}.lib-axis-group-label{font-size:12px;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:11px;line-height:13px;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;padding:4px 8px;box-sizing:border-box}.title-top-text{color:var(--font-color)!important;font-size:12px;font-weight:600}.title-bar-name{color:var(--font-color)!important;font-size:14px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:var(--font-color)!important;font-size:11px}.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}.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}.lib-xaxis-labels-texts-drilldown,.lib-xaxis-labels-texts-drilldown-alt,.lib-xaxis-labels-texts-weeklycharts{font-size:12px}.lib-display-hidden{display:none!important}.chart-wrapper-main{position:relative;width:100%;box-sizing:border-box}.left-axis-container,.right-axis-container{pointer-events:none;overflow:hidden;-webkit-user-select:none;user-select:none}.scrollable-chart-container{-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.scrollable-chart-container::-webkit-scrollbar{height:8px}.scrollable-chart-container::-webkit-scrollbar-track{background:#f1f1f1;border-radius:4px}.scrollable-chart-container::-webkit-scrollbar-thumb{background:#888;border-radius:4px}.scrollable-chart-container::-webkit-scrollbar-thumb:hover{background:#555}.inner-chart-container{position:relative}.grid line{stroke-width:1;shape-rendering:crispEdges}.horizontal-grid line{stroke-opacity:.7}.vertical-grid line{stroke-opacity:.7}.lib-y-axis-hidden{opacity:0!important;pointer-events:none}.lib-stacked-x-axis-text .domain{stroke:var(--chart-axis-color);stroke-width:1px}.lib-stacked-x-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;font-size:12px;fill:var(--chart-text-color)}.lib-stacked-y-axis-text .domain{stroke:var(--chart-axis-color);stroke-width:1px}.lib-stacked-y-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;font-size:12px;fill:var(--chart-text-color)}@media (max-width: 1024px){.scrollable-chart-container::-webkit-scrollbar{height:6px}.lib-stacked-x-axis-text text{font-size:10px}}@media (max-width: 768px){.scrollable-chart-container::-webkit-scrollbar{height:4px}}\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 }); }
1055
1031
  }
1056
1032
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HorizontalBarsWithScrollZoomComponent, decorators: [{
1057
1033
  type: Component,
1058
- 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:12px}.lib-axis-group-label{font-size:12px;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:11px;line-height:13px;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;padding:4px 8px;box-sizing:border-box}.title-top-text{color:var(--font-color)!important;font-size:12px;font-weight:600}.title-bar-name{color:var(--font-color)!important;font-size:14px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:var(--font-color)!important;font-size:11px}.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}.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}@media (max-width: 767px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:9px!important}.lib-axis-group-label{font-size:10px!important}.dots{font-size:8px!important}.lib-xaxis-labels-texts-drilldown{writing-mode:sideways-lr;font-size:9px!important}.target-display{font-size:9px;line-height:11px}.title-top-text{font-size:10px}.title-bar-name{font-size:12px}.zoomIcons{width:26px;height:26px}.lib-verticalstack-labels-ontop-weklycharts{font-size:9px}}@media (min-width: 768px) and (max-width: 1023px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.lib-axis-group-label{font-size:11px!important}.dots{font-size:9px!important}.target-display{font-size:10px;line-height:12px}.title-top-text{font-size:11px}.title-bar-name{font-size:13px}.zoomIcons{width:28px;height:28px}}@media (min-width: 1024px) and (max-width: 1365px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:11px!important}.lib-axis-group-label{font-size:12px!important}.dots{font-size:10px!important}}@media (min-width: 1366px) and (max-width: 1919px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.lib-axis-group-label{font-size:13px!important}.dots{font-size:11px!important}}@media (min-width: 1920px) and (max-width: 2559px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.lib-axis-group-label{font-size:14px!important}.dots{font-size:12px!important}.target-display{font-size:13px;line-height:15px}.title-top-text{font-size:14px}.title-bar-name{font-size:16px}}@media (min-width: 2560px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.lib-axis-group-label{font-size:15px!important}.dots{font-size:14px!important}.target-display{font-size:14px;line-height:16px}.title-top-text{font-size:15px}.title-bar-name{font-size:18px}.zoomIcons{width:34px;height:34px}}@media (orientation: portrait) and (max-width: 767px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:8px!important}.lib-xaxis-labels-texts-drilldown{font-size:8px!important}}@media (orientation: landscape) and (min-width: 768px) and (max-width: 1023px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:11px!important}}\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"] }]
1034
+ 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:12px}.lib-axis-group-label{font-size:12px;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:11px;line-height:13px;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;padding:4px 8px;box-sizing:border-box}.title-top-text{color:var(--font-color)!important;font-size:12px;font-weight:600}.title-bar-name{color:var(--font-color)!important;font-size:14px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:var(--font-color)!important;font-size:11px}.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}.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}.lib-xaxis-labels-texts-drilldown,.lib-xaxis-labels-texts-drilldown-alt,.lib-xaxis-labels-texts-weeklycharts{font-size:12px}.lib-display-hidden{display:none!important}.chart-wrapper-main{position:relative;width:100%;box-sizing:border-box}.left-axis-container,.right-axis-container{pointer-events:none;overflow:hidden;-webkit-user-select:none;user-select:none}.scrollable-chart-container{-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.scrollable-chart-container::-webkit-scrollbar{height:8px}.scrollable-chart-container::-webkit-scrollbar-track{background:#f1f1f1;border-radius:4px}.scrollable-chart-container::-webkit-scrollbar-thumb{background:#888;border-radius:4px}.scrollable-chart-container::-webkit-scrollbar-thumb:hover{background:#555}.inner-chart-container{position:relative}.grid line{stroke-width:1;shape-rendering:crispEdges}.horizontal-grid line{stroke-opacity:.7}.vertical-grid line{stroke-opacity:.7}.lib-y-axis-hidden{opacity:0!important;pointer-events:none}.lib-stacked-x-axis-text .domain{stroke:var(--chart-axis-color);stroke-width:1px}.lib-stacked-x-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;font-size:12px;fill:var(--chart-text-color)}.lib-stacked-y-axis-text .domain{stroke:var(--chart-axis-color);stroke-width:1px}.lib-stacked-y-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;font-size:12px;fill:var(--chart-text-color)}@media (max-width: 1024px){.scrollable-chart-container::-webkit-scrollbar{height:6px}.lib-stacked-x-axis-text text{font-size:10px}}@media (max-width: 768px){.scrollable-chart-container::-webkit-scrollbar{height:4px}}\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"] }]
1059
1035
  }], ctorParameters: () => [], propDecorators: { containerElt: [{
1060
1036
  type: ViewChild,
1061
1037
  args: ['verticalstackedchartcontainer', { static: true }]
@@ -1071,4 +1047,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1071
1047
  }], headerMenuclickEvent: [{
1072
1048
  type: Output
1073
1049
  }] } });
1074
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2hvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tL2hvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FFbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQXlEbEQsTUFBTSxPQUFPLHFDQUNYLFNBQVEsaUJBQWlCO0lBa0Z6QjtRQUNFLEtBQUssRUFBRSxDQUFDO1FBeEVBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUMzQixhQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxD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QUM7SUFFRCxxQkFBcUIsQ0FBQyxFQUFPO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELDhCQUE4QixDQUFDLEtBQVU7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELHdCQUF3QixDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBc0M7UUFDL0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7K0dBeHZDVSxxQ0FBcUM7bUdBQXJDLHFDQUFxQyw0akJDeEVsRCxvbkNBK0JBOzs0RkR5Q2EscUNBQXFDO2tCQVRqRCxTQUFTOytCQUNFLHNDQUFzQyxpQkFNakMsaUJBQWlCLENBQUMsSUFBSTt3REFPckMsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLCtCQUErQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJNUQsMkJBQTJCO3NCQUQxQixTQUFTO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHOUMsU0FBUztzQkFBakIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBPbkNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFVuaXF1ZUlkIH0gZnJvbSAnLi4vdW5pcXVlLWlkJztcclxuaW1wb3J0IENoYXJ0SGVscGVyIGZyb20gJy4uL2NoYXJ0LWhlbHBlcic7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuLy8gVHlwZXNcclxuaW50ZXJmYWNlIENoYXJ0RGF0YSB7XHJcbiAgZGF0YTogYW55W107XHJcbiAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGE7XHJcbiAgbGluZURhdGE/OiBhbnlbXTtcclxuICB0YXJnZXRMaW5lRGF0YT86IFRhcmdldExpbmVEYXRhO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ2hhcnRNZXRhRGF0YSB7XHJcbiAgdW5pdD86IHN0cmluZztcclxuICBpc0NDPzogYm9vbGVhbjtcclxuICBiYXJXaXRob3V0Q2xpY2s/OiBzdHJpbmdbXTtcclxuICBjb2xvcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAga2V5TGlzdDogc3RyaW5nW107XHJcbiAgZGF0YVR5cGU/OiBzdHJpbmc7XHJcbiAgaGFzRHJpbGxEb3duPzogYm9vbGVhbjtcclxuICBob3ZlckNvbG9yPzogc3RyaW5nO1xyXG4gIHlMYWJlbD86IHN0cmluZztcclxuICB4TGFiZWw/OiBzdHJpbmc7XHJcbiAgbGluZXlMYWJlbD86IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIFRhcmdldExpbmVEYXRhIHtcclxuICB0YXJnZXQ6IHN0cmluZyB8IG51bWJlcjtcclxuICBjb2xvcjogc3RyaW5nO1xyXG4gIHRhcmdldE5hbWU/OiBzdHJpbmc7XHJcbiAgYmFyQWJvdmVUYXJnZXRDb2xvcj86IHN0cmluZztcclxuICBiYXJBYm92ZVRhcmdldEhvdmVyQ29sb3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBEaW1lbnNpb25zIHtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIGNvbnRhaW5lcldpZHRoOiBudW1iZXI7XHJcbiAgY29udGFpbmVySGVpZ2h0OiBudW1iZXI7XHJcbiAgYmFyV2lkdGg6IG51bWJlcjtcclxuICBiYXJQYWRkaW5nOiBudW1iZXI7XHJcbiAgcmVxdWlyZWRTdmdXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRGV2aWNlQ29uZmlnIHtcclxuICBpc01vYmlsZTogYm9vbGVhbjtcclxuICBpc1RhYmxldDogYm9vbGVhbjtcclxuICBpc0Rlc2t0b3A6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWhvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW1xyXG4gICAgJy4vaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50Lmxlc3MnLFxyXG4gICAgJy4uL2NvbW1vbi1zdHlsZXMubGVzcycsXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSG9yaXpvbnRhbEJhcnNXaXRoU2Nyb2xsWm9vbUNvbXBvbmVudFxyXG4gIGV4dGVuZHMgQ29tcG9uZW50VW5pcXVlSWRcclxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgXHJcbiAgQFZpZXdDaGlsZCgndmVydGljYWxzdGFja2VkY2hhcnRjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgdmVydGljYWxzdGFja2VkY29udGFpbmVyRWx0ITogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCkgY2hhcnREYXRhOiBDaGFydERhdGEgfCBhbnkgO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgaXNIZWFkZXJWaXNpYmxlID0gdHJ1ZTtcclxuICBpc1RvcENhcHRpb25WaXNpYmxlID0gdHJ1ZTtcclxuICB1bmlxdWVJZCA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZCA9IGZhbHNlO1xyXG4gIGlzQ0MgPSBmYWxzZTtcclxuICBpc1pvb21lZE91dCA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgQ09OU1RBTlRTID0ge1xyXG4gICAgUklHSFRfU1ZHX1dJRFRIOiA2MCxcclxuICAgIExFRlRfUklHSFRfU1BBQ0VTOiA1MCxcclxuICAgIFNIT1JUX1RJQ0tfTEVOR1RIOiA0LFxyXG4gICAgTE9OR19USUNLX0xFTkdUSDogMTYsXHJcbiAgICBTSE9SVF9USUNLX0xFTkdUSF9CRzogNSxcclxuICAgIExPTkdfVElDS19MRU5HVEhfQkc6IDMwLFxyXG4gICAgTUlOX01PQklMRV9CQVJfV0lEVEg6IDI4LCAgICAgICAgLy8gQWRqdXN0ZWQgZm9yIGJldHRlciBtb2JpbGUgZml0XHJcbiAgICBERVNLVE9QX01JTl9CQVJfV0lEVEg6IDQwLFxyXG4gICAgVEFCTEVUX01JTl9CQVJfV0lEVEg6IDM1LCAgICAgICAgLy8gQWRkZWQgdGFibGV0LXNwZWNpZmljIHdpZHRoXHJcbiAgICBNT0JJTEVfQkFSX1BBRERJTkc6IDEwLCAgICAgICAgICAvLyBSZWR1Y2VkIHBhZGRpbmcgZm9yIG1vYmlsZVxyXG4gICAgVEFCTEVUX0JBUl9QQURESU5HOiA4LCAgICAgICAgICAgLy8gQWRkZWQgdGFibGV0LXNwZWNpZmljIHBhZGRpbmdcclxuICAgIFpPT01fVEhSRVNIT0xEOiAzMCxcclxuICAgIFpPT01fSU5fVEhSRVNIT0xEOiA4LFxyXG4gIH07XHJcblxyXG4gIGRlZmF1bHRDb25maWd1cmF0aW9uID0ge1xyXG4gICAgbWFyZ2luOiB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiAyMCwgbGVmdDogNDAgfSxcclxuICAgIHN2Z0hlaWdodDogNzAsXHJcbiAgICBsZWdlbmRIZWlnaHQ6ICcxMCUnLFxyXG4gICAgbnVtYmVyT2ZZVGlja3M6IDUsXHJcbiAgICBsYWJlbEZvcm1hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHhBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHlBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHlMaW5lQXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICBsaW5lR3JhcGhDb2xvcjogJyNGNkQyODMnLFxyXG4gICAgc2hvd0xpbmVDaGFydEF4aXM6IHRydWUsXHJcbiAgICBzaG93TGVnZW5kOiBmYWxzZSxcclxuICAgIGZvckNvbXBhcmlzb246IHRydWUsXHJcbiAgICBoZWFkZXJNZW51T3B0aW9uczogSGVhZGVyQ29uZmlnSGVscGVyLmhlYWRlckNvbmZpZy5oZWFkZXJNZW51T3B0aW9ucyxcclxuICAgIHlBeGlzR3JpZDogZmFsc2UsXHJcbiAgICAvLyBPcHRpb25hbCBjb25maWdzIHdpdGggdW5kZWZpbmVkIGRlZmF1bHRzXHJcbiAgICBpc0hlYWRlclZpc2libGU6IHVuZGVmaW5lZCxcclxuICAgIGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kOiB1bmRlZmluZWQsXHJcbiAgICBpc1RvcENhcHRpb25WaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBpc011bHRpQ2hhcnRHcmlkTGluZTogdW5kZWZpbmVkLFxyXG4gICAgaXNGdWxsU2NyZWVuOiB1bmRlZmluZWQsXHJcbiAgICBjdXN0b21Zc2NhbGU6IHVuZGVmaW5lZCxcclxuICAgIGlzWGF4aXNMYWJlbEhpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNZYXhpc0xhYmVsSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBpc1lheGlzSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBpc1lheGlzRGFzaGVkOiB1bmRlZmluZWQsXHJcbiAgICBpc1hheGlzQ29sb3I6IHVuZGVmaW5lZCxcclxuICAgIHRleHRGb3JtYXR0ZXI6IHVuZGVmaW5lZCxcclxuICAgIHNob3dUb3RhbE9uVG9wOiB1bmRlZmluZWQsXHJcbiAgICBiYWNrZW5kRm9ybWF0dGVySGFzUHJpb3JpdHk6IHVuZGVmaW5lZCxcclxuICAgIHNob3dBbmdsZWRMYWJlbHM6IHVuZGVmaW5lZCxcclxuICAgIGlzTm9BbHRlcm5hdGVYYXhpc1RleHQ6IHVuZGVmaW5lZCxcclxuICAgIGlzWGdyaWRCZXR3ZWVuTGFiZWxzOiB1bmRlZmluZWQsXHJcbiAgICBzaG93WGF4aXNUb3A6IHVuZGVmaW5lZCxcclxuICAgIHhBeGlzR3JpZDogdW5kZWZpbmVkLFxyXG4gICAgeExhYmVsc09uU2FtZUxpbmU6IHVuZGVmaW5lZCxcclxuICAgIGhpZGVYYXhpc1RpY2s6IHVuZGVmaW5lZCxcclxuICAgIGlzRHJpbGxkb3duQ2hhcnQ6IHVuZGVmaW5lZCxcclxuICAgIGlzVGFyZ2V0TGluZTogdW5kZWZpbmVkLFxyXG4gICAgZGlzcGxheVRpdGxlT25Ub3A6IHVuZGVmaW5lZCxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgaXNUaXRsZUhpZGRlbjogdW5kZWZpbmVkLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5yZW1vdmVFeGlzdGluZ0NoYXJ0KCk7XHJcbiAgICB0aGlzLmluaXRpYWxpemVTdGFja2VkQ2hhcnQoKTtcclxuICB9XHJcblxyXG4gIG9uUmVzaXplZChldmVudDogUmVzaXplZEV2ZW50KSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZW1vdmVFeGlzdGluZ0NoYXJ0KCk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0YWNrZWRDaGFydCgpO1xyXG4gICAgfSwgMTApO1xyXG4gIH1cclxuXHJcbiAgaXNab29tT3V0U2VsZWN0ZWQoaXNab29tT3V0OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmlzWm9vbWVkT3V0ID0gaXNab29tT3V0O1xyXG4gICAgdGhpcy5uZ09uQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVFeGlzdGluZ0NoYXJ0KCkge1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHRoaXMudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREZXZpY2VDb25maWcoKTogRGV2aWNlQ29uZmlnIHtcclxuICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpc01vYmlsZTogd2lkdGggPCA3NjgsICAgICAgLy8gQ2hhbmdlZCBmcm9tIDU3NiB0byA3NjggZm9yIGJldHRlciBtb2JpbGUgY292ZXJhZ2VcclxuICAgICAgaXNUYWJsZXQ6IHdpZHRoID49IDc2OCAmJiB3aWR0aCA8IDEwMjQsICAvLyBDaGFuZ2VkIGZyb20gNTc2LTk5MiB0byA3NjgtMTAyNFxyXG4gICAgICBpc0Rlc2t0b3A6IHdpZHRoID49IDEwMjQsICAgLy8gQ2hhbmdlZCBmcm9tIDk5MiB0byAxMDI0XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVSZXNwb25zaXZlU2V0dGluZ3MoZGV2aWNlOiBEZXZpY2VDb25maWcpIHtcclxuICAgIGlmIChkZXZpY2UuaXNNb2JpbGUpIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luID0geyB0b3A6IDE1LCByaWdodDogNSwgYm90dG9tOiAzNSwgbGVmdDogMjUgfTtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MgPSA0O1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgPSA1NTtcclxuICAgIH0gZWxzZSBpZiAoZGV2aWNlLmlzVGFibGV0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbiA9IHsgdG9wOiAyMCwgcmlnaHQ6IDE1LCBib3R0b206IDQwLCBsZWZ0OiAzNSB9O1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcyA9IDU7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCA9IDY1O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRGVza3RvcC9MYXJnZSBzY3JlZW5zXHJcbiAgICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICAgIGlmICh3aWR0aCA+PSAxOTIwKSB7XHJcbiAgICAgICAgLy8gTGFyZ2UgbW9uaXRvcnNcclxuICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4gPSB7IHRvcDogMzUsIHJpZ2h0OiAzNSwgYm90dG9tOiA1NSwgbGVmdDogNzAgfTtcclxuICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcyA9IDg7XHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ID0gODU7XHJcbiAgICAgIH0gZWxzZSBpZiAod2lkdGggPj0gMTM2Nikge1xyXG4gICAgICAgIC8vIE1lZGl1bSBtb25pdG9yc1xyXG4gICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbiA9IHsgdG9wOiAzMCwgcmlnaHQ6IDMwLCBib3R0b206IDUwLCBsZWZ0OiA2MCB9O1xyXG4gICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzID0gNztcclxuICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgPSA4MDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBTbWFsbCBkZXNrdG9wcy9sYXB0b3BzXHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luID0geyB0b3A6IDI1LCByaWdodDogMjUsIGJvdHRvbTogNDUsIGxlZnQ6IDUwIH07XHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MgPSA2O1xyXG4gICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCA9IDc1O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlQ29uZmlndXJhdGlvbnMoKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZU1ldGFEYXRhKG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKTogQ2hhcnRNZXRhRGF0YSB7XHJcbiAgICBpZiAoIW1ldGFEYXRhLnVuaXQpIG1ldGFEYXRhLnVuaXQgPSAnJztcclxuICAgIGlmIChtZXRhRGF0YS5pc0NDKSB0aGlzLmlzQ0MgPSBtZXRhRGF0YS5pc0NDO1xyXG4gICAgXHJcbiAgICBpZiAobWV0YURhdGEuYmFyV2l0aG91dENsaWNrPy5sZW5ndGgpIHtcclxuICAgICAgbWV0YURhdGEuYmFyV2l0aG91dENsaWNrID0gbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLm1hcChlbCA9PiBlbC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1ldGFEYXRhLmJhcldpdGhvdXRDbGljayA9IFtdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gbWV0YURhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZURpbWVuc2lvbnMoXHJcbiAgICBjaGFydENvbnRhaW5lcjogYW55LFxyXG4gICAgdmVydGljYWxDb250YWluZXI6IGFueSxcclxuICAgIG1hcmdpbjogYW55LFxyXG4gICAgZGV2aWNlOiBEZXZpY2VDb25maWcsXHJcbiAgICBkYXRhTGVuZ3RoOiBudW1iZXJcclxuICApOiBEaW1lbnNpb25zIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY2hhcnRDb250YWluZXIubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xyXG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdmVydGljYWxDb250YWluZXIubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcclxuICAgIGxldCB3aWR0aCA9IGNvbnRhaW5lcldpZHRoIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgICBsZXQgaGVpZ2h0ID0gY29udGFpbmVySGVpZ2h0ICogKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCAvIDEwMCkgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbTtcclxuXHJcbiAgICAvLyBSZXNwb25zaXZlIHpvb20gaGFuZGxpbmdcclxuICAgIGlmIChkYXRhTGVuZ3RoID4gdGhpcy5DT05TVEFOVFMuWk9PTV9USFJFU0hPTEQgJiYgdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgICBjb25zdCBtaW5XaWR0aCA9IGRldmljZS5pc01vYmlsZSBcclxuICAgICAgICA/IGRhdGFMZW5ndGggKiAxMiBcclxuICAgICAgICA6IGRldmljZS5pc1RhYmxldCBcclxuICAgICAgICAgID8gZGF0YUxlbmd0aCAqIDIwIFxyXG4gICAgICAgICAgOiBkYXRhTGVuZ3RoICogMjU7XHJcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIG1pbldpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YUxlbmd0aCA+IHRoaXMuQ09OU1RBTlRTLlpPT01fSU5fVEhSRVNIT0xEICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICAgIHdpZHRoID0gZGV2aWNlLmlzTW9iaWxlIFxyXG4gICAgICAgID8gZGF0YUxlbmd0aCAqIDUwIFxyXG4gICAgICAgIDogZGV2aWNlLmlzVGFibGV0IFxyXG4gICAgICAgICAgPyBkYXRhTGVuZ3RoICogOTAgXHJcbiAgICAgICAgICA6IGRhdGFMZW5ndGggKiAxMzA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgIT09IDgwXHJcbiAgICAgICAgPyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcclxuICAgICAgICA6IGNvbnRhaW5lckhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSBkZXZpY2UuaXNNb2JpbGUgPyA2MCA6IGRldmljZS5pc1RhYmxldCA/IDkwIDogMTMwO1xyXG4gICAgICBoZWlnaHQgPSBjb250YWluZXJIZWlnaHQgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbSAtIG9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYmFyV2lkdGg6IG51bWJlcjtcclxuICAgIGxldCBiYXJQYWRkaW5nOiBudW1iZXI7XHJcbiAgICBsZXQgcmVxdWlyZWRTdmdXaWR0aDogbnVtYmVyO1xyXG5cclxuICAgIGlmIChkZXZpY2UuaXNNb2JpbGUpIHtcclxuICAgICAgYmFyV2lkdGggPSB0aGlzLkNPTlNUQU5UUy5NSU5fTU9CSUxFX0JBUl9XSURUSDtcclxuICAgICAgYmFyUGFkZGluZyA9IHRoaXMuQ09OU1RBTlRTLk1PQklMRV9CQVJfUEFERElORztcclxuICAgICAgcmVxdWlyZWRTdmdXaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgIHdpZHRoIC0gdGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRILFxyXG4gICAgICAgIChiYXJXaWR0aCArIGJhclBhZGRpbmcpICogZGF0YUxlbmd0aCArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMiArIFxyXG4gICAgICAgIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSCAtIGJhclBhZGRpbmdcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAoZGV2aWNlLmlzVGFibGV0KSB7XHJcbiAgICAgIGJhcldpZHRoID0gdGhpcy5DT05TVEFOVFMuVEFCTEVUX01JTl9CQVJfV0lEVEg7XHJcbiAgICAgIGJhclBhZGRpbmcgPSB0aGlzLkNPTlNUQU5UUy5UQUJMRVRfQkFSX1BBRERJTkc7XHJcbiAgICAgIHJlcXVpcmVkU3ZnV2lkdGggPSBNYXRoLm1heChcclxuICAgICAgICB3aWR0aCAtIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSCxcclxuICAgICAgICAoYmFyV2lkdGggKyBiYXJQYWRkaW5nKSAqIGRhdGFMZW5ndGggKyB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyAqIDJcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJhcldpZHRoID0gTWF0aC5tYXgoXHJcbiAgICAgICAgdGhpcy5DT05TVEFOVFMuREVTS1RPUF9NSU5fQkFSX1dJRFRILFxyXG4gICAgICAgICh3aWR0aCAtIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSCAtIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMikgLyBkYXRhTGVuZ3RoXHJcbiAgICAgICk7XHJcbiAgICAgIGJhclBhZGRpbmcgPSAwO1xyXG4gICAgICByZXF1aXJlZFN2Z1dpZHRoID0gd2lkdGggLSB0aGlzLkNPTlNUQU5UUy5SSUdIVF9TVkdfV0lEVEg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodCxcclxuICAgICAgY29udGFpbmVyV2lkdGgsXHJcbiAgICAgIGNvbnRhaW5lckhlaWdodCxcclxuICAgICAgYmFyV2lkdGgsXHJcbiAgICAgIGJhclBhZGRpbmcsXHJcbiAgICAgIHJlcXVpcmVkU3ZnV2lkdGgsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdmdDb250YWluZXJzKFxyXG4gICAgY2hhcnRDb250YWluZXI6IGFueSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBtYXJnaW46IGFueVxyXG4gICkge1xyXG4gICAgY29uc3Qgb3V0ZXJDb250YWluZXIgPSBjaGFydENvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAuYXR0cignaWQnLCB0aGlzLnVuaXF1ZUlkKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnb3V0ZXItY29udGFpbmVyJylcclxuICAgICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgICAgLnN0eWxlKCdoZWlnaHQnLCBkaW1lbnNpb25zLmhlaWdodClcclxuICAgICAgLnN0eWxlKCdvdmVyZmxvdy14JywgJ2hpZGRlbicpXHJcbiAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgYCR7bWFyZ2luLmxlZnR9cHhgKVxyXG4gICAgICAuc3R5bGUoJ21hcmdpbi1sZWZ0JywgJzEwcHgnKVxyXG4gICAgICAuc3R5bGUoJ3BhZGRpbmctcmlnaHQnLCBgJHt0aGlzLkNPTlNUQU5UUy5SSUdIVF9TVkdfV0lEVEh9cHhgKTtcclxuXHJcbiAgICBjb25zdCBzdmdZQXhpc0xlZnQgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnODAnKVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgZGltZW5zaW9ucy5oZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSlcclxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgIC5zdHlsZSgnbGVmdCcsICcwJylcclxuICAgICAgLnN0eWxlKCd6LWluZGV4JywgMSlcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7bWFyZ2luLmxlZnQgKyAxMH0sJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgICBjb25zdCBzdmdZQXhpc1JpZ2h0ID0gb3V0ZXJDb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgdGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIKVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgZGltZW5zaW9ucy5oZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSlcclxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgIC5zdHlsZSgncmlnaHQnLCAnMnB4JylcclxuICAgICAgLnN0eWxlKCd6LWluZGV4JywgMSlcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgICBjb25zdCBpbm5lckNvbnRhaW5lciA9IG91dGVyQ29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdpbm5lci1jb250YWluZXInKVxyXG4gICAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgICAuc3R5bGUoJ292ZXJmbG93LXgnLCAnYXV0bycpO1xyXG5cclxuICAgIGNvbnN0IHN2ZyA9IGlubmVyQ29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGRpbWVuc2lvbnMucmVxdWlyZWRTdmdXaWR0aClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGRpbWVuc2lvbnMuaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAzMClcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgICByZXR1cm4geyBzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgaW5uZXJDb250YWluZXIgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2NhbGVzKFxyXG4gICAgZGF0YTogYW55W10sXHJcbiAgICBsYXllcnM6IGFueVtdLFxyXG4gICAgbGluZURhdGE6IGFueVtdLFxyXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcclxuICAgIGRldmljZTogRGV2aWNlQ29uZmlnXHJcbiAgKSB7XHJcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGJhcldpZHRoLCBiYXJQYWRkaW5nIH0gPSBkaW1lbnNpb25zO1xyXG4gICAgXHJcbiAgICAvLyBBZGp1c3QgcGFkZGluZyBiYXNlZCBvbiBkZXZpY2VcclxuICAgIGNvbnN0IHBhZGRpbmcgPSBkZXZpY2UuaXNNb2JpbGUgPyAwLjE1IDogZGV2aWNlLmlzVGFibGV0ID8gMC4zIDogMC41O1xyXG4gICAgXHJcbiAgICBjb25zdCB4U2NhbGUgPSBkM1xyXG4gICAgICAuc2NhbGVCYW5kKClcclxuICAgICAgLnJhbmdlUm91bmQoW1xyXG4gICAgICAgIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTLFxyXG4gICAgICAgIHdpZHRoIC0gdGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIIC0gdGhpcy5DT05TVEFOVFMuTEVGVF9SSUdIVF9TUEFDRVNcclxuICAgICAgXSlcclxuICAgICAgLmRvbWFpbihkYXRhLm1hcChkID0+IGQubmFtZSkucmV2ZXJzZSgpKVxyXG4gICAgICAucGFkZGluZyhwYWRkaW5nKTtcclxuXHJcbiAgICBjb25zdCB4U2NhbGVGcm9tT3JpZ2luID0gZDNcclxuICAgICAgLnNjYWxlQmFuZCgpXHJcbiAgICAgIC5yYW5nZVJvdW5kKFt3aWR0aCAtIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSCwgMF0pXHJcbiAgICAgIC5kb21haW4oZGF0YS5tYXAoZCA9PiBkLm5hbWUpLnJldmVyc2UoKSk7XHJcblxyXG4gICAgY29uc3QgeVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKS5yYW5nZVJvdW5kKFtoZWlnaHQsIDBdKTtcclxuICAgIFxyXG4gICAgbGV0IG1heFZhbHVlID0gZDMubWF4KGxheWVycywgKGQ6IGFueSkgPT4gZDMubWF4KGQsIChkOiBhbnkpID0+IGRbMV0pKTtcclxuICAgIFxyXG4gICAgaWYgKG1heFZhbHVlID09PSAwKSB7XHJcbiAgICAgIG1heFZhbHVlID0gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgXHJcbiAgICAgICAgPyBOdW1iZXIodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KSArIDIwIFxyXG4gICAgICAgIDogMTAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGUpIHtcclxuICAgICAgbWF4VmFsdWUgKj0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VzdG9tWXNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJiBtYXhWYWx1ZSA8IE51bWJlcih0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpKSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IE51bWJlcih0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpO1xyXG4gICAgICBtYXhWYWx1ZSA9IG1heFZhbHVlIDwgMTAgJiYgdGFyZ2V0IDwgMTAgPyB0YXJnZXQgKyAzIDogdGFyZ2V0ICsgMjA7XHJcbiAgICB9XHJcblxyXG4gICAgeVNjYWxlLmRvbWFpbihbMCwgbWF4VmFsdWVdKS5uaWNlKCk7XHJcblxyXG4gICAgbGV0IGxpbmVZc2NhbGUgPSBudWxsO1xyXG4gICAgaWYgKGxpbmVEYXRhKSB7XHJcbiAgICAgIGxpbmVZc2NhbGUgPSBkM1xyXG4gICAgICAgIC5zY2FsZUxpbmVhcigpXHJcbiAgICAgICAgLmRvbWFpbihbMCwgZDMubWF4KGxpbmVEYXRhLCBkID0+ICtkLnZhbHVlKV0pXHJcbiAgICAgICAgLnJhbmdlKFtoZWlnaHQsIDBdKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB4U2NhbGUsIHhTY2FsZUZyb21PcmlnaW4sIHlTY2FsZSwgbGluZVlzY2FsZSB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKHNjYWxlczogYW55KSB7XHJcbiAgICBjb25zdCB4QXhpcyA9IGQzXHJcbiAgICAgIC5heGlzQm90dG9tKHNjYWxlcy54U2NhbGUpXHJcbiAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAudGlja0Zvcm1hdCh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0xhYmVsRm9tYXR0ZXIpO1xyXG5cclxuICAgIGNvbnN0IHlBeGlzID0gZDNcclxuICAgICAgLmF4aXNMZWZ0KHNjYWxlcy55U2NhbGUpXHJcbiAgICAgIC50aWNrcyh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgLnRpY2tTaXplKDApXHJcbiAgICAgIC50aWNrRm9ybWF0KHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzTGFiZWxGb21hdHRlcik7XHJcblxyXG4gICAgbGV0IHlMaW5lQXhpcyA9IG51bGw7XHJcbiAgICBpZiAoc2NhbGVzLmxpbmVZc2NhbGUpIHtcclxuICAgICAgeUxpbmVBeGlzID0gZDNcclxuICAgICAgICAuYXhpc1JpZ2h0KHNjYWxlcy5saW5lWXNjYWxlKVxyXG4gICAgICAgIC50aWNrcyh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgICAudGlja1NpemUoMClcclxuICAgICAgICAudGlja0Zvcm1hdCh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55TGluZUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB4QXhpcywgeUF4aXMsIHlMaW5lQXhpcyB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJCYXJzKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBsYXllcnM6IGFueVtdLFxyXG4gICAgc2NhbGVzOiBhbnksXHJcbiAgICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBkZXZpY2U6IERldmljZUNvbmZpZ1xyXG4gICkge1xyXG4gICAgY29uc3QgbGF5ZXIgPSBzdmdcclxuICAgICAgLnNlbGVjdEFsbCgnLmxheWVyJylcclxuICAgICAgLmRhdGEobGF5ZXJzKVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xheWVyJylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgKGQ6IGFueSkgPT4gbWV0YURhdGEuY29sb3JzW2Qua2V5XSk7XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IGxheWVyXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgICAuZGF0YSgoZDogYW55KSA9PiBkKVxyXG4gICAgICAuZW50ZXIoKTtcclxuXHJcbiAgICB0aGlzLmFwcGVuZFJlY3RhbmdsZXMocmVjdCwgc2NhbGVzLCBtZXRhRGF0YSwgZGltZW5zaW9ucywgZGV2aWNlKTtcclxuICAgIHRoaXMuYWRkSW50ZXJhY3Rpb25zKHJlY3QsIHN2ZywgbWV0YURhdGEsIHNjYWxlcyk7XHJcbiAgICBcclxuICAgIHJldHVybiByZWN0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRSZWN0YW5nbGVzKFxyXG4gICAgcmVjdDogYW55LFxyXG4gICAgc2NhbGVzOiBhbnksXHJcbiAgICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBkZXZpY2U6IERldmljZUNvbmZpZ1xyXG4gICkge1xyXG4gICAgY29uc3QgeyBiYXJXaWR0aCwgYmFyUGFkZGluZyB9ID0gZGltZW5zaW9ucztcclxuICAgIGNvbnN0IHsgeFNjYWxlLCB5U2NhbGUgfSA9IHNjYWxlcztcclxuXHJcbiAgICByZWN0XHJcbiAgICAgIC5hcHBlbmQoJ3JlY3QnKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGFydERhdGEubGluZURhdGEgfHwgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uZm9yQ29tcGFyaXNvbikge1xyXG4gICAgICAgICAgaWYgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2s/LmluY2x1ZGVzKGQuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xpY2soZC5kYXRhLm5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ3knLCAoZDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc05hTihkWzBdKSAmJiAhaXNOYU4oZFsxXSkpIHtcclxuICAgICAgICAgIGNvbnN0IGFjdHVhbEhlaWdodCA9IHlTY2FsZShkWzBdKSAtIHlTY2FsZShkWzFdKTtcclxuICAgICAgICAgIHJldHVybiBhY3R1YWxIZWlnaHQgPCAzID8geVNjYWxlKGRbMF0pIC0gMyA6IHlTY2FsZShkWzFdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hdHRyKCd4JywgKGQ6IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgaWYgKGRldmljZS5pc01vYmlsZSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICsgaSAqIChiYXJXaWR0aCArIGJhclBhZGRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lKSB7XHJcbiAgICAgICAgICByZXR1cm4geFNjYWxlKGQuZGF0YS5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiYgdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggPD0gMykge1xyXG4gICAgICAgICAgcmV0dXJuIHhTY2FsZShkLmRhdGEubmFtZSkgKyB4U2NhbGUuYmFuZHdpZHRoKCkgLyAyIC0gMzU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB4U2NhbGUoZC5kYXRhLm5hbWUpICsgeFNjYWxlLmJhbmR3aWR0aCgpICogMC4xO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghaXNOYU4oZFswXSkgJiYgIWlzTmFOKGRbMV0pKSB7XHJcbiAgICAgICAgICBjb25zdCBhY3R1YWxIZWlnaHQgPSB5U2NhbGUoZFswXSkgLSB5U2NhbGUoZFsxXSk7XHJcbiAgICAgICAgICByZXR1cm4gYWN0dWFsSGVpZ2h0IDwgMyA/IDMgOiBhY3R1YWxIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAoZDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRldmljZS5pc01vYmlsZSkgcmV0dXJuIGJhcldpZHRoO1xyXG4gICAgICAgIGlmICghdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUpIHJldHVybiB4U2NhbGUuYmFuZHdpZHRoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiYgdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggPD0gMykge1xyXG4gICAgICAgICAgcmV0dXJuIDcwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geFNjYWxlLmJhbmR3aWR0aCgpICogMC44O1xyXG4gICAgICB9KVxyXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsIChkOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICAgICAgICBpZiAobWV0YURhdGEuYmFyV2l0aG91dENsaWNrPy5pbmNsdWRlcyhkLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RlZmF1bHQnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuICdwb2ludGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0JztcclxuICAgICAgfSlcclxuICAgICAgLnN0eWxlKCdmaWxsJywgKGQ6IGFueSkgPT4gdGhpcy5nZXRCYXJDb2xvcihkLCBtZXRhRGF0YSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRCYXJDb2xvcihkOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKTogc3RyaW5nIHtcclxuICAgIGlmIChcclxuICAgICAgIWlzTmFOKGRbMF0pICYmXHJcbiAgICAgICFpc05hTihkWzFdKSAmJlxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4gICAgICBwYXJzZUZsb2F0KGRbMV0pIC0gcGFyc2VGbG9hdChkWzBdKSA+PSBwYXJzZUZsb2F0KFN0cmluZyh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5iYXJBYm92ZVRhcmdldENvbG9yIHx8IG1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkSW50ZXJhY3Rpb25zKHJlY3Q6IGFueSwgc3ZnOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhLCBzY2FsZXM6IGFueSkge1xyXG4gICAgcmVjdFxyXG4gICAgICAuc2VsZWN0QWxsKCdyZWN0JylcclxuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGQ6IGFueSkgPT4gdGhpcy5oYW5kbGVNb3VzZU92ZXIoZCwgc3ZnLCBtZXRhRGF0YSwgc2NhbGVzKSlcclxuICAgICAgLm9uKCdtb3VzZW91dCcsIChkOiBhbnkpID0+IHRoaXMuaGFuZGxlTW91c2VPdXQoc3ZnLCBtZXRhRGF0YSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZU92ZXIoZDogYW55LCBzdmc6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsIHNjYWxlczogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wKSByZXR1cm47XHJcblxyXG4gICAgc3ZnLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAgIC5maWx0ZXIoKGRhdGE6IGFueSkgPT4gZGF0YSA9PT0gZClcclxuICAgICAgLnN0eWxlKCdmaWxsJywgKGQ6IGFueSkgPT4gdGhpcy5nZXRIb3ZlckNvbG9yKGQsIG1ldGFEYXRhKSk7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5VG9vbHRpcChkLCBzdmcsIG1ldGFEYXRhLCBzY2FsZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIb3ZlckNvbG9yKGQ6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiBzdHJpbmcge1xyXG4gICAgaWYgKFxyXG4gICAgICAhaXNOYU4oZFswXSkgJiZcclxuICAgICAgIWlzTmFOKGRbMV0pICYmXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbiAgICAgIHBhcnNlRmxvYXQoZFsxXSkgLSBwYXJzZUZsb2F0KGRbMF0pID49IHBhcnNlRmxvYXQoU3RyaW5nKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmJhckFib3ZlVGFyZ2V0SG92ZXJDb2xvciB8fFxyXG4gICAgICAgICAgICAgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEuYmFyQWJvdmVUYXJnZXRDb2xvciB8fFxyXG4gICAgICAgICAgICAgbWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZXRhRGF0YS5ob3ZlckNvbG9yIHx8IG1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc3BsYXlUb29sdGlwKGQ6IGFueSwgc3ZnOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhLCBzY2FsZXM6IGFueSkge1xyXG4gICAgY29uc3QgeyB4U2NhbGUsIHlTY2FsZSB9ID0gc2NhbGVzO1xyXG4gICAgY29uc3QgdmFsdWUgPSBkWzFdIC0gZFswXTtcclxuICAgIFxyXG4gICAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGRldmljZSA9IHRoaXMuZ2V0RGV2aWNlQ29uZmlnKCk7XHJcbiAgICBjb25zdCBiYW5kd2lkdGggPSB4U2NhbGUuYmFuZHdpZHRoKCk7XHJcbiAgICBcclxuICAgIC8vIFJlc3BvbnNpdmUgdG9vbHRpcCB3aWR0aFxyXG4gICAgbGV0IHdpZHRoOiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgICBpZiAoZGV2aWNlLmlzTW9iaWxlKSB7XHJcbiAgICAgIHdpZHRoID0gTWF0aC5taW4oYmFuZHdpZHRoICsgNDAsIDE1MCk7XHJcbiAgICB9IGVsc2UgaWYgKGRldmljZS5pc1RhYmxldCkge1xyXG4gICAgICB3aWR0aCA9IE1hdGgubWluKGJhbmR3aWR0aCArIDYwLCAyMDApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2lkdGggPSAvd2Vlay9pLnRlc3QoZC5kYXRhLm5hbWUpICYmIC9cXGR7NH0tXFxkezJ9LVxcZHsyfS8udGVzdChkLmRhdGEubmFtZSlcclxuICAgICAgICA/ICcyNTBweCdcclxuICAgICAgICA6IGJhbmR3aWR0aCArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMiA+IDE4MFxyXG4gICAgICAgICAgPyAnMTgwcHgnXHJcbiAgICAgICAgICA6IGJhbmR3aWR0aCArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMjtcclxuICAgIH1cclxuXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgIC5hdHRyKCd4JywgdGhpcy5jYWxjdWxhdGVUb29sdGlwWChkLCB4U2NhbGUsIHdpZHRoKSlcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJylcclxuICAgICAgLmF0dHIoJ3knLCB5U2NhbGUoZFsxXSkgLSA1MSlcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCA0MClcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcclxuICAgICAgLnN0eWxlKCd6LWluZGV4JywgOTkpXHJcbiAgICAgIC5odG1sKHRoaXMuZ2VuZXJhdGVUb29sdGlwSHRtbChkLCBtZXRhRGF0YSwgdmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlVG9vbHRpcFgoZDogYW55LCB4U2NhbGU6IGFueSwgd2lkdGg6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBiYW5kd2lkdGggPSB4U2NhbGUuYmFuZHdpZHRoKCk7XHJcbiAgICBjb25zdCBudW1lcmljV2lkdGggPSB0eXBlb2Ygd2lkdGggPT09ICdzdHJpbmcnID8gcGFyc2VJbnQod2lkdGgpIDogd2lkdGg7XHJcbiAgICBcclxuICAgIGlmIChiYW5kd2lkdGggKyB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyAqIDIgPiAxODApIHtcclxuICAgICAgcmV0dXJuIHhTY2FsZShkLmRhdGEubmFtZSkgLSB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyArXHJcbiAgICAgICAgICAgICAoYmFuZHdpZHRoICsgdGhpcy5DT05TVEFOVFMuTEVGVF9SSUdIVF9TUEFDRVMgKiAyIC0gMTgwKSAvIDI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geFNjYWxlKGQuZGF0YS5uYW1lKSAtIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVRvb2x0aXBIdG1sKGQ6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsIHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gJzxzcGFuIGNsYXNzPVwidGl0bGUtdG9wLXRleHRcIj4wPC9zcGFuPic7XHJcblxyXG4gICAgY29uc3QgZGF0YVR5cGUgPSBtZXRhRGF0YS5kYXRhVHlwZSB8fCAnJztcclxuICAgIGNvbnN0IG5hbWUgPSBkLmRhdGEubmFtZSA/IGA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci1uYW1lXCI+JHtkLmRhdGEubmFtZX08L3NwYW4+YCA6ICcnO1xyXG4gICAgY29uc3QgdmFsdWVUZXh0ID0gbWV0YURhdGEudW5pdFxyXG4gICAgICA/IGAke21ldGFEYXRhLnVuaXR9JHt2YWx1ZX0gJHtkYXRhVHlwZX1gXHJcbiAgICAgIDogYCR7dmFsdWV9ICR7ZGF0YVR5cGV9YDtcclxuXHJcbiAgICByZXR1cm4gYCR7bmFtZX08c3BhbiBjbGFzcz1cInRpdGxlLXRvcC10ZXh0XCI+JHt2YWx1ZVRleHR9PC9zcGFuPmA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU1vdXNlT3V0KHN2ZzogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSkge1xyXG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCkgcmV0dXJuO1xyXG5cclxuICAgIHN2Zy5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAoZDogYW55KSA9PiB0aGlzLmdldEJhckNvbG9yKGQsIG1ldGFEYXRhKSk7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQXhpc0xhYmVscyhcclxuICAgIHN2ZzogYW55LFxyXG4gICAgc3ZnWUF4aXNMZWZ0OiBhbnksXHJcbiAgICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBtYXJnaW46IGFueVxyXG4gICkge1xyXG4gICAgaWYgKG1ldGFEYXRhLnlMYWJlbCkge1xyXG4gICAgICB0aGlzLmFkZFlBeGlzTGFiZWwoc3ZnWUF4aXNMZWZ0LCBtZXRhRGF0YS55TGFiZWwsIGRpbWVuc2lvbnMuaGVpZ2h0LCBtYXJnaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXRhRGF0YS54TGFiZWwpIHtcclxuICAgICAgdGhpcy5hZGRYQXhpc0xhYmVsKHN2ZywgbWV0YURhdGEueExhYmVsLCBkaW1lbnNpb25zLndpZHRoLCBkaW1lbnNpb25zLmhlaWdodCwgbWFyZ2luKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkWUF4aXNMYWJlbChzdmdZQXhpc0xlZnQ6IGFueSwgbGFiZWw6IHN0cmluZywgaGVpZ2h0OiBudW1iZXIsIG1hcmdpbjogYW55KSB7XHJcbiAgICBjb25zdCBpc3JpYSA9IHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uPy5pc1JpYTtcclxuICAgIGNvbnN0IGlzQWNyb255bSA9IHRoaXMuaXNBY3JvbnltTGFiZWwobGFiZWwpO1xyXG4gICAgY29uc3QgeVBvc2l0aW9uID0gaXNyaWEgPyAtbWFyZ2luLmxlZnQgLyAyIC0gMzAgOiAtbWFyZ2luLmxlZnQgLyAyIC0gNDA7XHJcblxyXG4gICAgc3ZnWUF4aXNMZWZ0LnNlbGVjdEFsbCgnLmxpYi1heGlzLWdyb3VwLWxhYmVsLCAubGliLXlsYWJlbC1kcmlsbGRvd25jaGFydHMsIC5saWIteWxhYmVsLXdlZWtseUNoYXJ0cycpLnJlbW92ZSgpO1xyXG5cclxuICAgIHN2Z1lBeGlzTGVmdFxyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgdGhpcy5nZXRZQXhpc0xhYmVsQ2xhc3MoKSlcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgeVBvc2l0aW9uKVxyXG4gICAgICAuYXR0cigneCcsIC1oZWlnaHQgLyAyKVxyXG4gICAgICAuYXR0cignZHknLCAnMWVtJylcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAudGV4dChpc0Fjcm9ueW0gPyBsYWJlbC50b1VwcGVyQ2FzZSgpIDogbGFiZWwudG9Mb3dlckNhc2UoKSlcclxuICAgICAgLnN0eWxlKCd0ZXh0LXRyYW5zZm9ybScsIGlzQWNyb255bSA/ICdub25lJyA6ICdjYXBpdGFsaXplJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFhBeGlzTGFiZWwoc3ZnOiBhbnksIGxhYmVsOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBtYXJnaW46IGFueSkge1xyXG4gICAgY29uc3QgaXNyaWEgPSB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbj8uaXNSaWE7XHJcbiAgICBjb25zdCBpc0Fjcm9ueW0gPSB0aGlzLmlzQWNyb255bUxhYmVsKGxhYmVsKTtcclxuICAgIGNvbnN0IHhQb3NpdGlvbiA9IGlzcmlhIFxyXG4gICAgICA/IGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tIFxyXG4gICAgICA6IGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgMTA7XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCB0aGlzLmdldFhBeGlzTGFiZWxDbGFzcygpKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0N1c3RvbWxhYmVsU3R5bGVzKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3dpZHRoIC8gMn0sJHt4UG9zaXRpb259KWApXHJcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLnRleHQoaXNBY3JvbnltID8gbGFiZWwudG9VcHBlckNhc2UoKSA6IGxhYmVsLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgIC5zdHlsZSgndGV4dC10cmFuc2Zvcm0nLCBpc0Fjcm9ueW0gPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0Fjcm9ueW1MYWJlbChsYWJlbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBjbGVhbkxhYmVsID0gbGFiZWwucmVwbGFjZSgvW15BLVphLXpdL2csICcnKTtcclxuICAgIHJldHVybiAobGFiZWwubGVuZ3RoIDw9IDQgJiYgL15bQS1aXSskLy50ZXN0KGxhYmVsKSkgfHxcclxuICAgICAgICAgICAobGFiZWwgPT09IGxhYmVsLnRvVXBwZXJDYXNlKCkgJiYgL1tBLVpdLy50ZXN0KGxhYmVsKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFlBeGlzTGFiZWxDbGFzcygpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJhc2VDbGFzcyA9ICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMSc7XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICByZXR1cm4gYCR7YmFzZUNsYXNzfSBsaWIteWxhYmVsLWRyaWxsZG93bmNoYXJ0c2A7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gYCR7YmFzZUNsYXNzfSBsaWIteWxhYmVsLXdlZWtseUNoYXJ0c2A7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYCR7YmFzZUNsYXNzfSBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWxgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRYQXhpc0xhYmVsQ2xhc3MoKTogc3RyaW5nIHtcclxuICAgIGxldCBiYXNlQ2xhc3MgPSAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgZm9udC1zaXplLTEnO1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc30gbGliLXhsYWJlbC1kcmlsbGRvd25jaGFydHNgO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc30gbGliLXhsYWJlbC13ZWVrbHlDaGFydHNgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke2Jhc2VDbGFzc30gbGliLWF4aXMtd2F0ZXJmYWxsLWxhYmVsYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlDb25maWd1cmF0aW9uRmxhZ3MoKSB7XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUb3BDYXB0aW9uVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaXNUb3BDYXB0aW9uVmlzaWJsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVG9wQ2FwdGlvblZpc2libGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplU3RhY2tlZENoYXJ0KCkge1xyXG4gICAgY29uc3QgZGV2aWNlID0gdGhpcy5nZXREZXZpY2VDb25maWcoKTtcclxuICAgIHRoaXMuY29uZmlndXJlUmVzcG9uc2l2ZVNldHRpbmdzKGRldmljZSk7XHJcbiAgICB0aGlzLm1lcmdlQ29uZmlndXJhdGlvbnMoKTtcclxuICAgIHRoaXMuYXBwbHlDb25maWd1cmF0aW9uRmxhZ3MoKTtcclxuXHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGEuZGF0YTtcclxuICAgIGNvbnN0IG1ldGFEYXRhID0gdGhpcy5wcmVwYXJlTWV0YURhdGEodGhpcy5jaGFydERhdGEubWV0YURhdGEpO1xyXG4gICAgY29uc3QgbGluZURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5saW5lRGF0YTtcclxuICAgIGNvbnN0IGNvbG9ycyA9IG1ldGFEYXRhLmNvbG9ycztcclxuICAgIGNvbnN0IGtleUxpc3QgPSBtZXRhRGF0YS5rZXlMaXN0O1xyXG5cclxuICAgIGNvbnN0IGNoYXJ0Q29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3QgdmVydGljYWxzdGFja2VkY29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMudmVydGljYWxzdGFja2VkY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgXHJcbiAgICBjb25zdCBtYXJnaW4gPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW47XHJcbiAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5jYWxjdWxhdGVEaW1lbnNpb25zKFxyXG4gICAgICBjaGFydENvbnRhaW5lcixcclxuICAgICAgdmVydGljYWxzdGFja2VkY29udGFpbmVyLFxyXG4gICAgICBtYXJnaW4sXHJcbiAgICAgIGRldmljZSxcclxuICAgICAgZGF0YS5sZW5ndGhcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgeyBzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCB9ID0gdGhpcy5jcmVhdGVTdmdDb250YWluZXJzKFxyXG4gICAgICBjaGFydENvbnRhaW5lcixcclxuICAgICAgZGltZW5zaW9ucyxcclxuICAgICAgbWFyZ2luXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHN0YWNrOiBhbnkgPSBkMy5zdGFjaygpLmtleXMoa2V5TGlzdCkub2Zmc2V0KGQzLnN0YWNrT2Zmc2V0Tm9uZSk7XHJcbiAgICBjb25zdCBsYXllcnM6IGFueSA9IHN0YWNrKGRhdGEpO1xyXG4gICAgZGF0YS5zb3J0KChhLCBiKSA9PiBiLnRvdGFsIC0gYS50b3RhbCk7XHJcblxyXG4gICAgY29uc3Qgc2NhbGVzID0gdGhpcy5jcmVhdGVTY2FsZXMoZGF0YSwgbGF5ZXJzLCBsaW5lRGF0YSwgZGltZW5zaW9ucywgZGV2aWNlKTtcclxuICAgIGNvbnN0IGF4ZXMgPSB0aGlzLmNyZWF0ZUF4ZXMoc2NhbGVzKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlckdyaWRzKHN2Zywgc2NhbGVzLCBkaW1lbnNpb25zKTtcclxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlckJhcnMoc3ZnLCBsYXllcnMsIHNjYWxlcywgbWV0YURhdGEsIGRpbWVuc2lvbnMsIGRldmljZSk7XHJcbiAgICB0aGlzLnJlbmRlckF4ZXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIGF4ZXMsIHNjYWxlcywgZGltZW5zaW9ucywgZGV2aWNlLCBkYXRhKTtcclxuICAgIHRoaXMucmVuZGVyQXhpc0xhYmVscyhzdmcsIHN2Z1lBeGlzTGVmdCwgbWV0YURhdGEsIGRpbWVuc2lvbnMsIG1hcmdpbik7XHJcbiAgICB0aGlzLnJlbmRlclRhcmdldExpbmUoc3ZnLCBzdmdZQXhpc1JpZ2h0LCBzY2FsZXMsIGRpbWVuc2lvbnMsIG1ldGFEYXRhKTtcclxuICAgIHRoaXMucmVuZGVyRGF0YUxhYmVscyhyZWN0LCBzY2FsZXMsIG1ldGFEYXRhLCBkaW1lbnNpb25zKTtcclxuICAgIHRoaXMucmVuZGVyTGluZUNoYXJ0KHN2ZywgbGluZURhdGEsIHNjYWxlcywgY29sb3JzLCBtZXRhRGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckdyaWRzKHN2ZzogYW55LCBzY2FsZXM6IGFueSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGdyaWRCZXR3ZWVuTGFiZWxzKSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkJylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3NjYWxlcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyfSwke2RpbWVuc2lvbnMuaGVpZ2h0fSlgKVxyXG4gICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oc2NhbGVzLnhTY2FsZSkudGlja1NpemUoLWRpbWVuc2lvbnMuaGVpZ2h0KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJyM5OTk5OTknKVxyXG4gICAgICAgIC5jYWxsKChnOiBhbnkpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0dyaWQpIHtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dyaWQnKVxyXG4gICAgICAgIC5jYWxsKFxyXG4gICAgICAgICAgZDNcclxuICAgICAgICAgICAgLmF4aXNMZWZ0KHNjYWxlcy55U2NhbGUpXHJcbiAgICAgICAgICAgIC50aWNrcyh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgICAgICAgLnRpY2tTaXplKC1kaW1lbnNpb25zLndpZHRoKVxyXG4gICAgICAgICAgICAudGlja0Zvcm1hdCgnJylcclxuICAgICAgICApXHJcbiAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yKScpXHJcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzEnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNHcmlkKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNHcmlkLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgc3ZnXHJcbiAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGB4JHtqICsgMn0gYXhpcyR7aiArIDJ9YClcclxuICAgICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciknKVxyXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke2RpbWVuc2lvbnMuaGVpZ2h0ICogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNHcmlkW2pdfSlgKVxyXG4gICAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbShzY2FsZXMueFNjYWxlKS50aWNrU2l6ZSgwKS50aWNrcyg1KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckF4ZXMoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIHN2Z1lBeGlzTGVmdDogYW55LFxyXG4gICAgc3ZnWUF4aXNSaWdodDogYW55LFxyXG4gICAgYXhlczogYW55LFxyXG4gICAgc2NhbGVzOiBhbnksXHJcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxyXG4gICAgZGV2aWNlOiBEZXZpY2VDb25maWcsXHJcbiAgICBkYXRhOiBhbnlbXVxyXG4gICkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnNob3dYYXhpc1RvcCkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWxpbmUtYXhpcy10ZXh0IGxpYi1saW5lLXgtYXhpcy10ZXh0IHgtYXhpcycpXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oc2NhbGVzLnhTY2FsZSkudGlja1NpemUoMCkpO1xyXG4gICAgICBzdmcuc2VsZWN0QWxsKCcueC1heGlzID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyU3RhbmRhcmRBeGVzKHN2ZywgYXhlcywgc2NhbGVzLCBkaW1lbnNpb25zLCBkZXZpY2UsIGRhdGEpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyRHJpbGxkb3duQXhlcyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgYXhlcywgc2NhbGVzLCBkaW1lbnNpb25zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyTXVsdGlDaGFydEF4ZXMoc3ZnLCBheGVzLCBzY2FsZXMsIGRpbWVuc2lvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXBwbHlBeGlzU3R5bGluZyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCk7XHJcbiAgICB0aGlzLmFwcGx5QXhpc0NvbmZpZ3VyYXRpb25zKHN2Zywgc2NhbGVzLCBkaW1lbnNpb25zLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyU3RhbmRhcmRBeGVzKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBheGVzOiBhbnksXHJcbiAgICBzY2FsZXM6IGFueSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBkZXZpY2U6IERldmljZUNvbmZpZyxcclxuICAgIGRhdGE6IGFueVtdXHJcbiAgKSB7XHJcbiAgICBpZiAoZGV2aWNlLmlzTW9iaWxlKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyTW9iaWxlWEF4aXMoc3ZnLCBkYXRhLCBkaW1lbnNpb25zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtkaW1lbnNpb25zLmhlaWdodH0pYClcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteC1heGlzLXRleHQnKVxyXG4gICAgICAgIC5jYWxsKGF4ZXMueEF4aXMpXHJcbiAgICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMnB4JylcclxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgICAuYXR0cignZHgnLCAnMCcpXHJcbiAgICAgICAgLmF0dHIoJ2R5JywgJzAuNzFlbScpXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0JylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAuY2FsbChheGVzLnlBeGlzKVxyXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck1vYmlsZVhBeGlzKHN2ZzogYW55LCBkYXRhOiBhbnlbXSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnLmN1c3RvbS14LWxhYmVsJykucmVtb3ZlKCk7XHJcbiAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5kYXRhLm1hcChkID0+IGQubmFtZS5sZW5ndGgpKTtcclxuICAgIGNvbnN0IGZvbnRTaXplID0gbWF4TGVuZ3RoID4gMTAgPyAnOHB4JyA6ICcxMHB4JztcclxuICAgIFxyXG4gICAgZGF0YS5mb3JFYWNoKChkLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHhWYWwgPSB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyArIFxyXG4gICAgICAgICAgICAgICAgICBpICogKGRpbWVuc2lvbnMuYmFyV2lkdGggKyBkaW1lbnNpb25zLmJhclBhZGRpbmcpICsgXHJcbiAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbnMuYmFyV2lkdGggLyAyO1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnY3VzdG9tLXgtbGFiZWwnKVxyXG4gICAgICAgIC5hdHRyKCd4JywgMClcclxuICAgICAgICAuYXR0cigneScsIGRpbWVuc2lvbnMuaGVpZ2h0ICsgMTgpXHJcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt4VmFsICsgMjB9LDApYClcclxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGZvbnRTaXplKVxyXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgICAgLnN0eWxlKCd3cml0aW5nLW1vZGUnLCAnc2lkZXdheXMtbHInKVxyXG4gICAgICAgIC50ZXh0KGQubmFtZS5sZW5ndGggPiA2ID8gZC5uYW1lLnN1YnN0cmluZygwLCA0KSArICcuLi4nIDogZC5uYW1lKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEcmlsbGRvd25BeGVzKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBzdmdZQXhpc0xlZnQ6IGFueSxcclxuICAgIHN2Z1lBeGlzUmlnaHQ6IGFueSxcclxuICAgIGF4ZXM6IGFueSxcclxuICAgIHNjYWxlczogYW55LFxyXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9uc1xyXG4gICkge1xyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7ZGltZW5zaW9ucy5oZWlnaHR9KWApXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC14LWF4aXMtdGV4dCBtdWx0aWNoYXJ0MScpXHJcbiAgICAgIC5jYWxsKGF4ZXMueEF4aXMpXHJcbiAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gICAgc3ZnWUF4aXNMZWZ0XHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAuY2FsbChheGVzLnlBeGlzKVxyXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcblxyXG4gICAgc3ZnWUF4aXNSaWdodFxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgLmNhbGwoYXhlcy55QXhpcylcclxuICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTXVsdGlDaGFydEF4ZXMoc3ZnOiBhbnksIGF4ZXM6IGFueSwgc2NhbGVzOiBhbnksIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMpIHtcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke2RpbWVuc2lvbnMuaGVpZ2h0fSlgKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteC1heGlzLXRleHQgbXVsdGljaGFydCcpXHJcbiAgICAgIC5jYWxsKGF4ZXMueEF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dCB5YXhpcy1kYXNoZWQnKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAgIC5jYWxsKGF4ZXMueUF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlBeGlzU3R5bGluZyhzdmc6IGFueSwgc3ZnWUF4aXNMZWZ0OiBhbnksIHN2Z1lBeGlzUmlnaHQ6IGFueSkge1xyXG4gICAgY29uc3Qgc3R5bGVBeGlzRG9tYWluID0gKGNvbnRhaW5lcjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJy5kb21haW4nKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IpJylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKTtcclxuICAgIH07XHJcblxyXG4gICAgc3R5bGVBeGlzRG9tYWluKHN2Zyk7XHJcbiAgICBzdHlsZUF4aXNEb21haW4oc3ZnWUF4aXNMZWZ0KTtcclxuICAgIHN0eWxlQXhpc0RvbWFpbihzdmdZQXhpc1JpZ2h0KTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZCkge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciknKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0NvbG9yKSB7XHJcbiAgICAgIGQzLnNlbGVjdEFsbCgnLm11bHRpY2hhcnQnKS5zdHlsZShcclxuICAgICAgICAnY29sb3InLFxyXG4gICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNDb2xvciB8fCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5QXhpc0NvbmZpZ3VyYXRpb25zKHN2ZzogYW55LCBzY2FsZXM6IGFueSwgZGltZW5zaW9uczogRGltZW5zaW9ucywgZGF0YTogYW55W10pIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGQzLnNlbGVjdEFsbCgnLm11bHRpY2hhcnQgPiBnID4gdGV4dCcpLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzTGFiZWxIaWRkZW4pIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCcubXVsdGljaGFydCA+IGcgPiB0ZXh0JykuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyQ3VzdG9tWEF4aXMoc3ZnLCBzY2FsZXMsIGRpbWVuc2lvbnMsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzTGFiZWxIaWRkZW4pIHtcclxuICAgICAgc3ZnLnNlbGVjdEFsbCgnLnlheGlzLWRhc2hlZCA+IGcgPiB0ZXh0JykuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNIaWRkZW4pIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJykuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNab29tZWRPdXQgJiYgZGF0YS5sZW5ndGggPiA5KSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5zZWxlY3RBbGwoJy5saWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ2VuZCcpXHJcbiAgICAgICAgLmF0dHIoJ3gnLCAnLTUnKVxyXG4gICAgICAgIC5hdHRyKCdkeScsIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDdXN0b21YQXhpcyhzdmc6IGFueSwgc2NhbGVzOiBhbnksIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsIGRhdGE6IGFueVtdKSB7XHJcbiAgICBjb25zdCBkZXZpY2UgPSB0aGlzLmdldERldmljZUNvbmZpZygpO1xyXG4gICAgXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtkaW1lbnNpb25zLmhlaWdodH0pYClcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICcjMDAwJylcclxuICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbShzY2FsZXMueFNjYWxlKS50aWNrU2l6ZSgwKSlcclxuICAgICAgLmNhbGwoKGc6IGFueSkgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5hdHRyKCdmaWxsJywgJ25vbmUnKSk7XHJcblxyXG4gICAgdGhpcy5zdHlsZUN1c3RvbVhBeGlzVGlja3Moc3ZnLCBkYXRhLCBkZXZpY2UpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54TGFiZWxzT25TYW1lTGluZSkge1xyXG4gICAgICB0aGlzLmFwcGx5WExhYmVsc09uU2FtZUxpbmUoc3ZnLCBkZXZpY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdHlsZUN1c3RvbVhBeGlzVGlja3Moc3ZnOiBhbnksIGRhdGE6IGFueVtdLCBkZXZpY2U6IERldmljZUNvbmZpZykge1xyXG4gICAgbGV0IGFsdGVybmF0ZVRleHQgPSBmYWxzZTtcclxuXHJcbiAgICBzdmcuc2VsZWN0QWxsKCcueDEuYXhpczEgLnRpY2sgbGluZScpLmF0dHIoJ3kyJywgKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaGlkZVhheGlzVGljaykgcmV0dXJuIDA7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoYWx0ZXJuYXRlVGV4dCAmJiAhdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNOb0FsdGVybmF0ZVhheGlzVGV4dCkge1xyXG4gICAgICAgIGFsdGVybmF0ZVRleHQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5DT05TVEFOVFMuTE9OR19USUNLX0xFTkdUSF9CRyAtIDc7XHJcbiAgICAgIH1cclxuICAgICAgYWx0ZXJuYXRlVGV4dCA9IHRydWU7XHJcbiAgICAgIHJldHVybiB0aGlzLkNPTlNUQU5UUy5TSE9SVF9USUNLX0xFTkdUSF9CRyAtIDQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhbHRlcm5hdGVUZXh0ID0gZmFsc2U7XHJcbiAgICBzdmdcclxuICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoID4gOCBcclxuICAgICAgICAgICAgPyAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24tYWx0J1xyXG4gICAgICAgICAgICA6ICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnbGliLXhheGlzLWxhYmVscy10ZXh0cy13ZWVrbHljaGFydHMnO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cigneScsICgpID0+IHtcclxuICAgICAgICBpZiAoYWx0ZXJuYXRlVGV4dCkge1xyXG4gICAgICAgICAgYWx0ZXJuYXRlVGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ09OU1RBTlRTLkxPTkdfVElDS19MRU5HVEhfQkc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFsdGVybmF0ZVRleHQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLkNPTlNUQU5UUy5TSE9SVF9USUNLX0xFTkdUSF9CRztcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5WExhYmVsc09uU2FtZUxpbmUoc3ZnOiBhbnksIGRldmljZTogRGV2aWNlQ29uZmlnKSB7XHJcbiAgICBzdmdcclxuICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbiAgICAgIC5hdHRyKCd5JywgdGhpcy5DT05TVEFOVFMuU0hPUlRfVElDS19MRU5HVEhfQkcpXHJcbiAgICAgIC50ZXh0KChkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoZGV2aWNlLmlzTW9iaWxlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZC5zcGxpdCgnICcpWzBdLnN1YnN0cmluZygwLCAzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGQudHJpbSgpO1xyXG4gICAgICAgIGNvbnN0IHNwYWNlSW5kZXggPSB0cmltbWVkLmluZGV4T2YoJyAnKTtcclxuICAgICAgICByZXR1cm4gc3BhY2VJbmRleCA+IC0xIFxyXG4gICAgICAgICAgPyB0cmltbWVkLnN1YnN0cmluZygwLCBzcGFjZUluZGV4KS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICA6IHRyaW1tZWQudG9Mb3dlckNhc2UoKTtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKHRoaXM6IFNWR1RleHRFbGVtZW50LCBkOiBzdHJpbmcsIGk6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChkZXZpY2UuaXNNb2JpbGUpIHtcclxuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZT8ucGFyZW50Tm9kZSBhcyBhbnk7XHJcbiAgICAgICAgICBjb25zdCB0b3RhbEJhcnMgPSBwYXJlbnQgPyBkMy5zZWxlY3QocGFyZW50KS5zZWxlY3RBbGwoJ2cudGljaycpLnNpemUoKSA6IDA7XHJcbiAgICAgICAgICByZXR1cm4gdG90YWxCYXJzID09PSAyID8gJ3RyYW5zbGF0ZSgwLDApJyA6IGB0cmFuc2xhdGUoJHtpICogMzB9LDApYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljaycpXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAuYXR0cigneScsIHRoaXMuQ09OU1RBTlRTLkxPTkdfVElDS19MRU5HVEhfQkcpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ2N1cnJlbnRDb2xvcicpXHJcbiAgICAgIC50ZXh0KChkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoZGV2aWNlLmlzTW9iaWxlKSByZXR1cm4gJyc7XHJcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGQudHJpbSgpO1xyXG4gICAgICAgIGNvbnN0IHNwYWNlSW5kZXggPSB0cmltbWVkLmluZGV4T2YoJyAnKTtcclxuICAgICAgICByZXR1cm4gc3BhY2VJbmRleCA+IC0xIFxyXG4gICAgICAgICAgPyB0cmltbWVkLnN1YnN0cmluZyhzcGFjZUluZGV4KS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICA6ICcnO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQ6IHN0cmluZywgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGRldmljZS5pc01vYmlsZSAmJiBpID09PSAwID8gJ3RyYW5zbGF0ZSgyMCwwKScgOiBudWxsO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyRGF0YUxhYmVscyhyZWN0OiBhbnksIHNjYWxlczogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xyXG4gICAgaWYgKCF0aGlzLmlzQ0MgJiYgIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lKSB7XHJcbiAgICAgIHJlY3QuYXBwZW5kKCdzdmc6dGl0bGUnKS50ZXh0KChkOiBhbnkpID0+IGRbMV0gLSBkWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc2hvd1RvdGFsT25Ub3ApIHtcclxuICAgICAgdGhpcy5yZW5kZXJUb3BMYWJlbHMocmVjdCwgc2NhbGVzLCBtZXRhRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnNob3dBbmdsZWRMYWJlbHMpIHtcclxuICAgICAgdGhpcy5yZW5kZXJBbmdsZWRMYWJlbHMocmVjdCwgc2NhbGVzLCBtZXRhRGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRvcExhYmVscyhyZWN0OiBhbnksIHNjYWxlczogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSkge1xyXG4gICAgY29uc3QgZm9ybWF0RnJvbUJhY2tlbmQgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0Rm9ybWF0dGVyXHJcbiAgICAgID8gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXIpXHJcbiAgICAgIDogKGQ6IGFueSkgPT4gZDtcclxuICAgIGNvbnN0IGZvcm1hdEZvckh1Z2VOdW1iZXJzID0gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKCcuMnMnKTtcclxuXHJcbiAgICByZWN0XHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cigneCcsIChkOiBhbnkpID0+IHNjYWxlcy54U2NhbGUoZC5kYXRhLm5hbWUpICsgc2NhbGVzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItdmVydGljYWxzdGFjay1sYWJlbHMtb250b3Atd2VrbHljaGFydHMnKVxyXG4gICAgICAuYXR0cigneScsIChkOiBhbnkpID0+IHNjYWxlcy55U2NhbGUoZFsxXSkgLSAzKVxyXG4gICAgICAudGV4dCgoZDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkWzFdIC0gZFswXTtcclxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSAwKSByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZSA8PSA5OTkgXHJcbiAgICAgICAgICA/IGZvcm1hdEZyb21CYWNrZW5kKHZhbHVlKVxyXG4gICAgICAgICAgOiBmb3JtYXRGb3JIdWdlTnVtYmVycyh2YWx1ZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG1ldGFEYXRhLnVuaXQgPyBtZXRhRGF0YS51bml0ICsgZm9ybWF0dGVkVmFsdWUgOiBmb3JtYXR0ZWRWYWx1ZTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckFuZ2xlZExhYmVscyhyZWN0OiBhbnksIHNjYWxlczogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSkge1xyXG4gICAgY29uc3QgZm9ybWF0RnJvbUJhY2tlbmQgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0Rm9ybWF0dGVyXHJcbiAgICAgID8gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXIpXHJcbiAgICAgIDogKGQ6IGFueSkgPT4gZDtcclxuICAgIGNvbnN0IGZvcm1hdEZvckh1Z2VOdW1iZXJzID0gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKCcuMnMnKTtcclxuICAgIGNvbnN0IHRlbXBPYmplY3RIb2xkZXI6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuXHJcbiAgICByZWN0XHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cigneCcsIDApXHJcbiAgICAgIC5hdHRyKCd5JywgMClcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoZDogYW55KSA9PiBtZXRhRGF0YS5jb2xvcnNbZC5rZXldKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRhdGEtbGFiZWxzLWFuZ2xlZC13ZWVrbHljaGFydHMnKVxyXG4gICAgICAudGV4dCgoZDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkWzFdIC0gZFswXTtcclxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlIDw9IDApIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlIDw9IDk5OVxyXG4gICAgICAgICAgPyBmb3JtYXRGcm9tQmFja2VuZCh2YWx1ZSlcclxuICAgICAgICAgIDogZm9ybWF0Rm9ySHVnZU51bWJlcnModmFsdWUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBtZXRhRGF0YS51bml0ID8gbWV0YURhdGEudW5pdCArIGZvcm1hdHRlZFZhbHVlIDogZm9ybWF0dGVkVmFsdWU7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkWzFdIC0gZFswXTtcclxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlIDw9IDApIHJldHVybiAncm90YXRlKDApJztcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICBsZXQgaW5jcmVtZW50ZXIgPSAxO1xyXG4gICAgICAgIG1ldGFEYXRhLmtleUxpc3QuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgaWYgKGQuZGF0YVtrZXldKSB7XHJcbiAgICAgICAgICAgIHRvdGFsICs9IGQuZGF0YVtrZXldO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW5jcmVtZW50ZXIgPSAyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0ZW1wT2JqZWN0SG9sZGVyW2QuZGF0YS5uYW1lXSA9ICh0ZW1wT2JqZWN0SG9sZGVyW2QuZGF0YS5uYW1lXSB8fCAwKSArIGluY3JlbWVudGVyO1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGVtcE9iamVjdEhvbGRlcltkLmRhdGEubmFtZV07XHJcbiAgICAgICAgY29uc3QgeFBvcyA9IHNjYWxlcy54U2NhbGUoZC5kYXRhLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGJhbmR3aWR0aCA9IHNjYWxlcy54U2NhbGUuYmFuZHdpZHRoKCk7XHJcbiAgICAgICAgY29uc3QgeVBvcyA9IHNjYWxlcy55U2NhbGUodG90YWwpIC0gMztcclxuXHJcbiAgICAgICAgc3dpdGNoIChwb3NpdGlvbikge1xyXG4gICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3hQb3MgKyBiYW5kd2lkdGggLyAzfSwke3lQb3N9KSByb3RhdGUoMjcwKWA7XHJcbiAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFBvcyArIGJhbmR3aWR0aCAvIDIgKyAyfSwke3lQb3N9KSByb3RhdGUoMjcwKWA7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3hQb3MgKyAoYmFuZHdpZHRoICogMykgLyA0fSwke3lQb3N9KSByb3RhdGUoMjcwKWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVGFyZ2V0TGluZShcclxuICAgIHN2ZzogYW55LFxyXG4gICAgc3ZnWUF4aXNSaWdodDogYW55LFxyXG4gICAgc2NhbGVzOiBhbnksXHJcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxyXG4gICAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGFcclxuICApIHtcclxuICAgIGlmICghdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBwYXJzZWRUYXJnZXQgPSB0aGlzLnBhcnNlVGFyZ2V0VmFsdWUodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KTtcclxuICAgIGNvbnN0IHlaZXJvID0gc2NhbGVzLnlTY2FsZShwYXJzZWRUYXJnZXQpO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdsaW5lJylcclxuICAgICAgLmF0dHIoJ3gxJywgMClcclxuICAgICAgLmF0dHIoJ3gyJywgZGltZW5zaW9ucy53aWR0aClcclxuICAgICAgLmF0dHIoJ3kxJywgeVplcm8pXHJcbiAgICAgIC5hdHRyKCd5MicsIHlaZXJvKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5jb2xvcik7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJUYXJnZXRMYWJlbChzdmdZQXhpc1JpZ2h0LCB5WmVybywgbWV0YURhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZVRhcmdldFZhbHVlKHRhcmdldDogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQoU3RyaW5nKHRhcmdldCkpO1xyXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiAwO1xyXG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGFyc2VkKSA/IHBhcnNlSW50KFN0cmluZyh0YXJnZXQpKSA6IHBhcnNlZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVGFyZ2V0TGFiZWwoc3ZnWUF4aXNSaWdodDogYW55LCB5WmVybzogbnVtYmVyLCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSkge1xyXG4gICAgY29uc3QgZGF0YVR5cGUgPSBtZXRhRGF0YS5kYXRhVHlwZSB8fCAnJztcclxuICAgIGNvbnN0IHRhcmdldE5hbWUgPSB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXROYW1lIHx8ICd0YXJnZXQnO1xyXG5cclxuICAgIHN2Z1lBeGlzUmlnaHRcclxuICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt5WmVybyAtIDEzfSlgKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB0aGlzLkNPTlNUQU5UUy5SSUdIVF9TVkdfV0lEVEgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCA1MClcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RhcmdldC1kaXNwbGF5JylcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5odG1sKGA8ZGl2PiR7dGFyZ2V0TmFtZX08L2Rpdj48ZGl2PiR7dGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0fSR7ZGF0YVR5cGV9PC9kaXY+YCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxpbmVDaGFydChzdmc6IGFueSwgbGluZURhdGE6IGFueVtdLCBzY2FsZXM6IGFueSwgY29sb3JzOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKSB7XHJcbiAgICBpZiAoIWxpbmVEYXRhIHx8ICFjb2xvcnMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBkYXRhR3JvdXAgPSBkM1xyXG4gICAgICAubmVzdCgpXHJcbiAgICAgIC5rZXkoKGQ6IGFueSkgPT4gZC5jYXRlZ29yeSlcclxuICAgICAgLmVudHJpZXMobGluZURhdGEpO1xyXG5cclxuICAgIGNvbnN0IGxpbmVHZW4gPSBkM1xyXG4gICAgICAubGluZSgpXHJcbiAgICAgIC54KChkOiBhbnkpID0+IHNjYWxlcy54U2NhbGUoZC5uYW1lKSArIHNjYWxlcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgICAueSgoZDogYW55KSA9PiBzY2FsZXMubGluZVlzY2FsZShkLnZhbHVlKSk7XHJcblxyXG4gICAgZGF0YUdyb3VwLmZvckVhY2goKGdyb3VwOiBhbnkpID0+IHtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXHJcbiAgICAgICAgLmRhdHVtKGdyb3VwLnZhbHVlcylcclxuICAgICAgICAuYXR0cignZmlsbCcsICdub25lJylcclxuICAgICAgICAuYXR0cignc3Ryb2tlJywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGRbMF0/LmNhdGVnb3J5IFxyXG4gICAgICAgICAgICA/IGNvbG9yc1tkWzBdLmNhdGVnb3J5XVxyXG4gICAgICAgICAgICA6IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIuNSlcclxuICAgICAgICAuYXR0cignZCcsIGxpbmVHZW4pO1xyXG5cclxuICAgICAgdGhpcy5yZW5kZXJMaW5lRG90cyhzdmcsIGdyb3VwLnZhbHVlcywgc2NhbGVzLCBjb2xvcnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxpbmVEb3RzKHN2ZzogYW55LCB2YWx1ZXM6IGFueVtdLCBzY2FsZXM6IGFueSwgY29sb3JzOiBhbnkpIHtcclxuICAgIGNvbnN0IGRvdCA9IHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCcubGluZS1kb3RzJylcclxuICAgICAgLmRhdGEodmFsdWVzKVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLm9uKCdjbGljaycsIChkOiBhbnkpID0+IHRoaXMuaGFuZGxlQ2xpY2soZCkpO1xyXG5cclxuICAgIGRvdFxyXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxyXG4gICAgICAuYXR0cignZmlsbCcsIChkOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gZC5jYXRlZ29yeSBcclxuICAgICAgICAgID8gY29sb3JzW2QuY2F0ZWdvcnldXHJcbiAgICAgICAgICA6IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ25vbmUnKVxyXG4gICAgICAuYXR0cignY3gnLCAoZDogYW55KSA9PiBzY2FsZXMueFNjYWxlKGQubmFtZSkgKyBzY2FsZXMueFNjYWxlLmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLmF0dHIoJ2N5JywgKGQ6IGFueSkgPT4gc2NhbGVzLmxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAgIC5hdHRyKCdyJywgMylcclxuICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcikge1xyXG4gICAgICBkb3RcclxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZG90cycpXHJcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcuODVlbScpXHJcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICdib2xkJylcclxuICAgICAgICAuYXR0cigneCcsIChkOiBhbnkpID0+IHNjYWxlcy54U2NhbGUoZC5uYW1lKSArIHNjYWxlcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgICAgIC5hdHRyKCd5JywgKGQ6IGFueSkgPT4gc2NhbGVzLmxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAgICAgLmF0dHIoJ2R5JywgJy0xZW0nKVxyXG4gICAgICAgIC50ZXh0KChkOiBhbnkpID0+IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxhYmVsRm9ybWF0dGVyKGQudmFsdWUpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUNsaWNrKGQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnREYXRhPy5tZXRhRGF0YT8uaGFzRHJpbGxEb3duIHx8IGQ/LnRvZ2dsZUZyb20pIHtcclxuICAgICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVIZWFkZXJNZW51Q2xpY2soaWQ6IGFueSkge1xyXG4gICAgdGhpcy5oZWFkZXJNZW51Y2xpY2tFdmVudC5lbWl0KGlkKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbihldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldmVudCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVab29taW5ab29tb3V0Q2xpY2soeyBpc1pvb21PdXQsIGV2ZW50IH06IHsgaXNab29tT3V0OiBib29sZWFuOyBldmVudDogYW55IH0pIHtcclxuICAgIHRoaXMuaXNab29tT3V0U2VsZWN0ZWQoaXNab29tT3V0KTtcclxuICB9XHJcbn0iLCI8bWV0YSBodHRwLWVxdWl2PVwiQ0FDSEUtQ09OVFJPTFwiIGNvbnRlbnQ9XCJOTy1DQUNIRVwiIC8+XHJcbjxtZXRhIGh0dHAtZXF1aXY9XCJFWFBJUkVTXCIgY29udGVudD1cIlNhdCwgMDEgSnVuIDIwMDQgMTE6MTI6MDEgR01UXCIgLz5cclxuPGRpdlxyXG4gICN2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXJcclxuICBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCJcclxuICBbbmdDbGFzc109XCJ7ICdsaWItbm8tYmFja2dyb3VuZCc6IGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kIH1cIlxyXG4gICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJnKTtcIlxyXG5cclxuICAocmVzaXplZCk9XCJvblJlc2l6ZWQoJGV2ZW50KVwiXHJcbj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFsdFwiICpuZ0lmPVwiIWlzSGVhZGVyVmlzaWJsZVwiPlxyXG4gICAgPGxpYi1jaGFydC1oZWFkZXItdjJcclxuICAgICAgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIlxyXG4gICAgICBbY2hhcnRDb25maWd1cmF0aW9uXT1cImNoYXJ0Q29uZmlndXJhdGlvblwiXHJcbiAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxyXG4gICAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mj5cclxuXHJcbiAgICA8bGliLWNoYXJ0LWhlYWRlci12M1xyXG4gICAgICBbY2hhcnREYXRhXT1cImNoYXJ0RGF0YVwiXHJcbiAgICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgICAgKGNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbik9XCJoYW5kbGVDb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICh6b29tSW5ab29tT3V0Q2xpY2spPVwiaGFuZGxlWm9vbWluWm9vbW91dENsaWNrKCRldmVudClcIlxyXG4gICAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mz5cclxuICA8L2Rpdj5cclxuICA8ZGl2XHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIlxyXG4gICAgaWQ9XCJ2ZXJ0aWNhbHN0YWNrZWRjaGFydGNvbnRhaW5lclwiXHJcbiAgICAjdmVydGljYWxzdGFja2VkY2hhcnRjb250YWluZXJcclxuICAgIGNsYXNzPVwibGliLWNoYXJ0LXN2Z1wiXHJcbiAgPjwvZGl2PlxyXG48L2Rpdj5cclxuIl19
1050
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2hvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tL2hvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS9ob3Jpem9udGFsLWJhcnMtd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FFbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQW1EbEQsTUFBTSxPQUFPLHFDQUNYLFNBQVEsaUJBQWlCO0lBZ0Z6QjtRQUNFLEtBQUssRUFBRSxDQUFDO1FBdEVBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUMzQixhQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxD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QXFDLDRqQkNsRWxELG9uQ0ErQkE7OzRGRG1DYSxxQ0FBcUM7a0JBVGpELFNBQVM7K0JBQ0Usc0NBQXNDLGlCQU1qQyxpQkFBaUIsQ0FBQyxJQUFJO3dEQU9yQyxZQUFZO3NCQURYLFNBQVM7dUJBQUMsK0JBQStCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk1RCwyQkFBMkI7c0JBRDFCLFNBQVM7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUc5QyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIE9uQ2hhbmdlcyxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xyXG5pbXBvcnQgeyBSZXNpemVkRXZlbnQgfSBmcm9tICdhbmd1bGFyLXJlc2l6ZS1ldmVudCc7XHJcbmltcG9ydCBIZWFkZXJDb25maWdIZWxwZXIgZnJvbSAnLi4vaGVhZGVyLWNvbmZpZyc7XHJcblxyXG4vLyBUeXBlc1xyXG5pbnRlcmZhY2UgQ2hhcnREYXRhIHtcclxuICBkYXRhOiBhbnlbXTtcclxuICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YTtcclxuICBsaW5lRGF0YT86IGFueVtdO1xyXG4gIHRhcmdldExpbmVEYXRhPzogVGFyZ2V0TGluZURhdGE7XHJcbn1cclxuXHJcbmludGVyZmFjZSBDaGFydE1ldGFEYXRhIHtcclxuICB1bml0Pzogc3RyaW5nO1xyXG4gIGlzQ0M/OiBib29sZWFuO1xyXG4gIGJhcldpdGhvdXRDbGljaz86IHN0cmluZ1tdO1xyXG4gIGNvbG9yczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICBrZXlMaXN0OiBzdHJpbmdbXTtcclxuICBkYXRhVHlwZT86IHN0cmluZztcclxuICBoYXNEcmlsbERvd24/OiBib29sZWFuO1xyXG4gIGhvdmVyQ29sb3I/OiBzdHJpbmc7XHJcbiAgeUxhYmVsPzogc3RyaW5nO1xyXG4gIHhMYWJlbD86IHN0cmluZztcclxuICBsaW5leUxhYmVsPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVGFyZ2V0TGluZURhdGEge1xyXG4gIHRhcmdldDogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGNvbG9yOiBzdHJpbmc7XHJcbiAgdGFyZ2V0TmFtZT86IHN0cmluZztcclxuICBiYXJBYm92ZVRhcmdldENvbG9yPzogc3RyaW5nO1xyXG4gIGJhckFib3ZlVGFyZ2V0SG92ZXJDb2xvcj86IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIERpbWVuc2lvbnMge1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlcjtcclxuICBjb250YWluZXJIZWlnaHQ6IG51bWJlcjtcclxuICBiYXJXaWR0aDogbnVtYmVyO1xyXG4gIGJhclBhZGRpbmc6IG51bWJlcjtcclxuICByZXF1aXJlZFN2Z1dpZHRoOiBudW1iZXI7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWhvcml6b250YWwtYmFycy13aXRoLXNjcm9sbC16b29tJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW1xyXG4gICAgJy4vaG9yaXpvbnRhbC1iYXJzLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50Lmxlc3MnLFxyXG4gICAgJy4uL2NvbW1vbi1zdHlsZXMubGVzcycsXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSG9yaXpvbnRhbEJhcnNXaXRoU2Nyb2xsWm9vbUNvbXBvbmVudFxyXG4gIGV4dGVuZHMgQ29tcG9uZW50VW5pcXVlSWRcclxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgXHJcbiAgQFZpZXdDaGlsZCgndmVydGljYWxzdGFja2VkY2hhcnRjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgdmVydGljYWxzdGFja2VkY29udGFpbmVyRWx0ITogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCkgY2hhcnREYXRhOiBDaGFydERhdGEgfCBhbnkgO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgaXNIZWFkZXJWaXNpYmxlID0gdHJ1ZTtcclxuICBpc1RvcENhcHRpb25WaXNpYmxlID0gdHJ1ZTtcclxuICB1bmlxdWVJZCA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZCA9IGZhbHNlO1xyXG4gIGlzQ0MgPSBmYWxzZTtcclxuICBpc1pvb21lZE91dCA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgQ09OU1RBTlRTID0ge1xyXG4gICAgUklHSFRfU1ZHX1dJRFRIOiA2MCxcclxuICAgIExFRlRfUklHSFRfU1BBQ0VTOiA1MCxcclxuICAgIFNIT1JUX1RJQ0tfTEVOR1RIOiA0LFxyXG4gICAgTE9OR19USUNLX0xFTkdUSDogMTYsXHJcbiAgICBTSE9SVF9USUNLX0xFTkdUSF9CRzogNSxcclxuICAgIExPTkdfVElDS19MRU5HVEhfQkc6IDMwLFxyXG4gICAgREVTS1RPUF9CQVJfV0lEVEg6IDQwLCAgICAgIC8vIERlc2t0b3AgYmFyIHdpZHRoXHJcbiAgICBNT0JJTEVfQkFSX1dJRFRIOiAyNSwgICAgICAgLy8gTW9iaWxlL1RhYmxldCBiYXIgd2lkdGggKHJlZHVjZWQpXHJcbiAgICBCQVJfR0FQOiAzMCwgICAgICAgICAgICAgICAgLy8gR2FwIGJldHdlZW4gYmFycyAoaW5jcmVhc2VkIGZvciBiZXR0ZXIgc2VwYXJhdGlvbilcclxuICAgIFpPT01fVEhSRVNIT0xEOiAzMCxcclxuICAgIFpPT01fSU5fVEhSRVNIT0xEOiA4LFxyXG4gIH07XHJcblxyXG4gIGRlZmF1bHRDb25maWd1cmF0aW9uID0ge1xyXG4gICAgbWFyZ2luOiB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiAyMCwgbGVmdDogNDAgfSxcclxuICAgIHN2Z0hlaWdodDogNzAsXHJcbiAgICBsZWdlbmRIZWlnaHQ6ICcxMCUnLFxyXG4gICAgbnVtYmVyT2ZZVGlja3M6IDUsXHJcbiAgICBsYWJlbEZvcm1hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHhBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHlBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHlMaW5lQXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICBsaW5lR3JhcGhDb2xvcjogJyNGNkQyODMnLFxyXG4gICAgc2hvd0xpbmVDaGFydEF4aXM6IHRydWUsXHJcbiAgICBzaG93TGVnZW5kOiBmYWxzZSxcclxuICAgIGZvckNvbXBhcmlzb246IHRydWUsXHJcbiAgICBoZWFkZXJNZW51T3B0aW9uczogSGVhZGVyQ29uZmlnSGVscGVyLmhlYWRlckNvbmZpZy5oZWFkZXJNZW51T3B0aW9ucyxcclxuICAgIHlBeGlzR3JpZDogZmFsc2UsXHJcbiAgICAvLyBPcHRpb25hbCBjb25maWdzIHdpdGggdW5kZWZpbmVkIGRlZmF1bHRzXHJcbiAgICBpc0hlYWRlclZpc2libGU6IHVuZGVmaW5lZCxcclxuICAgIGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kOiB1bmRlZmluZWQsXHJcbiAgICBpc1RvcENhcHRpb25WaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBpc011bHRpQ2hhcnRHcmlkTGluZTogdW5kZWZpbmVkLFxyXG4gICAgaXNGdWxsU2NyZWVuOiB1bmRlZmluZWQsXHJcbiAgICBjdXN0b21Zc2NhbGU6IHVuZGVmaW5lZCxcclxuICAgIGlzWGF4aXNMYWJlbEhpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNZYXhpc0xhYmVsSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBpc1lheGlzSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBpc1lheGlzRGFzaGVkOiB1bmRlZmluZWQsXHJcbiAgICBpc1hheGlzQ29sb3I6IHVuZGVmaW5lZCxcclxuICAgIHRleHRGb3JtYXR0ZXI6IHVuZGVmaW5lZCxcclxuICAgIHNob3dUb3RhbE9uVG9wOiB1bmRlZmluZWQsXHJcbiAgICBiYWNrZW5kRm9ybWF0dGVySGFzUHJpb3JpdHk6IHVuZGVmaW5lZCxcclxuICAgIHNob3dBbmdsZWRMYWJlbHM6IHVuZGVmaW5lZCxcclxuICAgIGlzTm9BbHRlcm5hdGVYYXhpc1RleHQ6IHVuZGVmaW5lZCxcclxuICAgIGlzWGdyaWRCZXR3ZWVuTGFiZWxzOiB1bmRlZmluZWQsXHJcbiAgICBzaG93WGF4aXNUb3A6IHVuZGVmaW5lZCxcclxuICAgIHhBeGlzR3JpZDogdW5kZWZpbmVkLFxyXG4gICAgeExhYmVsc09uU2FtZUxpbmU6IHVuZGVmaW5lZCxcclxuICAgIGhpZGVYYXhpc1RpY2s6IHVuZGVmaW5lZCxcclxuICAgIGlzRHJpbGxkb3duQ2hhcnQ6IHVuZGVmaW5lZCxcclxuICAgIGlzVGFyZ2V0TGluZTogdW5kZWZpbmVkLFxyXG4gICAgZGlzcGxheVRpdGxlT25Ub3A6IHVuZGVmaW5lZCxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgaXNUaXRsZUhpZGRlbjogdW5kZWZpbmVkLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5yZW1vdmVFeGlzdGluZ0NoYXJ0KCk7XHJcbiAgICB0aGlzLmluaXRpYWxpemVTdGFja2VkQ2hhcnQoKTtcclxuICB9XHJcblxyXG4gIG9uUmVzaXplZChldmVudDogUmVzaXplZEV2ZW50KSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZW1vdmVFeGlzdGluZ0NoYXJ0KCk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0YWNrZWRDaGFydCgpO1xyXG4gICAgfSwgMTApO1xyXG4gIH1cclxuXHJcbiAgaXNab29tT3V0U2VsZWN0ZWQoaXNab29tT3V0OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmlzWm9vbWVkT3V0ID0gaXNab29tT3V0O1xyXG4gICAgdGhpcy5uZ09uQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVFeGlzdGluZ0NoYXJ0KCkge1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHRoaXMudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ3VyYXRpb25zKCkge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbikge1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbltrZXldID0gQ2hhcnRIZWxwZXIuZ2V0VmFsdWVCeUNvbmZpZ3VyYXRpb25UeXBlKFxyXG4gICAgICAgIGtleSxcclxuICAgICAgICB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uLFxyXG4gICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVNZXRhRGF0YShtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSk6IENoYXJ0TWV0YURhdGEge1xyXG4gICAgaWYgKCFtZXRhRGF0YS51bml0KSBtZXRhRGF0YS51bml0ID0gJyc7XHJcbiAgICBpZiAobWV0YURhdGEuaXNDQykgdGhpcy5pc0NDID0gbWV0YURhdGEuaXNDQztcclxuICAgIFxyXG4gICAgaWYgKG1ldGFEYXRhLmJhcldpdGhvdXRDbGljaz8ubGVuZ3RoKSB7XHJcbiAgICAgIG1ldGFEYXRhLmJhcldpdGhvdXRDbGljayA9IG1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5tYXAoZWwgPT4gZWwudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgPSBbXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIG1ldGFEYXRhO1xyXG4gIH1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlRGltZW5zaW9ucyhcclxuICBjaGFydENvbnRhaW5lcjogYW55LFxyXG4gIHZlcnRpY2FsQ29udGFpbmVyOiBhbnksXHJcbiAgbWFyZ2luOiBhbnksXHJcbiAgZGF0YUxlbmd0aDogbnVtYmVyXHJcbik6IERpbWVuc2lvbnMge1xyXG4gIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY2hhcnRDb250YWluZXIubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xyXG4gIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHZlcnRpY2FsQ29udGFpbmVyLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XHJcbiAgXHJcbiAgY29uc3QgbGVmdEF4aXNXaWR0aCA9IDgwO1xyXG4gIGNvbnN0IHJpZ2h0QXhpc1dpZHRoID0gdGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIO1xyXG4gIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gY29udGFpbmVyV2lkdGggLSBsZWZ0QXhpc1dpZHRoIC0gcmlnaHRBeGlzV2lkdGg7XHJcbiAgXHJcbiAgbGV0IHdpZHRoID0gYXZhaWxhYmxlV2lkdGggLSBtYXJnaW4ubGVmdCAtIG1hcmdpbi5yaWdodDtcclxuICBsZXQgaGVpZ2h0ID0gY29udGFpbmVySGVpZ2h0ICogKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCAvIDEwMCkgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbTtcclxuXHJcbiAgaWYgKGRhdGFMZW5ndGggPiB0aGlzLkNPTlNUQU5UUy5aT09NX1RIUkVTSE9MRCAmJiB0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICBjb25zdCBtaW5XaWR0aCA9IGRhdGFMZW5ndGggKiAyNTtcclxuICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIG1pbldpZHRoKTtcclxuICB9XHJcblxyXG4gIGlmIChkYXRhTGVuZ3RoID4gdGhpcy5DT05TVEFOVFMuWk9PTV9JTl9USFJFU0hPTEQgJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgIHdpZHRoID0gZGF0YUxlbmd0aCAqIDEzMDtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4pIHtcclxuICAgIGhlaWdodCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCAhPT0gODBcclxuICAgICAgPyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcclxuICAgICAgOiBjb250YWluZXJIZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgaGVpZ2h0ID0gY29udGFpbmVySGVpZ2h0IC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b20gLSAxMzA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBpc01vYmlsZU9yVGFibGV0ID0gd2luZG93LmlubmVyV2lkdGggPCAxMDI0O1xyXG4gIGxldCBiYXJXaWR0aDogbnVtYmVyO1xyXG4gIGxldCBiYXJQYWRkaW5nOiBudW1iZXI7XHJcbiAgXHJcbiAgaWYgKGlzTW9iaWxlT3JUYWJsZXQpIHtcclxuICAgIGlmIChkYXRhTGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIGJhcldpZHRoID0gNjA7XHJcbiAgICAgIGJhclBhZGRpbmcgPSAwO1xyXG4gICAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID09PSAyKSB7XHJcbiAgICAgIGJhcldpZHRoID0gNTA7XHJcbiAgICAgIGJhclBhZGRpbmcgPSA0NTtcclxuICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMykge1xyXG4gICAgICBiYXJXaWR0aCA9IDQ1O1xyXG4gICAgICBiYXJQYWRkaW5nID0gNDA7XHJcbiAgICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPD0gNSkge1xyXG4gICAgICBiYXJXaWR0aCA9IDM1O1xyXG4gICAgICBiYXJQYWRkaW5nID0gMzA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBiYXJXaWR0aCA9IDI1O1xyXG4gICAgICBiYXJQYWRkaW5nID0gMjU7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGJhcldpZHRoID0gdGhpcy5DT05TVEFOVFMuREVTS1RPUF9CQVJfV0lEVEg7XHJcbiAgICBiYXJQYWRkaW5nID0gdGhpcy5DT05TVEFOVFMuQkFSX0dBUDtcclxuICB9XHJcbiAgXHJcbiAgY29uc3QgdG90YWxCYXJzV2lkdGggPSBiYXJXaWR0aCAqIGRhdGFMZW5ndGg7XHJcbiAgY29uc3QgdG90YWxHYXBzID0gYmFyUGFkZGluZyAqIChkYXRhTGVuZ3RoIC0gMSk7XHJcbiAgY29uc3QgbWluUmVxdWlyZWRXaWR0aCA9IHRvdGFsQmFyc1dpZHRoICsgdG90YWxHYXBzICsgKHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMik7XHJcbiAgY29uc3QgcmVxdWlyZWRTdmdXaWR0aCA9IE1hdGgubWF4KGF2YWlsYWJsZVdpZHRoLCBtaW5SZXF1aXJlZFdpZHRoKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHdpZHRoLFxyXG4gICAgaGVpZ2h0LFxyXG4gICAgY29udGFpbmVyV2lkdGgsXHJcbiAgICBjb250YWluZXJIZWlnaHQsXHJcbiAgICBiYXJXaWR0aCxcclxuICAgIGJhclBhZGRpbmcsXHJcbiAgICByZXF1aXJlZFN2Z1dpZHRoLFxyXG4gIH07XHJcbn1cclxuXHJcbnByaXZhdGUgY3JlYXRlU3ZnQ29udGFpbmVycyhcclxuICBjaGFydENvbnRhaW5lcjogYW55LFxyXG4gIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgbWFyZ2luOiBhbnksXHJcbiAgaGFzWExhYmVsOiBib29sZWFuICAvLyBBZGQgdGhpcyBwYXJhbWV0ZXJcclxuKSB7XHJcbiAgLy8gQ2FsY3VsYXRlIHRvdGFsIGhlaWdodCBpbmNsdWRpbmcgc3BhY2UgZm9yIFgtYXhpcyBsYWJlbCBpZiBwcmVzZW50XHJcbiAgY29uc3QgeExhYmVsU3BhY2UgPSBoYXNYTGFiZWwgPyAzMCA6IDA7XHJcbiAgY29uc3QgdG90YWxIZWlnaHQgPSBkaW1lbnNpb25zLmhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgeExhYmVsU3BhY2U7XHJcblxyXG4gIC8vIE1haW4gd3JhcHBlclxyXG4gIGNvbnN0IGNoYXJ0V3JhcHBlciA9IGNoYXJ0Q29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgLmF0dHIoJ2lkJywgdGhpcy51bmlxdWVJZClcclxuICAgIC5hdHRyKCdjbGFzcycsICdjaGFydC13cmFwcGVyLW1haW4nKVxyXG4gICAgLnN0eWxlKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpXHJcbiAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgLnN0eWxlKCdoZWlnaHQnLCBgJHt0b3RhbEhlaWdodH1weGApOyAgLy8gSW5jbHVkZSBYLWxhYmVsIHNwYWNlXHJcblxyXG4gIC8vIExlZnQgWS1heGlzIC0gRml4ZWRcclxuICBjb25zdCBsZWZ0QXhpc0NvbnRhaW5lciA9IGNoYXJ0V3JhcHBlclxyXG4gICAgLmFwcGVuZCgnZGl2JylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsZWZ0LWF4aXMtY29udGFpbmVyJylcclxuICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgLnN0eWxlKCdsZWZ0JywgJzAnKVxyXG4gICAgLnN0eWxlKCd0b3AnLCAnMCcpXHJcbiAgICAuc3R5bGUoJ3dpZHRoJywgJzgwcHgnKVxyXG4gICAgLnN0eWxlKCdoZWlnaHQnLCBgJHtkaW1lbnNpb25zLmhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tfXB4YCkgIC8vIEV4Y2x1ZGUgWC1sYWJlbCBzcGFjZVxyXG4gICAgLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ3ZhcigtLWNhcmQtYmcpJylcclxuICAgIC5zdHlsZSgnei1pbmRleCcsICcxMCcpO1xyXG5cclxuICBjb25zdCBzdmdZQXhpc0xlZnQgPSBsZWZ0QXhpc0NvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnc3ZnJylcclxuICAgIC5hdHRyKCd3aWR0aCcsICc4MCcpXHJcbiAgICAuYXR0cignaGVpZ2h0JywgZGltZW5zaW9ucy5oZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSlcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdCArIDEwfSwke21hcmdpbi50b3B9KWApO1xyXG5cclxuICAvLyBSaWdodCBZLWF4aXMgLSBGaXhlZFxyXG4gIGNvbnN0IHJpZ2h0QXhpc0NvbnRhaW5lciA9IGNoYXJ0V3JhcHBlclxyXG4gICAgLmFwcGVuZCgnZGl2JylcclxuICAgIC5hdHRyKCdjbGFzcycsICdyaWdodC1heGlzLWNvbnRhaW5lcicpXHJcbiAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgIC5zdHlsZSgncmlnaHQnLCAnMCcpXHJcbiAgICAuc3R5bGUoJ3RvcCcsICcwJylcclxuICAgIC5zdHlsZSgnd2lkdGgnLCBgJHt0aGlzLkNPTlNUQU5UUy5SSUdIVF9TVkdfV0lEVEh9cHhgKVxyXG4gICAgLnN0eWxlKCdoZWlnaHQnLCBgJHtkaW1lbnNpb25zLmhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tfXB4YCkgIC8vIEV4Y2x1ZGUgWC1sYWJlbCBzcGFjZVxyXG4gICAgLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ3ZhcigtLWNhcmQtYmcpJylcclxuICAgIC5zdHlsZSgnei1pbmRleCcsICcxMCcpO1xyXG5cclxuICBjb25zdCBzdmdZQXhpc1JpZ2h0ID0gcmlnaHRBeGlzQ29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgLmF0dHIoJ3dpZHRoJywgdGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIGRpbWVuc2lvbnMuaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgLy8gU2Nyb2xsYWJsZSBtaWRkbGUgYXJlYVxyXG4gIGNvbnN0IHNjcm9sbGFibGVDb250YWluZXIgPSBjaGFydFdyYXBwZXJcclxuICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnc2Nyb2xsYWJsZS1jaGFydC1jb250YWluZXInKVxyXG4gICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAuc3R5bGUoJ2xlZnQnLCAnODBweCcpXHJcbiAgICAuc3R5bGUoJ3JpZ2h0JywgYCR7dGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIfXB4YClcclxuICAgIC5zdHlsZSgndG9wJywgJzAnKVxyXG4gICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcclxuICAgIC5zdHlsZSgnaGVpZ2h0JywgYCR7ZGltZW5zaW9ucy5oZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbX1weGApICAvLyBFeGNsdWRlIFgtbGFiZWwgc3BhY2VcclxuICAgIC5zdHlsZSgnb3ZlcmZsb3cteCcsICdhdXRvJylcclxuICAgIC5zdHlsZSgnb3ZlcmZsb3cteScsICdoaWRkZW4nKTtcclxuXHJcbiAgY29uc3QgaW5uZXJDb250YWluZXIgPSBzY3JvbGxhYmxlQ29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2lubmVyLWNoYXJ0LWNvbnRhaW5lcicpXHJcbiAgICAuc3R5bGUoJ21pbi13aWR0aCcsICcxMDAlJyk7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGlubmVyQ29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgLmF0dHIoJ3dpZHRoJywgZGltZW5zaW9ucy5yZXF1aXJlZFN2Z1dpZHRoKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIGRpbWVuc2lvbnMuaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAzMClcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke21hcmdpbi50b3B9KWApO1xyXG5cclxuICAvLyBGaXhlZCBib3R0b20gY29udGFpbmVyIGZvciBYLWF4aXMgbGFiZWxcclxuICBjb25zdCBib3R0b21MYWJlbENvbnRhaW5lciA9IGNoYXJ0V3JhcHBlclxyXG4gICAgLmFwcGVuZCgnZGl2JylcclxuICAgIC5hdHRyKCdjbGFzcycsICdib3R0b20tbGFiZWwtY29udGFpbmVyJylcclxuICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgLnN0eWxlKCdsZWZ0JywgJzgwcHgnKVxyXG4gICAgLnN0eWxlKCdyaWdodCcsIGAke3RoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSH1weGApXHJcbiAgICAuc3R5bGUoJ2JvdHRvbScsICcwJylcclxuICAgIC5zdHlsZSgnaGVpZ2h0JywgYCR7eExhYmVsU3BhY2V9cHhgKVxyXG4gICAgLnN0eWxlKCdkaXNwbGF5JywgJ2ZsZXgnKVxyXG4gICAgLnN0eWxlKCdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJylcclxuICAgIC5zdHlsZSgnYWxpZ24taXRlbXMnLCAnY2VudGVyJylcclxuICAgIC5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICd2YXIoLS1jYXJkLWJnKScpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCAnMTAnKTtcclxuXHJcbiAgcmV0dXJuIHsgc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIGlubmVyQ29udGFpbmVyLCBib3R0b21MYWJlbENvbnRhaW5lciB9O1xyXG59XHJcblxyXG5wcml2YXRlIGNyZWF0ZVNjYWxlcyhcclxuICBkYXRhOiBhbnlbXSxcclxuICBsYXllcnM6IGFueVtdLFxyXG4gIGxpbmVEYXRhOiBhbnlbXSxcclxuICBkaW1lbnNpb25zOiBEaW1lbnNpb25zXHJcbikge1xyXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgYmFyV2lkdGgsIGJhclBhZGRpbmcgfSA9IGRpbWVuc2lvbnM7XHJcbiAgXHJcbiAgLy8gQ2FsY3VsYXRlIGJhciBwb3NpdGlvbmluZ1xyXG4gIGNvbnN0IHRvdGFsQmFyc1dpZHRoID0gZGF0YS5sZW5ndGggKiBiYXJXaWR0aDtcclxuICBjb25zdCB0b3RhbFNwYWNpbmcgPSAoZGF0YS5sZW5ndGggLSAxKSAqIGJhclBhZGRpbmc7XHJcbiAgY29uc3QgcmVxdWlyZWRXaWR0aCA9IHRvdGFsQmFyc1dpZHRoICsgdG90YWxTcGFjaW5nICsgKHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMik7XHJcbiAgY29uc3QgZWZmZWN0aXZlV2lkdGggPSBNYXRoLm1heCh3aWR0aCwgcmVxdWlyZWRXaWR0aCk7XHJcbiAgXHJcbiAgY29uc3QgcGFkZGluZ1JhdGlvID0gYmFyUGFkZGluZyAvIChiYXJXaWR0aCArIGJhclBhZGRpbmcpO1xyXG4gIFxyXG4gIC8vIFgtc2NhbGUgc3RhcnRzIGZyb20gMCAobm8gbGVmdCBzcGFjaW5nIGZvciBncmlkIGFsaWdubWVudClcclxuICBjb25zdCB4U2NhbGUgPSBkM1xyXG4gICAgLnNjYWxlQmFuZCgpXHJcbiAgICAucmFuZ2VSb3VuZChbMCwgZGltZW5zaW9ucy5yZXF1aXJlZFN2Z1dpZHRoXSkgIC8vIEZ1bGwgd2lkdGggZnJvbSAwXHJcbiAgICAuZG9tYWluKGRhdGEubWFwKGQgPT4gZC5uYW1lKS5yZXZlcnNlKCkpXHJcbiAgICAucGFkZGluZ0lubmVyKHBhZGRpbmdSYXRpbylcclxuICAgIC5wYWRkaW5nT3V0ZXIoMC4wNSlcclxuICAgIC5hbGlnbigwKTtcclxuXHJcbiAgY29uc3QgeFNjYWxlRnJvbU9yaWdpbiA9IGQzXHJcbiAgICAuc2NhbGVCYW5kKClcclxuICAgIC5yYW5nZVJvdW5kKFt3aWR0aCwgMF0pXHJcbiAgICAuZG9tYWluKGRhdGEubWFwKGQgPT4gZC5uYW1lKS5yZXZlcnNlKCkpO1xyXG5cclxuICBjb25zdCB5U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLnJhbmdlUm91bmQoW2hlaWdodCwgMF0pO1xyXG4gIFxyXG4gIGxldCBtYXhWYWx1ZSA9IGQzLm1heChsYXllcnMsIChkOiBhbnkpID0+IGQzLm1heChkLCAoZDogYW55KSA9PiBkWzFdKSk7XHJcbiAgXHJcbiAgaWYgKG1heFZhbHVlID09PSAwKSB7XHJcbiAgICBtYXhWYWx1ZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhIFxyXG4gICAgICA/IE51bWJlcih0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpICsgMjAgXHJcbiAgICAgIDogMTAwO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZSkge1xyXG4gICAgbWF4VmFsdWUgKj0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VzdG9tWXNjYWxlO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmIG1heFZhbHVlIDwgTnVtYmVyKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCkpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IE51bWJlcih0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpO1xyXG4gICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSA8IDEwICYmIHRhcmdldCA8IDEwID8gdGFyZ2V0ICsgMyA6IHRhcmdldCArIDIwO1xyXG4gIH1cclxuXHJcbiAgeVNjYWxlLmRvbWFpbihbMCwgbWF4VmFsdWVdKS5uaWNlKCk7XHJcblxyXG4gIGxldCBsaW5lWXNjYWxlID0gbnVsbDtcclxuICBpZiAobGluZURhdGEpIHtcclxuICAgIGxpbmVZc2NhbGUgPSBkM1xyXG4gICAgICAuc2NhbGVMaW5lYXIoKVxyXG4gICAgICAuZG9tYWluKFswLCBkMy5tYXgobGluZURhdGEsIGQgPT4gK2QudmFsdWUpXSlcclxuICAgICAgLnJhbmdlKFtoZWlnaHQsIDBdKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB7IHhTY2FsZSwgeFNjYWxlRnJvbU9yaWdpbiwgeVNjYWxlLCBsaW5lWXNjYWxlIH07XHJcbn1cclxuXHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQXhlcyhzY2FsZXM6IGFueSkge1xyXG4gICAgY29uc3QgeEF4aXMgPSBkM1xyXG4gICAgICAuYXhpc0JvdHRvbShzY2FsZXMueFNjYWxlKVxyXG4gICAgICAudGlja1NpemUoMClcclxuICAgICAgLnRpY2tGb3JtYXQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNMYWJlbEZvbWF0dGVyKTtcclxuXHJcbiAgICBjb25zdCB5QXhpcyA9IGQzXHJcbiAgICAgIC5heGlzTGVmdChzY2FsZXMueVNjYWxlKVxyXG4gICAgICAudGlja3ModGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAudGlja0Zvcm1hdCh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0xhYmVsRm9tYXR0ZXIpO1xyXG5cclxuICAgIGxldCB5TGluZUF4aXMgPSBudWxsO1xyXG4gICAgaWYgKHNjYWxlcy5saW5lWXNjYWxlKSB7XHJcbiAgICAgIHlMaW5lQXhpcyA9IGQzXHJcbiAgICAgICAgLmF4aXNSaWdodChzY2FsZXMubGluZVlzY2FsZSlcclxuICAgICAgICAudGlja3ModGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgICAgLnRpY2tTaXplKDApXHJcbiAgICAgICAgLnRpY2tGb3JtYXQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUxpbmVBeGlzTGFiZWxGb21hdHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgeEF4aXMsIHlBeGlzLCB5TGluZUF4aXMgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQmFycyhcclxuICAgIHN2ZzogYW55LFxyXG4gICAgbGF5ZXJzOiBhbnlbXSxcclxuICAgIHNjYWxlczogYW55LFxyXG4gICAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsXHJcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zXHJcbiAgKSB7XHJcbiAgICBjb25zdCBsYXllciA9IHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCcubGF5ZXInKVxyXG4gICAgICAuZGF0YShsYXllcnMpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGF5ZXInKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAoZDogYW55KSA9PiBtZXRhRGF0YS5jb2xvcnNbZC5rZXldKTtcclxuXHJcbiAgICBjb25zdCByZWN0ID0gbGF5ZXJcclxuICAgICAgLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAgIC5kYXRhKChkOiBhbnkpID0+IGQpXHJcbiAgICAgIC5lbnRlcigpO1xyXG5cclxuICAgIHRoaXMuYXBwZW5kUmVjdGFuZ2xlcyhyZWN0LCBzY2FsZXMsIG1ldGFEYXRhLCBkaW1lbnNpb25zKTtcclxuICAgIHRoaXMuYWRkSW50ZXJhY3Rpb25zKHJlY3QsIHN2ZywgbWV0YURhdGEsIHNjYWxlcyk7XHJcbiAgICBcclxuICAgIHJldHVybiByZWN0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRSZWN0YW5nbGVzKFxyXG4gIHJlY3Q6IGFueSxcclxuICBzY2FsZXM6IGFueSxcclxuICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSxcclxuICBkaW1lbnNpb25zOiBEaW1lbnNpb25zXHJcbikge1xyXG4gIGNvbnN0IHsgYmFyV2lkdGgsIGJhclBhZGRpbmcgfSA9IGRpbWVuc2lvbnM7XHJcbiAgY29uc3QgeyB4U2NhbGUsIHlTY2FsZSB9ID0gc2NhbGVzO1xyXG5cclxuICByZWN0XHJcbiAgICAuYXBwZW5kKCdyZWN0JylcclxuICAgIC5vbignY2xpY2snLCAoZDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5jaGFydERhdGEubGluZURhdGEgfHwgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uZm9yQ29tcGFyaXNvbikge1xyXG4gICAgICAgIGlmICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrPy5pbmNsdWRlcyhkLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVDbGljayhkLmRhdGEubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoJ3knLCAoZDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghaXNOYU4oZFswXSkgJiYgIWlzTmFOKGRbMV0pKSB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0geVNjYWxlKGRbMF0pIC0geVNjYWxlKGRbMV0pO1xyXG4gICAgICAgIHJldHVybiBhY3R1YWxIZWlnaHQgPCAzID8geVNjYWxlKGRbMF0pIC0gMyA6IHlTY2FsZShkWzFdKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pXHJcbiAgICAuYXR0cigneCcsIChkOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgeFBvc2l0aW9uID0geFNjYWxlKGQuZGF0YS5uYW1lKTtcclxuICAgICAgY29uc3QgYmFuZHdpZHRoID0geFNjYWxlLmJhbmR3aWR0aCgpO1xyXG4gICAgICBcclxuICAgICAgaWYgKCF0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSkge1xyXG4gICAgICAgIHJldHVybiB4UG9zaXRpb24gKyAoYmFuZHdpZHRoIC0gYmFyV2lkdGgpIC8gMjtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCAmJiB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA8PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuIHhQb3NpdGlvbiArIGJhbmR3aWR0aCAvIDIgLSAzNTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjYWxjdWxhdGVkV2lkdGggPSBiYW5kd2lkdGggKiAwLjg7XHJcbiAgICAgIHJldHVybiB4UG9zaXRpb24gKyAoYmFuZHdpZHRoIC0gY2FsY3VsYXRlZFdpZHRoKSAvIDI7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIChkOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFpc05hTihkWzBdKSAmJiAhaXNOYU4oZFsxXSkpIHtcclxuICAgICAgICBjb25zdCBhY3R1YWxIZWlnaHQgPSB5U2NhbGUoZFswXSkgLSB5U2NhbGUoZFsxXSk7XHJcbiAgICAgICAgcmV0dXJuIGFjdHVhbEhlaWdodCA8IDMgPyAzIDogYWN0dWFsSGVpZ2h0O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKCd3aWR0aCcsIChkOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSkgcmV0dXJuIGJhcldpZHRoO1xyXG4gICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCAmJiB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA8PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuIDcwO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB4U2NhbGUuYmFuZHdpZHRoKCkgKiAwLjg7XHJcbiAgICB9KVxyXG4gICAgLnN0eWxlKCdjdXJzb3InLCAoZDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24pIHtcclxuICAgICAgICBpZiAobWV0YURhdGEuYmFyV2l0aG91dENsaWNrPy5pbmNsdWRlcyhkLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgcmV0dXJuICdkZWZhdWx0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICdwb2ludGVyJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gJ2RlZmF1bHQnO1xyXG4gICAgfSlcclxuICAgIC5zdHlsZSgnZmlsbCcsIChkOiBhbnkpID0+IHRoaXMuZ2V0QmFyQ29sb3IoZCwgbWV0YURhdGEpKTtcclxufVxyXG5cclxuICBwcml2YXRlIGdldEJhckNvbG9yKGQ6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiBzdHJpbmcge1xyXG4gICAgaWYgKFxyXG4gICAgICAhaXNOYU4oZFswXSkgJiZcclxuICAgICAgIWlzTmFOKGRbMV0pICYmXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbiAgICAgIHBhcnNlRmxvYXQoZFsxXSkgLSBwYXJzZUZsb2F0KGRbMF0pID49IHBhcnNlRmxvYXQoU3RyaW5nKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmJhckFib3ZlVGFyZ2V0Q29sb3IgfHwgbWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZXRhRGF0YS5jb2xvcnNbZC5rZXldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRJbnRlcmFjdGlvbnMocmVjdDogYW55LCBzdmc6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsIHNjYWxlczogYW55KSB7XHJcbiAgICByZWN0XHJcbiAgICAgIC5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgICAub24oJ21vdXNlZW50ZXInLCAoZDogYW55KSA9PiB0aGlzLmhhbmRsZU1vdXNlT3ZlcihkLCBzdmcsIG1ldGFEYXRhLCBzY2FsZXMpKVxyXG4gICAgICAub24oJ21vdXNlb3V0JywgKGQ6IGFueSkgPT4gdGhpcy5oYW5kbGVNb3VzZU91dChzdmcsIG1ldGFEYXRhKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU1vdXNlT3ZlcihkOiBhbnksIHN2ZzogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSwgc2NhbGVzOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uZGlzcGxheVRpdGxlT25Ub3ApIHJldHVybjtcclxuXHJcbiAgICBzdmcuc2VsZWN0QWxsKCdyZWN0JylcclxuICAgICAgLmZpbHRlcigoZGF0YTogYW55KSA9PiBkYXRhID09PSBkKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAoZDogYW55KSA9PiB0aGlzLmdldEhvdmVyQ29sb3IoZCwgbWV0YURhdGEpKTtcclxuXHJcbiAgICB0aGlzLmRpc3BsYXlUb29sdGlwKGQsIHN2ZywgbWV0YURhdGEsIHNjYWxlcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEhvdmVyQ29sb3IoZDogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSk6IHN0cmluZyB7XHJcbiAgICBpZiAoXHJcbiAgICAgICFpc05hTihkWzBdKSAmJlxyXG4gICAgICAhaXNOYU4oZFsxXSkgJiZcclxuICAgICAgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiZcclxuICAgICAgcGFyc2VGbG9hdChkWzFdKSAtIHBhcnNlRmxvYXQoZFswXSkgPj0gcGFyc2VGbG9hdChTdHJpbmcodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KSlcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEuYmFyQWJvdmVUYXJnZXRIb3ZlckNvbG9yIHx8XHJcbiAgICAgICAgICAgICB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5iYXJBYm92ZVRhcmdldENvbG9yIHx8XHJcbiAgICAgICAgICAgICBtZXRhRGF0YS5jb2xvcnNbZC5rZXldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1ldGFEYXRhLmhvdmVyQ29sb3IgfHwgbWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzcGxheVRvb2x0aXAoZDogYW55LCBzdmc6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsIHNjYWxlczogYW55KSB7XHJcbiAgICBjb25zdCB7IHhTY2FsZSwgeVNjYWxlIH0gPSBzY2FsZXM7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGRbMV0gLSBkWzBdO1xyXG4gICAgXHJcbiAgICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYmFuZHdpZHRoID0geFNjYWxlLmJhbmR3aWR0aCgpO1xyXG4gICAgXHJcbiAgICAvLyBGaXhlZCB0b29sdGlwIHdpZHRoIGZvciBhbGwgcmVzb2x1dGlvbnNcclxuICAgIGNvbnN0IHdpZHRoID0gL3dlZWsvaS50ZXN0KGQuZGF0YS5uYW1lKSAmJiAvXFxkezR9LVxcZHsyfS1cXGR7Mn0vLnRlc3QoZC5kYXRhLm5hbWUpXHJcbiAgICAgID8gJzI1MHB4J1xyXG4gICAgICA6IGJhbmR3aWR0aCArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMiA+IDE4MFxyXG4gICAgICAgID8gJzE4MHB4J1xyXG4gICAgICAgIDogYmFuZHdpZHRoICsgdGhpcy5DT05TVEFOVFMuTEVGVF9SSUdIVF9TUEFDRVMgKiAyO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoJ3gnLCB0aGlzLmNhbGN1bGF0ZVRvb2x0aXBYKGQsIHhTY2FsZSwgd2lkdGgpKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKVxyXG4gICAgICAuYXR0cigneScsIHlTY2FsZShkWzFdKSAtIDUxKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB3aWR0aClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIDQwKVxyXG4gICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxyXG4gICAgICAuc3R5bGUoJ3otaW5kZXgnLCA5OSlcclxuICAgICAgLmh0bWwodGhpcy5nZW5lcmF0ZVRvb2x0aXBIdG1sKGQsIG1ldGFEYXRhLCB2YWx1ZSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVUb29sdGlwWChkOiBhbnksIHhTY2FsZTogYW55LCB3aWR0aDogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGJhbmR3aWR0aCA9IHhTY2FsZS5iYW5kd2lkdGgoKTtcclxuICAgIGNvbnN0IG51bWVyaWNXaWR0aCA9IHR5cGVvZiB3aWR0aCA9PT0gJ3N0cmluZycgPyBwYXJzZUludCh3aWR0aCkgOiB3aWR0aDtcclxuICAgIFxyXG4gICAgaWYgKGJhbmR3aWR0aCArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMiA+IDE4MCkge1xyXG4gICAgICByZXR1cm4geFNjYWxlKGQuZGF0YS5uYW1lKSAtIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICtcclxuICAgICAgICAgICAgIChiYW5kd2lkdGggKyB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyAqIDIgLSAxODApIC8gMjtcclxuICAgIH1cclxuICAgIHJldHVybiB4U2NhbGUoZC5kYXRhLm5hbWUpIC0gdGhpcy5DT05TVEFOVFMuTEVGVF9SSUdIVF9TUEFDRVM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlVG9vbHRpcEh0bWwoZDogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSwgdmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUgPT09IDApIHJldHVybiAnPHNwYW4gY2xhc3M9XCJ0aXRsZS10b3AtdGV4dFwiPjA8L3NwYW4+JztcclxuXHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG4gICAgY29uc3QgbmFtZSA9IGQuZGF0YS5uYW1lID8gYDxzcGFuIGNsYXNzPVwidGl0bGUtYmFyLW5hbWVcIj4ke2QuZGF0YS5uYW1lfTwvc3Bhbj5gIDogJyc7XHJcbiAgICBjb25zdCB2YWx1ZVRleHQgPSBtZXRhRGF0YS51bml0XHJcbiAgICAgID8gYCR7bWV0YURhdGEudW5pdH0ke3ZhbHVlfSAke2RhdGFUeXBlfWBcclxuICAgICAgOiBgJHt2YWx1ZX0gJHtkYXRhVHlwZX1gO1xyXG5cclxuICAgIHJldHVybiBgJHtuYW1lfTxzcGFuIGNsYXNzPVwidGl0bGUtdG9wLXRleHRcIj4ke3ZhbHVlVGV4dH08L3NwYW4+YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlTW91c2VPdXQoc3ZnOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKSB7XHJcbiAgICBpZiAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wKSByZXR1cm47XHJcblxyXG4gICAgc3ZnLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsIChkOiBhbnkpID0+IHRoaXMuZ2V0QmFyQ29sb3IoZCwgbWV0YURhdGEpKTtcclxuICAgIHN2Zy5zZWxlY3RBbGwoJy5saWItdmVydGljYWxzdGFjay10aXRsZS1vbnRvcCcpLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJBeGlzTGFiZWxzKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBzdmdZQXhpc0xlZnQ6IGFueSxcclxuICAgIGJvdHRvbUxhYmVsQ29udGFpbmVyOiBhbnksXHJcbiAgICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBtYXJnaW46IGFueVxyXG4gICkge1xyXG4gICAgaWYgKG1ldGFEYXRhLnlMYWJlbCkge1xyXG4gICAgICB0aGlzLmFkZFlBeGlzTGFiZWwoc3ZnWUF4aXNMZWZ0LCBtZXRhRGF0YS55TGFiZWwsIGRpbWVuc2lvbnMuaGVpZ2h0LCBtYXJnaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXRhRGF0YS54TGFiZWwpIHtcclxuICAgICAgdGhpcy5hZGRYQXhpc0xhYmVsKGJvdHRvbUxhYmVsQ29udGFpbmVyLCBtZXRhRGF0YS54TGFiZWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRZQXhpc0xhYmVsKHN2Z1lBeGlzTGVmdDogYW55LCBsYWJlbDogc3RyaW5nLCBoZWlnaHQ6IG51bWJlciwgbWFyZ2luOiBhbnkpIHtcclxuICAgIGNvbnN0IGlzcmlhID0gdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb24/LmlzUmlhO1xyXG4gICAgY29uc3QgaXNBY3JvbnltID0gdGhpcy5pc0Fjcm9ueW1MYWJlbChsYWJlbCk7XHJcbiAgICBjb25zdCB5UG9zaXRpb24gPSBpc3JpYSA/IC1tYXJnaW4ubGVmdCAvIDIgLSAzMCA6IC1tYXJnaW4ubGVmdCAvIDIgLSA0MDtcclxuXHJcbiAgICBzdmdZQXhpc0xlZnQuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwsIC5saWIteWxhYmVsLWRyaWxsZG93bmNoYXJ0cywgLmxpYi15bGFiZWwtd2Vla2x5Q2hhcnRzJykucmVtb3ZlKCk7XHJcblxyXG4gICAgc3ZnWUF4aXNMZWZ0XHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCB0aGlzLmdldFlBeGlzTGFiZWxDbGFzcygpKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbWxhYmVsU3R5bGVzKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcclxuICAgICAgLmF0dHIoJ3knLCB5UG9zaXRpb24pXHJcbiAgICAgIC5hdHRyKCd4JywgLWhlaWdodCAvIDIpXHJcbiAgICAgIC5hdHRyKCdkeScsICcxZW0nKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC50ZXh0KGlzQWNyb255bSA/IGxhYmVsLnRvVXBwZXJDYXNlKCkgOiBsYWJlbC50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtdHJhbnNmb3JtJywgaXNBY3JvbnltID8gJ25vbmUnIDogJ2NhcGl0YWxpemUnKTtcclxuICB9XHJcblxyXG5wcml2YXRlIGFkZFhBeGlzTGFiZWwoYm90dG9tTGFiZWxDb250YWluZXI6IGFueSwgbGFiZWw6IHN0cmluZykge1xyXG4gIGNvbnN0IGlzQWNyb255bSA9IHRoaXMuaXNBY3JvbnltTGFiZWwobGFiZWwpO1xyXG5cclxuICBib3R0b21MYWJlbENvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnZGl2JylcclxuICAgIC5zdHlsZSgnd2lkdGgnLCAnMTAwJScpXHJcbiAgICAuc3R5bGUoJ3RleHQtYWxpZ24nLCAnY2VudGVyJylcclxuICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzEycHgnKVxyXG4gICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxyXG4gICAgLnN0eWxlKCdmb250LWZhbWlseScsICdzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBSb2JvdG8nKVxyXG4gICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAuc3R5bGUoJ3RleHQtdHJhbnNmb3JtJywgaXNBY3JvbnltID8gJ25vbmUnIDogJ2NhcGl0YWxpemUnKVxyXG4gICAgLnRleHQoaXNBY3JvbnltID8gbGFiZWwudG9VcHBlckNhc2UoKSA6IGxhYmVsLnRvTG93ZXJDYXNlKCkpO1xyXG59XHJcblxyXG4gIHByaXZhdGUgaXNBY3JvbnltTGFiZWwobGFiZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY2xlYW5MYWJlbCA9IGxhYmVsLnJlcGxhY2UoL1teQS1aYS16XS9nLCAnJyk7XHJcbiAgICByZXR1cm4gKGxhYmVsLmxlbmd0aCA8PSA0ICYmIC9eW0EtWl0rJC8udGVzdChsYWJlbCkpIHx8XHJcbiAgICAgICAgICAgKGxhYmVsID09PSBsYWJlbC50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChsYWJlbCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRZQXhpc0xhYmVsQ2xhc3MoKTogc3RyaW5nIHtcclxuICAgIGxldCBiYXNlQ2xhc3MgPSAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgZm9udC1zaXplLTEnO1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc30gbGliLXlsYWJlbC1kcmlsbGRvd25jaGFydHNgO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc30gbGliLXlsYWJlbC13ZWVrbHlDaGFydHNgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke2Jhc2VDbGFzc30gbGliLWF4aXMtd2F0ZXJmYWxsLWxhYmVsYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0WEF4aXNMYWJlbENsYXNzKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3N9IGxpYi14bGFiZWwtZHJpbGxkb3duY2hhcnRzYDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3N9IGxpYi14bGFiZWwtd2Vla2x5Q2hhcnRzYDtcclxuICAgIH1cclxuICAgIHJldHVybiBgJHtiYXNlQ2xhc3N9IGxpYi1heGlzLXdhdGVyZmFsbC1sYWJlbGA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5Q29uZmlndXJhdGlvbkZsYWdzKCkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaXNIZWFkZXJWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVG9wQ2FwdGlvblZpc2libGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmlzVG9wQ2FwdGlvblZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RvcENhcHRpb25WaXNpYmxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZVN0YWNrZWRDaGFydCgpIHtcclxuICAgIC8vIFVzZSBmaXhlZCBjb25maWd1cmF0aW9uIGZvciBhbGwgcmVzb2x1dGlvbnNcclxuICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbiA9IHsgdG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDQwLCBsZWZ0OiA0MCB9O1xyXG4gICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MgPSA1O1xyXG4gICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ID0gNzA7XHJcbiAgICBcclxuICAgIHRoaXMubWVyZ2VDb25maWd1cmF0aW9ucygpO1xyXG4gICAgdGhpcy5hcHBseUNvbmZpZ3VyYXRpb25GbGFncygpO1xyXG5cclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gICAgY29uc3QgbWV0YURhdGEgPSB0aGlzLnByZXBhcmVNZXRhRGF0YSh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YSk7XHJcbiAgICBjb25zdCBsaW5lRGF0YSA9IHRoaXMuY2hhcnREYXRhLmxpbmVEYXRhO1xyXG4gICAgY29uc3QgY29sb3JzID0gbWV0YURhdGEuY29sb3JzO1xyXG4gICAgY29uc3Qga2V5TGlzdCA9IG1ldGFEYXRhLmtleUxpc3Q7XHJcblxyXG4gICAgY29uc3QgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy52ZXJ0aWNhbHN0YWNrZWRjb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBcclxuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmNhbGN1bGF0ZURpbWVuc2lvbnMoXHJcbiAgICAgIGNoYXJ0Q29udGFpbmVyLFxyXG4gICAgICB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIsXHJcbiAgICAgIG1hcmdpbixcclxuICAgICAgZGF0YS5sZW5ndGhcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgaGFzWExhYmVsID0gISFtZXRhRGF0YS54TGFiZWw7XHJcblxyXG4gICAgY29uc3QgeyBzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgYm90dG9tTGFiZWxDb250YWluZXIgfSA9IHRoaXMuY3JlYXRlU3ZnQ29udGFpbmVycyhcclxuICAgICAgY2hhcnRDb250YWluZXIsXHJcbiAgICAgIGRpbWVuc2lvbnMsXHJcbiAgICAgIG1hcmdpbixcclxuICAgICAgaGFzWExhYmVsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHN0YWNrOiBhbnkgPSBkMy5zdGFjaygpLmtleXMoa2V5TGlzdCkub2Zmc2V0KGQzLnN0YWNrT2Zmc2V0Tm9uZSk7XHJcbiAgICBjb25zdCBsYXllcnM6IGFueSA9IHN0YWNrKGRhdGEpO1xyXG4gICAgZGF0YS5zb3J0KChhLCBiKSA9PiBiLnRvdGFsIC0gYS50b3RhbCk7XHJcblxyXG4gICAgY29uc3Qgc2NhbGVzID0gdGhpcy5jcmVhdGVTY2FsZXMoZGF0YSwgbGF5ZXJzLCBsaW5lRGF0YSwgZGltZW5zaW9ucyk7XHJcbiAgICBjb25zdCBheGVzID0gdGhpcy5jcmVhdGVBeGVzKHNjYWxlcyk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJHcmlkcyhzdmcsIHNjYWxlcywgZGltZW5zaW9ucyk7XHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJCYXJzKHN2ZywgbGF5ZXJzLCBzY2FsZXMsIG1ldGFEYXRhLCBkaW1lbnNpb25zKTtcclxuICAgIHRoaXMucmVuZGVyQXhlcyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgYXhlcywgc2NhbGVzLCBkaW1lbnNpb25zLCBkYXRhKTtcclxuICAgIHRoaXMucmVuZGVyQXhpc0xhYmVscyhzdmcsIHN2Z1lBeGlzTGVmdCxib3R0b21MYWJlbENvbnRhaW5lciwgbWV0YURhdGEsIGRpbWVuc2lvbnMsIG1hcmdpbik7XHJcbiAgICB0aGlzLnJlbmRlclRhcmdldExpbmUoc3ZnLCBzdmdZQXhpc1JpZ2h0LCBzY2FsZXMsIGRpbWVuc2lvbnMsIG1ldGFEYXRhKTtcclxuICAgIHRoaXMucmVuZGVyRGF0YUxhYmVscyhyZWN0LCBzY2FsZXMsIG1ldGFEYXRhLCBkaW1lbnNpb25zKTtcclxuICAgIHRoaXMucmVuZGVyTGluZUNoYXJ0KHN2ZywgbGluZURhdGEsIHNjYWxlcywgY29sb3JzLCBtZXRhRGF0YSk7XHJcbiAgfVxyXG5cclxucHJpdmF0ZSByZW5kZXJHcmlkcyhzdmc6IGFueSwgc2NhbGVzOiBhbnksIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMpIHtcclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYZ3JpZEJldHdlZW5MYWJlbHMpIHtcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dyaWQgdmVydGljYWwtZ3JpZCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7c2NhbGVzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDJ9LCR7ZGltZW5zaW9ucy5oZWlnaHR9KWApXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oc2NhbGVzLnhTY2FsZSkudGlja1NpemUoLWRpbWVuc2lvbnMuaGVpZ2h0KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAnIzk5OTk5OScpXHJcbiAgICAgIC5jYWxsKChnOiBhbnkpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzR3JpZCkge1xyXG4gICAgY29uc3QgZ3JpZFdpZHRoID0gZGltZW5zaW9ucy5yZXF1aXJlZFN2Z1dpZHRoO1xyXG4gICAgXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkIGhvcml6b250YWwtZ3JpZCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgICAuY2FsbChcclxuICAgICAgICBkM1xyXG4gICAgICAgICAgLmF4aXNMZWZ0KHNjYWxlcy55U2NhbGUpXHJcbiAgICAgICAgICAudGlja3ModGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgICAgICAudGlja1NpemUoLWdyaWRXaWR0aClcclxuICAgICAgICAgIC50aWNrRm9ybWF0KCcnKVxyXG4gICAgICApXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciknKVxyXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMScpXHJcbiAgICAgIC5jYWxsKChnOiBhbnkpID0+IHtcclxuICAgICAgICBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0dyaWQpIHtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNHcmlkLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsIGB4JHtqICsgMn0gYXhpcyR7aiArIDJ9YClcclxuICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWdyaWQtY29sb3IpJylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7ZGltZW5zaW9ucy5oZWlnaHQgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0dyaWRbal19KWApXHJcbiAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbShzY2FsZXMueFNjYWxlKS50aWNrU2l6ZSgwKS50aWNrcyg1KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQXhlcyhcclxuICAgIHN2ZzogYW55LFxyXG4gICAgc3ZnWUF4aXNMZWZ0OiBhbnksXHJcbiAgICBzdmdZQXhpc1JpZ2h0OiBhbnksXHJcbiAgICBheGVzOiBhbnksXHJcbiAgICBzY2FsZXM6IGFueSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBkYXRhOiBhbnlbXVxyXG4gICkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnNob3dYYXhpc1RvcCkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWxpbmUtYXhpcy10ZXh0IGxpYi1saW5lLXgtYXhpcy10ZXh0IHgtYXhpcycpXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oc2NhbGVzLnhTY2FsZSkudGlja1NpemUoMCkpO1xyXG4gICAgICBzdmcuc2VsZWN0QWxsKCcueC1heGlzID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyU3RhbmRhcmRBeGVzKHN2ZywgYXhlcywgc2NhbGVzLCBkaW1lbnNpb25zLCBkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICB0aGlzLnJlbmRlckRyaWxsZG93bkF4ZXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIGF4ZXMsIHNjYWxlcywgZGltZW5zaW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlck11bHRpQ2hhcnRBeGVzKHN2ZywgYXhlcywgc2NhbGVzLCBkaW1lbnNpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFwcGx5QXhpc1N0eWxpbmcoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQpO1xyXG4gICAgdGhpcy5hcHBseUF4aXNDb25maWd1cmF0aW9ucyhzdmcsIHNjYWxlcywgZGltZW5zaW9ucywgZGF0YSk7XHJcbiAgfVxyXG5cclxucHJpdmF0ZSByZW5kZXJTdGFuZGFyZEF4ZXMoXHJcbiAgc3ZnOiBhbnksXHJcbiAgYXhlczogYW55LFxyXG4gIHNjYWxlczogYW55LFxyXG4gIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgZGF0YTogYW55W11cclxuKSB7XHJcbiAgY29uc3QgaXNNb2JpbGVPclRhYmxldCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTAyNDtcclxuICBcclxuICAvLyBYLWF4aXMgd2l0aCBsYWJlbHNcclxuICBjb25zdCB4QXhpc0dyb3VwID0gc3ZnXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtkaW1lbnNpb25zLmhlaWdodH0pYClcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC14LWF4aXMtdGV4dCcpXHJcbiAgICAuY2FsbChheGVzLnhBeGlzKTtcclxuXHJcbiAgLy8gU3R5bGUgWC1heGlzIGxhYmVsc1xyXG4gIHhBeGlzR3JvdXBcclxuICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgIC5zdHlsZSgnZm9udC1zaXplJywgaXNNb2JpbGVPclRhYmxldCA/ICcxMHB4JyA6ICcxMnB4JylcclxuICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgLmF0dHIoJ2R5JywgJzFlbScpXHJcbiAgICAuZWFjaChmdW5jdGlvbih0aGlzOiBTVkdUZXh0RWxlbWVudCwgZDogYW55KSB7XHJcbiAgICAgIGNvbnN0IHRleHRFbGVtZW50ID0gZDMuc2VsZWN0KHRoaXMpO1xyXG4gICAgICBjb25zdCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dCgpO1xyXG4gICAgICAgIFxyXG4gICAgICBpZiAoaXNNb2JpbGVPclRhYmxldCAmJiB0ZXh0Lmxlbmd0aCA+IDEyKSB7XHJcbiAgICAgICAgdGV4dEVsZW1lbnQudGV4dCh0ZXh0LnN1YnN0cmluZygwLCAxMCkgKyAnLi4uJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAvLyBFbnN1cmUgWC1heGlzIGxpbmUgaXMgdmlzaWJsZVxyXG4gIHhBeGlzR3JvdXBcclxuICAgIC5zZWxlY3QoJy5kb21haW4nKVxyXG4gICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciknKVxyXG4gICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcclxuICAgIC5hdHRyKCdkJywgYE0wLDAuNUgke2RpbWVuc2lvbnMucmVxdWlyZWRTdmdXaWR0aH1gKTtcclxuXHJcbiAgLy8gWS1heGlzXHJcbiAgc3ZnXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dCcpXHJcbiAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAuY2FsbChheGVzLnlBeGlzKVxyXG4gICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxufVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRyaWxsZG93bkF4ZXMoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIHN2Z1lBeGlzTGVmdDogYW55LFxyXG4gICAgc3ZnWUF4aXNSaWdodDogYW55LFxyXG4gICAgYXhlczogYW55LFxyXG4gICAgc2NhbGVzOiBhbnksXHJcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zXHJcbiAgKSB7XHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtkaW1lbnNpb25zLmhlaWdodH0pYClcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXgtYXhpcy10ZXh0IG11bHRpY2hhcnQxJylcclxuICAgICAgLmNhbGwoYXhlcy54QXhpcylcclxuICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgICBzdmdZQXhpc0xlZnRcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93biB5YXhpcy1kYXNoZWQnKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAgIC5jYWxsKGF4ZXMueUF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbiAgICBzdmdZQXhpc1JpZ2h0XHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAuY2FsbChheGVzLnlBeGlzKVxyXG4gICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJNdWx0aUNoYXJ0QXhlcyhzdmc6IGFueSwgYXhlczogYW55LCBzY2FsZXM6IGFueSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7ZGltZW5zaW9ucy5oZWlnaHR9KWApXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC14LWF4aXMtdGV4dCBtdWx0aWNoYXJ0JylcclxuICAgICAgLmNhbGwoYXhlcy54QXhpcylcclxuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0IHlheGlzLWRhc2hlZCcpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgLmNhbGwoYXhlcy55QXhpcylcclxuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUF4aXNTdHlsaW5nKHN2ZzogYW55LCBzdmdZQXhpc0xlZnQ6IGFueSwgc3ZnWUF4aXNSaWdodDogYW55KSB7XHJcbiAgICBjb25zdCBzdHlsZUF4aXNEb21haW4gPSAoY29udGFpbmVyOiBhbnkpID0+IHtcclxuICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnLmRvbWFpbicpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciknKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzFweCcpO1xyXG4gICAgfTtcclxuXHJcbiAgICBzdHlsZUF4aXNEb21haW4oc3ZnKTtcclxuICAgIHN0eWxlQXhpc0RvbWFpbihzdmdZQXhpc0xlZnQpO1xyXG4gICAgc3R5bGVBeGlzRG9tYWluKHN2Z1lBeGlzUmlnaHQpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzRGFzaGVkKSB7XHJcbiAgICAgIGQzLnNlbGVjdEFsbCgnLnlheGlzLWRhc2hlZCcpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yKScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzQ29sb3IpIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCcubXVsdGljaGFydCcpLnN0eWxlKFxyXG4gICAgICAgICdjb2xvcicsXHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0NvbG9yIHx8ICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKSdcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlBeGlzQ29uZmlndXJhdGlvbnMoc3ZnOiBhbnksIHNjYWxlczogYW55LCBkaW1lbnNpb25zOiBEaW1lbnNpb25zLCBkYXRhOiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCcubXVsdGljaGFydCA+IGcgPiB0ZXh0JykuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy5tdWx0aWNoYXJ0ID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0xhYmVsSGlkZGVuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJDdXN0b21YQXhpcyhzdmcsIHNjYWxlcywgZGltZW5zaW9ucywgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgICBzdmcuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0hpZGRlbikge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDkpIHtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLnNlbGVjdEFsbCgnLmxpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcclxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnZW5kJylcclxuICAgICAgICAuYXR0cigneCcsICctNScpXHJcbiAgICAgICAgLmF0dHIoJ2R5JywgbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckN1c3RvbVhBeGlzKHN2ZzogYW55LCBzY2FsZXM6IGFueSwgZGltZW5zaW9uczogRGltZW5zaW9ucywgZGF0YTogYW55W10pIHtcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3gxIGF4aXMxJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke2RpbWVuc2lvbnMuaGVpZ2h0fSlgKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJyMwMDAnKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHNjYWxlcy54U2NhbGUpLnRpY2tTaXplKDApKVxyXG4gICAgICAuY2FsbCgoZzogYW55KSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLmF0dHIoJ2ZpbGwnLCAnbm9uZScpKTtcclxuXHJcbiAgICB0aGlzLnN0eWxlQ3VzdG9tWEF4aXNUaWNrcyhzdmcsIGRhdGEpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54TGFiZWxzT25TYW1lTGluZSkge1xyXG4gICAgICB0aGlzLmFwcGx5WExhYmVsc09uU2FtZUxpbmUoc3ZnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3R5bGVDdXN0b21YQXhpc1RpY2tzKHN2ZzogYW55LCBkYXRhOiBhbnlbXSkge1xyXG4gICAgbGV0IGFsdGVybmF0ZVRleHQgPSBmYWxzZTtcclxuXHJcbiAgICBzdmcuc2VsZWN0QWxsKCcueDEuYXhpczEgLnRpY2sgbGluZScpLmF0dHIoJ3kyJywgKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaGlkZVhheGlzVGljaykgcmV0dXJuIDA7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoYWx0ZXJuYXRlVGV4dCAmJiAhdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNOb0FsdGVybmF0ZVhheGlzVGV4dCkge1xyXG4gICAgICAgIGFsdGVybmF0ZVRleHQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5DT05TVEFOVFMuTE9OR19USUNLX0xFTkdUSF9CRyAtIDc7XHJcbiAgICAgIH1cclxuICAgICAgYWx0ZXJuYXRlVGV4dCA9IHRydWU7XHJcbiAgICAgIHJldHVybiB0aGlzLkNPTlNUQU5UUy5TSE9SVF9USUNLX0xFTkdUSF9CRyAtIDQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhbHRlcm5hdGVUZXh0ID0gZmFsc2U7XHJcbiAgICBzdmdcclxuICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoID4gOCBcclxuICAgICAgICAgICAgPyAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24tYWx0J1xyXG4gICAgICAgICAgICA6ICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnbGliLXhheGlzLWxhYmVscy10ZXh0cy13ZWVrbHljaGFydHMnO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cigneScsICgpID0+IHtcclxuICAgICAgICBpZiAoYWx0ZXJuYXRlVGV4dCkge1xyXG4gICAgICAgICAgYWx0ZXJuYXRlVGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ09OU1RBTlRTLkxPTkdfVElDS19MRU5HVEhfQkc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFsdGVybmF0ZVRleHQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLkNPTlNUQU5UUy5TSE9SVF9USUNLX0xFTkdUSF9CRztcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5WExhYmVsc09uU2FtZUxpbmUoc3ZnOiBhbnkpIHtcclxuICAgIHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgLmF0dHIoJ3knLCB0aGlzLkNPTlNUQU5UUy5TSE9SVF9USUNLX0xFTkdUSF9CRylcclxuICAgICAgLnRleHQoKGQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBkLnRyaW0oKTtcclxuICAgICAgICBjb25zdCBzcGFjZUluZGV4ID0gdHJpbW1lZC5pbmRleE9mKCcgJyk7XHJcbiAgICAgICAgcmV0dXJuIHNwYWNlSW5kZXggPiAtMSBcclxuICAgICAgICAgID8gdHJpbW1lZC5zdWJzdHJpbmcoMCwgc3BhY2VJbmRleCkudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgOiB0cmltbWVkLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljaycpXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAuYXR0cigneScsIHRoaXMuQ09OU1RBTlRTLkxPTkdfVElDS19MRU5HVEhfQkcpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ2N1cnJlbnRDb2xvcicpXHJcbiAgICAgIC50ZXh0KChkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCB0cmltbWVkID0gZC50cmltKCk7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VJbmRleCA9IHRyaW1tZWQuaW5kZXhPZignICcpO1xyXG4gICAgICAgIHJldHVybiBzcGFjZUluZGV4ID4gLTEgXHJcbiAgICAgICAgICA/IHRyaW1tZWQuc3Vic3RyaW5nKHNwYWNlSW5kZXgpLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgIDogJyc7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEYXRhTGFiZWxzKHJlY3Q6IGFueSwgc2NhbGVzOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhLCBkaW1lbnNpb25zOiBEaW1lbnNpb25zKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNDQyAmJiAhdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUpIHtcclxuICAgICAgcmVjdC5hcHBlbmQoJ3N2Zzp0aXRsZScpLnRleHQoKGQ6IGFueSkgPT4gZFsxXSAtIGRbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zaG93VG90YWxPblRvcCkge1xyXG4gICAgICB0aGlzLnJlbmRlclRvcExhYmVscyhyZWN0LCBzY2FsZXMsIG1ldGFEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc2hvd0FuZ2xlZExhYmVscykge1xyXG4gICAgICB0aGlzLnJlbmRlckFuZ2xlZExhYmVscyhyZWN0LCBzY2FsZXMsIG1ldGFEYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVG9wTGFiZWxzKHJlY3Q6IGFueSwgc2NhbGVzOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKSB7XHJcbiAgICBjb25zdCBmb3JtYXRGcm9tQmFja2VuZCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXJcclxuICAgICAgPyBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlcilcclxuICAgICAgOiAoZDogYW55KSA9PiBkO1xyXG4gICAgY29uc3QgZm9ybWF0Rm9ySHVnZU51bWJlcnMgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoJy4ycycpO1xyXG5cclxuICAgIHJlY3RcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCd4JywgKGQ6IGFueSkgPT4gc2NhbGVzLnhTY2FsZShkLmRhdGEubmFtZSkgKyBzY2FsZXMueFNjYWxlLmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLWxhYmVscy1vbnRvcC13ZWtseWNoYXJ0cycpXHJcbiAgICAgIC5hdHRyKCd5JywgKGQ6IGFueSkgPT4gc2NhbGVzLnlTY2FsZShkWzFdKSAtIDMpXHJcbiAgICAgIC50ZXh0KChkOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRbMV0gLSBkWzBdO1xyXG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IDApIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlIDw9IDk5OSBcclxuICAgICAgICAgID8gZm9ybWF0RnJvbUJhY2tlbmQodmFsdWUpXHJcbiAgICAgICAgICA6IGZvcm1hdEZvckh1Z2VOdW1iZXJzKHZhbHVlKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gbWV0YURhdGEudW5pdCA/IG1ldGFEYXRhLnVuaXQgKyBmb3JtYXR0ZWRWYWx1ZSA6IGZvcm1hdHRlZFZhbHVlO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQW5nbGVkTGFiZWxzKHJlY3Q6IGFueSwgc2NhbGVzOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKSB7XHJcbiAgICBjb25zdCBmb3JtYXRGcm9tQmFja2VuZCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXJcclxuICAgICAgPyBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlcilcclxuICAgICAgOiAoZDogYW55KSA9PiBkO1xyXG4gICAgY29uc3QgZm9ybWF0Rm9ySHVnZU51bWJlcnMgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoJy4ycycpO1xyXG4gICAgY29uc3QgdGVtcE9iamVjdEhvbGRlcjogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG5cclxuICAgIHJlY3RcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCd4JywgMClcclxuICAgICAgLmF0dHIoJ3knLCAwKVxyXG4gICAgICAuYXR0cignZmlsbCcsIChkOiBhbnkpID0+IG1ldGFEYXRhLmNvbG9yc1tkLmtleV0pXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItZGF0YS1sYWJlbHMtYW5nbGVkLXdlZWtseWNoYXJ0cycpXHJcbiAgICAgIC50ZXh0KChkOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRbMV0gLSBkWzBdO1xyXG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPD0gMCkgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdmFsdWUgPD0gOTk5XHJcbiAgICAgICAgICA/IGZvcm1hdEZyb21CYWNrZW5kKHZhbHVlKVxyXG4gICAgICAgICAgOiBmb3JtYXRGb3JIdWdlTnVtYmVycyh2YWx1ZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG1ldGFEYXRhLnVuaXQgPyBtZXRhRGF0YS51bml0ICsgZm9ybWF0dGVkVmFsdWUgOiBmb3JtYXR0ZWRWYWx1ZTtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRbMV0gLSBkWzBdO1xyXG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPD0gMCkgcmV0dXJuICdyb3RhdGUoMCknO1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIGxldCBpbmNyZW1lbnRlciA9IDE7XHJcbiAgICAgICAgbWV0YURhdGEua2V5TGlzdC5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICBpZiAoZC5kYXRhW2tleV0pIHtcclxuICAgICAgICAgICAgdG90YWwgKz0gZC5kYXRhW2tleV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbmNyZW1lbnRlciA9IDI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRlbXBPYmplY3RIb2xkZXJbZC5kYXRhLm5hbWVdID0gKHRlbXBPYmplY3RIb2xkZXJbZC5kYXRhLm5hbWVdIHx8IDApICsgaW5jcmVtZW50ZXI7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0ZW1wT2JqZWN0SG9sZGVyW2QuZGF0YS5uYW1lXTtcclxuICAgICAgICBjb25zdCB4UG9zID0gc2NhbGVzLnhTY2FsZShkLmRhdGEubmFtZSk7XHJcbiAgICAgICAgY29uc3QgYmFuZHdpZHRoID0gc2NhbGVzLnhTY2FsZS5iYW5kd2lkdGgoKTtcclxuICAgICAgICBjb25zdCB5UG9zID0gc2NhbGVzLnlTY2FsZSh0b3RhbCkgLSAzO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFBvcyArIGJhbmR3aWR0aCAvIDN9LCR7eVBvc30pIHJvdGF0ZSgyNzApYDtcclxuICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHt4UG9zICsgYmFuZHdpZHRoIC8gMiArIDJ9LCR7eVBvc30pIHJvdGF0ZSgyNzApYDtcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFBvcyArIChiYW5kd2lkdGggKiAzKSAvIDR9LCR7eVBvc30pIHJvdGF0ZSgyNzApYDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUYXJnZXRMaW5lKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBzdmdZQXhpc1JpZ2h0OiBhbnksXHJcbiAgICBzY2FsZXM6IGFueSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YVxyXG4gICkge1xyXG4gICAgaWYgKCF0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IHRoaXMucGFyc2VUYXJnZXRWYWx1ZSh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpO1xyXG4gICAgY29uc3QgeVplcm8gPSBzY2FsZXMueVNjYWxlKHBhcnNlZFRhcmdldCk7XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgICAuYXR0cigneDEnLCAwKVxyXG4gICAgICAuYXR0cigneDInLCBkaW1lbnNpb25zLndpZHRoKVxyXG4gICAgICAuYXR0cigneTEnLCB5WmVybylcclxuICAgICAgLmF0dHIoJ3kyJywgeVplcm8pXHJcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmNvbG9yKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlclRhcmdldExhYmVsKHN2Z1lBeGlzUmlnaHQsIHlaZXJvLCBtZXRhRGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhcnNlVGFyZ2V0VmFsdWUodGFyZ2V0OiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdChTdHJpbmcodGFyZ2V0KSk7XHJcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIDA7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpID8gcGFyc2VJbnQoU3RyaW5nKHRhcmdldCkpIDogcGFyc2VkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUYXJnZXRMYWJlbChzdmdZQXhpc1JpZ2h0OiBhbnksIHlaZXJvOiBudW1iZXIsIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKSB7XHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldE5hbWUgfHwgJ3RhcmdldCc7XHJcblxyXG4gICAgc3ZnWUF4aXNSaWdodFxyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke3laZXJvIC0gMTN9KWApXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4gICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAndGFyZ2V0LWRpc3BsYXknKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmh0bWwoYDxkaXY+JHt0YXJnZXROYW1lfTwvZGl2PjxkaXY+JHt0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXR9JHtkYXRhVHlwZX08L2Rpdj5gKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTGluZUNoYXJ0KHN2ZzogYW55LCBsaW5lRGF0YTogYW55W10sIHNjYWxlczogYW55LCBjb2xvcnM6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEpIHtcclxuICAgIGlmICghbGluZURhdGEgfHwgIWNvbG9ycykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGRhdGFHcm91cCA9IGQzXHJcbiAgICAgIC5uZXN0KClcclxuICAgICAgLmtleSgoZDogYW55KSA9PiBkLmNhdGVnb3J5KVxyXG4gICAgICAuZW50cmllcyhsaW5lRGF0YSk7XHJcblxyXG4gICAgY29uc3QgbGluZUdlbiA9IGQzXHJcbiAgICAgIC5saW5lKClcclxuICAgICAgLngoKGQ6IGFueSkgPT4gc2NhbGVzLnhTY2FsZShkLm5hbWUpICsgc2NhbGVzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgIC55KChkOiBhbnkpID0+IHNjYWxlcy5saW5lWXNjYWxlKGQudmFsdWUpKTtcclxuXHJcbiAgICBkYXRhR3JvdXAuZm9yRWFjaCgoZ3JvdXA6IGFueSkgPT4ge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcclxuICAgICAgICAuZGF0dW0oZ3JvdXAudmFsdWVzKVxyXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAoZDogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZFswXT8uY2F0ZWdvcnkgXHJcbiAgICAgICAgICAgID8gY29sb3JzW2RbMF0uY2F0ZWdvcnldXHJcbiAgICAgICAgICAgIDogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMi41KVxyXG4gICAgICAgIC5hdHRyKCdkJywgbGluZUdlbik7XHJcblxyXG4gICAgICB0aGlzLnJlbmRlckxpbmVEb3RzKHN2ZywgZ3JvdXAudmFsdWVzLCBzY2FsZXMsIGNvbG9ycyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTGluZURvdHMoc3ZnOiBhbnksIHZhbHVlczogYW55W10sIHNjYWxlczogYW55LCBjb2xvcnM6IGFueSkge1xyXG4gICAgY29uc3QgZG90ID0gc3ZnXHJcbiAgICAgIC5zZWxlY3RBbGwoJy5saW5lLWRvdHMnKVxyXG4gICAgICAuZGF0YSh2YWx1ZXMpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGQ6IGFueSkgPT4gdGhpcy5oYW5kbGVDbGljayhkKSk7XHJcblxyXG4gICAgZG90XHJcbiAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBkLmNhdGVnb3J5IFxyXG4gICAgICAgICAgPyBjb2xvcnNbZC5jYXRlZ29yeV1cclxuICAgICAgICAgIDogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3I7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnbm9uZScpXHJcbiAgICAgIC5hdHRyKCdjeCcsIChkOiBhbnkpID0+IHNjYWxlcy54U2NhbGUoZC5uYW1lKSArIHNjYWxlcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgICAuYXR0cignY3knLCAoZDogYW55KSA9PiBzY2FsZXMubGluZVlzY2FsZShkLnZhbHVlKSlcclxuICAgICAgLmF0dHIoJ3InLCAzKVxyXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKSB7XHJcbiAgICAgIGRvdFxyXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdkb3RzJylcclxuICAgICAgICAuYXR0cignZmlsbCcsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJy44NWVtJylcclxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKVxyXG4gICAgICAgIC5hdHRyKCd4JywgKGQ6IGFueSkgPT4gc2NhbGVzLnhTY2FsZShkLm5hbWUpICsgc2NhbGVzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgICAgLmF0dHIoJ3knLCAoZDogYW55KSA9PiBzY2FsZXMubGluZVlzY2FsZShkLnZhbHVlKSlcclxuICAgICAgICAuYXR0cignZHknLCAnLTFlbScpXHJcbiAgICAgICAgLnRleHQoKGQ6IGFueSkgPT4gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxGb3JtYXR0ZXIoZC52YWx1ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGE/Lm1ldGFEYXRhPy5oYXNEcmlsbERvd24gfHwgZD8udG9nZ2xlRnJvbSkge1xyXG4gICAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZDogYW55KSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVpvb21pblpvb21vdXRDbGljayh7IGlzWm9vbU91dCwgZXZlbnQgfTogeyBpc1pvb21PdXQ6IGJvb2xlYW47IGV2ZW50OiBhbnkgfSkge1xyXG4gICAgdGhpcy5pc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQpO1xyXG4gIH1cclxufSIsIjxtZXRhIGh0dHAtZXF1aXY9XCJDQUNIRS1DT05UUk9MXCIgY29udGVudD1cIk5PLUNBQ0hFXCIgLz5cclxuPG1ldGEgaHR0cC1lcXVpdj1cIkVYUElSRVNcIiBjb250ZW50PVwiU2F0LCAwMSBKdW4gMjAwNCAxMToxMjowMSBHTVRcIiAvPlxyXG48ZGl2XHJcbiAgI3ZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lclxyXG4gIGNsYXNzPVwibGliLWNoYXJ0LXdyYXBwZXJcIlxyXG4gIFtuZ0NsYXNzXT1cInsgJ2xpYi1uby1iYWNrZ3JvdW5kJzogaXNUcmFuc3BhcmVudEJhY2tncm91bmQgfVwiXHJcbiAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHZhcigtLWNhcmQtYmcpO1wiXHJcblxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCJcclxuPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXItYWx0XCIgKm5nSWY9XCIhaXNIZWFkZXJWaXNpYmxlXCI+XHJcbiAgICA8bGliLWNoYXJ0LWhlYWRlci12MlxyXG4gICAgICBbY2hhcnREYXRhXT1cImNoYXJ0RGF0YVwiXHJcbiAgICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICA+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYzXHJcbiAgICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgICAgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKT1cImhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbigkZXZlbnQpXCJcclxuICAgICAgKHpvb21Jblpvb21PdXRDbGljayk9XCJoYW5kbGVab29taW5ab29tb3V0Q2xpY2soJGV2ZW50KVwiXHJcbiAgICA+PC9saWItY2hhcnQtaGVhZGVyLXYzPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXZcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFwiXHJcbiAgICBpZD1cInZlcnRpY2Fsc3RhY2tlZGNoYXJ0Y29udGFpbmVyXCJcclxuICAgICN2ZXJ0aWNhbHN0YWNrZWRjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnXCJcclxuICA+PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=