@rivet-health/design-system 5.2.2 → 5.4.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.
Files changed (31) hide show
  1. package/esm2020/lib/input/calendar/calendar.component.mjs +1 -1
  2. package/esm2020/lib/input/date-range/date-range.component.mjs +1 -1
  3. package/esm2020/lib/input/input-label/input-label.component.mjs +1 -1
  4. package/esm2020/lib/input/single-select/single-select.component.mjs +20 -44
  5. package/esm2020/lib/interaction/focus-on-init.directive.mjs +43 -0
  6. package/esm2020/lib/modal/help/help.component.mjs +11 -3
  7. package/esm2020/lib/riv.module.mjs +11 -1
  8. package/esm2020/lib/size/content.service.mjs +31 -0
  9. package/esm2020/lib/size/size.directive.mjs +40 -0
  10. package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +63 -39
  11. package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +1 -10
  12. package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +53 -78
  13. package/esm2020/lib/visualization/time-series/time-series.component.mjs +22 -27
  14. package/esm2020/public-api.mjs +3 -1
  15. package/fesm2015/rivet-health-design-system.mjs +268 -183
  16. package/fesm2015/rivet-health-design-system.mjs.map +1 -1
  17. package/fesm2020/rivet-health-design-system.mjs +267 -188
  18. package/fesm2020/rivet-health-design-system.mjs.map +1 -1
  19. package/lib/input/single-select/single-select.component.d.ts +3 -6
  20. package/lib/interaction/focus-on-init.directive.d.ts +13 -0
  21. package/lib/modal/help/help.component.d.ts +6 -1
  22. package/lib/riv.module.d.ts +31 -29
  23. package/lib/size/content.service.d.ts +16 -0
  24. package/lib/size/size.directive.d.ts +20 -0
  25. package/lib/visualization/stacked-column/stacked-column.component.d.ts +11 -6
  26. package/lib/visualization/stacked-column/stacked-column.helpers.d.ts +0 -1
  27. package/lib/visualization/stacked-row/stacked-row.component.d.ts +9 -13
  28. package/lib/visualization/time-series/time-series.component.d.ts +5 -6
  29. package/package.json +1 -1
  30. package/public-api.d.ts +2 -0
  31. package/styles/tokens/typography.css +1 -1
@@ -5,15 +5,15 @@ import { stack } from 'd3-shape';
5
5
  import { utcFormat } from 'd3-time-format';
6
6
  import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
7
7
  import { getIntervalTitle, getMajorInterval, getMajorIntervalFormat, getMinorIntervalFormat, getTimeInterval, intervals, } from '../intervals';
8
- import { getColumnWidth, getDateRange, pointReducer, } from './stacked-column.helpers';
8
+ import { getDateRange, pointReducer } from './stacked-column.helpers';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@angular/common";
11
11
  import * as i2 from "../../modal/callout/callout.component";
12
12
  import * as i3 from "../../modal/callout/callout.directive";
13
13
  import * as i4 from "../../input/single-select/single-select.component";
14
- import * as i5 from "../zero-state/zero-state.component";
15
- import * as i6 from "../../format/pipes/option-group.pipe";
16
- const MAX_COLUMNS = 72;
14
+ import * as i5 from "../../size/size.directive";
15
+ import * as i6 from "../zero-state/zero-state.component";
16
+ import * as i7 from "../../format/pipes/option-group.pipe";
17
17
  const DEFAULT_INTERVAL = 'month';
18
18
  // TODO: once we upgrade to Angular 16, this component can be cleaned up with
19
19
  // signals instead of RxJS.
