@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.
- package/esm2020/lib/input/calendar/calendar.component.mjs +1 -1
- package/esm2020/lib/input/date-range/date-range.component.mjs +1 -1
- package/esm2020/lib/input/input-label/input-label.component.mjs +1 -1
- package/esm2020/lib/input/single-select/single-select.component.mjs +20 -44
- package/esm2020/lib/interaction/focus-on-init.directive.mjs +43 -0
- package/esm2020/lib/modal/help/help.component.mjs +11 -3
- package/esm2020/lib/riv.module.mjs +11 -1
- package/esm2020/lib/size/content.service.mjs +31 -0
- package/esm2020/lib/size/size.directive.mjs +40 -0
- package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +63 -39
- package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +1 -10
- package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +53 -78
- package/esm2020/lib/visualization/time-series/time-series.component.mjs +22 -27
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/rivet-health-design-system.mjs +268 -183
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +267 -188
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/lib/input/single-select/single-select.component.d.ts +3 -6
- package/lib/interaction/focus-on-init.directive.d.ts +13 -0
- package/lib/modal/help/help.component.d.ts +6 -1
- package/lib/riv.module.d.ts +31 -29
- package/lib/size/content.service.d.ts +16 -0
- package/lib/size/size.directive.d.ts +20 -0
- package/lib/visualization/stacked-column/stacked-column.component.d.ts +11 -6
- package/lib/visualization/stacked-column/stacked-column.helpers.d.ts +0 -1
- package/lib/visualization/stacked-row/stacked-row.component.d.ts +9 -13
- package/lib/visualization/time-series/time-series.component.d.ts +5 -6
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/styles/tokens/typography.css +1 -1
|
@@ -7,8 +7,9 @@ import * as i1 from "@angular/common";
|
|
|
7
7
|
import * as i2 from "../../modal/callout/callout.component";
|
|
8
8
|
import * as i3 from "../../modal/callout/callout.directive";
|
|
9
9
|
import * as i4 from "../legend-item/legend-item.component";
|
|
10
|
-
import * as i5 from "../../
|
|
11
|
-
import * as i6 from "
|
|
10
|
+
import * as i5 from "../../size/size.directive";
|
|
11
|
+
import * as i6 from "../../format/svg-text-truncate/svg-text-truncate.directive";
|
|
12
|
+
import * as i7 from "../zero-state/zero-state.component";
|
|
12
13
|
// TODO: once we upgrade to Angular 16, this component can be cleaned up with
|
|
13
14
|
// signals instead of RxJS.
|
|
14
15
|
export class StackedRowComponent {
|
|
@@ -16,18 +17,42 @@ export class StackedRowComponent {
|
|
|
16
17
|
// This is the list of rows we will display, in the order we will display them.
|
|
17
18
|
this.input$ = new BehaviorSubject([]);
|
|
18
19
|
// Width helps determine the size of the viewbox this graph is displaying in.
|
|
19
|
-
this.width$ = new BehaviorSubject(
|
|
20
|
-
// Height helps determine the size of the viewbox this graph is displaying in.
|
|
21
|
-
this.height$ = new BehaviorSubject(null);
|
|
20
|
+
this.width$ = new BehaviorSubject(0);
|
|
22
21
|
// ValueFormatter determines how we style the values in a metric and the x-axis
|
|
23
22
|
this.valueFormatter = v => v.toString();
|
|
24
23
|
this.zeroStateMessage$ = new BehaviorSubject('No data to display.');
|
|
24
|
+
this.chartAndRowHeights$ = this.input$.pipe(map(input => {
|
|
25
|
+
const heightWithoutRows = input.length * this.SECTION_PADDING.BETWEEN_ROW +
|
|
26
|
+
this.SECTION_PADDING.OUTER_TOP_BOTTOM * 2 +
|
|
27
|
+
this.SECTION_HEIGHTS.X_AXIS_LABEL;
|
|
28
|
+
// The combined height of all rows at their min/max
|
|
29
|
+
const minHeight = input.length * this.RECTANGLE_HEIGHTS.MIN_HEIGHT + heightWithoutRows;
|
|
30
|
+
const maxHeight = input.length * this.RECTANGLE_HEIGHTS.MAX_HEIGHT + heightWithoutRows;
|
|
31
|
+
// If the max-sized rows don't need the target size, shrink the chart
|
|
32
|
+
if (maxHeight < this.TARGET_HEIGHT)
|
|
33
|
+
return {
|
|
34
|
+
chartHeight: maxHeight,
|
|
35
|
+
rowHeight: this.RECTANGLE_HEIGHTS.MAX_HEIGHT,
|
|
36
|
+
};
|
|
37
|
+
// If the min-sized rows need more than the target size, grow the chart
|
|
38
|
+
if (minHeight > this.TARGET_HEIGHT)
|
|
39
|
+
return {
|
|
40
|
+
chartHeight: minHeight,
|
|
41
|
+
rowHeight: this.RECTANGLE_HEIGHTS.MIN_HEIGHT,
|
|
42
|
+
};
|
|
43
|
+
// Otherwise shrink the rows to fit the target size
|
|
44
|
+
return {
|
|
45
|
+
chartHeight: this.TARGET_HEIGHT,
|
|
46
|
+
rowHeight: (this.TARGET_HEIGHT - heightWithoutRows) / input.length,
|
|
47
|
+
};
|
|
48
|
+
}));
|
|
25
49
|
/*
|
|
26
50
|
The layout we are shooting for is:
|
|
27
51
|
|
|
28
52
|
| X Axis Labels |
|
|
29
53
|
Row Name | Rectangles | Totals
|
|
30
54
|
*/
|
|
55
|
+
this.TARGET_HEIGHT = 300;
|
|
31
56
|
this.RECTANGLE_HEIGHTS = {
|
|
32
57
|
MIN_HEIGHT: 12,
|
|
33
58
|
MAX_HEIGHT: 42, // Sets the largest size a row can expand to
|
|
@@ -35,36 +60,6 @@ export class StackedRowComponent {
|
|
|
35
60
|
this.SECTION_HEIGHTS = {
|
|
36
61
|
// Space reserved for the x-axis labels
|
|
37
62
|
X_AXIS_LABEL: 14,
|
|
38
|
-
// Height of each row
|
|
39
|
-
PER_ROW: () => {
|
|
40
|
-
//Only use height if specified
|
|
41
|
-
if (this.input.length && this.height) {
|
|
42
|
-
let rowHeight = (this.height -
|
|
43
|
-
this.SECTION_HEIGHTS.X_AXIS_LABEL -
|
|
44
|
-
this.SECTION_PADDING.OUTER_TOP_BOTTOM -
|
|
45
|
-
this.SECTION_PADDING.RECTANGLE_TO_ROW) /
|
|
46
|
-
this.input.length -
|
|
47
|
-
this.SECTION_PADDING.BETWEEN_ROW; // calculate base row height
|
|
48
|
-
// Clamping the row height between the min and max heights
|
|
49
|
-
return Math.min(Math.max(rowHeight, this.RECTANGLE_HEIGHTS.MIN_HEIGHT), this.RECTANGLE_HEIGHTS.MAX_HEIGHT);
|
|
50
|
-
}
|
|
51
|
-
return this.RECTANGLE_HEIGHTS.MIN_HEIGHT; // Default if no input
|
|
52
|
-
},
|
|
53
|
-
// Max Height of each rectangle
|
|
54
|
-
PER_RECTANGLE: () => {
|
|
55
|
-
//Only use height if specified
|
|
56
|
-
if (this.input.length && this.height) {
|
|
57
|
-
let rectangleHeight = (this.height -
|
|
58
|
-
this.SECTION_HEIGHTS.X_AXIS_LABEL -
|
|
59
|
-
this.SECTION_PADDING.OUTER_TOP_BOTTOM -
|
|
60
|
-
this.SECTION_PADDING.RECTANGLE_TO_ROW) /
|
|
61
|
-
this.input.length -
|
|
62
|
-
this.SECTION_PADDING.BETWEEN_ROW; // calculate base rectangle height
|
|
63
|
-
// Clamping the rectangle height between the min and max heights
|
|
64
|
-
return Math.min(Math.max(rectangleHeight, this.RECTANGLE_HEIGHTS.MIN_HEIGHT), this.RECTANGLE_HEIGHTS.MAX_HEIGHT);
|
|
65
|
-
}
|
|
66
|
-
return this.RECTANGLE_HEIGHTS.MIN_HEIGHT; // Default if no input
|
|
67
|
-
},
|
|
68
63
|
};
|
|
69
64
|
this.SECTION_WIDTHS = {
|
|
70
65
|
// Space reserved for the name at the start of the row
|
|
@@ -89,16 +84,9 @@ export class StackedRowComponent {
|
|
|
89
84
|
this.drawData$ = combineLatest([
|
|
90
85
|
this.input$,
|
|
91
86
|
this.width$,
|
|
92
|
-
this.
|
|
87
|
+
this.chartAndRowHeights$,
|
|
93
88
|
]).pipe(map(([input, width, height]) => {
|
|
94
|
-
return this.getDrawnData(input, width, height
|
|
95
|
-
? height
|
|
96
|
-
: this.SECTION_HEIGHTS.X_AXIS_LABEL +
|
|
97
|
-
this.SECTION_PADDING.OUTER_TOP_BOTTOM +
|
|
98
|
-
this.SECTION_PADDING.RECTANGLE_TO_ROW +
|
|
99
|
-
(this.SECTION_HEIGHTS.PER_ROW() +
|
|
100
|
-
this.SECTION_PADDING.BETWEEN_ROW) *
|
|
101
|
-
input.length);
|
|
89
|
+
return this.getDrawnData(input, width, height.chartHeight, height.rowHeight);
|
|
102
90
|
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
103
91
|
// Lets us know whether to display the zero data state
|
|
104
92
|
this.empty$ = this.input$.pipe(map(input => input.every(stack => stack.data.length === 0)), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
@@ -132,15 +120,6 @@ export class StackedRowComponent {
|
|
|
132
120
|
set width(v) {
|
|
133
121
|
this.width$.next(v);
|
|
134
122
|
}
|
|
135
|
-
get width() {
|
|
136
|
-
return this.width$.getValue();
|
|
137
|
-
}
|
|
138
|
-
set height(v) {
|
|
139
|
-
this.height$.next(v);
|
|
140
|
-
}
|
|
141
|
-
get height() {
|
|
142
|
-
return this.height$.getValue();
|
|
143
|
-
}
|
|
144
123
|
set zeroStateMessage(v) {
|
|
145
124
|
this.zeroStateMessage$.next(v);
|
|
146
125
|
}
|
|
@@ -162,19 +141,19 @@ export class StackedRowComponent {
|
|
|
162
141
|
return (this.SECTION_PADDING.OUTER_TOP_BOTTOM + this.SECTION_HEIGHTS.X_AXIS_LABEL);
|
|
163
142
|
}
|
|
164
143
|
// The y-index of the top of the current row
|
|
165
|
-
getTopOfRow(rowIndex) {
|
|
144
|
+
getTopOfRow(rowIndex, rowHeight) {
|
|
166
145
|
const spaceAboveRows = this.SECTION_PADDING.OUTER_TOP_BOTTOM + this.SECTION_HEIGHTS.X_AXIS_LABEL;
|
|
167
|
-
const aboveRows = rowIndex *
|
|
146
|
+
const aboveRows = rowIndex * rowHeight;
|
|
168
147
|
const aboveRowPaddings = rowIndex * this.SECTION_PADDING.BETWEEN_ROW;
|
|
169
148
|
const allAboveRows = aboveRows + aboveRowPaddings;
|
|
170
149
|
return spaceAboveRows + allAboveRows;
|
|
171
150
|
}
|
|
172
151
|
// Calculate all the values we need for displaying the graph on screen.
|
|
173
|
-
getDrawnData(rowStacks, width,
|
|
152
|
+
getDrawnData(rowStacks, width, chartHeight, rowHeight) {
|
|
174
153
|
if (rowStacks.length == 0) {
|
|
175
154
|
return null;
|
|
176
155
|
}
|
|
177
|
-
const viewBox = `0 0 ${width} ${
|
|
156
|
+
const viewBox = `0 0 ${width} ${chartHeight}`;
|
|
178
157
|
const keysInOrder = getKeyOrder(rowStacks);
|
|
179
158
|
const standardizedRows = standardizeRowStacks(rowStacks, keysInOrder);
|
|
180
159
|
const rowsForDisplay = standardizedRows.map(stackData => {
|
|
@@ -192,13 +171,13 @@ export class StackedRowComponent {
|
|
|
192
171
|
.clamp(true); // Ensures the scale does not go beyond the defined range
|
|
193
172
|
const xtickCountAdjusted = Math.round(tickScale(width));
|
|
194
173
|
const xTicks = xScale.ticks(xtickCountAdjusted);
|
|
195
|
-
const rects = this.createRectanglesFromRows(rowsForDisplay, xScale);
|
|
196
|
-
const rowNamesToDraw = this.getRowNamesToDraw(rowsForDisplay);
|
|
197
|
-
const rowTotalsToDraw = this.getRowTotalsToDraw(rowsForDisplay, width);
|
|
174
|
+
const rects = this.createRectanglesFromRows(rowsForDisplay, xScale, rowHeight);
|
|
175
|
+
const rowNamesToDraw = this.getRowNamesToDraw(rowsForDisplay, rowHeight);
|
|
176
|
+
const rowTotalsToDraw = this.getRowTotalsToDraw(rowsForDisplay, width, rowHeight);
|
|
198
177
|
const legendItems = getLegendItems(rowsForDisplay, keysInOrder);
|
|
199
178
|
return {
|
|
200
179
|
legendItems: legendItems,
|
|
201
|
-
rowHeight:
|
|
180
|
+
rowHeight: rowHeight,
|
|
202
181
|
rects: rects,
|
|
203
182
|
rowNames: rowNamesToDraw,
|
|
204
183
|
rowTotals: rowTotalsToDraw,
|
|
@@ -208,20 +187,20 @@ export class StackedRowComponent {
|
|
|
208
187
|
};
|
|
209
188
|
}
|
|
210
189
|
// Get data for all the rectangles for all the rows
|
|
211
|
-
createRectanglesFromRows(displayRows, xScale) {
|
|
190
|
+
createRectanglesFromRows(displayRows, xScale, rowHeight) {
|
|
212
191
|
const rectangles = [];
|
|
213
192
|
displayRows.forEach((currentRow, rowIndex) => {
|
|
214
193
|
currentRow.elementsButStacked.forEach((currentElement, _) => {
|
|
215
|
-
const topOfRow = this.getTopOfRow(rowIndex);
|
|
194
|
+
const topOfRow = this.getTopOfRow(rowIndex, rowHeight);
|
|
216
195
|
const rectangleWidth = xScale(currentElement.topline) - xScale(currentElement.baseline);
|
|
217
|
-
const rectangleHeight =
|
|
196
|
+
const rectangleHeight = rowHeight;
|
|
218
197
|
const rectangleX = xScale(currentElement.baseline);
|
|
219
198
|
const rectangleY = topOfRow + this.SECTION_PADDING.RECTANGLE_TO_ROW;
|
|
220
199
|
const fill = `var(${currentElement.colorToken})`;
|
|
221
200
|
rectangles.push({
|
|
222
201
|
x: rectangleX,
|
|
223
202
|
y: rectangleY,
|
|
224
|
-
width: rectangleWidth,
|
|
203
|
+
width: Math.max(rectangleWidth, 0),
|
|
225
204
|
height: rectangleHeight,
|
|
226
205
|
fill: fill,
|
|
227
206
|
striped: currentElement.style === 'striped',
|
|
@@ -233,13 +212,13 @@ export class StackedRowComponent {
|
|
|
233
212
|
return rectangles;
|
|
234
213
|
}
|
|
235
214
|
// Get data on the row names we are drawing
|
|
236
|
-
getRowNamesToDraw(displayRows) {
|
|
215
|
+
getRowNamesToDraw(displayRows, rowHeight) {
|
|
237
216
|
return displayRows.map((row, rowIndex) => {
|
|
238
217
|
const rowLabelX = this.SECTION_PADDING.OUTER_LEFT_RIGHT;
|
|
239
218
|
// The row name looks right if its base is at the base of the associated rectangle
|
|
240
|
-
const rowLabelY = this.getTopOfRow(rowIndex) +
|
|
219
|
+
const rowLabelY = this.getTopOfRow(rowIndex, rowHeight) +
|
|
241
220
|
this.SECTION_PADDING.RECTANGLE_TO_ROW +
|
|
242
|
-
|
|
221
|
+
rowHeight / 2;
|
|
243
222
|
return {
|
|
244
223
|
label: row.rowName,
|
|
245
224
|
x: rowLabelX,
|
|
@@ -248,13 +227,13 @@ export class StackedRowComponent {
|
|
|
248
227
|
});
|
|
249
228
|
}
|
|
250
229
|
// Get data on the row totals we are drawing
|
|
251
|
-
getRowTotalsToDraw(displayRows, width) {
|
|
230
|
+
getRowTotalsToDraw(displayRows, width, rowHeight) {
|
|
252
231
|
return displayRows.map((row, rowIndex) => {
|
|
253
232
|
const rowLabelX = width - this.SECTION_PADDING.OUTER_LEFT_RIGHT;
|
|
254
233
|
// The row totals looks right if its base is at the base of the associated rectangle
|
|
255
|
-
const rowLabelY = this.getTopOfRow(rowIndex) +
|
|
234
|
+
const rowLabelY = this.getTopOfRow(rowIndex, rowHeight) +
|
|
256
235
|
this.SECTION_PADDING.RECTANGLE_TO_ROW +
|
|
257
|
-
|
|
236
|
+
rowHeight / 2;
|
|
258
237
|
return {
|
|
259
238
|
label: this.valueFormatter(row.rowTotal),
|
|
260
239
|
x: rowLabelX,
|
|
@@ -264,19 +243,15 @@ export class StackedRowComponent {
|
|
|
264
243
|
}
|
|
265
244
|
}
|
|
266
245
|
StackedRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
267
|
-
StackedRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input",
|
|
246
|
+
StackedRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", valueFormatter: "valueFormatter", zeroStateMessage: "zeroStateMessage" }, 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 draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n >\n <rect\n class=\"row\"\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)?.rowName !== rect.rowName\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 <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\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]=\"'bottom-center'\"\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 [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.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.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i5.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i6.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
268
247
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedRowComponent, decorators: [{
|
|
269
248
|
type: Component,
|
|
270
|
-
args: [{ selector: 'riv-stacked-row', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div
|
|
249
|
+
args: [{ selector: 'riv-stacked-row', 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 draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n >\n <rect\n class=\"row\"\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)?.rowName !== rect.rowName\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 <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\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]=\"'bottom-center'\"\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 [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.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"] }]
|
|
271
250
|
}], propDecorators: { input: [{
|
|
272
251
|
type: Input
|
|
273
|
-
}], width: [{
|
|
274
|
-
type: Input
|
|
275
|
-
}], height: [{
|
|
276
|
-
type: Input
|
|
277
252
|
}], valueFormatter: [{
|
|
278
253
|
type: Input
|
|
279
254
|
}], zeroStateMessage: [{
|
|
280
255
|
type: Input
|
|
281
256
|
}] } });
|
|
282
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEQsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFLTCxXQUFXLEVBQ1gsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixvQkFBb0IsR0FDckIsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7QUFRL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQU8zQixNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBT0UsK0VBQStFO1FBQzlELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FDM0MsRUFBRSxDQUNILENBQUM7UUFTRiw2RUFBNkU7UUFDNUQsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLEdBQUcsQ0FBQyxDQUFDO1FBUzNELDhFQUE4RTtRQUM3RCxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBU3BFLCtFQUErRTtRQUV4RSxtQkFBYyxHQUEwQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoRCxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FDdEQscUJBQXFCLENBQ3RCLENB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R0FBbkIsbUJBQW1CLDZMQ25DaEMsMDhHQTZIQTsyRkQxRmEsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNOzhCQVFwQyxLQUFLO3NCQURmLEtBQUs7Z0JBV0ssS0FBSztzQkFEZixLQUFLO2dCQVdLLE1BQU07c0JBRGhCLEtBQUs7Z0JBVUMsY0FBYztzQkFEcEIsS0FBSztnQkFPSyxnQkFBZ0I7c0JBRDFCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW50ZXJuU2V0IH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IHsgU2NhbGVMaW5lYXIsIHNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFJvd0Rpc3BsYXlJbmZvLFxuICBSb3dMYWJlbCxcbiAgUm93UmVjdGFuZ2xlLFxuICBTdGFja2VkUm93RHJhd0RhdGEsXG4gIGdldEtleU9yZGVyLFxuICBnZXRMZWdlbmRJdGVtcyxcbiAgZ2V0Um93RGlzcGxheUluZm8sXG4gIHN0YW5kYXJkaXplUm93U3RhY2tzLFxufSBmcm9tICcuL3N0YWNrZWQtcm93LmhlbHBlcnMnO1xuXG50eXBlIENhbGxvdXRNZXRyaWMgPSB7XG4gIHJvd05hbWU6IHN0cmluZztcbiAgZWxlbWVudExhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59O1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1yb3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiByb3dzIHdlIHdpbGwgZGlzcGxheSwgaW4gdGhlIG9yZGVyIHdlIHdpbGwgZGlzcGxheSB0aGVtLlxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdPihcbiAgICBbXSxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFdpZHRoIGhlbHBzIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlld2JveCB0aGlzIGdyYXBoIGlzIGRpc3BsYXlpbmcgaW4uXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDk2MCk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgd2lkdGgodjogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGgkLmdldFZhbHVlKCk7XG4gIH1cblxuICAvLyBIZWlnaHQgaGVscHMgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSB2aWV3Ym94IHRoaXMgZ3JhcGggaXMgZGlzcGxheWluZyBpbi5cbiAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoZWlnaHQodjogbnVtYmVyIHwgbnVsbCkge1xuICAgIHRoaXMuaGVpZ2h0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFZhbHVlRm9ybWF0dGVyIGRldGVybWluZXMgaG93IHdlIHN0eWxlIHRoZSB2YWx1ZXMgaW4gYSBtZXRyaWMgYW5kIHRoZSB4LWF4aXNcbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHplcm9TdGF0ZU1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFxuICAgICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB6ZXJvU3RhdGVNZXNzYWdlKHY6IHN0cmluZykge1xuICAgIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHplcm9TdGF0ZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy56ZXJvU3RhdGVNZXNzYWdlJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLypcbiAgICBUaGUgbGF5b3V0IHdlIGFyZSBzaG9vdGluZyBmb3IgaXM6XG5cbiAgICAgICAgICAgICAgfCAgIFggQXhpcyBMYWJlbHMgIHxcbiAgICBSb3cgTmFtZSAgfCAgIFJlY3RhbmdsZXMgICAgIHwgICBUb3RhbHNcbiAgKi9cbiAgcmVhZG9ubHkgUkVDVEFOR0xFX0hFSUdIVFMgPSB7XG4gICAgTUlOX0hFSUdIVDogMTIsIC8vIFNldHMgdGhlIHNtYWxsZXN0IHNpemUgYSByb3cgY2FuIHNocmluayB0b1xuICAgIE1BWF9IRUlHSFQ6IDQyLCAvLyBTZXRzIHRoZSBsYXJnZXN0IHNpemUgYSByb3cgY2FuIGV4cGFuZCB0b1xuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fSEVJR0hUUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHgtYXhpcyBsYWJlbHNcbiAgICBYX0FYSVNfTEFCRUw6IDE0LFxuICAgIC8vIEhlaWdodCBvZiBlYWNoIHJvd1xuICAgIFBFUl9ST1c6ICgpOiBudW1iZXIgPT4ge1xuICAgICAgLy9Pbmx5IHVzZSBoZWlnaHQgaWYgc3BlY2lmaWVkXG4gICAgICBpZiAodGhpcy5pbnB1dC5sZW5ndGggJiYgdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgbGV0IHJvd0hlaWdodCA9XG4gICAgICAgICAgKHRoaXMuaGVpZ2h0IC1cbiAgICAgICAgICAgIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTCAtXG4gICAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NIC1cbiAgICAgICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cpIC9cbiAgICAgICAgICAgIHRoaXMuaW5wdXQubGVuZ3RoIC1cbiAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5CRVRXRUVOX1JPVzsgLy8gY2FsY3VsYXRlIGJhc2Ugcm93IGhlaWdodFxuICAgICAgICAvLyBDbGFtcGluZyB0aGUgcm93IGhlaWdodCBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCBoZWlnaHRzXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgICBNYXRoLm1heChyb3dIZWlnaHQsIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVCksXG4gICAgICAgICAgdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NQVhfSEVJR0hULFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVDsgLy8gRGVmYXVsdCBpZiBubyBpbnB1dFxuICAgIH0sXG4gICAgLy8gTWF4IEhlaWdodCBvZiBlYWNoIHJlY3RhbmdsZVxuICAgIFBFUl9SRUNUQU5HTEU6ICgpOiBudW1iZXIgPT4ge1xuICAgICAgLy9Pbmx5IHVzZSBoZWlnaHQgaWYgc3BlY2lmaWVkXG4gICAgICBpZiAodGhpcy5pbnB1dC5sZW5ndGggJiYgdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgbGV0IHJlY3RhbmdsZUhlaWdodCA9XG4gICAgICAgICAgKHRoaXMuaGVpZ2h0IC1cbiAgICAgICAgICAgIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTCAtXG4gICAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NIC1cbiAgICAgICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cpIC9cbiAgICAgICAgICAgIHRoaXMuaW5wdXQubGVuZ3RoIC1cbiAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5CRVRXRUVOX1JPVzsgLy8gY2FsY3VsYXRlIGJhc2UgcmVjdGFuZ2xlIGhlaWdodFxuICAgICAgICAvLyBDbGFtcGluZyB0aGUgcmVjdGFuZ2xlIGhlaWdodCBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCBoZWlnaHRzXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgICBNYXRoLm1heChyZWN0YW5nbGVIZWlnaHQsIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVCksXG4gICAgICAgICAgdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NQVhfSEVJR0hULFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVDsgLy8gRGVmYXVsdCBpZiBubyBpbnB1dFxuICAgIH0sXG4gIH07XG5cbiAgcmVhZG9ubHkgU0VDVElPTl9XSURUSFMgPSB7XG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSBuYW1lIGF0IHRoZSBzdGFydCBvZiB0aGUgcm93XG4gICAgUk9XX05BTUU6IDEwMCxcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHRvdGFscyBhdCB0aGUgZW5kIG9mIHRoZSByb3dcbiAgICBST1dfVE9UQUxfTEFCRUw6IDcyLFxuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fUEFERElORyA9IHtcbiAgICAvLyBQYWRkaW5nIGJldHdlZW4gZWFjaCBlZGdlIG9mIHRoZSB2aWV3Ym94IGFuZCB0aGUgY29udGVudFxuICAgIE9VVEVSX1RPUF9CT1RUT006IDQsXG4gICAgT1VURVJfTEVGVF9SSUdIVDogNCxcbiAgICAvLyBQYWRkaW5nIGJldHdlZW4gdGhlIGJvdHRvbSBvZiBvbmUgcm93IGFuZCB0aGUgdG9wIG9mIHRoZSBuZXh0IHJvd1xuICAgIEJFVFdFRU5fUk9XOiA0LFxuICAgIC8vIFNwYWNlIGJldHdlZW4gdGhlIHJvdyBhbmQgdGhlIHRvcCBvZiBhIHJlY3RhbmdsZSBpbiB0aGF0IHJvd1xuICAgIFJFQ1RBTkdMRV9UT19ST1c6IDYsXG4gIH07XG5cbiAgLy8gVGhlIG51bWJlciBvZiBYLWF4aXMgc2VnbWVudHMgdG8gY3JlYXRlLCB3aXRoIGxhYmVscyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzZWdtZW50LlxuICByZWFkb25seSBYX1RJQ0tfQ09VTlRfTUFYID0gODtcbiAgcmVhZG9ubHkgWF9USUNLX0NPVU5UX01JTiA9IDM7XG4gIHJlYWRvbmx5IFhfVElDS19NQVhfV0lEVEggPSA5MDA7XG4gIHJlYWRvbmx5IFhfVElDS19NSU5fV0lEVEggPSA0MDA7XG5cbiAgLy8gWmVybyBvbiB0aGUgWCBheGlzIGlzIGFmdGVyIHRoZSBsZWZ0IHBhZGRpbmcgYW5kIHRoZSByb3cgbmFtZS5cbiAgbG9jYXRpb25PZlhBeGlzWmVybygpIHtcbiAgICByZXR1cm4gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVCArIHRoaXMuU0VDVElPTl9XSURUSFMuUk9XX05BTUU7XG4gIH1cbiAgLy8gVGhlIGVuZCBvZiB0aGUgWCBheGlzIGlzIHJpZ2h0IGJlZm9yZSB0aGUgcm93IHRvdGFsIGFuZCB0aGUgcmlnaHQgcGFkZGluZy5cbiAgbG9jYXRpb25PZlhBeGlzRW5kKHdpZHRoOiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGFjZU9uUmlnaHQ6IG51bWJlciA9XG4gICAgICB0aGlzLlNFQ1RJT05fV0lEVEhTLlJPV19UT1RBTF9MQUJFTCArXG4gICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUO1xuICAgIHJldHVybiB3aWR0aCAtIHNwYWNlT25SaWdodDtcbiAgfVxuICAvLyBUaGUgeS1pbmRleCBvZiB0aGUgeC1heGlzIHRpY2tzXG4gIGxvY2F0aW9uT2ZYQXhpc1RpY2soKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKyB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUxcbiAgICApO1xuICB9XG4gIC8vIFRoZSB5LWluZGV4IG9mIHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgcm93XG4gIGdldFRvcE9mUm93KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGFjZUFib3ZlUm93czogbnVtYmVyID1cbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKyB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUw7XG5cbiAgICBjb25zdCBhYm92ZVJvd3M6IG51bWJlciA9IHJvd0luZGV4ICogdGhpcy5TRUNUSU9OX0hFSUdIVFMuUEVSX1JPVygpO1xuICAgIGNvbnN0IGFib3ZlUm93UGFkZGluZ3M6IG51bWJlciA9XG4gICAgICByb3dJbmRleCAqIHRoaXMuU0VDVElPTl9QQURESU5HLkJFVFdFRU5fUk9XO1xuICAgIGNvbnN0IGFsbEFib3ZlUm93czogbnVtYmVyID0gYWJvdmVSb3dzICsgYWJvdmVSb3dQYWRkaW5ncztcblxuICAgIHJldHVybiBzcGFjZUFib3ZlUm93cyArIGFsbEFib3ZlUm93cztcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBhbGwgdGhlIHZhbHVlcyB3ZSBuZWVkIGZvciBkaXNwbGF5aW5nIHRoZSBncmFwaCBvbiBzY3JlZW4uXG4gIGdldERyYXduRGF0YShcbiAgICByb3dTdGFja3M6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApIHtcbiAgICBpZiAocm93U3RhY2tzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YDtcblxuICAgIGNvbnN0IGtleXNJbk9yZGVyOiBJbnRlcm5TZXQ8c3RyaW5nPiA9IGdldEtleU9yZGVyKHJvd1N0YWNrcyk7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkUm93czogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdID1cbiAgICAgIHN0YW5kYXJkaXplUm93U3RhY2tzKHJvd1N0YWNrcywga2V5c0luT3JkZXIpO1xuICAgIGNvbnN0IHJvd3NGb3JEaXNwbGF5OiBSb3dEaXNwbGF5SW5mb1tdID0gc3RhbmRhcmRpemVkUm93cy5tYXAoc3RhY2tEYXRhID0+IHtcbiAgICAgIHJldHVybiBnZXRSb3dEaXNwbGF5SW5mbyhzdGFja0RhdGEpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGRvbWFpbiBzaG91bGQgYmUgdGhlIGhpZ2hlc3QgdG90YWwgdmFsdWUgZnJvbSB0aGUgcm93cy5cbiAgICBjb25zdCBkb21haW5NYXggPSBNYXRoLm1heCgwLCAuLi5yb3dzRm9yRGlzcGxheS5tYXAocm93ID0+IHJvdy5yb3dUb3RhbCkpO1xuICAgIGNvbnN0IHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPiA9IHNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oWzAsIGRvbWFpbk1heF0pXG4gICAgICAucmFuZ2UoW3RoaXMubG9jYXRpb25PZlhBeGlzWmVybygpLCB0aGlzLmxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aCldKTtcblxuICAgIC8vIFNldHVwIGEgbGluZWFyIHNjYWxlIGZvciB0aWNrIGNvdW50IGJhc2VkIG9uIHdpZHRoXG4gICAgY29uc3QgdGlja1NjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbdGhpcy5YX1RJQ0tfTUlOX1dJRFRILCB0aGlzLlhfVElDS19NQVhfV0lEVEhdKVxuICAgICAgLnJhbmdlKFt0aGlzLlhfVElDS19DT1VOVF9NSU4sIHRoaXMuWF9USUNLX0NPVU5UX01BWF0pXG4gICAgICAuY2xhbXAodHJ1ZSk7IC8vIEVuc3VyZXMgdGhlIHNjYWxlIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZGVmaW5lZCByYW5nZVxuXG4gICAgY29uc3QgeHRpY2tDb3VudEFkanVzdGVkID0gTWF0aC5yb3VuZCh0aWNrU2NhbGUod2lkdGgpKTtcbiAgICBjb25zdCB4VGlja3MgPSB4U2NhbGUudGlja3MoeHRpY2tDb3VudEFkanVzdGVkKTtcblxuICAgIGNvbnN0IHJlY3RzOiBSb3dSZWN0YW5nbGVbXSA9IHRoaXMuY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB4U2NhbGUsXG4gICAgKTtcblxuICAgIGNvbnN0IHJvd05hbWVzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dOYW1lc1RvRHJhdyhyb3dzRm9yRGlzcGxheSk7XG4gICAgY29uc3Qgcm93VG90YWxzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dUb3RhbHNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHdpZHRoLFxuICAgICk7XG5cbiAgICBjb25zdCBsZWdlbmRJdGVtcyA9IGdldExlZ2VuZEl0ZW1zKHJvd3NGb3JEaXNwbGF5LCBrZXlzSW5PcmRlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVnZW5kSXRlbXM6IGxlZ2VuZEl0ZW1zLFxuICAgICAgcm93SGVpZ2h0OiB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFKCksXG4gICAgICByZWN0czogcmVjdHMsXG4gICAgICByb3dOYW1lczogcm93TmFtZXNUb0RyYXcsXG4gICAgICByb3dUb3RhbHM6IHJvd1RvdGFsc1RvRHJhdyxcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICB4U2NhbGU6IHhTY2FsZSxcbiAgICAgIHhUaWNrczogeFRpY2tzLFxuICAgIH07XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmb3IgYWxsIHRoZSByZWN0YW5nbGVzIGZvciBhbGwgdGhlIHJvd3NcbiAgY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPixcbiAgKTogUm93UmVjdGFuZ2xlW10ge1xuICAgIGNvbnN0IHJlY3RhbmdsZXM6IFJvd1JlY3RhbmdsZVtdID0gW107XG4gICAgZGlzcGxheVJvd3MuZm9yRWFjaCgoY3VycmVudFJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRSb3cuZWxlbWVudHNCdXRTdGFja2VkLmZvckVhY2goKGN1cnJlbnRFbGVtZW50LCBfKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvcE9mUm93OiBudW1iZXIgPSB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4KTtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVXaWR0aDogbnVtYmVyID1cbiAgICAgICAgICB4U2NhbGUoY3VycmVudEVsZW1lbnQudG9wbGluZSkgLSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVIZWlnaHQ6IG51bWJlciA9IHRoaXMuU0VDVElPTl9IRUlHSFRTLlBFUl9SRUNUQU5HTEUoKTtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVYOiBudW1iZXIgPSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVZOiBudW1iZXIgPVxuICAgICAgICAgIHRvcE9mUm93ICsgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVztcblxuICAgICAgICBjb25zdCBmaWxsID0gYHZhcigke2N1cnJlbnRFbGVtZW50LmNvbG9yVG9rZW59KWA7XG5cbiAgICAgICAgcmVjdGFuZ2xlcy5wdXNoKHtcbiAgICAgICAgICB4OiByZWN0YW5nbGVYLFxuICAgICAgICAgIHk6IHJlY3RhbmdsZVksXG4gICAgICAgICAgd2lkdGg6IHJlY3RhbmdsZVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVjdGFuZ2xlSGVpZ2h0LFxuICAgICAgICAgIGZpbGw6IGZpbGwsXG4gICAgICAgICAgc3RyaXBlZDogY3VycmVudEVsZW1lbnQuc3R5bGUgPT09ICdzdHJpcGVkJyxcbiAgICAgICAgICByb3dOYW1lOiBjdXJyZW50Um93LnJvd05hbWUsXG4gICAgICAgICAgc3RhY2tlZFJvd0VsZW1lbnQ6IGN1cnJlbnRFbGVtZW50LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZWN0YW5nbGVzO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgb24gdGhlIHJvdyBuYW1lcyB3ZSBhcmUgZHJhd2luZ1xuICBnZXRSb3dOYW1lc1RvRHJhdyhkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSk6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgICAvLyBUaGUgcm93IG5hbWUgbG9va3MgcmlnaHQgaWYgaXRzIGJhc2UgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIGFzc29jaWF0ZWQgcmVjdGFuZ2xlXG4gICAgICBjb25zdCByb3dMYWJlbFkgPVxuICAgICAgICB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4KSArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFKCkgLyAyO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogcm93LnJvd05hbWUsXG4gICAgICAgIHg6IHJvd0xhYmVsWCxcbiAgICAgICAgeTogcm93TGFiZWxZLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIG9uIHRoZSByb3cgdG90YWxzIHdlIGFyZSBkcmF3aW5nXG4gIGdldFJvd1RvdGFsc1RvRHJhdyhkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSwgd2lkdGg6IG51bWJlcik6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHdpZHRoIC0gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICAgIC8vIFRoZSByb3cgdG90YWxzIGxvb2tzIHJpZ2h0IGlmIGl0cyBiYXNlIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSBhc3NvY2lhdGVkIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgcm93TGFiZWxZID1cbiAgICAgICAgdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCkgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX0hFSUdIVFMuUEVSX1JFQ1RBTkdMRSgpIC8gMjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHRoaXMudmFsdWVGb3JtYXR0ZXIocm93LnJvd1RvdGFsKSxcbiAgICAgICAgeDogcm93TGFiZWxYLFxuICAgICAgICB5OiByb3dMYWJlbFksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZHJhd0RhdGEkOiBPYnNlcnZhYmxlPFN0YWNrZWRSb3dEcmF3RGF0YSB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5oZWlnaHQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCB3aWR0aCwgaGVpZ2h0XSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RHJhd25EYXRhKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgICAgID8gaGVpZ2h0XG4gICAgICAgICAgOiB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUwgK1xuICAgICAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICtcbiAgICAgICAgICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVyArXG4gICAgICAgICAgICAgICh0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUk9XKCkgK1xuICAgICAgICAgICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLkJFVFdFRU5fUk9XKSAqXG4gICAgICAgICAgICAgICAgaW5wdXQubGVuZ3RoLFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIC8vIExldHMgdXMga25vdyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIHplcm8gZGF0YSBzdGF0ZVxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PiBpbnB1dC5ldmVyeShzdGFjayA9PiBzdGFjay5kYXRhLmxlbmd0aCA9PT0gMCkpLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgLy8gV2hhdCByZWN0YW5nbGUgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRSZWN0YW5nbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgcmVjdGFuZ2xlOiBSb3dSZWN0YW5nbGU7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBXaGF0IGJhbmQgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRCYW5kJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIHJvd05hbWU6IHN0cmluZztcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENyZWF0ZSB0aGUgbWV0cmljIHRvIGRpc3BsYXkgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBob3ZlcmVkIHJlY3RhbmdsZVxuICByZWFkb25seSBjYWxsb3V0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaG92ZXJlZEJhbmQkLCB0aGlzLmRyYXdEYXRhJF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZEJhbmQsIGRyYXdEYXRhXSkgPT4ge1xuICAgICAgaWYgKCFob3ZlcmVkQmFuZCB8fCAhZHJhd0RhdGEpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZEJhbmQuZXZlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHR5cGUgTWV0cmljID0geyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IGRyYXdEYXRhLnJlY3RzXG4gICAgICAgIC5maWx0ZXIocmVjdCA9PiByZWN0LnJvd05hbWUgPT09IGhvdmVyZWRCYW5kLnJvd05hbWUpXG4gICAgICAgIC5tYXAocmVjdCA9PiAoe1xuICAgICAgICAgIGxhYmVsOiByZWN0LnN0YWNrZWRSb3dFbGVtZW50LmxhYmVsLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlRm9ybWF0dGVyKHJlY3Quc3RhY2tlZFJvd0VsZW1lbnQudmFsdWUpLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljcyB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2tlZFJvd0NvbXBvbmVudCB7XG4gIC8vIEEgc3BlY2lmaWNhbGx5IGNvbG9yZWQgc2VjdGlvbiBvZiBvbmUgcm93LlxuICBleHBvcnQgdHlwZSBSb3dFbGVtZW50ID0ge1xuICAgIGxhYmVsOiBzdHJpbmc7IC8vIExlZ2VuZCBlbGVtZW50IG5hbWVcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICBzdHlsZT86ICdzb2xpZCcgfCAnc3RyaXBlZCc7XG4gIH07XG4gIC8vIFRoZSBpbnB1dCB0aGF0IGRldGVybWluZXMgb25lIHJvdy5cbiAgZXhwb3J0IHR5cGUgUm93U3RhY2sgPSB7XG4gICAgcm93TmFtZTogc3RyaW5nO1xuICAgIGRhdGE6IFJvd0VsZW1lbnRbXTtcbiAgfTtcbn1cbiIsIjxkaXYgKm5nSWY9XCIhKGVtcHR5JCB8IGFzeW5jKTsgZWxzZSB6ZXJvU3RhdGVcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRyYXdcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZHJhdy52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIFthdHRyLngxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLngyXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dOYW1lVG9EcmF3IG9mIGRyYXcucm93TmFtZXNcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIHJpdlNWR1RleHRUcnVuY2F0ZVxuICAgICAgICBbdGV4dF09XCJyb3dOYW1lVG9EcmF3LmxhYmVsXCJcbiAgICAgICAgW3dpZHRoXT1cIlNFQ1RJT05fV0lEVEhTLlJPV19OQU1FXCJcbiAgICAgICAgY2xhc3M9XCJyb3ctdGl0bGVcIlxuICAgICAgICBbYXR0ci54XT1cInJvd05hbWVUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93TmFtZVRvRHJhdy55XCJcbiAgICAgID48L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGRyYXcueFRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2tcIlxuICAgICAgICBbYXR0ci54XT1cImRyYXcueFNjYWxlKHRpY2spXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICB3aWR0aD1cIjFcIlxuICAgICAgICBoZWlnaHQ9XCIxMDAlXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cImRyYXcueFNjYWxlKHRpY2spXCJcbiAgICAgICAgW2F0dHIueV09XCJsb2NhdGlvbk9mWEF4aXNUaWNrKClcIlxuICAgICAgICBkeD1cIjRcIlxuICAgICAgICBkeT1cIi00XCJcbiAgICAgID5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGdcbiAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGRyYXcucmVjdHNcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZEJhbmQkLm5leHQoeyByb3dOYW1lOiByZWN0LnJvd05hbWUsIGV2ZW50OiAkZXZlbnQgfSlcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEJhbmQkLm5leHQobnVsbClcIlxuICAgID5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwicm93XCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInJlY3QuZmlsbFwiXG4gICAgICAgIFtjbGFzcy5ibHVycmVkXT1cIlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5yb3dOYW1lICE9PSByZWN0LnJvd05hbWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJvd1RvdGFsVG9EcmF3IG9mIGRyYXcucm93VG90YWxzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInJvdy10b3RhbFwiXG4gICAgICAgIFthdHRyLnhdPVwicm93VG90YWxUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93VG90YWxUb0RyYXcueVwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgID5cbiAgICAgICAge3sgcm93VG90YWxUb0RyYXcubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bGVnZW5kICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCI+XG4gICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZHJhdy5sZWdlbmRJdGVtc1wiXG4gICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICBbY29sb3JUb2tlbl09XCJpdGVtLmNvbG9yVG9rZW5cIlxuICAgICAgW3N0eWxlXT1cIml0ZW0uc3R5bGUgPyBpdGVtLnN0eWxlIDogJ3NvbGlkJ1wiXG4gICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICA8L2xlZ2VuZD5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInYm90dG9tLWNlbnRlcidcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljXCIgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBjYWxsb3V0Lm1ldHJpY3NcIj5cbiAgICAgICAgPGRpdj57eyBtZXRyaWMubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljLXZhbHVlXCI+e3sgbWV0cmljLnZhbHVlIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlIFttZXNzYWdlXT1cInplcm9TdGF0ZU1lc3NhZ2VcIj48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEQsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFLTCxXQUFXLEVBQ1gsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixvQkFBb0IsR0FDckIsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7O0FBUS9CLDZFQUE2RTtBQUM3RSwyQkFBMkI7QUFPM0IsTUFBTSxPQUFPLG1CQUFtQjtJQU5oQztRQU9FLCtFQUErRTtRQUM5RCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQzNDLEVBQUUsQ0FDSCxDQUFDO1FBU0YsNkVBQTZFO1FBQzVELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUt6RCwrRUFBK0U7UUFFeEUsbUJBQWMsR0FBMEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQ3RELHFCQUFxQixDQUN0QixDQUFDO1FBU2Usd0JBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3JELEdBQUcsQ0FB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U0FBUyxHQUFHLENBQUMsQ0FBQztZQUVoQixPQUFPO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hDLENBQUMsRUFBRSxTQUFTO2dCQUNaLENBQUMsRUFBRSxTQUFTO2FBQ2IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0hBdlJVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDJKQ25DaEMsOC9HQWlJQTsyRkQ5RmEsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNOzhCQVFwQyxLQUFLO3NCQURmLEtBQUs7Z0JBZ0JDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBT0ssZ0JBQWdCO3NCQUQxQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEludGVyblNldCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IFNjYWxlTGluZWFyLCBzY2FsZUxpbmVhciB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBSb3dEaXNwbGF5SW5mbyxcbiAgUm93TGFiZWwsXG4gIFJvd1JlY3RhbmdsZSxcbiAgU3RhY2tlZFJvd0RyYXdEYXRhLFxuICBnZXRLZXlPcmRlcixcbiAgZ2V0TGVnZW5kSXRlbXMsXG4gIGdldFJvd0Rpc3BsYXlJbmZvLFxuICBzdGFuZGFyZGl6ZVJvd1N0YWNrcyxcbn0gZnJvbSAnLi9zdGFja2VkLXJvdy5oZWxwZXJzJztcblxudHlwZSBDYWxsb3V0TWV0cmljID0ge1xuICByb3dOYW1lOiBzdHJpbmc7XG4gIGVsZW1lbnRMYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufTtcblxuLy8gVE9ETzogb25jZSB3ZSB1cGdyYWRlIHRvIEFuZ3VsYXIgMTYsIHRoaXMgY29tcG9uZW50IGNhbiBiZSBjbGVhbmVkIHVwIHdpdGhcbi8vIHNpZ25hbHMgaW5zdGVhZCBvZiBSeEpTLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LXN0YWNrZWQtcm93JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3RhY2tlZC1yb3cuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3RhY2tlZFJvd0NvbXBvbmVudCB7XG4gIC8vIFRoaXMgaXMgdGhlIGxpc3Qgb2Ygcm93cyB3ZSB3aWxsIGRpc3BsYXksIGluIHRoZSBvcmRlciB3ZSB3aWxsIGRpc3BsYXkgdGhlbS5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXT4oXG4gICAgW10sXG4gICk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW5wdXQodjogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdKSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0KCk6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQkLmdldFZhbHVlKCk7XG4gIH1cblxuICAvLyBXaWR0aCBoZWxwcyBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHZpZXdib3ggdGhpcyBncmFwaCBpcyBkaXNwbGF5aW5nIGluLlxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIHNldCB3aWR0aCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoJC5uZXh0KHYpO1xuICB9XG5cbiAgLy8gVmFsdWVGb3JtYXR0ZXIgZGV0ZXJtaW5lcyBob3cgd2Ugc3R5bGUgdGhlIHZhbHVlcyBpbiBhIG1ldHJpYyBhbmQgdGhlIHgtYXhpc1xuICBASW5wdXQoKVxuICBwdWJsaWMgdmFsdWVGb3JtYXR0ZXI6ICh2OiBudW1iZXIpID0+IHN0cmluZyA9IHYgPT4gdi50b1N0cmluZygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgemVyb1N0YXRlTWVzc2FnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oXG4gICAgJ05vIGRhdGEgdG8gZGlzcGxheS4nLFxuICApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHplcm9TdGF0ZU1lc3NhZ2Uodjogc3RyaW5nKSB7XG4gICAgdGhpcy56ZXJvU3RhdGVNZXNzYWdlJC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgemVyb1N0YXRlTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnplcm9TdGF0ZU1lc3NhZ2UkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0QW5kUm93SGVpZ2h0cyQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PiB7XG4gICAgICBjb25zdCBoZWlnaHRXaXRob3V0Um93cyA9XG4gICAgICAgIGlucHV0Lmxlbmd0aCAqIHRoaXMuU0VDVElPTl9QQURESU5HLkJFVFdFRU5fUk9XICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfVE9QX0JPVFRPTSAqIDIgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUw7XG5cbiAgICAgIC8vIFRoZSBjb21iaW5lZCBoZWlnaHQgb2YgYWxsIHJvd3MgYXQgdGhlaXIgbWluL21heFxuICAgICAgY29uc3QgbWluSGVpZ2h0ID1cbiAgICAgICAgaW5wdXQubGVuZ3RoICogdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NSU5fSEVJR0hUICsgaGVpZ2h0V2l0aG91dFJvd3M7XG4gICAgICBjb25zdCBtYXhIZWlnaHQgPVxuICAgICAgICBpbnB1dC5sZW5ndGggKiB0aGlzLlJFQ1RBTkdMRV9IRUlHSFRTLk1BWF9IRUlHSFQgKyBoZWlnaHRXaXRob3V0Um93cztcblxuICAgICAgLy8gSWYgdGhlIG1heC1zaXplZCByb3dzIGRvbid0IG5lZWQgdGhlIHRhcmdldCBzaXplLCBzaHJpbmsgdGhlIGNoYXJ0XG4gICAgICBpZiAobWF4SGVpZ2h0IDwgdGhpcy5UQVJHRVRfSEVJR0hUKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoYXJ0SGVpZ2h0OiBtYXhIZWlnaHQsXG4gICAgICAgICAgcm93SGVpZ2h0OiB0aGlzLlJFQ1RBTkdMRV9IRUlHSFRTLk1BWF9IRUlHSFQsXG4gICAgICAgIH07XG4gICAgICAvLyBJZiB0aGUgbWluLXNpemVkIHJvd3MgbmVlZCBtb3JlIHRoYW4gdGhlIHRhcmdldCBzaXplLCBncm93IHRoZSBjaGFydFxuICAgICAgaWYgKG1pbkhlaWdodCA+IHRoaXMuVEFSR0VUX0hFSUdIVClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGFydEhlaWdodDogbWluSGVpZ2h0LFxuICAgICAgICAgIHJvd0hlaWdodDogdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NSU5fSEVJR0hULFxuICAgICAgICB9O1xuICAgICAgLy8gT3RoZXJ3aXNlIHNocmluayB0aGUgcm93cyB0byBmaXQgdGhlIHRhcmdldCBzaXplXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGFydEhlaWdodDogdGhpcy5UQVJHRVRfSEVJR0hULFxuICAgICAgICByb3dIZWlnaHQ6ICh0aGlzLlRBUkdFVF9IRUlHSFQgLSBoZWlnaHRXaXRob3V0Um93cykgLyBpbnB1dC5sZW5ndGgsXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xuXG4gIC8qXG4gICAgVGhlIGxheW91dCB3ZSBhcmUgc2hvb3RpbmcgZm9yIGlzOlxuXG4gICAgICAgICAgICAgIHwgICBYIEF4aXMgTGFiZWxzICB8XG4gICAgUm93IE5hbWUgIHwgICBSZWN0YW5nbGVzICAgICB8ICAgVG90YWxzXG4gICovXG4gIHJlYWRvbmx5IFRBUkdFVF9IRUlHSFQgPSAzMDA7XG5cbiAgcmVhZG9ubHkgUkVDVEFOR0xFX0hFSUdIVFMgPSB7XG4gICAgTUlOX0hFSUdIVDogMTIsIC8vIFNldHMgdGhlIHNtYWxsZXN0IHNpemUgYSByb3cgY2FuIHNocmluayB0b1xuICAgIE1BWF9IRUlHSFQ6IDQyLCAvLyBTZXRzIHRoZSBsYXJnZXN0IHNpemUgYSByb3cgY2FuIGV4cGFuZCB0b1xuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fSEVJR0hUUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHgtYXhpcyBsYWJlbHNcbiAgICBYX0FYSVNfTEFCRUw6IDE0LFxuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fV0lEVEhTID0ge1xuICAgIC8vIFNwYWNlIHJlc2VydmVkIGZvciB0aGUgbmFtZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHJvd1xuICAgIFJPV19OQU1FOiAxMDAsXG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSB0b3RhbHMgYXQgdGhlIGVuZCBvZiB0aGUgcm93XG4gICAgUk9XX1RPVEFMX0xBQkVMOiA3MixcbiAgfTtcblxuICByZWFkb25seSBTRUNUSU9OX1BBRERJTkcgPSB7XG4gICAgLy8gUGFkZGluZyBiZXR3ZWVuIGVhY2ggZWRnZSBvZiB0aGUgdmlld2JveCBhbmQgdGhlIGNvbnRlbnRcbiAgICBPVVRFUl9UT1BfQk9UVE9NOiA0LFxuICAgIE9VVEVSX0xFRlRfUklHSFQ6IDQsXG4gICAgLy8gUGFkZGluZyBiZXR3ZWVuIHRoZSBib3R0b20gb2Ygb25lIHJvdyBhbmQgdGhlIHRvcCBvZiB0aGUgbmV4dCByb3dcbiAgICBCRVRXRUVOX1JPVzogNCxcbiAgICAvLyBTcGFjZSBiZXR3ZWVuIHRoZSByb3cgYW5kIHRoZSB0b3Agb2YgYSByZWN0YW5nbGUgaW4gdGhhdCByb3dcbiAgICBSRUNUQU5HTEVfVE9fUk9XOiA2LFxuICB9O1xuXG4gIC8vIFRoZSBudW1iZXIgb2YgWC1heGlzIHNlZ21lbnRzIHRvIGNyZWF0ZSwgd2l0aCBsYWJlbHMgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2VnbWVudC5cbiAgcmVhZG9ubHkgWF9USUNLX0NPVU5UX01BWCA9IDg7XG4gIHJlYWRvbmx5IFhfVElDS19DT1VOVF9NSU4gPSAzO1xuICByZWFkb25seSBYX1RJQ0tfTUFYX1dJRFRIID0gOTAwO1xuICByZWFkb25seSBYX1RJQ0tfTUlOX1dJRFRIID0gNDAwO1xuXG4gIC8vIFplcm8gb24gdGhlIFggYXhpcyBpcyBhZnRlciB0aGUgbGVmdCBwYWRkaW5nIGFuZCB0aGUgcm93IG5hbWUuXG4gIGxvY2F0aW9uT2ZYQXhpc1plcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQgKyB0aGlzLlNFQ1RJT05fV0lEVEhTLlJPV19OQU1FO1xuICB9XG4gIC8vIFRoZSBlbmQgb2YgdGhlIFggYXhpcyBpcyByaWdodCBiZWZvcmUgdGhlIHJvdyB0b3RhbCBhbmQgdGhlIHJpZ2h0IHBhZGRpbmcuXG4gIGxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3BhY2VPblJpZ2h0OiBudW1iZXIgPVxuICAgICAgdGhpcy5TRUNUSU9OX1dJRFRIUy5ST1dfVE9UQUxfTEFCRUwgK1xuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICByZXR1cm4gd2lkdGggLSBzcGFjZU9uUmlnaHQ7XG4gIH1cbiAgLy8gVGhlIHktaW5kZXggb2YgdGhlIHgtYXhpcyB0aWNrc1xuICBsb2NhdGlvbk9mWEF4aXNUaWNrKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICsgdGhpcy5TRUNUSU9OX0hFSUdIVFMuWF9BWElTX0xBQkVMXG4gICAgKTtcbiAgfVxuICAvLyBUaGUgeS1pbmRleCBvZiB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IHJvd1xuICBnZXRUb3BPZlJvdyhyb3dJbmRleDogbnVtYmVyLCByb3dIZWlnaHQ6IG51bWJlcikge1xuICAgIGNvbnN0IHNwYWNlQWJvdmVSb3dzOiBudW1iZXIgPVxuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfVE9QX0JPVFRPTSArIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTDtcblxuICAgIGNvbnN0IGFib3ZlUm93czogbnVtYmVyID0gcm93SW5kZXggKiByb3dIZWlnaHQ7XG4gICAgY29uc3QgYWJvdmVSb3dQYWRkaW5nczogbnVtYmVyID1cbiAgICAgIHJvd0luZGV4ICogdGhpcy5TRUNUSU9OX1BBRERJTkcuQkVUV0VFTl9ST1c7XG4gICAgY29uc3QgYWxsQWJvdmVSb3dzOiBudW1iZXIgPSBhYm92ZVJvd3MgKyBhYm92ZVJvd1BhZGRpbmdzO1xuXG4gICAgcmV0dXJuIHNwYWNlQWJvdmVSb3dzICsgYWxsQWJvdmVSb3dzO1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIGFsbCB0aGUgdmFsdWVzIHdlIG5lZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGdyYXBoIG9uIHNjcmVlbi5cbiAgZ2V0RHJhd25EYXRhKFxuICAgIHJvd1N0YWNrczogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgY2hhcnRIZWlnaHQ6IG51bWJlcixcbiAgICByb3dIZWlnaHQ6IG51bWJlcixcbiAgKSB7XG4gICAgaWYgKHJvd1N0YWNrcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdCb3ggPSBgMCAwICR7d2lkdGh9ICR7Y2hhcnRIZWlnaHR9YDtcblxuICAgIGNvbnN0IGtleXNJbk9yZGVyOiBJbnRlcm5TZXQ8c3RyaW5nPiA9IGdldEtleU9yZGVyKHJvd1N0YWNrcyk7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkUm93czogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdID1cbiAgICAgIHN0YW5kYXJkaXplUm93U3RhY2tzKHJvd1N0YWNrcywga2V5c0luT3JkZXIpO1xuICAgIGNvbnN0IHJvd3NGb3JEaXNwbGF5OiBSb3dEaXNwbGF5SW5mb1tdID0gc3RhbmRhcmRpemVkUm93cy5tYXAoc3RhY2tEYXRhID0+IHtcbiAgICAgIHJldHVybiBnZXRSb3dEaXNwbGF5SW5mbyhzdGFja0RhdGEpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGRvbWFpbiBzaG91bGQgYmUgdGhlIGhpZ2hlc3QgdG90YWwgdmFsdWUgZnJvbSB0aGUgcm93cy5cbiAgICBjb25zdCBkb21haW5NYXggPSBNYXRoLm1heCgwLCAuLi5yb3dzRm9yRGlzcGxheS5tYXAocm93ID0+IHJvdy5yb3dUb3RhbCkpO1xuICAgIGNvbnN0IHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPiA9IHNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oWzAsIGRvbWFpbk1heF0pXG4gICAgICAucmFuZ2UoW3RoaXMubG9jYXRpb25PZlhBeGlzWmVybygpLCB0aGlzLmxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aCldKTtcblxuICAgIC8vIFNldHVwIGEgbGluZWFyIHNjYWxlIGZvciB0aWNrIGNvdW50IGJhc2VkIG9uIHdpZHRoXG4gICAgY29uc3QgdGlja1NjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbdGhpcy5YX1RJQ0tfTUlOX1dJRFRILCB0aGlzLlhfVElDS19NQVhfV0lEVEhdKVxuICAgICAgLnJhbmdlKFt0aGlzLlhfVElDS19DT1VOVF9NSU4sIHRoaXMuWF9USUNLX0NPVU5UX01BWF0pXG4gICAgICAuY2xhbXAodHJ1ZSk7IC8vIEVuc3VyZXMgdGhlIHNjYWxlIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZGVmaW5lZCByYW5nZVxuXG4gICAgY29uc3QgeHRpY2tDb3VudEFkanVzdGVkID0gTWF0aC5yb3VuZCh0aWNrU2NhbGUod2lkdGgpKTtcbiAgICBjb25zdCB4VGlja3MgPSB4U2NhbGUudGlja3MoeHRpY2tDb3VudEFkanVzdGVkKTtcblxuICAgIGNvbnN0IHJlY3RzOiBSb3dSZWN0YW5nbGVbXSA9IHRoaXMuY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB4U2NhbGUsXG4gICAgICByb3dIZWlnaHQsXG4gICAgKTtcblxuICAgIGNvbnN0IHJvd05hbWVzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dOYW1lc1RvRHJhdyhcbiAgICAgIHJvd3NGb3JEaXNwbGF5LFxuICAgICAgcm93SGVpZ2h0LFxuICAgICk7XG4gICAgY29uc3Qgcm93VG90YWxzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dUb3RhbHNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHdpZHRoLFxuICAgICAgcm93SGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCBsZWdlbmRJdGVtcyA9IGdldExlZ2VuZEl0ZW1zKHJvd3NGb3JEaXNwbGF5LCBrZXlzSW5PcmRlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVnZW5kSXRlbXM6IGxlZ2VuZEl0ZW1zLFxuICAgICAgcm93SGVpZ2h0OiByb3dIZWlnaHQsXG4gICAgICByZWN0czogcmVjdHMsXG4gICAgICByb3dOYW1lczogcm93TmFtZXNUb0RyYXcsXG4gICAgICByb3dUb3RhbHM6IHJvd1RvdGFsc1RvRHJhdyxcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICB4U2NhbGU6IHhTY2FsZSxcbiAgICAgIHhUaWNrczogeFRpY2tzLFxuICAgIH07XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmb3IgYWxsIHRoZSByZWN0YW5nbGVzIGZvciBhbGwgdGhlIHJvd3NcbiAgY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPixcbiAgICByb3dIZWlnaHQ6IG51bWJlcixcbiAgKTogUm93UmVjdGFuZ2xlW10ge1xuICAgIGNvbnN0IHJlY3RhbmdsZXM6IFJvd1JlY3RhbmdsZVtdID0gW107XG4gICAgZGlzcGxheVJvd3MuZm9yRWFjaCgoY3VycmVudFJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRSb3cuZWxlbWVudHNCdXRTdGFja2VkLmZvckVhY2goKGN1cnJlbnRFbGVtZW50LCBfKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvcE9mUm93OiBudW1iZXIgPSB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4LCByb3dIZWlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVdpZHRoOiBudW1iZXIgPVxuICAgICAgICAgIHhTY2FsZShjdXJyZW50RWxlbWVudC50b3BsaW5lKSAtIHhTY2FsZShjdXJyZW50RWxlbWVudC5iYXNlbGluZSk7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZUhlaWdodDogbnVtYmVyID0gcm93SGVpZ2h0O1xuXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVg6IG51bWJlciA9IHhTY2FsZShjdXJyZW50RWxlbWVudC5iYXNlbGluZSk7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVk6IG51bWJlciA9XG4gICAgICAgICAgdG9wT2ZSb3cgKyB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XO1xuXG4gICAgICAgIGNvbnN0IGZpbGwgPSBgdmFyKCR7Y3VycmVudEVsZW1lbnQuY29sb3JUb2tlbn0pYDtcblxuICAgICAgICByZWN0YW5nbGVzLnB1c2goe1xuICAgICAgICAgIHg6IHJlY3RhbmdsZVgsXG4gICAgICAgICAgeTogcmVjdGFuZ2xlWSxcbiAgICAgICAgICB3aWR0aDogTWF0aC5tYXgocmVjdGFuZ2xlV2lkdGgsIDApLFxuICAgICAgICAgIGhlaWdodDogcmVjdGFuZ2xlSGVpZ2h0LFxuICAgICAgICAgIGZpbGw6IGZpbGwsXG4gICAgICAgICAgc3RyaXBlZDogY3VycmVudEVsZW1lbnQuc3R5bGUgPT09ICdzdHJpcGVkJyxcbiAgICAgICAgICByb3dOYW1lOiBjdXJyZW50Um93LnJvd05hbWUsXG4gICAgICAgICAgc3RhY2tlZFJvd0VsZW1lbnQ6IGN1cnJlbnRFbGVtZW50LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZWN0YW5nbGVzO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgb24gdGhlIHJvdyBuYW1lcyB3ZSBhcmUgZHJhd2luZ1xuICBnZXRSb3dOYW1lc1RvRHJhdyhcbiAgICBkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSxcbiAgICByb3dIZWlnaHQ6IG51bWJlcixcbiAgKTogUm93TGFiZWxbXSB7XG4gICAgcmV0dXJuIGRpc3BsYXlSb3dzLm1hcCgocm93LCByb3dJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgcm93TGFiZWxYID0gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICAgIC8vIFRoZSByb3cgbmFtZSBsb29rcyByaWdodCBpZiBpdHMgYmFzZSBpcyBhdCB0aGUgYmFzZSBvZiB0aGUgYXNzb2NpYXRlZCByZWN0YW5nbGVcbiAgICAgIGNvbnN0IHJvd0xhYmVsWSA9XG4gICAgICAgIHRoaXMuZ2V0VG9wT2ZSb3cocm93SW5kZXgsIHJvd0hlaWdodCkgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XICtcbiAgICAgICAgcm93SGVpZ2h0IC8gMjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHJvdy5yb3dOYW1lLFxuICAgICAgICB4OiByb3dMYWJlbFgsXG4gICAgICAgIHk6IHJvd0xhYmVsWSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBvbiB0aGUgcm93IHRvdGFscyB3ZSBhcmUgZHJhd2luZ1xuICBnZXRSb3dUb3RhbHNUb0RyYXcoXG4gICAgZGlzcGxheVJvd3M6IFJvd0Rpc3BsYXlJbmZvW10sXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICByb3dIZWlnaHQ6IG51bWJlcixcbiAgKTogUm93TGFiZWxbXSB7XG4gICAgcmV0dXJuIGRpc3BsYXlSb3dzLm1hcCgocm93LCByb3dJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgcm93TGFiZWxYID0gd2lkdGggLSB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUO1xuICAgICAgLy8gVGhlIHJvdyB0b3RhbHMgbG9va3MgcmlnaHQgaWYgaXRzIGJhc2UgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIGFzc29jaWF0ZWQgcmVjdGFuZ2xlXG4gICAgICBjb25zdCByb3dMYWJlbFkgPVxuICAgICAgICB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4LCByb3dIZWlnaHQpICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVyArXG4gICAgICAgIHJvd0hlaWdodCAvIDI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiB0aGlzLnZhbHVlRm9ybWF0dGVyKHJvdy5yb3dUb3RhbCksXG4gICAgICAgIHg6IHJvd0xhYmVsWCxcbiAgICAgICAgeTogcm93TGFiZWxZLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRvbmx5IGRyYXdEYXRhJDogT2JzZXJ2YWJsZTxTdGFja2VkUm93RHJhd0RhdGEgfCBudWxsPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuaW5wdXQkLFxuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuY2hhcnRBbmRSb3dIZWlnaHRzJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgd2lkdGgsIGhlaWdodF0pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldERyYXduRGF0YShcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQuY2hhcnRIZWlnaHQsXG4gICAgICAgIGhlaWdodC5yb3dIZWlnaHQsXG4gICAgICApO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgLy8gTGV0cyB1cyBrbm93IHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgemVybyBkYXRhIHN0YXRlXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+IGlucHV0LmV2ZXJ5KHN0YWNrID0+IHN0YWNrLmRhdGEubGVuZ3RoID09PSAwKSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICAvLyBXaGF0IHJlY3RhbmdsZSB3ZSBhcmUgY3VycmVudGx5IGhvdmVyaW5nIG92ZXJcbiAgcmVhZG9ubHkgaG92ZXJlZFJlY3RhbmdsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICByZWN0YW5nbGU6IFJvd1JlY3RhbmdsZTtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFdoYXQgYmFuZCB3ZSBhcmUgY3VycmVudGx5IGhvdmVyaW5nIG92ZXJcbiAgcmVhZG9ubHkgaG92ZXJlZEJhbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgcm93TmFtZTogc3RyaW5nO1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50O1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBtZXRyaWMgdG8gZGlzcGxheSBiYXNlZCBvbiB0aGUgY3VycmVudGx5IGhvdmVyZWQgcmVjdGFuZ2xlXG4gIHJlYWRvbmx5IGNhbGxvdXQkID0gY29tYmluZUxhdGVzdChbdGhpcy5ob3ZlcmVkQmFuZCQsIHRoaXMuZHJhd0RhdGEkXSkucGlwZShcbiAgICBtYXAoKFtob3ZlcmVkQmFuZCwgZHJhd0RhdGFdKSA9PiB7XG4gICAgICBpZiAoIWhvdmVyZWRCYW5kIHx8ICFkcmF3RGF0YSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBob3ZlcmVkQmFuZC5ldmVudDtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGFuY2hvciA9ICg8U1ZHUmVjdEVsZW1lbnQ+dGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdHlwZSBNZXRyaWMgPSB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfTtcbiAgICAgIGNvbnN0IG1ldHJpY3M6IE1ldHJpY1tdID0gZHJhd0RhdGEucmVjdHNcbiAgICAgICAgLmZpbHRlcihyZWN0ID0+IHJlY3Qucm93TmFtZSA9PT0gaG92ZXJlZEJhbmQucm93TmFtZSlcbiAgICAgICAgLm1hcChyZWN0ID0+ICh7XG4gICAgICAgICAgbGFiZWw6IHJlY3Quc3RhY2tlZFJvd0VsZW1lbnQubGFiZWwsXG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVGb3JtYXR0ZXIocmVjdC5zdGFja2VkUm93RWxlbWVudC52YWx1ZSksXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHsgYW5jaG9yLCBtZXRyaWNzIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gQSBzcGVjaWZpY2FsbHkgY29sb3JlZCBzZWN0aW9uIG9mIG9uZSByb3cuXG4gIGV4cG9ydCB0eXBlIFJvd0VsZW1lbnQgPSB7XG4gICAgbGFiZWw6IHN0cmluZzsgLy8gTGVnZW5kIGVsZW1lbnQgbmFtZVxuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgY29sb3JUb2tlbjogc3RyaW5nO1xuICAgIHN0eWxlPzogJ3NvbGlkJyB8ICdzdHJpcGVkJztcbiAgfTtcbiAgLy8gVGhlIGlucHV0IHRoYXQgZGV0ZXJtaW5lcyBvbmUgcm93LlxuICBleHBvcnQgdHlwZSBSb3dTdGFjayA9IHtcbiAgICByb3dOYW1lOiBzdHJpbmc7XG4gICAgZGF0YTogUm93RWxlbWVudFtdO1xuICB9O1xufVxuIiwiPGRpdlxuICAqbmdJZj1cIiEoZW1wdHkkIHwgYXN5bmMpOyBlbHNlIHplcm9TdGF0ZVwiXG4gIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgKHJpdkNsaWVudFNpemUpPVwid2lkdGggPSAkZXZlbnQud2lkdGhcIlxuPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRyYXdcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZHJhdy52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIFthdHRyLngxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLngyXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dOYW1lVG9EcmF3IG9mIGRyYXcucm93TmFtZXNcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIHJpdlNWR1RleHRUcnVuY2F0ZVxuICAgICAgICBbdGV4dF09XCJyb3dOYW1lVG9EcmF3LmxhYmVsXCJcbiAgICAgICAgW3dpZHRoXT1cIlNFQ1RJT05fV0lEVEhTLlJPV19OQU1FXCJcbiAgICAgICAgY2xhc3M9XCJyb3ctdGl0bGVcIlxuICAgICAgICBbYXR0ci54XT1cInJvd05hbWVUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93TmFtZVRvRHJhdy55XCJcbiAgICAgID48L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGRyYXcueFRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2tcIlxuICAgICAgICBbYXR0ci54XT1cImRyYXcueFNjYWxlKHRpY2spXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICB3aWR0aD1cIjFcIlxuICAgICAgICBoZWlnaHQ9XCIxMDAlXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cImRyYXcueFNjYWxlKHRpY2spXCJcbiAgICAgICAgW2F0dHIueV09XCJsb2NhdGlvbk9mWEF4aXNUaWNrKClcIlxuICAgICAgICBkeD1cIjRcIlxuICAgICAgICBkeT1cIi00XCJcbiAgICAgID5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGdcbiAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGRyYXcucmVjdHNcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZEJhbmQkLm5leHQoeyByb3dOYW1lOiByZWN0LnJvd05hbWUsIGV2ZW50OiAkZXZlbnQgfSlcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEJhbmQkLm5leHQobnVsbClcIlxuICAgID5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwicm93XCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInJlY3QuZmlsbFwiXG4gICAgICAgIFtjbGFzcy5ibHVycmVkXT1cIlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5yb3dOYW1lICE9PSByZWN0LnJvd05hbWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJvd1RvdGFsVG9EcmF3IG9mIGRyYXcucm93VG90YWxzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInJvdy10b3RhbFwiXG4gICAgICAgIFthdHRyLnhdPVwicm93VG90YWxUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93VG90YWxUb0RyYXcueVwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgID5cbiAgICAgICAge3sgcm93VG90YWxUb0RyYXcubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bGVnZW5kICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCI+XG4gICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZHJhdy5sZWdlbmRJdGVtc1wiXG4gICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICBbY29sb3JUb2tlbl09XCJpdGVtLmNvbG9yVG9rZW5cIlxuICAgICAgW3N0eWxlXT1cIml0ZW0uc3R5bGUgPyBpdGVtLnN0eWxlIDogJ3NvbGlkJ1wiXG4gICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICA8L2xlZ2VuZD5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInYm90dG9tLWNlbnRlcidcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljXCIgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBjYWxsb3V0Lm1ldHJpY3NcIj5cbiAgICAgICAgPGRpdj57eyBtZXRyaWMubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljLXZhbHVlXCI+e3sgbWV0cmljLnZhbHVlIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlIFttZXNzYWdlXT1cInplcm9TdGF0ZU1lc3NhZ2VcIj48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|