@guiexpert/table 0.0.1 → 0.0.2
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/index.mjs +26 -20
- package/esm2020/lib/table/checkbox/tree-checkbox-model.mjs +2 -2
- package/esm2020/lib/table/data/common/args-adjust-columns-to-row-parent-params.mjs +1 -1
- package/esm2020/lib/table/data/options/auto-restore-options.if.mjs +1 -1
- package/esm2020/lib/table/data/options/table-options.if.mjs +1 -1
- package/esm2020/lib/table/data/options/table-options.mjs +7 -8
- package/esm2020/lib/table/data/options/tree-options.mjs +2 -2
- package/esm2020/lib/table/data/tablemodel/area-ident.type.mjs +6 -6
- package/esm2020/lib/table/data/tablemodel/areamodel/abstract-area-model.mjs +22 -22
- package/esm2020/lib/table/data/tablemodel/areamodel/area-model-array-array.mjs +3 -3
- package/esm2020/lib/table/data/tablemodel/areamodel/area-model-hidden.mjs +25 -21
- package/esm2020/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.mjs +2 -2
- package/esm2020/lib/table/data/tablemodel/areamodel/area-model-object-array.mjs +8 -8
- package/esm2020/lib/table/data/tablemodel/areamodel/area-model-tree.mjs +13 -13
- package/esm2020/lib/table/data/tablemodel/areamodel/area-model.if.mjs +1 -1
- package/esm2020/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.mjs +1 -1
- package/esm2020/lib/table/data/tablemodel/column/column-def.if.mjs +1 -1
- package/esm2020/lib/table/data/tablemodel/column/column-def.mjs +3 -3
- package/esm2020/lib/table/data/tablemodel/table-model.if.mjs +1 -1
- package/esm2020/lib/table/data/tablemodel/table-model.mjs +24 -18
- package/esm2020/lib/table/event-adapter.mjs +17 -0
- package/esm2020/lib/table/mouse-handler.mjs +1 -7
- package/esm2020/lib/table/render-scope.mjs +164 -144
- package/esm2020/lib/table/renderer/cell-render.if.mjs +1 -1
- package/esm2020/lib/table/renderer/checkbox-cell-renderer.mjs +2 -2
- package/esm2020/lib/table/renderer/date-to-int-date-cell-renderer.mjs +2 -2
- package/esm2020/lib/table/renderer/date-to-iso-cell-renderer.mjs +2 -2
- package/esm2020/lib/table/renderer/date-to-locale-date-cell-renderer.mjs +2 -2
- package/esm2020/lib/table/renderer/date-to-tec-cell-renderer.mjs +12 -0
- package/esm2020/lib/table/renderer/edit/input-cell-renderer.mjs +2 -2
- package/esm2020/lib/table/renderer/edit/select-cell-renderer.mjs +2 -2
- package/esm2020/lib/table/renderer/male-female-to-icon-cell-renderer.mjs +2 -2
- package/esm2020/lib/table/renderer/number-cell-renderer.mjs +2 -2
- package/esm2020/lib/table/renderer/true-false-cell-renderer.mjs +15 -0
- package/esm2020/lib/table/service/convenience-dom.service.mjs +32 -24
- package/esm2020/lib/table/service/simple-dom-service.mjs +34 -0
- package/esm2020/lib/table/table-api.mjs +7 -7
- package/esm2020/lib/table/table-model-factory.mjs +6 -7
- package/esm2020/lib/table/table-scope.mjs +61 -55
- package/index.d.ts +25 -21
- package/lib/table/action/action-id.type.d.ts +1 -1
- package/lib/table/action/shortcut-actionid-mapping.type.d.ts +1 -1
- package/lib/table/checkbox/tree-checkbox-model.d.ts +1 -1
- package/lib/table/data/common/area-map.type.d.ts +1 -1
- package/lib/table/data/common/args-adjust-columns-to-row-parent-params.d.ts +0 -1
- package/lib/table/data/common/boolean-function.d.ts +1 -1
- package/lib/table/data/common/checked-type.d.ts +1 -1
- package/lib/table/data/common/filter-function.d.ts +1 -1
- package/lib/table/data/common/get-t.d.ts +1 -1
- package/lib/table/data/common/sort-state.type.d.ts +1 -1
- package/lib/table/data/common/tree-arrow.type.d.ts +1 -1
- package/lib/table/data/div-scope.type.d.ts +1 -1
- package/lib/table/data/options/auto-restore-options.if.d.ts +6 -3
- package/lib/table/data/options/table-options.d.ts +5 -6
- package/lib/table/data/options/table-options.if.d.ts +5 -6
- package/lib/table/data/side-ident.type.d.ts +1 -1
- package/lib/table/data/tablemodel/area-ident.type.d.ts +1 -1
- package/lib/table/data/tablemodel/areamodel/abstract-area-model.d.ts +12 -12
- package/lib/table/data/tablemodel/areamodel/area-model-array-array.d.ts +4 -4
- package/lib/table/data/tablemodel/areamodel/area-model-hidden.d.ts +23 -18
- package/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.d.ts +2 -2
- package/lib/table/data/tablemodel/areamodel/area-model-object-array.d.ts +4 -4
- package/lib/table/data/tablemodel/areamodel/area-model-tree.d.ts +4 -4
- package/lib/table/data/tablemodel/areamodel/area-model.if.d.ts +114 -1
- package/lib/table/data/tablemodel/column/column-def.d.ts +3 -3
- package/lib/table/data/tablemodel/table-model.d.ts +1 -0
- package/lib/table/data/tablemodel/table-model.if.d.ts +1 -0
- package/lib/table/event-adapter.d.ts +12 -0
- package/lib/table/focus/focus.type.d.ts +1 -1
- package/lib/table/mouse-handler.d.ts +0 -2
- package/lib/table/render-scope.d.ts +11 -6
- package/lib/table/renderer/cell-render.if.d.ts +1 -1
- package/lib/table/renderer/checkbox-cell-renderer.d.ts +1 -1
- package/lib/table/renderer/date-to-int-date-cell-renderer.d.ts +1 -1
- package/lib/table/renderer/date-to-iso-cell-renderer.d.ts +1 -1
- package/lib/table/renderer/date-to-locale-date-cell-renderer.d.ts +1 -1
- package/lib/table/renderer/date-to-tec-cell-renderer.d.ts +8 -0
- package/lib/table/renderer/edit/edit-cell-renderer.type.d.ts +1 -1
- package/lib/table/renderer/edit/input-cell-renderer.d.ts +1 -1
- package/lib/table/renderer/edit/select-cell-renderer.d.ts +1 -1
- package/lib/table/renderer/male-female-to-icon-cell-renderer.d.ts +1 -1
- package/lib/table/renderer/number-cell-renderer.d.ts +1 -1
- package/lib/table/renderer/renderer-cleanup-fn.type.d.ts +1 -1
- package/lib/table/renderer/true-false-cell-renderer.d.ts +8 -0
- package/lib/table/selection/selection.type.d.ts +2 -2
- package/lib/table/service/convenience-dom.service.d.ts +3 -1
- package/lib/table/service/data/html-style.type.d.ts +1 -1
- package/lib/table/service/simple-dom-service.d.ts +10 -0
- package/lib/table/table-api.d.ts +6 -6
- package/lib/table/table-model-factory.d.ts +1 -2
- package/lib/table/table-scope.d.ts +3 -2
- package/package.json +2 -3
|
@@ -3,6 +3,7 @@ import { TreeRow } from "./data/common/tree-row";
|
|
|
3
3
|
import { AreaModelTree } from "./data/tablemodel/areamodel/area-model-tree";
|
|
4
4
|
import { GeoData } from "./data/geo-data";
|
|
5
5
|
import { ColAndRowspanModel } from "./data/tablemodel/areamodel/col-and-rowspan-model";
|
|
6
|
+
import { AreaObjectMap } from "./data/common/area-map";
|
|
6
7
|
export class RenderScope extends EleScope {
|
|
7
8
|
constructor(hostElement, tableModel, dom, tableOptions) {
|
|
8
9
|
super(hostElement, tableModel, dom, tableOptions);
|
|
@@ -13,23 +14,28 @@ export class RenderScope extends EleScope {
|
|
|
13
14
|
this.cleanupFunctions = {
|
|
14
15
|
header: [],
|
|
15
16
|
body: [],
|
|
16
|
-
footer: []
|
|
17
|
+
footer: []
|
|
17
18
|
};
|
|
18
19
|
this.tree = false;
|
|
19
20
|
this.rangeEles = [];
|
|
21
|
+
this.colAndRowspanModels = new AreaObjectMap();
|
|
20
22
|
this.firstVisibleRowIndex = -1;
|
|
21
23
|
this.draggingTargetColumnIndex = -1;
|
|
24
|
+
this.removables = [];
|
|
22
25
|
if (this.tableOptions?.getSelectionModel) {
|
|
23
26
|
this.getSelectionModel = this.tableOptions.getSelectionModel;
|
|
24
27
|
}
|
|
25
28
|
if (this.tableOptions?.getFocusModel) {
|
|
26
29
|
this.getFocusModel = this.tableOptions.getFocusModel;
|
|
27
30
|
}
|
|
28
|
-
if (tableModel.getAreaModel(
|
|
31
|
+
if (tableModel.getAreaModel("body") instanceof AreaModelTree) {
|
|
29
32
|
this.tree = true;
|
|
30
33
|
}
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
const aereaIds = ["header", "body", "footer"];
|
|
35
|
+
aereaIds.forEach(areaIdent => {
|
|
36
|
+
this.colAndRowspanModels[areaIdent] = new ColAndRowspanModel(tableModel, tableModel.getAreaModel(areaIdent));
|
|
37
|
+
this.colAndRowspanModels[areaIdent]?.init();
|
|
38
|
+
});
|
|
33
39
|
}
|
|
34
40
|
resetEditorRenderer() {
|
|
35
41
|
this.editorRenderer = undefined;
|
|
@@ -69,6 +75,9 @@ export class RenderScope extends EleScope {
|
|
|
69
75
|
this.adjustAfterScrolling();
|
|
70
76
|
}
|
|
71
77
|
adjustAfterScrolling() {
|
|
78
|
+
for (const cleaning of this.removables) {
|
|
79
|
+
cleaning.remove();
|
|
80
|
+
}
|
|
72
81
|
this.hideHoverRow();
|
|
73
82
|
this.hideHoverColumn();
|
|
74
83
|
this.scrollTop = this.scrollViewport.scrollTop;
|
|
@@ -83,8 +92,14 @@ export class RenderScope extends EleScope {
|
|
|
83
92
|
this.scrollFactorX = 0;
|
|
84
93
|
}
|
|
85
94
|
this.adjustBody();
|
|
86
|
-
this.adjustArea(
|
|
87
|
-
this.adjustArea(
|
|
95
|
+
this.adjustArea("footer");
|
|
96
|
+
this.adjustArea("header");
|
|
97
|
+
if (this.tableOptions.tableTopBorderVisible) {
|
|
98
|
+
this.removables.push(this.dom.addHorizontalBorder(new GeoData(0, this.hostElement.clientWidth, 1, 0), this.hostElement, "ge-table-row-border"));
|
|
99
|
+
}
|
|
100
|
+
if (this.tableOptions.tableBottomBorderVisible) {
|
|
101
|
+
this.removables.push(this.dom.addHorizontalBorder(new GeoData(0, this.hostElement.clientWidth, 1, this.hostElement.clientHeight - 1), this.hostElement, "ge-table-row-border"));
|
|
102
|
+
}
|
|
88
103
|
}
|
|
89
104
|
checkForScrollPosSaving() {
|
|
90
105
|
if (this.storeScrollPosStateService
|
|
@@ -94,40 +109,38 @@ export class RenderScope extends EleScope {
|
|
|
94
109
|
}
|
|
95
110
|
getAreaAndSideIdentByAttr(srcElement) {
|
|
96
111
|
if (srcElement) {
|
|
97
|
-
const dataArea =
|
|
98
|
-
const dataSide =
|
|
112
|
+
const dataArea = this.getStringByAttr(srcElement, "data-area");
|
|
113
|
+
const dataSide = this.getStringByAttr(srcElement, "data-side");
|
|
114
|
+
// footer geht nicht console.info(dataArea, srcElement)
|
|
99
115
|
if (dataSide && dataArea) {
|
|
100
116
|
return [dataArea, dataSide];
|
|
101
117
|
}
|
|
102
|
-
if (srcElement.parentElement) {
|
|
103
|
-
return this.getAreaAndSideIdentByAttr(srcElement.parentElement);
|
|
104
|
-
}
|
|
105
118
|
}
|
|
106
119
|
return [undefined, undefined];
|
|
107
120
|
}
|
|
108
121
|
getArea(rowIdent, sideIdent) {
|
|
109
|
-
if (rowIdent ===
|
|
110
|
-
if (sideIdent ===
|
|
122
|
+
if (rowIdent === "header") {
|
|
123
|
+
if (sideIdent === "west")
|
|
111
124
|
return this.areaHeaderWest;
|
|
112
|
-
if (sideIdent ===
|
|
125
|
+
if (sideIdent === "center")
|
|
113
126
|
return this.areaHeaderCenter;
|
|
114
|
-
if (sideIdent ===
|
|
127
|
+
if (sideIdent === "east")
|
|
115
128
|
return this.areaHeaderEast;
|
|
116
129
|
}
|
|
117
|
-
else if (rowIdent ===
|
|
118
|
-
if (sideIdent ===
|
|
130
|
+
else if (rowIdent === "body") {
|
|
131
|
+
if (sideIdent === "west")
|
|
119
132
|
return this.areaBodyWest;
|
|
120
|
-
if (sideIdent ===
|
|
133
|
+
if (sideIdent === "center")
|
|
121
134
|
return this.areaBodyCenter;
|
|
122
|
-
if (sideIdent ===
|
|
135
|
+
if (sideIdent === "east")
|
|
123
136
|
return this.areaBodyEast;
|
|
124
137
|
}
|
|
125
|
-
else if (rowIdent ===
|
|
126
|
-
if (sideIdent ===
|
|
138
|
+
else if (rowIdent === "footer") {
|
|
139
|
+
if (sideIdent === "west")
|
|
127
140
|
return this.areaFooterWest;
|
|
128
|
-
if (sideIdent ===
|
|
141
|
+
if (sideIdent === "center")
|
|
129
142
|
return this.areaFooterCenter;
|
|
130
|
-
if (sideIdent ===
|
|
143
|
+
if (sideIdent === "east")
|
|
131
144
|
return this.areaFooterEast;
|
|
132
145
|
}
|
|
133
146
|
throw Error(`Wrong area identifier: row:${rowIdent}, col:${sideIdent}`);
|
|
@@ -135,32 +148,41 @@ export class RenderScope extends EleScope {
|
|
|
135
148
|
adjustBody() {
|
|
136
149
|
const virtualRowDivTopF1 = this.areaBodyCenterGeo.height - this.tableModel.getContentHeightInPixel();
|
|
137
150
|
const virtualRowDivTop = this.scrollFactorY * virtualRowDivTopF1;
|
|
138
|
-
this.dom.setStyle(this.contentDiv,
|
|
139
|
-
this.dom.setStyle(this.contentDiv,
|
|
140
|
-
this.adjustArea(
|
|
151
|
+
this.dom.setStyle(this.contentDiv, "top", `${this.scrollTop}px`);
|
|
152
|
+
this.dom.setStyle(this.contentDiv, "left", `${this.scrollViewport.scrollLeft}px`);
|
|
153
|
+
this.adjustArea("body", virtualRowDivTop);
|
|
141
154
|
}
|
|
142
155
|
getNumberByAttr(srcElement, key) {
|
|
143
156
|
if (srcElement) {
|
|
144
|
-
const attr = srcElement.closest(
|
|
157
|
+
const attr = srcElement.closest("[" + key + "]")?.getAttribute(key);
|
|
145
158
|
if (attr)
|
|
146
159
|
return Number(attr);
|
|
147
160
|
}
|
|
148
161
|
return -1;
|
|
149
162
|
}
|
|
163
|
+
getStringByAttr(srcElement, key) {
|
|
164
|
+
if (srcElement) {
|
|
165
|
+
const attr = srcElement.closest("[" + key + "]")?.getAttribute(key);
|
|
166
|
+
if (attr)
|
|
167
|
+
return attr;
|
|
168
|
+
}
|
|
169
|
+
return "";
|
|
170
|
+
}
|
|
150
171
|
adjustArea(areaIdent, yStart = 0) {
|
|
151
|
-
const westArea = this.getArea(areaIdent,
|
|
152
|
-
const centerArea = this.getArea(areaIdent,
|
|
153
|
-
const eastArea = this.getArea(areaIdent,
|
|
172
|
+
const westArea = this.getArea(areaIdent, "west");
|
|
173
|
+
const centerArea = this.getArea(areaIdent, "center");
|
|
174
|
+
const eastArea = this.getArea(areaIdent, "east");
|
|
154
175
|
const divHeight = centerArea.child.clientHeight;
|
|
155
|
-
westArea.child.innerText =
|
|
156
|
-
centerArea.child.innerText =
|
|
157
|
-
eastArea.child.innerText =
|
|
176
|
+
westArea.child.innerText = "";
|
|
177
|
+
centerArea.child.innerText = "";
|
|
178
|
+
eastArea.child.innerText = "";
|
|
158
179
|
const left = 0;
|
|
159
180
|
const width = this.areaBodyCenterGeo.width;
|
|
160
181
|
const padding = this.tableModel.getPadding();
|
|
161
182
|
const areaModel = this.tableModel.getAreaModel(areaIdent);
|
|
162
183
|
const rowCount = areaModel.getRowCount();
|
|
163
|
-
const bodyArea = areaIdent ===
|
|
184
|
+
const bodyArea = areaIdent === "body";
|
|
185
|
+
const headerArea = areaIdent === "header";
|
|
164
186
|
while (this.cleanupFunctions[areaIdent].length) {
|
|
165
187
|
const fn = this.cleanupFunctions[areaIdent].shift();
|
|
166
188
|
if (fn) {
|
|
@@ -168,8 +190,9 @@ export class RenderScope extends EleScope {
|
|
|
168
190
|
}
|
|
169
191
|
}
|
|
170
192
|
let y = yStart;
|
|
171
|
-
|
|
172
|
-
|
|
193
|
+
const columnCount = this.tableModel.getColumnCount();
|
|
194
|
+
const fixedRightColumnCount = this.tableModel.getFixedRightColumnCount();
|
|
195
|
+
const fixedLeftColumnCount = this.tableModel.getFixedLeftColumnCount();
|
|
173
196
|
for (let index = 0; index < rowCount; index++) {
|
|
174
197
|
const top = y;
|
|
175
198
|
const height = this.tableModel.getRowHeight(areaIdent, index);
|
|
@@ -179,20 +202,17 @@ export class RenderScope extends EleScope {
|
|
|
179
202
|
// center -------------------------------------------
|
|
180
203
|
let geo = { left, width, height, top, index };
|
|
181
204
|
let rowDiv = this.dom.addRowDiv(centerArea, geo, index, areaIdent);
|
|
182
|
-
const
|
|
183
|
-
const centerStartCol = this.tableModel.getFixedLeftColumnCount();
|
|
184
|
-
const fixedRightColumnCount = this.tableModel.getFixedRightColumnCount();
|
|
205
|
+
const centerStartCol = fixedLeftColumnCount;
|
|
185
206
|
this.adjustColumnsToRowParent({
|
|
186
207
|
areaIdent,
|
|
187
|
-
sideIdent:
|
|
208
|
+
sideIdent: "center",
|
|
188
209
|
areaModel,
|
|
189
210
|
geo,
|
|
190
211
|
parent: rowDiv,
|
|
191
212
|
rowIndex: index,
|
|
192
213
|
columnIndexStart: centerStartCol,
|
|
193
214
|
columnIndexEnd: columnCount - fixedRightColumnCount - 1,
|
|
194
|
-
verticalFixed: false
|
|
195
|
-
firstVisibleRow
|
|
215
|
+
verticalFixed: false
|
|
196
216
|
});
|
|
197
217
|
// west -------------------------------------------
|
|
198
218
|
if (padding.left > 0) {
|
|
@@ -200,15 +220,14 @@ export class RenderScope extends EleScope {
|
|
|
200
220
|
rowDiv = this.dom.addRowDiv(westArea, geo, index, areaIdent);
|
|
201
221
|
this.adjustColumnsToRowParent({
|
|
202
222
|
areaIdent,
|
|
203
|
-
sideIdent:
|
|
223
|
+
sideIdent: "west",
|
|
204
224
|
areaModel,
|
|
205
225
|
geo,
|
|
206
226
|
parent: rowDiv,
|
|
207
227
|
rowIndex: index,
|
|
208
228
|
columnIndexStart: 0,
|
|
209
229
|
columnIndexEnd: centerStartCol - 1,
|
|
210
|
-
verticalFixed: true
|
|
211
|
-
firstVisibleRow
|
|
230
|
+
verticalFixed: true
|
|
212
231
|
});
|
|
213
232
|
}
|
|
214
233
|
// east -------------------------------------------
|
|
@@ -217,21 +236,19 @@ export class RenderScope extends EleScope {
|
|
|
217
236
|
rowDiv = this.dom.addRowDiv(eastArea, geo, index, areaIdent);
|
|
218
237
|
this.adjustColumnsToRowParent({
|
|
219
238
|
areaIdent,
|
|
220
|
-
sideIdent:
|
|
239
|
+
sideIdent: "east",
|
|
221
240
|
areaModel,
|
|
222
241
|
geo,
|
|
223
242
|
parent: rowDiv,
|
|
224
243
|
rowIndex: index,
|
|
225
244
|
columnIndexStart: columnCount - fixedRightColumnCount,
|
|
226
245
|
columnIndexEnd: columnCount - 1,
|
|
227
|
-
verticalFixed: true
|
|
228
|
-
firstVisibleRow
|
|
246
|
+
verticalFixed: true
|
|
229
247
|
});
|
|
230
248
|
}
|
|
231
|
-
firstVisibleRow = false;
|
|
232
249
|
// collapse / expand all:
|
|
233
|
-
if (areaIdent ===
|
|
234
|
-
const div = this.dom.applyStyle(this.dom.setAttribute(this.dom.addDiv(rowDiv, new GeoData(16, 20, 20, 8)),
|
|
250
|
+
if (areaIdent === "header" && this.tree && index === rowCount - 1) {
|
|
251
|
+
const div = this.dom.applyStyle(this.dom.setAttribute(this.dom.addDiv(rowDiv, new GeoData(16, 20, 20, 8)), "data-ge-action", "toggleExpandCollapseAll"), { "cursor": "pointer" });
|
|
235
252
|
const treeOptionsArrow = this.tableOptions.treeOptions.arrowExpandCollapseAll;
|
|
236
253
|
if (treeOptionsArrow) {
|
|
237
254
|
const textElement = this.dom.domService.createText(treeOptionsArrow.content);
|
|
@@ -243,56 +260,57 @@ export class RenderScope extends EleScope {
|
|
|
243
260
|
}
|
|
244
261
|
}
|
|
245
262
|
y = y + height;
|
|
246
|
-
lastVisibleRowIndex = index;
|
|
263
|
+
// lastVisibleRowIndex = index;
|
|
247
264
|
if (y > divHeight) {
|
|
248
265
|
break;
|
|
249
266
|
}
|
|
250
267
|
} // for
|
|
251
|
-
//
|
|
268
|
+
// We draw the big colspan and rowspan cells at the end.
|
|
252
269
|
// This fixes the 'half cutted big cell' problem:
|
|
253
|
-
if (
|
|
270
|
+
if (this.colAndRowspanModels && this.colAndRowspanModels[areaIdent]) {
|
|
254
271
|
// draw col/rowspan cells again:
|
|
255
|
-
const ranges = this.
|
|
272
|
+
const ranges = this.colAndRowspanModels[areaIdent]?.getRanges() ?? [];
|
|
256
273
|
if (ranges.length) {
|
|
257
|
-
const virtualRowDivLeftF1 = (this.areaBodyCenterGeo.width) - this.tableModel.getContentWidthInPixel();
|
|
258
|
-
const xStart = this.scrollFactorX * virtualRowDivLeftF1;
|
|
259
274
|
for (const range of ranges) {
|
|
260
|
-
|
|
275
|
+
let xStart = 0;
|
|
276
|
+
let child = centerArea.child;
|
|
277
|
+
if (range.c1 < fixedLeftColumnCount) {
|
|
278
|
+
// West:
|
|
279
|
+
child = westArea.child;
|
|
280
|
+
}
|
|
281
|
+
else if (fixedRightColumnCount > 0 && range.c1 >= columnCount - fixedRightColumnCount) {
|
|
282
|
+
// East:
|
|
283
|
+
child = eastArea.child;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
// Center:
|
|
287
|
+
const virtualRowDivLeftF1 = this.areaBodyCenterGeo.width - this.tableModel.getContentWidthInPixel();
|
|
288
|
+
xStart = (this.scrollFactorX * virtualRowDivLeftF1) - this.areaBodyWestGeo.width;
|
|
289
|
+
}
|
|
290
|
+
this.drawBigCell(range, xStart, yStart, areaModel, child);
|
|
261
291
|
}
|
|
262
292
|
}
|
|
263
293
|
}
|
|
264
|
-
// if ( this.draggingTargetColumnIndex>-1){
|
|
265
|
-
// // we will render a flying dragging column:
|
|
266
|
-
// const domService = this.dom.domService;
|
|
267
|
-
// //for (let index = this.firstVisibleRowIndex; index <= lastVisibleRowIndex; index++) {
|
|
268
|
-
// const div = this.dom.domService.createElement<HTMLDivElement>('div');
|
|
269
|
-
// const w = this.tableModel.getColumnWidth(this.draggingTargetColumnIndex);
|
|
270
|
-
// const h = this.contentDiv.clientHeight;
|
|
271
|
-
// let left = this.mouseEvent?.originalEvent?.x ?? 0;
|
|
272
|
-
//
|
|
273
|
-
// domService.addClass(div, 'ge-table-dragged-col-div');
|
|
274
|
-
// domService.addClass(div, `ge-table-col-div-${this.draggingTargetColumnIndex}`);
|
|
275
|
-
// domService.setAttribute(div, 'data-col-index', `${this.draggingTargetColumnIndex}`);
|
|
276
|
-
// domService.setStyle(div, 'display', 'clip');
|
|
277
|
-
// domService.setStyle(div, 'opacity', '0.5');
|
|
278
|
-
// domService.setStyle(div, 'position', 'absolute');
|
|
279
|
-
// domService.setStyle(div, 'left', `${left}px`);
|
|
280
|
-
// domService.setStyle(div, 'top', `${0}px`);
|
|
281
|
-
// domService.setStyle(div, 'width', `${w}px`);
|
|
282
|
-
// domService.setStyle(div, 'height', `${h}px`);
|
|
283
|
-
// domService.appendChild(this.contentDiv, div);
|
|
284
|
-
// //}
|
|
285
|
-
// }
|
|
286
294
|
}
|
|
287
295
|
/**
|
|
288
296
|
* Draws big cells (rowspan and or colspan) in body/center
|
|
289
|
-
* @param range
|
|
290
|
-
* @param
|
|
297
|
+
* @param range:CellRange
|
|
298
|
+
* @param xStart X position in pixel for top left corner
|
|
299
|
+
* @param yStart Y position in pixel for top left corner
|
|
300
|
+
* @param areaModel AreaModelIf
|
|
301
|
+
* @param parentDiv Parent div as HTMLDivElement
|
|
291
302
|
* @protected
|
|
292
303
|
*/
|
|
293
304
|
drawBigCell(range, xStart, yStart, areaModel, parentDiv) {
|
|
294
305
|
const y1 = yStart + this.getRowHeights(0, range.r1 - 1, areaModel).reduce((a, b) => a + b, 0);
|
|
295
|
-
const
|
|
306
|
+
const columnCount = this.tableModel.getColumnCount();
|
|
307
|
+
const fixedRightColumnCount = this.tableModel.getFixedRightColumnCount();
|
|
308
|
+
let firstColIdx = 0;
|
|
309
|
+
if (fixedRightColumnCount > 0 && range.c1 >= columnCount - fixedRightColumnCount) {
|
|
310
|
+
// We are on the (fixed) east side, so we have to fix firstColIdx:
|
|
311
|
+
firstColIdx = columnCount - fixedRightColumnCount;
|
|
312
|
+
}
|
|
313
|
+
const x1 = xStart + this.getColumnWidths(firstColIdx, range.c1 - 1).reduce((a, b) => a + b, 0);
|
|
296
314
|
const h = this.getRowHeights(range.r1, range.r2, areaModel).reduce((a, b) => a + b, 0);
|
|
297
315
|
const w = this.getColumnWidths(range.c1, range.c2).reduce((a, b) => a + b, 0);
|
|
298
316
|
let cellSelected = false;
|
|
@@ -301,7 +319,10 @@ export class RenderScope extends EleScope {
|
|
|
301
319
|
const count = selectionModel.getSelectionCount(range.r1, range.c1);
|
|
302
320
|
cellSelected = count > 0;
|
|
303
321
|
}
|
|
304
|
-
this.renderCell(areaModel,
|
|
322
|
+
this.renderCell(areaModel, areaModel.areaIdent, range.r1, range.c1, x1, y1, w, h, parentDiv, cellSelected);
|
|
323
|
+
if (areaModel.areaIdent === "header" && this.tableOptions.columnsResizable) {
|
|
324
|
+
this.renderHeaderCellResizeHandle(range.r1, range.c1, x1, y1, w, h, parentDiv);
|
|
325
|
+
}
|
|
305
326
|
}
|
|
306
327
|
findRowOfImportantRowspanCell(areaModel, rowIndex, colIndex) {
|
|
307
328
|
const maxRowspan = areaModel.getMaxRowspan();
|
|
@@ -316,7 +337,8 @@ export class RenderScope extends EleScope {
|
|
|
316
337
|
}
|
|
317
338
|
return -1;
|
|
318
339
|
}
|
|
319
|
-
|
|
340
|
+
// TODO skip cols in header because of colspan
|
|
341
|
+
adjustColumnsToRowParent({ areaIdent, sideIdent, areaModel, geo, parent, rowIndex, columnIndexStart, columnIndexEnd, verticalFixed = false }) {
|
|
320
342
|
this.scrollViewportLeft = this.scrollViewport.scrollLeft;
|
|
321
343
|
let virtualRowDivLeft = 0;
|
|
322
344
|
if (!verticalFixed) {
|
|
@@ -324,8 +346,7 @@ export class RenderScope extends EleScope {
|
|
|
324
346
|
virtualRowDivLeft = this.scrollFactorX * virtualRowDivLeftF1;
|
|
325
347
|
}
|
|
326
348
|
const top = 0;
|
|
327
|
-
|
|
328
|
-
const renderSelection = (areaIdent === 'body');
|
|
349
|
+
const renderSelection = !!(areaIdent === "body" && sideIdent);
|
|
329
350
|
let x = virtualRowDivLeft;
|
|
330
351
|
for (let index = columnIndexStart; index <= columnIndexEnd; index++) {
|
|
331
352
|
const left = x;
|
|
@@ -344,13 +365,13 @@ export class RenderScope extends EleScope {
|
|
|
344
365
|
width = this.getColumnWidths(index, index + colspan - 1).reduce((a, b) => a + b, 0);
|
|
345
366
|
}
|
|
346
367
|
let skip = false;
|
|
347
|
-
if (
|
|
348
|
-
if (this.
|
|
368
|
+
if (this.colAndRowspanModels && this.colAndRowspanModels[areaIdent]) {
|
|
369
|
+
if (this.colAndRowspanModels[areaIdent]?.isInRange(rowIndex, index)) {
|
|
349
370
|
skip = true; // for the body area we don't want to to render the small single cells
|
|
350
371
|
}
|
|
351
372
|
}
|
|
352
|
-
if (this.draggingTargetColumnIndex === index && areaIdent !==
|
|
353
|
-
|
|
373
|
+
if (this.draggingTargetColumnIndex === index && areaIdent !== "header") {
|
|
374
|
+
this.renderDragTargetDiv(parent, left, top, width, height);
|
|
354
375
|
this.dom.addColumnBorderDivs(parent, { left, top, width, height });
|
|
355
376
|
}
|
|
356
377
|
else {
|
|
@@ -358,7 +379,7 @@ export class RenderScope extends EleScope {
|
|
|
358
379
|
if (!skip) {
|
|
359
380
|
this.renderCell(areaModel, areaIdent, rowIndex, index, left, top, width, height, parent, cellSelected);
|
|
360
381
|
}
|
|
361
|
-
if (areaIdent ===
|
|
382
|
+
if (areaIdent === "header" && this.tableOptions.columnsResizable) {
|
|
362
383
|
this.renderHeaderCellResizeHandle(rowIndex, index, left, top, width, height, parent);
|
|
363
384
|
}
|
|
364
385
|
}
|
|
@@ -368,6 +389,8 @@ export class RenderScope extends EleScope {
|
|
|
368
389
|
break;
|
|
369
390
|
}
|
|
370
391
|
}
|
|
392
|
+
// Right vertical border:
|
|
393
|
+
this.dom.addVerticalBorder(new GeoData(x - 1, 1, geo.height, 0), parent);
|
|
371
394
|
}
|
|
372
395
|
getTreeArrowColumnIndex() {
|
|
373
396
|
if (this.tableOptions.showCheckboxWihoutExtraColumn) {
|
|
@@ -383,36 +406,36 @@ export class RenderScope extends EleScope {
|
|
|
383
406
|
const cellRenderer = (editor) ? this.editorRenderer : areaModel.getCellRenderer(rowIndex, index);
|
|
384
407
|
const geo = { left, width, height, top, index };
|
|
385
408
|
const rowObject = areaModel.getRowByIndex(rowIndex);
|
|
386
|
-
let treeArrow =
|
|
409
|
+
let treeArrow = "none";
|
|
387
410
|
const arrowIndexOk = index === this.getTreeArrowColumnIndex();
|
|
388
411
|
if (arrowIndexOk && rowObject instanceof TreeRow) {
|
|
389
412
|
const tr = rowObject;
|
|
390
413
|
if (tr.children?.length) {
|
|
391
414
|
if (tr.expanded) {
|
|
392
|
-
treeArrow =
|
|
415
|
+
treeArrow = "expanded";
|
|
393
416
|
}
|
|
394
417
|
else {
|
|
395
|
-
treeArrow =
|
|
418
|
+
treeArrow = "collapsed";
|
|
396
419
|
}
|
|
397
420
|
}
|
|
398
421
|
else {
|
|
399
|
-
treeArrow =
|
|
422
|
+
treeArrow = "hidden";
|
|
400
423
|
}
|
|
401
424
|
}
|
|
402
425
|
let sortState = undefined;
|
|
403
|
-
if (areaIdent ===
|
|
426
|
+
if (areaIdent === "header") {
|
|
404
427
|
const columnDef = this.tableModel.getColumnDef(index);
|
|
405
428
|
if (!columnDef?.sortIconVisible || columnDef?.sortIconVisible()) {
|
|
406
429
|
sortState = columnDef?.sortState;
|
|
407
430
|
}
|
|
408
431
|
}
|
|
409
432
|
const val = areaModel.getValueAt(rowIndex, index);
|
|
410
|
-
const text = cellRenderer ?
|
|
433
|
+
const text = cellRenderer ? "" : `${val}`;
|
|
411
434
|
const checkedType = areaModel.isRowChecked(rowIndex);
|
|
412
435
|
const cell = this.dom.addColumnDiv(parent, geo, rowIndex, index, areaIdent, text, treeArrow, this.tableOptions, checkedType, sortState);
|
|
413
436
|
const tooltip = areaModel.getTooltipAt(rowIndex, index);
|
|
414
437
|
if (tooltip) {
|
|
415
|
-
this.dom.setAttribute(cell,
|
|
438
|
+
this.dom.setAttribute(cell, "title", tooltip);
|
|
416
439
|
}
|
|
417
440
|
const columnDef = this.tableModel.getColumnDef(index);
|
|
418
441
|
if (columnDef && columnDef.classes[areaIdent]) {
|
|
@@ -427,14 +450,14 @@ export class RenderScope extends EleScope {
|
|
|
427
450
|
this.dom.addClasses(classes, cell);
|
|
428
451
|
}
|
|
429
452
|
this.dom.addColumnBorderDivs(parent, geo);
|
|
430
|
-
if (this.getFocusModel && areaIdent ===
|
|
453
|
+
if (this.getFocusModel && areaIdent === "body") {
|
|
431
454
|
const fm = this.getFocusModel();
|
|
432
455
|
if (fm?.hasFocus(rowIndex, index)) {
|
|
433
456
|
this.dom.addFocusBorderDivs(parent, geo, {});
|
|
434
457
|
}
|
|
435
458
|
}
|
|
436
|
-
if (areaIdent ===
|
|
437
|
-
this.dom.setAttribute(cell,
|
|
459
|
+
if (areaIdent === "header") {
|
|
460
|
+
this.dom.setAttribute(cell, "data-ge-action", "drag-column");
|
|
438
461
|
}
|
|
439
462
|
return [cell, fn];
|
|
440
463
|
}
|
|
@@ -455,14 +478,14 @@ export class RenderScope extends EleScope {
|
|
|
455
478
|
adjustHoverRows(mouseMoveEvent) {
|
|
456
479
|
if (this.tableOptions.hoverRowVisible && mouseMoveEvent.rowIndex > -1) {
|
|
457
480
|
const width = this.hostElement.clientWidth;
|
|
458
|
-
const rowHeight = this.tableModel.getAreaModel(
|
|
459
|
-
const top = mouseMoveEvent.rowTop + this.areaHeaderCenter.parent.clientHeight;
|
|
481
|
+
const rowHeight = this.tableModel.getAreaModel("body").getRowHeight(mouseMoveEvent.rowIndex);
|
|
482
|
+
const top = mouseMoveEvent.rowTop + this.areaHeaderCenter.parent.clientHeight - this.scrollTop;
|
|
460
483
|
this.dom.applyStyle(this.hoverRow, {
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
484
|
+
"left": "0",
|
|
485
|
+
"top": top + "px",
|
|
486
|
+
"width": width + "px",
|
|
487
|
+
"height": rowHeight + "px",
|
|
488
|
+
"display": "block"
|
|
466
489
|
});
|
|
467
490
|
}
|
|
468
491
|
else {
|
|
@@ -471,20 +494,20 @@ export class RenderScope extends EleScope {
|
|
|
471
494
|
}
|
|
472
495
|
hideHoverRow() {
|
|
473
496
|
this.dom.applyStyle(this.hoverRow, {
|
|
474
|
-
|
|
497
|
+
"display": "none"
|
|
475
498
|
});
|
|
476
499
|
}
|
|
477
500
|
adjustHoverColumns(mouseMoveEvent) {
|
|
478
501
|
if (this.tableOptions.hoverColumnVisible && mouseMoveEvent.rowIndex > -1) {
|
|
479
502
|
const height = this.hostElement.clientHeight;
|
|
480
503
|
const width = this.tableModel.getColumnWidth(mouseMoveEvent.columnIndex);
|
|
481
|
-
const left = mouseMoveEvent.columnLeft + this.tableModel.getPadding().left;
|
|
504
|
+
const left = mouseMoveEvent.columnLeft + this.tableModel.getPadding().left - this.scrollLeft;
|
|
482
505
|
this.dom.applyStyle(this.hoverColumn, {
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
506
|
+
"left": (left) + "px",
|
|
507
|
+
"top": "0px",
|
|
508
|
+
"width": width + "px",
|
|
509
|
+
"height": height + "px",
|
|
510
|
+
"display": "block"
|
|
488
511
|
});
|
|
489
512
|
}
|
|
490
513
|
else {
|
|
@@ -493,7 +516,7 @@ export class RenderScope extends EleScope {
|
|
|
493
516
|
}
|
|
494
517
|
hideHoverColumn() {
|
|
495
518
|
this.dom.applyStyle(this.hoverColumn, {
|
|
496
|
-
|
|
519
|
+
"display": "none"
|
|
497
520
|
});
|
|
498
521
|
}
|
|
499
522
|
debounce(fn, delay = 1000) {
|
|
@@ -503,11 +526,11 @@ export class RenderScope extends EleScope {
|
|
|
503
526
|
this.debounceTimeout = setTimeout(fn.bind(this), delay);
|
|
504
527
|
}
|
|
505
528
|
renderDragTargetDiv(parent, left, top, width, height) {
|
|
506
|
-
const div = this.dom.applyStylePosistionAbsolute(this.dom.createDivWithClass(
|
|
507
|
-
this.dom.setStyle(div,
|
|
508
|
-
this.dom.setStyle(div,
|
|
509
|
-
this.dom.setStyle(div,
|
|
510
|
-
this.dom.setStyle(div,
|
|
529
|
+
const div = this.dom.applyStylePosistionAbsolute(this.dom.createDivWithClass("ge-table-drop-zone", parent));
|
|
530
|
+
this.dom.setStyle(div, "left", `${left}px`);
|
|
531
|
+
this.dom.setStyle(div, "top", `${top}px`);
|
|
532
|
+
this.dom.setStyle(div, "width", `${width}px`);
|
|
533
|
+
this.dom.setStyle(div, "height", `${height}px`);
|
|
511
534
|
return div;
|
|
512
535
|
}
|
|
513
536
|
renderSelectedBackgroundDiv(skip, renderSelection, areaModel, rowIndex, index, parent, left, top, width, height) {
|
|
@@ -519,11 +542,11 @@ export class RenderScope extends EleScope {
|
|
|
519
542
|
const count = selectionModel.getSelectionCount(rowIndex, index);
|
|
520
543
|
cellSelected = count > 0;
|
|
521
544
|
for (let i = 0; i < count; i++) {
|
|
522
|
-
const div = this.dom.applyStylePosistionAbsolute(this.dom.createDivWithClass(
|
|
523
|
-
this.dom.setStyle(div,
|
|
524
|
-
this.dom.setStyle(div,
|
|
525
|
-
this.dom.setStyle(div,
|
|
526
|
-
this.dom.setStyle(div,
|
|
545
|
+
const div = this.dom.applyStylePosistionAbsolute(this.dom.createDivWithClass("ge-table-selected-range", parent));
|
|
546
|
+
this.dom.setStyle(div, "left", `${left}px`);
|
|
547
|
+
this.dom.setStyle(div, "top", `${top}px`);
|
|
548
|
+
this.dom.setStyle(div, "width", `${width}px`);
|
|
549
|
+
this.dom.setStyle(div, "height", `${height}px`);
|
|
527
550
|
}
|
|
528
551
|
}
|
|
529
552
|
}
|
|
@@ -543,7 +566,7 @@ export class RenderScope extends EleScope {
|
|
|
543
566
|
parent
|
|
544
567
|
});
|
|
545
568
|
if (cellSelected) {
|
|
546
|
-
this.dom.addClass(
|
|
569
|
+
this.dom.addClass("ge-cell-selected", div);
|
|
547
570
|
}
|
|
548
571
|
if (fn) {
|
|
549
572
|
this.cleanupFunctions[areaIdent].push(fn);
|
|
@@ -552,24 +575,21 @@ export class RenderScope extends EleScope {
|
|
|
552
575
|
renderHeaderCellResizeHandle(rowIndex, columnIndex, cellLeft, cellTop, cellWidth, cellHeight, parent) {
|
|
553
576
|
const domService = this.dom.domService;
|
|
554
577
|
const handleWidth = this.tableOptions.columnResizeHandleWidthInPx ?? 3;
|
|
555
|
-
const div = domService.createElement(
|
|
556
|
-
domService.setAttribute(div,
|
|
557
|
-
domService.setAttribute(div,
|
|
558
|
-
domService.setAttribute(div,
|
|
559
|
-
domService.setAttribute(div,
|
|
578
|
+
const div = domService.createElement("div");
|
|
579
|
+
domService.setAttribute(div, "data-col-index", `${columnIndex}`);
|
|
580
|
+
domService.setAttribute(div, "data-row-index", `${rowIndex}`);
|
|
581
|
+
domService.setAttribute(div, "data-area", "header");
|
|
582
|
+
domService.setAttribute(div, "data-ge-action", "resize-column");
|
|
560
583
|
// domService.setAttribute(div, 'data-ge-action', 'column-resize');
|
|
561
584
|
domService.addClass(div, `ge-table-col-resize-handle`);
|
|
562
|
-
domService.setStyle(div,
|
|
563
|
-
domService.setStyle(div,
|
|
564
|
-
domService.setStyle(div,
|
|
565
|
-
domService.setStyle(div,
|
|
566
|
-
domService.setStyle(div,
|
|
567
|
-
domService.setStyle(div,
|
|
568
|
-
domService.setStyle(div,
|
|
585
|
+
domService.setStyle(div, "display", "clip");
|
|
586
|
+
domService.setStyle(div, "position", "absolute");
|
|
587
|
+
domService.setStyle(div, "cursor", "col-resize");
|
|
588
|
+
domService.setStyle(div, "left", `${(cellLeft + cellWidth - handleWidth)}px`);
|
|
589
|
+
domService.setStyle(div, "top", `${cellTop}px`);
|
|
590
|
+
domService.setStyle(div, "width", `${handleWidth}px`);
|
|
591
|
+
domService.setStyle(div, "height", `${cellHeight}px`);
|
|
569
592
|
domService.appendChild(parent, div);
|
|
570
593
|
}
|
|
571
|
-
sum(arr) {
|
|
572
|
-
return arr.reduce((a, b) => a + b, 0);
|
|
573
|
-
}
|
|
574
594
|
}
|
|
575
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXNjb3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90YWJsZS9zcmMvbGliL3RhYmxlL3JlbmRlci1zY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBYXJDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUcvQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDMUUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBS3hDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG1EQUFtRCxDQUFDO0FBRXJGLE1BQU0sT0FBTyxXQUFZLFNBQVEsUUFBUTtJQStCdkMsWUFDRSxXQUEyQixFQUMzQixVQUF3QixFQUN4QixHQUEwQixFQUMxQixZQUE0QjtRQUU1QixLQUFLLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFoQzFDLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFFVCxxQkFBZ0IsR0FJL0I7WUFDRixNQUFNLEVBQUUsRUFBRTtZQUNWLElBQUksRUFBRSxFQUFFO1lBQ1IsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBQ1EsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLGNBQVMsR0FBcUIsRUFBRSxDQUFDO1FBRWpDLHlCQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTFCLDhCQUF5QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBY3ZDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRTtZQUN4QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxD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LEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUNoRCxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQ3RELFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLFVBQVUsSUFBSSxDQUFDLENBQUM7UUFDdEQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLEdBQUcsQ0FBQyxHQUFhO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFbGVTY29wZX0gZnJvbSBcIi4vZWxlLXNjb3BlXCI7XG5pbXBvcnQge1RhYmxlTW9kZWxJZn0gZnJvbSBcIi4vZGF0YS90YWJsZW1vZGVsL3RhYmxlLW1vZGVsLmlmXCI7XG5pbXBvcnQge0NvbnZlbmllbmNlRG9tU2VydmljZX0gZnJvbSBcIi4vc2VydmljZS9jb252ZW5pZW5jZS1kb20uc2VydmljZVwiO1xuaW1wb3J0IHtUYWJsZU9wdGlvbnNJZn0gZnJvbSBcIi4vZGF0YS9vcHRpb25zL3RhYmxlLW9wdGlvbnMuaWZcIjtcbmltcG9ydCB7Q2VsbFJhbmdlfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9jZWxsLXJhbmdlXCI7XG5pbXBvcnQge1JlbmRlcmVyQ2xlYW51cEZuVHlwZX0gZnJvbSBcIi4vcmVuZGVyZXIvcmVuZGVyZXItY2xlYW51cC1mbi50eXBlXCI7XG5pbXBvcnQge0FyZWFJZGVudH0gZnJvbSBcIi4vZGF0YS90YWJsZW1vZGVsL2FyZWEtaWRlbnQudHlwZVwiO1xuaW1wb3J0IHtTaWRlSWRlbnR9IGZyb20gXCIuL2RhdGEvc2lkZS1pZGVudC50eXBlXCI7XG5pbXBvcnQge0RpdlNjb3BlfSBmcm9tIFwiLi9kYXRhL2Rpdi1zY29wZS50eXBlXCI7XG5pbXBvcnQge0FyZWFNb2RlbElmfSBmcm9tIFwiLi9kYXRhL3RhYmxlbW9kZWwvYXJlYW1vZGVsL2FyZWEtbW9kZWwuaWZcIjtcbmltcG9ydCB7QXJnc0FkanVzdENvbHVtbnNUb1Jvd1BhcmVudFBhcmFtc30gZnJvbSBcIi4vZGF0YS9jb21tb24vYXJncy1hZGp1c3QtY29sdW1ucy10by1yb3ctcGFyZW50LXBhcmFtc1wiO1xuaW1wb3J0IHtBcmdzUmVuZGVyQ2VsbERpdn0gZnJvbSBcIi4vZGF0YS9jb21tb24vYXJncy1yZW5kZXItY2VsbC1kaXZcIjtcbmltcG9ydCB7VHJlZUFycm93VHlwZX0gZnJvbSBcIi4vZGF0YS9jb21tb24vdHJlZS1hcnJvdy50eXBlXCI7XG5pbXBvcnQge1RyZWVSb3d9IGZyb20gXCIuL2RhdGEvY29tbW9uL3RyZWUtcm93XCI7XG5pbXBvcnQge1N0b3JlU3RhdGVTY3JvbGxQb3NTZXJ2aWNlfSBmcm9tIFwiLi9zZXJ2aWNlL3N0b3JlLXN0YXRlLXNjcm9sbC1wb3Muc2VydmljZVwiO1xuaW1wb3J0IHtHZU1vdXNlRXZlbnR9IGZyb20gXCIuL2RhdGEvY29tbW9uL2V2ZW50L2dlLW1vdXNlLWV2ZW50XCI7XG5pbXBvcnQge0FyZWFNb2RlbFRyZWV9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhbW9kZWwvYXJlYS1tb2RlbC10cmVlXCI7XG5pbXBvcnQge0dlb0RhdGF9IGZyb20gXCIuL2RhdGEvZ2VvLWRhdGFcIjtcbmltcG9ydCB7Q2VsbFJlbmRlcmVySWZ9IGZyb20gXCIuL3JlbmRlcmVyL2NlbGwtcmVuZGVyLmlmXCI7XG5pbXBvcnQge1NlbGVjdGlvbk1vZGVsSWZ9IGZyb20gXCIuL3NlbGVjdGlvbi9zZWxlY3Rpb24tbW9kZWwuaWZcIjtcbmltcG9ydCB7R2V0VH0gZnJvbSBcIi4vZGF0YS9jb21tb24vZ2V0LXRcIjtcbmltcG9ydCB7Rm9jdXNNb2RlbElmfSBmcm9tIFwiLi9mb2N1cy9mb2N1cy1tb2RlbC5pZlwiO1xuaW1wb3J0IHtDb2xBbmRSb3dzcGFuTW9kZWx9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhbW9kZWwvY29sLWFuZC1yb3dzcGFuLW1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJTY29wZSBleHRlbmRzIEVsZVNjb3BlIHtcblxuICBwcm90ZWN0ZWQgc3RvcmVTY3JvbGxQb3NTdGF0ZVNlcnZpY2U/OiBTdG9yZVN0YXRlU2Nyb2xsUG9zU2VydmljZTtcbiAgcHJvdGVjdGVkIGdldFNlbGVjdGlvbk1vZGVsPzogR2V0VDxTZWxlY3Rpb25Nb2RlbElmPjtcbiAgcHJvdGVjdGVkIGdldEZvY3VzTW9kZWw/OiBHZXRUPEZvY3VzTW9kZWxJZj47IC8vIFRPRE8gdXNlIGl0IVxuICBwcm90ZWN0ZWQgc2Nyb2xsTGVmdCA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxWaWV3cG9ydExlZnQgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsRmFjdG9yWSA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxGYWN0b3JYID0gMDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xlYW51cEZ1bmN0aW9uczoge1xuICAgIGhlYWRlcjogKFJlbmRlcmVyQ2xlYW51cEZuVHlwZSlbXSxcbiAgICBib2R5OiAoUmVuZGVyZXJDbGVhbnVwRm5UeXBlKVtdLFxuICAgIGZvb3RlcjogKFJlbmRlcmVyQ2xlYW51cEZuVHlwZSlbXSxcbiAgfSA9IHtcbiAgICBoZWFkZXI6IFtdLFxuICAgIGJvZHk6IFtdLFxuICAgIGZvb3RlcjogW10sXG4gIH07XG4gIHByb3RlY3RlZCB0cmVlID0gZmFsc2U7XG4gIHByb3RlY3RlZCByYW5nZUVsZXM6IEhUTUxEaXZFbGVtZW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIGNvbEFuZFJvd3NwYW5Nb2RlbD86IENvbEFuZFJvd3NwYW5Nb2RlbDtcbiAgcHJvdGVjdGVkIGZpcnN0VmlzaWJsZVJvd0luZGV4ID0gLTE7XG5cbiAgcHJvdGVjdGVkIGRyYWdnaW5nVGFyZ2V0Q29sdW1uSW5kZXggPSAtMTtcblxuICBwcml2YXRlIGRlYm91bmNlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbDtcbiAgcHJpdmF0ZSBlZGl0b3JSZW5kZXJlcj86IENlbGxSZW5kZXJlcklmO1xuICBwcml2YXRlIGVkaXRvclJlbmRlcmVyQ29sdW1uPzogbnVtYmVyO1xuICBwcml2YXRlIGVkaXRvclJlbmRlcmVyUm93PzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3RFbGVtZW50OiBIVE1MRGl2RWxlbWVudCxcbiAgICB0YWJsZU1vZGVsOiBUYWJsZU1vZGVsSWYsXG4gICAgZG9tOiBDb252ZW5pZW5jZURvbVNlcnZpY2UsXG4gICAgdGFibGVPcHRpb25zOiBUYWJsZU9wdGlvbnNJZlxuICApIHtcbiAgICBzdXBlcihob3N0RWxlbWVudCwgdGFibGVNb2RlbCwgZG9tLCB0YWJsZU9wdGlvbnMpO1xuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucz8uZ2V0U2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwgPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVPcHRpb25zPy5nZXRGb2N1c01vZGVsKSB7XG4gICAgICB0aGlzLmdldEZvY3VzTW9kZWwgPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRGb2N1c01vZGVsO1xuICAgIH1cbiAgICBpZiAodGFibGVNb2RlbC5nZXRBcmVhTW9kZWwoJ2JvZHknKSBpbnN0YW5jZW9mIEFyZWFNb2RlbFRyZWUpIHtcbiAgICAgIHRoaXMudHJlZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuY29sQW5kUm93c3Bhbk1vZGVsID0gbmV3IENvbEFuZFJvd3NwYW5Nb2RlbCh0YWJsZU1vZGVsLCB0YWJsZU1vZGVsLmdldEJvZHlNb2RlbCgpKTtcbiAgICB0aGlzLmNvbEFuZFJvd3NwYW5Nb2RlbC5pbml0KCk7XG4gIH1cblxuICByZXNldEVkaXRvclJlbmRlcmVyKCkge1xuICAgIHRoaXMuZWRpdG9yUmVuZGVyZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0b3JSZW5kZXJlclJvdyA9IC0xO1xuICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPSAtMTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICBjb25zdCBzbSA9IHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHNtPy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRSZW5kZXJFZGl0b3Iocm93SWR4OiBudW1iZXIsIGNvbElkeDogbnVtYmVyKSB7XG4gICAgbGV0IHJuRm4gPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGNvbElkeCk/LmdldEVkaXRSZW5kZXJlcjtcbiAgICBpZiAoIXJuRm4pIHtcbiAgICAgIHJuRm4gPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRFZGl0UmVuZGVyZXI7XG4gICAgfVxuICAgIGlmIChybkZuKSB7XG4gICAgICB0aGlzLmVkaXRvclJlbmRlcmVyID0gcm5Gbihyb3dJZHgsIGNvbElkeCk7XG5cbiAgICAgIGlmICh0aGlzLmVkaXRvclJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJSb3cgPSByb3dJZHg7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPSBjb2xJZHg7XG4gICAgICAgIHRoaXMucmVwYWludCgpO1xuICAgICAgICAvLyByZXF1ZXN0IGZvY3VzOlxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dC5nZS10YWJsZS1jZWxsLWVkaXRvci1pbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgdGhpcy5lZGl0b3JSZW5kZXJlclJvdyA9IC0xO1xuICAgICAgICB0aGlzLmVkaXRvclJlbmRlcmVyQ29sdW1uID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVwYWludCgpIHtcbiAgICB0aGlzLmFkanVzdEFmdGVyU2Nyb2xsaW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBhZGp1c3RBZnRlclNjcm9sbGluZygpIHtcbiAgICB0aGlzLmhpZGVIb3ZlclJvdygpO1xuICAgIHRoaXMuaGlkZUhvdmVyQ29sdW1uKCk7XG5cbiAgICB0aGlzLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9wO1xuICAgIHRoaXMuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsTGVmdDtcbiAgICB0aGlzLmRlYm91bmNlKHRoaXMuY2hlY2tGb3JTY3JvbGxQb3NTYXZpbmcuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnNjcm9sbEZhY3RvclkgPSB0aGlzLnNjcm9sbFRvcCAvICh0aGlzLnNjcm9sbFZpZXdwb3J0LnNjcm9sbEhlaWdodCAtIHRoaXMuc2Nyb2xsVmlld3BvcnQuY2xpZW50SGVpZ2h0KTtcbiAgICB0aGlzLnNjcm9sbEZhY3RvclggPSB0aGlzLnNjcm9sbExlZnQgLyAodGhpcy5zY3JvbGxWaWV3cG9ydC5zY3JvbGxXaWR0aCAtIHRoaXMuc2Nyb2xsVmlld3BvcnQuY2xpZW50V2lkdGgpO1xuXG4gICAgaWYgKGlzTmFOKHRoaXMuc2Nyb2xsRmFjdG9yWSkpIHtcbiAgICAgIHRoaXMuc2Nyb2xsRmFjdG9yWSA9IDA7XG4gICAgfVxuICAgIGlmIChpc05hTih0aGlzLnNjcm9sbEZhY3RvclgpKSB7XG4gICAgICB0aGlzLnNjcm9sbEZhY3RvclggPSAwO1xuICAgIH1cblxuICAgIHRoaXMuYWRqdXN0Qm9keSgpO1xuICAgIHRoaXMuYWRqdXN0QXJlYSgnZm9vdGVyJyk7XG4gICAgdGhpcy5hZGp1c3RBcmVhKCdoZWFkZXInKTtcbiAgfVxuXG4gIGNoZWNrRm9yU2Nyb2xsUG9zU2F2aW5nKCkge1xuICAgIGlmICh0aGlzLnN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlXG4gICAgICAmJiB0aGlzLnRhYmxlT3B0aW9ucz8uYXV0b1Jlc3RvcmVPcHRpb25zPy5hdXRvUmVzdG9yZVNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlLnVwZGF0ZVNjcm9sbE9mZnNldChbdGhpcy5zY3JvbGxMZWZ0LCB0aGlzLnNjcm9sbFRvcF0pO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGdldEFyZWFBbmRTaWRlSWRlbnRCeUF0dHIoc3JjRWxlbWVudDogSFRNTEVsZW1lbnQpOiBbQXJlYUlkZW50IHwgdW5kZWZpbmVkLCBTaWRlSWRlbnQgfCB1bmRlZmluZWRdIHtcbiAgICBpZiAoc3JjRWxlbWVudCkge1xuICAgICAgY29uc3QgZGF0YUFyZWEgPSBzcmNFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1hcmVhJyk7XG4gICAgICBjb25zdCBkYXRhU2lkZSA9IHNyY0VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNpZGUnKTtcbiAgICAgIGlmIChkYXRhU2lkZSAmJiBkYXRhQXJlYSkge1xuICAgICAgICByZXR1cm4gW2RhdGFBcmVhLCBkYXRhU2lkZV0gYXMgW0FyZWFJZGVudCwgU2lkZUlkZW50XTtcbiAgICAgIH1cbiAgICAgIGlmIChzcmNFbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXJlYUFuZFNpZGVJZGVudEJ5QXR0cihzcmNFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBcmVhKHJvd0lkZW50OiBBcmVhSWRlbnQsIHNpZGVJZGVudDogU2lkZUlkZW50KTogRGl2U2NvcGUge1xuICAgIGlmIChyb3dJZGVudCA9PT0gJ2hlYWRlcicpIHtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09ICd3ZXN0JykgcmV0dXJuIHRoaXMuYXJlYUhlYWRlcldlc3Q7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSAnY2VudGVyJykgcmV0dXJuIHRoaXMuYXJlYUhlYWRlckNlbnRlcjtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09ICdlYXN0JykgcmV0dXJuIHRoaXMuYXJlYUhlYWRlckVhc3Q7XG4gICAgfSBlbHNlIGlmIChyb3dJZGVudCA9PT0gJ2JvZHknKSB7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSAnd2VzdCcpIHJldHVybiB0aGlzLmFyZWFCb2R5V2VzdDtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09ICdjZW50ZXInKSByZXR1cm4gdGhpcy5hcmVhQm9keUNlbnRlcjtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09ICdlYXN0JykgcmV0dXJuIHRoaXMuYXJlYUJvZHlFYXN0O1xuICAgIH0gZWxzZSBpZiAocm93SWRlbnQgPT09ICdmb290ZXInKSB7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSAnd2VzdCcpIHJldHVybiB0aGlzLmFyZWFGb290ZXJXZXN0O1xuICAgICAgaWYgKHNpZGVJZGVudCA9PT0gJ2NlbnRlcicpIHJldHVybiB0aGlzLmFyZWFGb290ZXJDZW50ZXI7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSAnZWFzdCcpIHJldHVybiB0aGlzLmFyZWFGb290ZXJFYXN0O1xuICAgIH1cbiAgICB0aHJvdyBFcnJvcihgV3JvbmcgYXJlYSBpZGVudGlmaWVyOiByb3c6JHtyb3dJZGVudH0sIGNvbDoke3NpZGVJZGVudH1gKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGp1c3RCb2R5KCkge1xuICAgIGNvbnN0IHZpcnR1YWxSb3dEaXZUb3BGMSA9IHRoaXMuYXJlYUJvZHlDZW50ZXJHZW8uaGVpZ2h0IC0gdGhpcy50YWJsZU1vZGVsLmdldENvbnRlbnRIZWlnaHRJblBpeGVsKCk7XG4gICAgY29uc3QgdmlydHVhbFJvd0RpdlRvcCA9IHRoaXMuc2Nyb2xsRmFjdG9yWSAqIHZpcnR1YWxSb3dEaXZUb3BGMTtcblxuICAgIHRoaXMuZG9tLnNldFN0eWxlKHRoaXMuY29udGVudERpdiwgJ3RvcCcsIGAke3RoaXMuc2Nyb2xsVG9wfXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUodGhpcy5jb250ZW50RGl2LCAnbGVmdCcsIGAke3RoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsTGVmdH1weGApO1xuXG4gICAgdGhpcy5hZGp1c3RBcmVhKCdib2R5JywgdmlydHVhbFJvd0RpdlRvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TnVtYmVyQnlBdHRyKHNyY0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKHNyY0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBzcmNFbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLWdlLWFjdGlvbl0nKT8uZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICBpZiAoYXR0cikgcmV0dXJuIE51bWJlcihhdHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgbW91c2VFdmVudD86IEdlTW91c2VFdmVudDtcblxuICBwcm90ZWN0ZWQgYWRqdXN0QXJlYShhcmVhSWRlbnQ6IEFyZWFJZGVudCwgeVN0YXJ0OiBudW1iZXIgPSAwKSB7XG4gICAgY29uc3Qgd2VzdEFyZWEgPSB0aGlzLmdldEFyZWEoYXJlYUlkZW50LCAnd2VzdCcpO1xuICAgIGNvbnN0IGNlbnRlckFyZWEgPSB0aGlzLmdldEFyZWEoYXJlYUlkZW50LCAnY2VudGVyJyk7XG4gICAgY29uc3QgZWFzdEFyZWEgPSB0aGlzLmdldEFyZWEoYXJlYUlkZW50LCAnZWFzdCcpO1xuICAgIGNvbnN0IGRpdkhlaWdodCA9IGNlbnRlckFyZWEuY2hpbGQuY2xpZW50SGVpZ2h0O1xuXG4gICAgd2VzdEFyZWEuY2hpbGQuaW5uZXJUZXh0ID0gJyc7XG4gICAgY2VudGVyQXJlYS5jaGlsZC5pbm5lclRleHQgPSAnJztcbiAgICBlYXN0QXJlYS5jaGlsZC5pbm5lclRleHQgPSAnJztcblxuICAgIGNvbnN0IGxlZnQgPSAwO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aDtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy50YWJsZU1vZGVsLmdldFBhZGRpbmcoKTtcbiAgICBjb25zdCBhcmVhTW9kZWwgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0QXJlYU1vZGVsKGFyZWFJZGVudCk7XG4gICAgY29uc3Qgcm93Q291bnQgPSBhcmVhTW9kZWwuZ2V0Um93Q291bnQoKTtcbiAgICBjb25zdCBib2R5QXJlYSA9IGFyZWFJZGVudCA9PT0gJ2JvZHknO1xuXG4gICAgd2hpbGUgKHRoaXMuY2xlYW51cEZ1bmN0aW9uc1thcmVhSWRlbnRdLmxlbmd0aCkge1xuICAgICAgY29uc3QgZm4gPSB0aGlzLmNsZWFudXBGdW5jdGlvbnNbYXJlYUlkZW50XS5zaGlmdCgpO1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCB5ID0geVN0YXJ0O1xuICAgIGxldCBmaXJzdFZpc2libGVSb3cgPSB0cnVlO1xuICAgIGxldCBsYXN0VmlzaWJsZVJvd0luZGV4ID0gLTE7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm93Q291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRvcCA9IHk7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Um93SGVpZ2h0KGFyZWFJZGVudCwgaW5kZXgpO1xuXG4gICAgICBpZiAodG9wICsgaGVpZ2h0ID4gMCkge1xuICAgICAgICAvLyBWaXNpYmxlIVxuICAgICAgICB0aGlzLmZpcnN0VmlzaWJsZVJvd0luZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgLy8gY2VudGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgbGV0IGdlbyA9IHtsZWZ0LCB3aWR0aCwgaGVpZ2h0LCB0b3AsIGluZGV4fTtcbiAgICAgICAgbGV0IHJvd0RpdiA9IHRoaXMuZG9tLmFkZFJvd0RpdihjZW50ZXJBcmVhLCBnZW8sIGluZGV4LCBhcmVhSWRlbnQpO1xuICAgICAgICBjb25zdCBjb2x1bW5Db3VudCA9IHRoaXMudGFibGVNb2RlbC5nZXRDb2x1bW5Db3VudCgpO1xuICAgICAgICBjb25zdCBjZW50ZXJTdGFydENvbCA9IHRoaXMudGFibGVNb2RlbC5nZXRGaXhlZExlZnRDb2x1bW5Db3VudCgpO1xuICAgICAgICBjb25zdCBmaXhlZFJpZ2h0Q29sdW1uQ291bnQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Rml4ZWRSaWdodENvbHVtbkNvdW50KCk7XG5cbiAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zVG9Sb3dQYXJlbnQoe1xuICAgICAgICAgIGFyZWFJZGVudCxcbiAgICAgICAgICBzaWRlSWRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgIGFyZWFNb2RlbCxcbiAgICAgICAgICBnZW8sXG4gICAgICAgICAgcGFyZW50OiByb3dEaXYsXG4gICAgICAgICAgcm93SW5kZXg6IGluZGV4LFxuICAgICAgICAgIGNvbHVtbkluZGV4U3RhcnQ6IGNlbnRlclN0YXJ0Q29sLFxuICAgICAgICAgIGNvbHVtbkluZGV4RW5kOiBjb2x1bW5Db3VudCAtIGZpeGVkUmlnaHRDb2x1bW5Db3VudCAtIDEsXG4gICAgICAgICAgdmVydGljYWxGaXhlZDogZmFsc2UsXG4gICAgICAgICAgZmlyc3RWaXNpYmxlUm93XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHdlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBpZiAocGFkZGluZy5sZWZ0ID4gMCkge1xuICAgICAgICAgIGdlbyA9IHtsZWZ0LCB3aWR0aDogdGhpcy5hcmVhQm9keVdlc3RHZW8ud2lkdGgsIGhlaWdodCwgdG9wLCBpbmRleH07XG4gICAgICAgICAgcm93RGl2ID0gdGhpcy5kb20uYWRkUm93RGl2KHdlc3RBcmVhLCBnZW8sIGluZGV4LCBhcmVhSWRlbnQpO1xuICAgICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1RvUm93UGFyZW50KHtcbiAgICAgICAgICAgIGFyZWFJZGVudCxcbiAgICAgICAgICAgIHNpZGVJZGVudDogJ3dlc3QnLFxuICAgICAgICAgICAgYXJlYU1vZGVsLFxuICAgICAgICAgICAgZ2VvLFxuICAgICAgICAgICAgcGFyZW50OiByb3dEaXYsXG4gICAgICAgICAgICByb3dJbmRleDogaW5kZXgsXG4gICAgICAgICAgICBjb2x1bW5JbmRleFN0YXJ0OiAwLFxuICAgICAgICAgICAgY29sdW1uSW5kZXhFbmQ6IGNlbnRlclN0YXJ0Q29sIC0gMSxcbiAgICAgICAgICAgIHZlcnRpY2FsRml4ZWQ6IHRydWUsXG4gICAgICAgICAgICBmaXJzdFZpc2libGVSb3dcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVhc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBpZiAocGFkZGluZy5yaWdodCA+IDApIHtcbiAgICAgICAgICBnZW8gPSB7bGVmdCwgd2lkdGg6IHRoaXMuYXJlYUJvZHlFYXN0R2VvLndpZHRoLCBoZWlnaHQsIHRvcCwgaW5kZXh9O1xuICAgICAgICAgIHJvd0RpdiA9IHRoaXMuZG9tLmFkZFJvd0RpdihlYXN0QXJlYSwgZ2VvLCBpbmRleCwgYXJlYUlkZW50KTtcbiAgICAgICAgICB0aGlzLmFkanVzdENvbHVtbnNUb1Jvd1BhcmVudCh7XG4gICAgICAgICAgICBhcmVhSWRlbnQsXG4gICAgICAgICAgICBzaWRlSWRlbnQ6ICdlYXN0JyxcbiAgICAgICAgICAgIGFyZWFNb2RlbCxcbiAgICAgICAgICAgIGdlbyxcbiAgICAgICAgICAgIHBhcmVudDogcm93RGl2LFxuICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgY29sdW1uSW5kZXhTdGFydDogY29sdW1uQ291bnQgLSBmaXhlZFJpZ2h0Q29sdW1uQ291bnQsXG4gICAgICAgICAgICBjb2x1bW5JbmRleEVuZDogY29sdW1uQ291bnQgLSAxLFxuICAgICAgICAgICAgdmVydGljYWxGaXhlZDogdHJ1ZSxcbiAgICAgICAgICAgIGZpcnN0VmlzaWJsZVJvd1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpcnN0VmlzaWJsZVJvdyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGNvbGxhcHNlIC8gZXhwYW5kIGFsbDpcbiAgICAgICAgaWYgKGFyZWFJZGVudCA9PT0gJ2hlYWRlcicgJiYgdGhpcy50cmVlICYmIGluZGV4ID09PSByb3dDb3VudCAtIDEpIHtcbiAgICAgICAgICBjb25zdCBkaXYgPVxuICAgICAgICAgICAgdGhpcy5kb20uYXBwbHlTdHlsZShcbiAgICAgICAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmFkZERpdihyb3dEaXYsIG5ldyBHZW9EYXRhKDE2LCAyMCwgMjAsIDgpKSxcbiAgICAgICAgICAgICAgICAnZGF0YS1nZS1hY3Rpb24nLCAndG9nZ2xlRXhwYW5kQ29sbGFwc2VBbGwnXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHsnY3Vyc29yJzogJ3BvaW50ZXInfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB0cmVlT3B0aW9uc0Fycm93ID0gdGhpcy50YWJsZU9wdGlvbnMudHJlZU9wdGlvbnMuYXJyb3dFeHBhbmRDb2xsYXBzZUFsbDtcbiAgICAgICAgICBpZiAodHJlZU9wdGlvbnNBcnJvdykge1xuICAgICAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLmRvbS5kb21TZXJ2aWNlLmNyZWF0ZVRleHQodHJlZU9wdGlvbnNBcnJvdy5jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmRvbVNlcnZpY2UuYXBwZW5kQ2hpbGQoZGl2LCB0ZXh0RWxlbWVudCk7XG4gICAgICAgICAgICBpZiAodHJlZU9wdGlvbnNBcnJvdy5zdHlsZSkge1xuICAgICAgICAgICAgICB0aGlzLmRvbS5hcHBseVN0eWxlU3RyaW5nKGRpdiwgdHJlZU9wdGlvbnNBcnJvdy5zdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICAgIHkgPSB5ICsgaGVpZ2h0O1xuICAgICAgbGFzdFZpc2libGVSb3dJbmRleCA9IGluZGV4O1xuICAgICAgaWYgKHkgPiBkaXZIZWlnaHQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBmb3JcblxuICAgIC8vIGZvciB0aGUgYm9keSBhcmVhIHdlIGRyYXcgdGhlIGJpZyBjb2wgYW5kIHJvd3NwYW4gY2VsbHMgYXQgdGhlIGVuZC5cbiAgICAvLyBUaGlzIGZpeGVzIHRoZSAnaGFsZiBjdXR0ZWQgYmlnIGNlbGwnIHByb2JsZW06XG4gICAgaWYgKGJvZHlBcmVhKSB7XG4gICAgICAvLyBkcmF3IGNvbC9yb3dzcGFuIGNlbGxzIGFnYWluOlxuICAgICAgY29uc3QgcmFuZ2VzID0gdGhpcy5jb2xBbmRSb3dzcGFuTW9kZWw/LmdldFJhbmdlcygpID8/IFtdO1xuICAgICAgaWYgKHJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdmlydHVhbFJvd0RpdkxlZnRGMSA9ICh0aGlzLmFyZWFCb2R5Q2VudGVyR2VvLndpZHRoKSAtIHRoaXMudGFibGVNb2RlbC5nZXRDb250ZW50V2lkdGhJblBpeGVsKCk7XG4gICAgICAgIGNvbnN0IHhTdGFydCA9IHRoaXMuc2Nyb2xsRmFjdG9yWCAqIHZpcnR1YWxSb3dEaXZMZWZ0RjE7XG5cbiAgICAgICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcbiAgICAgICAgICB0aGlzLmRyYXdCaWdDZWxsKHJhbmdlLCB4U3RhcnQsIHlTdGFydCwgYXJlYU1vZGVsLCBjZW50ZXJBcmVhLmNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiAoIHRoaXMuZHJhZ2dpbmdUYXJnZXRDb2x1bW5JbmRleD4tMSl7XG4gICAgLy8gICAvLyB3ZSB3aWxsIHJlbmRlciBhIGZseWluZyBkcmFnZ2luZyBjb2x1bW46XG4gICAgLy8gICBjb25zdCBkb21TZXJ2aWNlID0gdGhpcy5kb20uZG9tU2VydmljZTtcbiAgICAvLyAgIC8vZm9yIChsZXQgaW5kZXggPSB0aGlzLmZpcnN0VmlzaWJsZVJvd0luZGV4OyBpbmRleCA8PSBsYXN0VmlzaWJsZVJvd0luZGV4OyBpbmRleCsrKSB7XG4gICAgLy8gICAgIGNvbnN0IGRpdiA9IHRoaXMuZG9tLmRvbVNlcnZpY2UuY3JlYXRlRWxlbWVudDxIVE1MRGl2RWxlbWVudD4oJ2RpdicpO1xuICAgIC8vICAgICBjb25zdCB3ID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbldpZHRoKHRoaXMuZHJhZ2dpbmdUYXJnZXRDb2x1bW5JbmRleCk7XG4gICAgLy8gICAgIGNvbnN0IGggPSB0aGlzLmNvbnRlbnREaXYuY2xpZW50SGVpZ2h0O1xuICAgIC8vICAgICBsZXQgbGVmdCA9IHRoaXMubW91c2VFdmVudD8ub3JpZ2luYWxFdmVudD8ueCA/PyAwO1xuICAgIC8vXG4gICAgLy8gICAgIGRvbVNlcnZpY2UuYWRkQ2xhc3MoZGl2LCAnZ2UtdGFibGUtZHJhZ2dlZC1jb2wtZGl2Jyk7XG4gICAgLy8gICAgIGRvbVNlcnZpY2UuYWRkQ2xhc3MoZGl2LCBgZ2UtdGFibGUtY29sLWRpdi0ke3RoaXMuZHJhZ2dpbmdUYXJnZXRDb2x1bW5JbmRleH1gKTtcbiAgICAvLyAgICAgZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCAnZGF0YS1jb2wtaW5kZXgnLCBgJHt0aGlzLmRyYWdnaW5nVGFyZ2V0Q29sdW1uSW5kZXh9YCk7XG4gICAgLy8gICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnZGlzcGxheScsICdjbGlwJyk7XG4gICAgLy8gICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnb3BhY2l0eScsICcwLjUnKTtcbiAgICAvLyAgICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICAgIC8vICAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XG4gICAgLy8gICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAndG9wJywgYCR7MH1weGApO1xuICAgIC8vICAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgJ3dpZHRoJywgYCR7d31weGApO1xuICAgIC8vICAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgJ2hlaWdodCcsIGAke2h9cHhgKTtcbiAgICAvLyAgICAgZG9tU2VydmljZS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnREaXYsIGRpdik7XG4gICAgLy8gICAvL31cbiAgICAvLyB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYmlnIGNlbGxzIChyb3dzcGFuIGFuZCBvciBjb2xzcGFuKSBpbiBib2R5L2NlbnRlclxuICAgKiBAcGFyYW0gcmFuZ2VcbiAgICogQHBhcmFtIHlTdGFydFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZHJhd0JpZ0NlbGwocmFuZ2U6IENlbGxSYW5nZSwgeFN0YXJ0OiBudW1iZXIsIHlTdGFydDogbnVtYmVyLCBhcmVhTW9kZWw6IEFyZWFNb2RlbElmLCBwYXJlbnREaXY6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgY29uc3QgeTEgPSB5U3RhcnQgKyB0aGlzLmdldFJvd0hlaWdodHMoMCwgcmFuZ2UucjEgLSAxLCBhcmVhTW9kZWwpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgIGNvbnN0IHgxID0geFN0YXJ0ICsgdGhpcy5nZXRDb2x1bW5XaWR0aHMoMCwgcmFuZ2UuYzEgLSAxKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCBoID0gdGhpcy5nZXRSb3dIZWlnaHRzKHJhbmdlLnIxLCByYW5nZS5yMiwgYXJlYU1vZGVsKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCB3ID0gdGhpcy5nZXRDb2x1bW5XaWR0aHMocmFuZ2UuYzEsIHJhbmdlLmMyKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcblxuICAgIGxldCBjZWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbCA9IHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwgPyB0aGlzLmdldFNlbGVjdGlvbk1vZGVsKCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICBjb25zdCBjb3VudCA9IHNlbGVjdGlvbk1vZGVsLmdldFNlbGVjdGlvbkNvdW50KHJhbmdlLnIxLCByYW5nZS5jMSk7XG4gICAgICBjZWxsU2VsZWN0ZWQgPSBjb3VudCA+IDA7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyQ2VsbChhcmVhTW9kZWwsICdib2R5JywgcmFuZ2UucjEsIHJhbmdlLmMxLCB4MSwgeTEsIHcsIGgsIHBhcmVudERpdiwgY2VsbFNlbGVjdGVkKTtcbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGZpbmRSb3dPZkltcG9ydGFudFJvd3NwYW5DZWxsKGFyZWFNb2RlbDogQXJlYU1vZGVsSWYsIHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1heFJvd3NwYW4gPSBhcmVhTW9kZWwuZ2V0TWF4Um93c3BhbigpO1xuICAgIGZvciAobGV0IHIgPSByb3dJbmRleCAtIDE7IHIgPiAtMTsgci0tKSB7XG4gICAgICBjb25zdCByb3dzcGFuID0gYXJlYU1vZGVsLmdldFJvd3NwYW5BdChyLCBjb2xJbmRleCk7XG4gICAgICBpZiAocm93c3BhbiA+IDEgJiYgciArIHJvd3NwYW4gKyAxID49IHJvd0luZGV4KSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuICAgICAgaWYgKHJvd0luZGV4IC0gciA+IG1heFJvd3NwYW4pIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRqdXN0Q29sdW1uc1RvUm93UGFyZW50KFxuICAgIHtcbiAgICAgIGFyZWFJZGVudCxcbiAgICAgIHNpZGVJZGVudCxcbiAgICAgIGFyZWFNb2RlbCxcbiAgICAgIGdlbyxcbiAgICAgIHBhcmVudCxcbiAgICAgIHJvd0luZGV4LFxuICAgICAgY29sdW1uSW5kZXhTdGFydCxcbiAgICAgIGNvbHVtbkluZGV4RW5kLFxuICAgICAgdmVydGljYWxGaXhlZCA9IGZhbHNlLFxuICAgICAgZmlyc3RWaXNpYmxlUm93ID0gZmFsc2VcbiAgICB9OiBBcmdzQWRqdXN0Q29sdW1uc1RvUm93UGFyZW50UGFyYW1zLFxuICApOiB2b2lkIHtcblxuICAgIHRoaXMuc2Nyb2xsVmlld3BvcnRMZWZ0ID0gdGhpcy5zY3JvbGxWaWV3cG9ydC5zY3JvbGxMZWZ0O1xuICAgIGxldCB2aXJ0dWFsUm93RGl2TGVmdCA9IDA7XG4gICAgaWYgKCF2ZXJ0aWNhbEZpeGVkKSB7XG4gICAgICBjb25zdCB2aXJ0dWFsUm93RGl2TGVmdEYxID0gKHRoaXMuYXJlYUJvZHlDZW50ZXJHZW8ud2lkdGgpIC0gdGhpcy50YWJsZU1vZGVsLmdldENvbnRlbnRXaWR0aEluUGl4ZWwoKTtcbiAgICAgIHZpcnR1YWxSb3dEaXZMZWZ0ID0gdGhpcy5zY3JvbGxGYWN0b3JYICogdmlydHVhbFJvd0RpdkxlZnRGMTtcbiAgICB9XG5cbiAgICBjb25zdCB0b3AgPSAwO1xuICAgIC8vIGNvbnN0IHRyYWNrQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoID09PSAwICYmIGFyZWFJZGVudCA9PT0gJ2JvZHknICYmIHNpZGVJZGVudCA9PT0gJ2NlbnRlcic7XG4gICAgY29uc3QgcmVuZGVyU2VsZWN0aW9uID0gKGFyZWFJZGVudCA9PT0gJ2JvZHknKTtcblxuICAgIGxldCB4ID0gdmlydHVhbFJvd0RpdkxlZnQ7XG4gICAgZm9yIChsZXQgaW5kZXggPSBjb2x1bW5JbmRleFN0YXJ0OyBpbmRleCA8PSBjb2x1bW5JbmRleEVuZDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgbGVmdCA9IHg7XG4gICAgICBjb25zdCB3ID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbldpZHRoKGluZGV4KTtcbiAgICAgIGlmIChsZWZ0ICsgdyA+IDApIHtcbiAgICAgICAgLy8gVmlzaWJsZSEgUmVuZGVyIGNlbGwgZGl2OlxuXG4gICAgICAgIC8vIGNhbGMgaGVpZ2h0OlxuICAgICAgICBsZXQgaGVpZ2h0ID0gZ2VvLmhlaWdodDtcbiAgICAgICAgbGV0IHJvd3NwYW4gPSBhcmVhTW9kZWwuZ2V0Um93c3BhbkF0KHJvd0luZGV4LCBpbmRleCk7XG4gICAgICAgIGxldCBjb2xzcGFuID0gYXJlYU1vZGVsLmdldENvbHNwYW5BdChyb3dJbmRleCwgaW5kZXgpO1xuXG4gICAgICAgIGlmIChyb3dzcGFuID4gMSkge1xuICAgICAgICAgIGhlaWdodCA9IHRoaXMuZ2V0Um93SGVpZ2h0cyhyb3dJbmRleCwgcm93SW5kZXggKyByb3dzcGFuIC0gMSwgYXJlYU1vZGVsKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB3aWR0aCA9IHc7XG4gICAgICAgIGlmIChjb2xzcGFuID4gMSkge1xuICAgICAgICAgIHdpZHRoID0gdGhpcy5nZXRDb2x1bW5XaWR0aHMoaW5kZXgsIGluZGV4ICsgY29sc3BhbiAtIDEpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNraXAgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFyZWFJZGVudCA9PT0gJ2JvZHknKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29sQW5kUm93c3Bhbk1vZGVsPy5pc0luUmFuZ2Uocm93SW5kZXgsIGluZGV4KSkge1xuICAgICAgICAgICAgc2tpcCA9IHRydWU7IC8vIGZvciB0aGUgYm9keSBhcmVhIHdlIGRvbid0IHdhbnQgdG8gdG8gcmVuZGVyIHRoZSBzbWFsbCBzaW5nbGUgY2VsbHNcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZ1RhcmdldENvbHVtbkluZGV4ID09PSBpbmRleCAmJiBhcmVhSWRlbnQgIT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZW5kZXJEcmFnVGFyZ2V0RGl2KHBhcmVudCwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLmRvbS5hZGRDb2x1bW5Cb3JkZXJEaXZzKHBhcmVudCwge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGNlbGxTZWxlY3RlZCA9IHRoaXMucmVuZGVyU2VsZWN0ZWRCYWNrZ3JvdW5kRGl2KHNraXAsIHJlbmRlclNlbGVjdGlvbiwgYXJlYU1vZGVsLCByb3dJbmRleCwgaW5kZXgsIHBhcmVudCwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgIGlmICghc2tpcCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDZWxsKGFyZWFNb2RlbCwgYXJlYUlkZW50LCByb3dJbmRleCwgaW5kZXgsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcGFyZW50LCBjZWxsU2VsZWN0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXJlYUlkZW50ID09PSAnaGVhZGVyJyAmJiB0aGlzLnRhYmxlT3B0aW9ucy5jb2x1bW5zUmVzaXphYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckhlYWRlckNlbGxSZXNpemVIYW5kbGUocm93SW5kZXgsIGluZGV4LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIHBhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHggPSB4ICsgdztcbiAgICAgIGlmICh4ID4gdGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJlZUFycm93Q29sdW1uSW5kZXgoKTogMCB8IDEge1xuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucy5zaG93Q2hlY2tib3hXaWhvdXRFeHRyYUNvbHVtbikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYmxlTW9kZWwuaXNSb3dDaGVja2JveFZpc2libGUoKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZEFuZFJlbmRlckNlbGxEaXYoXG4gICAge1xuICAgICAgYXJlYU1vZGVsLFxuICAgICAgYXJlYUlkZW50LFxuICAgICAgcm93SW5kZXgsXG4gICAgICBpbmRleCxcbiAgICAgIGxlZnQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRvcCxcbiAgICAgIHBhcmVudFxuICAgIH06IEFyZ3NSZW5kZXJDZWxsRGl2KTogW0hUTUxEaXZFbGVtZW50LCBSZW5kZXJlckNsZWFudXBGblR5cGUgfCB1bmRlZmluZWRdIHtcblxuXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZW5kZXJlciAmJiB0aGlzLmVkaXRvclJlbmRlcmVyUm93ID09PSByb3dJbmRleCAmJiB0aGlzLmVkaXRvclJlbmRlcmVyQ29sdW1uID09PSBpbmRleDtcbiAgICBjb25zdCBjZWxsUmVuZGVyZXIgPSAoZWRpdG9yKSA/IHRoaXMuZWRpdG9yUmVuZGVyZXIgOiBhcmVhTW9kZWwuZ2V0Q2VsbFJlbmRlcmVyKHJvd0luZGV4LCBpbmRleCk7XG4gICAgY29uc3QgZ2VvID0ge2xlZnQsIHdpZHRoLCBoZWlnaHQsIHRvcCwgaW5kZXh9O1xuICAgIGNvbnN0IHJvd09iamVjdCA9IGFyZWFNb2RlbC5nZXRSb3dCeUluZGV4KHJvd0luZGV4KTtcbiAgICBsZXQgdHJlZUFycm93OiBUcmVlQXJyb3dUeXBlID0gJ25vbmUnO1xuXG4gICAgY29uc3QgYXJyb3dJbmRleE9rID0gaW5kZXggPT09IHRoaXMuZ2V0VHJlZUFycm93Q29sdW1uSW5kZXgoKTtcblxuICAgIGlmIChhcnJvd0luZGV4T2sgJiYgcm93T2JqZWN0IGluc3RhbmNlb2YgVHJlZVJvdykge1xuICAgICAgY29uc3QgdHIgPSByb3dPYmplY3QgYXMgVHJlZVJvdzxhbnk+O1xuICAgICAgaWYgKHRyLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRyLmV4cGFuZGVkKSB7XG4gICAgICAgICAgdHJlZUFycm93ID0gJ2V4cGFuZGVkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cmVlQXJyb3cgPSAnY29sbGFwc2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJlZUFycm93ID0gJ2hpZGRlbic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNvcnRTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJlYUlkZW50ID09PSAnaGVhZGVyJykge1xuICAgICAgY29uc3QgY29sdW1uRGVmID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbkRlZihpbmRleCk7XG4gICAgICBpZiAoIWNvbHVtbkRlZj8uc29ydEljb25WaXNpYmxlIHx8IGNvbHVtbkRlZj8uc29ydEljb25WaXNpYmxlKCkpIHtcbiAgICAgICAgc29ydFN0YXRlID0gY29sdW1uRGVmPy5zb3J0U3RhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmFsID0gYXJlYU1vZGVsLmdldFZhbHVlQXQocm93SW5kZXgsIGluZGV4KTtcbiAgICBjb25zdCB0ZXh0ID0gY2VsbFJlbmRlcmVyID8gJycgOiBgJHt2YWx9YDtcbiAgICBjb25zdCBjaGVja2VkVHlwZSA9IGFyZWFNb2RlbC5pc1Jvd0NoZWNrZWQocm93SW5kZXgpO1xuICAgIGNvbnN0IGNlbGwgPSB0aGlzLmRvbS5hZGRDb2x1bW5EaXYocGFyZW50LCBnZW8sIHJvd0luZGV4LCBpbmRleCwgYXJlYUlkZW50LCB0ZXh0LCB0cmVlQXJyb3csIHRoaXMudGFibGVPcHRpb25zLCBjaGVja2VkVHlwZSwgc29ydFN0YXRlKTtcblxuICAgIGNvbnN0IHRvb2x0aXAgPSBhcmVhTW9kZWwuZ2V0VG9vbHRpcEF0KHJvd0luZGV4LCBpbmRleCk7XG4gICAgaWYgKHRvb2x0aXApIHtcbiAgICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShjZWxsLCAndGl0bGUnLCB0b29sdGlwKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5EZWYgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGluZGV4KTtcbiAgICBpZiAoY29sdW1uRGVmICYmIGNvbHVtbkRlZi5jbGFzc2VzW2FyZWFJZGVudF0pIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzZXMoY29sdW1uRGVmLmNsYXNzZXNbYXJlYUlkZW50XSwgY2VsbCk7XG4gICAgfVxuXG4gICAgbGV0IGZuOiBSZW5kZXJlckNsZWFudXBGblR5cGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNlbGxSZW5kZXJlcikge1xuICAgICAgZm4gPSBjZWxsUmVuZGVyZXIucmVuZGVyKGNlbGwsIHJvd0luZGV4LCBpbmRleCwgYXJlYUlkZW50LCBhcmVhTW9kZWwsIHZhbCwgdGhpcy5kb20uZG9tU2VydmljZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NlcyA9IGFyZWFNb2RlbC5nZXRDdXN0b21DbGFzc2VzQXQocm93SW5kZXgsIGluZGV4KTtcbiAgICBpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzZXMoY2xhc3NlcywgY2VsbCk7XG4gICAgfVxuICAgIHRoaXMuZG9tLmFkZENvbHVtbkJvcmRlckRpdnMocGFyZW50LCBnZW8pO1xuICAgIGlmICh0aGlzLmdldEZvY3VzTW9kZWwgJiYgYXJlYUlkZW50ID09PSAnYm9keScpIHtcbiAgICAgIGNvbnN0IGZtID0gdGhpcy5nZXRGb2N1c01vZGVsKCk7XG4gICAgICBpZiAoZm0/Lmhhc0ZvY3VzKHJvd0luZGV4LCBpbmRleCkpIHtcbiAgICAgICAgdGhpcy5kb20uYWRkRm9jdXNCb3JkZXJEaXZzKHBhcmVudCwgZ2VvLCB7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcmVhSWRlbnQgPT09ICdoZWFkZXInKSB7XG4gICAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUoY2VsbCwgJ2RhdGEtZ2UtYWN0aW9uJywgJ2RyYWctY29sdW1uJyk7XG4gICAgfVxuICAgIHJldHVybiBbY2VsbCwgZm5dO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvbHVtbldpZHRocyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgcmV0OiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcbiAgICAgIHJldC5wdXNoKHRoaXMudGFibGVNb2RlbC5nZXRDb2x1bW5XaWR0aChpKSlcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dIZWlnaHRzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgYXJlYU1vZGVsOiBBcmVhTW9kZWxJZik6IG51bWJlcltdIHtcbiAgICBjb25zdCByZXQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgcmV0LnB1c2goYXJlYU1vZGVsLmdldFJvd0hlaWdodChpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRqdXN0SG92ZXJSb3dzKG1vdXNlTW92ZUV2ZW50OiBHZU1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy50YWJsZU9wdGlvbnMuaG92ZXJSb3dWaXNpYmxlICYmIG1vdXNlTW92ZUV2ZW50LnJvd0luZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5ob3N0RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMudGFibGVNb2RlbC5nZXRBcmVhTW9kZWwoJ2JvZHknKS5nZXRSb3dIZWlnaHQobW91c2VNb3ZlRXZlbnQucm93SW5kZXgpO1xuICAgICAgY29uc3QgdG9wID0gbW91c2VNb3ZlRXZlbnQucm93VG9wICsgdGhpcy5hcmVhSGVhZGVyQ2VudGVyLnBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB0aGlzLmRvbS5hcHBseVN0eWxlKHRoaXMuaG92ZXJSb3csIHtcbiAgICAgICAgJ2xlZnQnOiAnMCcsXG4gICAgICAgICd0b3AnOiB0b3AgKyAncHgnLFxuICAgICAgICAnd2lkdGgnOiB3aWR0aCArICdweCcsXG4gICAgICAgICdoZWlnaHQnOiByb3dIZWlnaHQgKyAncHgnLFxuICAgICAgICAnZGlzcGxheSc6ICdibG9jaydcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGVIb3ZlclJvdygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlSG92ZXJSb3coKSB7XG4gICAgdGhpcy5kb20uYXBwbHlTdHlsZSh0aGlzLmhvdmVyUm93LCB7XG4gICAgICAnZGlzcGxheSc6ICdub25lJ1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkanVzdEhvdmVyQ29sdW1ucyhtb3VzZU1vdmVFdmVudDogR2VNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMudGFibGVPcHRpb25zLmhvdmVyQ29sdW1uVmlzaWJsZSAmJiBtb3VzZU1vdmVFdmVudC5yb3dJbmRleCA+IC0xKSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhvc3RFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbldpZHRoKG1vdXNlTW92ZUV2ZW50LmNvbHVtbkluZGV4KVxuICAgICAgY29uc3QgbGVmdCA9IG1vdXNlTW92ZUV2ZW50LmNvbHVtbkxlZnQgKyB0aGlzLnRhYmxlTW9kZWwuZ2V0UGFkZGluZygpLmxlZnQ7XG4gICAgICB0aGlzLmRvbS5hcHBseVN0eWxlKHRoaXMuaG92ZXJDb2x1bW4sIHtcbiAgICAgICAgJ2xlZnQnOiAobGVmdCkgKyAncHgnLFxuICAgICAgICAndG9wJzogJzBweCcsXG4gICAgICAgICd3aWR0aCc6IHdpZHRoICsgJ3B4JyxcbiAgICAgICAgJ2hlaWdodCc6IGhlaWdodCArICdweCcsXG4gICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJ1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZUhvdmVyQ29sdW1uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVIb3ZlckNvbHVtbigpIHtcbiAgICB0aGlzLmRvbS5hcHBseVN0eWxlKHRoaXMuaG92ZXJDb2x1bW4sIHtcbiAgICAgICdkaXNwbGF5JzogJ25vbmUnXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVib3VuY2UoZm46IEZ1bmN0aW9uLCBkZWxheTogbnVtYmVyID0gMTAwMCkge1xuICAgIGlmICh0aGlzLmRlYm91bmNlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVib3VuY2VUaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZuLmJpbmQodGhpcyksIGRlbGF5KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRHJhZ1RhcmdldERpdihwYXJlbnQ6IEhUTUxEaXZFbGVtZW50LCBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IEhUTUxEaXZFbGVtZW50IHtcbiAgICBjb25zdCBkaXYgPSB0aGlzLmRvbS5hcHBseVN0eWxlUG9zaXN0aW9uQWJzb2x1dGUoXG4gICAgICB0aGlzLmRvbS5jcmVhdGVEaXZXaXRoQ2xhc3MoJ2dlLXRhYmxlLWRyb3Atem9uZScsIHBhcmVudClcbiAgICApO1xuICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCAnd2lkdGgnLCBgJHt3aWR0aH1weGApO1xuICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgIHJldHVybiBkaXY7XG4gIH1cblxuXG4gIHByaXZhdGUgcmVuZGVyU2VsZWN0ZWRCYWNrZ3JvdW5kRGl2KHNraXA6IGJvb2xlYW4sIHJlbmRlclNlbGVjdGlvbjogYm9vbGVhbiwgYXJlYU1vZGVsOiBBcmVhTW9kZWxJZiwgcm93SW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlciwgcGFyZW50OiBIVE1MRGl2RWxlbWVudCwgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBsZXQgY2VsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKCFza2lwICYmIHJlbmRlclNlbGVjdGlvbiAmJiBhcmVhTW9kZWwuaXNTZWxlY3RhYmxlKHJvd0luZGV4LCBpbmRleCkpIHtcbiAgICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsID0gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgICAgICBjb25zdCBjb3VudCA9IHNlbGVjdGlvbk1vZGVsLmdldFNlbGVjdGlvbkNvdW50KHJvd0luZGV4LCBpbmRleCk7XG4gICAgICAgICAgY2VsbFNlbGVjdGVkID0gY291bnQgPiAwO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGl2ID0gdGhpcy5kb20uYXBwbHlTdHlsZVBvc2lzdGlvbkFic29sdXRlKFxuICAgICAgICAgICAgICB0aGlzLmRvbS5jcmVhdGVEaXZXaXRoQ2xhc3MoJ2dlLXRhYmxlLXNlbGVjdGVkLXJhbmdlJywgcGFyZW50KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XG4gICAgICAgICAgICB0aGlzLmRvbS5zZXRTdHlsZShkaXYsICd0b3AnLCBgJHt0b3B9cHhgKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2VsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDZWxsKFxuICAgIGFyZWFNb2RlbDogQXJlYU1vZGVsSWYsXG4gICAgYXJlYUlkZW50OiBBcmVhSWRlbnQsXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGxlZnQ6IG51bWJlcixcbiAgICB0b3A6IG51bWJlcixcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIHBhcmVudDogSFRNTERpdkVsZW1lbnQsXG4gICAgY2VsbFNlbGVjdGVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgW2RpdiwgZm5dID0gdGhpcy5hZGRBbmRSZW5kZXJDZWxsRGl2KHtcbiAgICAgIGFyZWFNb2RlbCxcbiAgICAgIGFyZWFJZGVudCxcbiAgICAgIHJvd0luZGV4LFxuICAgICAgaW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgbGVmdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdG9wLFxuICAgICAgcGFyZW50XG4gICAgfSk7XG4gICAgaWYgKGNlbGxTZWxlY3RlZCkge1xuICAgICAgdGhpcy5kb20uYWRkQ2xhc3MoJ2dlLWNlbGwtc2VsZWN0ZWQnLCBkaXYpO1xuICAgIH1cbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuY2xlYW51cEZ1bmN0aW9uc1thcmVhSWRlbnRdLnB1c2goZm4pO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJpdmF0ZSByZW5kZXJIZWFkZXJDZWxsUmVzaXplSGFuZGxlKFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBjZWxsTGVmdDogbnVtYmVyLFxuICAgIGNlbGxUb3A6IG51bWJlcixcbiAgICBjZWxsV2lkdGg6IG51bWJlcixcbiAgICBjZWxsSGVpZ2h0OiBudW1iZXIsXG4gICAgcGFyZW50OiBIVE1MRGl2RWxlbWVudCkge1xuXG4gICAgY29uc3QgZG9tU2VydmljZSA9IHRoaXMuZG9tLmRvbVNlcnZpY2U7XG4gICAgY29uc3QgaGFuZGxlV2lkdGggPSB0aGlzLnRhYmxlT3B0aW9ucy5jb2x1bW5SZXNpemVIYW5kbGVXaWR0aEluUHggPz8gMztcblxuICAgIGNvbnN0IGRpdiA9IGRvbVNlcnZpY2UuY3JlYXRlRWxlbWVudDxIVE1MRGl2RWxlbWVudD4oJ2RpdicpO1xuICAgIGRvbVNlcnZpY2Uuc2V0QXR0cmlidXRlKGRpdiwgJ2RhdGEtY29sLWluZGV4JywgYCR7Y29sdW1uSW5kZXh9YCk7XG4gICAgZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCAnZGF0YS1yb3ctaW5kZXgnLCBgJHtyb3dJbmRleH1gKTtcbiAgICBkb21TZXJ2aWNlLnNldEF0dHJpYnV0ZShkaXYsICdkYXRhLWFyZWEnLCAnaGVhZGVyJyk7XG4gICAgZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCAnZGF0YS1nZS1hY3Rpb24nLCAncmVzaXplLWNvbHVtbicpO1xuICAgIC8vIGRvbVNlcnZpY2Uuc2V0QXR0cmlidXRlKGRpdiwgJ2RhdGEtZ2UtYWN0aW9uJywgJ2NvbHVtbi1yZXNpemUnKTtcbiAgICBkb21TZXJ2aWNlLmFkZENsYXNzKGRpdiwgYGdlLXRhYmxlLWNvbC1yZXNpemUtaGFuZGxlYCk7XG4gICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsICdkaXNwbGF5JywgJ2NsaXAnKTtcbiAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsICdjdXJzb3InLCAnY29sLXJlc2l6ZScpO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnbGVmdCcsIGAkeyhjZWxsTGVmdCArIGNlbGxXaWR0aCAtIGhhbmRsZVdpZHRoKX1weGApO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAndG9wJywgYCR7Y2VsbFRvcH1weGApO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnd2lkdGgnLCBgJHtoYW5kbGVXaWR0aH1weGApO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCAnaGVpZ2h0JywgYCR7Y2VsbEhlaWdodH1weGApO1xuICAgIGRvbVNlcnZpY2UuYXBwZW5kQ2hpbGQocGFyZW50LCBkaXYpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdW0oYXJyOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG59XG5cbiJdfQ==
|
|
595
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXNjb3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90YWJsZS9zcmMvbGliL3RhYmxlL3JlbmRlci1zY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBYXZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRXZGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxNQUFNLE9BQU8sV0FBWSxTQUFRLFFBQVE7SUErQnZDLFlBQ0UsV0FBMkIsRUFDM0IsVUFBd0IsRUFDeEIsR0FBMEIsRUFDMUIsWUFBNEI7UUFFNUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBaEMxQyxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRVQscUJBQWdCLEdBSS9CO1lBQ0YsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUNRLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQUNqQyx3QkFBbUIsR0FBMEMsSUFBSSxhQUFhLEVBQXNCLENBQUM7UUFDckcseUJBQW9CLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUIsOEJBQXlCLEdBQUcsQ0FBQyxDQUFD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QUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2hELFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDdEQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUN0RCxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVTY29wZSB9IGZyb20gXCIuL2VsZS1zY29wZVwiO1xuaW1wb3J0IHsgVGFibGVNb2RlbElmIH0gZnJvbSBcIi4vZGF0YS90YWJsZW1vZGVsL3RhYmxlLW1vZGVsLmlmXCI7XG5pbXBvcnQgeyBDb252ZW5pZW5jZURvbVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlL2NvbnZlbmllbmNlLWRvbS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUYWJsZU9wdGlvbnNJZiB9IGZyb20gXCIuL2RhdGEvb3B0aW9ucy90YWJsZS1vcHRpb25zLmlmXCI7XG5pbXBvcnQgeyBDZWxsUmFuZ2UgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9jZWxsLXJhbmdlXCI7XG5pbXBvcnQgeyBSZW5kZXJlckNsZWFudXBGblR5cGUgfSBmcm9tIFwiLi9yZW5kZXJlci9yZW5kZXJlci1jbGVhbnVwLWZuLnR5cGVcIjtcbmltcG9ydCB7IEFyZWFJZGVudCB9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhLWlkZW50LnR5cGVcIjtcbmltcG9ydCB7IFNpZGVJZGVudCB9IGZyb20gXCIuL2RhdGEvc2lkZS1pZGVudC50eXBlXCI7XG5pbXBvcnQgeyBEaXZTY29wZSB9IGZyb20gXCIuL2RhdGEvZGl2LXNjb3BlLnR5cGVcIjtcbmltcG9ydCB7IEFyZWFNb2RlbElmIH0gZnJvbSBcIi4vZGF0YS90YWJsZW1vZGVsL2FyZWFtb2RlbC9hcmVhLW1vZGVsLmlmXCI7XG5pbXBvcnQgeyBBcmdzQWRqdXN0Q29sdW1uc1RvUm93UGFyZW50UGFyYW1zIH0gZnJvbSBcIi4vZGF0YS9jb21tb24vYXJncy1hZGp1c3QtY29sdW1ucy10by1yb3ctcGFyZW50LXBhcmFtc1wiO1xuaW1wb3J0IHsgQXJnc1JlbmRlckNlbGxEaXYgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9hcmdzLXJlbmRlci1jZWxsLWRpdlwiO1xuaW1wb3J0IHsgVHJlZUFycm93VHlwZSB9IGZyb20gXCIuL2RhdGEvY29tbW9uL3RyZWUtYXJyb3cudHlwZVwiO1xuaW1wb3J0IHsgVHJlZVJvdyB9IGZyb20gXCIuL2RhdGEvY29tbW9uL3RyZWUtcm93XCI7XG5pbXBvcnQgeyBTdG9yZVN0YXRlU2Nyb2xsUG9zU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2Uvc3RvcmUtc3RhdGUtc2Nyb2xsLXBvcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBHZU1vdXNlRXZlbnQgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9ldmVudC9nZS1tb3VzZS1ldmVudFwiO1xuaW1wb3J0IHsgQXJlYU1vZGVsVHJlZSB9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhbW9kZWwvYXJlYS1tb2RlbC10cmVlXCI7XG5pbXBvcnQgeyBHZW9EYXRhIH0gZnJvbSBcIi4vZGF0YS9nZW8tZGF0YVwiO1xuaW1wb3J0IHsgQ2VsbFJlbmRlcmVySWYgfSBmcm9tIFwiLi9yZW5kZXJlci9jZWxsLXJlbmRlci5pZlwiO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWxJZiB9IGZyb20gXCIuL3NlbGVjdGlvbi9zZWxlY3Rpb24tbW9kZWwuaWZcIjtcbmltcG9ydCB7IEdldFQgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9nZXQtdFwiO1xuaW1wb3J0IHsgRm9jdXNNb2RlbElmIH0gZnJvbSBcIi4vZm9jdXMvZm9jdXMtbW9kZWwuaWZcIjtcbmltcG9ydCB7IENvbEFuZFJvd3NwYW5Nb2RlbCB9IGZyb20gXCIuL2RhdGEvdGFibGVtb2RlbC9hcmVhbW9kZWwvY29sLWFuZC1yb3dzcGFuLW1vZGVsXCI7XG5pbXBvcnQgeyBBcmVhT2JqZWN0TWFwVHlwZSB9IGZyb20gXCIuL2RhdGEvY29tbW9uL2FyZWEtbWFwLnR5cGVcIjtcbmltcG9ydCB7IEFyZWFPYmplY3RNYXAgfSBmcm9tIFwiLi9kYXRhL2NvbW1vbi9hcmVhLW1hcFwiO1xuXG5leHBvcnQgY2xhc3MgUmVuZGVyU2NvcGUgZXh0ZW5kcyBFbGVTY29wZSB7XG5cbiAgcHJvdGVjdGVkIHN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlPzogU3RvcmVTdGF0ZVNjcm9sbFBvc1NlcnZpY2U7XG4gIHByb3RlY3RlZCBnZXRTZWxlY3Rpb25Nb2RlbD86IEdldFQ8U2VsZWN0aW9uTW9kZWxJZj47XG4gIHByb3RlY3RlZCBnZXRGb2N1c01vZGVsPzogR2V0VDxGb2N1c01vZGVsSWY+OyAvLyBUT0RPIHVzZSBpdCFcbiAgcHJvdGVjdGVkIHNjcm9sbExlZnQgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsVmlld3BvcnRMZWZ0ID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbEZhY3RvclkgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsRmFjdG9yWCA9IDA7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsZWFudXBGdW5jdGlvbnM6IHtcbiAgICBoZWFkZXI6IChSZW5kZXJlckNsZWFudXBGblR5cGUpW10sXG4gICAgYm9keTogKFJlbmRlcmVyQ2xlYW51cEZuVHlwZSlbXSxcbiAgICBmb290ZXI6IChSZW5kZXJlckNsZWFudXBGblR5cGUpW10sXG4gIH0gPSB7XG4gICAgaGVhZGVyOiBbXSxcbiAgICBib2R5OiBbXSxcbiAgICBmb290ZXI6IFtdXG4gIH07XG4gIHByb3RlY3RlZCB0cmVlID0gZmFsc2U7XG4gIHByb3RlY3RlZCByYW5nZUVsZXM6IEhUTUxEaXZFbGVtZW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIGNvbEFuZFJvd3NwYW5Nb2RlbHM6IEFyZWFPYmplY3RNYXBUeXBlPENvbEFuZFJvd3NwYW5Nb2RlbD4gPSBuZXcgQXJlYU9iamVjdE1hcDxDb2xBbmRSb3dzcGFuTW9kZWw+KCk7XG4gIHByb3RlY3RlZCBmaXJzdFZpc2libGVSb3dJbmRleCA9IC0xO1xuXG4gIHByb3RlY3RlZCBkcmFnZ2luZ1RhcmdldENvbHVtbkluZGV4ID0gLTE7XG4gIHByb3RlY3RlZCBtb3VzZUV2ZW50PzogR2VNb3VzZUV2ZW50O1xuICBwcml2YXRlIGRlYm91bmNlVGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbDtcbiAgcHJpdmF0ZSBlZGl0b3JSZW5kZXJlcj86IENlbGxSZW5kZXJlcklmO1xuICBwcml2YXRlIGVkaXRvclJlbmRlcmVyQ29sdW1uPzogbnVtYmVyO1xuICBwcml2YXRlIGVkaXRvclJlbmRlcmVyUm93PzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3RFbGVtZW50OiBIVE1MRGl2RWxlbWVudCxcbiAgICB0YWJsZU1vZGVsOiBUYWJsZU1vZGVsSWYsXG4gICAgZG9tOiBDb252ZW5pZW5jZURvbVNlcnZpY2UsXG4gICAgdGFibGVPcHRpb25zOiBUYWJsZU9wdGlvbnNJZlxuICApIHtcbiAgICBzdXBlcihob3N0RWxlbWVudCwgdGFibGVNb2RlbCwgZG9tLCB0YWJsZU9wdGlvbnMpO1xuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucz8uZ2V0U2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwgPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVPcHRpb25zPy5nZXRGb2N1c01vZGVsKSB7XG4gICAgICB0aGlzLmdldEZvY3VzTW9kZWwgPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRGb2N1c01vZGVsO1xuICAgIH1cbiAgICBpZiAodGFibGVNb2RlbC5nZXRBcmVhTW9kZWwoXCJib2R5XCIpIGluc3RhbmNlb2YgQXJlYU1vZGVsVHJlZSkge1xuICAgICAgdGhpcy50cmVlID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYWVyZWFJZHM6IEFyZWFJZGVudFtdID0gW1wiaGVhZGVyXCIsIFwiYm9keVwiLCBcImZvb3RlclwiXTtcbiAgICBhZXJlYUlkcy5mb3JFYWNoKFxuICAgICAgYXJlYUlkZW50ID0+IHtcbiAgICAgICAgdGhpcy5jb2xBbmRSb3dzcGFuTW9kZWxzW2FyZWFJZGVudF0gPSBuZXcgQ29sQW5kUm93c3Bhbk1vZGVsKHRhYmxlTW9kZWwsIHRhYmxlTW9kZWwuZ2V0QXJlYU1vZGVsKGFyZWFJZGVudCkpO1xuICAgICAgICB0aGlzLmNvbEFuZFJvd3NwYW5Nb2RlbHNbYXJlYUlkZW50XT8uaW5pdCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByZXNldEVkaXRvclJlbmRlcmVyKCkge1xuICAgIHRoaXMuZWRpdG9yUmVuZGVyZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0b3JSZW5kZXJlclJvdyA9IC0xO1xuICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPSAtMTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICBjb25zdCBzbSA9IHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHNtPy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRSZW5kZXJFZGl0b3Iocm93SWR4OiBudW1iZXIsIGNvbElkeDogbnVtYmVyKSB7XG4gICAgbGV0IHJuRm4gPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGNvbElkeCk/LmdldEVkaXRSZW5kZXJlcjtcbiAgICBpZiAoIXJuRm4pIHtcbiAgICAgIHJuRm4gPSB0aGlzLnRhYmxlT3B0aW9ucy5nZXRFZGl0UmVuZGVyZXI7XG4gICAgfVxuICAgIGlmIChybkZuKSB7XG4gICAgICB0aGlzLmVkaXRvclJlbmRlcmVyID0gcm5Gbihyb3dJZHgsIGNvbElkeCk7XG5cbiAgICAgIGlmICh0aGlzLmVkaXRvclJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJSb3cgPSByb3dJZHg7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPSBjb2xJZHg7XG4gICAgICAgIHRoaXMucmVwYWludCgpO1xuICAgICAgICAvLyByZXF1ZXN0IGZvY3VzOlxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dC5nZS10YWJsZS1jZWxsLWVkaXRvci1pbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWRpdG9yUmVuZGVyZXJSb3cgPSAtMTtcbiAgICAgICAgdGhpcy5lZGl0b3JSZW5kZXJlckNvbHVtbiA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlcGFpbnQoKSB7XG4gICAgdGhpcy5hZGp1c3RBZnRlclNjcm9sbGluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmFibGVzOiBIVE1MRGl2RWxlbWVudFtdID0gW107XG5cbiAgb3ZlcnJpZGUgYWRqdXN0QWZ0ZXJTY3JvbGxpbmcoKSB7XG4gICAgZm9yIChjb25zdCBjbGVhbmluZyBvZiB0aGlzLnJlbW92YWJsZXMpIHtcbiAgICAgIGNsZWFuaW5nLnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLmhpZGVIb3ZlclJvdygpO1xuICAgIHRoaXMuaGlkZUhvdmVyQ29sdW1uKCk7XG5cbiAgICB0aGlzLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9wO1xuICAgIHRoaXMuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQuc2Nyb2xsTGVmdDtcbiAgICB0aGlzLmRlYm91bmNlKHRoaXMuY2hlY2tGb3JTY3JvbGxQb3NTYXZpbmcuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnNjcm9sbEZhY3RvclkgPSB0aGlzLnNjcm9sbFRvcCAvICh0aGlzLnNjcm9sbFZpZXdwb3J0LnNjcm9sbEhlaWdodCAtIHRoaXMuc2Nyb2xsVmlld3BvcnQuY2xpZW50SGVpZ2h0KTtcbiAgICB0aGlzLnNjcm9sbEZhY3RvclggPSB0aGlzLnNjcm9sbExlZnQgLyAodGhpcy5zY3JvbGxWaWV3cG9ydC5zY3JvbGxXaWR0aCAtIHRoaXMuc2Nyb2xsVmlld3BvcnQuY2xpZW50V2lkdGgpO1xuXG4gICAgaWYgKGlzTmFOKHRoaXMuc2Nyb2xsRmFjdG9yWSkpIHtcbiAgICAgIHRoaXMuc2Nyb2xsRmFjdG9yWSA9IDA7XG4gICAgfVxuICAgIGlmIChpc05hTih0aGlzLnNjcm9sbEZhY3RvclgpKSB7XG4gICAgICB0aGlzLnNjcm9sbEZhY3RvclggPSAwO1xuICAgIH1cblxuICAgIHRoaXMuYWRqdXN0Qm9keSgpO1xuICAgIHRoaXMuYWRqdXN0QXJlYShcImZvb3RlclwiKTtcbiAgICB0aGlzLmFkanVzdEFyZWEoXCJoZWFkZXJcIik7XG5cblxuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucy50YWJsZVRvcEJvcmRlclZpc2libGUpIHtcbiAgICAgIHRoaXMucmVtb3ZhYmxlcy5wdXNoKHRoaXMuZG9tLmFkZEhvcml6b250YWxCb3JkZXIoXG4gICAgICAgIG5ldyBHZW9EYXRhKDAsIHRoaXMuaG9zdEVsZW1lbnQuY2xpZW50V2lkdGgsIDEsIDApLFxuICAgICAgICB0aGlzLmhvc3RFbGVtZW50LFxuICAgICAgICBcImdlLXRhYmxlLXJvdy1ib3JkZXJcIikpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YWJsZU9wdGlvbnMudGFibGVCb3R0b21Cb3JkZXJWaXNpYmxlKSB7XG4gICAgICB0aGlzLnJlbW92YWJsZXMucHVzaCh0aGlzLmRvbS5hZGRIb3Jpem9udGFsQm9yZGVyKFxuICAgICAgICBuZXcgR2VvRGF0YSgwLCB0aGlzLmhvc3RFbGVtZW50LmNsaWVudFdpZHRoLCAxLCB0aGlzLmhvc3RFbGVtZW50LmNsaWVudEhlaWdodCAtIDEpLFxuICAgICAgICB0aGlzLmhvc3RFbGVtZW50LFxuICAgICAgICBcImdlLXRhYmxlLXJvdy1ib3JkZXJcIikpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRm9yU2Nyb2xsUG9zU2F2aW5nKCkge1xuICAgIGlmICh0aGlzLnN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlXG4gICAgICAmJiB0aGlzLnRhYmxlT3B0aW9ucz8uYXV0b1Jlc3RvcmVPcHRpb25zPy5hdXRvUmVzdG9yZVNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnN0b3JlU2Nyb2xsUG9zU3RhdGVTZXJ2aWNlLnVwZGF0ZVNjcm9sbE9mZnNldChbdGhpcy5zY3JvbGxMZWZ0LCB0aGlzLnNjcm9sbFRvcF0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBcmVhQW5kU2lkZUlkZW50QnlBdHRyKHNyY0VsZW1lbnQ6IEhUTUxFbGVtZW50KTogW0FyZWFJZGVudCB8IHVuZGVmaW5lZCwgU2lkZUlkZW50IHwgdW5kZWZpbmVkXSB7XG4gICAgaWYgKHNyY0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGRhdGFBcmVhID0gdGhpcy5nZXRTdHJpbmdCeUF0dHIoc3JjRWxlbWVudCwgXCJkYXRhLWFyZWFcIik7XG4gICAgICBjb25zdCBkYXRhU2lkZSA9IHRoaXMuZ2V0U3RyaW5nQnlBdHRyKHNyY0VsZW1lbnQsIFwiZGF0YS1zaWRlXCIpO1xuICAgICAgLy8gZm9vdGVyIGdlaHQgbmljaHQgIGNvbnNvbGUuaW5mbyhkYXRhQXJlYSwgc3JjRWxlbWVudClcbiAgICAgIGlmIChkYXRhU2lkZSAmJiBkYXRhQXJlYSkge1xuICAgICAgICByZXR1cm4gW2RhdGFBcmVhLCBkYXRhU2lkZV0gYXMgW0FyZWFJZGVudCwgU2lkZUlkZW50XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXJlYShyb3dJZGVudDogQXJlYUlkZW50LCBzaWRlSWRlbnQ6IFNpZGVJZGVudCk6IERpdlNjb3BlIHtcbiAgICBpZiAocm93SWRlbnQgPT09IFwiaGVhZGVyXCIpIHtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwid2VzdFwiKSByZXR1cm4gdGhpcy5hcmVhSGVhZGVyV2VzdDtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwiY2VudGVyXCIpIHJldHVybiB0aGlzLmFyZWFIZWFkZXJDZW50ZXI7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSBcImVhc3RcIikgcmV0dXJuIHRoaXMuYXJlYUhlYWRlckVhc3Q7XG4gICAgfSBlbHNlIGlmIChyb3dJZGVudCA9PT0gXCJib2R5XCIpIHtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwid2VzdFwiKSByZXR1cm4gdGhpcy5hcmVhQm9keVdlc3Q7XG4gICAgICBpZiAoc2lkZUlkZW50ID09PSBcImNlbnRlclwiKSByZXR1cm4gdGhpcy5hcmVhQm9keUNlbnRlcjtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwiZWFzdFwiKSByZXR1cm4gdGhpcy5hcmVhQm9keUVhc3Q7XG4gICAgfSBlbHNlIGlmIChyb3dJZGVudCA9PT0gXCJmb290ZXJcIikge1xuICAgICAgaWYgKHNpZGVJZGVudCA9PT0gXCJ3ZXN0XCIpIHJldHVybiB0aGlzLmFyZWFGb290ZXJXZXN0O1xuICAgICAgaWYgKHNpZGVJZGVudCA9PT0gXCJjZW50ZXJcIikgcmV0dXJuIHRoaXMuYXJlYUZvb3RlckNlbnRlcjtcbiAgICAgIGlmIChzaWRlSWRlbnQgPT09IFwiZWFzdFwiKSByZXR1cm4gdGhpcy5hcmVhRm9vdGVyRWFzdDtcbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoYFdyb25nIGFyZWEgaWRlbnRpZmllcjogcm93OiR7cm93SWRlbnR9LCBjb2w6JHtzaWRlSWRlbnR9YCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRqdXN0Qm9keSgpIHtcbiAgICBjb25zdCB2aXJ0dWFsUm93RGl2VG9wRjEgPSB0aGlzLmFyZWFCb2R5Q2VudGVyR2VvLmhlaWdodCAtIHRoaXMudGFibGVNb2RlbC5nZXRDb250ZW50SGVpZ2h0SW5QaXhlbCgpO1xuICAgIGNvbnN0IHZpcnR1YWxSb3dEaXZUb3AgPSB0aGlzLnNjcm9sbEZhY3RvclkgKiB2aXJ0dWFsUm93RGl2VG9wRjE7XG5cbiAgICB0aGlzLmRvbS5zZXRTdHlsZSh0aGlzLmNvbnRlbnREaXYsIFwidG9wXCIsIGAke3RoaXMuc2Nyb2xsVG9wfXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUodGhpcy5jb250ZW50RGl2LCBcImxlZnRcIiwgYCR7dGhpcy5zY3JvbGxWaWV3cG9ydC5zY3JvbGxMZWZ0fXB4YCk7XG5cbiAgICB0aGlzLmFkanVzdEFyZWEoXCJib2R5XCIsIHZpcnR1YWxSb3dEaXZUb3ApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE51bWJlckJ5QXR0cihzcmNFbGVtZW50OiBIVE1MRWxlbWVudCwga2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChzcmNFbGVtZW50KSB7XG4gICAgICBjb25zdCBhdHRyID0gc3JjRWxlbWVudC5jbG9zZXN0KFwiW1wiICsga2V5ICsgXCJdXCIpPy5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIGlmIChhdHRyKSByZXR1cm4gTnVtYmVyKGF0dHIpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U3RyaW5nQnlBdHRyKHNyY0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNyY0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBzcmNFbGVtZW50LmNsb3Nlc3QoXCJbXCIgKyBrZXkgKyBcIl1cIik/LmdldEF0dHJpYnV0ZShrZXkpO1xuICAgICAgaWYgKGF0dHIpIHJldHVybiBhdHRyO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGp1c3RBcmVhKGFyZWFJZGVudDogQXJlYUlkZW50LCB5U3RhcnQ6IG51bWJlciA9IDApIHtcbiAgICBjb25zdCB3ZXN0QXJlYSA9IHRoaXMuZ2V0QXJlYShhcmVhSWRlbnQsIFwid2VzdFwiKTtcbiAgICBjb25zdCBjZW50ZXJBcmVhID0gdGhpcy5nZXRBcmVhKGFyZWFJZGVudCwgXCJjZW50ZXJcIik7XG4gICAgY29uc3QgZWFzdEFyZWEgPSB0aGlzLmdldEFyZWEoYXJlYUlkZW50LCBcImVhc3RcIik7XG4gICAgY29uc3QgZGl2SGVpZ2h0ID0gY2VudGVyQXJlYS5jaGlsZC5jbGllbnRIZWlnaHQ7XG5cbiAgICB3ZXN0QXJlYS5jaGlsZC5pbm5lclRleHQgPSBcIlwiO1xuICAgIGNlbnRlckFyZWEuY2hpbGQuaW5uZXJUZXh0ID0gXCJcIjtcbiAgICBlYXN0QXJlYS5jaGlsZC5pbm5lclRleHQgPSBcIlwiO1xuICAgIGNvbnN0IGxlZnQgPSAwO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aDtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy50YWJsZU1vZGVsLmdldFBhZGRpbmcoKTtcbiAgICBjb25zdCBhcmVhTW9kZWwgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0QXJlYU1vZGVsKGFyZWFJZGVudCk7XG4gICAgY29uc3Qgcm93Q291bnQgPSBhcmVhTW9kZWwuZ2V0Um93Q291bnQoKTtcbiAgICBjb25zdCBib2R5QXJlYSA9IGFyZWFJZGVudCA9PT0gXCJib2R5XCI7XG4gICAgY29uc3QgaGVhZGVyQXJlYSA9IGFyZWFJZGVudCA9PT0gXCJoZWFkZXJcIjtcblxuICAgIHdoaWxlICh0aGlzLmNsZWFudXBGdW5jdGlvbnNbYXJlYUlkZW50XS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZuID0gdGhpcy5jbGVhbnVwRnVuY3Rpb25zW2FyZWFJZGVudF0uc2hpZnQoKTtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgeSA9IHlTdGFydDtcblxuICAgIGNvbnN0IGNvbHVtbkNvdW50ID0gdGhpcy50YWJsZU1vZGVsLmdldENvbHVtbkNvdW50KCk7XG4gICAgY29uc3QgZml4ZWRSaWdodENvbHVtbkNvdW50ID0gdGhpcy50YWJsZU1vZGVsLmdldEZpeGVkUmlnaHRDb2x1bW5Db3VudCgpO1xuICAgIGNvbnN0IGZpeGVkTGVmdENvbHVtbkNvdW50ID0gdGhpcy50YWJsZU1vZGVsLmdldEZpeGVkTGVmdENvbHVtbkNvdW50KCk7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm93Q291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRvcCA9IHk7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Um93SGVpZ2h0KGFyZWFJZGVudCwgaW5kZXgpO1xuICAgICAgaWYgKHRvcCArIGhlaWdodCA+IDApIHtcbiAgICAgICAgLy8gVmlzaWJsZSFcbiAgICAgICAgdGhpcy5maXJzdFZpc2libGVSb3dJbmRleCA9IGluZGV4O1xuXG4gICAgICAgIC8vIGNlbnRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGxldCBnZW8gPSB7IGxlZnQsIHdpZHRoLCBoZWlnaHQsIHRvcCwgaW5kZXggfTtcbiAgICAgICAgbGV0IHJvd0RpdiA9IHRoaXMuZG9tLmFkZFJvd0RpdihjZW50ZXJBcmVhLCBnZW8sIGluZGV4LCBhcmVhSWRlbnQpO1xuICAgICAgICBjb25zdCBjZW50ZXJTdGFydENvbCA9IGZpeGVkTGVmdENvbHVtbkNvdW50O1xuXG4gICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1RvUm93UGFyZW50KHtcbiAgICAgICAgICBhcmVhSWRlbnQsXG4gICAgICAgICAgc2lkZUlkZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgIGFyZWFNb2RlbCxcbiAgICAgICAgICBnZW8sXG4gICAgICAgICAgcGFyZW50OiByb3dEaXYsXG4gICAgICAgICAgcm93SW5kZXg6IGluZGV4LFxuICAgICAgICAgIGNvbHVtbkluZGV4U3RhcnQ6IGNlbnRlclN0YXJ0Q29sLFxuICAgICAgICAgIGNvbHVtbkluZGV4RW5kOiBjb2x1bW5Db3VudCAtIGZpeGVkUmlnaHRDb2x1bW5Db3VudCAtIDEsXG4gICAgICAgICAgdmVydGljYWxGaXhlZDogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gd2VzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGlmIChwYWRkaW5nLmxlZnQgPiAwKSB7XG4gICAgICAgICAgZ2VvID0geyBsZWZ0LCB3aWR0aDogdGhpcy5hcmVhQm9keVdlc3RHZW8ud2lkdGgsIGhlaWdodCwgdG9wLCBpbmRleCB9O1xuICAgICAgICAgIHJvd0RpdiA9IHRoaXMuZG9tLmFkZFJvd0Rpdih3ZXN0QXJlYSwgZ2VvLCBpbmRleCwgYXJlYUlkZW50KTtcbiAgICAgICAgICB0aGlzLmFkanVzdENvbHVtbnNUb1Jvd1BhcmVudCh7XG4gICAgICAgICAgICBhcmVhSWRlbnQsXG4gICAgICAgICAgICBzaWRlSWRlbnQ6IFwid2VzdFwiLFxuICAgICAgICAgICAgYXJlYU1vZGVsLFxuICAgICAgICAgICAgZ2VvLFxuICAgICAgICAgICAgcGFyZW50OiByb3dEaXYsXG4gICAgICAgICAgICByb3dJbmRleDogaW5kZXgsXG4gICAgICAgICAgICBjb2x1bW5JbmRleFN0YXJ0OiAwLFxuICAgICAgICAgICAgY29sdW1uSW5kZXhFbmQ6IGNlbnRlclN0YXJ0Q29sIC0gMSxcbiAgICAgICAgICAgIHZlcnRpY2FsRml4ZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVhc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBpZiAocGFkZGluZy5yaWdodCA+IDApIHtcbiAgICAgICAgICBnZW8gPSB7IGxlZnQsIHdpZHRoOiB0aGlzLmFyZWFCb2R5RWFzdEdlby53aWR0aCwgaGVpZ2h0LCB0b3AsIGluZGV4IH07XG4gICAgICAgICAgcm93RGl2ID0gdGhpcy5kb20uYWRkUm93RGl2KGVhc3RBcmVhLCBnZW8sIGluZGV4LCBhcmVhSWRlbnQpO1xuICAgICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1RvUm93UGFyZW50KHtcbiAgICAgICAgICAgIGFyZWFJZGVudCxcbiAgICAgICAgICAgIHNpZGVJZGVudDogXCJlYXN0XCIsXG4gICAgICAgICAgICBhcmVhTW9kZWwsXG4gICAgICAgICAgICBnZW8sXG4gICAgICAgICAgICBwYXJlbnQ6IHJvd0RpdixcbiAgICAgICAgICAgIHJvd0luZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGNvbHVtbkluZGV4U3RhcnQ6IGNvbHVtbkNvdW50IC0gZml4ZWRSaWdodENvbHVtbkNvdW50LFxuICAgICAgICAgICAgY29sdW1uSW5kZXhFbmQ6IGNvbHVtbkNvdW50IC0gMSxcbiAgICAgICAgICAgIHZlcnRpY2FsRml4ZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbGxhcHNlIC8gZXhwYW5kIGFsbDpcbiAgICAgICAgaWYgKGFyZWFJZGVudCA9PT0gXCJoZWFkZXJcIiAmJiB0aGlzLnRyZWUgJiYgaW5kZXggPT09IHJvd0NvdW50IC0gMSkge1xuICAgICAgICAgIGNvbnN0IGRpdiA9XG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBseVN0eWxlKFxuICAgICAgICAgICAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uYWRkRGl2KHJvd0RpdiwgbmV3IEdlb0RhdGEoMTYsIDIwLCAyMCwgOCkpLFxuICAgICAgICAgICAgICAgIFwiZGF0YS1nZS1hY3Rpb25cIiwgXCJ0b2dnbGVFeHBhbmRDb2xsYXBzZUFsbFwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHsgXCJjdXJzb3JcIjogXCJwb2ludGVyXCIgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB0cmVlT3B0aW9uc0Fycm93ID0gdGhpcy50YWJsZU9wdGlvbnMudHJlZU9wdGlvbnMuYXJyb3dFeHBhbmRDb2xsYXBzZUFsbDtcbiAgICAgICAgICBpZiAodHJlZU9wdGlvbnNBcnJvdykge1xuICAgICAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSB0aGlzLmRvbS5kb21TZXJ2aWNlLmNyZWF0ZVRleHQodHJlZU9wdGlvbnNBcnJvdy5jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmRvbVNlcnZpY2UuYXBwZW5kQ2hpbGQoZGl2LCB0ZXh0RWxlbWVudCk7XG4gICAgICAgICAgICBpZiAodHJlZU9wdGlvbnNBcnJvdy5zdHlsZSkge1xuICAgICAgICAgICAgICB0aGlzLmRvbS5hcHBseVN0eWxlU3RyaW5nKGRpdiwgdHJlZU9wdGlvbnNBcnJvdy5zdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICAgIHkgPSB5ICsgaGVpZ2h0O1xuICAgICAgLy8gbGFzdFZpc2libGVSb3dJbmRleCA9IGluZGV4O1xuICAgICAgaWYgKHkgPiBkaXZIZWlnaHQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBmb3JcblxuICAgIC8vIFdlIGRyYXcgdGhlIGJpZyBjb2xzcGFuIGFuZCByb3dzcGFuIGNlbGxzIGF0IHRoZSBlbmQuXG4gICAgLy8gVGhpcyBmaXhlcyB0aGUgJ2hhbGYgY3V0dGVkIGJpZyBjZWxsJyBwcm9ibGVtOlxuICAgIGlmICh0aGlzLmNvbEFuZFJvd3NwYW5Nb2RlbHMgJiYgdGhpcy5jb2xBbmRSb3dzcGFuTW9kZWxzW2FyZWFJZGVudF0pIHtcbiAgICAgIC8vIGRyYXcgY29sL3Jvd3NwYW4gY2VsbHMgYWdhaW46XG4gICAgICBjb25zdCByYW5nZXMgPSB0aGlzLmNvbEFuZFJvd3NwYW5Nb2RlbHNbYXJlYUlkZW50XT8uZ2V0UmFuZ2VzKCkgPz8gW107XG4gICAgICBpZiAocmFuZ2VzLmxlbmd0aCkge1xuXG4gICAgICAgIGZvciAoY29uc3QgcmFuZ2Ugb2YgcmFuZ2VzKSB7XG4gICAgICAgICAgbGV0IHhTdGFydCA9IDA7XG4gICAgICAgICAgbGV0IGNoaWxkOiBIVE1MRGl2RWxlbWVudCA9IGNlbnRlckFyZWEuY2hpbGQ7XG4gICAgICAgICAgaWYgKHJhbmdlLmMxIDwgZml4ZWRMZWZ0Q29sdW1uQ291bnQpIHtcbiAgICAgICAgICAgIC8vIFdlc3Q6XG4gICAgICAgICAgICBjaGlsZCA9IHdlc3RBcmVhLmNoaWxkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZml4ZWRSaWdodENvbHVtbkNvdW50ID4gMCAmJiByYW5nZS5jMSA+PSBjb2x1bW5Db3VudCAtIGZpeGVkUmlnaHRDb2x1bW5Db3VudCkge1xuICAgICAgICAgICAgLy8gRWFzdDpcbiAgICAgICAgICAgIGNoaWxkID0gZWFzdEFyZWEuY2hpbGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENlbnRlcjpcbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxSb3dEaXZMZWZ0RjEgPSB0aGlzLmFyZWFCb2R5Q2VudGVyR2VvLndpZHRoIC0gdGhpcy50YWJsZU1vZGVsLmdldENvbnRlbnRXaWR0aEluUGl4ZWwoKTtcbiAgICAgICAgICAgIHhTdGFydCA9ICh0aGlzLnNjcm9sbEZhY3RvclggKiB2aXJ0dWFsUm93RGl2TGVmdEYxKSAtIHRoaXMuYXJlYUJvZHlXZXN0R2VvLndpZHRoO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRyYXdCaWdDZWxsKHJhbmdlLCB4U3RhcnQsIHlTdGFydCwgYXJlYU1vZGVsLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYmlnIGNlbGxzIChyb3dzcGFuIGFuZCBvciBjb2xzcGFuKSBpbiBib2R5L2NlbnRlclxuICAgKiBAcGFyYW0gcmFuZ2U6Q2VsbFJhbmdlXG4gICAqIEBwYXJhbSB4U3RhcnQgWCBwb3NpdGlvbiBpbiBwaXhlbCBmb3IgdG9wIGxlZnQgY29ybmVyXG4gICAqIEBwYXJhbSB5U3RhcnQgWSBwb3NpdGlvbiBpbiBwaXhlbCBmb3IgdG9wIGxlZnQgY29ybmVyXG4gICAqIEBwYXJhbSBhcmVhTW9kZWwgQXJlYU1vZGVsSWZcbiAgICogQHBhcmFtIHBhcmVudERpdiBQYXJlbnQgZGl2IGFzIEhUTUxEaXZFbGVtZW50XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBkcmF3QmlnQ2VsbChcbiAgICByYW5nZTogQ2VsbFJhbmdlLFxuICAgIHhTdGFydDogbnVtYmVyLFxuICAgIHlTdGFydDogbnVtYmVyLFxuICAgIGFyZWFNb2RlbDogQXJlYU1vZGVsSWYsXG4gICAgcGFyZW50RGl2OiBIVE1MRGl2RWxlbWVudCkge1xuXG4gICAgY29uc3QgeTEgPSB5U3RhcnQgKyB0aGlzLmdldFJvd0hlaWdodHMoMCwgcmFuZ2UucjEgLSAxLCBhcmVhTW9kZWwpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuXG4gICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uQ291bnQoKTtcbiAgICBjb25zdCBmaXhlZFJpZ2h0Q29sdW1uQ291bnQgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Rml4ZWRSaWdodENvbHVtbkNvdW50KCk7XG4gICAgbGV0IGZpcnN0Q29sSWR4ID0gMDtcbiAgICBpZiAoZml4ZWRSaWdodENvbHVtbkNvdW50ID4gMCAmJiByYW5nZS5jMSA+PSBjb2x1bW5Db3VudCAtIGZpeGVkUmlnaHRDb2x1bW5Db3VudCkge1xuICAgICAgLy8gV2UgYXJlIG9uIHRoZSAoZml4ZWQpIGVhc3Qgc2lkZSwgc28gd2UgaGF2ZSB0byBmaXggZmlyc3RDb2xJZHg6XG4gICAgICBmaXJzdENvbElkeCA9IGNvbHVtbkNvdW50IC0gZml4ZWRSaWdodENvbHVtbkNvdW50O1xuICAgIH1cbiAgICBjb25zdCB4MSA9IHhTdGFydCArIHRoaXMuZ2V0Q29sdW1uV2lkdGhzKGZpcnN0Q29sSWR4LCByYW5nZS5jMSAtIDEpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuXG4gICAgY29uc3QgaCA9IHRoaXMuZ2V0Um93SGVpZ2h0cyhyYW5nZS5yMSwgcmFuZ2UucjIsIGFyZWFNb2RlbCkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgY29uc3QgdyA9IHRoaXMuZ2V0Q29sdW1uV2lkdGhzKHJhbmdlLmMxLCByYW5nZS5jMikucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG5cbiAgICBsZXQgY2VsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWwgPSB0aGlzLmdldFNlbGVjdGlvbk1vZGVsID8gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWxlY3Rpb25Nb2RlbCkge1xuICAgICAgY29uc3QgY291bnQgPSBzZWxlY3Rpb25Nb2RlbC5nZXRTZWxlY3Rpb25Db3VudChyYW5nZS5yMSwgcmFuZ2UuYzEpO1xuICAgICAgY2VsbFNlbGVjdGVkID0gY291bnQgPiAwO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckNlbGwoYXJlYU1vZGVsLCBhcmVhTW9kZWwuYXJlYUlkZW50LCByYW5nZS5yMSwgcmFuZ2UuYzEsIHgxLCB5MSwgdywgaCwgcGFyZW50RGl2LCBjZWxsU2VsZWN0ZWQpO1xuXG4gICAgaWYgKGFyZWFNb2RlbC5hcmVhSWRlbnQgPT09IFwiaGVhZGVyXCIgJiYgdGhpcy50YWJsZU9wdGlvbnMuY29sdW1uc1Jlc2l6YWJsZSkge1xuICAgICAgdGhpcy5yZW5kZXJIZWFkZXJDZWxsUmVzaXplSGFuZGxlKHJhbmdlLnIxLCByYW5nZS5jMSwgeDEsIHkxLCB3LCBoLCBwYXJlbnREaXYpO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGZpbmRSb3dPZkltcG9ydGFudFJvd3NwYW5DZWxsKGFyZWFNb2RlbDogQXJlYU1vZGVsSWYsIHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1heFJvd3NwYW4gPSBhcmVhTW9kZWwuZ2V0TWF4Um93c3BhbigpO1xuICAgIGZvciAobGV0IHIgPSByb3dJbmRleCAtIDE7IHIgPiAtMTsgci0tKSB7XG4gICAgICBjb25zdCByb3dzcGFuID0gYXJlYU1vZGVsLmdldFJvd3NwYW5BdChyLCBjb2xJbmRleCk7XG4gICAgICBpZiAocm93c3BhbiA+IDEgJiYgciArIHJvd3NwYW4gKyAxID49IHJvd0luZGV4KSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuICAgICAgaWYgKHJvd0luZGV4IC0gciA+IG1heFJvd3NwYW4pIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBUT0RPIHNraXAgY29scyBpbiBoZWFkZXIgYmVjYXVzZSBvZiBjb2xzcGFuXG4gIHByb3RlY3RlZCBhZGp1c3RDb2x1bW5zVG9Sb3dQYXJlbnQoXG4gICAge1xuICAgICAgYXJlYUlkZW50LFxuICAgICAgc2lkZUlkZW50LFxuICAgICAgYXJlYU1vZGVsLFxuICAgICAgZ2VvLFxuICAgICAgcGFyZW50LFxuICAgICAgcm93SW5kZXgsXG4gICAgICBjb2x1bW5JbmRleFN0YXJ0LFxuICAgICAgY29sdW1uSW5kZXhFbmQsXG4gICAgICB2ZXJ0aWNhbEZpeGVkID0gZmFsc2VcbiAgICB9OiBBcmdzQWRqdXN0Q29sdW1uc1RvUm93UGFyZW50UGFyYW1zXG4gICk6IHZvaWQge1xuXG4gICAgdGhpcy5zY3JvbGxWaWV3cG9ydExlZnQgPSB0aGlzLnNjcm9sbFZpZXdwb3J0LnNjcm9sbExlZnQ7XG4gICAgbGV0IHZpcnR1YWxSb3dEaXZMZWZ0ID0gMDtcbiAgICBpZiAoIXZlcnRpY2FsRml4ZWQpIHtcbiAgICAgIGNvbnN0IHZpcnR1YWxSb3dEaXZMZWZ0RjEgPSAodGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aCkgLSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29udGVudFdpZHRoSW5QaXhlbCgpO1xuICAgICAgdmlydHVhbFJvd0RpdkxlZnQgPSB0aGlzLnNjcm9sbEZhY3RvclggKiB2aXJ0dWFsUm93RGl2TGVmdEYxO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcCA9IDA7XG4gICAgY29uc3QgcmVuZGVyU2VsZWN0aW9uID0gISEoYXJlYUlkZW50ID09PSBcImJvZHlcIiAmJiBzaWRlSWRlbnQpO1xuXG4gICAgbGV0IHggPSB2aXJ0dWFsUm93RGl2TGVmdDtcbiAgICBmb3IgKGxldCBpbmRleCA9IGNvbHVtbkluZGV4U3RhcnQ7IGluZGV4IDw9IGNvbHVtbkluZGV4RW5kOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBsZWZ0ID0geDtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uV2lkdGgoaW5kZXgpO1xuICAgICAgaWYgKGxlZnQgKyB3ID4gMCkge1xuICAgICAgICAvLyBWaXNpYmxlISBSZW5kZXIgY2VsbCBkaXY6XG5cbiAgICAgICAgLy8gY2FsYyBoZWlnaHQ6XG4gICAgICAgIGxldCBoZWlnaHQgPSBnZW8uaGVpZ2h0O1xuICAgICAgICBsZXQgcm93c3BhbiA9IGFyZWFNb2RlbC5nZXRSb3dzcGFuQXQocm93SW5kZXgsIGluZGV4KTtcbiAgICAgICAgbGV0IGNvbHNwYW4gPSBhcmVhTW9kZWwuZ2V0Q29sc3BhbkF0KHJvd0luZGV4LCBpbmRleCk7XG5cbiAgICAgICAgaWYgKHJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgaGVpZ2h0ID0gdGhpcy5nZXRSb3dIZWlnaHRzKHJvd0luZGV4LCByb3dJbmRleCArIHJvd3NwYW4gLSAxLCBhcmVhTW9kZWwpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHdpZHRoID0gdztcbiAgICAgICAgaWYgKGNvbHNwYW4gPiAxKSB7XG4gICAgICAgICAgd2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRocyhpbmRleCwgaW5kZXggKyBjb2xzcGFuIC0gMSkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2tpcCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jb2xBbmRSb3dzcGFuTW9kZWxzICYmIHRoaXMuY29sQW5kUm93c3Bhbk1vZGVsc1thcmVhSWRlbnRdKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29sQW5kUm93c3Bhbk1vZGVsc1thcmVhSWRlbnRdPy5pc0luUmFuZ2Uocm93SW5kZXgsIGluZGV4KSkge1xuICAgICAgICAgICAgc2tpcCA9IHRydWU7IC8vIGZvciB0aGUgYm9keSBhcmVhIHdlIGRvbid0IHdhbnQgdG8gdG8gcmVuZGVyIHRoZSBzbWFsbCBzaW5nbGUgY2VsbHNcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZ1RhcmdldENvbHVtbkluZGV4ID09PSBpbmRleCAmJiBhcmVhSWRlbnQgIT09IFwiaGVhZGVyXCIpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlckRyYWdUYXJnZXREaXYocGFyZW50LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgIHRoaXMuZG9tLmFkZENvbHVtbkJvcmRlckRpdnMocGFyZW50LCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBjZWxsU2VsZWN0ZWQgPSB0aGlzLnJlbmRlclNlbGVjdGVkQmFja2dyb3VuZERpdihza2lwLCByZW5kZXJTZWxlY3Rpb24sIGFyZWFNb2RlbCwgcm93SW5kZXgsIGluZGV4LCBwYXJlbnQsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgICBpZiAoIXNraXApIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ2VsbChhcmVhTW9kZWwsIGFyZWFJZGVudCwgcm93SW5kZXgsIGluZGV4LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIHBhcmVudCwgY2VsbFNlbGVjdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFyZWFJZGVudCA9PT0gXCJoZWFkZXJcIiAmJiB0aGlzLnRhYmxlT3B0aW9ucy5jb2x1bW5zUmVzaXphYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckhlYWRlckNlbGxSZXNpemVIYW5kbGUocm93SW5kZXgsIGluZGV4LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIHBhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHggPSB4ICsgdztcbiAgICAgIGlmICh4ID4gdGhpcy5hcmVhQm9keUNlbnRlckdlby53aWR0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmlnaHQgdmVydGljYWwgYm9yZGVyOlxuICAgIHRoaXMuZG9tLmFkZFZlcnRpY2FsQm9yZGVyKG5ldyBHZW9EYXRhKHggLSAxLCAxLCBnZW8uaGVpZ2h0LCAwKSwgcGFyZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUcmVlQXJyb3dDb2x1bW5JbmRleCgpOiAwIHwgMSB7XG4gICAgaWYgKHRoaXMudGFibGVPcHRpb25zLnNob3dDaGVja2JveFdpaG91dEV4dHJhQ29sdW1uKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVNb2RlbC5pc1Jvd0NoZWNrYm94VmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkQW5kUmVuZGVyQ2VsbERpdihcbiAgICB7XG4gICAgICBhcmVhTW9kZWwsXG4gICAgICBhcmVhSWRlbnQsXG4gICAgICByb3dJbmRleCxcbiAgICAgIGluZGV4LFxuICAgICAgbGVmdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdG9wLFxuICAgICAgcGFyZW50XG4gICAgfTogQXJnc1JlbmRlckNlbGxEaXYpOiBbSFRNTERpdkVsZW1lbnQsIFJlbmRlcmVyQ2xlYW51cEZuVHlwZSB8IHVuZGVmaW5lZF0ge1xuXG5cbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlbmRlcmVyICYmIHRoaXMuZWRpdG9yUmVuZGVyZXJSb3cgPT09IHJvd0luZGV4ICYmIHRoaXMuZWRpdG9yUmVuZGVyZXJDb2x1bW4gPT09IGluZGV4O1xuICAgIGNvbnN0IGNlbGxSZW5kZXJlciA9IChlZGl0b3IpID8gdGhpcy5lZGl0b3JSZW5kZXJlciA6IGFyZWFNb2RlbC5nZXRDZWxsUmVuZGVyZXIocm93SW5kZXgsIGluZGV4KTtcbiAgICBjb25zdCBnZW8gPSB7IGxlZnQsIHdpZHRoLCBoZWlnaHQsIHRvcCwgaW5kZXggfTtcbiAgICBjb25zdCByb3dPYmplY3QgPSBhcmVhTW9kZWwuZ2V0Um93QnlJbmRleChyb3dJbmRleCk7XG4gICAgbGV0IHRyZWVBcnJvdzogVHJlZUFycm93VHlwZSA9IFwibm9uZVwiO1xuXG4gICAgY29uc3QgYXJyb3dJbmRleE9rID0gaW5kZXggPT09IHRoaXMuZ2V0VHJlZUFycm93Q29sdW1uSW5kZXgoKTtcblxuICAgIGlmIChhcnJvd0luZGV4T2sgJiYgcm93T2JqZWN0IGluc3RhbmNlb2YgVHJlZVJvdykge1xuICAgICAgY29uc3QgdHIgPSByb3dPYmplY3QgYXMgVHJlZVJvdzxhbnk+O1xuICAgICAgaWYgKHRyLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRyLmV4cGFuZGVkKSB7XG4gICAgICAgICAgdHJlZUFycm93ID0gXCJleHBhbmRlZFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyZWVBcnJvdyA9IFwiY29sbGFwc2VkXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyZWVBcnJvdyA9IFwiaGlkZGVuXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNvcnRTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJlYUlkZW50ID09PSBcImhlYWRlclwiKSB7XG4gICAgICBjb25zdCBjb2x1bW5EZWYgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGluZGV4KTtcbiAgICAgIGlmICghY29sdW1uRGVmPy5zb3J0SWNvblZpc2libGUgfHwgY29sdW1uRGVmPy5zb3J0SWNvblZpc2libGUoKSkge1xuICAgICAgICBzb3J0U3RhdGUgPSBjb2x1bW5EZWY/LnNvcnRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB2YWwgPSBhcmVhTW9kZWwuZ2V0VmFsdWVBdChyb3dJbmRleCwgaW5kZXgpO1xuICAgIGNvbnN0IHRleHQgPSBjZWxsUmVuZGVyZXIgPyBcIlwiIDogYCR7dmFsfWA7XG4gICAgY29uc3QgY2hlY2tlZFR5cGUgPSBhcmVhTW9kZWwuaXNSb3dDaGVja2VkKHJvd0luZGV4KTtcbiAgICBjb25zdCBjZWxsID0gdGhpcy5kb20uYWRkQ29sdW1uRGl2KHBhcmVudCwgZ2VvLCByb3dJbmRleCwgaW5kZXgsIGFyZWFJZGVudCwgdGV4dCwgdHJlZUFycm93LCB0aGlzLnRhYmxlT3B0aW9ucywgY2hlY2tlZFR5cGUsIHNvcnRTdGF0ZSk7XG5cbiAgICBjb25zdCB0b29sdGlwID0gYXJlYU1vZGVsLmdldFRvb2x0aXBBdChyb3dJbmRleCwgaW5kZXgpO1xuICAgIGlmICh0b29sdGlwKSB7XG4gICAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUoY2VsbCwgXCJ0aXRsZVwiLCB0b29sdGlwKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5EZWYgPSB0aGlzLnRhYmxlTW9kZWwuZ2V0Q29sdW1uRGVmKGluZGV4KTtcbiAgICBpZiAoY29sdW1uRGVmICYmIGNvbHVtbkRlZi5jbGFzc2VzW2FyZWFJZGVudF0pIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzZXMoY29sdW1uRGVmLmNsYXNzZXNbYXJlYUlkZW50XSwgY2VsbCk7XG4gICAgfVxuXG4gICAgbGV0IGZuOiBSZW5kZXJlckNsZWFudXBGblR5cGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNlbGxSZW5kZXJlcikge1xuICAgICAgZm4gPSBjZWxsUmVuZGVyZXIucmVuZGVyKGNlbGwsIHJvd0luZGV4LCBpbmRleCwgYXJlYUlkZW50LCBhcmVhTW9kZWwsIHZhbCwgdGhpcy5kb20uZG9tU2VydmljZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NlcyA9IGFyZWFNb2RlbC5nZXRDdXN0b21DbGFzc2VzQXQocm93SW5kZXgsIGluZGV4KTtcbiAgICBpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzZXMoY2xhc3NlcywgY2VsbCk7XG4gICAgfVxuICAgIHRoaXMuZG9tLmFkZENvbHVtbkJvcmRlckRpdnMocGFyZW50LCBnZW8pO1xuICAgIGlmICh0aGlzLmdldEZvY3VzTW9kZWwgJiYgYXJlYUlkZW50ID09PSBcImJvZHlcIikge1xuICAgICAgY29uc3QgZm0gPSB0aGlzLmdldEZvY3VzTW9kZWwoKTtcbiAgICAgIGlmIChmbT8uaGFzRm9jdXMocm93SW5kZXgsIGluZGV4KSkge1xuICAgICAgICB0aGlzLmRvbS5hZGRGb2N1c0JvcmRlckRpdnMocGFyZW50LCBnZW8sIHt9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFyZWFJZGVudCA9PT0gXCJoZWFkZXJcIikge1xuICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKGNlbGwsIFwiZGF0YS1nZS1hY3Rpb25cIiwgXCJkcmFnLWNvbHVtblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFtjZWxsLCBmbl07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uV2lkdGhzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICBjb25zdCByZXQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgcmV0LnB1c2godGhpcy50YWJsZU1vZGVsLmdldENvbHVtbldpZHRoKGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dIZWlnaHRzKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgYXJlYU1vZGVsOiBBcmVhTW9kZWxJZik6IG51bWJlcltdIHtcbiAgICBjb25zdCByZXQ6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgcmV0LnB1c2goYXJlYU1vZGVsLmdldFJvd0hlaWdodChpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRqdXN0SG92ZXJSb3dzKG1vdXNlTW92ZUV2ZW50OiBHZU1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy50YWJsZU9wdGlvbnMuaG92ZXJSb3dWaXNpYmxlICYmIG1vdXNlTW92ZUV2ZW50LnJvd0luZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5ob3N0RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMudGFibGVNb2RlbC5nZXRBcmVhTW9kZWwoXCJib2R5XCIpLmdldFJvd0hlaWdodChtb3VzZU1vdmVFdmVudC5yb3dJbmRleCk7XG4gICAgICBjb25zdCB0b3AgPSBtb3VzZU1vdmVFdmVudC5yb3dUb3AgKyB0aGlzLmFyZWFIZWFkZXJDZW50ZXIucGFyZW50LmNsaWVudEhlaWdodCAtIHRoaXMuc2Nyb2xsVG9wO1xuICAgICAgdGhpcy5kb20uYXBwbHlTdHlsZSh0aGlzLmhvdmVyUm93LCB7XG4gICAgICAgIFwibGVmdFwiOiBcIjBcIixcbiAgICAgICAgXCJ0b3BcIjogdG9wICsgXCJweFwiLFxuICAgICAgICBcIndpZHRoXCI6IHdpZHRoICsgXCJweFwiLFxuICAgICAgICBcImhlaWdodFwiOiByb3dIZWlnaHQgKyBcInB4XCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiBcImJsb2NrXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGVIb3ZlclJvdygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlSG92ZXJSb3coKSB7XG4gICAgdGhpcy5kb20uYXBwbHlTdHlsZSh0aGlzLmhvdmVyUm93LCB7XG4gICAgICBcImRpc3BsYXlcIjogXCJub25lXCJcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGp1c3RIb3ZlckNvbHVtbnMobW91c2VNb3ZlRXZlbnQ6IEdlTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLnRhYmxlT3B0aW9ucy5ob3ZlckNvbHVtblZpc2libGUgJiYgbW91c2VNb3ZlRXZlbnQucm93SW5kZXggPiAtMSkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5ob3N0RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMudGFibGVNb2RlbC5nZXRDb2x1bW5XaWR0aChtb3VzZU1vdmVFdmVudC5jb2x1bW5JbmRleCk7XG4gICAgICBjb25zdCBsZWZ0ID0gbW91c2VNb3ZlRXZlbnQuY29sdW1uTGVmdCArIHRoaXMudGFibGVNb2RlbC5nZXRQYWRkaW5nKCkubGVmdCAtIHRoaXMuc2Nyb2xsTGVmdDtcbiAgICAgIHRoaXMuZG9tLmFwcGx5U3R5bGUodGhpcy5ob3ZlckNvbHVtbiwge1xuICAgICAgICBcImxlZnRcIjogKGxlZnQpICsgXCJweFwiLFxuICAgICAgICBcInRvcFwiOiBcIjBweFwiLFxuICAgICAgICBcIndpZHRoXCI6IHdpZHRoICsgXCJweFwiLFxuICAgICAgICBcImhlaWdodFwiOiBoZWlnaHQgKyBcInB4XCIsXG4gICAgICAgIFwiZGlzcGxheVwiOiBcImJsb2NrXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGVIb3ZlckNvbHVtbigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlSG92ZXJDb2x1bW4oKSB7XG4gICAgdGhpcy5kb20uYXBwbHlTdHlsZSh0aGlzLmhvdmVyQ29sdW1uLCB7XG4gICAgICBcImRpc3BsYXlcIjogXCJub25lXCJcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWJvdW5jZShmbjogRnVuY3Rpb24sIGRlbGF5OiBudW1iZXIgPSAxMDAwKSB7XG4gICAgaWYgKHRoaXMuZGVib3VuY2VUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWJvdW5jZVRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoZm4uYmluZCh0aGlzKSwgZGVsYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJEcmFnVGFyZ2V0RGl2KHBhcmVudDogSFRNTERpdkVsZW1lbnQsIGxlZnQ6IG51bWJlciwgdG9wOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSFRNTERpdkVsZW1lbnQge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuZG9tLmFwcGx5U3R5bGVQb3Npc3Rpb25BYnNvbHV0ZShcbiAgICAgIHRoaXMuZG9tLmNyZWF0ZURpdldpdGhDbGFzcyhcImdlLXRhYmxlLWRyb3Atem9uZVwiLCBwYXJlbnQpXG4gICAgKTtcbiAgICB0aGlzLmRvbS5zZXRTdHlsZShkaXYsIFwibGVmdFwiLCBgJHtsZWZ0fXB4YCk7XG4gICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCBcInRvcFwiLCBgJHt0b3B9cHhgKTtcbiAgICB0aGlzLmRvbS5zZXRTdHlsZShkaXYsIFwid2lkdGhcIiwgYCR7d2lkdGh9cHhgKTtcbiAgICB0aGlzLmRvbS5zZXRTdHlsZShkaXYsIFwiaGVpZ2h0XCIsIGAke2hlaWdodH1weGApO1xuICAgIHJldHVybiBkaXY7XG4gIH1cblxuXG4gIHByaXZhdGUgcmVuZGVyU2VsZWN0ZWRCYWNrZ3JvdW5kRGl2KHNraXA6IGJvb2xlYW4sIHJlbmRlclNlbGVjdGlvbjogYm9vbGVhbiwgYXJlYU1vZGVsOiBBcmVhTW9kZWxJZiwgcm93SW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlciwgcGFyZW50OiBIVE1MRGl2RWxlbWVudCwgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBsZXQgY2VsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKCFza2lwICYmIHJlbmRlclNlbGVjdGlvbiAmJiBhcmVhTW9kZWwuaXNTZWxlY3RhYmxlKHJvd0luZGV4LCBpbmRleCkpIHtcbiAgICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsID0gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgICAgICBjb25zdCBjb3VudCA9IHNlbGVjdGlvbk1vZGVsLmdldFNlbGVjdGlvbkNvdW50KHJvd0luZGV4LCBpbmRleCk7XG4gICAgICAgICAgY2VsbFNlbGVjdGVkID0gY291bnQgPiAwO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGl2ID0gdGhpcy5kb20uYXBwbHlTdHlsZVBvc2lzdGlvbkFic29sdXRlKFxuICAgICAgICAgICAgICB0aGlzLmRvbS5jcmVhdGVEaXZXaXRoQ2xhc3MoXCJnZS10YWJsZS1zZWxlY3RlZC1yYW5nZVwiLCBwYXJlbnQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCBcImxlZnRcIiwgYCR7bGVmdH1weGApO1xuICAgICAgICAgICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCBcInRvcFwiLCBgJHt0b3B9cHhgKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNldFN0eWxlKGRpdiwgXCJ3aWR0aFwiLCBgJHt3aWR0aH1weGApO1xuICAgICAgICAgICAgdGhpcy5kb20uc2V0U3R5bGUoZGl2LCBcImhlaWdodFwiLCBgJHtoZWlnaHR9cHhgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNlbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ2VsbChcbiAgICBhcmVhTW9kZWw6IEFyZWFNb2RlbElmLFxuICAgIGFyZWFJZGVudDogQXJlYUlkZW50LFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBsZWZ0OiBudW1iZXIsXG4gICAgdG9wOiBudW1iZXIsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBwYXJlbnQ6IEhUTUxEaXZFbGVtZW50LFxuICAgIGNlbGxTZWxlY3RlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IFtkaXYsIGZuXSA9IHRoaXMuYWRkQW5kUmVuZGVyQ2VsbERpdih7XG4gICAgICBhcmVhTW9kZWwsXG4gICAgICBhcmVhSWRlbnQsXG4gICAgICByb3dJbmRleCxcbiAgICAgIGluZGV4OiBjb2x1bW5JbmRleCxcbiAgICAgIGxlZnQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRvcCxcbiAgICAgIHBhcmVudFxuICAgIH0pO1xuICAgIGlmIChjZWxsU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZG9tLmFkZENsYXNzKFwiZ2UtY2VsbC1zZWxlY3RlZFwiLCBkaXYpO1xuICAgIH1cbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuY2xlYW51cEZ1bmN0aW9uc1thcmVhSWRlbnRdLnB1c2goZm4pO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJpdmF0ZSByZW5kZXJIZWFkZXJDZWxsUmVzaXplSGFuZGxlKFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBjZWxsTGVmdDogbnVtYmVyLFxuICAgIGNlbGxUb3A6IG51bWJlcixcbiAgICBjZWxsV2lkdGg6IG51bWJlcixcbiAgICBjZWxsSGVpZ2h0OiBudW1iZXIsXG4gICAgcGFyZW50OiBIVE1MRGl2RWxlbWVudCkge1xuXG4gICAgY29uc3QgZG9tU2VydmljZSA9IHRoaXMuZG9tLmRvbVNlcnZpY2U7XG4gICAgY29uc3QgaGFuZGxlV2lkdGggPSB0aGlzLnRhYmxlT3B0aW9ucy5jb2x1bW5SZXNpemVIYW5kbGVXaWR0aEluUHggPz8gMztcblxuICAgIGNvbnN0IGRpdiA9IGRvbVNlcnZpY2UuY3JlYXRlRWxlbWVudDxIVE1MRGl2RWxlbWVudD4oXCJkaXZcIik7XG4gICAgZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCBcImRhdGEtY29sLWluZGV4XCIsIGAke2NvbHVtbkluZGV4fWApO1xuICAgIGRvbVNlcnZpY2Uuc2V0QXR0cmlidXRlKGRpdiwgXCJkYXRhLXJvdy1pbmRleFwiLCBgJHtyb3dJbmRleH1gKTtcbiAgICBkb21TZXJ2aWNlLnNldEF0dHJpYnV0ZShkaXYsIFwiZGF0YS1hcmVhXCIsIFwiaGVhZGVyXCIpO1xuICAgIGRvbVNlcnZpY2Uuc2V0QXR0cmlidXRlKGRpdiwgXCJkYXRhLWdlLWFjdGlvblwiLCBcInJlc2l6ZS1jb2x1bW5cIik7XG4gICAgLy8gZG9tU2VydmljZS5zZXRBdHRyaWJ1dGUoZGl2LCAnZGF0YS1nZS1hY3Rpb24nLCAnY29sdW1uLXJlc2l6ZScpO1xuICAgIGRvbVNlcnZpY2UuYWRkQ2xhc3MoZGl2LCBgZ2UtdGFibGUtY29sLXJlc2l6ZS1oYW5kbGVgKTtcbiAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgXCJkaXNwbGF5XCIsIFwiY2xpcFwiKTtcbiAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCBcImN1cnNvclwiLCBcImNvbC1yZXNpemVcIik7XG4gICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsIFwibGVmdFwiLCBgJHsoY2VsbExlZnQgKyBjZWxsV2lkdGggLSBoYW5kbGVXaWR0aCl9cHhgKTtcbiAgICBkb21TZXJ2aWNlLnNldFN0eWxlKGRpdiwgXCJ0b3BcIiwgYCR7Y2VsbFRvcH1weGApO1xuICAgIGRvbVNlcnZpY2Uuc2V0U3R5bGUoZGl2LCBcIndpZHRoXCIsIGAke2hhbmRsZVdpZHRofXB4YCk7XG4gICAgZG9tU2VydmljZS5zZXRTdHlsZShkaXYsIFwiaGVpZ2h0XCIsIGAke2NlbGxIZWlnaHR9cHhgKTtcbiAgICBkb21TZXJ2aWNlLmFwcGVuZENoaWxkKHBhcmVudCwgZGl2KTtcbiAgfVxuXG5cbn1cblxuIl19
|