@@ -21,16 +21,30 @@ export class StackedColumnComponent {
21
21
  constructor() {
22
22
  this.input$ = new BehaviorSubject([]);
23
23
  this.width$ = new BehaviorSubject(960);
24
- this.height$ = new BehaviorSubject(256);
24
+ this.HEIGHT = 300;
25
25
  this.valueFormatter = v => v.toString();
26
26
  this.interval$ = new BehaviorSubject(DEFAULT_INTERVAL);
27
- this.allowedIntervals$ = this.input$.pipe(map(input => {
28
- const numVisibleColumns = input.filter(stack => stack.filter(s => s.style === 'tooltipOnly').length === 0).length;
27
+ this.COLUMN_WIDTHS = [8, 16, 40, 72];
28
+ this.MIN_COLUMN_WIDTH = this.COLUMN_WIDTHS[0];
29
+ this.numInvisibleColumns$ = this.input$.pipe(map(input => input.filter(stack => stack.filter(s => s.style == 'tooltipOnly').length > 0).length));
30
+ this.numVisibleColumns$ = combineLatest([
31
+ this.input$,
32
+ this.numInvisibleColumns$,
33
+ ]).pipe(map(([input, numInvisibleColumns]) => input.length - numInvisibleColumns));
34
+ this.maxColumns$ = this.width$.pipe(map(width => {
35
+ const innerWidth = width - this.LEFT_OFFSET;
36
+ const columnWidthWithPadding = this.MIN_COLUMN_WIDTH + this.COLUMN_PADDING * 2;
37
+ return Math.floor(innerWidth / columnWidthWithPadding);
38
+ }));
39
+ this.allowedIntervals$ = combineLatest([
40
+ this.input$,
41
+ this.maxColumns$,
42
+ this.numVisibleColumns$,
43
+ ]).pipe(map(([input, maxColumns, numVisibleColumns]) => {
29
44
  const [minDate, maxDate] = getDateRange(input);
30
45
  return intervals.filter(interval => {
31
- const timeInterval = getTimeInterval(interval);
32
- const xStepsCount = timeInterval.range(timeInterval.floor(minDate), timeInterval.floor(timeInterval.offset(maxDate, 1))).length;
33
- return numVisibleColumns * xStepsCount <= MAX_COLUMNS;
46
+ const xStepsCount = this.getXStepsInRange(interval, minDate, maxDate);
47
+ return numVisibleColumns * xStepsCount <= maxColumns;
34
48
  });
35
49
  }), shareReplay({ refCount: true, bufferSize: 1 }));
36
50
  this.intervalOptions$ = this.allowedIntervals$.pipe(map(intervals => intervals.map((interval) => ({
@@ -55,6 +69,26 @@ export class StackedColumnComponent {
55
69
  return options.find(o => o.id === interval) ?? null;
56
70
  }), shareReplay({ refCount: true, bufferSize: 1 }));
57
71
  this.selectedInterval$ = this.selectedIntervalOption$.pipe(map(option => (option ? option.id : DEFAULT_INTERVAL)));
72
+ this.columnWidth$ = combineLatest([
73
+ this.input$,
74
+ this.selectedInterval$,
75
+ this.numVisibleColumns$,
76
+ this.width$,
77
+ ]).pipe(map(([input, selectedInterval, numVisibleColumns, width]) => {
78
+ const [minDate, maxDate] = getDateRange(input);
79
+ const xStepCount = this.getXStepsInRange(selectedInterval, minDate, maxDate);
80
+ const innerWidth = width - this.LEFT_OFFSET;
81
+ const allowedColumnWidths = this.COLUMN_WIDTHS.filter(columnWidth => {
82
+ const columnWidthWithPadding = columnWidth + this.COLUMN_PADDING * 2;
83
+ return (innerWidth -
84
+ numVisibleColumns * xStepCount * columnWidthWithPadding >=
85
+ 0);
86
+ });
87
+ const columnWidth = allowedColumnWidths.at(-1);
88
+ if (!columnWidth)
89
+ return 0;
90
+ return columnWidth;
91
+ }));
58
92
  this.binnedData$ = combineLatest([
59
93
  this.input$,
60
94
  this.selectedInterval$,
@@ -79,16 +113,16 @@ export class StackedColumnComponent {
79
113
  });
80
114
  })), shareReplay({ refCount: true, bufferSize: 1 }));
81
115
  this.LEFT_OFFSET = 48;
116
+ this.COLUMN_PADDING = 4;
82
117
  this.drawData$ = combineLatest([
83
118
  this.binnedData$,
84
119
  this.width$,
85
- this.height$,
86
120
  this.selectedInterval$,
87
- ]).pipe(map(([binnedData, width, height, interval]) => {
88
- const viewBox = `0 0 ${width} ${height}`;
121
+ this.numInvisibleColumns$,
122
+ this.columnWidth$,
123
+ ]).pipe(map(([binnedData, width, interval, numInvisibleColumns, columnWidth]) => {
124
+ const viewBox = `0 0 ${width} ${this.HEIGHT}`;
89
125
  const padding = 16;
90
- const invisColumns = binnedData.filter(stack => stack.filter(s => s.style == 'tooltipOnly').length > 0).length;
91
- const visibleColumns = binnedData.length - invisColumns;
92
126
  const [minDate, maxDate] = getDateRange(binnedData);
93
127
  const hasMultipleYears = minDate.getFullYear() < maxDate.getFullYear();
94
128
  const xMinorIntervalFormat = getMinorIntervalFormat(interval);
@@ -102,11 +136,9 @@ export class StackedColumnComponent {
102
136
  const xOuterScale = scaleBand()
103
137
  .domain(xSteps.map(date => fullFormatter(date)))
104
138
  .range([this.LEFT_OFFSET, width]);
105
- const columnWidth = getColumnWidth(xSteps.length * visibleColumns);
106
- const columnPadding = 4;
107
139
  const outerPadding = (xOuterScale.bandwidth() -
108
- (columnPadding * (binnedData.length - 1 - invisColumns) +
109
- columnWidth * (binnedData.length - invisColumns))) /
140
+ (this.COLUMN_PADDING * (binnedData.length - 1 - numInvisibleColumns) +
141
+ columnWidth * (binnedData.length - numInvisibleColumns))) /
110
142
  2;
111
143
  const renderInformation = binnedData.map(stackData => {
112
144
  /*
@@ -184,7 +216,7 @@ export class StackedColumnComponent {
184
216
  domainMax = 1;
185
217
  const yScale = scaleLinear()
186
218
  .domain([0, domainMax])
187
- .range([height - padding * 2, padding]);
219
+ .range([this.HEIGHT - padding * 2, padding]);
188
220
  const rects = [];
189
221
  let invisColumnsSoFar = 0;
190
222
  // For each unique stack,
@@ -204,7 +236,7 @@ export class StackedColumnComponent {
204
236
  const x = (xOuterScale(fullFormatter(date)) ?? 0) +
205
237
  outerPadding +
206
238
  columnWidth * (index - invisColumnsSoFar) +
207
- columnPadding * (index - invisColumnsSoFar);
239
+ this.COLUMN_PADDING * (index - invisColumnsSoFar);
208
240
  const y = yScale(baseline) - height;
209
241
  let fill = '';
210
242
  if (seriesPoint.series.style != 'tooltipOnly') {
@@ -242,8 +274,9 @@ export class StackedColumnComponent {
242
274
  .filter((tick, i, ticks) => i === 0 || tick.label !== ticks[i - 1].label)
243
275
  : [];
244
276
  const yTicks = yScale.ticks(5);
245
- const hoverBandWidth = (renderInformation.length - invisColumns) * columnWidth +
246
- (renderInformation.length + 1 - invisColumns) * columnPadding;
277
+ const hoverBandWidth = (renderInformation.length - numInvisibleColumns) * columnWidth +
278
+ (renderInformation.length + 1 - numInvisibleColumns) *
279
+ this.COLUMN_PADDING;
247
280
  const hoverBands = xSteps.map(date => ({
248
281
  dateValue: date.valueOf(),
249
282
  x: (xOuterScale(fullFormatter(date)) ?? 0) +
@@ -290,36 +323,27 @@ export class StackedColumnComponent {
290
323
  set width(v) {
291
324
  this.width$.next(v);
292
325
  }
293
- get width() {
294
- return this.width$.getValue();
295
- }
296
- set height(v) {
297
- this.height$.next(v);
298
- }
299
- get height() {
300
- return this.height$.getValue();
301
- }
302
326
  set interval(v) {
303
327
  this.interval$.next(v);
304
328
  }
305
329
  get interval() {
306
330
  return this.interval$.getValue();
307
331
  }
332
+ getXStepsInRange(interval, minDate, maxDate) {
333
+ const timeInterval = getTimeInterval(interval);
334
+ return timeInterval.range(timeInterval.floor(minDate), timeInterval.floor(timeInterval.offset(maxDate, 1))).length;
335
+ }
308
336
  setIntervalOption(option) {
309
337
  this.interval = option.id;
310
338
  }
311
339
  }
312
340
  StackedColumnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
313
- StackedColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter", interval: "interval" }, viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-single-select\n [groups]=\"intervalOptions$ | async | rivOptionGroup\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-single-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.SingleSelectComponent, selector: "riv-single-select", inputs: ["groups", "selectedOption", "filterabilityOptions", "loading", "locked", "noOptionsMessage", "nodeTemplate", "triggerTemplate", "placeholder", "disabled"], outputs: ["filterQueryChange", "selectedOptionChange"] }, { kind: "component", type: i5.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
341
+ StackedColumnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedColumnComponent, selector: "riv-stacked-column", inputs: { input: "input", valueFormatter: "valueFormatter", interval: "interval" }, viewQueries: [{ propertyName: "controls", first: true, predicate: ["controls"], descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"!(empty$ | async); else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-single-select\n [groups]=\"intervalOptions$ | async | rivOptionGroup\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-single-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.SingleSelectComponent, selector: "riv-single-select", inputs: ["groups", "selectedOption", "filterabilityOptions", "loading", "locked", "maxCalloutHeight", "noOptionsMessage", "nodeTemplate", "triggerTemplate", "placeholder", "disabled"], outputs: ["filterQueryChange", "selectedOptionChange"] }, { kind: "directive", type: i5.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i6.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.OptionGroupPipe, name: "rivOptionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
314
342
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedColumnComponent, decorators: [{
315
343
  type: Component,
316
- args: [{ selector: 'riv-stacked-column', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-single-select\n [groups]=\"intervalOptions$ | async | rivOptionGroup\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-single-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
344
+ args: [{ selector: 'riv-stacked-column', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"!(empty$ | async); else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"d.columnWidth\"\n [attr.height]=\"d.columnWidth\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n [attr.y1]=\"d.columnWidth\"\n [attr.x2]=\"d.columnWidth\"\n y2=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let tick of d.xMinorTicks\">\n <rect\n class=\"tick-background\"\n [class.focused]=\"(hoveredBand$ | async)?.dateValue === tick.dateValue\"\n [attr.x]=\"tick.x - 20\"\n [attr.y]=\"d.yScale(0) + 3\"\n width=\"40\"\n height=\"12\"\n rx=\"2\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 12\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.xMajorTicks\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.yScale(0) + 24\"\n text-anchor=\"middle\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"tick-label\" x=\"0\" [attr.y]=\"d.yScale(tick)\" dy=\"-4\">\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of d.rects\">\n <rect\n class=\"column\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.dateValue !== rect.dateValue\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <rect\n *ngFor=\"let rect of d.hoverBands\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n (mouseenter)=\"\n hoveredBand$.next({ dateValue: rect.dateValue, event: $event })\n \"\n (mouseleave)=\"hoveredBand$.next(null)\"\n ></rect>\n </svg>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n\n<ng-template #controls>\n <riv-single-select\n [groups]=\"intervalOptions$ | async | rivOptionGroup\"\n [selectedOption]=\"selectedIntervalOption$ | async\"\n (selectedOptionChange)=\"setIntervalOption($event)\"\n ></riv-single-select>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.tick-background{transition:fill var(--short-transition);fill:transparent}.tick-background.focused{fill:var(--baloo-10)}.column{transition:opacity var(--short-transition)}.column.blurred{opacity:.4}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
317
345
  }], propDecorators: { input: [{
318
346
  type: Input
319
- }], width: [{
320
- type: Input
321
- }], height: [{
322
- type: Input
323
347
  }], valueFormatter: [{
324
348
  type: Input
325
349
  }], interval: [{
@@ -328,4 +352,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
328
352
  type: ViewChild,
329
353
  args: ['controls']
330
354
  }] } });
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsU0FBUyxHQUNWLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFlBQVksR0FDYixNQUFNLDBCQUEwQixDQUFDOzs7Ozs7OztBQUVsQyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxnQkFBZ0IsR0FBYSxPQUFPLENBQUM7QUFFM0MsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQU8zQixNQUFNLE9BQU8sc0JB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LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGluZGV4IH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IHsgc2NhbGVCYW5kLCBzY2FsZUxpbmVhciB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IHN0YWNrIH0gZnJvbSAnZDMtc2hhcGUnO1xuaW1wb3J0IHsgdXRjRm9ybWF0IH0gZnJvbSAnZDMtdGltZS1mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNpbmdsZVNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2lucHV0L3NpbmdsZS1zZWxlY3Qvc2luZ2xlLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgSW50ZXJ2YWwsXG4gIGdldEludGVydmFsVGl0bGUsXG4gIGdldE1ham9ySW50ZXJ2YWwsXG4gIGdldE1ham9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldE1pbm9ySW50ZXJ2YWxGb3JtYXQsXG4gIGdldFRpbWVJbnRlcnZhbCxcbiAgaW50ZXJ2YWxzLFxufSBmcm9tICcuLi9pbnRlcnZhbHMnO1xuaW1wb3J0IHtcbiAgZ2V0Q29sdW1uV2lkdGgsXG4gIGdldERhdGVSYW5nZSxcbiAgcG9pbnRSZWR1Y2VyLFxufSBmcm9tICcuL3N0YWNrZWQtY29sdW1uLmhlbHBlcnMnO1xuXG5jb25zdCBNQVhfQ09MVU1OUyA9IDcyO1xuY29uc3QgREVGQVVMVF9JTlRFUlZBTDogSW50ZXJ2YWwgPSAnbW9udGgnO1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1jb2x1bW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1jb2x1bW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkQ29sdW1uQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXT4oXG4gICAgW10sXG4gICk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW5wdXQodjogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFja1tdKSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0KCk6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPig5NjApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLndpZHRoJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDI1Nik7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaGVpZ2h0KHY6IG51bWJlcikge1xuICAgIHRoaXMuaGVpZ2h0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGludGVydmFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SW50ZXJ2YWw+KERFRkFVTFRfSU5URVJWQUwpO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGludGVydmFsKHY6IEludGVydmFsKSB7XG4gICAgdGhpcy5pbnRlcnZhbCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLmludGVydmFsJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnY29udHJvbHMnKVxuICBwdWJsaWMgcmVhZG9ubHkgY29udHJvbHM/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZEludGVydmFscyQ6IE9ic2VydmFibGU8SW50ZXJ2YWxbXT4gPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PiB7XG4gICAgICBjb25zdCBudW1WaXNpYmxlQ29sdW1ucyA9IGlucHV0LmZpbHRlcihcbiAgICAgICAgc3RhY2sgPT4gc3RhY2suZmlsdGVyKHMgPT4gcy5zdHlsZSA9PT0gJ3Rvb2x0aXBPbmx5JykubGVuZ3RoID09PSAwLFxuICAgICAgKS5sZW5ndGg7XG5cbiAgICAgIGNvbnN0IFttaW5EYXRlLCBtYXhEYXRlXSA9IGdldERhdGVSYW5nZShpbnB1dCk7XG5cbiAgICAgIHJldHVybiBpbnRlcnZhbHMuZmlsdGVyKGludGVydmFsID0+IHtcbiAgICAgICAgY29uc3QgdGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgY29uc3QgeFN0ZXBzQ291bnQgPSB0aW1lSW50ZXJ2YWwucmFuZ2UoXG4gICAgICAgICAgdGltZUludGVydmFsLmZsb29yKG1pbkRhdGUpLFxuICAgICAgICAgIHRpbWVJbnRlcnZhbC5mbG9vcih0aW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBudW1WaXNpYmxlQ29sdW1ucyAqIHhTdGVwc0NvdW50IDw9IE1BWF9DT0xVTU5TO1xuICAgICAgfSk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBpbnRlcnZhbE9wdGlvbnMkID0gdGhpcy5hbGxvd2VkSW50ZXJ2YWxzJC5waXBlKFxuICAgIG1hcChpbnRlcnZhbHMgPT5cbiAgICAgIGludGVydmFscy5tYXAoXG4gICAgICAgIChpbnRlcnZhbCk6IFNpbmdsZVNlbGVjdENvbXBvbmVudC5PcHRpb24gPT4gKHtcbiAgICAgICAgICBpZDogaW50ZXJ2YWwsXG4gICAgICAgICAgdGl0bGU6IGdldEludGVydmFsVGl0bGUoaW50ZXJ2YWwpLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkSW50ZXJ2YWxPcHRpb24kID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnRlcnZhbCQsXG4gICAgdGhpcy5pbnRlcnZhbE9wdGlvbnMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2ludGVydmFsLCBvcHRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgYWxsb3dlZEludGVydmFscyA9IG9wdGlvbnMubWFwKCh7IGlkIH0pID0+IGlkIGFzIEludGVydmFsKTtcbiAgICAgIGlmICghYWxsb3dlZEludGVydmFscy5pbmNsdWRlcyhpbnRlcnZhbCkpIHtcbiAgICAgICAgY29uc3QgZmlyc3RBbGxvd2VkID0gYWxsb3dlZEludGVydmFscy5hdCgwKTtcbiAgICAgICAgY29uc3QgbGFzdEFsbG93ZWQgPSBhbGxvd2VkSW50ZXJ2YWxzLmF0KC0xKTtcbiAgICAgICAgaWYgKCFmaXJzdEFsbG93ZWQgfHwgIWxhc3RBbGxvd2VkKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoaW50ZXJ2YWxzLmluZGV4T2YoaW50ZXJ2YWwpIDwgaW50ZXJ2YWxzLmluZGV4T2YoZmlyc3RBbGxvd2VkKSlcbiAgICAgICAgICBpbnRlcnZhbCA9IGZpcnN0QWxsb3dlZDtcbiAgICAgICAgaWYgKGludGVydmFscy5pbmRleE9mKGludGVydmFsKSA+IGludGVydmFscy5pbmRleE9mKGxhc3RBbGxvd2VkKSlcbiAgICAgICAgICBpbnRlcnZhbCA9IGxhc3RBbGxvd2VkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnMuZmluZChvID0+IG8uaWQgPT09IGludGVydmFsKSA/PyBudWxsO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRJbnRlcnZhbCQgPSB0aGlzLnNlbGVjdGVkSW50ZXJ2YWxPcHRpb24kLnBpcGUoXG4gICAgbWFwKG9wdGlvbiA9PiAob3B0aW9uID8gKG9wdGlvbi5pZCBhcyBJbnRlcnZhbCkgOiBERUZBVUxUX0lOVEVSVkFMKSksXG4gICk7XG5cbiAgc2V0SW50ZXJ2YWxPcHRpb24ob3B0aW9uOiBTaW5nbGVTZWxlY3RDb21wb25lbnQuT3B0aW9uKSB7XG4gICAgdGhpcy5pbnRlcnZhbCA9IG9wdGlvbi5pZCBhcyBJbnRlcnZhbDtcbiAgfVxuXG4gIHJlYWRvbmx5IGJpbm5lZERhdGEkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5zZWxlY3RlZEludGVydmFsJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgaW50ZXJ2YWxdKSA9PlxuICAgICAgaW5wdXQubWFwKChzdGFjayk6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2sgPT4ge1xuICAgICAgICBjb25zdCB0aW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWwpO1xuXG4gICAgICAgIHJldHVybiBzdGFjay5tYXAoc2VyaWVzID0+IHtcbiAgICAgICAgICBjb25zdCBiaW5uZWQgPSBuZXcgTWFwPG51bWJlciwgU3RhY2tlZENvbHVtbkNvbXBvbmVudC5WYWx1ZVtdPigpO1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHRpbWVJbnRlcnZhbC5mbG9vcihwb2ludC5kYXRlKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICBpZiAoIWJpbm5lZC5oYXMoYmluKSkge1xuICAgICAgICAgICAgICBiaW5uZWQuc2V0KGJpbiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmlubmVkLmdldChiaW4pIS5wdXNoKHBvaW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNlcmllcyxcbiAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGVWYWx1ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBwb2ludFJlZHVjZXIocG9pbnRzKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBMRUZUX09GRlNFVCA9IDQ4O1xuXG4gIHJlYWRvbmx5IGRyYXdEYXRhJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuYmlubmVkRGF0YSQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5oZWlnaHQkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbYmlubmVkRGF0YSwgd2lkdGgsIGhlaWdodCwgaW50ZXJ2YWxdKSA9PiB7XG4gICAgICBjb25zdCB2aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke2hlaWdodH1gO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDE2O1xuXG4gICAgICBjb25zdCBpbnZpc0NvbHVtbnMgPSBiaW5uZWREYXRhLmZpbHRlcihcbiAgICAgICAgc3RhY2sgPT4gc3RhY2suZmlsdGVyKHMgPT4gcy5zdHlsZSA9PSAndG9vbHRpcE9ubHknKS5sZW5ndGggPiAwLFxuICAgICAgKS5sZW5ndGg7XG4gICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGJpbm5lZERhdGEubGVuZ3RoIC0gaW52aXNDb2x1bW5zO1xuXG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoYmlubmVkRGF0YSk7XG4gICAgICBjb25zdCBoYXNNdWx0aXBsZVllYXJzID0gbWluRGF0ZS5nZXRGdWxsWWVhcigpIDwgbWF4RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgeE1pbm9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNaW5vckludGVydmFsRm9ybWF0KGludGVydmFsKTtcbiAgICAgIGNvbnN0IG1pbm9yRm9ybWF0dGVyID0gdXRjRm9ybWF0KHhNaW5vckludGVydmFsRm9ybWF0KTtcbiAgICAgIGNvbnN0IG1pbm9yVGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhTdGVwcyA9IG1pbm9yVGltZUludGVydmFsLnJhbmdlKFxuICAgICAgICBtaW5vclRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgbWlub3JUaW1lSW50ZXJ2YWwuZmxvb3IobWlub3JUaW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICAgICk7XG4gICAgICBjb25zdCB4TWFqb3JJbnRlcnZhbCA9IGdldE1ham9ySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNYWpvckludGVydmFsRm9ybWF0KFxuICAgICAgICB4TWFqb3JJbnRlcnZhbCxcbiAgICAgICAgaGFzTXVsdGlwbGVZZWFycyxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYWpvckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWFqb3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBmdWxsRm9ybWF0dGVyID0gdXRjRm9ybWF0KFxuICAgICAgICBgJHt4TWlub3JJbnRlcnZhbEZvcm1hdH0gJHt4TWFqb3JJbnRlcnZhbEZvcm1hdH1gLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgeE91dGVyU2NhbGUgPSBzY2FsZUJhbmQoKVxuICAgICAgICAuZG9tYWluKHhTdGVwcy5tYXAoZGF0ZSA9PiBmdWxsRm9ybWF0dGVyKGRhdGUpKSlcbiAgICAgICAgLnJhbmdlKFt0aGlzLkxFRlRfT0ZGU0VULCB3aWR0aF0pO1xuXG4gICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGdldENvbHVtbldpZHRoKHhTdGVwcy5sZW5ndGggKiB2aXNpYmxlQ29sdW1ucyk7XG4gICAgICBjb25zdCBjb2x1bW5QYWRkaW5nID0gNDtcbiAgICAgIGNvbnN0IG91dGVyUGFkZGluZyA9XG4gICAgICAgICh4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAtXG4gICAgICAgICAgKGNvbHVtblBhZGRpbmcgKiAoYmlubmVkRGF0YS5sZW5ndGggLSAxIC0gaW52aXNDb2x1bW5zKSArXG4gICAgICAgICAgICBjb2x1bW5XaWR0aCAqIChiaW5uZWREYXRhLmxlbmd0aCAtIGludmlzQ29sdW1ucykpKSAvXG4gICAgICAgIDI7XG5cbiAgICAgIHR5cGUgU2VyaWVzUG9pbnQgPSBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlICYge1xuICAgICAgICBzZXJpZXM6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU2VyaWVzO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVuZGVySW5mb3JtYXRpb24gPSBiaW5uZWREYXRhLm1hcChzdGFja0RhdGEgPT4ge1xuICAgICAgICAvKlxuICAgICAgICAgIENyZWF0ZSBhbiBhcnJheSB3aXRoIGV2ZXJ5IGRhdGEgcG9pbnQgKyB0aGVpciBhc3NvY2lhdGVkIHNlcmllcy5cbiAgICAgICAgICBpLmUuIE1ha2UgYW4gYmFja2xpbmsgZm9yIGVhY2ggZWxlbWVudCB0byBpdHMgc2VyaWVzLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBzdGFja2VkVGFibGUgPSBzdGFja0RhdGEucmVkdWNlPFNlcmllc1BvaW50W10+KFxuICAgICAgICAgICh0YWJsZSwgcykgPT4gW1xuICAgICAgICAgICAgLi4udGFibGUsXG4gICAgICAgICAgICAuLi5zLmRhdGEubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgICAgIC4uLnBvaW50LFxuICAgICAgICAgICAgICBzZXJpZXM6IHMsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcblxuICAgICAgICAvKlxuICAgICAgICAgIE1hcHMgZWFjaCBvZiB0aGUgU2VyaWVzUG9pbnRzIGJhc2VkIG9uIGxhYmVsLlxuICAgICAgICAgIFRoZW4gbWFwIGVhY2ggb2YgdGhvc2UgbWFwcyB0byBhIGRhdGUuXG5cbiAgICAgICAgICBFeGFtcGxlOlxuICAgICAgICAgICAgSWYgd2Ugd2VyZSBpbmRleGluZyB0aGUgZm9sbG93aW5nIGRhdGE6XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIENvbXBsZXRlIC0+IDUgaW4gSmFudWFyeSwgNyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBJbmNvbXBsZXRlIC0+IDMgaW4gSmFudWFyeSwgMyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgV2Ugd291bGQgZ2V0IGFuIGluZGV4ZWQgdGFibGUgbGlrZSB0aGUgZm9sbG93aW5nLCAobm90ZSB0aGlzIGlzIHBzZXVkb2NvZGUpOlxuICAgICAgICAgICAgICAnSmFudWFyeSc6IHsgJ0VzdGltYXRlcyBDb21wbGV0ZSc6IDUsICdFc3RpbWF0ZXMgSW5jb21wbGV0ZSc6IDMgfVxuICAgICAgICAgICAgICAnRmVicnVhcnknOiB7ICdFc3RpbWF0ZXMgQ29tcGxldGUnOiA3LCAnRXN0aW1hdGVzIEluY29tcGxldGUnOiAzIH1cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW5kZXhlZFRhYmxlOiBNYXA8RGF0ZSwgTWFwPHN0cmluZywgU2VyaWVzUG9pbnQ+PiA9IGluZGV4KFxuICAgICAgICAgIHN0YWNrZWRUYWJsZSxcbiAgICAgICAgICBkID0+IGQuZGF0ZSxcbiAgICAgICAgICBkID0+IGQuc2VyaWVzLmxhYmVsLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgVGhlIG91dHB1dCBvZiBcInN0YWNrKClcIiBpcyBhbiBhcnJheSBvZiBhcnJheXMgb2YgdHVwbGVzLlxuICAgICAgICAgICAgVGhlIHR1cGxlcyB1bm5lc3QgYXMgW2Jhc2VsaW5lLCB0b3BsaW5lXS5cbiAgICAgICAgICAgIEVhY2ggXCJrZXlcIiBpbnZvbHZlZCBpbiB0aGUgc3RhY2sgaGFzIGFuIGFycmF5IG9mIHR1cGxlcyByZWxhdGluZyB0byBpdC5cbiAgICAgICAgICAgICAgaS5lLiBbIERhdGUgMSBUdXBsZSwgRGF0ZSAyIFR1cGxlIF1cbiAgICAgICAgICAgIEFsbCBcImtleVwiIGFycmF5cyBhcmUgY29udGFpbmVkIGluIHRoZSBvdXRlciBhcnJheS5cbiAgICAgICAgICAgICAgaS5lLiBbIEtleSAxIFR1cGxlcywgS2V5IDIgVHVwbGVzXVxuXG4gICAgICAgICAgV2Ugc2VsZWN0IHRoZSBrZXlzIHVzaW5nIFwiLmtleXMoKVwiLlxuICAgICAgICAgICAgRm9yIG91ciBwdXJwb3NlcywgdGhlIGtleXMgYXJlIHRoZSBsZWdlbmQgZWxlbWVudHMuXG4gICAgICAgICAgICBpLmUuIElmIHlvdSBoYXZlIHR3byBibG9ja3Mgb2YgdGhlIHNhbWUgY29sb3IsIHRoZXkgaGF2ZSB0aGUgc2FtZSBrZXkuXG5cbiAgICAgICAgICBXZSBzZWxlY3QgdGhlIGhlaWdodHMgb2YgdGhlIGJsb2NrcyB1c2luZyBcIi52YWx1ZSgpXCIuXG5cbiAgICAgICAgICBXZSBhcmUgZ29pbmcgdG8gc3RhY2sgdGhlIGJsb2NrcyBvbiB0b3Agb2YgZWFjaCBvdGhlci5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgZmlyc3Qga2V5IHR1cGxlcyBhcmUgMC5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgc2Vjb25kIGtleSB0dXBsZXMgYXJlIHRoZSB0b3BsaW5lIG9mIHRoZSBhc3NvY2lhdGVkIGZpcnN0IGtleSB0dXBsZS5cblxuICAgICAgICAgIEV4YW1wbGU6XG4gICAgICAgICAgICBJZiB3ZSB3ZXJlIHN0YWNraW5nIHRoZSBmb2xsb3dpbmcgZGF0YTpcbiAgICAgICAgICAgICAgKiBFc3RpbWF0ZXMgQ29tcGxldGUgLT4gNSBpbiBKYW51YXJ5LCA3IGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIEluY29tcGxldGUgLT4gMyBpbiBKYW51YXJ5LCAzIGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICBXZSB3b3VsZCBnZXQgYSBzdGFjayBvZjpcbiAgICAgICAgICAgICAgWyAgWyBbMCw1XSxbMCw3XSBdLCBbIFs1LDhdLFs3LDEwXSBdICBdXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHN0YWNrZWQgPSBzdGFjazxcbiAgICAgICAgICB0eXBlb2YgaW5kZXhlZFRhYmxlIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFY+ID8gW0ssIFZdIDogbmV2ZXJcbiAgICAgICAgPigpXG4gICAgICAgICAgLmtleXMoc3RhY2tEYXRhLm1hcCh2ID0+IHYubGFiZWwpKVxuICAgICAgICAgIC52YWx1ZSgoW18sIGdyb3VwXSwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAuZ2V0KGtleSkhLnZhbHVlO1xuICAgICAgICAgIH0pKGluZGV4ZWRUYWJsZSk7XG5cbiAgICAgICAgcmV0dXJuIHsgaW5kZXhlZFRhYmxlLCBzdGFja2VkIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIGRvbWFpbiBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGhpZ2hlc3QgdmFsdWUgaW4gYW55IHN0YWNrLCBvbiBhbnkgZGF0ZS5cbiAgICAgIGxldCBkb21haW5NYXggPSAwO1xuICAgICAgLy8gRm9yIGVhY2ggdW5pcXVlIHN0YWNrLFxuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSkgPT4ge1xuICAgICAgICAvLyBGb3IgZWFjaCBkYXRlLFxuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLnZhbHVlcygpXS5mb3JFYWNoKChwb2ludE1hcCwgaSkgPT4ge1xuICAgICAgICAgIC8vIEZvciBlYWNoIHNlcmllcyxcbiAgICAgICAgICBbLi4ucG9pbnRNYXAudmFsdWVzKCldLmZvckVhY2goKF8sIGopID0+IHtcbiAgICAgICAgICAgIGlmIChfLnNlcmllcy5zdHlsZSA9PSAndG9vbHRpcE9ubHknKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbWFpbk1heCA9IE1hdGgubWF4KGRvbWFpbk1heCwgLi4uc3RhY2tlZFtqXVtpXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoZG9tYWluTWF4ID09PSAwKSBkb21haW5NYXggPSAxO1xuICAgICAgY29uc3QgeVNjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgICAuZG9tYWluKFswLCBkb21haW5NYXhdKVxuICAgICAgICAucmFuZ2UoW2hlaWdodCAtIHBhZGRpbmcgKiAyLCBwYWRkaW5nXSk7XG5cbiAgICAgIGNvbnN0IHJlY3RzOiB7XG4gICAgICAgIGRhdGVWYWx1ZTogbnVtYmVyO1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgICAgIGZpbGw6IHN0cmluZztcbiAgICAgICAgc3RyaXBlZDogYm9vbGVhbjtcbiAgICAgICAgc2VyaWVzUG9pbnQ6IFNlcmllc1BvaW50O1xuICAgICAgfVtdID0gW107XG4gICAgICBsZXQgaW52aXNDb2x1bW5zU29GYXIgPSAwO1xuICAgICAgLy8gRm9yIGVhY2ggdW5pcXVlIHN0YWNrLFxuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IGludmlzQ29sdW1uRm91bmQgPSBmYWxzZTtcbiAgICAgICAgLy8gRm9yIGVhY2ggZGF0ZSxcbiAgICAgICAgWy4uLmluZGV4ZWRUYWJsZS5lbnRyaWVzKCldLmZvckVhY2goKFtkYXRlLCBwb2ludE1hcF0sIGkpID0+IHtcbiAgICAgICAgICAvLyBGb3IgZWFjaCBzZXJpZXMsXG4gICAgICAgICAgWy4uLnBvaW50TWFwLmVudHJpZXMoKV0uZm9yRWFjaCgoW18sIHNlcmllc1BvaW50XSwgaikgPT4ge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBib3ggd2UgYXJlIGFib3V0IHRvIGRyYXcuXG4gICAgICAgICAgICBjb25zdCBbYmFzZWxpbmUsIHRvcGxpbmVdID0gc3RhY2tlZFtqXVtpXTtcblxuICAgICAgICAgICAgaWYgKHNlcmllc1BvaW50LnNlcmllcy5zdHlsZSA9PSAndG9vbHRpcE9ubHknKSB7XG4gICAgICAgICAgICAgIGludmlzQ29sdW1uRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPVxuICAgICAgICAgICAgICBzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgPT0gJ3Rvb2x0aXBPbmx5JyA/IDAgOiBjb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHlTY2FsZShiYXNlbGluZSkgLSB5U2NhbGUodG9wbGluZSk7XG4gICAgICAgICAgICBjb25zdCB4ID1cbiAgICAgICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAgICAgb3V0ZXJQYWRkaW5nICtcbiAgICAgICAgICAgICAgY29sdW1uV2lkdGggKiAoaW5kZXggLSBpbnZpc0NvbHVtbnNTb0ZhcikgK1xuICAgICAgICAgICAgICBjb2x1bW5QYWRkaW5nICogKGluZGV4IC0gaW52aXNDb2x1bW5zU29GYXIpO1xuICAgICAgICAgICAgY29uc3QgeSA9IHlTY2FsZShiYXNlbGluZSkgLSBoZWlnaHQ7XG4gICAgICAgICAgICBsZXQgZmlsbCA9ICcnO1xuICAgICAgICAgICAgaWYgKHNlcmllc1BvaW50LnNlcmllcy5zdHlsZSAhPSAndG9vbHRpcE9ubHknKSB7XG4gICAgICAgICAgICAgIGZpbGwgPSBgdmFyKCR7c2VyaWVzUG9pbnQuc2VyaWVzLmNvbG9yVG9rZW59KWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY3RzLnB1c2goe1xuICAgICAgICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICBmaWxsLFxuICAgICAgICAgICAgICBzdHJpcGVkOiBzZXJpZXNQb2ludC5zZXJpZXMuc3R5bGUgPT09ICdzdHJpcGVkJyxcbiAgICAgICAgICAgICAgc2VyaWVzUG9pbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbnZpc0NvbHVtbkZvdW5kKSB7XG4gICAgICAgICAgaW52aXNDb2x1bW5zU29GYXIrKztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHhNaW5vclRpY2tzID0geFN0ZXBzLm1hcChkYXRlID0+ICh7XG4gICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgIGxhYmVsOiBtaW5vckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgeDpcbiAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgKyB4T3V0ZXJTY2FsZS5iYW5kd2lkdGgoKSAvIDIsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCB4TWFqb3JUaWNrcyA9XG4gICAgICAgIGludGVydmFsICE9PSAneWVhcidcbiAgICAgICAgICA/IHhTdGVwc1xuICAgICAgICAgICAgICAubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgICAgICAgICBkYXRlVmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBtYWpvckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgICAgICAgICB4OlxuICAgICAgICAgICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAgICAgICAgIHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC8gMixcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHRpY2ssIGksIHRpY2tzKSA9PlxuICAgICAgICAgICAgICAgICAgaSA9PT0gMCB8fCB0aWNrLmxhYmVsICE9PSB0aWNrc1tpIC0gMV0ubGFiZWwsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3MoNSk7XG5cbiAgICAgIGNvbnN0IGhvdmVyQmFuZFdpZHRoID1cbiAgICAgICAgKHJlbmRlckluZm9ybWF0aW9uLmxlbmd0aCAtIGludmlzQ29sdW1ucykgKiBjb2x1bW5XaWR0aCArXG4gICAgICAgIChyZW5kZXJJbmZvcm1hdGlvbi5sZW5ndGggKyAxIC0gaW52aXNDb2x1bW5zKSAqIGNvbHVtblBhZGRpbmc7XG4gICAgICBjb25zdCBob3ZlckJhbmRzID0geFN0ZXBzLm1hcChkYXRlID0+ICh7XG4gICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgIHg6XG4gICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLSBob3ZlckJhbmRXaWR0aCkgLyAyLFxuICAgICAgICB5OiB5U2NhbGUoZG9tYWluTWF4KSxcbiAgICAgICAgd2lkdGg6IGhvdmVyQmFuZFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IHlTY2FsZSgwKSAtIHlTY2FsZShkb21haW5NYXgpLFxuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5XaWR0aCxcbiAgICAgICAgaG92ZXJCYW5kcyxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIHZpZXdCb3gsXG4gICAgICAgIHhNaW5vclRpY2tzLFxuICAgICAgICB4TWFqb3JUaWNrcyxcbiAgICAgICAgeVNjYWxlLFxuICAgICAgICB5VGlja3MsXG4gICAgICB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgZW1wdHkkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT5cbiAgICAgIGlucHV0LmV2ZXJ5KHN0YWNrID0+IHN0YWNrLmV2ZXJ5KHNlcmllcyA9PiBzZXJpZXMuZGF0YS5sZW5ndGggPT09IDApKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaG92ZXJlZEJhbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgZGF0ZVZhbHVlOiBudW1iZXI7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBjYWxsb3V0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaG92ZXJlZEJhbmQkLCB0aGlzLmRyYXdEYXRhJF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZEJhbmQsIGRyYXdEYXRhXSkgPT4ge1xuICAgICAgaWYgKCFob3ZlcmVkQmFuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkQmFuZC5ldmVudDtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGFuY2hvciA9ICg8U1ZHUmVjdEVsZW1lbnQ+dGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdHlwZSBNZXRyaWMgPSB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfTtcbiAgICAgIGNvbnN0IG1ldHJpY3M6IE1ldHJpY1tdID0gZHJhd0RhdGEucmVjdHNcbiAgICAgICAgLmZpbHRlcihyZWN0ID0+IHJlY3QuZGF0ZVZhbHVlID09PSBob3ZlcmVkQmFuZC5kYXRlVmFsdWUpXG4gICAgICAgIC5tYXAocmVjdCA9PiAoe1xuICAgICAgICAgIGxhYmVsOiByZWN0LnNlcmllc1BvaW50LnNlcmllcy5sYWJlbCxcbiAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZUZvcm1hdHRlcihyZWN0LnNlcmllc1BvaW50LnZhbHVlKSxcbiAgICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4geyBhbmNob3IsIG1ldHJpY3MgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFN0YWNrZWRDb2x1bW5Db21wb25lbnQge1xuICBleHBvcnQgdHlwZSBWYWx1ZSA9IHsgZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlciB9O1xuXG4gIGV4cG9ydCB0eXBlIFNlcmllcyA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGRhdGE6IFZhbHVlW107XG4gIH0gJiAoXG4gICAgfCB7XG4gICAgICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICAgICAgc3R5bGU/OiAnc29saWQnIHwgJ3N0cmlwZWQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBzdHlsZTogJ3Rvb2x0aXBPbmx5JztcbiAgICAgIH1cbiAgKTtcblxuICBleHBvcnQgdHlwZSBTdGFjayA9IFNlcmllc1tdO1xufVxuIiwiPGRpdiAqbmdJZj1cIiEoZW1wdHkkIHwgYXN5bmMpOyBlbHNlIHplcm9TdGF0ZVwiIGNsYXNzPVwiY29udGFpbmVyXCI+XG4gIDxzdmdcbiAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAqbmdJZj1cImRyYXdEYXRhJCB8IGFzeW5jOyBsZXQgZFwiXG4gICAgW2F0dHIudmlld0JveF09XCJkLnZpZXdCb3hcIlxuICA+XG4gICAgPGRlZnM+XG4gICAgICA8cGF0dGVyblxuICAgICAgICBpZD1cInN0cmlwZXNcIlxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJkLmNvbHVtbldpZHRoXCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIHgxPVwiMFwiXG4gICAgICAgICAgW2F0dHIueTFdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgICAgW2F0dHIueDJdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgICAgeTI9XCIwXCJcbiAgICAgICAgICBzdHJva2U9XCJ2YXIoLS13aGl0ZS0xMDApXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgPjwvbGluZT5cbiAgICAgIDwvcGF0dGVybj5cbiAgICA8L2RlZnM+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54TWlub3JUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWJhY2tncm91bmRcIlxuICAgICAgICBbY2xhc3MuZm9jdXNlZF09XCIoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5kYXRlVmFsdWUgPT09IHRpY2suZGF0ZVZhbHVlXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnggLSAyMFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUoMCkgKyAzXCJcbiAgICAgICAgd2lkdGg9XCI0MFwiXG4gICAgICAgIGhlaWdodD1cIjEyXCJcbiAgICAgICAgcng9XCIyXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cInRpY2sueFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUoMCkgKyAxMlwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgID5cbiAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnhNYWpvclRpY2tzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cInRpY2sueFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55U2NhbGUoMCkgKyAyNFwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgID5cbiAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnlUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKHRpY2spXCJcbiAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgaGVpZ2h0PVwiMVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHQgY2xhc3M9XCJ0aWNrLWxhYmVsXCIgeD1cIjBcIiBbYXR0ci55XT1cImQueVNjYWxlKHRpY2spXCIgZHk9XCItNFwiPlxuICAgICAgICB7eyB2YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkLnJlY3RzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cImNvbHVtblwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJyZWN0LmZpbGxcIlxuICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlICE9PSByZWN0LmRhdGVWYWx1ZVxuICAgICAgICBcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDxyZWN0XG4gICAgICAgICpuZ0lmPVwicmVjdC5zdHJpcGVkXCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBmaWxsPVwidXJsKCNzdHJpcGVzKVwiXG4gICAgICA+PC9yZWN0PlxuICAgIDwvZz5cbiAgICA8cmVjdFxuICAgICAgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5ob3ZlckJhbmRzXCJcbiAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAobW91c2VlbnRlcik9XCJcbiAgICAgICAgaG92ZXJlZEJhbmQkLm5leHQoeyBkYXRlVmFsdWU6IHJlY3QuZGF0ZVZhbHVlLCBldmVudDogJGV2ZW50IH0pXG4gICAgICBcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEJhbmQkLm5leHQobnVsbClcIlxuICAgID48L3JlY3Q+XG4gIDwvc3ZnPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjYWxsb3V0JCB8IGFzeW5jOyBsZXQgY2FsbG91dFwiPlxuICA8cml2LWNhbGxvdXRcbiAgICAqcml2LWNhbGxvdXRcbiAgICBbYW5jaG9yXT1cImNhbGxvdXQuYW5jaG9yXCJcbiAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidjZW50ZXItcmlnaHQnXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAnY2VudGVyLXJpZ2h0JyxcbiAgICAgICdjZW50ZXItbGVmdCcsXG4gICAgICAndG9wLWNlbnRlcicsXG4gICAgICAnYm90dG9tLWNlbnRlcidcbiAgICBdXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LW1ldHJpY1wiICpuZ0Zvcj1cImxldCBtZXRyaWMgb2YgY2FsbG91dC5tZXRyaWNzXCI+XG4gICAgICAgIDxkaXY+e3sgbWV0cmljLmxhYmVsIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LW1ldHJpYy12YWx1ZVwiPnt7IG1ldHJpYy52YWx1ZSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZT48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjb250cm9scz5cbiAgPHJpdi1zaW5nbGUtc2VsZWN0XG4gICAgW2dyb3Vwc109XCJpbnRlcnZhbE9wdGlvbnMkIHwgYXN5bmMgfCByaXZPcHRpb25Hcm91cFwiXG4gICAgW3NlbGVjdGVkT3B0aW9uXT1cInNlbGVjdGVkSW50ZXJ2YWxPcHRpb24kIHwgYXN5bmNcIlxuICAgIChzZWxlY3RlZE9wdGlvbkNoYW5nZSk9XCJzZXRJbnRlcnZhbE9wdGlvbigkZXZlbnQpXCJcbiAgPjwvcml2LXNpbmdsZS1zZWxlY3Q+XG48L25nLXRlbXBsYXRlPlxuIl19
355
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLWNvbHVtbi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtY29sdW1uL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsU0FBUyxHQUNWLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7OztBQUV0RSxNQUFNLGdCQUFnQixHQUFhLE9BQU8sQ0FBQztBQUUzQyw2RUFBNkU7QUFDN0UsMkJBQTJCO0FBTzNCLE1BQU0sT0FBTyxzQkFBc0I7SUFObkM7UUFPbUIsV0FBTSxHQUFHLElBQUksZUFBZSxDQUMz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c0I7dUdBQXRCLHNCQUFzQixvUEN4Q25DLGd3SEE0SUE7MkZEcEdhLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxvQkFBb0IsbUJBR2IsdUJBQXVCLENBQUMsTUFBTTs4QkFPcEMsS0FBSztzQkFEZixLQUFLO2dCQWdCQyxjQUFjO3NCQURwQixLQUFLO2dCQUtLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBU1UsUUFBUTtzQkFEdkIsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5kZXggfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgeyBzY2FsZUJhbmQsIHNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICdkMy1zaGFwZSc7XG5pbXBvcnQgeyB1dGNGb3JtYXQgfSBmcm9tICdkMy10aW1lLWZvcm1hdCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2luZ2xlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW5wdXQvc2luZ2xlLXNlbGVjdC9zaW5nbGUtc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBJbnRlcnZhbCxcbiAgZ2V0SW50ZXJ2YWxUaXRsZSxcbiAgZ2V0TWFqb3JJbnRlcnZhbCxcbiAgZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0TWlub3JJbnRlcnZhbEZvcm1hdCxcbiAgZ2V0VGltZUludGVydmFsLFxuICBpbnRlcnZhbHMsXG59IGZyb20gJy4uL2ludGVydmFscyc7XG5pbXBvcnQgeyBnZXREYXRlUmFuZ2UsIHBvaW50UmVkdWNlciB9IGZyb20gJy4vc3RhY2tlZC1jb2x1bW4uaGVscGVycyc7XG5cbmNvbnN0IERFRkFVTFRfSU5URVJWQUw6IEludGVydmFsID0gJ21vbnRoJztcblxuLy8gVE9ETzogb25jZSB3ZSB1cGdyYWRlIHRvIEFuZ3VsYXIgMTYsIHRoaXMgY29tcG9uZW50IGNhbiBiZSBjbGVhbmVkIHVwIHdpdGhcbi8vIHNpZ25hbHMgaW5zdGVhZCBvZiBSeEpTLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LXN0YWNrZWQtY29sdW1uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0YWNrZWQtY29sdW1uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3RhY2tlZC1jb2x1bW4uY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3RhY2tlZENvbHVtbkNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrW10+KFxuICAgIFtdLFxuICApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXSkge1xuICAgIHRoaXMuaW5wdXQkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBpbnB1dCgpOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3aWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oOTYwKTtcbiAgcHJvdGVjdGVkIHNldCB3aWR0aCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoJC5uZXh0KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBIRUlHSFQgPSAzMDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGludGVydmFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SW50ZXJ2YWw+KERFRkFVTFRfSU5URVJWQUwpO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGludGVydmFsKHY6IEludGVydmFsKSB7XG4gICAgdGhpcy5pbnRlcnZhbCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLmludGVydmFsJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnY29udHJvbHMnKVxuICBwdWJsaWMgcmVhZG9ubHkgY29udHJvbHM/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgQ09MVU1OX1dJRFRIUyA9IFs4LCAxNiwgNDAsIDcyXSBhcyBjb25zdDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fQ09MVU1OX1dJRFRIID0gdGhpcy5DT0xVTU5fV0lEVEhTWzBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbnVtSW52aXNpYmxlQ29sdW1ucyQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChcbiAgICAgIGlucHV0ID0+XG4gICAgICAgIGlucHV0LmZpbHRlcihcbiAgICAgICAgICBzdGFjayA9PiBzdGFjay5maWx0ZXIocyA9PiBzLnN0eWxlID09ICd0b29sdGlwT25seScpLmxlbmd0aCA+IDAsXG4gICAgICAgICkubGVuZ3RoLFxuICAgICksXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbnVtVmlzaWJsZUNvbHVtbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy5udW1JbnZpc2libGVDb2x1bW5zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgbnVtSW52aXNpYmxlQ29sdW1uc10pID0+IGlucHV0Lmxlbmd0aCAtIG51bUludmlzaWJsZUNvbHVtbnMpLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4Q29sdW1ucyQgPSB0aGlzLndpZHRoJC5waXBlKFxuICAgIG1hcCh3aWR0aCA9PiB7XG4gICAgICBjb25zdCBpbm5lcldpZHRoID0gd2lkdGggLSB0aGlzLkxFRlRfT0ZGU0VUO1xuICAgICAgY29uc3QgY29sdW1uV2lkdGhXaXRoUGFkZGluZyA9XG4gICAgICAgIHRoaXMuTUlOX0NPTFVNTl9XSURUSCArIHRoaXMuQ09MVU1OX1BBRERJTkcgKiAyO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoaW5uZXJXaWR0aCAvIGNvbHVtbldpZHRoV2l0aFBhZGRpbmcpO1xuICAgIH0pLFxuICApO1xuXG4gIGdldFhTdGVwc0luUmFuZ2UoaW50ZXJ2YWw6IEludGVydmFsLCBtaW5EYXRlOiBEYXRlLCBtYXhEYXRlOiBEYXRlKSB7XG4gICAgY29uc3QgdGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKTtcbiAgICByZXR1cm4gdGltZUludGVydmFsLnJhbmdlKFxuICAgICAgdGltZUludGVydmFsLmZsb29yKG1pbkRhdGUpLFxuICAgICAgdGltZUludGVydmFsLmZsb29yKHRpbWVJbnRlcnZhbC5vZmZzZXQobWF4RGF0ZSwgMSkpLFxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhbGxvd2VkSW50ZXJ2YWxzJDogT2JzZXJ2YWJsZTxJbnRlcnZhbFtdPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW5wdXQkLFxuICAgIHRoaXMubWF4Q29sdW1ucyQsXG4gICAgdGhpcy5udW1WaXNpYmxlQ29sdW1ucyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIG1heENvbHVtbnMsIG51bVZpc2libGVDb2x1bW5zXSkgPT4ge1xuICAgICAgY29uc3QgW21pbkRhdGUsIG1heERhdGVdID0gZ2V0RGF0ZVJhbmdlKGlucHV0KTtcblxuICAgICAgcmV0dXJuIGludGVydmFscy5maWx0ZXIoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBjb25zdCB4U3RlcHNDb3VudCA9IHRoaXMuZ2V0WFN0ZXBzSW5SYW5nZShpbnRlcnZhbCwgbWluRGF0ZSwgbWF4RGF0ZSk7XG4gICAgICAgIHJldHVybiBudW1WaXNpYmxlQ29sdW1ucyAqIHhTdGVwc0NvdW50IDw9IG1heENvbHVtbnM7XG4gICAgICB9KTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGludGVydmFsT3B0aW9ucyQgPSB0aGlzLmFsbG93ZWRJbnRlcnZhbHMkLnBpcGUoXG4gICAgbWFwKGludGVydmFscyA9PlxuICAgICAgaW50ZXJ2YWxzLm1hcChcbiAgICAgICAgKGludGVydmFsKTogU2luZ2xlU2VsZWN0Q29tcG9uZW50Lk9wdGlvbiA9PiAoe1xuICAgICAgICAgIGlkOiBpbnRlcnZhbCxcbiAgICAgICAgICB0aXRsZTogZ2V0SW50ZXJ2YWxUaXRsZShpbnRlcnZhbCksXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmludGVydmFsJCxcbiAgICB0aGlzLmludGVydmFsT3B0aW9ucyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW50ZXJ2YWwsIG9wdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBhbGxvd2VkSW50ZXJ2YWxzID0gb3B0aW9ucy5tYXAoKHsgaWQgfSkgPT4gaWQgYXMgSW50ZXJ2YWwpO1xuICAgICAgaWYgKCFhbGxvd2VkSW50ZXJ2YWxzLmluY2x1ZGVzKGludGVydmFsKSkge1xuICAgICAgICBjb25zdCBmaXJzdEFsbG93ZWQgPSBhbGxvd2VkSW50ZXJ2YWxzLmF0KDApO1xuICAgICAgICBjb25zdCBsYXN0QWxsb3dlZCA9IGFsbG93ZWRJbnRlcnZhbHMuYXQoLTEpO1xuICAgICAgICBpZiAoIWZpcnN0QWxsb3dlZCB8fCAhbGFzdEFsbG93ZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChpbnRlcnZhbHMuaW5kZXhPZihpbnRlcnZhbCkgPCBpbnRlcnZhbHMuaW5kZXhPZihmaXJzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gZmlyc3RBbGxvd2VkO1xuICAgICAgICBpZiAoaW50ZXJ2YWxzLmluZGV4T2YoaW50ZXJ2YWwpID4gaW50ZXJ2YWxzLmluZGV4T2YobGFzdEFsbG93ZWQpKVxuICAgICAgICAgIGludGVydmFsID0gbGFzdEFsbG93ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKG8gPT4gby5pZCA9PT0gaW50ZXJ2YWwpID8/IG51bGw7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZEludGVydmFsJCA9IHRoaXMuc2VsZWN0ZWRJbnRlcnZhbE9wdGlvbiQucGlwZShcbiAgICBtYXAob3B0aW9uID0+IChvcHRpb24gPyAob3B0aW9uLmlkIGFzIEludGVydmFsKSA6IERFRkFVTFRfSU5URVJWQUwpKSxcbiAgKTtcblxuICBzZXRJbnRlcnZhbE9wdGlvbihvcHRpb246IFNpbmdsZVNlbGVjdENvbXBvbmVudC5PcHRpb24pIHtcbiAgICB0aGlzLmludGVydmFsID0gb3B0aW9uLmlkIGFzIEludGVydmFsO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2x1bW5XaWR0aCQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwkLFxuICAgIHRoaXMubnVtVmlzaWJsZUNvbHVtbnMkLFxuICAgIHRoaXMud2lkdGgkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBzZWxlY3RlZEludGVydmFsLCBudW1WaXNpYmxlQ29sdW1ucywgd2lkdGhdKSA9PiB7XG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoaW5wdXQpO1xuICAgICAgY29uc3QgeFN0ZXBDb3VudCA9IHRoaXMuZ2V0WFN0ZXBzSW5SYW5nZShcbiAgICAgICAgc2VsZWN0ZWRJbnRlcnZhbCxcbiAgICAgICAgbWluRGF0ZSxcbiAgICAgICAgbWF4RGF0ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGlubmVyV2lkdGggPSB3aWR0aCAtIHRoaXMuTEVGVF9PRkZTRVQ7XG4gICAgICBjb25zdCBhbGxvd2VkQ29sdW1uV2lkdGhzID0gdGhpcy5DT0xVTU5fV0lEVEhTLmZpbHRlcihjb2x1bW5XaWR0aCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoV2l0aFBhZGRpbmcgPSBjb2x1bW5XaWR0aCArIHRoaXMuQ09MVU1OX1BBRERJTkcgKiAyO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGlubmVyV2lkdGggLVxuICAgICAgICAgICAgbnVtVmlzaWJsZUNvbHVtbnMgKiB4U3RlcENvdW50ICogY29sdW1uV2lkdGhXaXRoUGFkZGluZyA+PVxuICAgICAgICAgIDBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBhbGxvd2VkQ29sdW1uV2lkdGhzLmF0KC0xKTtcbiAgICAgIGlmICghY29sdW1uV2lkdGgpIHJldHVybiAwO1xuXG4gICAgICByZXR1cm4gY29sdW1uV2lkdGg7XG4gICAgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBpbnRlcnZhbF0pID0+XG4gICAgICBpbnB1dC5tYXAoKHN0YWNrKTogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5TdGFjayA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbChpbnRlcnZhbCk7XG5cbiAgICAgICAgcmV0dXJuIHN0YWNrLm1hcChzZXJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGJpbm5lZCA9IG5ldyBNYXA8bnVtYmVyLCBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYmluID0gdGltZUludGVydmFsLmZsb29yKHBvaW50LmRhdGUpLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIGlmICghYmlubmVkLmhhcyhiaW4pKSB7XG4gICAgICAgICAgICAgIGJpbm5lZC5zZXQoYmluLCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaW5uZWQuZ2V0KGJpbikhLnB1c2gocG9pbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc2VyaWVzLFxuICAgICAgICAgICAgZGF0YTogWy4uLmJpbm5lZC5lbnRyaWVzKCldLm1hcCgoW2RhdGVWYWx1ZSwgcG9pbnRzXSkgPT4gKHtcbiAgICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoZGF0ZVZhbHVlKSxcbiAgICAgICAgICAgICAgdmFsdWU6IHBvaW50UmVkdWNlcihwb2ludHMpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IExFRlRfT0ZGU0VUID0gNDg7XG4gIHJlYWRvbmx5IENPTFVNTl9QQURESU5HID0gNDtcblxuICByZWFkb25seSBkcmF3RGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmJpbm5lZERhdGEkLFxuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuc2VsZWN0ZWRJbnRlcnZhbCQsXG4gICAgdGhpcy5udW1JbnZpc2libGVDb2x1bW5zJCxcbiAgICB0aGlzLmNvbHVtbldpZHRoJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtiaW5uZWREYXRhLCB3aWR0aCwgaW50ZXJ2YWwsIG51bUludmlzaWJsZUNvbHVtbnMsIGNvbHVtbldpZHRoXSkgPT4ge1xuICAgICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHt0aGlzLkhFSUdIVH1gO1xuICAgICAgY29uc3QgcGFkZGluZyA9IDE2O1xuXG4gICAgICBjb25zdCBbbWluRGF0ZSwgbWF4RGF0ZV0gPSBnZXREYXRlUmFuZ2UoYmlubmVkRGF0YSk7XG4gICAgICBjb25zdCBoYXNNdWx0aXBsZVllYXJzID0gbWluRGF0ZS5nZXRGdWxsWWVhcigpIDwgbWF4RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgY29uc3QgeE1pbm9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNaW5vckludGVydmFsRm9ybWF0KGludGVydmFsKTtcbiAgICAgIGNvbnN0IG1pbm9yRm9ybWF0dGVyID0gdXRjRm9ybWF0KHhNaW5vckludGVydmFsRm9ybWF0KTtcbiAgICAgIGNvbnN0IG1pbm9yVGltZUludGVydmFsID0gZ2V0VGltZUludGVydmFsKGludGVydmFsKTtcbiAgICAgIGNvbnN0IHhTdGVwcyA9IG1pbm9yVGltZUludGVydmFsLnJhbmdlKFxuICAgICAgICBtaW5vclRpbWVJbnRlcnZhbC5mbG9vcihtaW5EYXRlKSxcbiAgICAgICAgbWlub3JUaW1lSW50ZXJ2YWwuZmxvb3IobWlub3JUaW1lSW50ZXJ2YWwub2Zmc2V0KG1heERhdGUsIDEpKSxcbiAgICAgICk7XG4gICAgICBjb25zdCB4TWFqb3JJbnRlcnZhbCA9IGdldE1ham9ySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNYWpvckludGVydmFsRm9ybWF0KFxuICAgICAgICB4TWFqb3JJbnRlcnZhbCxcbiAgICAgICAgaGFzTXVsdGlwbGVZZWFycyxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYWpvckZvcm1hdHRlciA9IHV0Y0Zvcm1hdCh4TWFqb3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCBmdWxsRm9ybWF0dGVyID0gdXRjRm9ybWF0KFxuICAgICAgICBgJHt4TWlub3JJbnRlcnZhbEZvcm1hdH0gJHt4TWFqb3JJbnRlcnZhbEZvcm1hdH1gLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgeE91dGVyU2NhbGUgPSBzY2FsZUJhbmQoKVxuICAgICAgICAuZG9tYWluKHhTdGVwcy5tYXAoZGF0ZSA9PiBmdWxsRm9ybWF0dGVyKGRhdGUpKSlcbiAgICAgICAgLnJhbmdlKFt0aGlzLkxFRlRfT0ZGU0VULCB3aWR0aF0pO1xuXG4gICAgICBjb25zdCBvdXRlclBhZGRpbmcgPVxuICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLVxuICAgICAgICAgICh0aGlzLkNPTFVNTl9QQURESU5HICogKGJpbm5lZERhdGEubGVuZ3RoIC0gMSAtIG51bUludmlzaWJsZUNvbHVtbnMpICtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoICogKGJpbm5lZERhdGEubGVuZ3RoIC0gbnVtSW52aXNpYmxlQ29sdW1ucykpKSAvXG4gICAgICAgIDI7XG5cbiAgICAgIHR5cGUgU2VyaWVzUG9pbnQgPSBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlICYge1xuICAgICAgICBzZXJpZXM6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU2VyaWVzO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVuZGVySW5mb3JtYXRpb24gPSBiaW5uZWREYXRhLm1hcChzdGFja0RhdGEgPT4ge1xuICAgICAgICAvKlxuICAgICAgICAgIENyZWF0ZSBhbiBhcnJheSB3aXRoIGV2ZXJ5IGRhdGEgcG9pbnQgKyB0aGVpciBhc3NvY2lhdGVkIHNlcmllcy5cbiAgICAgICAgICBpLmUuIE1ha2UgYW4gYmFja2xpbmsgZm9yIGVhY2ggZWxlbWVudCB0byBpdHMgc2VyaWVzLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBzdGFja2VkVGFibGUgPSBzdGFja0RhdGEucmVkdWNlPFNlcmllc1BvaW50W10+KFxuICAgICAgICAgICh0YWJsZSwgcykgPT4gW1xuICAgICAgICAgICAgLi4udGFibGUsXG4gICAgICAgICAgICAuLi5zLmRhdGEubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgICAgIC4uLnBvaW50LFxuICAgICAgICAgICAgICBzZXJpZXM6IHMsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcblxuICAgICAgICAvKlxuICAgICAgICAgIE1hcHMgZWFjaCBvZiB0aGUgU2VyaWVzUG9pbnRzIGJhc2VkIG9uIGxhYmVsLlxuICAgICAgICAgIFRoZW4gbWFwIGVhY2ggb2YgdGhvc2UgbWFwcyB0byBhIGRhdGUuXG5cbiAgICAgICAgICBFeGFtcGxlOlxuICAgICAgICAgICAgSWYgd2Ugd2VyZSBpbmRleGluZyB0aGUgZm9sbG93aW5nIGRhdGE6XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIENvbXBsZXRlIC0+IDUgaW4gSmFudWFyeSwgNyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgICAqIEVzdGltYXRlcyBJbmNvbXBsZXRlIC0+IDMgaW4gSmFudWFyeSwgMyBpbiBGZWJydWFyeVxuICAgICAgICAgICAgV2Ugd291bGQgZ2V0IGFuIGluZGV4ZWQgdGFibGUgbGlrZSB0aGUgZm9sbG93aW5nLCAobm90ZSB0aGlzIGlzIHBzZXVkb2NvZGUpOlxuICAgICAgICAgICAgICAnSmFudWFyeSc6IHsgJ0VzdGltYXRlcyBDb21wbGV0ZSc6IDUsICdFc3RpbWF0ZXMgSW5jb21wbGV0ZSc6IDMgfVxuICAgICAgICAgICAgICAnRmVicnVhcnknOiB7ICdFc3RpbWF0ZXMgQ29tcGxldGUnOiA3LCAnRXN0aW1hdGVzIEluY29tcGxldGUnOiAzIH1cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW5kZXhlZFRhYmxlOiBNYXA8RGF0ZSwgTWFwPHN0cmluZywgU2VyaWVzUG9pbnQ+PiA9IGluZGV4KFxuICAgICAgICAgIHN0YWNrZWRUYWJsZSxcbiAgICAgICAgICBkID0+IGQuZGF0ZSxcbiAgICAgICAgICBkID0+IGQuc2VyaWVzLmxhYmVsLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAgVGhlIG91dHB1dCBvZiBcInN0YWNrKClcIiBpcyBhbiBhcnJheSBvZiBhcnJheXMgb2YgdHVwbGVzLlxuICAgICAgICAgICAgVGhlIHR1cGxlcyB1bm5lc3QgYXMgW2Jhc2VsaW5lLCB0b3BsaW5lXS5cbiAgICAgICAgICAgIEVhY2ggXCJrZXlcIiBpbnZvbHZlZCBpbiB0aGUgc3RhY2sgaGFzIGFuIGFycmF5IG9mIHR1cGxlcyByZWxhdGluZyB0byBpdC5cbiAgICAgICAgICAgICAgaS5lLiBbIERhdGUgMSBUdXBsZSwgRGF0ZSAyIFR1cGxlIF1cbiAgICAgICAgICAgIEFsbCBcImtleVwiIGFycmF5cyBhcmUgY29udGFpbmVkIGluIHRoZSBvdXRlciBhcnJheS5cbiAgICAgICAgICAgICAgaS5lLiBbIEtleSAxIFR1cGxlcywgS2V5IDIgVHVwbGVzXVxuXG4gICAgICAgICAgV2Ugc2VsZWN0IHRoZSBrZXlzIHVzaW5nIFwiLmtleXMoKVwiLlxuICAgICAgICAgICAgRm9yIG91ciBwdXJwb3NlcywgdGhlIGtleXMgYXJlIHRoZSBsZWdlbmQgZWxlbWVudHMuXG4gICAgICAgICAgICBpLmUuIElmIHlvdSBoYXZlIHR3byBibG9ja3Mgb2YgdGhlIHNhbWUgY29sb3IsIHRoZXkgaGF2ZSB0aGUgc2FtZSBrZXkuXG5cbiAgICAgICAgICBXZSBzZWxlY3QgdGhlIGhlaWdodHMgb2YgdGhlIGJsb2NrcyB1c2luZyBcIi52YWx1ZSgpXCIuXG5cbiAgICAgICAgICBXZSBhcmUgZ29pbmcgdG8gc3RhY2sgdGhlIGJsb2NrcyBvbiB0b3Agb2YgZWFjaCBvdGhlci5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgZmlyc3Qga2V5IHR1cGxlcyBhcmUgMC5cbiAgICAgICAgICAgIFRoZSBiYXNlbGluZSBvZiB0aGUgc2Vjb25kIGtleSB0dXBsZXMgYXJlIHRoZSB0b3BsaW5lIG9mIHRoZSBhc3NvY2lhdGVkIGZpcnN0IGtleSB0dXBsZS5cblxuICAgICAgICAgIEV4YW1wbGU6XG4gICAgICAgICAgICBJZiB3ZSB3ZXJlIHN0YWNraW5nIHRoZSBmb2xsb3dpbmcgZGF0YTpcbiAgICAgICAgICAgICAgKiBFc3RpbWF0ZXMgQ29tcGxldGUgLT4gNSBpbiBKYW51YXJ5LCA3IGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICAgICogRXN0aW1hdGVzIEluY29tcGxldGUgLT4gMyBpbiBKYW51YXJ5LCAzIGluIEZlYnJ1YXJ5XG4gICAgICAgICAgICBXZSB3b3VsZCBnZXQgYSBzdGFjayBvZjpcbiAgICAgICAgICAgICAgWyAgWyBbMCw1XSxbMCw3XSBdLCBbIFs1LDhdLFs3LDEwXSBdICBdXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHN0YWNrZWQgPSBzdGFjazxcbiAgICAgICAgICB0eXBlb2YgaW5kZXhlZFRhYmxlIGV4dGVuZHMgTWFwPGluZmVyIEssIGluZmVyIFY+ID8gW0ssIFZdIDogbmV2ZXJcbiAgICAgICAgPigpXG4gICAgICAgICAgLmtleXMoc3RhY2tEYXRhLm1hcCh2ID0+IHYubGFiZWwpKVxuICAgICAgICAgIC52YWx1ZSgoW18sIGdyb3VwXSwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAuZ2V0KGtleSkhLnZhbHVlO1xuICAgICAgICAgIH0pKGluZGV4ZWRUYWJsZSk7XG5cbiAgICAgICAgcmV0dXJuIHsgaW5kZXhlZFRhYmxlLCBzdGFja2VkIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIGRvbWFpbiBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGhpZ2hlc3QgdmFsdWUgaW4gYW55IHN0YWNrLCBvbiBhbnkgZGF0ZS5cbiAgICAgIGxldCBkb21haW5NYXggPSAwO1xuICAgICAgLy8gRm9yIGVhY2ggdW5pcXVlIHN0YWNrLFxuICAgICAgcmVuZGVySW5mb3JtYXRpb24uZm9yRWFjaCgoeyBzdGFja2VkLCBpbmRleGVkVGFibGUgfSkgPT4ge1xuICAgICAgICAvLyBGb3IgZWFjaCBkYXRlLFxuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLnZhbHVlcygpXS5mb3JFYWNoKChwb2ludE1hcCwgaSkgPT4ge1xuICAgICAgICAgIC8vIEZvciBlYWNoIHNlcmllcyxcbiAgICAgICAgICBbLi4ucG9pbnRNYXAudmFsdWVzKCldLmZvckVhY2goKF8sIGopID0+IHtcbiAgICAgICAgICAgIGlmIChfLnNlcmllcy5zdHlsZSA9PSAndG9vbHRpcE9ubHknKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbWFpbk1heCA9IE1hdGgubWF4KGRvbWFpbk1heCwgLi4uc3RhY2tlZFtqXVtpXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoZG9tYWluTWF4ID09PSAwKSBkb21haW5NYXggPSAxO1xuICAgICAgY29uc3QgeVNjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgICAuZG9tYWluKFswLCBkb21haW5NYXhdKVxuICAgICAgICAucmFuZ2UoW3RoaXMuSEVJR0hUIC0gcGFkZGluZyAqIDIsIHBhZGRpbmddKTtcblxuICAgICAgY29uc3QgcmVjdHM6IHtcbiAgICAgICAgZGF0ZVZhbHVlOiBudW1iZXI7XG4gICAgICAgIHg6IG51bWJlcjtcbiAgICAgICAgeTogbnVtYmVyO1xuICAgICAgICB3aWR0aDogbnVtYmVyO1xuICAgICAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAgICAgZmlsbDogc3RyaW5nO1xuICAgICAgICBzdHJpcGVkOiBib29sZWFuO1xuICAgICAgICBzZXJpZXNQb2ludDogU2VyaWVzUG9pbnQ7XG4gICAgICB9W10gPSBbXTtcbiAgICAgIGxldCBpbnZpc0NvbHVtbnNTb0ZhciA9IDA7XG4gICAgICAvLyBGb3IgZWFjaCB1bmlxdWUgc3RhY2ssXG4gICAgICByZW5kZXJJbmZvcm1hdGlvbi5mb3JFYWNoKCh7IHN0YWNrZWQsIGluZGV4ZWRUYWJsZSB9LCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgaW52aXNDb2x1bW5Gb3VuZCA9IGZhbHNlO1xuICAgICAgICAvLyBGb3IgZWFjaCBkYXRlLFxuICAgICAgICBbLi4uaW5kZXhlZFRhYmxlLmVudHJpZXMoKV0uZm9yRWFjaCgoW2RhdGUsIHBvaW50TWFwXSwgaSkgPT4ge1xuICAgICAgICAgIC8vIEZvciBlYWNoIHNlcmllcyxcbiAgICAgICAgICBbLi4ucG9pbnRNYXAuZW50cmllcygpXS5mb3JFYWNoKChbXywgc2VyaWVzUG9pbnRdLCBqKSA9PiB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGJveCB3ZSBhcmUgYWJvdXQgdG8gZHJhdy5cbiAgICAgICAgICAgIGNvbnN0IFtiYXNlbGluZSwgdG9wbGluZV0gPSBzdGFja2VkW2pdW2ldO1xuXG4gICAgICAgICAgICBpZiAoc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlID09ICd0b29sdGlwT25seScpIHtcbiAgICAgICAgICAgICAgaW52aXNDb2x1bW5Gb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9XG4gICAgICAgICAgICAgIHNlcmllc1BvaW50LnNlcmllcy5zdHlsZSA9PSAndG9vbHRpcE9ubHknID8gMCA6IGNvbHVtbldpZHRoO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0geVNjYWxlKGJhc2VsaW5lKSAtIHlTY2FsZSh0b3BsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IHggPVxuICAgICAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICAgICBvdXRlclBhZGRpbmcgK1xuICAgICAgICAgICAgICBjb2x1bW5XaWR0aCAqIChpbmRleCAtIGludmlzQ29sdW1uc1NvRmFyKSArXG4gICAgICAgICAgICAgIHRoaXMuQ09MVU1OX1BBRERJTkcgKiAoaW5kZXggLSBpbnZpc0NvbHVtbnNTb0Zhcik7XG4gICAgICAgICAgICBjb25zdCB5ID0geVNjYWxlKGJhc2VsaW5lKSAtIGhlaWdodDtcbiAgICAgICAgICAgIGxldCBmaWxsID0gJyc7XG4gICAgICAgICAgICBpZiAoc2VyaWVzUG9pbnQuc2VyaWVzLnN0eWxlICE9ICd0b29sdGlwT25seScpIHtcbiAgICAgICAgICAgICAgZmlsbCA9IGB2YXIoJHtzZXJpZXNQb2ludC5zZXJpZXMuY29sb3JUb2tlbn0pYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVjdHMucHVzaCh7XG4gICAgICAgICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgIGZpbGwsXG4gICAgICAgICAgICAgIHN0cmlwZWQ6IHNlcmllc1BvaW50LnNlcmllcy5zdHlsZSA9PT0gJ3N0cmlwZWQnLFxuICAgICAgICAgICAgICBzZXJpZXNQb2ludCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGludmlzQ29sdW1uRm91bmQpIHtcbiAgICAgICAgICBpbnZpc0NvbHVtbnNTb0ZhcisrO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeE1pbm9yVGlja3MgPSB4U3RlcHMubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgZGF0ZVZhbHVlOiBkYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgbGFiZWw6IG1pbm9yRm9ybWF0dGVyKGRhdGUpLFxuICAgICAgICB4OlxuICAgICAgICAgICh4T3V0ZXJTY2FsZShmdWxsRm9ybWF0dGVyKGRhdGUpKSA/PyAwKSArIHhPdXRlclNjYWxlLmJhbmR3aWR0aCgpIC8gMixcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHhNYWpvclRpY2tzID1cbiAgICAgICAgaW50ZXJ2YWwgIT09ICd5ZWFyJ1xuICAgICAgICAgID8geFN0ZXBzXG4gICAgICAgICAgICAgIC5tYXAoZGF0ZSA9PiAoe1xuICAgICAgICAgICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgICAgICAgICAgbGFiZWw6IG1ham9yRm9ybWF0dGVyKGRhdGUpLFxuICAgICAgICAgICAgICAgIHg6XG4gICAgICAgICAgICAgICAgICAoeE91dGVyU2NhbGUoZnVsbEZvcm1hdHRlcihkYXRlKSkgPz8gMCkgK1xuICAgICAgICAgICAgICAgICAgeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLyAyLFxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAodGljaywgaSwgdGlja3MpID0+XG4gICAgICAgICAgICAgICAgICBpID09PSAwIHx8IHRpY2subGFiZWwgIT09IHRpY2tzW2kgLSAxXS5sYWJlbCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIDogW107XG5cbiAgICAgIGNvbnN0IHlUaWNrcyA9IHlTY2FsZS50aWNrcyg1KTtcblxuICAgICAgY29uc3QgaG92ZXJCYW5kV2lkdGggPVxuICAgICAgICAocmVuZGVySW5mb3JtYXRpb24ubGVuZ3RoIC0gbnVtSW52aXNpYmxlQ29sdW1ucykgKiBjb2x1bW5XaWR0aCArXG4gICAgICAgIChyZW5kZXJJbmZvcm1hdGlvbi5sZW5ndGggKyAxIC0gbnVtSW52aXNpYmxlQ29sdW1ucykgKlxuICAgICAgICAgIHRoaXMuQ09MVU1OX1BBRERJTkc7XG4gICAgICBjb25zdCBob3ZlckJhbmRzID0geFN0ZXBzLm1hcChkYXRlID0+ICh7XG4gICAgICAgIGRhdGVWYWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgIHg6XG4gICAgICAgICAgKHhPdXRlclNjYWxlKGZ1bGxGb3JtYXR0ZXIoZGF0ZSkpID8/IDApICtcbiAgICAgICAgICAoeE91dGVyU2NhbGUuYmFuZHdpZHRoKCkgLSBob3ZlckJhbmRXaWR0aCkgLyAyLFxuICAgICAgICB5OiB5U2NhbGUoZG9tYWluTWF4KSxcbiAgICAgICAgd2lkdGg6IGhvdmVyQmFuZFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IHlTY2FsZSgwKSAtIHlTY2FsZShkb21haW5NYXgpLFxuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5XaWR0aCxcbiAgICAgICAgaG92ZXJCYW5kcyxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIHZpZXdCb3gsXG4gICAgICAgIHhNaW5vclRpY2tzLFxuICAgICAgICB4TWFqb3JUaWNrcyxcbiAgICAgICAgeVNjYWxlLFxuICAgICAgICB5VGlja3MsXG4gICAgICB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgZW1wdHkkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT5cbiAgICAgIGlucHV0LmV2ZXJ5KHN0YWNrID0+IHN0YWNrLmV2ZXJ5KHNlcmllcyA9PiBzZXJpZXMuZGF0YS5sZW5ndGggPT09IDApKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaG92ZXJlZEJhbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgZGF0ZVZhbHVlOiBudW1iZXI7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBjYWxsb3V0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaG92ZXJlZEJhbmQkLCB0aGlzLmRyYXdEYXRhJF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZEJhbmQsIGRyYXdEYXRhXSkgPT4ge1xuICAgICAgaWYgKCFob3ZlcmVkQmFuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkQmFuZC5ldmVudDtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGFuY2hvciA9ICg8U1ZHUmVjdEVsZW1lbnQ+dGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdHlwZSBNZXRyaWMgPSB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfTtcbiAgICAgIGNvbnN0IG1ldHJpY3M6IE1ldHJpY1tdID0gZHJhd0RhdGEucmVjdHNcbiAgICAgICAgLmZpbHRlcihyZWN0ID0+IHJlY3QuZGF0ZVZhbHVlID09PSBob3ZlcmVkQmFuZC5kYXRlVmFsdWUpXG4gICAgICAgIC5tYXAocmVjdCA9PiAoe1xuICAgICAgICAgIGxhYmVsOiByZWN0LnNlcmllc1BvaW50LnNlcmllcy5sYWJlbCxcbiAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZUZvcm1hdHRlcihyZWN0LnNlcmllc1BvaW50LnZhbHVlKSxcbiAgICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4geyBhbmNob3IsIG1ldHJpY3MgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFN0YWNrZWRDb2x1bW5Db21wb25lbnQge1xuICBleHBvcnQgdHlwZSBWYWx1ZSA9IHsgZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlciB9O1xuXG4gIGV4cG9ydCB0eXBlIFNlcmllcyA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGRhdGE6IFZhbHVlW107XG4gIH0gJiAoXG4gICAgfCB7XG4gICAgICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICAgICAgc3R5bGU/OiAnc29saWQnIHwgJ3N0cmlwZWQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBzdHlsZTogJ3Rvb2x0aXBPbmx5JztcbiAgICAgIH1cbiAgKTtcblxuICBleHBvcnQgdHlwZSBTdGFjayA9IFNlcmllc1tdO1xufVxuIiwiPGRpdlxuICAqbmdJZj1cIiEoZW1wdHkkIHwgYXN5bmMpOyBlbHNlIHplcm9TdGF0ZVwiXG4gIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgKHJpdkNsaWVudFNpemUpPVwid2lkdGggPSAkZXZlbnQud2lkdGhcIlxuPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZC52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZC5jb2x1bW5XaWR0aFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICB4MT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIFthdHRyLngyXT1cImQuY29sdW1uV2lkdGhcIlxuICAgICAgICAgIHkyPVwiMFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueE1pbm9yVGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGljay1iYWNrZ3JvdW5kXCJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8uZGF0ZVZhbHVlID09PSB0aWNrLmRhdGVWYWx1ZVwiXG4gICAgICAgIFthdHRyLnhdPVwidGljay54IC0gMjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgM1wiXG4gICAgICAgIHdpZHRoPVwiNDBcIlxuICAgICAgICBoZWlnaHQ9XCIxMlwiXG4gICAgICAgIHJ4PVwiMlwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMTJcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54TWFqb3JUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICBbYXR0ci55XT1cImQueVNjYWxlKDApICsgMjRcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC55VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiXG4gICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgIGhlaWdodD1cIjFcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0IGNsYXNzPVwidGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZC5yZWN0c1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJjb2x1bW5cIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIFthdHRyLmZpbGxdPVwicmVjdC5maWxsXCJcbiAgICAgICAgW2NsYXNzLmJsdXJyZWRdPVwiXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKSAhPT0gbnVsbCAmJlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYyk/LmRhdGVWYWx1ZSAhPT0gcmVjdC5kYXRlVmFsdWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPHJlY3RcbiAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGQuaG92ZXJCYW5kc1wiXG4gICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICBmaWxsPVwidHJhbnNwYXJlbnRcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgIGhvdmVyZWRCYW5kJC5uZXh0KHsgZGF0ZVZhbHVlOiByZWN0LmRhdGVWYWx1ZSwgZXZlbnQ6ICRldmVudCB9KVxuICAgICAgXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXCJcbiAgICA+PC9yZWN0PlxuICA8L3N2Zz5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInY2VudGVyLXJpZ2h0J1wiXG4gICAgW2FsbG93ZWRQb3NpdGlvbnNdPVwiW1xuICAgICAgJ2NlbnRlci1yaWdodCcsXG4gICAgICAnY2VudGVyLWxlZnQnLFxuICAgICAgJ3RvcC1jZW50ZXInLFxuICAgICAgJ2JvdHRvbS1jZW50ZXInXG4gICAgXVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWNcIiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIGNhbGxvdXQubWV0cmljc1wiPlxuICAgICAgICA8ZGl2Pnt7IG1ldHJpYy5sYWJlbCB9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWMtdmFsdWVcIj57eyBtZXRyaWMudmFsdWUgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3Jpdi1jYWxsb3V0PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjemVyb1N0YXRlPlxuICA8cml2LXplcm8tc3RhdGU+PC9yaXYtemVyby1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbHM+XG4gIDxyaXYtc2luZ2xlLXNlbGVjdFxuICAgIFtncm91cHNdPVwiaW50ZXJ2YWxPcHRpb25zJCB8IGFzeW5jIHwgcml2T3B0aW9uR3JvdXBcIlxuICAgIFtzZWxlY3RlZE9wdGlvbl09XCJzZWxlY3RlZEludGVydmFsT3B0aW9uJCB8IGFzeW5jXCJcbiAgICAoc2VsZWN0ZWRPcHRpb25DaGFuZ2UpPVwic2V0SW50ZXJ2YWxPcHRpb24oJGV2ZW50KVwiXG4gID48L3Jpdi1zaW5nbGUtc2VsZWN0PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -15,13 +15,4 @@ export function getDateRange(stacks) {
15
15
  export function pointReducer(points) {
16
16
  return points.reduce((total, { value }) => total + value, 0);
17
17
  }
18
- export function getColumnWidth(numColumns) {
19
- if (numColumns <= 6)
20
- return 72;
21
- if (numColumns <= 18)
22
- return 40;
23
- if (numColumns <= 40)
24
- return 16;
25
- return 8;
26
- }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1jb2x1bW4vc3RhY2tlZC1jb2x1bW4uaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUFzQztJQUV0QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDMUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUM1QjtTQUNGO0tBQ0Y7SUFDRCxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFzQztJQUNqRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxVQUFrQjtJQUMvQyxJQUFJLFVBQVUsSUFBSSxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDL0IsSUFBSSxVQUFVLElBQUksRUFBRTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLElBQUksVUFBVSxJQUFJLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNoQyxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFja2VkQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9zdGFja2VkLWNvbHVtbi5jb21wb25lbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0ZVJhbmdlKFxuICBzdGFja3M6IFN0YWNrZWRDb2x1bW5Db21wb25lbnQuU3RhY2tbXSxcbik6IFtEYXRlLCBEYXRlXSB7XG4gIGxldCBtaW4gPSBJbmZpbml0eTtcbiAgbGV0IG1heCA9IC1JbmZpbml0eTtcbiAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICBmb3IgKGNvbnN0IHNlcmllcyBvZiBzdGFjaykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludFJlZHVjZXIocG9pbnRzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlZhbHVlW10pIHtcbiAgcmV0dXJuIHBvaW50cy5yZWR1Y2UoKHRvdGFsLCB7IHZhbHVlIH0pID0+IHRvdGFsICsgdmFsdWUsIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uV2lkdGgobnVtQ29sdW1uczogbnVtYmVyKSB7XG4gIGlmIChudW1Db2x1bW5zIDw9IDYpIHJldHVybiA3MjtcbiAgaWYgKG51bUNvbHVtbnMgPD0gMTgpIHJldHVybiA0MDtcbiAgaWYgKG51bUNvbHVtbnMgPD0gNDApIHJldHVybiAxNjtcbiAgcmV0dXJuIDg7XG59XG4iXX0=
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1jb2x1bW4uaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1jb2x1bW4vc3RhY2tlZC1jb2x1bW4uaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUFzQztJQUV0QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDMUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUM1QjtTQUNGO0tBQ0Y7SUFDRCxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFzQztJQUNqRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2tlZENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vc3RhY2tlZC1jb2x1bW4uY29tcG9uZW50JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVSYW5nZShcbiAgc3RhY2tzOiBTdGFja2VkQ29sdW1uQ29tcG9uZW50LlN0YWNrW10sXG4pOiBbRGF0ZSwgRGF0ZV0ge1xuICBsZXQgbWluID0gSW5maW5pdHk7XG4gIGxldCBtYXggPSAtSW5maW5pdHk7XG4gIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgZm9yIChjb25zdCBzZXJpZXMgb2Ygc3RhY2spIHtcbiAgICAgIGZvciAoY29uc3QgeyBkYXRlIH0gb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCB2YWx1ZSk7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW25ldyBEYXRlKG1pbiksIG5ldyBEYXRlKG1heCldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRSZWR1Y2VyKHBvaW50czogU3RhY2tlZENvbHVtbkNvbXBvbmVudC5WYWx1ZVtdKSB7XG4gIHJldHVybiBwb2ludHMucmVkdWNlKCh0b3RhbCwgeyB2YWx1ZSB9KSA9PiB0b3RhbCArIHZhbHVlLCAwKTtcbn1cbiJdfQ==