@rivet-health/design-system 32.5.0 → 33.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/visualization/chart/chart.component.mjs +18 -9
- package/esm2020/lib/visualization/chart/chart.mjs +321 -16
- package/fesm2015/rivet-health-design-system.mjs +337 -22
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +334 -22
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/lib/visualization/chart/chart.component.d.ts +14 -1
- package/lib/visualization/chart/chart.d.ts +20 -3
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@ import { CurrencyPipe } from '@angular/common';
|
|
|
2
2
|
import { scaleLinear, scaleUtc } from 'd3-scale';
|
|
3
3
|
import { arc, area, line, pie } from 'd3-shape';
|
|
4
4
|
import { utcFormat } from 'd3-time-format';
|
|
5
|
+
import { isNumber } from 'lodash';
|
|
5
6
|
import { DaysPipe } from '../../format/pipes/days.pipe';
|
|
6
7
|
import { NumberPipe } from '../../format/pipes/number.pipe';
|
|
7
8
|
import { PercentagePipe } from '../../format/pipes/percentage.pipe';
|
|
@@ -38,11 +39,22 @@ export var Chart;
|
|
|
38
39
|
? areas(config, data, dimensions)
|
|
39
40
|
: config.type == 'donut'
|
|
40
41
|
? arcs(config, data, dimensions)
|
|
41
|
-
:
|
|
42
|
+
: config.type == 'horizontal-bar'
|
|
43
|
+
? horizontalBars(config, data, dimensions)
|
|
44
|
+
: config.type == 'bar'
|
|
45
|
+
? bars(config, data, dimensions)
|
|
46
|
+
: emptyChart;
|
|
42
47
|
}
|
|
43
48
|
Chart.chart = chart;
|
|
44
49
|
function lines(config, allData, dimensions) {
|
|
45
|
-
const { data, visibleIndices } = hide(allData);
|
|
50
|
+
const { data: hiddenData, visibleIndices } = hide(allData);
|
|
51
|
+
if (hiddenData.type == 'labeled') {
|
|
52
|
+
// eslint-disable-next-line no-console
|
|
53
|
+
console.warn("Heads up! Labeled series aren't currently supported for line charts");
|
|
54
|
+
return emptyChart;
|
|
55
|
+
}
|
|
56
|
+
//This assignment makes typescript recognize the actual type (TimeseriesData)
|
|
57
|
+
const data = hiddenData;
|
|
46
58
|
const xScale = scaleUtc(timeseriesDomain(data), xRange(dimensions));
|
|
47
59
|
const format = (date) => formatedDate(config.dateFormat || 'day', date);
|
|
48
60
|
//Dont use auto magic when dealing with 1,2,3,4 data points
|
|
@@ -107,12 +119,20 @@ export var Chart;
|
|
|
107
119
|
bars: [],
|
|
108
120
|
areas: [],
|
|
109
121
|
arcs: [],
|
|
122
|
+
horizontalBars: [],
|
|
110
123
|
};
|
|
111
124
|
}
|
|
112
125
|
Chart.lines = lines;
|
|
113
126
|
function areas(config, allData, dimensions) {
|
|
114
127
|
const { data: unstackedData, visibleIndices } = hide(allData);
|
|
115
|
-
const
|
|
128
|
+
const stackedData = stack(unstackedData);
|
|
129
|
+
if (stackedData.type == 'labeled') {
|
|
130
|
+
// eslint-disable-next-line no-console
|
|
131
|
+
console.warn("Heads up! Labeled series aren't currently supported for area charts");
|
|
132
|
+
return emptyChart;
|
|
133
|
+
}
|
|
134
|
+
//This assignment makes typescript recognize the actual type (TimeseriesData)
|
|
135
|
+
const data = stackedData;
|
|
116
136
|
const xScale = scaleUtc(timeseriesDomain(data), xRange(dimensions));
|
|
117
137
|
const format = (date) => formatedDate(config.dateFormat || 'day', date);
|
|
118
138
|
const xTicks = xScale.ticks(Math.min(5, data.x.length)).map(tick => ({
|
|
@@ -140,8 +160,7 @@ export var Chart;
|
|
|
140
160
|
}
|
|
141
161
|
const yIndex = visibleIndices[visibleYIndex];
|
|
142
162
|
const ys = data.ys.map(y => yScale(y.values[xIndex]));
|
|
143
|
-
const
|
|
144
|
-
const anchor = new DOMRect(pos.rect.x + x, pos.rect.y + ys[visibleYIndex], padding, 0);
|
|
163
|
+
const anchor = new DOMRect(pos.rect.x + x, pos.rect.y + ys[visibleYIndex], SMALL_PADDING, 0);
|
|
145
164
|
return {
|
|
146
165
|
x,
|
|
147
166
|
xIndex,
|
|
@@ -171,12 +190,20 @@ export var Chart;
|
|
|
171
190
|
hover,
|
|
172
191
|
bars: [],
|
|
173
192
|
arcs: [],
|
|
193
|
+
horizontalBars: [],
|
|
174
194
|
};
|
|
175
195
|
}
|
|
176
196
|
Chart.areas = areas;
|
|
177
197
|
function bars(config, allData, dimensions) {
|
|
178
198
|
const { data: unstackedData, visibleIndices } = hide(allData);
|
|
179
|
-
const
|
|
199
|
+
const possiblyStackedData = config.groupingType == 'clustered' ? unstackedData : stack(unstackedData);
|
|
200
|
+
if (possiblyStackedData.type == 'labeled') {
|
|
201
|
+
// eslint-disable-next-line no-console
|
|
202
|
+
console.warn("Heads up! Labeled series aren't currently supported for vertical bar charts");
|
|
203
|
+
return emptyChart;
|
|
204
|
+
}
|
|
205
|
+
//This assignment makes typescript recognize the actual type (TimeseriesData)
|
|
206
|
+
const data = possiblyStackedData;
|
|
180
207
|
const { range: xRange, binSize } = barXRange(dimensions, data);
|
|
181
208
|
const halfBinSize = binSize / 2;
|
|
182
209
|
const xScale = scaleUtc(timeseriesDomain(data), xRange);
|
|
@@ -186,7 +213,8 @@ export var Chart;
|
|
|
186
213
|
label: format(tick),
|
|
187
214
|
}));
|
|
188
215
|
const { pipe, fullPipe } = getPipes(config.valueType);
|
|
189
|
-
const
|
|
216
|
+
const yRangeVal = yRange(dimensions);
|
|
217
|
+
const yScale = scaleLinear(yDomain(data), yRangeVal);
|
|
190
218
|
const yTicks = yScale.ticks(5).map(tick => ({
|
|
191
219
|
y: yScale(tick),
|
|
192
220
|
label: pipe.transform(tick),
|
|
@@ -194,13 +222,23 @@ export var Chart;
|
|
|
194
222
|
const colors = visibleIndices.map(i => config.colors[i % config.colors.length]);
|
|
195
223
|
const bars = data.ys.map((y, yIndex) => y.values.map((value, index) => {
|
|
196
224
|
const yValue = yScale(value);
|
|
225
|
+
let xValue = xScale(data.x[index]) - halfBinSize;
|
|
226
|
+
let width = binSize;
|
|
227
|
+
let height = (yIndex == 0
|
|
228
|
+
? yScale(0)
|
|
229
|
+
: yScale(data.ys[yIndex - 1].values[index])) - yValue;
|
|
230
|
+
if (config.groupingType == 'clustered') {
|
|
231
|
+
width =
|
|
232
|
+
(binSize - (data.ys.length - 1) * SMALL_PADDING) / data.ys.length;
|
|
233
|
+
height = Math.max(...yRangeVal) - yValue;
|
|
234
|
+
const offset = yIndex * (width + SMALL_PADDING);
|
|
235
|
+
xValue = xValue + offset;
|
|
236
|
+
}
|
|
197
237
|
return {
|
|
198
|
-
x:
|
|
238
|
+
x: xValue,
|
|
199
239
|
y: yValue,
|
|
200
|
-
width
|
|
201
|
-
height
|
|
202
|
-
? yScale(0)
|
|
203
|
-
: yScale(data.ys[yIndex - 1].values[index])) - yValue,
|
|
240
|
+
width,
|
|
241
|
+
height,
|
|
204
242
|
};
|
|
205
243
|
}));
|
|
206
244
|
function hover(pos) {
|
|
@@ -210,14 +248,20 @@ export var Chart;
|
|
|
210
248
|
let visibleYIndex = data.ys
|
|
211
249
|
.map(y => y.values[xIndex])
|
|
212
250
|
.findIndex(y => y > yValue);
|
|
251
|
+
if (config.groupingType == 'clustered') {
|
|
252
|
+
visibleYIndex = findSubIndex(x, pos.x, binSize, data.ys.length);
|
|
253
|
+
}
|
|
213
254
|
if (visibleYIndex == -1) {
|
|
214
255
|
visibleYIndex = data.ys.length - 1;
|
|
215
256
|
}
|
|
216
257
|
const yIndex = visibleIndices[visibleYIndex];
|
|
217
258
|
const ys = data.ys.map(y => yScale(y.values[xIndex]));
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
259
|
+
let anchorHeight = (visibleYIndex == 0 ? yScale(0) : ys[visibleYIndex - 1]) -
|
|
260
|
+
ys[visibleYIndex];
|
|
261
|
+
if (config.groupingType == 'clustered') {
|
|
262
|
+
anchorHeight = Math.max(...yRangeVal) - ys[visibleYIndex];
|
|
263
|
+
}
|
|
264
|
+
const anchor = new DOMRect(pos.rect.x + bars[visibleYIndex][xIndex].x - SMALL_PADDING, pos.rect.y + ys[visibleYIndex], bars[visibleYIndex][xIndex].width + SMALL_PADDING * 2, anchorHeight);
|
|
221
265
|
return {
|
|
222
266
|
x,
|
|
223
267
|
xIndex,
|
|
@@ -247,9 +291,182 @@ export var Chart;
|
|
|
247
291
|
areas: [],
|
|
248
292
|
hover,
|
|
249
293
|
arcs: [],
|
|
294
|
+
horizontalBars: [],
|
|
250
295
|
};
|
|
251
296
|
}
|
|
252
297
|
Chart.bars = bars;
|
|
298
|
+
function horizontalBars(config, allData, dimensions) {
|
|
299
|
+
//Some of this stuff gets confusing, because x and y are essentially inverted here
|
|
300
|
+
// So, if you see a situation where a variable is named 'y', but referencing
|
|
301
|
+
// 'x' (or vice versa), that's why
|
|
302
|
+
const { data: unstackedData, visibleIndices } = hide(allData);
|
|
303
|
+
const data = config.groupingType == 'clustered' ? unstackedData : stack(unstackedData);
|
|
304
|
+
const { range: yRange } = barYRange(dimensions, data);
|
|
305
|
+
let yScale = data.type == 'labeled'
|
|
306
|
+
? scaleLinear(indexDomain(data), yRange)
|
|
307
|
+
: scaleUtc(timeseriesDomain(data), yRange);
|
|
308
|
+
const dateFormat = (date) => formatedDate(config.dateFormat || 'day', date);
|
|
309
|
+
const { pipe, fullPipe } = getPipes(config.valueType);
|
|
310
|
+
const yTicks = yScale.ticks(data.x.length - 1).map(tick => ({
|
|
311
|
+
y: yScale(tick),
|
|
312
|
+
label: isNumber(tick)
|
|
313
|
+
? data.type == 'labeled'
|
|
314
|
+
? data.x[tick]
|
|
315
|
+
: '-'
|
|
316
|
+
: dateFormat(tick),
|
|
317
|
+
}));
|
|
318
|
+
const xScale = scaleLinear(yDomain(data), xRangeHorizontal(dimensions, data));
|
|
319
|
+
const xTicks = xScale.ticks(5).map(tick => ({
|
|
320
|
+
x: xScale(tick),
|
|
321
|
+
label: pipe.transform(tick),
|
|
322
|
+
}));
|
|
323
|
+
const colors = visibleIndices.map(i => config.colors[i % config.colors.length]);
|
|
324
|
+
const simplifiedHorizontalBars = [];
|
|
325
|
+
const horizontalBars = data.ys.map((y, yIndex) => {
|
|
326
|
+
const subSimpHorBars = [];
|
|
327
|
+
const retVal = y.values.map((value, index) => {
|
|
328
|
+
let xValue = yIndex == 0 ? xScale(0) : xScale(data.ys[yIndex - 1].values[index]);
|
|
329
|
+
let width = xScale(value) - xValue;
|
|
330
|
+
let yValue = yScale(data.type == 'labeled' ? index : data.x[index]) -
|
|
331
|
+
HORIZONTAL_BAR_HEIGHT * 1.5;
|
|
332
|
+
if (config.groupingType == 'clustered') {
|
|
333
|
+
xValue = xScale(0);
|
|
334
|
+
width = xScale(value) - xValue;
|
|
335
|
+
const centerIndex = data.ys.length / 2 - 0.5;
|
|
336
|
+
const offset = (yIndex - centerIndex) * (HORIZONTAL_BAR_HEIGHT + SMALL_PADDING);
|
|
337
|
+
yValue = yValue + offset;
|
|
338
|
+
}
|
|
339
|
+
const r = 4;
|
|
340
|
+
subSimpHorBars.push({
|
|
341
|
+
xPos: xValue,
|
|
342
|
+
yPos: yValue,
|
|
343
|
+
width,
|
|
344
|
+
});
|
|
345
|
+
if (data.ys.length == 1 || config.groupingType == 'clustered') {
|
|
346
|
+
//Both-sides rounding variation
|
|
347
|
+
const pathD = `
|
|
348
|
+
M ${xValue + r},${yValue}
|
|
349
|
+
h ${width - r * 2}
|
|
350
|
+
q${r},0 ${r},${r}
|
|
351
|
+
v ${HORIZONTAL_BAR_HEIGHT - r * 2}
|
|
352
|
+
q0,${r} -${r},${r}
|
|
353
|
+
h ${-(width - r * 2)}
|
|
354
|
+
q-${r},0 -${r},-${r}
|
|
355
|
+
v -${HORIZONTAL_BAR_HEIGHT - r * 2}
|
|
356
|
+
q0,-${r} ${r},-${r}
|
|
357
|
+
Z
|
|
358
|
+
`;
|
|
359
|
+
return pathD;
|
|
360
|
+
}
|
|
361
|
+
if (yIndex == 0) {
|
|
362
|
+
//Left-side rounding variation
|
|
363
|
+
const pathD = `
|
|
364
|
+
M ${xValue + r},${yValue}
|
|
365
|
+
h ${width - r}
|
|
366
|
+
v ${HORIZONTAL_BAR_HEIGHT}
|
|
367
|
+
h ${-(width - r)}
|
|
368
|
+
q-${r},0 -${r},-${r}
|
|
369
|
+
v -${HORIZONTAL_BAR_HEIGHT - r * 2}
|
|
370
|
+
q0,-${r} ${r},-${r}
|
|
371
|
+
Z
|
|
372
|
+
`;
|
|
373
|
+
return pathD;
|
|
374
|
+
}
|
|
375
|
+
if (yIndex == data.ys.length - 1) {
|
|
376
|
+
//Right-side rounding variation
|
|
377
|
+
const pathD = `
|
|
378
|
+
M ${xValue},${yValue}
|
|
379
|
+
h ${width - r}
|
|
380
|
+
q${r},0 ${r},${r}
|
|
381
|
+
v ${HORIZONTAL_BAR_HEIGHT - r * 2}
|
|
382
|
+
q0,${r} -${r},${r}
|
|
383
|
+
h ${-(width - r)}
|
|
384
|
+
Z
|
|
385
|
+
`;
|
|
386
|
+
return pathD;
|
|
387
|
+
}
|
|
388
|
+
//No-rounding variation
|
|
389
|
+
const pathD = `
|
|
390
|
+
M ${xValue},${yValue}
|
|
391
|
+
h ${width}
|
|
392
|
+
v ${HORIZONTAL_BAR_HEIGHT}
|
|
393
|
+
h ${-width}
|
|
394
|
+
v -${HORIZONTAL_BAR_HEIGHT}
|
|
395
|
+
Z
|
|
396
|
+
`;
|
|
397
|
+
return pathD;
|
|
398
|
+
});
|
|
399
|
+
simplifiedHorizontalBars.push(subSimpHorBars);
|
|
400
|
+
return retVal;
|
|
401
|
+
});
|
|
402
|
+
function hover(pos) {
|
|
403
|
+
let xIndex = 0;
|
|
404
|
+
let x = 0;
|
|
405
|
+
let visibleYIndex = 0;
|
|
406
|
+
if (checkYScaleType(yScale, data.type) && data.type != 'labeled') {
|
|
407
|
+
xIndex = findNearestIndex(data.x, yScale.invert(pos.y).getTime());
|
|
408
|
+
x = yScale(data.x[xIndex]) - SMALL_PADDING;
|
|
409
|
+
const yValue = xScale.invert(pos.x);
|
|
410
|
+
visibleYIndex = data.ys
|
|
411
|
+
.map(y => y.values[xIndex])
|
|
412
|
+
.findIndex(y => y > yValue);
|
|
413
|
+
}
|
|
414
|
+
else if (!checkYScaleType(yScale, data.type) &&
|
|
415
|
+
data.type == 'labeled') {
|
|
416
|
+
xIndex = findNearestIndexString(data.x, yScale.invert(pos.y));
|
|
417
|
+
x = yScale(xIndex) - SMALL_PADDING;
|
|
418
|
+
const yValue = xScale.invert(pos.x);
|
|
419
|
+
visibleYIndex = data.ys
|
|
420
|
+
.map(y => y.values[xIndex])
|
|
421
|
+
.findIndex(y => y > yValue);
|
|
422
|
+
}
|
|
423
|
+
const ys = data.ys.map(y => xScale(y.values[xIndex]));
|
|
424
|
+
if (config.groupingType == 'clustered') {
|
|
425
|
+
visibleYIndex = findSubIndexHorizontal(x, pos.y, data.ys.length);
|
|
426
|
+
}
|
|
427
|
+
if (visibleYIndex == -1) {
|
|
428
|
+
visibleYIndex = data.ys.length - 1;
|
|
429
|
+
}
|
|
430
|
+
const yIndex = visibleIndices[visibleYIndex];
|
|
431
|
+
const anchor = new DOMRect(pos.rect.x +
|
|
432
|
+
simplifiedHorizontalBars[visibleYIndex][xIndex].xPos -
|
|
433
|
+
SMALL_PADDING, pos.rect.y + simplifiedHorizontalBars[visibleYIndex][xIndex].yPos, simplifiedHorizontalBars[visibleYIndex][xIndex].width +
|
|
434
|
+
SMALL_PADDING * 2, HORIZONTAL_BAR_HEIGHT);
|
|
435
|
+
return {
|
|
436
|
+
x,
|
|
437
|
+
xIndex,
|
|
438
|
+
ys,
|
|
439
|
+
yIndex,
|
|
440
|
+
visibleYIndex,
|
|
441
|
+
tooltip: {
|
|
442
|
+
anchor,
|
|
443
|
+
date: data.type == 'labeled'
|
|
444
|
+
? unstackedData.x[xIndex].toString()
|
|
445
|
+
: utcFormat('%B %d, %Y')(new Date(unstackedData.x[xIndex])),
|
|
446
|
+
metrics: unstackedData.ys
|
|
447
|
+
.map((y, index) => ({
|
|
448
|
+
color: colors[index % colors.length],
|
|
449
|
+
label: y.label,
|
|
450
|
+
value: fullPipe.transform(y.values[xIndex]) ?? '-',
|
|
451
|
+
}))
|
|
452
|
+
.filter((_, i) => config.groupedTooltip || i == visibleYIndex),
|
|
453
|
+
},
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
return {
|
|
457
|
+
xTicks: xTicks,
|
|
458
|
+
yTicks: yTicks,
|
|
459
|
+
hover,
|
|
460
|
+
colors,
|
|
461
|
+
bars: [],
|
|
462
|
+
lines: [],
|
|
463
|
+
circles: [],
|
|
464
|
+
areas: [],
|
|
465
|
+
arcs: [],
|
|
466
|
+
horizontalBars,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
Chart.horizontalBars = horizontalBars;
|
|
253
470
|
function arcs(config, allData, dimensions) {
|
|
254
471
|
const { data: unstackedData, visibleIndices } = hide(allData);
|
|
255
472
|
const colors = visibleIndices.map(i => config.colors[i % config.colors.length]);
|
|
@@ -274,13 +491,19 @@ export var Chart;
|
|
|
274
491
|
bars: [],
|
|
275
492
|
colors,
|
|
276
493
|
arcs,
|
|
494
|
+
horizontalBars: [],
|
|
277
495
|
};
|
|
278
496
|
}
|
|
279
497
|
Chart.arcs = arcs;
|
|
280
498
|
const LEFT_PADDING = 48;
|
|
499
|
+
const LEFT_PADDING_DATE = 64;
|
|
500
|
+
Chart.LEFT_PADDING_LABEL_MAX = 192;
|
|
281
501
|
const RIGHT_PADDING = 24;
|
|
282
502
|
const TOP_PADDING = 16;
|
|
283
503
|
const BOTTOM_PADDING = 24;
|
|
504
|
+
const SMALL_PADDING = 8;
|
|
505
|
+
const HORIZONTAL_BAR_HEIGHT = 8;
|
|
506
|
+
const WIDTH_PER_LETTER = 6.5;
|
|
284
507
|
Chart.defaultConfig = {
|
|
285
508
|
type: 'line',
|
|
286
509
|
groupedTooltip: true,
|
|
@@ -305,9 +528,23 @@ export var Chart;
|
|
|
305
528
|
displayValue: '',
|
|
306
529
|
},
|
|
307
530
|
};
|
|
531
|
+
const emptyChart = {
|
|
532
|
+
xTicks: [],
|
|
533
|
+
yTicks: [],
|
|
534
|
+
colors: [],
|
|
535
|
+
lines: [],
|
|
536
|
+
circles: [],
|
|
537
|
+
areas: [],
|
|
538
|
+
bars: [],
|
|
539
|
+
arcs: [],
|
|
540
|
+
horizontalBars: [],
|
|
541
|
+
};
|
|
308
542
|
function timeseriesDomain(data) {
|
|
309
543
|
return [Math.min(...data.x), Math.max(...data.x)];
|
|
310
544
|
}
|
|
545
|
+
function indexDomain(data) {
|
|
546
|
+
return [0, data.x.length - 1];
|
|
547
|
+
}
|
|
311
548
|
function yDomain(data) {
|
|
312
549
|
const max = Math.max(...data.ys.map(y => Math.max(...y.values)));
|
|
313
550
|
return [0, max == 0 ? 1 : max];
|
|
@@ -315,6 +552,20 @@ export var Chart;
|
|
|
315
552
|
function xRange(dimensions) {
|
|
316
553
|
return [LEFT_PADDING, dimensions.width - RIGHT_PADDING];
|
|
317
554
|
}
|
|
555
|
+
function xRangeHorizontal(dimensions, data) {
|
|
556
|
+
let leftPaddingMax = data.type == 'labeled' ? Chart.LEFT_PADDING_LABEL_MAX : LEFT_PADDING_DATE;
|
|
557
|
+
let leftPaddingCalculated = leftPaddingMax;
|
|
558
|
+
if (data.type == 'labeled') {
|
|
559
|
+
const maxLabelSize = Math.max(...data.x.map(x => x.length));
|
|
560
|
+
leftPaddingCalculated = Math.min(leftPaddingMax, maxLabelSize * WIDTH_PER_LETTER);
|
|
561
|
+
}
|
|
562
|
+
//Space between label and chart
|
|
563
|
+
leftPaddingCalculated = leftPaddingCalculated + SMALL_PADDING;
|
|
564
|
+
return [
|
|
565
|
+
Math.max(leftPaddingCalculated, LEFT_PADDING),
|
|
566
|
+
dimensions.width - RIGHT_PADDING,
|
|
567
|
+
];
|
|
568
|
+
}
|
|
318
569
|
function barXRange(dimensions, data) {
|
|
319
570
|
const left = LEFT_PADDING;
|
|
320
571
|
const right = dimensions.width - RIGHT_PADDING;
|
|
@@ -324,6 +575,15 @@ export var Chart;
|
|
|
324
575
|
const range = [left + halfBinSize, right - halfBinSize];
|
|
325
576
|
return { binSize: Math.min(binSize * 0.7, 80), range };
|
|
326
577
|
}
|
|
578
|
+
function barYRange(dimensions, data) {
|
|
579
|
+
const top = dimensions.height - TOP_PADDING;
|
|
580
|
+
const bottom = BOTTOM_PADDING;
|
|
581
|
+
const height = top - bottom;
|
|
582
|
+
const binSize = height / (data.x.length || 1);
|
|
583
|
+
const halfBinSize = binSize / 2;
|
|
584
|
+
const range = [bottom + halfBinSize, top - halfBinSize];
|
|
585
|
+
return { range };
|
|
586
|
+
}
|
|
327
587
|
function yRange(dimensions) {
|
|
328
588
|
return [dimensions.height - BOTTOM_PADDING, TOP_PADDING];
|
|
329
589
|
}
|
|
@@ -334,6 +594,45 @@ export var Chart;
|
|
|
334
594
|
: nearestIndex;
|
|
335
595
|
}, 0);
|
|
336
596
|
}
|
|
597
|
+
function findNearestIndexString(values, input) {
|
|
598
|
+
const numValues = values.map((_, i) => i);
|
|
599
|
+
return numValues.reduce((nearestIndex, value, index) => {
|
|
600
|
+
return Math.abs(value - input) < Math.abs(numValues[nearestIndex] - input)
|
|
601
|
+
? index
|
|
602
|
+
: nearestIndex;
|
|
603
|
+
}, 0);
|
|
604
|
+
}
|
|
605
|
+
function findSubIndex(value, input, binSize, subBinCount) {
|
|
606
|
+
const subBinSize = (binSize - (subBinCount - 1 * SMALL_PADDING)) / subBinCount;
|
|
607
|
+
const centerIndex = subBinCount / 2 - 0.5;
|
|
608
|
+
let closestIndex = 0;
|
|
609
|
+
let closenessVal = -1;
|
|
610
|
+
for (let i = 0; i < subBinCount; i++) {
|
|
611
|
+
const offset = (i - centerIndex) * (subBinSize + SMALL_PADDING);
|
|
612
|
+
const subBinPos = value + offset;
|
|
613
|
+
const distance = Math.abs(input - subBinPos);
|
|
614
|
+
if (closenessVal < 0 || closenessVal > distance) {
|
|
615
|
+
closestIndex = i;
|
|
616
|
+
closenessVal = distance;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
return closestIndex;
|
|
620
|
+
}
|
|
621
|
+
function findSubIndexHorizontal(value, input, subBinCount) {
|
|
622
|
+
const centerIndex = subBinCount / 2 - 0.5;
|
|
623
|
+
let closestIndex = 0;
|
|
624
|
+
let closenessVal = -1;
|
|
625
|
+
for (let i = 0; i < subBinCount; i++) {
|
|
626
|
+
const offset = (i - centerIndex) * (HORIZONTAL_BAR_HEIGHT + SMALL_PADDING);
|
|
627
|
+
const subBinPos = value + offset;
|
|
628
|
+
const distance = Math.abs(input - subBinPos);
|
|
629
|
+
if (closenessVal < 0 || closenessVal > distance) {
|
|
630
|
+
closestIndex = i;
|
|
631
|
+
closenessVal = distance;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
return closestIndex;
|
|
635
|
+
}
|
|
337
636
|
// stack returns a new data where each set of yValues is stacked
|
|
338
637
|
// on top of the previous.
|
|
339
638
|
function stack(data) {
|
|
@@ -422,5 +721,11 @@ export var Chart;
|
|
|
422
721
|
return donutData;
|
|
423
722
|
}
|
|
424
723
|
Chart.convertChartDataToDonutData = convertChartDataToDonutData;
|
|
724
|
+
function checkYScaleType(input, dataType) {
|
|
725
|
+
if (dataType == 'labeled') {
|
|
726
|
+
return false;
|
|
727
|
+
}
|
|
728
|
+
return true;
|
|
729
|
+
}
|
|
425
730
|
})(Chart || (Chart = {}));
|
|
426
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2NoYXJ0L2NoYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUzRSxNQUFNLEtBQVcsS0FBSyxDQTBuQnJCO0FBMW5CRCxXQUFpQixLQUFLO0lBQ1AseUJBQW1CLEdBQUc7UUFDakMsYUFBYTtRQUNiLGlCQUFpQjtRQUNqQixtQkFBbUI7UUFDbkIsV0FBVztRQUNYLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLGdDQUFnQztRQUNoQyxpQkFBaUI7UUFDakIsbUJBQW1CO1FBQ25CLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLFdBQVc7UUFDWCwrQkFBK0I7UUFDL0IsaUJBQWlCO1FBQ2pCLG1CQUFtQjtRQUNuQixXQUFXO1FBQ1gsV0FBVztRQUNYLFdBQVc7UUFDWCxXQUFXO0tBQ1osQ0FBQztJQUVGLFNBQWdCLEtBQUssQ0FBQyxNQUFjLEVBQUUsSUFBVSxFQUFFLFVBQXNCO1FBQ3RFLE9BQU8s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QVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7U0FDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQy9CLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FDRixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3RCLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzVELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENB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LE9BQU8sQ0FBQztZQUNqQixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNILENBQUM7SUFYZSwyQkFBcUIsd0JBV3BDLENBQUE7SUFFRCxTQUFnQiwyQkFBMkIsQ0FBQyxTQUFlO1FBQ3pELElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtZQUMvQyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDViwrREFBK0QsQ0FDaEUsQ0FBQztTQUNIO1FBRUQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0osT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQWRlLGlDQUEyQiw4QkFjMUMsQ0FBQTtBQUNILENBQUMsRUExbkJnQixLQUFLLEtBQUwsS0FBSyxRQTBuQnJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHNjYWxlTGluZWFyLCBzY2FsZVV0YyB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IGFyYywgYXJlYSwgbGluZSwgcGllIH0gZnJvbSAnZDMtc2hhcGUnO1xuaW1wb3J0IHsgdXRjRm9ybWF0IH0gZnJvbSAnZDMtdGltZS1mb3JtYXQnO1xuaW1wb3J0IHsgRGF5c1BpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvZGF5cy5waXBlJztcbmltcG9ydCB7IE51bWJlclBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHsgUGVyY2VudGFnZVBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvcGVyY2VudGFnZS5waXBlJztcbmltcG9ydCB7IFNtYWxsQ3VycmVuY3lQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL3NtYWxsLWN1cnJlbmN5LnBpcGUnO1xuXG5leHBvcnQgbmFtZXNwYWNlIENoYXJ0IHtcbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb2xvclBhbGV0dGUgPSBbXG4gICAgLy9CYXNlIGNvbG9yc1xuICAgICctLWJhamEtYmxhc3QtNTAnLFxuICAgICctLXRlYWwtZGlhbW9uZC01MCcsXG4gICAgJy0tZnlyZS01MCcsXG4gICAgJy0tdGFuZy01MCcsXG4gICAgJy0tcHVycC02MCcsXG4gICAgJy0tcm9zaS03MCcsXG4gICAgLy9TaGlmdCBsaWdodGVyIGZyb20gYmFzZSBieSAtMjBcbiAgICAnLS1iYWphLWJsYXN0LTMwJyxcbiAgICAnLS10ZWFsLWRpYW1vbmQtMzAnLFxuICAgICctLWZ5cmUtMzAnLFxuICAgICctLXRhbmctMzAnLFxuICAgICctLXB1cnAtNDAnLFxuICAgICctLXJvc2ktNTAnLFxuICAgIC8vU2hpZnQgZGFya2VyIGZyb20gYmFzZSBieSArMjBcbiAgICAnLS1iYWphLWJsYXN0LTcwJyxcbiAgICAnLS10ZWFsLWRpYW1vbmQtNzAnLFxuICAgICctLWZ5cmUtNzAnLFxuICAgICctLXRhbmctNzAnLFxuICAgICctLXB1cnAtODAnLFxuICAgICctLXJvc2ktOTAnLFxuICBdO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGFydChjb25maWc6IENvbmZpZywgZGF0YTogRGF0YSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xuICAgIHJldHVybiBjb25maWcudHlwZSA9PSAnbGluZSdcbiAgICAgID8gbGluZXMoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnYXJlYSdcbiAgICAgID8gYXJlYXMoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnZG9udXQnXG4gICAgICA/IGFyY3MoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBiYXJzKGNvbmZpZywgZGF0YSwgZGltZW5zaW9ucyk7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGxpbmVzKFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgY29uc3QgeyBkYXRhLCB2aXNpYmxlSW5kaWNlcyB9ID0gaGlkZShhbGxEYXRhKTtcbiAgICBjb25zdCB4U2NhbGUgPSBzY2FsZVV0Yyh0aW1lc2VyaWVzRG9tYWluKGRhdGEpLCB4UmFuZ2UoZGltZW5zaW9ucykpO1xuICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcblxuICAgIC8vRG9udCB1c2UgYXV0byBtYWdpYyB3aGVuIGRlYWxpbmcgd2l0aCAxLDIsMyw0IGRhdGEgcG9pbnRzXG4gICAgY29uc3QgeFRpY2tEYXRlcyA9XG4gICAgICBkYXRhLngubGVuZ3RoIDwgNVxuICAgICAgICA/IGRhdGEueC5tYXAoeCA9PiBuZXcgRGF0ZSh4KSlcbiAgICAgICAgOiB4U2NhbGUudGlja3MoTWF0aC5taW4oNSwgZGF0YS54Lmxlbmd0aCkpO1xuXG4gICAgY29uc3QgeFRpY2tzID0geFRpY2tEYXRlcy5tYXAodGljayA9PiAoe1xuICAgICAgeDogeFNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IGZvcm1hdCh0aWNrKSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCB7IHBpcGUsIGZ1bGxQaXBlIH0gPSBnZXRQaXBlcyhjb25maWcudmFsdWVUeXBlKTtcbiAgICBjb25zdCB5U2NhbGUgPSBzY2FsZUxpbmVhcih5RG9tYWluKGRhdGEpLCB5UmFuZ2UoZGltZW5zaW9ucykpO1xuICAgIGNvbnN0IHlUaWNrcyA9IHlTY2FsZS50aWNrcyg1KS5tYXAodGljayA9PiAoe1xuICAgICAgeTogeVNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IHBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbG9ycyA9IHZpc2libGVJbmRpY2VzLm1hcChcbiAgICAgIGkgPT4gY29uZmlnLmNvbG9yc1tpICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdLFxuICAgICk7XG4gICAgY29uc3QgaW5kaWNlcyA9IGRhdGEueC5tYXAoKF8sIGkpID0+IGkpO1xuICAgIGNvbnN0IGxpbmVzID1cbiAgICAgIGRhdGEueC5sZW5ndGggPiAxXG4gICAgICAgID8gZGF0YS55cy5tYXAoeSA9PlxuICAgICAgICAgICAgbGluZTxudW1iZXI+KFxuICAgICAgICAgICAgICBpID0+IHhTY2FsZShkYXRhLnhbaV0pLFxuICAgICAgICAgICAgICBpID0+IHlTY2FsZSh5LnZhbHVlc1tpXSksXG4gICAgICAgICAgICApKGluZGljZXMpLFxuICAgICAgICAgIClcbiAgICAgICAgOiBbXTtcbiAgICBjb25zdCBjaXJjbGVzID1cbiAgICAgIGRhdGEueC5sZW5ndGggPT09IDFcbiAgICAgICAgPyBkYXRhLnlzLm1hcCh5U2VyaWVzID0+ICh7XG4gICAgICAgICAgICBjeDogeFNjYWxlKGRhdGEueFswXSksXG4gICAgICAgICAgICBjeTogeVNjYWxlKHlTZXJpZXMudmFsdWVzWzBdKSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgOiBbXTtcblxuICAgIGZ1bmN0aW9uIGhvdmVyKHBvczogeyByZWN0OiBET01SZWN0OyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSB7XG4gICAgICBjb25zdCB4SW5kZXggPSBmaW5kTmVhcmVzdEluZGV4KGRhdGEueCwgeFNjYWxlLmludmVydChwb3MueCkuZ2V0VGltZSgpKTtcbiAgICAgIGNvbnN0IHggPSB4U2NhbGUoZGF0YS54W3hJbmRleF0pO1xuICAgICAgY29uc3QgdmlzaWJsZVlJbmRleCA9IGZpbmROZWFyZXN0SW5kZXgoXG4gICAgICAgIGRhdGEueXMubWFwKHkgPT4geS52YWx1ZXNbeEluZGV4XSksXG4gICAgICAgIHlTY2FsZS5pbnZlcnQocG9zLnkpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHlJbmRleCA9IHZpc2libGVJbmRpY2VzW3Zpc2libGVZSW5kZXhdO1xuICAgICAgY29uc3QgeXMgPSBkYXRhLnlzLm1hcCh5ID0+IHlTY2FsZSh5LnZhbHVlc1t4SW5kZXhdKSk7XG5cbiAgICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgICBmb3JtYXRlZERhdGUoY29uZmlnLmRhdGVGb3JtYXQgfHwgJ2RheScsIGRhdGUpO1xuXG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgcG9zLnJlY3QueCArIHgsXG4gICAgICAgIHBvcy5yZWN0LnkgKyB5c1t2aXNpYmxlWUluZGV4XSxcbiAgICAgICAgOCxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB4SW5kZXgsXG4gICAgICAgIHlzLFxuICAgICAgICB5SW5kZXgsXG4gICAgICAgIHZpc2libGVZSW5kZXgsXG4gICAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgZGF0ZTogZm9ybWF0KG5ldyBEYXRlKGRhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogZGF0YS55c1xuICAgICAgICAgICAgLm1hcCgoeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSkgPz8gJy0nLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAuZmlsdGVyKChfLCBpKSA9PiBjb25maWcuZ3JvdXBlZFRvb2x0aXAgfHwgaSA9PSB2aXNpYmxlWUluZGV4KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHhUaWNrcyxcbiAgICAgIHlUaWNrcyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIGxpbmVzLFxuICAgICAgY2lyY2xlcyxcbiAgICAgIGhvdmVyLFxuICAgICAgYmFyczogW10sXG4gICAgICBhcmVhczogW10sXG4gICAgICBhcmNzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGFyZWFzKFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgY29uc3QgeyBkYXRhOiB1bnN0YWNrZWREYXRhLCB2aXNpYmxlSW5kaWNlcyB9ID0gaGlkZShhbGxEYXRhKTtcbiAgICBjb25zdCBkYXRhID0gc3RhY2sodW5zdGFja2VkRGF0YSk7XG4gICAgY29uc3QgeFNjYWxlID0gc2NhbGVVdGModGltZXNlcmllc0RvbWFpbihkYXRhKSwgeFJhbmdlKGRpbWVuc2lvbnMpKTtcbiAgICBjb25zdCBmb3JtYXQgPSAoZGF0ZTogRGF0ZSkgPT5cbiAgICAgIGZvcm1hdGVkRGF0ZShjb25maWcuZGF0ZUZvcm1hdCB8fCAnZGF5JywgZGF0ZSk7XG4gICAgY29uc3QgeFRpY2tzID0geFNjYWxlLnRpY2tzKE1hdGgubWluKDUsIGRhdGEueC5sZW5ndGgpKS5tYXAodGljayA9PiAoe1xuICAgICAgeDogeFNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IGZvcm1hdCh0aWNrKSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCB7IHBpcGUsIGZ1bGxQaXBlIH0gPSBnZXRQaXBlcyhjb25maWcudmFsdWVUeXBlKTtcbiAgICBjb25zdCB5U2NhbGUgPSBzY2FsZUxpbmVhcih5RG9tYWluKGRhdGEpLCB5UmFuZ2UoZGltZW5zaW9ucykpO1xuICAgIGNvbnN0IHlUaWNrcyA9IHlTY2FsZS50aWNrcyg1KS5tYXAodGljayA9PiAoe1xuICAgICAgeTogeVNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IHBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGluZGljZXMgPSBkYXRhLngubWFwKChfLCBpKSA9PiBpKTtcbiAgICBjb25zdCBjb2xvcnMgPSB2aXNpYmxlSW5kaWNlcy5tYXAoXG4gICAgICBpID0+IGNvbmZpZy5jb2xvcnNbaSAlIGNvbmZpZy5jb2xvcnMubGVuZ3RoXSxcbiAgICApO1xuICAgIGNvbnN0IGFyZWFzID0gZGF0YS55cy5tYXAoKHksIHlJbmRleCkgPT5cbiAgICAgIGFyZWE8bnVtYmVyPihcbiAgICAgICAgaSA9PiB4U2NhbGUoZGF0YS54W2ldKSxcbiAgICAgICAgaSA9PiB5U2NhbGUoeUluZGV4ID09IDAgPyAwIDogZGF0YS55c1t5SW5kZXggLSAxXS52YWx1ZXNbaV0pLFxuICAgICAgICBpID0+IHlTY2FsZSh5LnZhbHVlc1tpXSksXG4gICAgICApKGluZGljZXMpLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBob3Zlcihwb3M6IHsgcmVjdDogRE9NUmVjdDsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgICAgY29uc3QgeEluZGV4ID0gZmluZE5lYXJlc3RJbmRleChkYXRhLngsIHhTY2FsZS5pbnZlcnQocG9zLngpLmdldFRpbWUoKSk7XG4gICAgICBjb25zdCB4ID0geFNjYWxlKGRhdGEueFt4SW5kZXhdKTtcbiAgICAgIGNvbnN0IHlWYWx1ZSA9IHlTY2FsZS5pbnZlcnQocG9zLnkpO1xuICAgICAgbGV0IHZpc2libGVZSW5kZXggPSBkYXRhLnlzXG4gICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAuZmluZEluZGV4KHkgPT4geSA+IHlWYWx1ZSk7XG4gICAgICBpZiAodmlzaWJsZVlJbmRleCA9PSAtMSkge1xuICAgICAgICB2aXNpYmxlWUluZGV4ID0gZGF0YS55cy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgICAgY29uc3QgeUluZGV4ID0gdmlzaWJsZUluZGljZXNbdmlzaWJsZVlJbmRleF07XG4gICAgICBjb25zdCB5cyA9IGRhdGEueXMubWFwKHkgPT4geVNjYWxlKHkudmFsdWVzW3hJbmRleF0pKTtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSA4O1xuICAgICAgY29uc3QgYW5jaG9yID0gbmV3IERPTVJlY3QoXG4gICAgICAgIHBvcy5yZWN0LnggKyB4LFxuICAgICAgICBwb3MucmVjdC55ICsgeXNbdmlzaWJsZVlJbmRleF0sXG4gICAgICAgIHBhZGRpbmcsXG4gICAgICAgIDAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeCxcbiAgICAgICAgeEluZGV4LFxuICAgICAgICB5cyxcbiAgICAgICAgeUluZGV4LFxuICAgICAgICB2aXNpYmxlWUluZGV4LFxuICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGRhdGU6IHV0Y0Zvcm1hdCgnJUIgJWQsICVZJykobmV3IERhdGUodW5zdGFja2VkRGF0YS54W3hJbmRleF0pKSxcbiAgICAgICAgICBtZXRyaWNzOiB1bnN0YWNrZWREYXRhLnlzXG4gICAgICAgICAgICAubWFwKCh5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgY29sb3I6IGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdLFxuICAgICAgICAgICAgICBsYWJlbDogeS5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IGZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKSA/PyAnLScsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8sIGkpID0+IGNvbmZpZy5ncm91cGVkVG9vbHRpcCB8fCBpID09IHZpc2libGVZSW5kZXgpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeFRpY2tzLFxuICAgICAgeVRpY2tzLFxuICAgICAgY29sb3JzLFxuICAgICAgYXJlYXMsXG4gICAgICBsaW5lczogW10sXG4gICAgICBjaXJjbGVzOiBbXSxcbiAgICAgIGhvdmVyLFxuICAgICAgYmFyczogW10sXG4gICAgICBhcmNzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGJhcnMoXG4gICAgY29uZmlnOiBDb25maWcsXG4gICAgYWxsRGF0YTogRGF0YSxcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICApOiBSZW5kZXJlZENoYXJ0IHtcbiAgICBjb25zdCB7IGRhdGE6IHVuc3RhY2tlZERhdGEsIHZpc2libGVJbmRpY2VzIH0gPSBoaWRlKGFsbERhdGEpO1xuICAgIGNvbnN0IGRhdGEgPSBzdGFjayh1bnN0YWNrZWREYXRhKTtcbiAgICBjb25zdCB7IHJhbmdlOiB4UmFuZ2UsIGJpblNpemUgfSA9IGJhclhSYW5nZShkaW1lbnNpb25zLCBkYXRhKTtcbiAgICBjb25zdCBoYWxmQmluU2l6ZSA9IGJpblNpemUgLyAyO1xuICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlVXRjKHRpbWVzZXJpZXNEb21haW4oZGF0YSksIHhSYW5nZSk7XG4gICAgY29uc3QgZm9ybWF0ID0gKGRhdGU6IERhdGUpID0+XG4gICAgICBmb3JtYXRlZERhdGUoY29uZmlnLmRhdGVGb3JtYXQgfHwgJ2RheScsIGRhdGUpO1xuICAgIGNvbnN0IHhUaWNrcyA9IHhTY2FsZS50aWNrcyhNYXRoLm1pbig1LCBkYXRhLngubGVuZ3RoKSkubWFwKHRpY2sgPT4gKHtcbiAgICAgIHg6IHhTY2FsZSh0aWNrKSxcbiAgICAgIGxhYmVsOiBmb3JtYXQodGljayksXG4gICAgfSkpO1xuXG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG4gICAgY29uc3QgeVNjYWxlID0gc2NhbGVMaW5lYXIoeURvbWFpbihkYXRhKSwgeVJhbmdlKGRpbWVuc2lvbnMpKTtcbiAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3MoNSkubWFwKHRpY2sgPT4gKHtcbiAgICAgIHk6IHlTY2FsZSh0aWNrKSxcbiAgICAgIGxhYmVsOiBwaXBlLnRyYW5zZm9ybSh0aWNrKSxcbiAgICB9KSk7XG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBiYXJzID0gZGF0YS55cy5tYXAoKHksIHlJbmRleCkgPT5cbiAgICAgIHkudmFsdWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHlWYWx1ZSA9IHlTY2FsZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeFNjYWxlKGRhdGEueFtpbmRleF0pIC0gaGFsZkJpblNpemUsXG4gICAgICAgICAgeTogeVZhbHVlLFxuICAgICAgICAgIHdpZHRoOiBiaW5TaXplLFxuICAgICAgICAgIGhlaWdodDpcbiAgICAgICAgICAgICh5SW5kZXggPT0gMFxuICAgICAgICAgICAgICA/IHlTY2FsZSgwKVxuICAgICAgICAgICAgICA6IHlTY2FsZShkYXRhLnlzW3lJbmRleCAtIDFdLnZhbHVlc1tpbmRleF0pKSAtIHlWYWx1ZSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBob3Zlcihwb3M6IHsgcmVjdDogRE9NUmVjdDsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgICAgY29uc3QgeEluZGV4ID0gZmluZE5lYXJlc3RJbmRleChkYXRhLngsIHhTY2FsZS5pbnZlcnQocG9zLngpLmdldFRpbWUoKSk7XG4gICAgICBjb25zdCB4ID0geFNjYWxlKGRhdGEueFt4SW5kZXhdKTtcbiAgICAgIGNvbnN0IHlWYWx1ZSA9IHlTY2FsZS5pbnZlcnQocG9zLnkpO1xuICAgICAgbGV0IHZpc2libGVZSW5kZXggPSBkYXRhLnlzXG4gICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAuZmluZEluZGV4KHkgPT4geSA+IHlWYWx1ZSk7XG4gICAgICBpZiAodmlzaWJsZVlJbmRleCA9PSAtMSkge1xuICAgICAgICB2aXNpYmxlWUluZGV4ID0gZGF0YS55cy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgICAgY29uc3QgeUluZGV4ID0gdmlzaWJsZUluZGljZXNbdmlzaWJsZVlJbmRleF07XG4gICAgICBjb25zdCB5cyA9IGRhdGEueXMubWFwKHkgPT4geVNjYWxlKHkudmFsdWVzW3hJbmRleF0pKTtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSA4O1xuICAgICAgY29uc3QgYW5jaG9yID0gbmV3IERPTVJlY3QoXG4gICAgICAgIHBvcy5yZWN0LnggKyBiYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ueCAtIHBhZGRpbmcsXG4gICAgICAgIHBvcy5yZWN0LnkgKyB5c1t2aXNpYmxlWUluZGV4XSxcbiAgICAgICAgYmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLndpZHRoICsgcGFkZGluZyAqIDIsXG4gICAgICAgICh2aXNpYmxlWUluZGV4ID09IDAgPyB5U2NhbGUoMCkgOiB5c1t2aXNpYmxlWUluZGV4IC0gMV0pIC1cbiAgICAgICAgICB5c1t2aXNpYmxlWUluZGV4XSxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB4SW5kZXgsXG4gICAgICAgIHlzLFxuICAgICAgICB5SW5kZXgsXG4gICAgICAgIHZpc2libGVZSW5kZXgsXG4gICAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgZGF0ZTogdXRjRm9ybWF0KCclQiAlZCwgJVknKShuZXcgRGF0ZSh1bnN0YWNrZWREYXRhLnhbeEluZGV4XSkpLFxuICAgICAgICAgIG1ldHJpY3M6IHVuc3RhY2tlZERhdGEueXNcbiAgICAgICAgICAgIC5tYXAoKHksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICBjb2xvcjogY29sb3JzW2luZGV4ICUgY29sb3JzLmxlbmd0aF0sXG4gICAgICAgICAgICAgIGxhYmVsOiB5LmxhYmVsLFxuICAgICAgICAgICAgICB2YWx1ZTogZnVsbFBpcGUudHJhbnNmb3JtKHkudmFsdWVzW3hJbmRleF0pID8/ICctJyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoXywgaSkgPT4gY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT0gdmlzaWJsZVlJbmRleCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3MsXG4gICAgICB5VGlja3MsXG4gICAgICBjb2xvcnMsXG4gICAgICBiYXJzLFxuICAgICAgbGluZXM6IFtdLFxuICAgICAgY2lyY2xlczogW10sXG4gICAgICBhcmVhczogW10sXG4gICAgICBob3ZlcixcbiAgICAgIGFyY3M6IFtdLFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYXJjcyhcbiAgICBjb25maWc6IENvbmZpZyxcbiAgICBhbGxEYXRhOiBEYXRhLFxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXG4gICk6IFJlbmRlcmVkQ2hhcnQge1xuICAgIGNvbnN0IHsgZGF0YTogdW5zdGFja2VkRGF0YSwgdmlzaWJsZUluZGljZXMgfSA9IGhpZGUoYWxsRGF0YSk7XG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBkb251dERhdGEgPSBDaGFydC5jb252ZXJ0Q2hhcnREYXRhVG9Eb251dERhdGEodW5zdGFja2VkRGF0YSk7XG4gICAgY29uc3Qgb3V0ZXIgPSAoZGltZW5zaW9ucy5oZWlnaHQgLyAyKSAqIDAuNzU7XG4gICAgY29uc3QgaW5uZXIgPSBvdXRlciAtIDEyO1xuICAgIGNvbnN0IHBpZUFyY3MgPSBwaWU8RG9udXREYXRhPigpXG4gICAgICAuc29ydFZhbHVlcyhudWxsKVxuICAgICAgLnZhbHVlKGQgPT4gZC52YWx1ZSkoZG9udXREYXRhKTtcbiAgICBjb25zdCBhcmNzID0gcGllQXJjcy5tYXAocGllQXJjID0+XG4gICAgICBhcmM8RG9udXREYXRhPigpXG4gICAgICAgIC5pbm5lclJhZGl1cyhpbm5lcilcbiAgICAgICAgLm91dGVyUmFkaXVzKG91dGVyKVxuICAgICAgICAucGFkQW5nbGUoMC4wMTMpXG4gICAgICAgIC5zdGFydEFuZ2xlKHBpZUFyYy5zdGFydEFuZ2xlKVxuICAgICAgICAuZW5kQW5nbGUocGllQXJjLmVuZEFuZ2xlKShwaWVBcmMuZGF0YSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3M6IFtdLFxuICAgICAgeVRpY2tzOiBbXSxcbiAgICAgIGFyZWFzOiBbXSxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgYmFyczogW10sXG4gICAgICBjb2xvcnMsXG4gICAgICBhcmNzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBMRUZUX1BBRERJTkcgPSA0ODtcbiAgY29uc3QgUklHSFRfUEFERElORyA9IDI0O1xuICBjb25zdCBUT1BfUEFERElORyA9IDE2O1xuICBjb25zdCBCT1RUT01fUEFERElORyA9IDI0O1xuXG4gIGV4cG9ydCB0eXBlIERhdGEgPSB7XG4gICAgeXM6IHtcbiAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICBoaWRkZW4/OiBib29sZWFuO1xuICAgICAgdmFsdWVzOiBudW1iZXJbXTtcbiAgICB9W107XG4gICAgeDogbnVtYmVyW107XG4gIH07XG5cbiAgdHlwZSBEb251dERhdGEgPSB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBoaWRkZW4/OiBib29sZWFuO1xuICAgIHZhbHVlOiBudW1iZXI7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgRGltZW5zaW9ucyA9IHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9O1xuXG4gIHR5cGUgQmFzZUNvbmZpZyA9IHtcbiAgICBncm91cGVkVG9vbHRpcDogYm9vbGVhbjtcbiAgICBjb2xvcnM6IHN0cmluZ1tdO1xuICAgIGFsbG93TGVnZW5kVG9nZ2xlOiBib29sZWFuO1xuICAgIHplcm9TdGF0ZU1lc3NhZ2U6IHN0cmluZztcbiAgICB2YWx1ZVR5cGU6IFZhbHVlVHlwZTtcbiAgICB0cnVuY2F0ZUxlZ2VuZDogYm9vbGVhbjtcbiAgICBkYXRlRm9ybWF0PzogSW50ZXJ2YWw7XG4gIH07XG5cbiAgdHlwZSBEb251dENvbmZpZyA9IHtcbiAgICBzaXplOiAneHNtYWxsJyB8ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZSc7XG4gICAgZGlzcGxheVZhbHVlOiBzdHJpbmc7XG4gICAgZGlzcGxheUxhYmVsPzogc3RyaW5nO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIENvbmZpZyA9IEJhc2VDb25maWcgJlxuICAgIChcbiAgICAgIHwge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyB8ICdhcmVhJyB8ICdiYXInO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICB0eXBlOiAnZG9udXQnO1xuICAgICAgICAgIGRvbnV0RGlzcGxheUluZm86IERvbnV0Q29uZmlnO1xuICAgICAgICB9XG4gICAgKTtcblxuICBleHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZzogQ29uZmlnID0ge1xuICAgIHR5cGU6ICdsaW5lJyxcbiAgICBncm91cGVkVG9vbHRpcDogdHJ1ZSxcbiAgICBjb2xvcnM6IGRlZmF1bHRDb2xvclBhbGV0dGUsXG4gICAgYWxsb3dMZWdlbmRUb2dnbGU6IGZhbHNlLFxuICAgIHplcm9TdGF0ZU1lc3NhZ2U6ICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgICB2YWx1ZVR5cGU6ICdjdXJyZW5jeScsXG4gICAgdHJ1bmNhdGVMZWdlbmQ6IHRydWUsXG4gICAgZGF0ZUZvcm1hdDogJ2RheScsXG4gIH07XG5cbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHREb251dENvbmZpZzogQ29uZmlnID0ge1xuICAgIHR5cGU6ICdkb251dCcsXG4gICAgZ3JvdXBlZFRvb2x0aXA6IHRydWUsXG4gICAgY29sb3JzOiBkZWZhdWx0Q29sb3JQYWxldHRlLFxuICAgIGFsbG93TGVnZW5kVG9nZ2xlOiBmYWxzZSxcbiAgICB6ZXJvU3RhdGVNZXNzYWdlOiAnTm8gZGF0YSB0byBkaXNwbGF5LicsXG4gICAgdmFsdWVUeXBlOiAnY3VycmVuY3knLFxuICAgIHRydW5jYXRlTGVnZW5kOiB0cnVlLFxuICAgIGRhdGVGb3JtYXQ6ICdkYXknLFxuICAgIGRvbnV0RGlzcGxheUluZm86IHtcbiAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgZGlzcGxheVZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEFyZWEgPSB7XG4gICAgcGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxsOiBzdHJpbmc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgWFRpY2sgPSB7XG4gICAgeDogbnVtYmVyO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgWVRpY2sgPSB7XG4gICAgeTogbnVtYmVyO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gIH07XG5cbiAgdHlwZSBSZWN0ID0ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBCYXJTZXJpZXMgPSB7XG4gICAgZmlsbDogc3RyaW5nO1xuICAgIHJlY3RzOiBSZWN0W107XG4gIH07XG5cbiAgdHlwZSBDaXJjbGUgPSB7XG4gICAgY3g6IG51bWJlcjtcbiAgICBjeTogbnVtYmVyO1xuICB9O1xuXG4gIC8vIEhvdmVyIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZpZXdwb3J0IHggYW5kIHkgYW5kIHJldHVybnMgYSByaWNoXG4gIC8vIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHZhbHVlcyBhcmUgYmVpbmcgaG92ZXJlZCBhbmQgd2hhdCB0aGUgdG9vbHRpcFxuICAvLyBzaG91bGQgbG9vayBsaWtlXG4gIGV4cG9ydCB0eXBlIEhvdmVyID0gKHBvczogeyByZWN0OiBET01SZWN0OyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSA9PiB7XG4gICAgLy8gdGhlIGluZGljZXMgaW50byB0aGUgZGF0YSBvZiB0aGUgY2xvc2VzdCBwb2ludFxuICAgIHhJbmRleDogbnVtYmVyO1xuICAgIC8vIHdlIHdhbnQgdG8ga25vdyB3aGljaCB2aXNpYmxlIHkgaW5kZXggaXMgaG92ZXJlZFxuICAgIC8vIGFuZCB3aGljaCBhY3R1YWwgeSBpbmRleCBpcyBob3ZlcmVkXG4gICAgeUluZGV4OiBudW1iZXI7XG4gICAgdmlzaWJsZVlJbmRleDogbnVtYmVyO1xuXG4gICAgLy8gdGhlIHZpZXdwb3J0IHggYW5kIHlzIG9mIHRoZSBob3ZlcmVkIGl0ZW1zXG4gICAgeDogbnVtYmVyO1xuICAgIHlzOiBudW1iZXJbXTtcblxuICAgIHRvb2x0aXA6IHtcbiAgICAgIGFuY2hvcjogRE9NUmVjdDtcbiAgICAgIGRhdGU6IHN0cmluZztcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgY29sb3I6IHN0cmluZztcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IHN0cmluZztcbiAgICAgIH1bXTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJlbmRlcmVkQ2hhcnQgcmVwcmVzZW50cyBhbGwgb2YgdGhlIHBhcnRzIG9mIGEgY2hhcnRcbiAgLy8gdGhhdCBlbmQgdXAgb24gc2NyZWVuLiBFdmVyeSBjaGFydCBoYXMgeCBhbmQgeSB0aWNrc1xuICAvLyBhbmQgaG92ZXIgZnVuY3Rpb25hbGl0eSwgZXZlbiB0aG91Z2ggdGhleSBtaWdodCBiZVxuICAvLyBkaWZmZXJlbnQgZnJvbSBjaGFydCB0byBjaGFydC5cbiAgdHlwZSBSZW5kZXJlZENoYXJ0ID0ge1xuICAgIHhUaWNrczogWFRpY2tbXTtcbiAgICB5VGlja3M6IFlUaWNrW107XG4gICAgaG92ZXI/OiBIb3ZlcjtcbiAgICBjb2xvcnM6IHN0cmluZ1tdO1xuICAgIGxpbmVzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgICBjaXJjbGVzOiBDaXJjbGVbXTsgLy9MaW5lIGZhbGxiYWNrIGZvciBhIHNpbmdsZSBwb2ludFxuICAgIGFyZWFzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgICBiYXJzOiBSZWN0W11bXTtcbiAgICBhcmNzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgfTtcblxuICBmdW5jdGlvbiB0aW1lc2VyaWVzRG9tYWluKGRhdGE6IERhdGEpIHtcbiAgICByZXR1cm4gW01hdGgubWluKC4uLmRhdGEueCksIE1hdGgubWF4KC4uLmRhdGEueCldO1xuICB9XG5cbiAgZnVuY3Rpb24geURvbWFpbihkYXRhOiBEYXRhKSB7XG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4uZGF0YS55cy5tYXAoeSA9PiBNYXRoLm1heCguLi55LnZhbHVlcykpKTtcbiAgICByZXR1cm4gWzAsIG1heCA9PSAwID8gMSA6IG1heF07XG4gIH1cblxuICBmdW5jdGlvbiB4UmFuZ2UoZGltZW5zaW9uczogRGltZW5zaW9ucykge1xuICAgIHJldHVybiBbTEVGVF9QQURESU5HLCBkaW1lbnNpb25zLndpZHRoIC0gUklHSFRfUEFERElOR107XG4gIH1cblxuICBmdW5jdGlvbiBiYXJYUmFuZ2UoZGltZW5zaW9uczogRGltZW5zaW9ucywgZGF0YTogRGF0YSkge1xuICAgIGNvbnN0IGxlZnQgPSBMRUZUX1BBRERJTkc7XG4gICAgY29uc3QgcmlnaHQgPSBkaW1lbnNpb25zLndpZHRoIC0gUklHSFRfUEFERElORztcbiAgICBjb25zdCB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICBjb25zdCBiaW5TaXplID0gd2lkdGggLyAoZGF0YS54Lmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBoYWxmQmluU2l6ZSA9IGJpblNpemUgLyAyO1xuICAgIGNvbnN0IHJhbmdlID0gW2xlZnQgKyBoYWxmQmluU2l6ZSwgcmlnaHQgLSBoYWxmQmluU2l6ZV07XG4gICAgcmV0dXJuIHsgYmluU2l6ZTogTWF0aC5taW4oYmluU2l6ZSAqIDAuNywgODApLCByYW5nZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24geVJhbmdlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMpIHtcbiAgICByZXR1cm4gW2RpbWVuc2lvbnMuaGVpZ2h0IC0gQk9UVE9NX1BBRERJTkcsIFRPUF9QQURESU5HXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmROZWFyZXN0SW5kZXgodmFsdWVzOiBudW1iZXJbXSwgaW5wdXQ6IG51bWJlcikge1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChuZWFyZXN0SW5kZXgsIHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlIC0gaW5wdXQpIDwgTWF0aC5hYnModmFsdWVzW25lYXJlc3RJbmRleF0gLSBpbnB1dClcbiAgICAgICAgPyBpbmRleFxuICAgICAgICA6IG5lYXJlc3RJbmRleDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIHN0YWNrIHJldHVybnMgYSBuZXcgZGF0YSB3aGVyZSBlYWNoIHNldCBvZiB5VmFsdWVzIGlzIHN0YWNrZWRcbiAgLy8gb24gdG9wIG9mIHRoZSBwcmV2aW91cy5cbiAgZnVuY3Rpb24gc3RhY2soZGF0YTogRGF0YSk6IERhdGEge1xuICAgIGNvbnN0IHN0YWNrZWQ6IERhdGEgPSB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgeXM6IGRhdGEueXMubWFwKHkgPT4gKHsgbGFiZWw6IHkubGFiZWwsIHZhbHVlczogW10gfSkpLFxuICAgIH07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLngubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBmcm9tID0gMDtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGF0YS55cy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCB0byA9IGZyb20gKyBkYXRhLnlzW2pdLnZhbHVlc1tpXTtcbiAgICAgICAgc3RhY2tlZC55c1tqXS52YWx1ZXMucHVzaCh0byk7XG4gICAgICAgIGZyb20gPSB0bztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrZWQ7XG4gIH1cblxuICAvLyBoaWRlIHN0cmlwcyBvdXQgaGlkZGVuIHkgdmFsdWVzIHdoaWxlIHJldGFpbmluZyB0aGUgb3JpZ2luYWwgaW5kaWNlc1xuICAvLyBmb3IgdGhlIHJlbWFpbmluZyB2aXNpYmxlIHZhbHVlc1xuICBmdW5jdGlvbiBoaWRlKGRhdGE6IERhdGEpOiB7IGRhdGE6IERhdGE7IHZpc2libGVJbmRpY2VzOiBudW1iZXJbXSB9IHtcbiAgICBjb25zdCB2aXNpYmxlSW5kaWNlcyA9IGRhdGEueXNcbiAgICAgIC5tYXAoKHksIGkpID0+ICh7IHksIGkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHkgfSkgPT4gIXkuaGlkZGVuKVxuICAgICAgLm1hcCgoeyBpIH0pID0+IGkpO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiB7IC4uLmRhdGEsIHlzOiB2aXNpYmxlSW5kaWNlcy5tYXAoaSA9PiBkYXRhLnlzW2ldKSB9LFxuICAgICAgdmlzaWJsZUluZGljZXMsXG4gICAgfTtcbiAgfVxuXG4gIHR5cGUgVmFsdWVUeXBlID0gJ2NvdW50JyB8ICdjdXJyZW5jeScgfCAncGVyY2VudGFnZScgfCAnZGF5cyc7XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFBpcGVzKHZhbHVlVHlwZTogVmFsdWVUeXBlKSB7XG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvdW50Jzoge1xuICAgICAgICBjb25zdCBwaXBlID0gbmV3IE51bWJlclBpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwaXBlOiBuZXcgU21hbGxDdXJyZW5jeVBpcGUoKSxcbiAgICAgICAgICBmdWxsUGlwZTogbmV3IEN1cnJlbmN5UGlwZSgnZW4tdXMnKSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3BlcmNlbnRhZ2UnOiB7XG4gICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgUGVyY2VudGFnZVBpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RheXMnOiB7XG4gICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgRGF5c1BpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgY29uc3QgaW50ZXJ2YWxzID0gWyd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgSW50ZXJ2YWwgPSAodHlwZW9mIGludGVydmFscylbbnVtYmVyXTtcblxuICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0ZWREYXRlKGRhdGVGb3JtYXQ6IEludGVydmFsLCBkYXRlOiBEYXRlKSB7XG4gICAgaWYgKGRhdGVGb3JtYXQgPT0gJ3F1YXJ0ZXInKSB7XG4gICAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSAvIDMpO1xuICAgICAgY29uc3QgeWVhciA9IHV0Y0Zvcm1hdChnZXRUaW1lSW50ZXJ2YWxGb3JtYXQoJ3llYXInKSkoZGF0ZSk7XG4gICAgICByZXR1cm4gYFEke3F1YXJ0ZXJ9ICR7eWVhcn1gO1xuICAgIH1cbiAgICBjb25zdCBmb3JtYXQgPSBnZXRUaW1lSW50ZXJ2YWxGb3JtYXQoZGF0ZUZvcm1hdCk7XG4gICAgcmV0dXJuIHV0Y0Zvcm1hdChmb3JtYXQpKGRhdGUpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVJbnRlcnZhbEZvcm1hdChpbnRlcnZhbDogSW50ZXJ2YWwpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgcmV0dXJuICclbS8lZC8lWSc7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgcmV0dXJuICclYiAlWSc7XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgcmV0dXJuICclWSc7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGFydERhdGFUb0RvbnV0RGF0YShjaGFydERhdGE6IERhdGEpOiBEb251dERhdGFbXSB7XG4gICAgaWYgKGNoYXJ0RGF0YS55cy5maW5kKHkgPT4geS52YWx1ZXMubGVuZ3RoID4gMSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiSGVhZHMgdXAhIFBpZSBjaGFydHMgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXMgcGVyIHNlcmllc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb251dERhdGEgPSBjaGFydERhdGEueXMubWFwKHkgPT4gKHtcbiAgICAgIGxhYmVsOiB5LmxhYmVsLFxuICAgICAgaGlkZGVuOiB5LmhpZGRlbixcbiAgICAgIHZhbHVlOiB5LnZhbHVlcy5sZW5ndGggPj0gMSA/IHkudmFsdWVzWzBdIDogMCxcbiAgICB9KSk7XG4gICAgcmV0dXJuIGRvbnV0RGF0YTtcbiAgfVxufVxuIl19
|
|
731
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2NoYXJ0L2NoYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWUsV0FBVyxFQUFhLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTNFLE1BQU0sS0FBVyxLQUFLLENBd2dDckI7QUF4Z0NELFdBQWlCLEtBQUs7SUFDUCx5QkFBbUIsR0FBRztRQUNqQyxhQUFhO1FBQ2IsaUJBQWlCO1FBQ2pCLG1CQUFtQjtRQUNuQixXQUFXO1FBQ1gsV0FBVztRQUNYLFdBQVc7UUFDWCxXQUFXO1FBQ1gsZ0NBQWdDO1FBQ2hDLGlCQUFpQjtRQUNqQixtQkFBbUI7UUFDbkIsV0FBVztRQUNYLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLCtCQUErQjtRQUMvQixpQkFBaUI7UUFDakIsbUJBQW1CO1FBQ25CLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLFdBQVc7S0FDWixDQUFDO0lBRUYsU0FBZ0IsS0FBSyxDQUFDLE1BQWMsRUFBRSxJQUFVLEVBQUUsVUFBc0I7UUFDdEUsT0FBTyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU07WUFDMUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQztZQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNO2dCQUN2QixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDO2dCQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxPQUFPO29CQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDO29CQUNoQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxnQkFBZ0I7d0JBQ2pDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUM7d0JBQzFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUs7NEJBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUM7NEJBQ2hDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDakIsQ0FBQztJQVplLFdBQUssUUFZcEIsQ0FBQTtJQUNELFNBQWdCLEtBQUssQ0FDbkIsTUFBYyxFQUNkLE9BQWEsRUFDYixVQUFzQjtRQUV0QixNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUNoQyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVixxRUFBcUUsQ0FDdEUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsNkVBQTZFO1FBQzdFLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFVLEVBQUUsRUFBRSxDQUM1QixZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFakQsMkRBQTJEO1FBQzNELE1BQU0sVUFBVSxHQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFL0MsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztTQUNwQixDQUFDLENBQUMsQ0FBQztRQUVKLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNmLEtBQUssRUFBRSxJQUFJLENBQUMs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QUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0osT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQWRlLGlDQUEyQiw4QkFjMUMsQ0FBQTtJQUVELFNBQVMsZUFBZSxDQUN0QixLQUVzQyxFQUN0QyxRQUE4QztRQUU5QyxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUU7WUFDekIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsRUF4Z0NnQixLQUFLLEtBQUwsS0FBSyxRQXdnQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNjYWxlTGluZWFyLCBzY2FsZUxpbmVhciwgU2NhbGVUaW1lLCBzY2FsZVV0YyB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IGFyYywgYXJlYSwgbGluZSwgcGllIH0gZnJvbSAnZDMtc2hhcGUnO1xuaW1wb3J0IHsgdXRjRm9ybWF0IH0gZnJvbSAnZDMtdGltZS1mb3JtYXQnO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRGF5c1BpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvZGF5cy5waXBlJztcbmltcG9ydCB7IE51bWJlclBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHsgUGVyY2VudGFnZVBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvcGVyY2VudGFnZS5waXBlJztcbmltcG9ydCB7IFNtYWxsQ3VycmVuY3lQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL3NtYWxsLWN1cnJlbmN5LnBpcGUnO1xuXG5leHBvcnQgbmFtZXNwYWNlIENoYXJ0IHtcbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb2xvclBhbGV0dGUgPSBbXG4gICAgLy9CYXNlIGNvbG9yc1xuICAgICctLWJhamEtYmxhc3QtNTAnLFxuICAgICctLXRlYWwtZGlhbW9uZC01MCcsXG4gICAgJy0tZnlyZS01MCcsXG4gICAgJy0tdGFuZy01MCcsXG4gICAgJy0tcHVycC02MCcsXG4gICAgJy0tcm9zaS03MCcsXG4gICAgLy9TaGlmdCBsaWdodGVyIGZyb20gYmFzZSBieSAtMjBcbiAgICAnLS1iYWphLWJsYXN0LTMwJyxcbiAgICAnLS10ZWFsLWRpYW1vbmQtMzAnLFxuICAgICctLWZ5cmUtMzAnLFxuICAgICctLXRhbmctMzAnLFxuICAgICctLXB1cnAtNDAnLFxuICAgICctLXJvc2ktNTAnLFxuICAgIC8vU2hpZnQgZGFya2VyIGZyb20gYmFzZSBieSArMjBcbiAgICAnLS1iYWphLWJsYXN0LTcwJyxcbiAgICAnLS10ZWFsLWRpYW1vbmQtNzAnLFxuICAgICctLWZ5cmUtNzAnLFxuICAgICctLXRhbmctNzAnLFxuICAgICctLXB1cnAtODAnLFxuICAgICctLXJvc2ktOTAnLFxuICBdO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGFydChjb25maWc6IENvbmZpZywgZGF0YTogRGF0YSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xuICAgIHJldHVybiBjb25maWcudHlwZSA9PSAnbGluZSdcbiAgICAgID8gbGluZXMoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnYXJlYSdcbiAgICAgID8gYXJlYXMoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnZG9udXQnXG4gICAgICA/IGFyY3MoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnaG9yaXpvbnRhbC1iYXInXG4gICAgICA/IGhvcml6b250YWxCYXJzKGNvbmZpZywgZGF0YSwgZGltZW5zaW9ucylcbiAgICAgIDogY29uZmlnLnR5cGUgPT0gJ2JhcidcbiAgICAgID8gYmFycyhjb25maWcsIGRhdGEsIGRpbWVuc2lvbnMpXG4gICAgICA6IGVtcHR5Q2hhcnQ7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGxpbmVzKFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgY29uc3QgeyBkYXRhOiBoaWRkZW5EYXRhLCB2aXNpYmxlSW5kaWNlcyB9ID0gaGlkZShhbGxEYXRhKTtcbiAgICBpZiAoaGlkZGVuRGF0YS50eXBlID09ICdsYWJlbGVkJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgTGFiZWxlZCBzZXJpZXMgYXJlbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGxpbmUgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIC8vVGhpcyBhc3NpZ25tZW50IG1ha2VzIHR5cGVzY3JpcHQgcmVjb2duaXplIHRoZSBhY3R1YWwgdHlwZSAoVGltZXNlcmllc0RhdGEpXG4gICAgY29uc3QgZGF0YSA9IGhpZGRlbkRhdGE7XG4gICAgY29uc3QgeFNjYWxlID0gc2NhbGVVdGModGltZXNlcmllc0RvbWFpbihkYXRhKSwgeFJhbmdlKGRpbWVuc2lvbnMpKTtcbiAgICBjb25zdCBmb3JtYXQgPSAoZGF0ZTogRGF0ZSkgPT5cbiAgICAgIGZvcm1hdGVkRGF0ZShjb25maWcuZGF0ZUZvcm1hdCB8fCAnZGF5JywgZGF0ZSk7XG5cbiAgICAvL0RvbnQgdXNlIGF1dG8gbWFnaWMgd2hlbiBkZWFsaW5nIHdpdGggMSwyLDMsNCBkYXRhIHBvaW50c1xuICAgIGNvbnN0IHhUaWNrRGF0ZXMgPVxuICAgICAgZGF0YS54Lmxlbmd0aCA8IDVcbiAgICAgICAgPyBkYXRhLngubWFwKHggPT4gbmV3IERhdGUoeCkpXG4gICAgICAgIDogeFNjYWxlLnRpY2tzKE1hdGgubWluKDUsIGRhdGEueC5sZW5ndGgpKTtcblxuICAgIGNvbnN0IHhUaWNrcyA9IHhUaWNrRGF0ZXMubWFwKHRpY2sgPT4gKHtcbiAgICAgIHg6IHhTY2FsZSh0aWNrKSxcbiAgICAgIGxhYmVsOiBmb3JtYXQodGljayksXG4gICAgfSkpO1xuXG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG4gICAgY29uc3QgeVNjYWxlID0gc2NhbGVMaW5lYXIoeURvbWFpbihkYXRhKSwgeVJhbmdlKGRpbWVuc2lvbnMpKTtcbiAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3MoNSkubWFwKHRpY2sgPT4gKHtcbiAgICAgIHk6IHlTY2FsZSh0aWNrKSxcbiAgICAgIGxhYmVsOiBwaXBlLnRyYW5zZm9ybSh0aWNrKSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjb2xvcnMgPSB2aXNpYmxlSW5kaWNlcy5tYXAoXG4gICAgICBpID0+IGNvbmZpZy5jb2xvcnNbaSAlIGNvbmZpZy5jb2xvcnMubGVuZ3RoXSxcbiAgICApO1xuICAgIGNvbnN0IGluZGljZXMgPSBkYXRhLngubWFwKChfLCBpKSA9PiBpKTtcbiAgICBjb25zdCBsaW5lcyA9XG4gICAgICBkYXRhLngubGVuZ3RoID4gMVxuICAgICAgICA/IGRhdGEueXMubWFwKHkgPT5cbiAgICAgICAgICAgIGxpbmU8bnVtYmVyPihcbiAgICAgICAgICAgICAgaSA9PiB4U2NhbGUoZGF0YS54W2ldKSxcbiAgICAgICAgICAgICAgaSA9PiB5U2NhbGUoeS52YWx1ZXNbaV0pLFxuICAgICAgICAgICAgKShpbmRpY2VzKSxcbiAgICAgICAgICApXG4gICAgICAgIDogW107XG4gICAgY29uc3QgY2lyY2xlcyA9XG4gICAgICBkYXRhLngubGVuZ3RoID09PSAxXG4gICAgICAgID8gZGF0YS55cy5tYXAoeVNlcmllcyA9PiAoe1xuICAgICAgICAgICAgY3g6IHhTY2FsZShkYXRhLnhbMF0pLFxuICAgICAgICAgICAgY3k6IHlTY2FsZSh5U2VyaWVzLnZhbHVlc1swXSksXG4gICAgICAgICAgfSkpXG4gICAgICAgIDogW107XG5cbiAgICBmdW5jdGlvbiBob3Zlcihwb3M6IHsgcmVjdDogRE9NUmVjdDsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgICAgY29uc3QgeEluZGV4ID0gZmluZE5lYXJlc3RJbmRleChkYXRhLngsIHhTY2FsZS5pbnZlcnQocG9zLngpLmdldFRpbWUoKSk7XG4gICAgICBjb25zdCB4ID0geFNjYWxlKGRhdGEueFt4SW5kZXhdKTtcbiAgICAgIGNvbnN0IHZpc2libGVZSW5kZXggPSBmaW5kTmVhcmVzdEluZGV4KFxuICAgICAgICBkYXRhLnlzLm1hcCh5ID0+IHkudmFsdWVzW3hJbmRleF0pLFxuICAgICAgICB5U2NhbGUuaW52ZXJ0KHBvcy55KSxcbiAgICAgICk7XG4gICAgICBjb25zdCB5SW5kZXggPSB2aXNpYmxlSW5kaWNlc1t2aXNpYmxlWUluZGV4XTtcbiAgICAgIGNvbnN0IHlzID0gZGF0YS55cy5tYXAoeSA9PiB5U2NhbGUoeS52YWx1ZXNbeEluZGV4XSkpO1xuXG4gICAgICBjb25zdCBmb3JtYXQgPSAoZGF0ZTogRGF0ZSkgPT5cbiAgICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcblxuICAgICAgY29uc3QgYW5jaG9yID0gbmV3IERPTVJlY3QoXG4gICAgICAgIHBvcy5yZWN0LnggKyB4LFxuICAgICAgICBwb3MucmVjdC55ICsgeXNbdmlzaWJsZVlJbmRleF0sXG4gICAgICAgIDgsXG4gICAgICAgIDAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeCxcbiAgICAgICAgeEluZGV4LFxuICAgICAgICB5cyxcbiAgICAgICAgeUluZGV4LFxuICAgICAgICB2aXNpYmxlWUluZGV4LFxuICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGRhdGU6IGZvcm1hdChuZXcgRGF0ZShkYXRhLnhbeEluZGV4XSkpLFxuICAgICAgICAgIG1ldHJpY3M6IGRhdGEueXNcbiAgICAgICAgICAgIC5tYXAoKHksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICBjb2xvcjogY29sb3JzW2luZGV4ICUgY29sb3JzLmxlbmd0aF0sXG4gICAgICAgICAgICAgIGxhYmVsOiB5LmxhYmVsLFxuICAgICAgICAgICAgICB2YWx1ZTogZnVsbFBpcGUudHJhbnNmb3JtKHkudmFsdWVzW3hJbmRleF0pID8/ICctJyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoXywgaSkgPT4gY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT0gdmlzaWJsZVlJbmRleCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3MsXG4gICAgICB5VGlja3MsXG4gICAgICBjb2xvcnMsXG4gICAgICBsaW5lcyxcbiAgICAgIGNpcmNsZXMsXG4gICAgICBob3ZlcixcbiAgICAgIGJhcnM6IFtdLFxuICAgICAgYXJlYXM6IFtdLFxuICAgICAgYXJjczogW10sXG4gICAgICBob3Jpem9udGFsQmFyczogW10sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBhcmVhcyhcbiAgICBjb25maWc6IENvbmZpZyxcbiAgICBhbGxEYXRhOiBEYXRhLFxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXG4gICk6IFJlbmRlcmVkQ2hhcnQge1xuICAgIGNvbnN0IHsgZGF0YTogdW5zdGFja2VkRGF0YSwgdmlzaWJsZUluZGljZXMgfSA9IGhpZGUoYWxsRGF0YSk7XG4gICAgY29uc3Qgc3RhY2tlZERhdGEgPSBzdGFjayh1bnN0YWNrZWREYXRhKTtcbiAgICBpZiAoc3RhY2tlZERhdGEudHlwZSA9PSAnbGFiZWxlZCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiSGVhZHMgdXAhIExhYmVsZWQgc2VyaWVzIGFyZW4ndCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBhcmVhIGNoYXJ0c1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBlbXB0eUNoYXJ0O1xuICAgIH1cbiAgICAvL1RoaXMgYXNzaWdubWVudCBtYWtlcyB0eXBlc2NyaXB0IHJlY29nbml6ZSB0aGUgYWN0dWFsIHR5cGUgKFRpbWVzZXJpZXNEYXRhKVxuICAgIGNvbnN0IGRhdGEgPSBzdGFja2VkRGF0YTtcbiAgICBjb25zdCB4U2NhbGUgPSBzY2FsZVV0Yyh0aW1lc2VyaWVzRG9tYWluKGRhdGEpLCB4UmFuZ2UoZGltZW5zaW9ucykpO1xuICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcbiAgICBjb25zdCB4VGlja3MgPSB4U2NhbGUudGlja3MoTWF0aC5taW4oNSwgZGF0YS54Lmxlbmd0aCkpLm1hcCh0aWNrID0+ICh7XG4gICAgICB4OiB4U2NhbGUodGljayksXG4gICAgICBsYWJlbDogZm9ybWF0KHRpY2spLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHsgcGlwZSwgZnVsbFBpcGUgfSA9IGdldFBpcGVzKGNvbmZpZy52YWx1ZVR5cGUpO1xuICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKHlEb21haW4oZGF0YSksIHlSYW5nZShkaW1lbnNpb25zKSk7XG4gICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKDUpLm1hcCh0aWNrID0+ICh7XG4gICAgICB5OiB5U2NhbGUodGljayksXG4gICAgICBsYWJlbDogcGlwZS50cmFuc2Zvcm0odGljayksXG4gICAgfSkpO1xuXG4gICAgY29uc3QgaW5kaWNlcyA9IGRhdGEueC5tYXAoKF8sIGkpID0+IGkpO1xuICAgIGNvbnN0IGNvbG9ycyA9IHZpc2libGVJbmRpY2VzLm1hcChcbiAgICAgIGkgPT4gY29uZmlnLmNvbG9yc1tpICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdLFxuICAgICk7XG4gICAgY29uc3QgYXJlYXMgPSBkYXRhLnlzLm1hcCgoeSwgeUluZGV4KSA9PlxuICAgICAgYXJlYTxudW1iZXI+KFxuICAgICAgICBpID0+IHhTY2FsZShkYXRhLnhbaV0pLFxuICAgICAgICBpID0+IHlTY2FsZSh5SW5kZXggPT0gMCA/IDAgOiBkYXRhLnlzW3lJbmRleCAtIDFdLnZhbHVlc1tpXSksXG4gICAgICAgIGkgPT4geVNjYWxlKHkudmFsdWVzW2ldKSxcbiAgICAgICkoaW5kaWNlcyksXG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIGhvdmVyKHBvczogeyByZWN0OiBET01SZWN0OyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSB7XG4gICAgICBjb25zdCB4SW5kZXggPSBmaW5kTmVhcmVzdEluZGV4KGRhdGEueCwgeFNjYWxlLmludmVydChwb3MueCkuZ2V0VGltZSgpKTtcbiAgICAgIGNvbnN0IHggPSB4U2NhbGUoZGF0YS54W3hJbmRleF0pO1xuICAgICAgY29uc3QgeVZhbHVlID0geVNjYWxlLmludmVydChwb3MueSk7XG4gICAgICBsZXQgdmlzaWJsZVlJbmRleCA9IGRhdGEueXNcbiAgICAgICAgLm1hcCh5ID0+IHkudmFsdWVzW3hJbmRleF0pXG4gICAgICAgIC5maW5kSW5kZXgoeSA9PiB5ID4geVZhbHVlKTtcbiAgICAgIGlmICh2aXNpYmxlWUluZGV4ID09IC0xKSB7XG4gICAgICAgIHZpc2libGVZSW5kZXggPSBkYXRhLnlzLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgICBjb25zdCB5SW5kZXggPSB2aXNpYmxlSW5kaWNlc1t2aXNpYmxlWUluZGV4XTtcbiAgICAgIGNvbnN0IHlzID0gZGF0YS55cy5tYXAoeSA9PiB5U2NhbGUoeS52YWx1ZXNbeEluZGV4XSkpO1xuICAgICAgY29uc3QgYW5jaG9yID0gbmV3IERPTVJlY3QoXG4gICAgICAgIHBvcy5yZWN0LnggKyB4LFxuICAgICAgICBwb3MucmVjdC55ICsgeXNbdmlzaWJsZVlJbmRleF0sXG4gICAgICAgIFNNQUxMX1BBRERJTkcsXG4gICAgICAgIDAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeCxcbiAgICAgICAgeEluZGV4LFxuICAgICAgICB5cyxcbiAgICAgICAgeUluZGV4LFxuICAgICAgICB2aXNpYmxlWUluZGV4LFxuICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGRhdGU6IHV0Y0Zvcm1hdCgnJUIgJWQsICVZJykobmV3IERhdGUodW5zdGFja2VkRGF0YS54W3hJbmRleF0pKSxcbiAgICAgICAgICBtZXRyaWNzOiB1bnN0YWNrZWREYXRhLnlzXG4gICAgICAgICAgICAubWFwKCh5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgY29sb3I6IGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdLFxuICAgICAgICAgICAgICBsYWJlbDogeS5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IGZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKSA/PyAnLScsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8sIGkpID0+IGNvbmZpZy5ncm91cGVkVG9vbHRpcCB8fCBpID09IHZpc2libGVZSW5kZXgpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeFRpY2tzLFxuICAgICAgeVRpY2tzLFxuICAgICAgY29sb3JzLFxuICAgICAgYXJlYXMsXG4gICAgICBsaW5lczogW10sXG4gICAgICBjaXJjbGVzOiBbXSxcbiAgICAgIGhvdmVyLFxuICAgICAgYmFyczogW10sXG4gICAgICBhcmNzOiBbXSxcbiAgICAgIGhvcml6b250YWxCYXJzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGJhcnMoXG4gICAgY29uZmlnOiBCYXJDb25maWcsXG4gICAgYWxsRGF0YTogRGF0YSxcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICApOiBSZW5kZXJlZENoYXJ0IHtcbiAgICBjb25zdCB7IGRhdGE6IHVuc3RhY2tlZERhdGEsIHZpc2libGVJbmRpY2VzIH0gPSBoaWRlKGFsbERhdGEpO1xuICAgIGNvbnN0IHBvc3NpYmx5U3RhY2tlZERhdGEgPVxuICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnY2x1c3RlcmVkJyA/IHVuc3RhY2tlZERhdGEgOiBzdGFjayh1bnN0YWNrZWREYXRhKTtcbiAgICBpZiAocG9zc2libHlTdGFja2VkRGF0YS50eXBlID09ICdsYWJlbGVkJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgTGFiZWxlZCBzZXJpZXMgYXJlbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIHZlcnRpY2FsIGJhciBjaGFydHNcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gZW1wdHlDaGFydDtcbiAgICB9XG4gICAgLy9UaGlzIGFzc2lnbm1lbnQgbWFrZXMgdHlwZXNjcmlwdCByZWNvZ25pemUgdGhlIGFjdHVhbCB0eXBlIChUaW1lc2VyaWVzRGF0YSlcbiAgICBjb25zdCBkYXRhID0gcG9zc2libHlTdGFja2VkRGF0YTtcbiAgICBjb25zdCB7IHJhbmdlOiB4UmFuZ2UsIGJpblNpemUgfSA9IGJhclhSYW5nZShkaW1lbnNpb25zLCBkYXRhKTtcbiAgICBjb25zdCBoYWxmQmluU2l6ZSA9IGJpblNpemUgLyAyO1xuICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlVXRjKHRpbWVzZXJpZXNEb21haW4oZGF0YSksIHhSYW5nZSk7XG4gICAgY29uc3QgZm9ybWF0ID0gKGRhdGU6IERhdGUpID0+XG4gICAgICBmb3JtYXRlZERhdGUoY29uZmlnLmRhdGVGb3JtYXQgfHwgJ2RheScsIGRhdGUpO1xuICAgIGNvbnN0IHhUaWNrcyA9IHhTY2FsZS50aWNrcyhNYXRoLm1pbig1LCBkYXRhLngubGVuZ3RoKSkubWFwKHRpY2sgPT4gKHtcbiAgICAgIHg6IHhTY2FsZSh0aWNrKSxcbiAgICAgIGxhYmVsOiBmb3JtYXQodGljayksXG4gICAgfSkpO1xuXG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG4gICAgY29uc3QgeVJhbmdlVmFsID0geVJhbmdlKGRpbWVuc2lvbnMpO1xuICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKHlEb21haW4oZGF0YSksIHlSYW5nZVZhbCk7XG4gICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKDUpLm1hcCh0aWNrID0+ICh7XG4gICAgICB5OiB5U2NhbGUodGljayksXG4gICAgICBsYWJlbDogcGlwZS50cmFuc2Zvcm0odGljayksXG4gICAgfSkpO1xuICAgIGNvbnN0IGNvbG9ycyA9IHZpc2libGVJbmRpY2VzLm1hcChcbiAgICAgIGkgPT4gY29uZmlnLmNvbG9yc1tpICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdLFxuICAgICk7XG4gICAgY29uc3QgYmFycyA9IGRhdGEueXMubWFwKCh5LCB5SW5kZXgpID0+XG4gICAgICB5LnZhbHVlcy5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB5VmFsdWUgPSB5U2NhbGUodmFsdWUpO1xuICAgICAgICBsZXQgeFZhbHVlID0geFNjYWxlKGRhdGEueFtpbmRleF0pIC0gaGFsZkJpblNpemU7XG4gICAgICAgIGxldCB3aWR0aCA9IGJpblNpemU7XG4gICAgICAgIGxldCBoZWlnaHQgPVxuICAgICAgICAgICh5SW5kZXggPT0gMFxuICAgICAgICAgICAgPyB5U2NhbGUoMClcbiAgICAgICAgICAgIDogeVNjYWxlKGRhdGEueXNbeUluZGV4IC0gMV0udmFsdWVzW2luZGV4XSkpIC0geVZhbHVlO1xuICAgICAgICBpZiAoY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnY2x1c3RlcmVkJykge1xuICAgICAgICAgIHdpZHRoID1cbiAgICAgICAgICAgIChiaW5TaXplIC0gKGRhdGEueXMubGVuZ3RoIC0gMSkgKiBTTUFMTF9QQURESU5HKSAvIGRhdGEueXMubGVuZ3RoO1xuICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KC4uLnlSYW5nZVZhbCkgLSB5VmFsdWU7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0geUluZGV4ICogKHdpZHRoICsgU01BTExfUEFERElORyk7XG4gICAgICAgICAgeFZhbHVlID0geFZhbHVlICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeFZhbHVlLFxuICAgICAgICAgIHk6IHlWYWx1ZSxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gaG92ZXIocG9zOiB7IHJlY3Q6IERPTVJlY3Q7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcbiAgICAgIGNvbnN0IHhJbmRleCA9IGZpbmROZWFyZXN0SW5kZXgoZGF0YS54LCB4U2NhbGUuaW52ZXJ0KHBvcy54KS5nZXRUaW1lKCkpO1xuICAgICAgY29uc3QgeCA9IHhTY2FsZShkYXRhLnhbeEluZGV4XSk7XG4gICAgICBjb25zdCB5VmFsdWUgPSB5U2NhbGUuaW52ZXJ0KHBvcy55KTtcbiAgICAgIGxldCB2aXNpYmxlWUluZGV4ID0gZGF0YS55c1xuICAgICAgICAubWFwKHkgPT4geS52YWx1ZXNbeEluZGV4XSlcbiAgICAgICAgLmZpbmRJbmRleCh5ID0+IHkgPiB5VmFsdWUpO1xuICAgICAgaWYgKGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ2NsdXN0ZXJlZCcpIHtcbiAgICAgICAgdmlzaWJsZVlJbmRleCA9IGZpbmRTdWJJbmRleCh4LCBwb3MueCwgYmluU2l6ZSwgZGF0YS55cy5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKHZpc2libGVZSW5kZXggPT0gLTEpIHtcbiAgICAgICAgdmlzaWJsZVlJbmRleCA9IGRhdGEueXMubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHlJbmRleCA9IHZpc2libGVJbmRpY2VzW3Zpc2libGVZSW5kZXhdO1xuICAgICAgY29uc3QgeXMgPSBkYXRhLnlzLm1hcCh5ID0+IHlTY2FsZSh5LnZhbHVlc1t4SW5kZXhdKSk7XG4gICAgICBsZXQgYW5jaG9ySGVpZ2h0ID1cbiAgICAgICAgKHZpc2libGVZSW5kZXggPT0gMCA/IHlTY2FsZSgwKSA6IHlzW3Zpc2libGVZSW5kZXggLSAxXSkgLVxuICAgICAgICB5c1t2aXNpYmxlWUluZGV4XTtcbiAgICAgIGlmIChjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnKSB7XG4gICAgICAgIGFuY2hvckhlaWdodCA9IE1hdGgubWF4KC4uLnlSYW5nZVZhbCkgLSB5c1t2aXNpYmxlWUluZGV4XTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBET01SZWN0KFxuICAgICAgICBwb3MucmVjdC54ICsgYmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLnggLSBTTUFMTF9QQURESU5HLFxuICAgICAgICBwb3MucmVjdC55ICsgeXNbdmlzaWJsZVlJbmRleF0sXG4gICAgICAgIGJhcnNbdmlzaWJsZVlJbmRleF1beEluZGV4XS53aWR0aCArIFNNQUxMX1BBRERJTkcgKiAyLFxuICAgICAgICBhbmNob3JIZWlnaHQsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeCxcbiAgICAgICAgeEluZGV4LFxuICAgICAgICB5cyxcbiAgICAgICAgeUluZGV4LFxuICAgICAgICB2aXNpYmxlWUluZGV4LFxuICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGRhdGU6IHV0Y0Zvcm1hdCgnJUIgJWQsICVZJykobmV3IERhdGUodW5zdGFja2VkRGF0YS54W3hJbmRleF0pKSxcbiAgICAgICAgICBtZXRyaWNzOiB1bnN0YWNrZWREYXRhLnlzXG4gICAgICAgICAgICAubWFwKCh5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgY29sb3I6IGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdLFxuICAgICAgICAgICAgICBsYWJlbDogeS5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IGZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKSA/PyAnLScsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8sIGkpID0+IGNvbmZpZy5ncm91cGVkVG9vbHRpcCB8fCBpID09IHZpc2libGVZSW5kZXgpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeFRpY2tzLFxuICAgICAgeVRpY2tzLFxuICAgICAgY29sb3JzLFxuICAgICAgYmFycyxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgYXJlYXM6IFtdLFxuICAgICAgaG92ZXIsXG4gICAgICBhcmNzOiBbXSxcbiAgICAgIGhvcml6b250YWxCYXJzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGhvcml6b250YWxCYXJzKFxuICAgIGNvbmZpZzogQmFyQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgLy9Tb21lIG9mIHRoaXMgc3R1ZmYgZ2V0cyBjb25mdXNpbmcsIGJlY2F1c2UgeCBhbmQgeSBhcmUgZXNzZW50aWFsbHkgaW52ZXJ0ZWQgaGVyZVxuICAgIC8vICBTbywgaWYgeW91IHNlZSBhIHNpdHVhdGlvbiB3aGVyZSBhIHZhcmlhYmxlIGlzIG5hbWVkICd5JywgYnV0IHJlZmVyZW5jaW5nXG4gICAgLy8gICd4JyAob3IgdmljZSB2ZXJzYSksIHRoYXQncyB3aHlcbiAgICBjb25zdCB7IGRhdGE6IHVuc3RhY2tlZERhdGEsIHZpc2libGVJbmRpY2VzIH0gPSBoaWRlKGFsbERhdGEpO1xuICAgIGNvbnN0IGRhdGEgPVxuICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnY2x1c3RlcmVkJyA/IHVuc3RhY2tlZERhdGEgOiBzdGFjayh1bnN0YWNrZWREYXRhKTtcbiAgICBjb25zdCB7IHJhbmdlOiB5UmFuZ2UgfSA9IGJhcllSYW5nZShkaW1lbnNpb25zLCBkYXRhKTtcbiAgICBsZXQgeVNjYWxlID1cbiAgICAgIGRhdGEudHlwZSA9PSAnbGFiZWxlZCdcbiAgICAgICAgPyBzY2FsZUxpbmVhcihpbmRleERvbWFpbihkYXRhKSwgeVJhbmdlKVxuICAgICAgICA6IHNjYWxlVXRjKHRpbWVzZXJpZXNEb21haW4oZGF0YSksIHlSYW5nZSk7XG4gICAgY29uc3QgZGF0ZUZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcbiAgICBjb25zdCB7IHBpcGUsIGZ1bGxQaXBlIH0gPSBnZXRQaXBlcyhjb25maWcudmFsdWVUeXBlKTtcbiAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3MoZGF0YS54Lmxlbmd0aCAtIDEpLm1hcCh0aWNrID0+ICh7XG4gICAgICB5OiB5U2NhbGUodGljayksXG4gICAgICBsYWJlbDogaXNOdW1iZXIodGljaylcbiAgICAgICAgPyBkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnXG4gICAgICAgICAgPyBkYXRhLnhbdGlja11cbiAgICAgICAgICA6ICctJ1xuICAgICAgICA6IGRhdGVGb3JtYXQodGljayksXG4gICAgfSkpO1xuXG4gICAgY29uc3QgeFNjYWxlID0gc2NhbGVMaW5lYXIoXG4gICAgICB5RG9tYWluKGRhdGEpLFxuICAgICAgeFJhbmdlSG9yaXpvbnRhbChkaW1lbnNpb25zLCBkYXRhKSxcbiAgICApO1xuICAgIGNvbnN0IHhUaWNrcyA9IHhTY2FsZS50aWNrcyg1KS5tYXAodGljayA9PiAoe1xuICAgICAgeDogeFNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IHBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgIH0pKTtcbiAgICBjb25zdCBjb2xvcnMgPSB2aXNpYmxlSW5kaWNlcy5tYXAoXG4gICAgICBpID0+IGNvbmZpZy5jb2xvcnNbaSAlIGNvbmZpZy5jb2xvcnMubGVuZ3RoXSxcbiAgICApO1xuICAgIGNvbnN0IHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyczoge1xuICAgICAgeFBvczogbnVtYmVyO1xuICAgICAgeVBvczogbnVtYmVyO1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICB9W11bXSA9IFtdO1xuICAgIGNvbnN0IGhvcml6b250YWxCYXJzID0gZGF0YS55cy5tYXAoKHksIHlJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3ViU2ltcEhvckJhcnM6IHtcbiAgICAgICAgeFBvczogbnVtYmVyO1xuICAgICAgICB5UG9zOiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICB9W10gPSBbXTtcbiAgICAgIGNvbnN0IHJldFZhbCA9IHkudmFsdWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCB4VmFsdWUgPVxuICAgICAgICAgIHlJbmRleCA9PSAwID8geFNjYWxlKDApIDogeFNjYWxlKGRhdGEueXNbeUluZGV4IC0gMV0udmFsdWVzW2luZGV4XSk7XG4gICAgICAgIGxldCB3aWR0aCA9IHhTY2FsZSh2YWx1ZSkgLSB4VmFsdWU7XG5cbiAgICAgICAgbGV0IHlWYWx1ZSA9XG4gICAgICAgICAgeVNjYWxlKGRhdGEudHlwZSA9PSAnbGFiZWxlZCcgPyBpbmRleCA6IGRhdGEueFtpbmRleF0pIC1cbiAgICAgICAgICBIT1JJWk9OVEFMX0JBUl9IRUlHSFQgKiAxLjU7XG4gICAgICAgIGlmIChjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnKSB7XG4gICAgICAgICAgeFZhbHVlID0geFNjYWxlKDApO1xuICAgICAgICAgIHdpZHRoID0geFNjYWxlKHZhbHVlKSAtIHhWYWx1ZTtcblxuICAgICAgICAgIGNvbnN0IGNlbnRlckluZGV4ID0gZGF0YS55cy5sZW5ndGggLyAyIC0gMC41O1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9XG4gICAgICAgICAgICAoeUluZGV4IC0gY2VudGVySW5kZXgpICogKEhPUklaT05UQUxfQkFSX0hFSUdIVCArIFNNQUxMX1BBRERJTkcpO1xuICAgICAgICAgIHlWYWx1ZSA9IHlWYWx1ZSArIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHIgPSA0O1xuICAgICAgICBzdWJTaW1wSG9yQmFycy5wdXNoKHtcbiAgICAgICAgICB4UG9zOiB4VmFsdWUsXG4gICAgICAgICAgeVBvczogeVZhbHVlLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRhdGEueXMubGVuZ3RoID09IDEgfHwgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnY2x1c3RlcmVkJykge1xuICAgICAgICAgIC8vQm90aC1zaWRlcyByb3VuZGluZyB2YXJpYXRpb25cbiAgICAgICAgICBjb25zdCBwYXRoRCA9IGBcbiAgICAgICAgICAgIE0gJHt4VmFsdWUgKyByfSwke3lWYWx1ZX1cbiAgICAgICAgICAgIGggJHt3aWR0aCAtIHIgKiAyfVxuICAgICAgICAgICAgcSR7cn0sMCAke3J9LCR7cn1cbiAgICAgICAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLSByICogMn1cbiAgICAgICAgICAgIHEwLCR7cn0gLSR7cn0sJHtyfVxuICAgICAgICAgICAgaCAkey0od2lkdGggLSByICogMil9XG4gICAgICAgICAgICBxLSR7cn0sMCAtJHtyfSwtJHtyfVxuICAgICAgICAgICAgdiAtJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLSByICogMn1cbiAgICAgICAgICAgIHEwLC0ke3J9ICR7cn0sLSR7cn1cbiAgICAgICAgICAgIFpcbiAgICAgICAgICBgO1xuICAgICAgICAgIHJldHVybiBwYXRoRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeUluZGV4ID09IDApIHtcbiAgICAgICAgICAvL0xlZnQtc2lkZSByb3VuZGluZyB2YXJpYXRpb25cbiAgICAgICAgICBjb25zdCBwYXRoRCA9IGBcbiAgICAgICAgICAgIE0gJHt4VmFsdWUgKyByfSwke3lWYWx1ZX1cbiAgICAgICAgICAgIGggJHt3aWR0aCAtIHJ9XG4gICAgICAgICAgICB2ICR7SE9SSVpPTlRBTF9CQVJfSEVJR0hUfVxuICAgICAgICAgICAgaCAkey0od2lkdGggLSByKX1cbiAgICAgICAgICAgIHEtJHtyfSwwIC0ke3J9LC0ke3J9XG4gICAgICAgICAgICB2IC0ke0hPUklaT05UQUxfQkFSX0hFSUdIVCAtIHIgKiAyfVxuICAgICAgICAgICAgcTAsLSR7cn0gJHtyfSwtJHtyfVxuICAgICAgICAgICAgWlxuICAgICAgICAgIGA7XG4gICAgICAgICAgcmV0dXJuIHBhdGhEO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5SW5kZXggPT0gZGF0YS55cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgLy9SaWdodC1zaWRlIHJvdW5kaW5nIHZhcmlhdGlvblxuICAgICAgICAgIGNvbnN0IHBhdGhEID0gYFxuICAgICAgICAgICAgTSAke3hWYWx1ZX0sJHt5VmFsdWV9XG4gICAgICAgICAgICBoICR7d2lkdGggLSByfVxuICAgICAgICAgICAgcSR7cn0sMCAke3J9LCR7cn1cbiAgICAgICAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLSByICogMn1cbiAgICAgICAgICAgIHEwLCR7cn0gLSR7cn0sJHtyfVxuICAgICAgICAgICAgaCAkey0od2lkdGggLSByKX1cbiAgICAgICAgICAgIFpcbiAgICAgICAgICBgO1xuICAgICAgICAgIHJldHVybiBwYXRoRDtcbiAgICAgICAgfVxuICAgICAgICAvL05vLXJvdW5kaW5nIHZhcmlhdGlvblxuICAgICAgICBjb25zdCBwYXRoRCA9IGBcbiAgICAgICAgICBNICR7eFZhbHVlfSwke3lWYWx1ZX1cbiAgICAgICAgICBoICR7d2lkdGh9XG4gICAgICAgICAgdiAke0hPUklaT05UQUxfQkFSX0hFSUdIVH1cbiAgICAgICAgICBoICR7LXdpZHRofVxuICAgICAgICAgIHYgLSR7SE9SSVpPTlRBTF9CQVJfSEVJR0hUfVxuICAgICAgICAgIFpcbiAgICAgICAgYDtcbiAgICAgICAgcmV0dXJuIHBhdGhEO1xuICAgICAgfSk7XG4gICAgICBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnMucHVzaChzdWJTaW1wSG9yQmFycyk7XG4gICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gaG92ZXIocG9zOiB7IHJlY3Q6IERPTVJlY3Q7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcbiAgICAgIGxldCB4SW5kZXg6IG51bWJlciA9IDA7XG4gICAgICBsZXQgeCA9IDA7XG4gICAgICBsZXQgdmlzaWJsZVlJbmRleCA9IDA7XG4gICAgICBpZiAoY2hlY2tZU2NhbGVUeXBlKHlTY2FsZSwgZGF0YS50eXBlKSAmJiBkYXRhLnR5cGUgIT0gJ2xhYmVsZWQnKSB7XG4gICAgICAgIHhJbmRleCA9IGZpbmROZWFyZXN0SW5kZXgoZGF0YS54LCB5U2NhbGUuaW52ZXJ0KHBvcy55KS5nZXRUaW1lKCkpO1xuICAgICAgICB4ID0geVNjYWxlKGRhdGEueFt4SW5kZXhdKSAtIFNNQUxMX1BBRERJTkc7XG4gICAgICAgIGNvbnN0IHlWYWx1ZSA9IHhTY2FsZS5pbnZlcnQocG9zLngpO1xuICAgICAgICB2aXNpYmxlWUluZGV4ID0gZGF0YS55c1xuICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgIC5maW5kSW5kZXgoeSA9PiB5ID4geVZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFjaGVja1lTY2FsZVR5cGUoeVNjYWxlLCBkYXRhLnR5cGUpICYmXG4gICAgICAgIGRhdGEudHlwZSA9PSAnbGFiZWxlZCdcbiAgICAgICkge1xuICAgICAgICB4SW5kZXggPSBmaW5kTmVhcmVzdEluZGV4U3RyaW5nKGRhdGEueCwgeVNjYWxlLmludmVydChwb3MueSkpO1xuICAgICAgICB4ID0geVNjYWxlKHhJbmRleCkgLSBTTUFMTF9QQURESU5HO1xuICAgICAgICBjb25zdCB5VmFsdWUgPSB4U2NhbGUuaW52ZXJ0KHBvcy54KTtcbiAgICAgICAgdmlzaWJsZVlJbmRleCA9IGRhdGEueXNcbiAgICAgICAgICAubWFwKHkgPT4geS52YWx1ZXNbeEluZGV4XSlcbiAgICAgICAgICAuZmluZEluZGV4KHkgPT4geSA+IHlWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHlzID0gZGF0YS55cy5tYXAoeSA9PiB4U2NhbGUoeS52YWx1ZXNbeEluZGV4XSkpO1xuICAgICAgaWYgKGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ2NsdXN0ZXJlZCcpIHtcbiAgICAgICAgdmlzaWJsZVlJbmRleCA9IGZpbmRTdWJJbmRleEhvcml6b250YWwoeCwgcG9zLnksIGRhdGEueXMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZpc2libGVZSW5kZXggPT0gLTEpIHtcbiAgICAgICAgdmlzaWJsZVlJbmRleCA9IGRhdGEueXMubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHlJbmRleCA9IHZpc2libGVJbmRpY2VzW3Zpc2libGVZSW5kZXhdO1xuXG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgcG9zLnJlY3QueCArXG4gICAgICAgICAgc2ltcGxpZmllZEhvcml6b250YWxCYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ueFBvcyAtXG4gICAgICAgICAgU01BTExfUEFERElORyxcbiAgICAgICAgcG9zLnJlY3QueSArIHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLnlQb3MsXG4gICAgICAgIHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLndpZHRoICtcbiAgICAgICAgICBTTUFMTF9QQURESU5HICogMixcbiAgICAgICAgSE9SSVpPTlRBTF9CQVJfSEVJR0hULFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgsXG4gICAgICAgIHhJbmRleCxcbiAgICAgICAgeXMsXG4gICAgICAgIHlJbmRleCxcbiAgICAgICAgdmlzaWJsZVlJbmRleCxcbiAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBkYXRlOlxuICAgICAgICAgICAgZGF0YS50eXBlID09ICdsYWJlbGVkJ1xuICAgICAgICAgICAgICA/IHVuc3RhY2tlZERhdGEueFt4SW5kZXhdLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgOiB1dGNGb3JtYXQoJyVCICVkLCAlWScpKG5ldyBEYXRlKHVuc3RhY2tlZERhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogdW5zdGFja2VkRGF0YS55c1xuICAgICAgICAgICAgLm1hcCgoeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSkgPz8gJy0nLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAuZmlsdGVyKChfLCBpKSA9PiBjb25maWcuZ3JvdXBlZFRvb2x0aXAgfHwgaSA9PSB2aXNpYmxlWUluZGV4KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHhUaWNrczogeFRpY2tzLFxuICAgICAgeVRpY2tzOiB5VGlja3MsXG4gICAgICBob3ZlcixcbiAgICAgIGNvbG9ycyxcbiAgICAgIGJhcnM6IFtdLFxuICAgICAgbGluZXM6IFtdLFxuICAgICAgY2lyY2xlczogW10sXG4gICAgICBhcmVhczogW10sXG4gICAgICBhcmNzOiBbXSxcbiAgICAgIGhvcml6b250YWxCYXJzLFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYXJjcyhcbiAgICBjb25maWc6IENvbmZpZyxcbiAgICBhbGxEYXRhOiBEYXRhLFxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXG4gICk6IFJlbmRlcmVkQ2hhcnQge1xuICAgIGNvbnN0IHsgZGF0YTogdW5zdGFja2VkRGF0YSwgdmlzaWJsZUluZGljZXMgfSA9IGhpZGUoYWxsRGF0YSk7XG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBkb251dERhdGEgPSBDaGFydC5jb252ZXJ0Q2hhcnREYXRhVG9Eb251dERhdGEodW5zdGFja2VkRGF0YSk7XG4gICAgY29uc3Qgb3V0ZXIgPSAoZGltZW5zaW9ucy5oZWlnaHQgLyAyKSAqIDAuNzU7XG4gICAgY29uc3QgaW5uZXIgPSBvdXRlciAtIDEyO1xuICAgIGNvbnN0IHBpZUFyY3MgPSBwaWU8RG9udXREYXRhPigpXG4gICAgICAuc29ydFZhbHVlcyhudWxsKVxuICAgICAgLnZhbHVlKGQgPT4gZC52YWx1ZSkoZG9udXREYXRhKTtcbiAgICBjb25zdCBhcmNzID0gcGllQXJjcy5tYXAocGllQXJjID0+XG4gICAgICBhcmM8RG9udXREYXRhPigpXG4gICAgICAgIC5pbm5lclJhZGl1cyhpbm5lcilcbiAgICAgICAgLm91dGVyUmFkaXVzKG91dGVyKVxuICAgICAgICAucGFkQW5nbGUoMC4wMTMpXG4gICAgICAgIC5zdGFydEFuZ2xlKHBpZUFyYy5zdGFydEFuZ2xlKVxuICAgICAgICAuZW5kQW5nbGUocGllQXJjLmVuZEFuZ2xlKShwaWVBcmMuZGF0YSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3M6IFtdLFxuICAgICAgeVRpY2tzOiBbXSxcbiAgICAgIGFyZWFzOiBbXSxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgYmFyczogW10sXG4gICAgICBjb2xvcnMsXG4gICAgICBhcmNzLFxuICAgICAgaG9yaXpvbnRhbEJhcnM6IFtdLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBMRUZUX1BBRERJTkcgPSA0ODtcbiAgY29uc3QgTEVGVF9QQURESU5HX0RBVEUgPSA2NDtcbiAgZXhwb3J0IGNvbnN0IExFRlRfUEFERElOR19MQUJFTF9NQVggPSAxOTI7XG4gIGNvbnN0IFJJR0hUX1BBRERJTkcgPSAyNDtcbiAgY29uc3QgVE9QX1BBRERJTkcgPSAxNjtcbiAgY29uc3QgQk9UVE9NX1BBRERJTkcgPSAyNDtcbiAgY29uc3QgU01BTExfUEFERElORyA9IDg7XG4gIGNvbnN0IEhPUklaT05UQUxfQkFSX0hFSUdIVCA9IDg7XG4gIGNvbnN0IFdJRFRIX1BFUl9MRVRURVIgPSA2LjU7XG5cbiAgZXhwb3J0IHR5cGUgRGF0YSA9IExhYmVsZWREYXRhIHwgVGltZXNlcmllc0RhdGE7XG5cbiAgdHlwZSBCYXNlRGF0YSA9IHtcbiAgICB5czoge1xuICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgIGhpZGRlbj86IGJvb2xlYW47XG4gICAgICB2YWx1ZXM6IG51bWJlcltdO1xuICAgIH1bXTtcbiAgfTtcblxuICAvL0N1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgaG9yaXpvbnRhbCBiYXIgY2hhcnRzXG4gIGV4cG9ydCB0eXBlIExhYmVsZWREYXRhID0gQmFzZURhdGEgJiB7XG4gICAgdHlwZTogJ2xhYmVsZWQnO1xuICAgIHg6IHN0cmluZ1tdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFRpbWVzZXJpZXNEYXRhID0gQmFzZURhdGEgJiB7XG4gICAgdHlwZTogJ3RpbWVzZXJpZXMnO1xuICAgIHg6IG51bWJlcltdO1xuICB9O1xuXG4gIHR5cGUgRG9udXREYXRhID0ge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgaGlkZGVuPzogYm9vbGVhbjtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIERpbWVuc2lvbnMgPSB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfTtcblxuICB0eXBlIEJhc2VDb25maWcgPSB7XG4gICAgZ3JvdXBlZFRvb2x0aXA6IGJvb2xlYW47XG4gICAgY29sb3JzOiBzdHJpbmdbXTtcbiAgICBhbGxvd0xlZ2VuZFRvZ2dsZTogYm9vbGVhbjtcbiAgICB6ZXJvU3RhdGVNZXNzYWdlOiBzdHJpbmc7XG4gICAgdmFsdWVUeXBlOiBWYWx1ZVR5cGU7XG4gICAgdHJ1bmNhdGVMZWdlbmQ6IGJvb2xlYW47XG4gICAgZGF0ZUZvcm1hdD86IEludGVydmFsO1xuICB9O1xuXG4gIHR5cGUgRG9udXRDb25maWcgPSB7XG4gICAgc2l6ZTogJ3hzbWFsbCcgfCAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnO1xuICAgIGRpc3BsYXlWYWx1ZTogc3RyaW5nO1xuICAgIGRpc3BsYXlMYWJlbD86IHN0cmluZztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBDb25maWcgPSBCYXNlQ29uZmlnICZcbiAgICAoXG4gICAgICB8IHtcbiAgICAgICAgICB0eXBlOiAnbGluZScgfCAnYXJlYSc7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIHR5cGU6ICdiYXInIHwgJ2hvcml6b250YWwtYmFyJztcbiAgICAgICAgICBncm91cGluZ1R5cGU6ICdzdGFja2VkJyB8ICdjbHVzdGVyZWQnO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICB0eXBlOiAnZG9udXQnO1xuICAgICAgICAgIGRvbnV0RGlzcGxheUluZm86IERvbnV0Q29uZmlnO1xuICAgICAgICB9XG4gICAgKTtcblxuICB0eXBlIEJhckNvbmZpZyA9IEV4dHJhY3Q8Q29uZmlnLCB7IHR5cGU6ICdiYXInIHwgJ2hvcml6b250YWwtYmFyJyB9PjtcblxuICBleHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZzogQ29uZmlnID0ge1xuICAgIHR5cGU6ICdsaW5lJyxcbiAgICBncm91cGVkVG9vbHRpcDogdHJ1ZSxcbiAgICBjb2xvcnM6IGRlZmF1bHRDb2xvclBhbGV0dGUsXG4gICAgYWxsb3dMZWdlbmRUb2dnbGU6IGZhbHNlLFxuICAgIHplcm9TdGF0ZU1lc3NhZ2U6ICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgICB2YWx1ZVR5cGU6ICdjdXJyZW5jeScsXG4gICAgdHJ1bmNhdGVMZWdlbmQ6IHRydWUsXG4gICAgZGF0ZUZvcm1hdDogJ2RheScsXG4gIH07XG5cbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHREb251dENvbmZpZzogQ29uZmlnID0ge1xuICAgIHR5cGU6ICdkb251dCcsXG4gICAgZ3JvdXBlZFRvb2x0aXA6IHRydWUsXG4gICAgY29sb3JzOiBkZWZhdWx0Q29sb3JQYWxldHRlLFxuICAgIGFsbG93TGVnZW5kVG9nZ2xlOiBmYWxzZSxcbiAgICB6ZXJvU3RhdGVNZXNzYWdlOiAnTm8gZGF0YSB0byBkaXNwbGF5LicsXG4gICAgdmFsdWVUeXBlOiAnY3VycmVuY3knLFxuICAgIHRydW5jYXRlTGVnZW5kOiB0cnVlLFxuICAgIGRhdGVGb3JtYXQ6ICdkYXknLFxuICAgIGRvbnV0RGlzcGxheUluZm86IHtcbiAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgZGlzcGxheVZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEFyZWEgPSB7XG4gICAgcGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxsOiBzdHJpbmc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgWFRpY2sgPSB7XG4gICAgeDogbnVtYmVyO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgWVRpY2sgPSB7XG4gICAgeTogbnVtYmVyO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gIH07XG5cbiAgdHlwZSBSZWN0ID0ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBCYXJTZXJpZXMgPSB7XG4gICAgZmlsbDogc3RyaW5nO1xuICAgIHJlY3RzOiBSZWN0W107XG4gIH07XG5cbiAgdHlwZSBDaXJjbGUgPSB7XG4gICAgY3g6IG51bWJlcjtcbiAgICBjeTogbnVtYmVyO1xuICB9O1xuXG4gIC8vIEhvdmVyIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZpZXdwb3J0IHggYW5kIHkgYW5kIHJldHVybnMgYSByaWNoXG4gIC8vIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHZhbHVlcyBhcmUgYmVpbmcgaG92ZXJlZCBhbmQgd2hhdCB0aGUgdG9vbHRpcFxuICAvLyBzaG91bGQgbG9vayBsaWtlXG4gIGV4cG9ydCB0eXBlIEhvdmVyID0gKHBvczogeyByZWN0OiBET01SZWN0OyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSA9PiB7XG4gICAgLy8gdGhlIGluZGljZXMgaW50byB0aGUgZGF0YSBvZiB0aGUgY2xvc2VzdCBwb2ludFxuICAgIHhJbmRleDogbnVtYmVyO1xuICAgIC8vIHdlIHdhbnQgdG8ga25vdyB3aGljaCB2aXNpYmxlIHkgaW5kZXggaXMgaG92ZXJlZFxuICAgIC8vIGFuZCB3aGljaCBhY3R1YWwgeSBpbmRleCBpcyBob3ZlcmVkXG4gICAgeUluZGV4OiBudW1iZXI7XG4gICAgdmlzaWJsZVlJbmRleDogbnVtYmVyO1xuXG4gICAgLy8gdGhlIHZpZXdwb3J0IHggYW5kIHlzIG9mIHRoZSBob3ZlcmVkIGl0ZW1zXG4gICAgeDogbnVtYmVyO1xuICAgIHlzOiBudW1iZXJbXTtcblxuICAgIHRvb2x0aXA6IHtcbiAgICAgIGFuY2hvcjogRE9NUmVjdDtcbiAgICAgIGRhdGU6IHN0cmluZztcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgY29sb3I6IHN0cmluZztcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IHN0cmluZztcbiAgICAgIH1bXTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJlbmRlcmVkQ2hhcnQgcmVwcmVzZW50cyBhbGwgb2YgdGhlIHBhcnRzIG9mIGEgY2hhcnRcbiAgLy8gdGhhdCBlbmQgdXAgb24gc2NyZWVuLiBFdmVyeSBjaGFydCBoYXMgeCBhbmQgeSB0aWNrc1xuICAvLyBhbmQgaG92ZXIgZnVuY3Rpb25hbGl0eSwgZXZlbiB0aG91Z2ggdGhleSBtaWdodCBiZVxuICAvLyBkaWZmZXJlbnQgZnJvbSBjaGFydCB0byBjaGFydC5cbiAgdHlwZSBSZW5kZXJlZENoYXJ0ID0ge1xuICAgIHhUaWNrczogWFRpY2tbXTtcbiAgICB5VGlja3M6IFlUaWNrW107XG4gICAgaG92ZXI/OiBIb3ZlcjtcbiAgICBjb2xvcnM6IHN0cmluZ1tdO1xuICAgIGxpbmVzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgICBjaXJjbGVzOiBDaXJjbGVbXTsgLy9MaW5lIGZhbGxiYWNrIGZvciBhIHNpbmdsZSBwb2ludFxuICAgIGFyZWFzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgICBiYXJzOiBSZWN0W11bXTtcbiAgICBhcmNzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgICBob3Jpem9udGFsQmFyczogKHN0cmluZyB8IG51bGwpW11bXTtcbiAgfTtcblxuICBjb25zdCBlbXB0eUNoYXJ0OiBSZW5kZXJlZENoYXJ0ID0ge1xuICAgIHhUaWNrczogW10sXG4gICAgeVRpY2tzOiBbXSxcbiAgICBjb2xvcnM6IFtdLFxuICAgIGxpbmVzOiBbXSxcbiAgICBjaXJjbGVzOiBbXSxcbiAgICBhcmVhczogW10sXG4gICAgYmFyczogW10sXG4gICAgYXJjczogW10sXG4gICAgaG9yaXpvbnRhbEJhcnM6IFtdLFxuICB9O1xuXG4gIGZ1bmN0aW9uIHRpbWVzZXJpZXNEb21haW4oZGF0YTogVGltZXNlcmllc0RhdGEpIHtcbiAgICByZXR1cm4gW01hdGgubWluKC4uLmRhdGEueCksIE1hdGgubWF4KC4uLmRhdGEueCldO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5kZXhEb21haW4oZGF0YTogTGFiZWxlZERhdGEpIHtcbiAgICByZXR1cm4gWzAsIGRhdGEueC5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHlEb21haW4oZGF0YTogRGF0YSkge1xuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KC4uLmRhdGEueXMubWFwKHkgPT4gTWF0aC5tYXgoLi4ueS52YWx1ZXMpKSk7XG4gICAgcmV0dXJuIFswLCBtYXggPT0gMCA/IDEgOiBtYXhdO1xuICB9XG5cbiAgZnVuY3Rpb24geFJhbmdlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMpIHtcbiAgICByZXR1cm4gW0xFRlRfUEFERElORywgZGltZW5zaW9ucy53aWR0aCAtIFJJR0hUX1BBRERJTkddO1xuICB9XG5cbiAgZnVuY3Rpb24geFJhbmdlSG9yaXpvbnRhbChkaW1lbnNpb25zOiBEaW1lbnNpb25zLCBkYXRhOiBEYXRhKSB7XG4gICAgbGV0IGxlZnRQYWRkaW5nTWF4ID1cbiAgICAgIGRhdGEudHlwZSA9PSAnbGFiZWxlZCcgPyBMRUZUX1BBRERJTkdfTEFCRUxfTUFYIDogTEVGVF9QQURESU5HX0RBVEU7XG4gICAgbGV0IGxlZnRQYWRkaW5nQ2FsY3VsYXRlZCA9IGxlZnRQYWRkaW5nTWF4O1xuICAgIGlmIChkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnKSB7XG4gICAgICBjb25zdCBtYXhMYWJlbFNpemUgPSBNYXRoLm1heCguLi5kYXRhLngubWFwKHggPT4geC5sZW5ndGgpKTtcbiAgICAgIGxlZnRQYWRkaW5nQ2FsY3VsYXRlZCA9IE1hdGgubWluKFxuICAgICAgICBsZWZ0UGFkZGluZ01heCxcbiAgICAgICAgbWF4TGFiZWxTaXplICogV0lEVEhfUEVSX0xFVFRFUixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vU3BhY2UgYmV0d2VlbiBsYWJlbCBhbmQgY2hhcnRcbiAgICBsZWZ0UGFkZGluZ0NhbGN1bGF0ZWQgPSBsZWZ0UGFkZGluZ0NhbGN1bGF0ZWQgKyBTTUFMTF9QQURESU5HO1xuICAgIHJldHVybiBbXG4gICAgICBNYXRoLm1heChsZWZ0UGFkZGluZ0NhbGN1bGF0ZWQsIExFRlRfUEFERElORyksXG4gICAgICBkaW1lbnNpb25zLndpZHRoIC0gUklHSFRfUEFERElORyxcbiAgICBdO1xuICB9XG5cbiAgZnVuY3Rpb24gYmFyWFJhbmdlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsIGRhdGE6IERhdGEpIHtcbiAgICBjb25zdCBsZWZ0ID0gTEVGVF9QQURESU5HO1xuICAgIGNvbnN0IHJpZ2h0ID0gZGltZW5zaW9ucy53aWR0aCAtIFJJR0hUX1BBRERJTkc7XG4gICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgY29uc3QgYmluU2l6ZSA9IHdpZHRoIC8gKGRhdGEueC5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgaGFsZkJpblNpemUgPSBiaW5TaXplIC8gMjtcbiAgICBjb25zdCByYW5nZSA9IFtsZWZ0ICsgaGFsZkJpblNpemUsIHJpZ2h0IC0gaGFsZkJpblNpemVdO1xuICAgIHJldHVybiB7IGJpblNpemU6IE1hdGgubWluKGJpblNpemUgKiAwLjcsIDgwKSwgcmFuZ2UgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhcllSYW5nZShkaW1lbnNpb25zOiBEaW1lbnNpb25zLCBkYXRhOiBEYXRhKSB7XG4gICAgY29uc3QgdG9wID0gZGltZW5zaW9ucy5oZWlnaHQgLSBUT1BfUEFERElORztcbiAgICBjb25zdCBib3R0b20gPSBCT1RUT01fUEFERElORztcbiAgICBjb25zdCBoZWlnaHQgPSB0b3AgLSBib3R0b207XG4gICAgY29uc3QgYmluU2l6ZSA9IGhlaWdodCAvIChkYXRhLngubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IGhhbGZCaW5TaXplID0gYmluU2l6ZSAvIDI7XG4gICAgY29uc3QgcmFuZ2UgPSBbYm90dG9tICsgaGFsZkJpblNpemUsIHRvcCAtIGhhbGZCaW5TaXplXTtcbiAgICByZXR1cm4geyByYW5nZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24geVJhbmdlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMpIHtcbiAgICByZXR1cm4gW2RpbWVuc2lvbnMuaGVpZ2h0IC0gQk9UVE9NX1BBRERJTkcsIFRPUF9QQURESU5HXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmROZWFyZXN0SW5kZXgodmFsdWVzOiBudW1iZXJbXSwgaW5wdXQ6IG51bWJlcikge1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChuZWFyZXN0SW5kZXgsIHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlIC0gaW5wdXQpIDwgTWF0aC5hYnModmFsdWVzW25lYXJlc3RJbmRleF0gLSBpbnB1dClcbiAgICAgICAgPyBpbmRleFxuICAgICAgICA6IG5lYXJlc3RJbmRleDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmROZWFyZXN0SW5kZXhTdHJpbmcodmFsdWVzOiBzdHJpbmdbXSwgaW5wdXQ6IG51bWJlcikge1xuICAgIGNvbnN0IG51bVZhbHVlcyA9IHZhbHVlcy5tYXAoKF8sIGkpID0+IGkpO1xuICAgIHJldHVybiBudW1WYWx1ZXMucmVkdWNlKChuZWFyZXN0SW5kZXgsIHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlIC0gaW5wdXQpIDwgTWF0aC5hYnMobnVtVmFsdWVzW25lYXJlc3RJbmRleF0gLSBpbnB1dClcbiAgICAgICAgPyBpbmRleFxuICAgICAgICA6IG5lYXJlc3RJbmRleDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRTdWJJbmRleChcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGlucHV0OiBudW1iZXIsXG4gICAgYmluU2l6ZTogbnVtYmVyLFxuICAgIHN1YkJpbkNvdW50OiBudW1iZXIsXG4gICkge1xuICAgIGNvbnN0IHN1YkJpblNpemUgPVxuICAgICAgKGJpblNpemUgLSAoc3ViQmluQ291bnQgLSAxICogU01BTExfUEFERElORykpIC8gc3ViQmluQ291bnQ7XG4gICAgY29uc3QgY2VudGVySW5kZXggPSBzdWJCaW5Db3VudCAvIDIgLSAwLjU7XG4gICAgbGV0IGNsb3Nlc3RJbmRleCA9IDA7XG4gICAgbGV0IGNsb3NlbmVzc1ZhbCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViQmluQ291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gKGkgLSBjZW50ZXJJbmRleCkgKiAoc3ViQmluU2l6ZSArIFNNQUxMX1BBRERJTkcpO1xuICAgICAgY29uc3Qgc3ViQmluUG9zID0gdmFsdWUgKyBvZmZzZXQ7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0IC0gc3ViQmluUG9zKTtcbiAgICAgIGlmIChjbG9zZW5lc3NWYWwgPCAwIHx8IGNsb3NlbmVzc1ZhbCA+IGRpc3RhbmNlKSB7XG4gICAgICAgIGNsb3Nlc3RJbmRleCA9IGk7XG4gICAgICAgIGNsb3NlbmVzc1ZhbCA9IGRpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdEluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZFN1YkluZGV4SG9yaXpvbnRhbChcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGlucHV0OiBudW1iZXIsXG4gICAgc3ViQmluQ291bnQ6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgY2VudGVySW5kZXggPSBzdWJCaW5Db3VudCAvIDIgLSAwLjU7XG4gICAgbGV0IGNsb3Nlc3RJbmRleCA9IDA7XG4gICAgbGV0IGNsb3NlbmVzc1ZhbCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViQmluQ291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgKGkgLSBjZW50ZXJJbmRleCkgKiAoSE9SSVpPTlRBTF9CQVJfSEVJR0hUICsgU01BTExfUEFERElORyk7XG4gICAgICBjb25zdCBzdWJCaW5Qb3MgPSB2YWx1ZSArIG9mZnNldDtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoaW5wdXQgLSBzdWJCaW5Qb3MpO1xuICAgICAgaWYgKGNsb3NlbmVzc1ZhbCA8IDAgfHwgY2xvc2VuZXNzVmFsID4gZGlzdGFuY2UpIHtcbiAgICAgICAgY2xvc2VzdEluZGV4ID0gaTtcbiAgICAgICAgY2xvc2VuZXNzVmFsID0gZGlzdGFuY2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbG9zZXN0SW5kZXg7XG4gIH1cblxuICAvLyBzdGFjayByZXR1cm5zIGEgbmV3IGRhdGEgd2hlcmUgZWFjaCBzZXQgb2YgeVZhbHVlcyBpcyBzdGFja2VkXG4gIC8vIG9uIHRvcCBvZiB0aGUgcHJldmlvdXMuXG4gIGZ1bmN0aW9uIHN0YWNrKGRhdGE6IERhdGEpOiBEYXRhIHtcbiAgICBjb25zdCBzdGFja2VkOiBEYXRhID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHlzOiBkYXRhLnlzLm1hcCh5ID0+ICh7IGxhYmVsOiB5LmxhYmVsLCB2YWx1ZXM6IFtdIH0pKSxcbiAgICB9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgZnJvbSA9IDA7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRhdGEueXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgdG8gPSBmcm9tICsgZGF0YS55c1tqXS52YWx1ZXNbaV07XG4gICAgICAgIHN0YWNrZWQueXNbal0udmFsdWVzLnB1c2godG8pO1xuICAgICAgICBmcm9tID0gdG87XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGFja2VkO1xuICB9XG5cbiAgLy8gaGlkZSBzdHJpcHMgb3V0IGhpZGRlbiB5IHZhbHVlcyB3aGlsZSByZXRhaW5pbmcgdGhlIG9yaWdpbmFsIGluZGljZXNcbiAgLy8gZm9yIHRoZSByZW1haW5pbmcgdmlzaWJsZSB2YWx1ZXNcbiAgZnVuY3Rpb24gaGlkZShkYXRhOiBEYXRhKTogeyBkYXRhOiBEYXRhOyB2aXNpYmxlSW5kaWNlczogbnVtYmVyW10gfSB7XG4gICAgY29uc3QgdmlzaWJsZUluZGljZXMgPSBkYXRhLnlzXG4gICAgICAubWFwKCh5LCBpKSA9PiAoeyB5LCBpIH0pKVxuICAgICAgLmZpbHRlcigoeyB5IH0pID0+ICF5LmhpZGRlbilcbiAgICAgIC5tYXAoKHsgaSB9KSA9PiBpKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogeyAuLi5kYXRhLCB5czogdmlzaWJsZUluZGljZXMubWFwKGkgPT4gZGF0YS55c1tpXSkgfSxcbiAgICAgIHZpc2libGVJbmRpY2VzLFxuICAgIH07XG4gIH1cblxuICB0eXBlIFZhbHVlVHlwZSA9ICdjb3VudCcgfCAnY3VycmVuY3knIHwgJ3BlcmNlbnRhZ2UnIHwgJ2RheXMnO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRQaXBlcyh2YWx1ZVR5cGU6IFZhbHVlVHlwZSkge1xuICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7XG4gICAgICBjYXNlICdjb3VudCc6IHtcbiAgICAgICAgY29uc3QgcGlwZSA9IG5ldyBOdW1iZXJQaXBlKCk7XG4gICAgICAgIHJldHVybiB7IHBpcGUsIGZ1bGxQaXBlOiBwaXBlIH07XG4gICAgICB9XG4gICAgICBjYXNlICdjdXJyZW5jeSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGlwZTogbmV3IFNtYWxsQ3VycmVuY3lQaXBlKCksXG4gICAgICAgICAgZnVsbFBpcGU6IG5ldyBDdXJyZW5jeVBpcGUoJ2VuLXVzJyksXG4gICAgICAgIH07XG4gICAgICBjYXNlICdwZXJjZW50YWdlJzoge1xuICAgICAgICBjb25zdCBwaXBlID0gbmV3IFBlcmNlbnRhZ2VQaXBlKCk7XG4gICAgICAgIHJldHVybiB7IHBpcGUsIGZ1bGxQaXBlOiBwaXBlIH07XG4gICAgICB9XG4gICAgICBjYXNlICdkYXlzJzoge1xuICAgICAgICBjb25zdCBwaXBlID0gbmV3IERheXNQaXBlKCk7XG4gICAgICAgIHJldHVybiB7IHBpcGUsIGZ1bGxQaXBlOiBwaXBlIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNvbnN0IGludGVydmFscyA9IFsneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5J10gYXMgY29uc3Q7XG4gIGV4cG9ydCB0eXBlIEludGVydmFsID0gKHR5cGVvZiBpbnRlcnZhbHMpW251bWJlcl07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdGVkRGF0ZShkYXRlRm9ybWF0OiBJbnRlcnZhbCwgZGF0ZTogRGF0ZSkge1xuICAgIGlmIChkYXRlRm9ybWF0ID09ICdxdWFydGVyJykge1xuICAgICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRVVENNb250aCgpICsgMSkgLyAzKTtcbiAgICAgIGNvbnN0IHllYXIgPSB1dGNGb3JtYXQoZ2V0VGltZUludGVydmFsRm9ybWF0KCd5ZWFyJykpKGRhdGUpO1xuICAgICAgcmV0dXJuIGBRJHtxdWFydGVyfSAke3llYXJ9YDtcbiAgICB9XG4gICAgY29uc3QgZm9ybWF0ID0gZ2V0VGltZUludGVydmFsRm9ybWF0KGRhdGVGb3JtYXQpO1xuICAgIHJldHVybiB1dGNGb3JtYXQoZm9ybWF0KShkYXRlKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lSW50ZXJ2YWxGb3JtYXQoaW50ZXJ2YWw6IEludGVydmFsKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGludGVydmFsKSB7XG4gICAgICBjYXNlICdkYXknOlxuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIHJldHVybiAnJW0vJWQvJVknO1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgIHJldHVybiAnJWIgJVknO1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIHJldHVybiAnJVknO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Q2hhcnREYXRhVG9Eb251dERhdGEoY2hhcnREYXRhOiBEYXRhKTogRG9udXREYXRhW10ge1xuICAgIGlmIChjaGFydERhdGEueXMuZmluZCh5ID0+IHkudmFsdWVzLmxlbmd0aCA+IDEpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBQaWUgY2hhcnRzIGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgdmFsdWVzIHBlciBzZXJpZXNcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9udXREYXRhID0gY2hhcnREYXRhLnlzLm1hcCh5ID0+ICh7XG4gICAgICBsYWJlbDogeS5sYWJlbCxcbiAgICAgIGhpZGRlbjogeS5oaWRkZW4sXG4gICAgICB2YWx1ZTogeS52YWx1ZXMubGVuZ3RoID49IDEgPyB5LnZhbHVlc1swXSA6IDAsXG4gICAgfSkpO1xuICAgIHJldHVybiBkb251dERhdGE7XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja1lTY2FsZVR5cGUoXG4gICAgaW5wdXQ6XG4gICAgICB8IFNjYWxlVGltZTxudW1iZXIsIG51bWJlciwgbmV2ZXI+XG4gICAgICB8IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4sXG4gICAgZGF0YVR5cGU6ICdsYWJlbGVkJyB8ICd0aW1lc2VyaWVzJyB8IHVuZGVmaW5lZCxcbiAgKTogaW5wdXQgaXMgU2NhbGVUaW1lPG51bWJlciwgbnVtYmVyLCBuZXZlcj4ge1xuICAgIGlmIChkYXRhVHlwZSA9PSAnbGFiZWxlZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==
|