@one-grid-core/angular 0.5.2 → 0.5.3
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/README.md +3 -1
- package/esm2022/lib/components/one-grid/one-grid.component.mjs +102 -20
- package/esm2022/lib/core/instants/one-grid-api.class.mjs +78 -9
- package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
- package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
- package/esm2022/lib/core/services/og-column.service.mjs +11 -1
- package/esm2022/lib/helpers/one-row-grouping.helper.mjs +14 -4
- package/fesm2022/one-grid-core-angular.mjs +204 -33
- package/fesm2022/one-grid-core-angular.mjs.map +1 -1
- package/lib/components/one-grid/one-grid.component.d.ts +43 -0
- package/lib/core/instants/one-grid-api.class.d.ts +27 -4
- package/lib/core/models/one-column-def-types.model.d.ts +4 -0
- package/lib/core/models/one-event-types.model.d.ts +13 -0
- package/lib/core/services/og-column.service.d.ts +8 -0
- package/lib/helpers/one-row-grouping.helper.d.ts +7 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OneRowNode } from "./one-row-node.class";
|
|
2
2
|
import { filterTreeNode, isFilterActive } from "../../helpers/one-filter.helper";
|
|
3
3
|
import { buildCsv } from "../../helpers/one-csv.helper";
|
|
4
|
-
import { buildGroupedRows, ONE_GROUP_ID_FIELD } from "../../helpers/one-row-grouping.helper";
|
|
4
|
+
import { aggColumns, buildGroupedRows, ONE_GROUP_CHILDREN_FIELD, ONE_GROUP_ID_FIELD } from "../../helpers/one-row-grouping.helper";
|
|
5
5
|
import { getFieldValue } from "../../helpers/one-cell.helper";
|
|
6
6
|
import { v4 as uuidv4 } from 'uuid';
|
|
7
7
|
import { Injectable } from "@angular/core";
|
|
@@ -55,12 +55,26 @@ export class OneGridApi {
|
|
|
55
55
|
this._quickFilterValue = null;
|
|
56
56
|
this._activeFilters = [];
|
|
57
57
|
this._visibleRowNodes = [];
|
|
58
|
+
/**
|
|
59
|
+
* The rows as the host last handed them over — before grouping folded
|
|
60
|
+
* them. Grouping is a transform on the way in, so this is what a change of
|
|
61
|
+
* grouping re-folds, and it is why regrouping keeps the host's row order
|
|
62
|
+
* instead of inheriting the order the previous grouping happened to leave.
|
|
63
|
+
*/
|
|
64
|
+
this._sourceRows = [];
|
|
58
65
|
this._pinnedRowNodes = { top: [], bottom: [] };
|
|
59
66
|
this._originalRowNodes = new Map();
|
|
60
67
|
this._nodeCleanupMap = new Map(); // Cleanup registry (prevents memory leaks)
|
|
61
68
|
this._destroyed = false;
|
|
62
69
|
// Advanced Features
|
|
63
70
|
this.treeData = false;
|
|
71
|
+
/**
|
|
72
|
+
* Whether the *host* declared tree data, as opposed to grouping having
|
|
73
|
+
* turned tree mode on. `treeData` above answers "is this a tree right now",
|
|
74
|
+
* which grouping flips; this answers "whose tree is it", which decides
|
|
75
|
+
* whether grouping may touch it at all.
|
|
76
|
+
*/
|
|
77
|
+
this._hostTreeData = false;
|
|
64
78
|
this.treeDataChildrenField = null;
|
|
65
79
|
this.groupDefaultExpanded = 0;
|
|
66
80
|
this.masterDetail = false;
|
|
@@ -102,6 +116,7 @@ export class OneGridApi {
|
|
|
102
116
|
this.detailCellRendererParams = detailCellRendererParams;
|
|
103
117
|
this.detailRendererComponent = detailRendererComponent;
|
|
104
118
|
this.treeData = treeData;
|
|
119
|
+
this._hostTreeData = treeData;
|
|
105
120
|
this.selectionService.setSelectionMode(rowSelection);
|
|
106
121
|
// Synthetic group rows carry their own stable id — the path of group
|
|
107
122
|
// values — which no host getRowId knows how to derive. The wrapper reads
|
|
@@ -185,6 +200,9 @@ export class OneGridApi {
|
|
|
185
200
|
}
|
|
186
201
|
return next;
|
|
187
202
|
});
|
|
203
|
+
// Grouped roots are synthetic, so the data is on the leaves; otherwise the
|
|
204
|
+
// roots are the data. Read from the nodes rather than from `_sourceRows`
|
|
205
|
+
// so a reorder the user dragged into place survives the transaction.
|
|
188
206
|
const currentRows = grouping
|
|
189
207
|
? this._rowNodes.filter(node => node.leaf).map(node => node.data)
|
|
190
208
|
: this._rowNodes.filter(node => !node.parent).map(node => node.data);
|
|
@@ -206,6 +224,7 @@ export class OneGridApi {
|
|
|
206
224
|
this.selectionService.deselectAll();
|
|
207
225
|
this.expansionService.clear();
|
|
208
226
|
}
|
|
227
|
+
this._sourceRows = rowData ?? [];
|
|
209
228
|
// Row grouping is a transform on the way in: the host keeps handing the
|
|
210
229
|
// grid flat rows, and the tree pipeline below sees synthetic group rows
|
|
211
230
|
// with children — the same shape tree data arrives in.
|
|
@@ -257,6 +276,14 @@ export class OneGridApi {
|
|
|
257
276
|
if (node) {
|
|
258
277
|
node.data = data;
|
|
259
278
|
node.setRowIndex(this._currentIndex);
|
|
279
|
+
// Where a row sits is rebuilt, not remembered. A reused node used to
|
|
280
|
+
// keep the level and parent it had when it was first built, so a row
|
|
281
|
+
// that changed place in the hierarchy — a leaf moved to another
|
|
282
|
+
// parent, or lifted to the root when the grouping changed — kept
|
|
283
|
+
// pointing at its old parent, and the visibility walk (which climbs
|
|
284
|
+
// parents) hid it behind a node that was no longer above it.
|
|
285
|
+
node.level = level;
|
|
286
|
+
node.parent = parent;
|
|
260
287
|
}
|
|
261
288
|
else {
|
|
262
289
|
node = new OneRowNode(rowId, data, this._currentIndex);
|
|
@@ -886,14 +913,56 @@ export class OneGridApi {
|
|
|
886
913
|
return this._rowGroupFields;
|
|
887
914
|
}
|
|
888
915
|
/**
|
|
889
|
-
*
|
|
890
|
-
*
|
|
891
|
-
*
|
|
892
|
-
*
|
|
916
|
+
* Group the rows by these fields, in nesting order — or ungroup by passing
|
|
917
|
+
* an empty array.
|
|
918
|
+
*
|
|
919
|
+
* `OneGridComponent` calls this once for the column definitions that
|
|
920
|
+
* declare `rowGroup`; hosts call it to regroup afterwards. Either way the
|
|
921
|
+
* grid re-plumbs itself around the new grouping — tree mode, the auto group
|
|
922
|
+
* column, the visibility of the grouped-by columns — and folds the rows it
|
|
923
|
+
* already holds again, so nothing has to be rebound and no grid has to be
|
|
924
|
+
* torn down and re-created to group by a different column.
|
|
925
|
+
*
|
|
926
|
+
* `aggregations` defaults to the `aggFunc` columns currently registered, so
|
|
927
|
+
* `setRowGrouping(['country'])` keeps the totals the column definitions
|
|
928
|
+
* already describe.
|
|
893
929
|
*/
|
|
894
|
-
setRowGrouping(groupFields, aggregations
|
|
895
|
-
this.
|
|
896
|
-
|
|
930
|
+
setRowGrouping(groupFields, aggregations) {
|
|
931
|
+
if (this._destroyed)
|
|
932
|
+
return;
|
|
933
|
+
const previous = this._rowGroupFields;
|
|
934
|
+
// Empty fields buy nothing and a repeated one would nest a level under
|
|
935
|
+
// itself, where every child group holds the whole parent.
|
|
936
|
+
const next = (groupFields ?? [])
|
|
937
|
+
.filter(field => !!field)
|
|
938
|
+
.filter((field, index, fields) => fields.indexOf(field) === index);
|
|
939
|
+
// Grouping *is* the tree. A host that brought its own tree data, or a
|
|
940
|
+
// master/detail grid, already has a hierarchy, and folding a second one
|
|
941
|
+
// over it would throw the first away.
|
|
942
|
+
if (next.length && (this._hostTreeData || this.masterDetail)) {
|
|
943
|
+
console.warn('[one-grid] setRowGrouping does not apply to tree data or master/detail grids — they carry their own hierarchy. Nothing was changed.');
|
|
944
|
+
return;
|
|
945
|
+
}
|
|
946
|
+
const unchanged = next.length === previous.length && next.every((field, index) => field === previous[index]);
|
|
947
|
+
if (unchanged && !aggregations)
|
|
948
|
+
return;
|
|
949
|
+
this._rowGroupFields = next;
|
|
950
|
+
this._aggColumns = aggregations ?? aggColumns(this.columnService.getAllColumnDefs());
|
|
951
|
+
// The row model's half of the switch: grouped rows carry their children
|
|
952
|
+
// under the grouping helper's own field, and the tree pipeline walks them
|
|
953
|
+
// from there. Ungrouping puts both back — which is safe because the guard
|
|
954
|
+
// above means tree mode can only have come from grouping.
|
|
955
|
+
this.treeData = next.length > 0;
|
|
956
|
+
this.treeDataChildrenField = next.length ? ONE_GROUP_CHILDREN_FIELD : null;
|
|
957
|
+
// Everything grouping implies outside the row model — the auto group
|
|
958
|
+
// column, which of the host's columns are hidden, the grid type the body
|
|
959
|
+
// renders — belongs to the component that owns the template. It re-plumbs
|
|
960
|
+
// on this event, synchronously, so the rebuild below already sees the
|
|
961
|
+
// columns the new grouping needs.
|
|
962
|
+
this.eventService.dispatchEvent('rowGroupingChanged', { groupFields: next, previousGroupFields: previous });
|
|
963
|
+
// Nothing to fold before the first load: `setRowData` will do it.
|
|
964
|
+
if (this._rowNodes.length)
|
|
965
|
+
this.rebuildRows(this._sourceRows, false);
|
|
897
966
|
}
|
|
898
967
|
/**
|
|
899
968
|
* Start recording committed cell edits for undo/redo. Called by
|
|
@@ -1241,4 +1310,4 @@ export class OneGridApi {
|
|
|
1241
1310
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridApi, decorators: [{
|
|
1242
1311
|
type: Injectable
|
|
1243
1312
|
}], ctorParameters: () => [{ type: i1.OgColumnService }, { type: i2.OneGridRowService }, { type: i3.OneGridCellService }, { type: i4.OneGridEventService }, { type: i5.OneGridSelectionService }, { type: i6.OneGridExpansionService }] });
|
|
1244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUzRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBUSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFNakQsTUFBTSxPQUFPLFVBQVU7SUFxQnJCLHdEQUF3RDtJQUN4RCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3RUFBd0U7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QVUsQ0FBQztJQUN6QixDQUFDOytHQTdxRFUsVUFBVTttSEFBVixVQUFVOzs0RkFBVixVQUFVO2tCQUR0QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kZWxzL29uZS10cmVlLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgT25lQ29sdW1uRGVmLCBPbmVDb2x1bW5TdGF0ZUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tIFwiLi9vbmUtcm93LW5vZGUuY2xhc3NcIjtcbmltcG9ydCB7IE9uZUdyaWRJbml0T3B0aW9ucywgT25lR3JpZFR5cGUsIE9uZVJvd1RyYW5zYWN0aW9uLCBPbmVTb3J0TW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lR3JpZFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzLCBPbmVWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vbW9kZWxzL29uZS12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IE9uZUZpbHRlck1vZGVsIH0gZnJvbSBcIi4uL21vZGVscy9vbmUtZmlsdGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkRXhwYW5zaW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29uZS1ncmlkLWV4cGFuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcywgT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcyB9IGZyb20gXCIuLi9tb2RlbHMvb25lLW1hc3Rlci1kZXRhaWwubW9kZWxcIjtcbmltcG9ydCB7IE9uZUdyaWRSb3dTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL29uZS1ncmlkLXJvdy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBmaWx0ZXJUcmVlTm9kZSwgaXNGaWx0ZXJBY3RpdmUgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtZmlsdGVyLmhlbHBlclwiO1xuaW1wb3J0IHsgYnVpbGRDc3YsIE9uZUNzdkV4cG9ydE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtY3N2LmhlbHBlclwiO1xuaW1wb3J0IHsgYnVpbGRHcm91cGVkUm93cywgT25lQWdnQ29sdW1uLCBPTkVfR1JPVVBfSURfRklFTEQgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtcm93LWdyb3VwaW5nLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1yb3ctZHJhZy5tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgT25lUGlubmVkUm93U2lkZSwgUm93U2VsZWN0aW9uTW9kZSB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWxcIjtcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vZy1jb2x1bW4uc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT25lR3JpZEFwaTxUID0gYW55PiB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFB1YmxpYyBzdGF0ZVxuICAvL1xuICAvLyBFeHBvc2VkIGFzIGdldHRlcnMsIG5vdCBmaWVsZHMuIFRoZXNlIHdlcmUgd3JpdGFibGUsIHNvIGEgY29uc3VtZXIgY291bGRcbiAgLy8gY29ycnVwdCB0aGUgZ3JpZCBieSBhc3NpZ25pbmcgdG8gdGhlbSDigJQgc3dhcHBpbmcgYHJvd05vZGVzYCBmb3IgYW5cbiAgLy8gdW5yZWxhdGVkIGFycmF5LCBvciBzZXR0aW5nIGBzb3J0TW9kZWxgIHdpdGhvdXQgdGhlIHJvd3MgZXZlciBiZWluZ1xuICAvLyByZS1zb3J0ZWQuIFJlYWRzIGFyZSB1bmNoYW5nZWQ7IG9ubHkgYXNzaWdubWVudCBpcyBub3cgYSBjb21waWxlIGVycm9yLlxuICAvL1xuICAvLyBUaGUgYXJyYXktdmFsdWVkIG9uZXMgYXJlIHR5cGVkIGByZWFkb25seSBUW11gLCB3aGljaCBzdG9wcyBgcHVzaGAgYW5kXG4gIC8vIGBzcGxpY2VgIGF0IGNvbXBpbGUgdGltZSB3aXRob3V0IGNvcHlpbmcgb24gZXZlcnkgcmVhZC4gVXNlXG4gIC8vIGBnZXRBbGxSb3dOb2RlcygpYCB3aGVuIHlvdSB3YW50IGEgY29weSB5b3Ugb3duLlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfcm93U2VsZWN0aW9uOiBSb3dTZWxlY3Rpb25Nb2RlID0gbnVsbDtcbiAgcHJpdmF0ZSBfYXBpVHlwZTogT25lR3JpZFR5cGUgPSBudWxsO1xuICBwcml2YXRlIF9yb3dOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHByaXZhdGUgX3NvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10gPSBbXTtcblxuICAvKiogVW5pcXVlIHBlciBncmlkIGluc3RhbmNlLCBhc3NpZ25lZCBkdXJpbmcgYGluaXRgLiAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqIFRoZSBgW2NvbnRleHRdYCB0aGUgZ3JpZCB3YXMgZ2l2ZW4uICovXG4gIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgLyoqIFNlbGVjdGlvbiBtb2RlLCBjYXB0dXJlZCBkdXJpbmcgYGluaXRgLiBDaGFuZ2luZyB0aGUgaW5wdXQgbGF0ZXIgaGFzIG5vIGVmZmVjdC4gKi9cbiAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKTogUm93U2VsZWN0aW9uTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdGlvbjtcbiAgfVxuXG4gIC8qKiBXaGljaCByb2xlIHRoaXMgaW5zdGFuY2UgcGxheXM6IHNpbXBsZSwgbWFzdGVyLCBkZXRhaWwgb3IgdHJlZS4gKi9cbiAgcHVibGljIGdldCBhcGlUeXBlKCk6IE9uZUdyaWRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVHlwZTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBub2RlIHRoZSBncmlkIGhvbGRzLCBpbiBmbGF0dGVuZWQgb3JkZXIuICovXG4gIHB1YmxpYyBnZXQgcm93Tm9kZXMoKTogcmVhZG9ubHkgT25lUm93Tm9kZTxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM7XG4gIH1cblxuICAvKiogVGhlIHNvcnQgbW9kZWwgY3VycmVudGx5IGFwcGxpZWQuIENoYW5nZSBpdCB3aXRoIGBvblNvcnRDaGFuZ2VkYC4gKi9cbiAgcHVibGljIGdldCBzb3J0TW9kZWwoKTogcmVhZG9ubHkgT25lU29ydE1vZGVsPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0TW9kZWw7XG4gIH1cblxuXG4gIHByaXZhdGUgcm93SGVpZ2h0OiBudW1iZXIgPSAyNjtcbiAgcHJpdmF0ZSBoZWFkZXJSb3dIZWlnaHQ6IG51bWJlciA9IDMyO1xuICBwcml2YXRlIF9jdXJyZW50SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3F1aWNrRmlsdGVyVmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlcnM6IE9uZUZpbHRlck1vZGVsW10gPSBbXTtcblxuICBwcml2YXRlIF92aXNpYmxlUm93Tm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9waW5uZWRSb3dOb2RlczogUmVjb3JkPE9uZVBpbm5lZFJvd1NpZGUsIE9uZVJvd05vZGU8VD5bXT4gPSB7IHRvcDogW10sIGJvdHRvbTogW10gfTtcbiAgcHJpdmF0ZSBfb3JpZ2luYWxSb3dOb2RlczogTWFwPHN0cmluZywgT25lUm93Tm9kZTxUPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX25vZGVDbGVhbnVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PCgpID0+IHZvaWQ+PigpOyAvLyBDbGVhbnVwIHJlZ2lzdHJ5IChwcmV2ZW50cyBtZW1vcnkgbGVha3MpXG4gIHByaXZhdGUgX2Rlc3Ryb3llZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEFkdmFuY2VkIEZlYXR1cmVzXG4gIHByaXZhdGUgdHJlZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgZ3JvdXBEZWZhdWx0RXhwYW5kZWQ6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgcHJpdmF0ZSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudD86IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogU3VwcGxpZXMgYSBtYXN0ZXIgcm93J3MgZGV0YWlsIHJvd3MuIFNldCB0aHJvdWdoIGBzZXRHZXREZXRhaWxSb3dEYXRhYDtcbiAgICogcHJldmlvdXNseSBhIHdyaXRhYmxlIHB1YmxpYyBmaWVsZCB3aXRoIGEgc2V0dGVyIGJlc2lkZSBpdCwgd2hpY2ggbGVmdCB0d29cbiAgICogd2F5cyB0byBkbyB0aGUgc2FtZSB0aGluZyBhbmQgb25lIG9mIHRoZW0gdW5jaGVja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGV0YWlsUm93RGF0YTogKHBhcmFtczogT25lR2V0RGV0YWlsUm93RGF0YVBhcmFtcykgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbHVtblNlcnZpY2U6IE9nQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIHJvd1NlcnZpY2U6IE9uZUdyaWRSb3dTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2VsbFNlcnZpY2U6IE9uZUdyaWRDZWxsU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHNlbGVjdGlvblNlcnZpY2U6IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZXhwYW5zaW9uU2VydmljZTogT25lR3JpZEV4cGFuc2lvblNlcnZpY2VcbiAgKSB7IH1cblxuICAvKipcbiAgICogU3RhbmQgdGhlIGdyaWQgdXAuIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudGAgZnJvbSBgbmdPbkluaXRgLlxuICAgKlxuICAgKiBUYWtlcyBhIHNpbmdsZSBgT25lR3JpZEluaXRPcHRpb25zYCByYXRoZXIgdGhhbiB0aGUgdGVuIHBvc2l0aW9uYWxcbiAgICogYXJndW1lbnRzIGl0IHVzZWQgdG8sIHNvIGEgY2FsbCBzaXRlIHJlYWRzIGFzIHRoZSBjb25maWd1cmF0aW9uIGl0IGlzIGFuZFxuICAgKiBhIG5ldyBvcHRpb24gbm8gbG9uZ2VyIG1lYW5zIGVkaXRpbmcgZXZlcnkgY2FsbGVyLlxuICAgKlxuICAgKiBAaW50ZXJuYWwgQXBwbGljYXRpb25zIG9idGFpbiBhIHJlYWR5LW1hZGUgQVBJIGZyb20gYChvbkdyaWRSZWFkeSlgOyB0aGV5XG4gICAqIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgdGhlbXNlbHZlcy5cbiAgICovXG4gIGluaXQob3B0aW9uczogT25lR3JpZEluaXRPcHRpb25zPFQ+KTogdm9pZCB7XG5cbiAgICBjb25zdCB7XG4gICAgICBncmlkVHlwZSxcbiAgICAgIGNvbHVtbkRlZnMsXG4gICAgICBkZWZhdWx0Q29sdW1uRGVmID0ge30sXG4gICAgICBncm91cENvbHVtbkRlZnMgPSBbXSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgcm93U2VsZWN0aW9uID0gbnVsbCxcbiAgICAgIG1hc3RlckRldGFpbCA9IGZhbHNlLFxuICAgICAgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gbnVsbCxcbiAgICAgIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gbnVsbCxcbiAgICAgIHRyZWVEYXRhID0gZmFsc2UsXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICB0aGlzLl9pZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMuX2FwaVR5cGUgPSBncmlkVHlwZTtcbiAgICB0aGlzLl9yb3dTZWxlY3Rpb24gPSByb3dTZWxlY3Rpb247XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBtYXN0ZXJEZXRhaWw7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM7XG4gICAgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IGRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuICAgIHRoaXMudHJlZURhdGEgPSB0cmVlRGF0YTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZXRTZWxlY3Rpb25Nb2RlKHJvd1NlbGVjdGlvbik7XG5cbiAgICAvLyBTeW50aGV0aWMgZ3JvdXAgcm93cyBjYXJyeSB0aGVpciBvd24gc3RhYmxlIGlkIOKAlCB0aGUgcGF0aCBvZiBncm91cFxuICAgIC8vIHZhbHVlcyDigJQgd2hpY2ggbm8gaG9zdCBnZXRSb3dJZCBrbm93cyBob3cgdG8gZGVyaXZlLiBUaGUgd3JhcHBlciByZWFkc1xuICAgIC8vIGl0IGZpcnN0IGFuZCBkZWZlcnMgdG8gdGhlIGhvc3QncyBmdW5jdGlvbiAob3IgdGhlIHV1aWQgZmFsbGJhY2spIGZvclxuICAgIC8vIHJlYWwgcm93cywgc28gZ3JvdXBpbmcga2VlcHMgZXhwYW5zaW9uIGFjcm9zcyByZWJ1aWxkcyBldmVuIHdoZW4gdGhlXG4gICAgLy8gaG9zdCBwcm92aWRlZCBubyBpZCBmdW5jdGlvbiBhdCBhbGwuXG4gICAgY29uc3QgaG9zdEdldFJvd0lkID0gY29udGV4dD8uY29tcG9uZW50UGFyZW50Py5nZXRSb3dJZCA/PyBudWxsO1xuXG4gICAgdGhpcy5yb3dTZXJ2aWNlLnNldEdldFJvd0lkRm4oKHBhcmFtczogeyBkYXRhOiBhbnk7IHJvd0luZGV4OiBudW1iZXIgfSkgPT5cbiAgICAgIHBhcmFtcz8uZGF0YT8uW09ORV9HUk9VUF9JRF9GSUVMRF0gPz8gaG9zdEdldFJvd0lkPy4ocGFyYW1zKSA/PyBudWxsKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtbkRlZnMsIGNvbnRleHQpO1xuICAgIHRoaXMuY2VsbFNlcnZpY2Uuc2V0R3JpZEFwaSh0aGlzKTtcbiAgICB0aGlzLmNvbHVtblNlcnZpY2UuaW5pdENvbHVtbkRlZnMoZGVmYXVsdENvbHVtbkRlZiwgY29sdW1uRGVmcywgZ3JvdXBDb2x1bW5EZWZzLCBjb250ZXh0KTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSBhcyBDb2x1bW5DaGFuZ2VkRXZlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGV2ZXJ5IHJvdywgZGlzY2FyZGluZyBzZWxlY3Rpb24gYW5kIGV4cGFuc2lvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB0aGUgcm93cyByZXByZXNlbnQgc29tZXRoaW5nIG5ldy4gVG8gc3dhcCB0aGUgZGF0YSB3aGlsZVxuICAgKiBrZWVwaW5nIHdoYXQgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIGFuZCBvcGVuZWQsIHVzZSBgdXBkYXRlUm93RGF0YWAuXG4gICAqL1xuICBwdWJsaWMgc2V0Um93RGF0YShyb3dEYXRhOiBUW10pIHtcblxuICAgIHRoaXMucmVidWlsZFJvd3Mocm93RGF0YSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBldmVyeSByb3csIGtlZXBpbmcgc2VsZWN0aW9uIGFuZCBleHBhbnNpb24uXG4gICAqXG4gICAqIFN0YXRlIGlzIGtleWVkIGJ5IHJvdyBpZCwgc28gdGhpcyBvbmx5IHByZXNlcnZlcyBhbnl0aGluZyBpZiB0aGUgZ3JpZCBoYXMgYVxuICAgKiBgY29udGV4dC5jb21wb25lbnRQYXJlbnQuZ2V0Um93SWRgIOKAlCBvdGhlcndpc2UgZWFjaCByZWJ1aWxkIG1pbnRzIG5ldyBpZHNcbiAgICogYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBtYXRjaCBhZ2FpbnN0LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJvd0RhdGEocm93RGF0YTogVFtdKSB7XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvd0RhdGEsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIGJhdGNoIG9mIHJvdyBjaGFuZ2VzIHdpdGhvdXQgdGhlIGhvc3QgcmViaW5kaW5nIHRoZSBkYXRhc2V0OlxuICAgKiBhcHBlbmQgcm93cyAoYXQgdGhlIHJvb3QsIG9yIHVuZGVyIGEgcGFyZW50IGJ5IGlkIG9uIHRyZWUgZGF0YSksIHJlcGxhY2VcbiAgICogcm93cyBieSBpZCwgZHJvcCByb3dzIGF0IGFueSBkZXB0aC4gU2VsZWN0aW9uIGFuZCBleHBhbnNpb24gc3Vydml2ZSDigJRcbiAgICogdGhpcyBpcyBgdXBkYXRlUm93RGF0YWAgZmVkIGZyb20gdGhlIGdyaWQncyBvd24gY3VycmVudCByb3dzLCBzbyB0aGVcbiAgICogaG9zdCBrZWVwcyBubyBwYXJhbGxlbCBjb3B5IHRvIHJlY29uY2lsZS5cbiAgICpcbiAgICogUmVxdWlyZXMgYSBzdGFibGUgYGNvbnRleHQuY29tcG9uZW50UGFyZW50LmdldFJvd0lkYDogcm93cyBhcmUgbWF0Y2hlZCBieVxuICAgKiBpZCwgYW5kIHdpdGhvdXQgYW4gaWQgZnVuY3Rpb24gdGhlcmUgaXMgbm90aGluZyB0byBtYXRjaCBvbiDigJQgdGhlXG4gICAqIHRyYW5zYWN0aW9uIGlzIHJlZnVzZWQgd2l0aCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4gaGFsZi1hcHBsaWVkLlxuICAgKi9cbiAgcHVibGljIGFwcGx5VHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IE9uZVJvd1RyYW5zYWN0aW9uPFQ+KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkIHx8ICF0cmFuc2FjdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2FtcGxlID0gdHJhbnNhY3Rpb24udXBkYXRlPy5bMF0gPz8gdHJhbnNhY3Rpb24uYWRkPy5bMF1cbiAgICAgID8/ICh0cmFuc2FjdGlvbi5yZW1vdmUgPz8gW10pLmZpbmQoZW50cnkgPT4gdHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJyk7XG5cbiAgICBpZiAoc2FtcGxlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yb3dTZXJ2aWNlLnJlc29sdmVSb3dJZChzYW1wbGUpID09PSBudWxsKSB7XG5cbiAgICAgIGNvbnNvbGUud2FybignW29uZS1ncmlkXSBhcHBseVRyYW5zYWN0aW9uIG5lZWRzIGNvbnRleHQuY29tcG9uZW50UGFyZW50LmdldFJvd0lkIOKAlCByb3dzIGFyZSBtYXRjaGVkIGJ5IGlkLiBOb3RoaW5nIHdhcyBhcHBsaWVkLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlSWRzID0gbmV3IFNldChcbiAgICAgICh0cmFuc2FjdGlvbi5yZW1vdmUgPz8gW10pLm1hcChlbnRyeSA9PlxuICAgICAgICB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZW50cnkgOiB0aGlzLnJvd1NlcnZpY2UucmVzb2x2ZVJvd0lkKGVudHJ5KSksXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZXMgPSBuZXcgTWFwKFxuICAgICAgKHRyYW5zYWN0aW9uLnVwZGF0ZSA/PyBbXSkubWFwKGRhdGEgPT4gW3RoaXMucm93U2VydmljZS5yZXNvbHZlUm93SWQoZGF0YSksIGRhdGFdKSxcbiAgICApO1xuXG4gICAgY29uc3QgY2hpbGRyZW5GaWVsZCA9IHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkO1xuXG4gICAgLy8gUm93IGdyb3VwaW5nIGZvbGRzIGZsYXQgcm93cyBpdHNlbGYsIHNvIHRoZSB0cmFuc2FjdGlvbiBvcGVyYXRlcyBvbiB0aGVcbiAgICAvLyBsZWF2ZXMgYW5kIHJlLWdyb3VwczsgYSBwYXJlbnQgdGFyZ2V0IHdvdWxkIG5hbWUgYSBzeW50aGV0aWMgZ3JvdXAgcm93LFxuICAgIC8vIHdoaWNoIGlzIG5vdCBhIHBsYWNlIGRhdGEgY2FuIGxpdmUuXG4gICAgY29uc3QgZ3JvdXBpbmcgPSB0aGlzLl9yb3dHcm91cEZpZWxkcy5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGFkZFRvUGFyZW50SWQgPSBncm91cGluZyA/IHVuZGVmaW5lZCA6IHRyYW5zYWN0aW9uLmFkZFRvUGFyZW50SWQ7XG5cbiAgICBpZiAoZ3JvdXBpbmcgJiYgdHJhbnNhY3Rpb24uYWRkVG9QYXJlbnRJZCkge1xuXG4gICAgICBjb25zb2xlLndhcm4oJ1tvbmUtZ3JpZF0gYXBwbHlUcmFuc2FjdGlvbjogYWRkVG9QYXJlbnRJZCBpcyBpZ25vcmVkIHVuZGVyIHJvdyBncm91cGluZyDigJQgZ3JvdXBzIGFyZSBzeW50aGV0aWMuIFJvd3Mgd2VyZSBhZGRlZCBhdCB0aGUgcm9vdC4nKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5LW9uLXdyaXRlIG92ZXIgdGhlIGdyaWQncyBvd24gY3VycmVudCByb3dzOiB0aGUgbm9kZSBncmFwaCBjYXJyaWVzXG4gICAgLy8gdGhlIGRhdGEsIHNvIHRoZSBob3N0J3Mgb3JpZ2luYWwgYXJyYXlzIGFyZSBuZXZlciBtdXRhdGVkIGFuZCB1bnRvdWNoZWRcbiAgICAvLyBicmFuY2hlcyBrZWVwIHRoZWlyIG9iamVjdCBpZGVudGl0eSBmb3IgdGhlIG5vZGUtcmV1c2UgcGF0aC5cbiAgICBjb25zdCBhcHBseVRvID0gKHJvd3M6IFRbXSk6IFRbXSA9PiByb3dzXG4gICAgICAuZmlsdGVyKGRhdGEgPT4gIXJlbW92ZUlkcy5oYXModGhpcy5yb3dTZXJ2aWNlLnJlc29sdmVSb3dJZChkYXRhKSkpXG4gICAgICAubWFwKGRhdGEgPT4ge1xuXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5yb3dTZXJ2aWNlLnJlc29sdmVSb3dJZChkYXRhKTtcblxuICAgICAgICBsZXQgbmV4dCA9IHVwZGF0ZXMuZ2V0KGlkKSA/PyBkYXRhO1xuXG4gICAgICAgIGlmICh0aGlzLnRyZWVEYXRhICYmIGNoaWxkcmVuRmllbGQpIHtcblxuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gKG5leHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NoaWxkcmVuRmllbGRdIGFzIFRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCByZWJ1aWx0ID0gY2hpbGRyZW4gPyBhcHBseVRvKGNoaWxkcmVuKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGNvbnN0IHdpdGhBZGRlZCA9IGlkICE9IG51bGwgJiYgaWQgPT09IGFkZFRvUGFyZW50SWRcbiAgICAgICAgICAgID8gWy4uLihyZWJ1aWx0ID8/IFtdKSwgLi4uKHRyYW5zYWN0aW9uLmFkZCA/PyBbXSldXG4gICAgICAgICAgICA6IHJlYnVpbHQ7XG5cbiAgICAgICAgICBpZiAod2l0aEFkZGVkICE9PSBjaGlsZHJlbikgbmV4dCA9IHsgLi4ubmV4dCwgW2NoaWxkcmVuRmllbGRdOiB3aXRoQWRkZWQgPz8gW10gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50Um93cyA9IGdyb3VwaW5nXG4gICAgICA/IHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUubGVhZikubWFwKG5vZGUgPT4gbm9kZS5kYXRhKVxuICAgICAgOiB0aGlzLl9yb3dOb2Rlcy5maWx0ZXIobm9kZSA9PiAhbm9kZS5wYXJlbnQpLm1hcChub2RlID0+IG5vZGUuZGF0YSk7XG5cbiAgICBsZXQgcm9vdHMgPSBhcHBseVRvKGN1cnJlbnRSb3dzKTtcblxuICAgIGlmICh0cmFuc2FjdGlvbi5hZGQ/Lmxlbmd0aCAmJiAhYWRkVG9QYXJlbnRJZCkge1xuXG4gICAgICByb290cyA9IFsuLi5yb290cywgLi4udHJhbnNhY3Rpb24uYWRkXTtcbiAgICB9XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvb3RzLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9uZSByb3ctbG9hZGluZyBwYXRoLiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBkaWZmZXJlZCBvbmx5IGluXG4gICAqIHdoZXRoZXIgdGhleSBjbGVhcmVkIHRoZSBzdGF0ZSBzZXJ2aWNlcyBmaXJzdCwgc28gZXZlcnl0aGluZyBlbHNlIOKAlCBidWlsZCxcbiAgICogZmlsdGVyLCBwcnVuZSDigJQgbGl2ZXMgaGVyZSBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkUm93cyhyb3dEYXRhOiBUW10sIHJlc2V0U3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGlmIChyZXNldFN0YXRlKSB7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gUm93IGdyb3VwaW5nIGlzIGEgdHJhbnNmb3JtIG9uIHRoZSB3YXkgaW46IHRoZSBob3N0IGtlZXBzIGhhbmRpbmcgdGhlXG4gICAgLy8gZ3JpZCBmbGF0IHJvd3MsIGFuZCB0aGUgdHJlZSBwaXBlbGluZSBiZWxvdyBzZWVzIHN5bnRoZXRpYyBncm91cCByb3dzXG4gICAgLy8gd2l0aCBjaGlsZHJlbiDigJQgdGhlIHNhbWUgc2hhcGUgdHJlZSBkYXRhIGFycml2ZXMgaW4uXG4gICAgaWYgKHRoaXMuX3Jvd0dyb3VwRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICByb3dEYXRhID0gYnVpbGRHcm91cGVkUm93cyhyb3dEYXRhLCB0aGlzLl9yb3dHcm91cEZpZWxkcywgdGhpcy5fYWdnQ29sdW1ucykgYXMgVFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICB0aGlzLmJ1aWxkUm93Tm9kZXMocm93RGF0YSwgbnVsbCwgMCwgdmFsaWRSb3dJZHMpO1xuXG4gICAgLy8gUHJ1bmUgQkVGT1JFIHNvcnRpbmcgYW5kIGZpbHRlcmluZzogYm90aCByZWFkIGBfb3JpZ2luYWxSb3dOb2Rlc2AsIGFuZFxuICAgIC8vIHdpdGggdGhlIHBydW5lIGxhc3QsIGEgZGF0YSBzd2FwIHdoaWxlIGEgc29ydCB3YXMgYWN0aXZlIHJlc3VycmVjdGVkXG4gICAgLy8gdGhlIHJlbW92ZWQgcm93cyBpbnRvIGBfcm93Tm9kZXNgIGZvciBvbmUgd2hvbGUgcmVuZGVyIOKAlCB0aGUgb2xkIGFuZFxuICAgIC8vIHRoZSBuZXcgZGF0YXNldCBvbiBzY3JlZW4gdG9nZXRoZXIgdW50aWwgdGhlIG5leHQgcmVidWlsZC5cbiAgICB0aGlzLnBydW5lUmVtb3ZlZE5vZGVzKHZhbGlkUm93SWRzKTtcblxuICAgIC8vIFJlLWFwcGx5IHRoZSBhY3RpdmUgc29ydC4gYGJ1aWxkUm93Tm9kZXNgIHJlYnVpbGRzIHRoZSByb3cgbGlzdCBpbiB0aGVcbiAgICAvLyBvcmRlciB0aGUgZGF0YSBhcnJpdmVkLCBzbyB3aXRob3V0IHRoaXMgYSBkYXRhIHVwZGF0ZSBzaWxlbnRseSByZXR1cm5lZFxuICAgIC8vIHRoZSByb3dzIHRvIHRoYXQgb3JkZXIgd2hpbGUgYHNvcnRNb2RlbGAg4oCUIGFuZCB0aGVyZWZvcmUgdGhlIGhlYWRlcidzXG4gICAgLy8gc29ydCBhcnJvdyDigJQgc3RpbGwgc2FpZCB0aGV5IHdlcmUgc29ydGVkLiBTb3J0aW5nIGJlZm9yZSBmaWx0ZXJpbmdcbiAgICAvLyBiZWNhdXNlIGZpbHRlcmluZyBvbmx5IHNldHMgdmlzaWJpbGl0eSBvbiB3aGF0ZXZlciBvcmRlciB0aGlzIGxlYXZlcy5cbiAgICBpZiAodGhpcy5fc29ydE1vZGVsLmxlbmd0aCA+IDApIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBCdWlsZCBSb3cgTm9kZXMgKE9wdGltaXplZClcbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dOb2RlcyhcbiAgICByb3dEYXRhOiBUW10sXG4gICAgcGFyZW50OiBPbmVSb3dOb2RlPFQ+IHwgbnVsbCA9IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlciA9IDAsXG4gICAgdmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuICAgIGV4cGFuZGVkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5leHBhbnNpb25TZXJ2aWNlLmdldEV4cGFuZGVkSWRzKCkpLFxuICAgIGNvbGxhcHNlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuZXhwYW5zaW9uU2VydmljZS5nZXRDb2xsYXBzZWRJZHMoKSksXG4gICAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRJZHMoKSksXG4gICAgdmlzaXRlZERhdGE6IFNldDx1bmtub3duPiA9IG5ldyBTZXQoKVxuICApOiBPbmVSb3dOb2RlW10ge1xuXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFtdO1xuICAgICAgdGhpcy5fY3VycmVudEluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIXJvd0RhdGE/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkYXRhIG9mIHJvd0RhdGEpIHtcblxuICAgICAgY29uc3Qgcm93SWQgPSB0aGlzLnJvd1NlcnZpY2UuZ2VuZXJhdGVSb3dJZChkYXRhLCB0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICAvLyBBIGN5Y2xlIGluIHRoZSBjaGlsZHJlbiBncmFwaCDigJQgYSByb3cgcmVhY2hhYmxlIGZyb20gaXRzIG93biBzdWJ0cmVlLFxuICAgICAgLy8gdGhlIGNsYXNzaWMgT1JNIGJhY2stcmVmZXJlbmNlIOKAlCB1c2VkIHRvIHJlY3Vyc2UgdW50aWwgdGhlIHN0YWNrIGJsZXcsXG4gICAgICAvLyBmcmVlemluZyB0aGUgYXBwOyBhbmQgd2l0aCBnZW5lcmF0ZWQgcm93IGlkcyBpdCBkaWQgc28gd2hpbGUgbWludGluZ1xuICAgICAgLy8gbm9kZXMgdGhlIHdob2xlIHdheSBkb3duLiBUaGUgc2FtZSBndWFyZCBhbHNvIGRyb3BzIGEgZHVwbGljYXRlIHJvdyBpZFxuICAgICAgLy8gKG9yIHRoZSBzYW1lIHJvdyBvYmplY3QgYXBwZWFyaW5nIHR3aWNlKTogZmlyc3Qgb2NjdXJyZW5jZSB3aW5zLlxuICAgICAgaWYgKHZpc2l0ZWREYXRhLmhhcyhkYXRhKSB8fCB2YWxpZFJvd0lkcy5oYXMocm93SWQpKSB7XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBbb25lLWdyaWRdIGN5Y2xpYyBvciBkdXBsaWNhdGUgcm93IChpZCBcIiR7cm93SWR9XCIpIOKAlCBza2lwcGVkLCBmaXJzdCBvY2N1cnJlbmNlIHdpbnMuIFRyZWUgZGF0YSBtdXN0IGJlIGFjeWNsaWMgYW5kIHJvdyBpZHMgdW5pcXVlLmApO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aXNpdGVkRGF0YS5hZGQoZGF0YSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGRhdGEgYXMgYW55KVt0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZF0gfHwgbnVsbDtcblxuICAgICAgbGV0IG5vZGU6IE9uZVJvd05vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICAgIHZhbGlkUm93SWRzLmFkZChyb3dJZCk7XG5cbiAgICAgIGlmIChub2RlKSB7XG5cbiAgICAgICAgbm9kZS5kYXRhID0gZGF0YTtcbiAgICAgICAgbm9kZS5zZXRSb3dJbmRleCh0aGlzLl9jdXJyZW50SW5kZXgpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUgPSBuZXcgT25lUm93Tm9kZTxUPihyb3dJZCwgZGF0YSwgdGhpcy5fY3VycmVudEluZGV4KTtcbiAgICAgICAgbm9kZS5sZXZlbCA9IGxldmVsO1xuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgbm9kZS5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5zZXQocm93SWQsIG5vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FeGlzdCA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+PSAwO1xuXG4gICAgICAvLyBDb2VyY2VkLCBiZWNhdXNlIGBjaGlsZHJlbkV4aXN0YCBpcyBgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID49IDBgXG4gICAgICAvLyDigJQgd2hpY2ggaXMgYG51bGxgIGZvciBhIHJvdyB3aXRoIG5vIGNoaWxkcmVuIGZpZWxkLCBub3QgYGZhbHNlYC4gVGhlc2VcbiAgICAgIC8vIGFyZSBkZWNsYXJlZCBgYm9vbGVhbmAsIGFuZCBhc3NpZ25pbmcgbnVsbCBtYWRlIGV2ZXJ5IGNvbnN1bWVyIGNvbXBhcmVcbiAgICAgIC8vIHRydXRoaW5lc3MgaW5zdGVhZCBvZiB0aGUgdmFsdWUuXG4gICAgICBub2RlLmdyb3VwID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyBmYWxzZSA6ICEhY2hpbGRyZW5FeGlzdDtcbiAgICAgIG5vZGUubGVhZiA9IHRoaXMubWFzdGVyRGV0YWlsID8gdHJ1ZSA6ICFub2RlLmdyb3VwO1xuICAgICAgbm9kZS5sZWFmR3JvdXAgPSB0aGlzLm1hc3RlckRldGFpbCA/IGZhbHNlIDogKG5vZGUuZ3JvdXAgJiYgIWNoaWxkcmVuRXhpc3QpO1xuICAgICAgbm9kZS5leHBhbmRhYmxlID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyB0cnVlIDogKG5vZGUuZ3JvdXAgJiYgIW5vZGUubGVhZkdyb3VwKTtcblxuICAgICAgY29uc3QgZGVmYXVsdEV4cGFuZGVkID0gbm9kZS5leHBhbmRhYmxlICYmIChsZXZlbCA8IHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgfHwgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9PT0gLTEpO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkSWRzLmhhcyhyb3dJZCkgPyB0cnVlIDogY29sbGFwc2VkSWRzLmhhcyhyb3dJZCkgPyBmYWxzZSA6IGRlZmF1bHRFeHBhbmRlZCk7XG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkSWRzLmhhcyhyb3dJZCkpO1xuICAgICAgbm9kZS5zZXRDZWxsU3RhdGVzKHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGUpKTtcblxuICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsICYmIHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5fZ2V0RGV0YWlsUm93RGF0YSh7IGRhdGEsIG5vZGU6IG5vZGUsIHN1Y2Nlc3NDYWxsYmFjazogKGRldGFpbFJvd0RhdGEpID0+IG5vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxSb3dEYXRhKSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY3VycmVudEluZGV4Kys7XG4gICAgICB0aGlzLl9yb3dOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICBub2RlLmNoaWxkcmVuID0gdGhpcy50cmVlRGF0YSAmJiBjaGlsZHJlbkV4aXN0ID8gdGhpcy5idWlsZFJvd05vZGVzKGNoaWxkcmVuIHx8IFtdLCBub2RlLCBsZXZlbCArIDEsIHZhbGlkUm93SWRzLCBleHBhbmRlZElkcywgY29sbGFwc2VkSWRzLCBzZWxlY3RlZElkcywgdmlzaXRlZERhdGEpIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBGZWF0dXJlXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuXG4gICAgY29uc3QgcXVpY2sgPSB0aGlzLl9xdWlja0ZpbHRlclZhbHVlPy50b0xvd2VyQ2FzZSgpID8/ICcnO1xuXG4gICAgLy8gVGhlIGZpZWxkcyB0aGUgZ3JpZCBhY3R1YWxseSBzaG93cy4gV2l0aG91dCB0aGVtIHRoZSBxdWljayBmaWx0ZXIgZmFsbHNcbiAgICAvLyBiYWNrIHRvIGV2ZXJ5IHByb3BlcnR5IG9uIHRoZSByb3csIHdoaWNoIGxldHMgYSB1c2VyIG1hdGNoIG9uIGRhdGEgdGhhdFxuICAgIC8vIGhhcyBubyBjb2x1bW4gYW5kIG5ldmVyIGFwcGVhcnMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucXVpY2tGaWx0ZXJGaWVsZHMoKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBmaWx0ZXJUcmVlTm9kZShub2RlLCBmaWx0ZXJzLCBxdWljaywgZmllbGRzKSk7XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCBmaWVsZHMgdGhlIHF1aWNrIGZpbHRlciBzZWFyY2hlczogZXZlcnkgY29sdW1uIHRoYXQgaGFzIG9uZS5cbiAgICpcbiAgICogRW1wdHkgd2hpbGUgdGhlIGNvbHVtbnMgYXJlIHN0aWxsIGJlaW5nIHJlZ2lzdGVyZWQsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAqIGhlbHBlciBmYWxscyBiYWNrIHRvIHNlYXJjaGluZyB0aGUgcm93IOKAlCB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgYmVmb3JlLCBhbmRcbiAgICogdGhlIG9ubHkgc2Vuc2libGUgYW5zd2VyIHdoZW4gdGhlIGdyaWQgZG9lcyBub3QgeWV0IGtub3cgaXRzIGNvbHVtbnMuXG4gICAqL1xuICBwcml2YXRlIHF1aWNrRmlsdGVyRmllbGRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2VcbiAgICAgIC5nZXRDb2x1bW5TdGF0ZSgpXG4gICAgICAuY29sdW1uc1xuICAgICAgLm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkIGFzIHN0cmluZylcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+ICEhZmllbGQgJiYgZmllbGQgIT09ICdfb25lUm93TnVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIFJvdyBOb2RlcyBEaXNwbGF5XG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hWaXNpYmxlTm9kZXMoZGlzcGF0Y2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB2aXNpYmxlTm9kZXM6IE9uZVJvd05vZGVbXSA9IFtdO1xuXG4gICAgbGV0IHJvd051bWJlciA9IDE7XG5cbiAgICBjb25zdCB2aXNpYmlsaXR5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9yb3dOb2Rlcykge1xuXG4gICAgICBjb25zdCBwYXJlbnRWaXNpYmxlID0gbm9kZS5wYXJlbnQgPyB2aXNpYmlsaXR5Q2FjaGUuZ2V0KG5vZGUucGFyZW50LnJvd0lkKSA6IHRydWU7XG5cbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IG5vZGUudmlzaWJsZSAmJiBwYXJlbnRWaXNpYmxlICYmICghbm9kZS5wYXJlbnQgfHwgbm9kZS5wYXJlbnQuZXhwYW5kZWQpO1xuXG4gICAgICB2aXNpYmlsaXR5Q2FjaGUuc2V0KG5vZGUucm93SWQsIGlzVmlzaWJsZSk7XG5cbiAgICAgIGlmIChpc1Zpc2libGUpIHtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXNbJ19vbmVSb3dOdW1iZXInXSA9IHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogcm93TnVtYmVyKysgfTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHZpc2libGVOb2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlc1snX29uZVJvd051bWJlciddID0geyB0eXBlOiAnbm9uZScsIHZhbHVlOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gWy4uLnZpc2libGVOb2Rlc107XG5cbiAgICBpZiAoZGlzcGF0Y2gpIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Jvd0RhdGFDaGFuZ2VkJywgeyBub2RlczogdmlzaWJsZU5vZGVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHJvd3MgYW5jaG9yZWQgdG8gb25lIGVkZ2Ugb2YgdGhlIGdyaWQuXG4gICAqXG4gICAqIFBpbm5lZCByb3dzIGFyZSBkZWxpYmVyYXRlbHkga2VwdCBvdXQgb2YgYHJvd05vZGVzYCBhbmRcbiAgICogYF9vcmlnaW5hbFJvd05vZGVzYDogdGhleSBhcmUgbm90IGRhdGEuIFNvcnRpbmcsIGZpbHRlcmluZywgc2VsZWN0aW9uLFxuICAgKiBleHBhbnNpb24sIHBhZ2luYXRpb24gYW5kIHRoZSB2aXNpYmxlIHJvdyBjb3VudCBhbGwgaWdub3JlIHRoZW0sIHdoaWNoIGlzXG4gICAqIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN1bW1hcnkgcm93LiBUaGV5IHJlbmRlciB3aXRoIHRoZSBzYW1lIGNvbHVtblxuICAgKiBkZWZpbml0aW9ucywgc28gcmVuZGVyZXJzIGFuZCB2YWx1ZSBnZXR0ZXJzIHdvcmsgYXMgdGhleSBkbyBldmVyeXdoZXJlXG4gICAqIGVsc2UuXG4gICAqL1xuICBwdWJsaWMgc2V0UGlubmVkUm93RGF0YShzaWRlOiBPbmVQaW5uZWRSb3dTaWRlLCByb3dEYXRhOiBUW10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSkgbm9kZS5kZXN0cm95KCk7XG5cbiAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IChyb3dEYXRhID8/IFtdKS5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG5cbiAgICAgIC8vIElkcyBhcmUgbmFtZXNwYWNlZCBieSBzaWRlIGFuZCBwb3NpdGlvbi4gVGhleSBuZXZlciBjb2xsaWRlIHdpdGggYSBkYXRhXG4gICAgICAvLyByb3cncyBpZCwgYW5kIHRoZXkgYXJlIHN0YWJsZSBhY3Jvc3MgcmVidWlsZHMsIHdoaWNoIGtlZXBzIHRoZSByZW5kZXJlZFxuICAgICAgLy8gYGRhdGEtY2VsbC1pZGAgYXR0cmlidXRlcyBzdGFibGUgdG9vLlxuICAgICAgY29uc3Qgbm9kZSA9IG5ldyBPbmVSb3dOb2RlPFQ+KGBvbmUtcGlubmVkLSR7c2lkZX0tJHtpbmRleH1gLCBkYXRhLCBpbmRleCk7XG5cbiAgICAgIG5vZGUubGV2ZWwgPSAwO1xuICAgICAgbm9kZS5sZWFmID0gdHJ1ZTtcbiAgICAgIG5vZGUudmlzaWJsZSA9IHRydWU7XG4gICAgICBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Bpbm5lZFJvd0RhdGFDaGFuZ2VkJywge1xuICAgICAgc2lkZSxcbiAgICAgIG5vZGVzOiB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgcm93cyBhbmNob3JlZCB0byBvbmUgZWRnZS4gUmVhZC1vbmx5OyBjaGFuZ2UgdGhlbSB3aXRoIGBzZXRQaW5uZWRSb3dEYXRhYC4gKi9cbiAgcHVibGljIGdldFBpbm5lZFJvd05vZGVzKHNpZGU6IE9uZVBpbm5lZFJvd1NpZGUpOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdyByZW9yZGVyaW5nXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqXG4gICAqIGBfb3JpZ2luYWxSb3dOb2Rlc2AgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3Igcm93IG9yZGVyOiBpdHMgaW5zZXJ0aW9uXG4gICAqIG9yZGVyIGlzIHdoYXQgYGFwcGx5U29ydGluZ2AgZmFsbHMgYmFjayB0byB3aGVuIHRoZSBzb3J0IG1vZGVsIGVtcHRpZXMsIGFuZFxuICAgKiB3aGF0IGEgcmVidWlsZCB3YWxrcy4gYF9yb3dOb2Rlc2AgaXMgb25seSB0aGUgY3VycmVudCBkaXNwbGF5IG9yZGVyLiBBIG1vdmVcbiAgICogdGhhdCB0b3VjaGVkIG9uZSBhbmQgbm90IHRoZSBvdGhlciB3b3VsZCBlaXRoZXIgYmUgdW5kb25lIGJ5IHRoZSBuZXh0IHNvcnRcbiAgICogY2hhbmdlIG9yIGludmlzaWJsZSB1bnRpbCBvbmUgaGFwcGVuZWQsIHNvIGJvdGggYXJlIHJld3JpdHRlbiB0b2dldGhlci5cbiAgICovXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRpc3BsYXllZCBvcmRlciBpcyB0aGUgZGF0YSBvcmRlciwgYW5kIHNvIHdoZXRoZXIgYSBtYW51YWwgbW92ZVxuICAgKiB3b3VsZCBzdXJ2aXZlLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgcmVhc29uIHJlb3JkZXJpbmcgaXMgdW5hdmFpbGFibGUsIG9yIGBudWxsYCB3aGVuIGl0IGlzIGZpbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKTogT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfCBudWxsIHtcblxuICAgIGlmICh0aGlzLnRyZWVEYXRhKSByZXR1cm4gJ3RyZWVEYXRhJztcblxuICAgIGlmICh0aGlzLl9zb3J0TW9kZWwubGVuZ3RoID4gMCkgcmV0dXJuICdzb3J0ZWQnO1xuXG4gICAgaWYgKGlzRmlsdGVyQWN0aXZlKHRoaXMuX2FjdGl2ZUZpbHRlcnMsIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPz8gJycpKSByZXR1cm4gJ2ZpbHRlcmVkJztcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIENvbnZlbmllbmNlIGludmVyc2Ugb2Yge0BsaW5rIGdldFJvd0RyYWdTdXBwcmVzc2VkUmVhc29ufS4gKi9cbiAgcHVibGljIGNhblJlb3JkZXJSb3dzKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24oKSA9PT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGZyb20gb25lIHBvc2l0aW9uIHRvIGFub3RoZXIuXG4gICAqXG4gICAqIEluZGljZXMgYXJlIHBvc2l0aW9ucyBpbiB0aGUgZ3JpZCdzIHJvdyBvcmRlciwgdGhlIHNhbWUgb3JkZXJcbiAgICogYGdldEFsbFJvd05vZGVzKClgIHJldHVybnMuIGB0YXJnZXRJbmRleGAgaXMgd2hlcmUgdGhlIHJvdyBlbmRzIHVwICphZnRlcipcbiAgICogaXQgaGFzIGJlZW4gbGlmdGVkIG91dCBvZiBgc291cmNlSW5kZXhgIOKAlCBkcmFnZ2luZyByb3cgMCB0byB0aGUgYm90dG9tIG9mIGFcbiAgICogNS1yb3cgZ3JpZCBpcyBgbW92ZVJvdygwLCA0KWAsIG5vdCBgbW92ZVJvdygwLCA1KWAuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcm93cyBtb3ZlZC4gYGZhbHNlYCB3aGVuIHRoZSBtb3ZlIHdhcyByZWplY3RlZCDigJRcbiAgICogICAgICAgICAgb3V0LW9mLXJhbmdlIGluZGljZXMsIGEgbm8tb3AsIG9yIGFuIG9yZGVyIHRoZSBncmlkIGRvZXMgbm90IG93blxuICAgKiAgICAgICAgICAoc2VlIHtAbGluayBnZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbn0pIOKAlCBzbyBhIGNhbGxlciBjYW4gdGVsbCBhXG4gICAqICAgICAgICAgIHJlZnVzZWQgbW92ZSBmcm9tIGFuIGFwcGxpZWQgb25lLlxuICAgKi9cbiAgcHVibGljIG1vdmVSb3coc291cmNlSW5kZXg6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmNhblJlb3JkZXJSb3dzKCkpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG9yZGVyID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZUluZGV4KSB8fCAhTnVtYmVyLmlzSW50ZWdlcih0YXJnZXRJbmRleCkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChzb3VyY2VJbmRleCA8IDAgfHwgc291cmNlSW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IG9yZGVyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNvdXJjZUluZGV4ID09PSB0YXJnZXRJbmRleCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgW21vdmVkXSA9IG9yZGVyLnNwbGljZShzb3VyY2VJbmRleCwgMSk7XG5cbiAgICBvcmRlci5zcGxpY2UodGFyZ2V0SW5kZXgsIDAsIG1vdmVkKTtcblxuICAgIC8vIFJlYnVpbHQgcmF0aGVyIHRoYW4gbXV0YXRlZDogYSBNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciwgYW5kIHRoZXJlXG4gICAgLy8gaXMgbm8gd2F5IHRvIHJlcG9zaXRpb24gYSBrZXkgd2l0aGluIG9uZS5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzID0gbmV3IE1hcChvcmRlci5tYXAobm9kZSA9PiBbbm9kZS5yb3dJZCwgbm9kZV0pKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gb3JkZXI7XG5cbiAgICB0aGlzLnJlaW5kZXhSb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdyb3dPcmRlckNoYW5nZWQnLCB7IG5vZGVzOiB0aGlzLl92aXNpYmxlUm93Tm9kZXMgYXMgT25lUm93Tm9kZTxUPltdLCBub2RlOiBtb3ZlZCwgZnJvbUluZGV4OiBzb3VyY2VJbmRleCwgdG9JbmRleDogdGFyZ2V0SW5kZXggfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGEgcm93IGlkZW50aWZpZWQgYnkgaWQuIENvbnZlbmllbnQgd2hlbiB0aGUgY2FsbGVyIGhvbGRzIGEgbm9kZSByYXRoZXJcbiAgICogdGhhbiBhIHBvc2l0aW9uIOKAlCB0aGUgaW5kZXggaXQgd2FzIGJ1aWx0IHdpdGggZ29lcyBzdGFsZSBhZnRlciBhbnkgbW92ZS5cbiAgICovXG4gIHB1YmxpYyBtb3ZlUm93QnlJZChyb3dJZDogc3RyaW5nLCB0YXJnZXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cbiAgICBjb25zdCBzb3VyY2VJbmRleCA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSByb3dJZCk7XG5cbiAgICByZXR1cm4gc291cmNlSW5kZXggPT09IC0xID8gZmFsc2UgOiB0aGlzLm1vdmVSb3coc291cmNlSW5kZXgsIHRhcmdldEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zdGFtcCBgcm93SW5kZXhgIGZyb20gdGhlIGN1cnJlbnQgb3JkZXIuXG4gICAqXG4gICAqIFJvdyBpbmRleCBpcyBkZW5vcm1hbGlzZWQgb250byBldmVyeSBub2RlLCBhbmQgaGFsZiB0aGUgZ3JpZCByZWFkcyBpdCDigJRcbiAgICogY2VsbCBwYXJhbXMsIHRoZSByYW5nZSBzZWxlY3Rpb24sIHRoZSBkZXRhaWwgbG9va3VwLiBMZWF2aW5nIGl0IHN0YWxlIGFmdGVyXG4gICAqIGEgbW92ZSBwdXRzIGV2ZXJ5IHJvdyBiZWxvdyB0aGUgZHJvcCBwb2ludCBvbmUgb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWluZGV4Um93cygpOiB2b2lkIHtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiBub2RlLnNldFJvd0luZGV4KGluZGV4KSk7XG5cbiAgICAvLyBTaWxlbnQ6IHJvdyBudW1iZXJzIGFuZCB0aGUgdmlzaWJsZSBsaXN0IGhhdmUgdG8gYmUgcmVidWlsdCwgYnV0IHRoZVxuICAgIC8vIGByb3dEYXRhQ2hhbmdlZGAgdGhhdCBub3JtYWxseSBmb2xsb3dzIGRlZmVycyBhIGZyYW1lIGFuZCByZS1zZWVkcyBkZXRhaWxcbiAgICAvLyByb3dzLiBBIGtleWJvYXJkIGRyYWcgZmlyZXMgb25lIG9mIHRoZXNlIHBlciBhcnJvdyBrZXksIGFuZCBgbW92ZVJvd2BcbiAgICAvLyBhbm5vdW5jZXMgaXRzZWxmIHRocm91Z2ggYHJvd09yZGVyQ2hhbmdlZGAgaW5zdGVhZC5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldFZpc2libGVSb3dOb2RlcygpOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVSb3dOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0aW5nIE1vZGVsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBvblNvcnRDaGFuZ2VkKHNvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10pIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3NvcnRNb2RlbCA9IHNvcnRNb2RlbDtcblxuICAgIHRoaXMuYXBwbHlTb3J0aW5nKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzb3J0Q2hhbmdlZCcsIHsgbm9kZXM6IHRoaXMuX3Jvd05vZGVzLCBzb3J0TW9kZWw6IHRoaXMuX3NvcnRNb2RlbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTb3J0aW5nKCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPT09IDApIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV07XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJhdG9yID0gKGE6IE9uZVJvd05vZGU8VD4sIGI6IE9uZVJvd05vZGU8VD4pOiBudW1iZXIgPT4ge1xuXG4gICAgICBmb3IgKGNvbnN0IHNvcnRJdGVtIG9mIHRoaXMuX3NvcnRNb2RlbCkge1xuXG4gICAgICAgIGNvbnN0IHsgY29sSWQsIHNvcnQgfSA9IHNvcnRJdGVtO1xuICAgICAgICBjb25zdCB2YWxBID0gZ2V0RmllbGRWYWx1ZShhLmRhdGEsIGNvbElkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IHZhbEIgPSBnZXRGaWVsZFZhbHVlKGIuZGF0YSwgY29sSWQgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgY29tcGFyaXNvblJlc3VsdCA9IHRoaXMuY29tcGFyZVZhbHVlcyh2YWxBLCB2YWxCLCBzb3J0KTtcblxuICAgICAgICBpZiAoY29tcGFyaXNvblJlc3VsdCAhPT0gMCkge1xuXG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25SZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMudHJlZURhdGEpIHtcblxuICAgICAgdGhpcy5fcm93Tm9kZXMgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV0uc29ydChjb21wYXJhdG9yKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdHJlZSBzb3J0cyBzaWJsaW5ncyB3aXRoaW4gdGhlaXIgcGFyZW50LCBuZXZlciBhY3Jvc3MgaXQg4oCUIGEgZmxhdFxuICAgIC8vIHNvcnQgb2YgdGhlIHdob2xlIGxpc3QgaW50ZXJsZWF2ZWQgcGFyZW50cyB3aXRoIG90aGVyIHBhcmVudHMnIGNoaWxkcmVuXG4gICAgLy8gYW5kIHNjcmFtYmxlZCB0aGUgaGllcmFyY2h5LiBTb3J0aW5nIHRoZSBzaWJsaW5nIGFycmF5cyBhbmQgcmUtd2Fsa2luZ1xuICAgIC8vIGRlcHRoLWZpcnN0IGtlZXBzIGV2ZXJ5IHBhcmVudCBpbW1lZGlhdGVseSBhYm92ZSBpdHMgb3duIGNoaWxkcmVuLFxuICAgIC8vIHdoaWNoIGByZWZyZXNoVmlzaWJsZU5vZGVzYCBhbHNvIGRlcGVuZHMgb24gZm9yIGl0cyB2aXNpYmlsaXR5IGNhY2hlLlxuICAgIC8vIEdyb3VwIHJvd3MgY2FycnkgdGhlaXIgYWdncmVnYXRlcyBpbiBgZGF0YWAsIHNvIHNvcnRpbmcgYSBncm91cGVkIGdyaWRcbiAgICAvLyBvbiBhbiBhZ2dyZWdhdGVkIGNvbHVtbiBvcmRlcnMgdGhlIGdyb3VwcyBieSB0aGVpciBhZ2dyZWdhdGUuXG4gICAgY29uc3QgZmxhdHRlbmVkOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcblxuICAgIGNvbnN0IHdhbGsgPSAoc2libGluZ3M6IE9uZVJvd05vZGU8VD5bXSk6IE9uZVJvd05vZGU8VD5bXSA9PiB7XG5cbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5zaWJsaW5nc10uc29ydChjb21wYXJhdG9yKTtcblxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHNvcnRlZCkge1xuXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcblxuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSB3YWxrKG5vZGUuY2hpbGRyZW4gYXMgT25lUm93Tm9kZTxUPltdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc29ydGVkO1xuICAgIH07XG5cbiAgICB3YWxrKFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5maWx0ZXIobm9kZSA9PiAhbm9kZS5wYXJlbnQpKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzID0gZmxhdHRlbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKHZhbEE6IGFueSwgdmFsQjogYW55LCBzb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyk6IG51bWJlciB7XG5cbiAgICAvLyBgdW5kZWZpbmVkYCBoYXMgdG8gYmUgdHJlYXRlZCBhcyBlbXB0eSBhbG9uZ3NpZGUgYG51bGxgOiBnZXRGaWVsZFZhbHVlXG4gICAgLy8gcmV0dXJucyB1bmRlZmluZWQgZm9yIGEgbWlzc2luZyBmaWVsZCBvciBhbiB1bnJlc29sdmVkIGRvdHRlZCBwYXRoLCBhbmRcbiAgICAvLyBjb21wYXJpbmcgdW5kZWZpbmVkIHdpdGggPCAvID4geWllbGRzIGZhbHNlIGJvdGggd2F5cywgd2hpY2ggbWFkZSBzdWNoXG4gICAgLy8gcm93cyBzZXR0bGUgaW4gd2hhdGV2ZXIgb3JkZXIgdGhlIHNvcnQgaGFwcGVuZWQgdG8gZW5jb3VudGVyIHRoZW0uXG4gICAgY29uc3QgYUVtcHR5ID0gdmFsQSA9PT0gbnVsbCB8fCB2YWxBID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgYkVtcHR5ID0gdmFsQiA9PT0gbnVsbCB8fCB2YWxCID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYUVtcHR5ICYmIGJFbXB0eSkgcmV0dXJuIDA7XG4gICAgaWYgKGFFbXB0eSkgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgIGlmIChiRW1wdHkpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcblxuICAgIGlmICh0eXBlb2YgdmFsQSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbEIgPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSB2YWxBLmxvY2FsZUNvbXBhcmUodmFsQiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUgfSk7XG4gICAgICByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyBjb21wYXJpc29uIDogLWNvbXBhcmlzb247XG4gICAgfVxuXG4gICAgaWYgKHZhbEEgPCB2YWxCKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XG4gICAgaWYgKHZhbEEgPiB2YWxCKSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogUm93IFNlbGVjdGlvbiBGZWF0dXJlIChPcHRpbWl6ZWQpXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuXG4gICAgY29uc3Qgcm93SWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHRydWUpO1xuXG4gICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICByb3dJZHMucHVzaChub2RlLnJvd0lkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGwocm93SWRzKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IGFsbE5vZGVzTm90U2VsZWN0ZWQ6IGZhbHNlLCBhbGxOb2Rlc1NlbGVjdGVkOiB0cnVlLCBzZWxlY3RlZDogdHJ1ZSwgbm9kZTogbnVsbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdCBhbGwgbm9kZXMgKG9wdGltaXplZClcbiAgICovXG4gIHB1YmxpYyBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcblxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcblxuICAgICAgbm9kZS5zZXRTZWxlY3RlZChmYWxzZSk7XG5cbiAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RBbGwoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnKSB7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7XG4gICAgICAgIGFsbE5vZGVzTm90U2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgIGFsbE5vZGVzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIG5vZGU6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Qgb3IgZGVzZWxlY3Qgb25lIHJvdywgaG9ub3VyaW5nIHRoZSBncmlkJ3Mgc2VsZWN0aW9uIG1vZGUuXG4gICAqXG4gICAqIFRoZSBtb2RlIHJ1bGUgdXNlZCB0byBsaXZlIGluIHRoZSBjaGVja2JveCBjb21wb25lbnQsIHdoaWNoIG1lYW50IHRoZSBvbmx5XG4gICAqIHdheSB0byBzZWxlY3QgYSByb3cgd2FzIHRvIGNsaWNrIHRoYXQgY2hlY2tib3gg4oCUIGFueXRoaW5nIGVsc2UgcmVhY2hpbmcgZm9yXG4gICAqIGB0b2dnbGVTZWxlY3Rpb25gIGdvdCBtdWx0aS1zZWxlY3QgYmVoYXZpb3VyIG9uIGEgc2luZ2xlLXNlbGVjdCBncmlkLiBJdFxuICAgKiBsaXZlcyBoZXJlIHNvIGV2ZXJ5IHBhdGggaW50byBzZWxlY3Rpb24gb2JleXMgdGhlIHNhbWUgcnVsZS5cbiAgICpcbiAgICogQHJldHVybnMgYGZhbHNlYCB3aGVuIHRoZSBncmlkIGhhcyBubyBzZWxlY3Rpb24gbW9kZSwgc28gYSBjYWxsZXIgY2FuIHRlbGxcbiAgICogICAgICAgICAgYSByZWZ1c2VkIHJlcXVlc3QgZnJvbSBhbiBhcHBsaWVkIG9uZS5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dTZWxlY3Rpb24ocm93SWQ6IHN0cmluZywgc2VsZWN0ZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgIXRoaXMuX3Jvd1NlbGVjdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBTaW5nbGUgc2VsZWN0IGlzIFwidGhpcyByb3cgYW5kIG5vIG90aGVyXCIsIHdoaWNoIG1lYW5zIGNsZWFyaW5nIGZpcnN0LlxuICAgIGlmICh0aGlzLl9yb3dTZWxlY3Rpb24gPT09ICdzaW5nbGUnKSB0aGlzLmRlc2VsZWN0QWxsKCk7XG5cbiAgICB0aGlzLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBldmVyeSByb3cgYmV0d2VlbiB0d28sIGluY2x1c2l2ZSwgaW4gZGlzcGxheSBvcmRlci5cbiAgICpcbiAgICogV2hhdCBhIHNoaWZ0LWV4dGVuZGVkIGtleWJvYXJkIHNlbGVjdGlvbiBuZWVkcy4gTXVsdGktc2VsZWN0IG9ubHkg4oCUIGFcbiAgICogc2luZ2xlLXNlbGVjdCBncmlkIGhhcyBubyBtZWFuaW5nZnVsIHJhbmdlLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdFJvd1JhbmdlKGZyb21Sb3dJZDogc3RyaW5nLCB0b1Jvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgdGhpcy5fcm93U2VsZWN0aW9uICE9PSAnbXVsdGlwbGUnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBvcmRlciA9IHRoaXMuX3Zpc2libGVSb3dOb2Rlcy5sZW5ndGggPyB0aGlzLl92aXNpYmxlUm93Tm9kZXMgOiB0aGlzLl9yb3dOb2RlcztcblxuICAgIGNvbnN0IGZyb20gPSBvcmRlci5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSBmcm9tUm93SWQpO1xuICAgIGNvbnN0IHRvID0gb3JkZXIuZmluZEluZGV4KG5vZGUgPT4gbm9kZS5yb3dJZCA9PT0gdG9Sb3dJZCk7XG5cbiAgICBpZiAoZnJvbSA9PT0gLTEgfHwgdG8gPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBpZHMgPSBvcmRlclxuICAgICAgLnNsaWNlKE1hdGgubWluKGZyb20sIHRvKSwgTWF0aC5tYXgoZnJvbSwgdG8pICsgMSlcbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRCeUlkcyhpZHMsIHRydWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSkge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIHNlbGVjdGVkIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZEJ5SWQocm93SWQ6IHN0cmluZykge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb25Nb2RlKCkgPT09ICdzaW5nbGUnKSB7XG5cbiAgICAgICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQocm93Tm9kZS5yb3dJZCA9PT0gbm9kZS5yb3dJZCkpO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHRydWUpO1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdzZWxlY3Rpb25DaGFuZ2VkJywgeyBub2RlLCBzZWxlY3RlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWRCeUlkcyhyb3dJZHM6IHN0cmluZ1tdLCBzZWxlY3RlZDogYm9vbGVhbiA9IHRydWUpIHtcblxuICAgIHJvd0lkcy5mb3JFYWNoKHJvd0lkID0+IHtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgaWYgKG5vZGUpIHtcblxuICAgICAgICBub2RlLnNldFNlbGVjdGVkKHNlbGVjdGVkKTtcblxuICAgICAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS50b2dnbGVTZWxlY3Rpb24ocm93SWQsIHNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IG5vZGU6IG51bGwgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICYgU2V0IEZ1bmN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldEFsbFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM/Lmxlbmd0aCA+IDAgPyBbLi4udGhpcy5fcm93Tm9kZXNdIDogW107XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93RGF0YVNlbGVjdGVkKCk6IFRbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXMuZmlsdGVyKG5vZGUgPT4gbm9kZS5zZWxlY3RlZCkubWFwKG5vZGUgPT4gKHsgLi4ubm9kZS5kYXRhIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUuc2VsZWN0ZWQpO1xuXG4gICAgcmV0dXJuIG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+IDAgPyBbLi4ubm9kZXNdIDogW107XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1uIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJNb2RlbCgpOiBPbmVGaWx0ZXJNb2RlbFtdIHtcblxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldEZpbHRlck1vZGVsKG1vZGVsOiBPbmVGaWx0ZXJNb2RlbFtdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gbW9kZWw7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgcHVibGljIGZpbHRlckFjdGl2ZShmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVycy5zb21lKGYgPT4gZi5maWVsZCA9PT0gZmllbGQgJiYgZi5jb25kaXRpb25zLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1aWNrIGZpbHRlclxuICAgKi9cbiAgcHVibGljIHNldFF1aWNrRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSAodmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgY29sdW1uIHZhbGlkYXRvcnMgb3ZlciBvbmUgcm93LlxuICAgKlxuICAgKiBSdWxlcyBydW4gaW4gb3JkZXIgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IGZhaWx1cmUsIHNvIGEgZmllbGQgYXBwZWFycyBhdFxuICAgKiBtb3N0IG9uY2UuIEZpZWxkcyB0aGF0IHBhc3NlZCBhcmUgYWJzZW50IHJhdGhlciB0aGFuIG1hcHBlZCB0byBgbnVsbGAuXG4gICAqXG4gICAqIFRoZSByb3cgdHlwZSBjb21lcyBmcm9tIHRoZSBncmlkJ3Mgb3duIGBUYCDigJQgdGhpcyB1c2VkIHRvIGRlY2xhcmUgaXRzIG93blxuICAgKiBgPFQ+YCwgd2hpY2ggc2hhZG93ZWQgdGhlIGNsYXNzIHBhcmFtZXRlciBhbmQgbGV0IGFuIGBPbmVHcmlkQXBpPEVtcGxveWVlPmBcbiAgICogaGFwcGlseSB2YWxpZGF0ZSBhbiB1bnJlbGF0ZWQgc2hhcGUgYWdhaW5zdCBlbXBsb3llZSBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlUm93KHJvdzogVCwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzPFQ+IHtcblxuICAgIGNvbnN0IGVycm9yczogT25lUm93VmFsaWRhdGlvbkVycm9yczxUPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXG4gICAgICAvLyBBIGNvbHVtbiBjYW4gb25seSBjb250cmlidXRlIGFuIGVycm9yIGlmIGl0IGhhcyBib3RoIHJ1bGVzIGFuZCBhIGZpZWxkXG4gICAgICAvLyB0byBrZXkgdGhlbSB1bmRlci5cbiAgICAgIGlmICghY29sdW1uLmZpZWxkIHx8ICFjb2x1bW4udmFsaWRhdGlvblJ1bGVzPy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY29sdW1uLnZhbGlkYXRpb25SdWxlcykge1xuXG4gICAgICAgIGNvbnN0IGVycm9yID0gcnVsZShyb3dbY29sdW1uLmZpZWxkXSwgcm93KTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcblxuICAgICAgICAgIGVycm9yc1tjb2x1bW4uZmllbGRdID0gZXJyb3I7XG5cbiAgICAgICAgICBicmVhazsgLy8gZmlyc3QgZmFpbHVyZSBwZXIgY29sdW1uIHdpbnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBjb2x1bW4gdmFsaWRhdG9ycyBvdmVyIGEgd2hvbGUgZGF0YXNldC5cbiAgICpcbiAgICogRGVsZWdhdGVzIHRvIGB2YWxpZGF0ZVJvd2Agc28gdGhlIHR3byBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hhdCBjb3VudHNcbiAgICogYXMgaW52YWxpZCDigJQgdGhleSBwcmV2aW91c2x5IGNhcnJpZWQgc2VwYXJhdGUgY29waWVzIG9mIHRoZSBzYW1lIGxvb3AuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVBbGxSb3dzKHJvd0RhdGE6IFRbXSwgY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiBPbmVWYWxpZGF0aW9uUmVzdWx0PFQ+IHtcblxuICAgIGNvbnN0IGFsbEVycm9ycyA9IHJvd0RhdGEubWFwKHJvdyA9PiB0aGlzLnZhbGlkYXRlUm93KHJvdywgY29sdW1ucykpO1xuXG4gICAgY29uc3QgaGFzRXJyb3JzID0gYWxsRXJyb3JzLnNvbWUoZXJyb3JzID0+IE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4geyBlcnJvcnM6IGFsbEVycm9ycywgdmFsaWQ6ICFoYXNFcnJvcnMsIGludmFsaWQ6IGhhc0Vycm9ycyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlIGV2ZXJ5IG5vZGUsIGRlcHRoLWZpcnN0LCBvbmNlIGVhY2guXG4gICAqXG4gICAqIGByb3dOb2Rlc2AgaXMgYWxyZWFkeSB0aGUgZmxhdHRlbmVkIHRyZWUg4oCUIGBidWlsZFJvd05vZGVzYCBwdXNoZXMgZXZlcnlcbiAgICogbm9kZSBpbnRvIGl0IGFzIGl0IGRlc2NlbmRzIOKAlCBzbyB3YWxraW5nIGl0IGlzIHRoZSB3aG9sZSB0cmF2ZXJzYWwuIFRoZVxuICAgKiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB3YWxrZWQgdGhhdCBmbGF0IGxpc3QgKmFuZCogcmVjdXJzZWQgaW50b1xuICAgKiBgY2hpbGRyZW5gLCB2aXNpdGluZyBldmVyeSBuZXN0ZWQgbm9kZSB0d2ljZSBhbmQgZXZlcnkgZGVwdGgtMyBub2RlIHRocmVlXG4gICAqIHRpbWVzLiBgaW5kZXhgIGlzIHRoZSBub2RlJ3MgcG9zaXRpb24gaW4gdGhlIGZsYXR0ZW5lZCBvcmRlciwgbWF0Y2hpbmdcbiAgICogYG5vZGUucm93SW5kZXhgLCByYXRoZXIgdGhhbiBpdHMgcG9zaXRpb24gYW1vbmcgaXRzIHNpYmxpbmdzLlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hOb2RlKGNhbGxiYWNrOiAobm9kZTogT25lUm93Tm9kZTxUPiwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCkge1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IGNhbGxiYWNrKG5vZGUsIGluZGV4KSk7XG4gIH1cblxuICAvKiogVHJhdmVyc2Ugb25seSBsZWFmIG5vZGVzLCBvbmNlIGVhY2gsIGluIGZsYXR0ZW5lZCBvcmRlci4gKi9cbiAgcHVibGljIGZvckVhY2hMZWFmTm9kZShjYWxsYmFjazogKG5vZGU6IE9uZVJvd05vZGU8VD4sIGluZGV4OiBudW1iZXIpID0+IHZvaWQpIHtcblxuICAgIGxldCBsZWFmSW5kZXggPSAwO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Jvd05vZGVzKSB7XG5cbiAgICAgIGlmIChub2RlLmxlYWYpIGNhbGxiYWNrKG5vZGUsIGxlYWZJbmRleCsrKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93Tm9kZUJ5SWQocm93SWQ6IHN0cmluZyk6IE9uZVJvd05vZGU8VD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQvY29sbGFwc2UgYSBub2RlXG4gICAqL1xuICBwdWJsaWMgc2V0VHJlZURhdGFDaGlsZHJlbkZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gZmllbGQ7XG4gIH1cblxuICBwdWJsaWMgc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQoZGVmYXVsdEV4cGFuZGVkOiBudW1iZXIpIHtcblxuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSBkZWZhdWx0RXhwYW5kZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5zaW9uIHN0YXRlIGxpdmVzIGluIHR3byBwbGFjZXMsIGFuZCB0aGV5IGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zLlxuICAgKlxuICAgKiBgT25lR3JpZEV4cGFuc2lvblNlcnZpY2VgIHJlY29yZHMgb25seSAqZGVsaWJlcmF0ZSogY2hhbmdlcyDigJQgYSBjbGljaywgb3JcbiAgICogb25lIG9mIHRoZSBtZXRob2RzIGJlbG93LiBJdCBpcyBhbiBvdmVycmlkZSBsYXllcjogYGJ1aWxkUm93Tm9kZXNgIGNvbnN1bHRzXG4gICAqIGl0IGZpcnN0IGFuZCBmYWxscyBiYWNrIHRvIGBncm91cERlZmF1bHRFeHBhbmRlZGAgZm9yIGV2ZXJ5IHJvdyB0aGUgdXNlclxuICAgKiBoYXMgbm90IHRvdWNoZWQuIFRoYXQgaXMgd2hhdCBsZXRzIGEgbGF0ZXIgYGdyb3VwRGVmYXVsdEV4cGFuZGVkYCBjaGFuZ2VcbiAgICogdGFrZSBlZmZlY3QsIGFuZCB3aGF0IGxldHMgYSBjb2xsYXBzZSBzdXJ2aXZlIGEgcmVidWlsZC5cbiAgICpcbiAgICogYG5vZGUuZXhwYW5kZWRgIGlzIHRoZSByZXNvbHZlZCB0cnV0aCBmb3IgYSByb3csIGRlZmF1bHRzIGluY2x1ZGVkLiBQdWJsaWNcbiAgICogcmVhZHMgcmVwb3J0IHRoYXQ7IHRoZSBvdmVycmlkZSBzZXRzIHN0YXkgaW50ZXJuYWwuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdGhlIHNldHRlcnMgYmVsb3cgbWFpbnRhaW46IGBleHBhbmRlZGAgaXMgb25seSBldmVyIHRydWUgZm9yXG4gICAqIGEgbm9kZSB0aGF0IGNhbiBleHBhbmQuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlRXhwYW5kQWxsKGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICB0aGlzLmZvckVhY2hOb2RlKG5vZGUgPT4ge1xuXG4gICAgICBpZiAoIW5vZGUuZXhwYW5kYWJsZSkgcmV0dXJuO1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTtcblxuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKG5vZGUucm93SWQsIGV4cGFuZGVkKVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhwYW5kZWRCeUlkKHJvd0lkOiBzdHJpbmcsIGV4cGFuZGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgaWYgKG5vZGU/LmV4cGFuZGFibGUpIHtcblxuICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChyb3dJZCwgZXhwYW5kZWQpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgcHVibGljIHNldEV4cGFuZGVkQnlJZHMocm93SWRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcblxuICAgIGlmIChyb3dJZHMgJiYgcm93SWRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgZm9yIChsZXQgcm93SWQgb2Ygcm93SWRzKSB7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgICBpZiAobm9kZT8uZXhwYW5kYWJsZSkge1xuXG4gICAgICAgICAgbm9kZS5zZXRFeHBhbmRlZChleHBhbmRlZCk7XG5cbiAgICAgICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQocm93SWQsIGV4cGFuZGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgY3VycmVudGx5IGV4cGFuZGVkIHJvdywgaW4gdHJlZSBvcmRlci5cbiAgICpcbiAgICogRGVyaXZlZCBmcm9tIHRoZSBub2RlcyByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgb3ZlcnJpZGUgcmVjb3JkLCBzbyByb3dzXG4gICAqIG9wZW5lZCBieSBgZ3JvdXBEZWZhdWx0RXhwYW5kZWRgIGFyZSBpbmNsdWRlZCDigJQgcHJldmlvdXNseSB0aGlzIHJldHVybmVkXG4gICAqIG9ubHkgcm93cyBzb21lb25lIGhhZCBleHBsaWNpdGx5IHRvZ2dsZWQsIGFuZCBjYW1lIGJhY2sgZW1wdHkgb24gZmlyc3QgbG9hZFxuICAgKiB3aGlsZSB0aGUgZmlyc3QgbGV2ZWwgd2FzIHZpc2libHkgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBhbmRlZEJ5SWRzKCk6IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLl9yb3dOb2Rlc1xuXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gbm9kZS5leHBhbmRhYmxlICYmIG5vZGUuZXhwYW5kZWQpXG5cbiAgICAgIC5tYXAobm9kZSA9PiBub2RlLnJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIEZlYXR1cmVcbiAgICovXG4gIHB1YmxpYyBzZXREZXRhaWxSb3dEYXRhKG5vZGU6IE9uZVJvd05vZGU8VD4sIGRldGFpbERhdGE6IGFueVtdKSB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuc2V0RGV0YWlsUm93RGF0YShkZXRhaWxEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0R2V0RGV0YWlsUm93RGF0YShnZXREZXRhaWxSb3dEYXRhOiAocGFyYW1zOiBPbmVHZXREZXRhaWxSb3dEYXRhUGFyYW1zKSA9PiB2b2lkKSB7XG5cbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gZ2V0RGV0YWlsUm93RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW5zIFN0YXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2Uuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5TdGF0ZS5jb2x1bW5zLCB0aGlzLl9jb250ZXh0KTtcblxuICAgIC8vIENlbGwgc3RhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb2x1bW5zLCBzbyByZXBsYWNpbmcgdGhlbSB3aG9sZXNhbGVcbiAgICAvLyBzdGFsZXMgZXZlcnkgbm9kZSBidWlsdCBiZWZvcmUgdGhpcyByYW4uIFRyZWUgYW5kIGdyb3VwaW5nIG1vZGUgaGl0XG4gICAgLy8gdGhpcyBvbiBldmVyeSBsb2FkOiB0aGUgZ3JvdXAgY29sdW1uIHJlZ2lzdGVycyBmcm9tIGEgZGVmZXJyZWRcbiAgICAvLyBzZXRDb2x1bW5EZWZzLCBhZnRlciB0aGUgaG9zdCBoYXMgdHlwaWNhbGx5IGFscmVhZHkgbG9hZGVkIHJvd3Mg4oCUXG4gICAgLy8gaG9zdHMgdXNlZCB0byBoYXZlIHRvIGRlZmVyIHNldFJvd0RhdGEgdGhlbXNlbHZlcyB0byBkb2RnZSBpdC5cbiAgICB0aGlzLnJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUNvbHVtbihpZDogc3RyaW5nLCBjaGFuZ2VzOiBQYXJ0aWFsPE9uZUNvbHVtbkRlZjxUPj4pOiB2b2lkIHtcblxuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMudmlzaWJsZUNvbHVtbkZpZWxkcygpO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnVwZGF0ZUNvbHVtbkRlZihpZCwgY2hhbmdlcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBPbmx5IHdoZW4gdGhlIHNldCBvZiB2aXNpYmxlIGNvbHVtbnMgY2hhbmdlZCAoYSBoaWRlLCBhIHNob3cpOiBhIGNlbGxcbiAgICAvLyBzdGF0ZSBjYW4gYXBwZWFyIG9yIGRpc2FwcGVhciB0aGVuLiBXaWR0aCBwYXRjaGVzIOKAlCB0aGlzIG1ldGhvZCBydW5zXG4gICAgLy8gcGVyIG1vdXNlbW92ZSBkdXJpbmcgYSByZXNpemUg4oCUIHNraXAgdGhlIE8ocm93cyDDlyBjb2x1bW5zKSBwYXNzLlxuICAgIGlmICh0aGlzLnZpc2libGVDb2x1bW5GaWVsZHMoKSAhPT0gYmVmb3JlKSB0aGlzLnJlZ2VuZXJhdGVDZWxsU3RhdGVzKCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXNpYmxlIGZpZWxkcyBhcyBvbmUgY29tcGFyYWJsZSBrZXkuICovXG4gIHByaXZhdGUgdmlzaWJsZUNvbHVtbkZpZWxkcygpOiBzdHJpbmcge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnM/Lm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkKS5qb2luKCd8JykgPz8gJyc7XG4gIH1cblxuICAvKiogUmVjb21wdXRlIGV2ZXJ5IG5vZGUncyBjZWxsIHN0YXRlcyBhZ2FpbnN0IHRoZSBjdXJyZW50IGNvbHVtbnMuICovXG4gIHByaXZhdGUgcmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTogdm9pZCB7XG5cbiAgICBjb25zdCByZWZyZXNoID0gKG5vZGU6IE9uZVJvd05vZGUpID0+IG5vZGUuc2V0Q2VsbFN0YXRlcyh0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlKSk7XG5cbiAgICB0aGlzLl9yb3dOb2Rlcy5mb3JFYWNoKHJlZnJlc2gpO1xuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzLnRvcC5mb3JFYWNoKHJlZnJlc2gpO1xuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzLmJvdHRvbS5mb3JFYWNoKHJlZnJlc2gpO1xuICB9XG5cbiAgcHVibGljIHJlb3JkZXJDb2x1bW5EZWZzKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5yZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXgsIHRvSW5kZXgpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUm93IGdyb3VwaW5nXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgX3Jvd0dyb3VwRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9hZ2dDb2x1bW5zOiBPbmVBZ2dDb2x1bW48VD5bXSA9IFtdO1xuXG4gIC8qKiBUaGUgZmllbGRzIHRoZSByb3dzIGFyZSBncm91cGVkIGJ5LCBpbiBuZXN0aW5nIG9yZGVyLiBFbXB0eSB3aGVuIG9mZi4gKi9cbiAgcHVibGljIGdldCByb3dHcm91cEZpZWxkcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcm93R3JvdXBGaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogVHVybiByb3cgZ3JvdXBpbmcgb24uIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudGAgd2hlbiBjb2x1bW5cbiAgICogZGVmaW5pdGlvbnMgZGVjbGFyZSBgcm93R3JvdXBgOyB0aGUgZ3JpZCB0aGVuIGJlaGF2ZXMgYXMgYSB0cmVlIG92ZXJcbiAgICogc3ludGhldGljIGdyb3VwIHJvd3MsIGFuZCBgc2V0Um93RGF0YWAgLyBgdXBkYXRlUm93RGF0YWAga2VlcCB0YWtpbmcgdGhlXG4gICAqIGZsYXQgcm93cyB0aGV5IGFsd2F5cyB0b29rLlxuICAgKi9cbiAgcHVibGljIHNldFJvd0dyb3VwaW5nKGdyb3VwRmllbGRzOiBzdHJpbmdbXSwgYWdncmVnYXRpb25zOiBPbmVBZ2dDb2x1bW48VD5bXSA9IFtdKTogdm9pZCB7XG5cbiAgICB0aGlzLl9yb3dHcm91cEZpZWxkcyA9IGdyb3VwRmllbGRzID8/IFtdO1xuICAgIHRoaXMuX2FnZ0NvbHVtbnMgPSBhZ2dyZWdhdGlvbnMgPz8gW107XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVW5kbyAvIHJlZG8gb2YgY2VsbCBlZGl0c1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF91bmRvTGltaXQgPSAwO1xuICBwcml2YXRlIF91bmRvU3RhY2s6IHsgcm93SWQ6IHN0cmluZzsgZmllbGQ6IHN0cmluZzsgb2xkVmFsdWU6IGFueTsgbmV3VmFsdWU6IGFueSB9W10gPSBbXTtcbiAgcHJpdmF0ZSBfcmVkb1N0YWNrOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHJlY29yZGluZyBjb21taXR0ZWQgY2VsbCBlZGl0cyBmb3IgdW5kby9yZWRvLiBDYWxsZWQgYnlcbiAgICogYE9uZUdyaWRDb21wb25lbnRgIGZyb20gYFt1bmRvUmVkb0NlbGxFZGl0aW5nXWA7IHRoZSBzdGFjayBrZWVwcyB0aGUgbGFzdFxuICAgKiBgbGltaXRgIGVkaXRzLiBQcm9ncmFtbWF0aWMgYHNldERhdGFWYWx1ZWAgd3JpdGVzIGFyZSBub3QgcmVjb3JkZWQg4oCUIG9ubHlcbiAgICogY29tbWl0cywgdGhlIG9uZXMgdGhhdCByYWlzZSBgY2VsbFZhbHVlQ2hhbmdlZGAgd2l0aG91dCBhIHNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBlbmFibGVVbmRvUmVkb0NlbGxFZGl0aW5nKGxpbWl0OiBudW1iZXIgPSAxMCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX3VuZG9MaW1pdCA+IDApIHJldHVybjtcblxuICAgIHRoaXMuX3VuZG9MaW1pdCA9IE1hdGgubWF4KE1hdGguZmxvb3IobGltaXQpLCAxKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NlbGxWYWx1ZUNoYW5nZWQnLCAoZXZlbnQ6IENlbGxWYWx1ZUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICBpZiAoZXZlbnQuc291cmNlKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX3VuZG9TdGFjay5wdXNoKHsgcm93SWQ6IGV2ZW50Lm5vZGUucm93SWQsIGZpZWxkOiBldmVudC5maWVsZCwgb2xkVmFsdWU6IGV2ZW50Lm9sZFZhbHVlLCBuZXdWYWx1ZTogZXZlbnQubmV3VmFsdWUgfSk7XG5cbiAgICAgIGlmICh0aGlzLl91bmRvU3RhY2subGVuZ3RoID4gdGhpcy5fdW5kb0xpbWl0KSB0aGlzLl91bmRvU3RhY2suc2hpZnQoKTtcblxuICAgICAgLy8gQSBuZXcgZWRpdCBmb3JrcyBoaXN0b3J5OyB3aGF0IHdhcyB1bmRvbmUgY2FuIG5vIGxvbmdlciBiZSByZWRvbmUuXG4gICAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXZlcnQgdGhlIG1vc3QgcmVjZW50IGNvbW1pdHRlZCBlZGl0LiBSZXR1cm5zIHdoZXRoZXIgb25lIHdhcyB1bmRvbmUuICovXG4gIHB1YmxpYyB1bmRvQ2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYXlFZGl0KHRoaXMuX3VuZG9TdGFjaywgdGhpcy5fcmVkb1N0YWNrLCAndW5kbycpO1xuICB9XG5cbiAgLyoqIFJlLWFwcGx5IHRoZSBtb3N0IHJlY2VudGx5IHVuZG9uZSBlZGl0LiBSZXR1cm5zIHdoZXRoZXIgb25lIHdhcyByZWRvbmUuICovXG4gIHB1YmxpYyByZWRvQ2VsbEVkaXRpbmcoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5yZXBsYXlFZGl0KHRoaXMuX3JlZG9TdGFjaywgdGhpcy5fdW5kb1N0YWNrLCAncmVkbycpO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRVbmRvU2l6ZSgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3VuZG9TdGFjay5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFJlZG9TaXplKCk6IG51bWJlciB7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVkb1N0YWNrLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGF5RWRpdChcbiAgICBmcm9tOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdLFxuICAgIHRvOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdLFxuICAgIHNvdXJjZTogJ3VuZG8nIHwgJ3JlZG8nLFxuICApOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGVkaXQgPSBmcm9tLnBvcCgpO1xuXG4gICAgaWYgKCFlZGl0KSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChlZGl0LnJvd0lkKTtcblxuICAgIC8vIFRoZSByb3cgY2FuIGJlIGdvbmUg4oCUIGEgc2V0Um93RGF0YSByZXBsYWNlZCB0aGUgZGF0YSB1bmRlciB0aGUgc3RhY2suXG4gICAgLy8gVGhlIGVkaXQgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiByZXBsYXllZCBvbnRvIG5vdGhpbmcuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZSA9PT0gJ3VuZG8nID8gZWRpdC5vbGRWYWx1ZSA6IGVkaXQubmV3VmFsdWU7XG4gICAgY29uc3QgcHJldmlvdXMgPSBzb3VyY2UgPT09ICd1bmRvJyA/IGVkaXQubmV3VmFsdWUgOiBlZGl0Lm9sZFZhbHVlO1xuXG4gICAgKG5vZGUuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbZWRpdC5maWVsZF0gPSB2YWx1ZTtcblxuICAgIHRoaXMudXBkYXRlQ2VsbFN0YXRlcyhub2RlKTtcblxuICAgIHRvLnB1c2goZWRpdCk7XG5cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zPy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IGVkaXQuZmllbGQpID8/IG51bGw7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsVmFsdWVDaGFuZ2VkJywge1xuICAgICAgbm9kZSxcbiAgICAgIGRhdGE6IG5vZGUuZGF0YSxcbiAgICAgIGNvbHVtbjogY29sdW1uIGFzIE9uZUNvbHVtbkRlZjxUPixcbiAgICAgIGZpZWxkOiBlZGl0LmZpZWxkLFxuICAgICAgb2xkVmFsdWU6IHByZXZpb3VzLFxuICAgICAgbmV3VmFsdWU6IHZhbHVlLFxuICAgICAgc291cmNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ2xpZW50LXNpZGUgcGFnaW5hdGlvblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF9jbGllbnRQYWdpbmF0aW9uID0gZmFsc2U7XG4gIHByaXZhdGUgX3BhZ2VTaXplID0gMjU7XG4gIHByaXZhdGUgX2N1cnJlbnRQYWdlID0gMTtcblxuICAvKiogVGhlIHBhZ2luZyBzdGF0ZSwgd2hlbiB0aGUgZ3JpZCBwYWdlcyBpdHMgb3duIHJvd3MuICovXG4gIHB1YmxpYyBnZXQgcGFnaW5hdGlvblN0YXRlKCk6IFJlYWRvbmx5PHsgZW5hYmxlZDogYm9vbGVhbjsgcGFnZVNpemU6IG51bWJlcjsgY3VycmVudFBhZ2U6IG51bWJlciB9PiB7XG5cbiAgICByZXR1cm4geyBlbmFibGVkOiB0aGlzLl9jbGllbnRQYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5fcGFnZVNpemUsIGN1cnJlbnRQYWdlOiB0aGlzLl9jdXJyZW50UGFnZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gZ3JpZC1vd25lZCBwYWdpbmcgb24gb3Igb2ZmLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnRgIGZyb20gaXRzXG4gICAqIGBjbGllbnRTaWRlUGFnaW5hdGlvbmAgaW5wdXQ7IHRoZSBkaXNwbGF5IHNsaWNlIGlzIHdoYXQgY2hhbmdlcyDigJQgdGhlXG4gICAqIGZ1bGwgZGF0YXNldCBzdGF5cyBiZWhpbmQgdGhlIEFQSSAoc2VsZWN0aW9uLCBmaWx0ZXJzIGFuZCBzb3J0aW5nIGtlZXBcbiAgICogb3BlcmF0aW5nIG9uIGFsbCBvZiBpdCkuXG4gICAqL1xuICBwdWJsaWMgc2V0Q2xpZW50U2lkZVBhZ2luYXRpb24oZW5hYmxlZDogYm9vbGVhbiwgcGFnZVNpemU/OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuX2NsaWVudFBhZ2luYXRpb24gPSBlbmFibGVkO1xuXG4gICAgaWYgKHBhZ2VTaXplICYmIHBhZ2VTaXplID4gMCkgdGhpcy5fcGFnZVNpemUgPSBwYWdlU2l6ZTtcblxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gMTtcbiAgfVxuXG4gIC8qKiBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBhbmQgcmV0dXJuIHRvIHRoZSBmaXJzdCBwYWdlLiAqL1xuICBwdWJsaWMgc2V0UGFnZVNpemUocGFnZVNpemU6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCB8fCAhKHBhZ2VTaXplID4gMCkpIHJldHVybjtcblxuICAgIHRoaXMuX3BhZ2VTaXplID0gTWF0aC5mbG9vcihwYWdlU2l6ZSk7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSAxO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIHRvIGEgcGFnZSAoMS1iYXNlZCkuIENsYW1wZWQgdG8gYXQgbGVhc3QgMTsgdGhlIHRvcCBlbmQgY2xhbXBzIHdoZW4gdGhlIHNsaWNlIGlzIHRha2VuLiAqL1xuICBwdWJsaWMgc2V0Q3VycmVudFBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLm1heChNYXRoLmZsb29yKHBhZ2UpLCAxKTtcblxuICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2N1cnJlbnRQYWdlKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IHRhcmdldDtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNsaWNlIG9mIHJvd3MgdGhlIGN1cnJlbnQgcGFnZSBzaG93cyDigJQgYSBwYXNzdGhyb3VnaCB3aGlsZSBwYWdpbmcgaXNcbiAgICogb2ZmLiBUaGUgYm9keSByb3V0ZXMgaXRzIHJlbmRlciBsaXN0IHRocm91Z2ggaGVyZSwgYWZ0ZXIgcmVwb3J0aW5nIHRoZVxuICAgKiBmdWxsIGNvdW50LCBzbyBgcm93Q291bnRDaGFuZ2VkYCBrZWVwcyBtZWFuaW5nIFwicm93cyBhZnRlciBmaWx0ZXJpbmdcIlxuICAgKiB3aGV0aGVyIG9yIG5vdCB0aGUgZ3JpZCBwYWdlcy5cbiAgICovXG4gIHB1YmxpYyBwYWdlTm9kZXMobm9kZXM6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICBpZiAoIXRoaXMuX2NsaWVudFBhZ2luYXRpb24pIHJldHVybiAobm9kZXMgPz8gW10pIGFzIE9uZVJvd05vZGU8VD5bXTtcblxuICAgIGNvbnN0IGxhc3RQYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKChub2Rlcz8ubGVuZ3RoID8/IDApIC8gdGhpcy5fcGFnZVNpemUpLCAxKTtcblxuICAgIC8vIEEgc2hyaW5raW5nIGRhdGFzZXQgKGEgZmlsdGVyLCBhIGRlbGV0ZSkgY2FuIHN0cmFuZCB0aGUgcGFnZSBwYXN0IHRoZVxuICAgIC8vIGVuZDsgY2xhbXBpbmcgaGVyZSBzaG93cyB0aGUgbGFzdCBwYWdlIGluc3RlYWQgb2YgYW4gZW1wdHkgb25lLlxuICAgIGlmICh0aGlzLl9jdXJyZW50UGFnZSA+IGxhc3RQYWdlKSB0aGlzLl9jdXJyZW50UGFnZSA9IGxhc3RQYWdlO1xuXG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuX3BhZ2VTaXplO1xuXG4gICAgcmV0dXJuIChub2RlcyA/PyBbXSkuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5fcGFnZVNpemUpIGFzIE9uZVJvd05vZGU8VD5bXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaXplIHRoZSBmbGV4IGNvbHVtbnMgaW50byB0aGUgZ2l2ZW4gd2lkdGguXG4gICAqXG4gICAqIENhbGxlZCBieSB0aGUgZ3JpZCBib2R5IHdpdGggaXRzIG93biB2aWV3cG9ydCB3aWR0aCDigJQgb24gZmlyc3QgcmVuZGVyLCBvblxuICAgKiBjb250YWluZXIgcmVzaXplIGFuZCBhZnRlciBjb2x1bW4gY2hhbmdlcyDigJQgc28gYGNvbHVtbkRlZi5mbGV4YCB3b3Jrc1xuICAgKiB3aXRob3V0IHRoZSBob3N0IGRvaW5nIGFueXRoaW5nLiBBbHNvIGNhbGxhYmxlIGRpcmVjdGx5IHdpdGggYW55IHdpZHRoLlxuICAgKiBBIG5vLW9wIHdoZW4gbm8gdmlzaWJsZSBjb2x1bW4gZGVjbGFyZXMgYGZsZXhgIG9yIG5vdGhpbmcgd291bGQgY2hhbmdlLlxuICAgKi9cbiAgcHVibGljIGFwcGx5RmxleFdpZHRocyhhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuY29sdW1uU2VydmljZS5hcHBseUZsZXhXaWR0aHMoYXZhaWxhYmxlV2lkdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjb2x1bW5DaGFuZ2VkJywgY29sdW1uU3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGdyaWQgYXMgQ1NWOiB2aXNpYmxlIGNvbHVtbnMgaW4gZGlzcGxheSBvcmRlciwgdmlzaWJsZSByb3dzXG4gICAqIGluIGN1cnJlbnQgc29ydCBvcmRlciwgdmFsdWVzIHRocm91Z2ggdGhlIHNhbWUgZ2V0dGVyL2Zvcm1hdHRlciBwaXBlbGluZVxuICAgKiB0aGUgY2VsbHMgcmVuZGVyIHdpdGguIFBpbm5lZCByb3dzIGFuZCBkZXRhaWwgZ3JpZHMgYXJlIG5vdCBkYXRhIGFuZCBhcmVcbiAgICogbm90IGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGdldERhdGFBc0NzdihvcHRpb25zOiBPbmVDc3ZFeHBvcnRPcHRpb25zID0ge30pOiBzdHJpbmcge1xuXG4gICAgY29uc3Qgbm9kZXMgPSBvcHRpb25zLm9ubHlTZWxlY3RlZCA/IHRoaXMuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpIDogdGhpcy5fdmlzaWJsZVJvd05vZGVzO1xuXG4gICAgcmV0dXJuIGJ1aWxkQ3N2KG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXSwgdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCkuY29sdW1ucyBhcyBPbmVDb2x1bW5EZWY8VD5bXSwgdGhpcy5fY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIENTViBhbmQgaGFuZCBpdCB0byB0aGUgYnJvd3NlciBhcyBhIGRvd25sb2FkLiAqL1xuICBwdWJsaWMgZXhwb3J0RGF0YUFzQ3N2KG9wdGlvbnM6IE9uZUNzdkV4cG9ydE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdGhpcy5nZXREYXRhQXNDc3Yob3B0aW9ucyldLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XG5cbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgbGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBsaW5rLmRvd25sb2FkID0gb3B0aW9ucy5maWxlTmFtZSA/PyAnZXhwb3J0LmNzdic7XG4gICAgbGluay5jbGljaygpO1xuXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChsaW5rLmhyZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgb3IgaGlkZSBvbmUgY29sdW1uLiBBIGhpZGRlbiBjb2x1bW4ga2VlcHMgaXRzIG9yZGVyLCB3aWR0aCBhbmQgcGluLFxuICAgKiBzbyBzaG93aW5nIGl0IGFnYWluIHJlc3RvcmVzIGl0IGV4YWN0bHkuXG4gICAqL1xuICBwdWJsaWMgc2V0Q29sdW1uVmlzaWJsZShpZDogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbihpZCwgeyBoaWRlOiAhdmlzaWJsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0YWJsZSBsYXlvdXQgc3RhdGU6IG9uZSBKU09OLXNhZmUgZW50cnkgcGVyIGNvbHVtbiDigJQgaGlkZGVuIG9uZXNcbiAgICogaW5jbHVkZWQg4oCUIGluIGRpc3BsYXkgb3JkZXIuIEZlZWQgaXQgYmFjayB0aHJvdWdoIGBhcHBseUNvbHVtblN0YXRlYC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5TdGF0ZVNuYXBzaG90KCk6IE9uZUNvbHVtblN0YXRlRW50cnlbXSB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlU25hcHNob3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIGEgc25hcHNob3QgZnJvbSBgZ2V0Q29sdW1uU3RhdGVTbmFwc2hvdGA6IG9yZGVyLCB3aWR0aCwgcGluIGFuZFxuICAgKiB2aXNpYmlsaXR5LiBJZHMgdGhlIGdyaWQgbm8gbG9uZ2VyIGhhcyBhcmUgc2tpcHBlZCwgc28gYSBzdGFsZSBzbmFwc2hvdFxuICAgKiBkZWdyYWRlcyB0byBhIHBhcnRpYWwgcmVzdG9yZSByYXRoZXIgdGhhbiBhbiBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBhcHBseUNvbHVtblN0YXRlKGVudHJpZXM6IE9uZUNvbHVtblN0YXRlRW50cnlbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLmFwcGx5Q29sdW1uU3RhdGUoZW50cmllcyk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uU3RhdGUuY29sdW1ucywgdGhpcy5fY29udGV4dCk7XG5cbiAgICAvLyBBIHJlc3RvcmUgY2FuIHNob3cgY29sdW1ucyB0aGF0IHdlcmUgaGlkZGVuIHdoZW4gdGhlIHJvd3Mgd2VyZSBidWlsdCxcbiAgICAvLyBhbmQgdGhlaXIgY2VsbHMgaGF2ZSBubyBzdGF0ZSB5ZXQuXG4gICAgdGhpcy5yZWdlbmVyYXRlQ2VsbFN0YXRlcygpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hlY2tib3ggc2VsZWN0aW9uIGZlYXR1cmVzXG4gICAqL1xuICBwdWJsaWMgc2V0Tm9kZUFuZENoaWxkcmVuU2VsZWN0ZWQobm9kZTogT25lUm93Tm9kZSwgc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcblxuICAgIGNvbnN0IHJvd0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgY29sbGVjdCA9IChuOiBPbmVSb3dOb2RlKSA9PiB7XG5cbiAgICAgIHJvd0lkcy5hZGQobi5yb3dJZCk7XG5cbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKSB7XG5cbiAgICAgICAgbi5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNvbGxlY3QoY2hpbGQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29sbGVjdChub2RlKTtcblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRCeUlkcyhBcnJheS5mcm9tKHJvd0lkcyksIHNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBJZGVudGljYWwgdG8gYHVwZGF0ZUNlbGxTdGF0ZXNgLiBLZXB0IGFzIGFuIGFsaWFzIHNvIGV4aXN0aW5nXG4gICAqIGNhbGxlcnMga2VlcCB3b3JraW5nOyBwcmVmZXIgYHVwZGF0ZUNlbGxTdGF0ZXNgLCB3aGljaCBzYXlzIHdoYXQgaXQgZG9lcy5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVOb2RlU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpIHtcblxuICAgIHRoaXMudXBkYXRlQ2VsbFN0YXRlcyhub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDZWxsU3RhdGUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJvd05vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgcm93Tm9kZS5jZWxsU3RhdGVzW2NvbHVtbi5maWVsZF0gPSB0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlKHJvd05vZGUsIGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZSBldmVyeSBjZWxsIG9mIG9uZSByb3cgYW5kIHJlcGFpbnQgaXQuXG4gICAqXG4gICAqIFRoZSByZXBhaW50IGlzIHRoZSBwb2ludDogdGhpcyBpcyB3aGF0IGEgY2FsbGVyIHJlYWNoZXMgZm9yIGFmdGVyIG11dGF0aW5nXG4gICAqIGEgcm93IGluIHBsYWNlLCBhbmQgaXQgdXNlZCB0byByZWdlbmVyYXRlIHRoZSBzdGF0ZSBhbmQgc3RvcCB0aGVyZS4gVGhlXG4gICAqIGJvZHkgcmVuZGVycyB3aXRoIE9uUHVzaCwgc28gbm90aGluZyBtYXJrZWQgaXQgZGlydHkgYW5kIHRoZSBuZXcgc3RhdGUgc2F0XG4gICAqIHVucmVhZCB1bnRpbCBzb21lIHVucmVsYXRlZCBldmVudCBoYXBwZW5lZCB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24g4oCUXG4gICAqIHdoaWNoIGlzIHdoeSBjYWxsZXJzIGVuZGVkIHVwIG51ZGdpbmcgdGhlIGdyaWQgd2l0aCBhIHN5bnRoZXRpYyBET00gZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmICghcm93Tm9kZSkgcmV0dXJuO1xuXG4gICAgcm93Tm9kZS5jZWxsU3RhdGVzID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMocm93Tm9kZSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsU3RhdGVDaGFuZ2VkJywgeyBkYXRhOiByb3dOb2RlLmRhdGEsIG5vZGU6IHJvd05vZGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlciB0aGF0IFJlYWN0cyB0byBEZXRhaWwgQ2hhbmdlc1xuICAgKi9cbiAgLyoqXG4gICAqIEtlZXAgYSBtYXN0ZXIgcm93J3MgcmVzZXJ2ZWQgaGVpZ2h0IGluIHN0ZXAgd2l0aCBpdHMgZGV0YWlsIHJvd3MuXG4gICAqXG4gICAqIFR3byBsaXN0ZW5lcnMgdXNlZCB0byBiZSByZWdpc3RlcmVkIGhlcmUgYW5kIHRocm93biBhd2F5OiBhbiBlbXB0eVxuICAgKiBgcm93RGF0YUNoYW5nZWRgIGhhbmRsZXIgd2hvc2UgdW5zdWJzY3JpYmUgd2FzIG5ldmVyIGtlcHQsIGFuZCBhblxuICAgKiBgZXhwYW5kZWRDaGFuZ2VkYCBoYW5kbGVyIHdob3NlIGJvZHkgd2FzIGVudGlyZWx5IGNvbW1lbnRlZCBvdXQuIEJvdGggYXJlXG4gICAqIGdvbmUg4oCUIGEgbGlzdGVuZXIgd2l0aCBubyBiZWhhdmlvdXIgaXMgYSBsZWFrIHdpdGggbm8gdXBzaWRlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RldGFpbENoYW5nZXMobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgY29uc3QgdW5zdWJzY3JpYmVEZXRhaWwgPSBub2RlLm9uKCdkZXRhaWxSb3dEYXRhQ2hhbmdlZCcsICh7IG5vZGUgfSkgPT4ge1xuXG4gICAgICBpZiAodGhpcy5fYXBpVHlwZSA9PT0gJ21hc3RlcicpIHtcblxuICAgICAgICB0aGlzLnJlc29sdmVEZXRhaWxSb3dIZWlnaHQobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTm9kZUNsZWFudXAobm9kZS5yb3dJZCwgW3Vuc3Vic2NyaWJlRGV0YWlsXSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTm9kZUNsZWFudXAocm93SWQ6IHN0cmluZywgdW5zdWJzOiBBcnJheTwoKSA9PiB2b2lkPik6IHZvaWQge1xuXG4gICAgLy8gTWVyZ2Ugd2l0aCBhbnkgZXhpc3RpbmcgY2xlYW51cHMgZm9yIHRoaXMgcm93SWRcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX25vZGVDbGVhbnVwTWFwLmdldChyb3dJZCkgPz8gW107XG5cbiAgICB0aGlzLl9ub2RlQ2xlYW51cE1hcC5zZXQocm93SWQsIFsuLi5leGlzdGluZywgLi4udW5zdWJzXSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBOb2RlKHJvd0lkOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGNvbnN0IGNsZWFudXBzID0gdGhpcy5fbm9kZUNsZWFudXBNYXAuZ2V0KHJvd0lkKTtcblxuICAgIGNsZWFudXBzPy5mb3JFYWNoKGZuID0+IGZuKCkpO1xuXG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuZGVsZXRlKHJvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZGF0YSwgcmVsZWFzaW5nIHdoYXQgdGhleSBob2xkLlxuICAgKlxuICAgKiBUaGlzIGV4aXN0ZWQgYnV0IHdhcyBuZXZlciBjYWxsZWQ6IGBzZXRSb3dEYXRhYCBhbmQgYHVwZGF0ZVJvd0RhdGFgIGVhY2hcbiAgICogZGVsZXRlZCBzdHJhaWdodCBvdXQgb2YgYF9vcmlnaW5hbFJvd05vZGVzYCwgc28gYSByZW1vdmVkIG5vZGUga2VwdCBpdHNcbiAgICogbGlzdGVuZXJzIGFuZCBpdHMgZW50cnkgaW4gYF9ub2RlQ2xlYW51cE1hcGAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgZ3JpZC5cbiAgICogQm90aCBub3cgY29tZSB0aHJvdWdoIGhlcmUsIHdoaWNoIHVuc3Vic2NyaWJlcyBhbmQgY2xlYXJzIHRoZSBub2RlIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBwcnVuZVJlbW92ZWROb2Rlcyh2YWxpZFJvd0lkczogU2V0PHN0cmluZz4pOiB2b2lkIHtcblxuICAgIGZvciAoY29uc3QgW3Jvd0lkLCBub2RlXSBvZiB0aGlzLl9vcmlnaW5hbFJvd05vZGVzKSB7XG5cbiAgICAgIGlmICghdmFsaWRSb3dJZHMuaGFzKHJvd0lkKSkge1xuXG4gICAgICAgIHRoaXMuY2xlYW51cE5vZGUocm93SWQpOyAgLy8gdW5zdWJzY3JpYmUgbGlzdGVuZXJzXG5cbiAgICAgICAgbm9kZS5kZXN0cm95KCk7ICAgICAgICAgICAvLyBjbGVhciBub2RlJ3Mgb3duIGxpc3RlbmVyIG1hcFxuXG4gICAgICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVpZ2h0IGEgbWFzdGVyIHJvdyBtdXN0IHJlc2VydmUgZm9yIGl0cyBkZXRhaWwgZ3JpZDpcbiAgICogcm93SGVpZ2h0IHggY2xhbXAocm93cywgbWluUm93cywgbWF4Um93cykgKyBoZWFkZXJIZWlnaHQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZXRhaWxSb3dIZWlnaHQobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgY29uc3QgaGVpZ2h0T3B0aW9ucyA9IHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zPy5kZXRhaWxHcmlkT3B0aW9ucz8uZGV0YWlsUm93SGVpZ2h0T3B0aW9ucztcblxuICAgIC8vIFJlYWNoYWJsZSB3aGVuZXZlciBtYXN0ZXJEZXRhaWwgaXMgb24gYnV0IGRldGFpbENlbGxSZW5kZXJlclBhcmFtcyBpc1xuICAgIC8vIGluY29tcGxldGU7IHdpdGhvdXQgdGhlIGd1YXJkIHRoaXMgdGhyZXcgZnJvbSBpbnNpZGUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgaWYgKCFoZWlnaHRPcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBtaW5Sb3dzID0gaGVpZ2h0T3B0aW9ucy5taW5Sb3dzO1xuICAgIGNvbnN0IG1heFJvd3MgPSBoZWlnaHRPcHRpb25zLm1heFJvd3M7XG5cbiAgICBjb25zdCBtaW5IZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtaW5Sb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuICAgIGNvbnN0IG1heEhlaWdodCA9ICh0aGlzLnJvd0hlaWdodCAqIG1heFJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG5cbiAgICBjb25zdCByb3dzID0gbm9kZS5kZXRhaWxSb3dEYXRhICYmIG5vZGUuZGV0YWlsUm93RGF0YS5sZW5ndGggPyBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoIDogMDtcblxuICAgIG5vZGUuZGV0YWlsUm93SGVpZ2h0ID0gcm93cyA8PSBtaW5Sb3dzID8gbWluSGVpZ2h0IDogcm93cyA+PSBtYXhSb3dzID8gbWF4SGVpZ2h0IDogKHRoaXMucm93SGVpZ2h0ICogcm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIGV2ZXJ5dGhpbmcgdGhlIGdyaWQgaG9sZHMuIENhbGxlZCBieSBgT25lR3JpZENvbXBvbmVudC5uZ09uRGVzdHJveWAuXG4gICAqXG4gICAqIFRoZSBzZXJ2aWNlcyBhcmUgZGVsaWJlcmF0ZWx5ICpub3QqIG51bGxlZCBvdXQgYW55IG1vcmUuIFRoZXkgYXJlIGluamVjdGVkLFxuICAgKiBBbmd1bGFyIG93bnMgdGhlaXIgbGlmZXRpbWUsIGFuZCBudWxsaW5nIHRoZW0gb25seSBndWFyYW50ZWVkIGFcbiAgICogYFR5cGVFcnJvcmAgZm9yIGFueSBjYWxsYmFjayB0aGF0IGFycml2ZWQgYWZ0ZXIgdGVhcmRvd24g4oCUIGEgZGV0YWlsLXJvd1xuICAgKiBmZXRjaCByZXNvbHZpbmcgbGF0ZSwgb3IgdGhlIGJvZHkncyBkZWZlcnJlZCB1cGRhdGUuIGBfZGVzdHJveWVkYCBtYWtlc1xuICAgKiB0aG9zZSBjYWxscyBuby1vcHMgaW5zdGVhZCwgd2hpY2ggaXMgd2hhdCBhIHRvcm4tZG93biBvYmplY3Qgc2hvdWxkIGRvLlxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZXZlcnkgcGVyLW5vZGUgbGlzdGVuZXIgYmVmb3JlIGRyb3BwaW5nIHRoZSBub2Rlcy5cbiAgICBmb3IgKGNvbnN0IHJvd0lkIG9mIEFycmF5LmZyb20odGhpcy5fbm9kZUNsZWFudXBNYXAua2V5cygpKSkge1xuXG4gICAgICB0aGlzLmNsZWFudXBOb2RlKHJvd0lkKTtcbiAgICB9XG5cbiAgICAvLyBgZGVzdHJveWAgZHJvcHMgdGhlIHRyZWUgbGlua3MgYW5kIHRoZSBsaXN0ZW5lcnM7IHRoZSBBUEkgbm8gbG9uZ2VyIGhhc1xuICAgIC8vIHRvIHJlYWNoIGluIGFuZCB1bnBpY2sgZWFjaCBub2RlIGl0c2VsZi5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcblxuICAgIGZvciAoY29uc3Qgc2lkZSBvZiBbJ3RvcCcsICdib3R0b20nXSBhcyBPbmVQaW5uZWRSb3dTaWRlW10pIHtcblxuICAgICAgdGhpcy5fcGlubmVkUm93Tm9kZXNbc2lkZV0uZm9yRWFjaChub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcbiAgICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5fcm93Tm9kZXMgPSBbXTtcbiAgICB0aGlzLl92aXNpYmxlUm93Tm9kZXMgPSBbXTtcbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmNsZWFyKCk7XG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuY2xlYXIoKTtcbiAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuXG4gICAgLy8gUmVsZWFzZSB0aGUgYmFjay1yZWZlcmVuY2UgdGhlIGNlbGwgc2VydmljZSBob2xkcywgc28gYSB0b3JuLWRvd24gYXBpIGlzXG4gICAgLy8gbm90IGtlcHQgYWxpdmUgYnkgdGhlIHNlcnZpY2UgdGhhdCBvdXRsaXZlcyB0aGlzIGNhbGwuXG4gICAgdGhpcy5jZWxsU2VydmljZS5zZXRHcmlkQXBpKG51bGwpO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0QWxsKCk7XG4gICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG5cbiAgICB0aGlzLl9hY3RpdmVGaWx0ZXJzID0gW107XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fc29ydE1vZGVsID0gW107XG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG5cbiAgICB0aGlzLm1hc3RlckRldGFpbCA9IGZhbHNlO1xuICAgIHRoaXMudHJlZURhdGEgPSBmYWxzZTtcbiAgICB0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCA9IG51bGw7XG4gICAgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9IDA7XG4gICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBudWxsO1xuICAgIHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuX2dldERldGFpbFJvd0RhdGEgPSBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYGRlc3Ryb3lgIGhhcyBydW4uIExhdGUgY2FsbGJhY2tzIGNoZWNrIHRoaXMgYmVmb3JlIGRvaW5nIHdvcmsuICovXG4gIHB1YmxpYyBnZXQgZGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3llZDtcbiAgfVxufVxuIl19
|
|
1313
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYXBpLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFTbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQWdCLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFakosT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTlELE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBTWpELE1BQU0sT0FBTyxVQUFVO0lBcUJyQix3REFBd0Q7SUFDeEQsSUFBVyxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJ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QUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRXZCLDJFQUEyRTtRQUMzRSx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXJCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLElBQVcsU0FBUztRQUVsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQzsrR0E5dkRVLFVBQVU7bUhBQVYsVUFBVTs7NEZBQVYsVUFBVTtrQkFEdEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiwgT25lQ29sdW1uU3RhdGVFbnRyeSB9IGZyb20gJy4uL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSBcIi4vb25lLXJvdy1ub2RlLmNsYXNzXCI7XG5pbXBvcnQgeyBPbmVHcmlkSW5pdE9wdGlvbnMsIE9uZUdyaWRUeXBlLCBPbmVSb3dUcmFuc2FjdGlvbiwgT25lU29ydE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lUm93VmFsaWRhdGlvbkVycm9ycywgT25lVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uL21vZGVscy9vbmUtdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBPbmVGaWx0ZXJNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1leHBhbnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMsIE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMgfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcmlkUm93U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZVwiO1xuaW1wb3J0IHsgZmlsdGVyVHJlZU5vZGUsIGlzRmlsdGVyQWN0aXZlIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLWZpbHRlci5oZWxwZXJcIjtcbmltcG9ydCB7IGJ1aWxkQ3N2LCBPbmVDc3ZFeHBvcnRPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvb25lLWNzdi5oZWxwZXJcIjtcbmltcG9ydCB7IGFnZ0NvbHVtbnMsIGJ1aWxkR3JvdXBlZFJvd3MsIE9uZUFnZ0NvbHVtbiwgT05FX0dST1VQX0NISUxEUkVOX0ZJRUxELCBPTkVfR1JPVVBfSURfRklFTEQgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9vbmUtcm93LWdyb3VwaW5nLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfSBmcm9tIFwiLi4vbW9kZWxzL29uZS1yb3ctZHJhZy5tb2RlbFwiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlclwiO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgT25lUGlubmVkUm93U2lkZSwgUm93U2VsZWN0aW9uTW9kZSB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gXCIuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWxcIjtcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9vZy1jb2x1bW4uc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT25lR3JpZEFwaTxUID0gYW55PiB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFB1YmxpYyBzdGF0ZVxuICAvL1xuICAvLyBFeHBvc2VkIGFzIGdldHRlcnMsIG5vdCBmaWVsZHMuIFRoZXNlIHdlcmUgd3JpdGFibGUsIHNvIGEgY29uc3VtZXIgY291bGRcbiAgLy8gY29ycnVwdCB0aGUgZ3JpZCBieSBhc3NpZ25pbmcgdG8gdGhlbSDigJQgc3dhcHBpbmcgYHJvd05vZGVzYCBmb3IgYW5cbiAgLy8gdW5yZWxhdGVkIGFycmF5LCBvciBzZXR0aW5nIGBzb3J0TW9kZWxgIHdpdGhvdXQgdGhlIHJvd3MgZXZlciBiZWluZ1xuICAvLyByZS1zb3J0ZWQuIFJlYWRzIGFyZSB1bmNoYW5nZWQ7IG9ubHkgYXNzaWdubWVudCBpcyBub3cgYSBjb21waWxlIGVycm9yLlxuICAvL1xuICAvLyBUaGUgYXJyYXktdmFsdWVkIG9uZXMgYXJlIHR5cGVkIGByZWFkb25seSBUW11gLCB3aGljaCBzdG9wcyBgcHVzaGAgYW5kXG4gIC8vIGBzcGxpY2VgIGF0IGNvbXBpbGUgdGltZSB3aXRob3V0IGNvcHlpbmcgb24gZXZlcnkgcmVhZC4gVXNlXG4gIC8vIGBnZXRBbGxSb3dOb2RlcygpYCB3aGVuIHlvdSB3YW50IGEgY29weSB5b3Ugb3duLlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfcm93U2VsZWN0aW9uOiBSb3dTZWxlY3Rpb25Nb2RlID0gbnVsbDtcbiAgcHJpdmF0ZSBfYXBpVHlwZTogT25lR3JpZFR5cGUgPSBudWxsO1xuICBwcml2YXRlIF9yb3dOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHByaXZhdGUgX3NvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10gPSBbXTtcblxuICAvKiogVW5pcXVlIHBlciBncmlkIGluc3RhbmNlLCBhc3NpZ25lZCBkdXJpbmcgYGluaXRgLiAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqIFRoZSBgW2NvbnRleHRdYCB0aGUgZ3JpZCB3YXMgZ2l2ZW4uICovXG4gIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgLyoqIFNlbGVjdGlvbiBtb2RlLCBjYXB0dXJlZCBkdXJpbmcgYGluaXRgLiBDaGFuZ2luZyB0aGUgaW5wdXQgbGF0ZXIgaGFzIG5vIGVmZmVjdC4gKi9cbiAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKTogUm93U2VsZWN0aW9uTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdGlvbjtcbiAgfVxuXG4gIC8qKiBXaGljaCByb2xlIHRoaXMgaW5zdGFuY2UgcGxheXM6IHNpbXBsZSwgbWFzdGVyLCBkZXRhaWwgb3IgdHJlZS4gKi9cbiAgcHVibGljIGdldCBhcGlUeXBlKCk6IE9uZUdyaWRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVHlwZTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBub2RlIHRoZSBncmlkIGhvbGRzLCBpbiBmbGF0dGVuZWQgb3JkZXIuICovXG4gIHB1YmxpYyBnZXQgcm93Tm9kZXMoKTogcmVhZG9ubHkgT25lUm93Tm9kZTxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fcm93Tm9kZXM7XG4gIH1cblxuICAvKiogVGhlIHNvcnQgbW9kZWwgY3VycmVudGx5IGFwcGxpZWQuIENoYW5nZSBpdCB3aXRoIGBvblNvcnRDaGFuZ2VkYC4gKi9cbiAgcHVibGljIGdldCBzb3J0TW9kZWwoKTogcmVhZG9ubHkgT25lU29ydE1vZGVsPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0TW9kZWw7XG4gIH1cblxuXG4gIHByaXZhdGUgcm93SGVpZ2h0OiBudW1iZXIgPSAyNjtcbiAgcHJpdmF0ZSBoZWFkZXJSb3dIZWlnaHQ6IG51bWJlciA9IDMyO1xuICBwcml2YXRlIF9jdXJyZW50SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3F1aWNrRmlsdGVyVmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlcnM6IE9uZUZpbHRlck1vZGVsW10gPSBbXTtcblxuICBwcml2YXRlIF92aXNpYmxlUm93Tm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcm93cyBhcyB0aGUgaG9zdCBsYXN0IGhhbmRlZCB0aGVtIG92ZXIg4oCUIGJlZm9yZSBncm91cGluZyBmb2xkZWRcbiAgICogdGhlbS4gR3JvdXBpbmcgaXMgYSB0cmFuc2Zvcm0gb24gdGhlIHdheSBpbiwgc28gdGhpcyBpcyB3aGF0IGEgY2hhbmdlIG9mXG4gICAqIGdyb3VwaW5nIHJlLWZvbGRzLCBhbmQgaXQgaXMgd2h5IHJlZ3JvdXBpbmcga2VlcHMgdGhlIGhvc3QncyByb3cgb3JkZXJcbiAgICogaW5zdGVhZCBvZiBpbmhlcml0aW5nIHRoZSBvcmRlciB0aGUgcHJldmlvdXMgZ3JvdXBpbmcgaGFwcGVuZWQgdG8gbGVhdmUuXG4gICAqL1xuICBwcml2YXRlIF9zb3VyY2VSb3dzOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGlubmVkUm93Tm9kZXM6IFJlY29yZDxPbmVQaW5uZWRSb3dTaWRlLCBPbmVSb3dOb2RlPFQ+W10+ID0geyB0b3A6IFtdLCBib3R0b206IFtdIH07XG4gIHByaXZhdGUgX29yaWdpbmFsUm93Tm9kZXM6IE1hcDxzdHJpbmcsIE9uZVJvd05vZGU8VD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9ub2RlQ2xlYW51cE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTwoKSA9PiB2b2lkPj4oKTsgLy8gQ2xlYW51cCByZWdpc3RyeSAocHJldmVudHMgbWVtb3J5IGxlYWtzKVxuICBwcml2YXRlIF9kZXN0cm95ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBBZHZhbmNlZCBGZWF0dXJlc1xuICBwcml2YXRlIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlICpob3N0KiBkZWNsYXJlZCB0cmVlIGRhdGEsIGFzIG9wcG9zZWQgdG8gZ3JvdXBpbmcgaGF2aW5nXG4gICAqIHR1cm5lZCB0cmVlIG1vZGUgb24uIGB0cmVlRGF0YWAgYWJvdmUgYW5zd2VycyBcImlzIHRoaXMgYSB0cmVlIHJpZ2h0IG5vd1wiLFxuICAgKiB3aGljaCBncm91cGluZyBmbGlwczsgdGhpcyBhbnN3ZXJzIFwid2hvc2UgdHJlZSBpcyBpdFwiLCB3aGljaCBkZWNpZGVzXG4gICAqIHdoZXRoZXIgZ3JvdXBpbmcgbWF5IHRvdWNoIGl0IGF0IGFsbC5cbiAgICovXG4gIHByaXZhdGUgX2hvc3RUcmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHRyZWVEYXRhQ2hpbGRyZW5GaWVsZDogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBncm91cERlZmF1bHRFeHBhbmRlZDogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIG1hc3RlckRldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBwcml2YXRlIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50PzogVHlwZTxPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBTdXBwbGllcyBhIG1hc3RlciByb3cncyBkZXRhaWwgcm93cy4gU2V0IHRocm91Z2ggYHNldEdldERldGFpbFJvd0RhdGFgO1xuICAgKiBwcmV2aW91c2x5IGEgd3JpdGFibGUgcHVibGljIGZpZWxkIHdpdGggYSBzZXR0ZXIgYmVzaWRlIGl0LCB3aGljaCBsZWZ0IHR3b1xuICAgKiB3YXlzIHRvIGRvIHRoZSBzYW1lIHRoaW5nIGFuZCBvbmUgb2YgdGhlbSB1bmNoZWNrZWQuXG4gICAqL1xuICBwcml2YXRlIF9nZXREZXRhaWxSb3dEYXRhOiAocGFyYW1zOiBPbmVHZXREZXRhaWxSb3dEYXRhUGFyYW1zKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29sdW1uU2VydmljZTogT2dDb2x1bW5TZXJ2aWNlLFxuICAgIHByaXZhdGUgcm93U2VydmljZTogT25lR3JpZFJvd1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZWxsU2VydmljZTogT25lR3JpZENlbGxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU2VydmljZTogT25lR3JpZFNlbGVjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBleHBhbnNpb25TZXJ2aWNlOiBPbmVHcmlkRXhwYW5zaW9uU2VydmljZVxuICApIHsgfVxuXG4gIC8qKlxuICAgKiBTdGFuZCB0aGUgZ3JpZCB1cC4gQ2FsbGVkIGJ5IGBPbmVHcmlkQ29tcG9uZW50YCBmcm9tIGBuZ09uSW5pdGAuXG4gICAqXG4gICAqIFRha2VzIGEgc2luZ2xlIGBPbmVHcmlkSW5pdE9wdGlvbnNgIHJhdGhlciB0aGFuIHRoZSB0ZW4gcG9zaXRpb25hbFxuICAgKiBhcmd1bWVudHMgaXQgdXNlZCB0bywgc28gYSBjYWxsIHNpdGUgcmVhZHMgYXMgdGhlIGNvbmZpZ3VyYXRpb24gaXQgaXMgYW5kXG4gICAqIGEgbmV3IG9wdGlvbiBubyBsb25nZXIgbWVhbnMgZWRpdGluZyBldmVyeSBjYWxsZXIuXG4gICAqXG4gICAqIEBpbnRlcm5hbCBBcHBsaWNhdGlvbnMgb2J0YWluIGEgcmVhZHktbWFkZSBBUEkgZnJvbSBgKG9uR3JpZFJlYWR5KWA7IHRoZXlcbiAgICogc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyB0aGVtc2VsdmVzLlxuICAgKi9cbiAgaW5pdChvcHRpb25zOiBPbmVHcmlkSW5pdE9wdGlvbnM8VD4pOiB2b2lkIHtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdyaWRUeXBlLFxuICAgICAgY29sdW1uRGVmcyxcbiAgICAgIGRlZmF1bHRDb2x1bW5EZWYgPSB7fSxcbiAgICAgIGdyb3VwQ29sdW1uRGVmcyA9IFtdLFxuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICByb3dTZWxlY3Rpb24gPSBudWxsLFxuICAgICAgbWFzdGVyRGV0YWlsID0gZmFsc2UsXG4gICAgICBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSBudWxsLFxuICAgICAgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSBudWxsLFxuICAgICAgdHJlZURhdGEgPSBmYWxzZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIHRoaXMuX2lkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5fYXBpVHlwZSA9IGdyaWRUeXBlO1xuICAgIHRoaXMuX3Jvd1NlbGVjdGlvbiA9IHJvd1NlbGVjdGlvbjtcbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLm1hc3RlckRldGFpbCA9IG1hc3RlckRldGFpbDtcbiAgICB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcyA9IGRldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgICB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG4gICAgdGhpcy50cmVlRGF0YSA9IHRyZWVEYXRhO1xuICAgIHRoaXMuX2hvc3RUcmVlRGF0YSA9IHRyZWVEYXRhO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNldFNlbGVjdGlvbk1vZGUocm93U2VsZWN0aW9uKTtcblxuICAgIC8vIFN5bnRoZXRpYyBncm91cCByb3dzIGNhcnJ5IHRoZWlyIG93biBzdGFibGUgaWQg4oCUIHRoZSBwYXRoIG9mIGdyb3VwXG4gICAgLy8gdmFsdWVzIOKAlCB3aGljaCBubyBob3N0IGdldFJvd0lkIGtub3dzIGhvdyB0byBkZXJpdmUuIFRoZSB3cmFwcGVyIHJlYWRzXG4gICAgLy8gaXQgZmlyc3QgYW5kIGRlZmVycyB0byB0aGUgaG9zdCdzIGZ1bmN0aW9uIChvciB0aGUgdXVpZCBmYWxsYmFjaykgZm9yXG4gICAgLy8gcmVhbCByb3dzLCBzbyBncm91cGluZyBrZWVwcyBleHBhbnNpb24gYWNyb3NzIHJlYnVpbGRzIGV2ZW4gd2hlbiB0aGVcbiAgICAvLyBob3N0IHByb3ZpZGVkIG5vIGlkIGZ1bmN0aW9uIGF0IGFsbC5cbiAgICBjb25zdCBob3N0R2V0Um93SWQgPSBjb250ZXh0Py5jb21wb25lbnRQYXJlbnQ/LmdldFJvd0lkID8/IG51bGw7XG5cbiAgICB0aGlzLnJvd1NlcnZpY2Uuc2V0R2V0Um93SWRGbigocGFyYW1zOiB7IGRhdGE6IGFueTsgcm93SW5kZXg6IG51bWJlciB9KSA9PlxuICAgICAgcGFyYW1zPy5kYXRhPy5bT05FX0dST1VQX0lEX0ZJRUxEXSA/PyBob3N0R2V0Um93SWQ/LihwYXJhbXMpID8/IG51bGwpO1xuXG4gICAgdGhpcy5jZWxsU2VydmljZS5hcHBseUNvbHVtbkRlZnMoY29sdW1uRGVmcywgY29udGV4dCk7XG4gICAgdGhpcy5jZWxsU2VydmljZS5zZXRHcmlkQXBpKHRoaXMpO1xuICAgIHRoaXMuY29sdW1uU2VydmljZS5pbml0Q29sdW1uRGVmcyhkZWZhdWx0Q29sdW1uRGVmLCBjb2x1bW5EZWZzLCBncm91cENvbHVtbkRlZnMsIGNvbnRleHQpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlIGFzIENvbHVtbkNoYW5nZWRFdmVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgZXZlcnkgcm93LCBkaXNjYXJkaW5nIHNlbGVjdGlvbiBhbmQgZXhwYW5zaW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIHRoZSByb3dzIHJlcHJlc2VudCBzb21ldGhpbmcgbmV3LiBUbyBzd2FwIHRoZSBkYXRhIHdoaWxlXG4gICAqIGtlZXBpbmcgd2hhdCB0aGUgdXNlciBoYXMgc2VsZWN0ZWQgYW5kIG9wZW5lZCwgdXNlIGB1cGRhdGVSb3dEYXRhYC5cbiAgICovXG4gIHB1YmxpYyBzZXRSb3dEYXRhKHJvd0RhdGE6IFRbXSkge1xuXG4gICAgdGhpcy5yZWJ1aWxkUm93cyhyb3dEYXRhLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGV2ZXJ5IHJvdywga2VlcGluZyBzZWxlY3Rpb24gYW5kIGV4cGFuc2lvbi5cbiAgICpcbiAgICogU3RhdGUgaXMga2V5ZWQgYnkgcm93IGlkLCBzbyB0aGlzIG9ubHkgcHJlc2VydmVzIGFueXRoaW5nIGlmIHRoZSBncmlkIGhhcyBhXG4gICAqIGBjb250ZXh0LmNvbXBvbmVudFBhcmVudC5nZXRSb3dJZGAg4oCUIG90aGVyd2lzZSBlYWNoIHJlYnVpbGQgbWludHMgbmV3IGlkc1xuICAgKiBhbmQgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIG1hdGNoIGFnYWluc3QuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUm93RGF0YShyb3dEYXRhOiBUW10pIHtcblxuICAgIHRoaXMucmVidWlsZFJvd3Mocm93RGF0YSwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgYmF0Y2ggb2Ygcm93IGNoYW5nZXMgd2l0aG91dCB0aGUgaG9zdCByZWJpbmRpbmcgdGhlIGRhdGFzZXQ6XG4gICAqIGFwcGVuZCByb3dzIChhdCB0aGUgcm9vdCwgb3IgdW5kZXIgYSBwYXJlbnQgYnkgaWQgb24gdHJlZSBkYXRhKSwgcmVwbGFjZVxuICAgKiByb3dzIGJ5IGlkLCBkcm9wIHJvd3MgYXQgYW55IGRlcHRoLiBTZWxlY3Rpb24gYW5kIGV4cGFuc2lvbiBzdXJ2aXZlIOKAlFxuICAgKiB0aGlzIGlzIGB1cGRhdGVSb3dEYXRhYCBmZWQgZnJvbSB0aGUgZ3JpZCdzIG93biBjdXJyZW50IHJvd3MsIHNvIHRoZVxuICAgKiBob3N0IGtlZXBzIG5vIHBhcmFsbGVsIGNvcHkgdG8gcmVjb25jaWxlLlxuICAgKlxuICAgKiBSZXF1aXJlcyBhIHN0YWJsZSBgY29udGV4dC5jb21wb25lbnRQYXJlbnQuZ2V0Um93SWRgOiByb3dzIGFyZSBtYXRjaGVkIGJ5XG4gICAqIGlkLCBhbmQgd2l0aG91dCBhbiBpZCBmdW5jdGlvbiB0aGVyZSBpcyBub3RoaW5nIHRvIG1hdGNoIG9uIOKAlCB0aGVcbiAgICogdHJhbnNhY3Rpb24gaXMgcmVmdXNlZCB3aXRoIGEgd2FybmluZyByYXRoZXIgdGhhbiBoYWxmLWFwcGxpZWQuXG4gICAqL1xuICBwdWJsaWMgYXBwbHlUcmFuc2FjdGlvbih0cmFuc2FjdGlvbjogT25lUm93VHJhbnNhY3Rpb248VD4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgIXRyYW5zYWN0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzYW1wbGUgPSB0cmFuc2FjdGlvbi51cGRhdGU/LlswXSA/PyB0cmFuc2FjdGlvbi5hZGQ/LlswXVxuICAgICAgPz8gKHRyYW5zYWN0aW9uLnJlbW92ZSA/PyBbXSkuZmluZChlbnRyeSA9PiB0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnKTtcblxuICAgIGlmIChzYW1wbGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJvd1NlcnZpY2UucmVzb2x2ZVJvd0lkKHNhbXBsZSkgPT09IG51bGwpIHtcblxuICAgICAgY29uc29sZS53YXJuKCdbb25lLWdyaWRdIGFwcGx5VHJhbnNhY3Rpb24gbmVlZHMgY29udGV4dC5jb21wb25lbnRQYXJlbnQuZ2V0Um93SWQg4oCUIHJvd3MgYXJlIG1hdGNoZWQgYnkgaWQuIE5vdGhpbmcgd2FzIGFwcGxpZWQuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdmVJZHMgPSBuZXcgU2V0KFxuICAgICAgKHRyYW5zYWN0aW9uLnJlbW92ZSA/PyBbXSkubWFwKGVudHJ5ID0+XG4gICAgICAgIHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgPyBlbnRyeSA6IHRoaXMucm93U2VydmljZS5yZXNvbHZlUm93SWQoZW50cnkpKSxcbiAgICApO1xuXG4gICAgY29uc3QgdXBkYXRlcyA9IG5ldyBNYXAoXG4gICAgICAodHJhbnNhY3Rpb24udXBkYXRlID8/IFtdKS5tYXAoZGF0YSA9PiBbdGhpcy5yb3dTZXJ2aWNlLnJlc29sdmVSb3dJZChkYXRhKSwgZGF0YV0pLFxuICAgICk7XG5cbiAgICBjb25zdCBjaGlsZHJlbkZpZWxkID0gdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQ7XG5cbiAgICAvLyBSb3cgZ3JvdXBpbmcgZm9sZHMgZmxhdCByb3dzIGl0c2VsZiwgc28gdGhlIHRyYW5zYWN0aW9uIG9wZXJhdGVzIG9uIHRoZVxuICAgIC8vIGxlYXZlcyBhbmQgcmUtZ3JvdXBzOyBhIHBhcmVudCB0YXJnZXQgd291bGQgbmFtZSBhIHN5bnRoZXRpYyBncm91cCByb3csXG4gICAgLy8gd2hpY2ggaXMgbm90IGEgcGxhY2UgZGF0YSBjYW4gbGl2ZS5cbiAgICBjb25zdCBncm91cGluZyA9IHRoaXMuX3Jvd0dyb3VwRmllbGRzLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgYWRkVG9QYXJlbnRJZCA9IGdyb3VwaW5nID8gdW5kZWZpbmVkIDogdHJhbnNhY3Rpb24uYWRkVG9QYXJlbnRJZDtcblxuICAgIGlmIChncm91cGluZyAmJiB0cmFuc2FjdGlvbi5hZGRUb1BhcmVudElkKSB7XG5cbiAgICAgIGNvbnNvbGUud2FybignW29uZS1ncmlkXSBhcHBseVRyYW5zYWN0aW9uOiBhZGRUb1BhcmVudElkIGlzIGlnbm9yZWQgdW5kZXIgcm93IGdyb3VwaW5nIOKAlCBncm91cHMgYXJlIHN5bnRoZXRpYy4gUm93cyB3ZXJlIGFkZGVkIGF0IHRoZSByb290LicpO1xuICAgIH1cblxuICAgIC8vIENvcHktb24td3JpdGUgb3ZlciB0aGUgZ3JpZCdzIG93biBjdXJyZW50IHJvd3M6IHRoZSBub2RlIGdyYXBoIGNhcnJpZXNcbiAgICAvLyB0aGUgZGF0YSwgc28gdGhlIGhvc3QncyBvcmlnaW5hbCBhcnJheXMgYXJlIG5ldmVyIG11dGF0ZWQgYW5kIHVudG91Y2hlZFxuICAgIC8vIGJyYW5jaGVzIGtlZXAgdGhlaXIgb2JqZWN0IGlkZW50aXR5IGZvciB0aGUgbm9kZS1yZXVzZSBwYXRoLlxuICAgIGNvbnN0IGFwcGx5VG8gPSAocm93czogVFtdKTogVFtdID0+IHJvd3NcbiAgICAgIC5maWx0ZXIoZGF0YSA9PiAhcmVtb3ZlSWRzLmhhcyh0aGlzLnJvd1NlcnZpY2UucmVzb2x2ZVJvd0lkKGRhdGEpKSlcbiAgICAgIC5tYXAoZGF0YSA9PiB7XG5cbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnJvd1NlcnZpY2UucmVzb2x2ZVJvd0lkKGRhdGEpO1xuXG4gICAgICAgIGxldCBuZXh0ID0gdXBkYXRlcy5nZXQoaWQpID8/IGRhdGE7XG5cbiAgICAgICAgaWYgKHRoaXMudHJlZURhdGEgJiYgY2hpbGRyZW5GaWVsZCkge1xuXG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSAobmV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY2hpbGRyZW5GaWVsZF0gYXMgVFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHJlYnVpbHQgPSBjaGlsZHJlbiA/IGFwcGx5VG8oY2hpbGRyZW4pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgY29uc3Qgd2l0aEFkZGVkID0gaWQgIT0gbnVsbCAmJiBpZCA9PT0gYWRkVG9QYXJlbnRJZFxuICAgICAgICAgICAgPyBbLi4uKHJlYnVpbHQgPz8gW10pLCAuLi4odHJhbnNhY3Rpb24uYWRkID8/IFtdKV1cbiAgICAgICAgICAgIDogcmVidWlsdDtcblxuICAgICAgICAgIGlmICh3aXRoQWRkZWQgIT09IGNoaWxkcmVuKSBuZXh0ID0geyAuLi5uZXh0LCBbY2hpbGRyZW5GaWVsZF06IHdpdGhBZGRlZCA/PyBbXSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9KTtcblxuICAgIC8vIEdyb3VwZWQgcm9vdHMgYXJlIHN5bnRoZXRpYywgc28gdGhlIGRhdGEgaXMgb24gdGhlIGxlYXZlczsgb3RoZXJ3aXNlIHRoZVxuICAgIC8vIHJvb3RzIGFyZSB0aGUgZGF0YS4gUmVhZCBmcm9tIHRoZSBub2RlcyByYXRoZXIgdGhhbiBmcm9tIGBfc291cmNlUm93c2BcbiAgICAvLyBzbyBhIHJlb3JkZXIgdGhlIHVzZXIgZHJhZ2dlZCBpbnRvIHBsYWNlIHN1cnZpdmVzIHRoZSB0cmFuc2FjdGlvbi5cbiAgICBjb25zdCBjdXJyZW50Um93cyA9IGdyb3VwaW5nXG4gICAgICA/IHRoaXMuX3Jvd05vZGVzLmZpbHRlcihub2RlID0+IG5vZGUubGVhZikubWFwKG5vZGUgPT4gbm9kZS5kYXRhKVxuICAgICAgOiB0aGlzLl9yb3dOb2Rlcy5maWx0ZXIobm9kZSA9PiAhbm9kZS5wYXJlbnQpLm1hcChub2RlID0+IG5vZGUuZGF0YSk7XG5cbiAgICBsZXQgcm9vdHMgPSBhcHBseVRvKGN1cnJlbnRSb3dzKTtcblxuICAgIGlmICh0cmFuc2FjdGlvbi5hZGQ/Lmxlbmd0aCAmJiAhYWRkVG9QYXJlbnRJZCkge1xuXG4gICAgICByb290cyA9IFsuLi5yb290cywgLi4udHJhbnNhY3Rpb24uYWRkXTtcbiAgICB9XG5cbiAgICB0aGlzLnJlYnVpbGRSb3dzKHJvb3RzLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9uZSByb3ctbG9hZGluZyBwYXRoLiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBkaWZmZXJlZCBvbmx5IGluXG4gICAqIHdoZXRoZXIgdGhleSBjbGVhcmVkIHRoZSBzdGF0ZSBzZXJ2aWNlcyBmaXJzdCwgc28gZXZlcnl0aGluZyBlbHNlIOKAlCBidWlsZCxcbiAgICogZmlsdGVyLCBwcnVuZSDigJQgbGl2ZXMgaGVyZSBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkUm93cyhyb3dEYXRhOiBUW10sIHJlc2V0U3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGlmIChyZXNldFN0YXRlKSB7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc291cmNlUm93cyA9IHJvd0RhdGEgPz8gW107XG5cbiAgICAvLyBSb3cgZ3JvdXBpbmcgaXMgYSB0cmFuc2Zvcm0gb24gdGhlIHdheSBpbjogdGhlIGhvc3Qga2VlcHMgaGFuZGluZyB0aGVcbiAgICAvLyBncmlkIGZsYXQgcm93cywgYW5kIHRoZSB0cmVlIHBpcGVsaW5lIGJlbG93IHNlZXMgc3ludGhldGljIGdyb3VwIHJvd3NcbiAgICAvLyB3aXRoIGNoaWxkcmVuIOKAlCB0aGUgc2FtZSBzaGFwZSB0cmVlIGRhdGEgYXJyaXZlcyBpbi5cbiAgICBpZiAodGhpcy5fcm93R3JvdXBGaWVsZHMubGVuZ3RoKSB7XG5cbiAgICAgIHJvd0RhdGEgPSBidWlsZEdyb3VwZWRSb3dzKHJvd0RhdGEsIHRoaXMuX3Jvd0dyb3VwRmllbGRzLCB0aGlzLl9hZ2dDb2x1bW5zKSBhcyBUW107XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHRoaXMuYnVpbGRSb3dOb2Rlcyhyb3dEYXRhLCBudWxsLCAwLCB2YWxpZFJvd0lkcyk7XG5cbiAgICAvLyBQcnVuZSBCRUZPUkUgc29ydGluZyBhbmQgZmlsdGVyaW5nOiBib3RoIHJlYWQgYF9vcmlnaW5hbFJvd05vZGVzYCwgYW5kXG4gICAgLy8gd2l0aCB0aGUgcHJ1bmUgbGFzdCwgYSBkYXRhIHN3YXAgd2hpbGUgYSBzb3J0IHdhcyBhY3RpdmUgcmVzdXJyZWN0ZWRcbiAgICAvLyB0aGUgcmVtb3ZlZCByb3dzIGludG8gYF9yb3dOb2Rlc2AgZm9yIG9uZSB3aG9sZSByZW5kZXIg4oCUIHRoZSBvbGQgYW5kXG4gICAgLy8gdGhlIG5ldyBkYXRhc2V0IG9uIHNjcmVlbiB0b2dldGhlciB1bnRpbCB0aGUgbmV4dCByZWJ1aWxkLlxuICAgIHRoaXMucHJ1bmVSZW1vdmVkTm9kZXModmFsaWRSb3dJZHMpO1xuXG4gICAgLy8gUmUtYXBwbHkgdGhlIGFjdGl2ZSBzb3J0LiBgYnVpbGRSb3dOb2Rlc2AgcmVidWlsZHMgdGhlIHJvdyBsaXN0IGluIHRoZVxuICAgIC8vIG9yZGVyIHRoZSBkYXRhIGFycml2ZWQsIHNvIHdpdGhvdXQgdGhpcyBhIGRhdGEgdXBkYXRlIHNpbGVudGx5IHJldHVybmVkXG4gICAgLy8gdGhlIHJvd3MgdG8gdGhhdCBvcmRlciB3aGlsZSBgc29ydE1vZGVsYCDigJQgYW5kIHRoZXJlZm9yZSB0aGUgaGVhZGVyJ3NcbiAgICAvLyBzb3J0IGFycm93IOKAlCBzdGlsbCBzYWlkIHRoZXkgd2VyZSBzb3J0ZWQuIFNvcnRpbmcgYmVmb3JlIGZpbHRlcmluZ1xuICAgIC8vIGJlY2F1c2UgZmlsdGVyaW5nIG9ubHkgc2V0cyB2aXNpYmlsaXR5IG9uIHdoYXRldmVyIG9yZGVyIHRoaXMgbGVhdmVzLlxuICAgIGlmICh0aGlzLl9zb3J0TW9kZWwubGVuZ3RoID4gMCkgdGhpcy5hcHBseVNvcnRpbmcoKTtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlIEJ1aWxkIFJvdyBOb2RlcyAoT3B0aW1pemVkKVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJvd05vZGVzKFxuICAgIHJvd0RhdGE6IFRbXSxcbiAgICBwYXJlbnQ6IE9uZVJvd05vZGU8VD4gfCBudWxsID0gbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyID0gMCxcbiAgICB2YWxpZFJvd0lkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCksXG4gICAgZXhwYW5kZWRJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmV4cGFuc2lvblNlcnZpY2UuZ2V0RXhwYW5kZWRJZHMoKSksXG4gICAgY29sbGFwc2VkSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5leHBhbnNpb25TZXJ2aWNlLmdldENvbGxhcHNlZElkcygpKSxcbiAgICBzZWxlY3RlZElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3RlZElkcygpKSxcbiAgICB2aXNpdGVkRGF0YTogU2V0PHVua25vd24+ID0gbmV3IFNldCgpXG4gICk6IE9uZVJvd05vZGVbXSB7XG5cbiAgICBpZiAocGFyZW50ID09PSBudWxsKSB7XG5cbiAgICAgIHRoaXMuX3Jvd05vZGVzID0gW107XG4gICAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuICAgIH1cblxuICAgIGlmICghcm93RGF0YT8ubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBub2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGRhdGEgb2Ygcm93RGF0YSkge1xuXG4gICAgICBjb25zdCByb3dJZCA9IHRoaXMucm93U2VydmljZS5nZW5lcmF0ZVJvd0lkKGRhdGEsIHRoaXMuX2N1cnJlbnRJbmRleCk7XG5cbiAgICAgIC8vIEEgY3ljbGUgaW4gdGhlIGNoaWxkcmVuIGdyYXBoIOKAlCBhIHJvdyByZWFjaGFibGUgZnJvbSBpdHMgb3duIHN1YnRyZWUsXG4gICAgICAvLyB0aGUgY2xhc3NpYyBPUk0gYmFjay1yZWZlcmVuY2Ug4oCUIHVzZWQgdG8gcmVjdXJzZSB1bnRpbCB0aGUgc3RhY2sgYmxldyxcbiAgICAgIC8vIGZyZWV6aW5nIHRoZSBhcHA7IGFuZCB3aXRoIGdlbmVyYXRlZCByb3cgaWRzIGl0IGRpZCBzbyB3aGlsZSBtaW50aW5nXG4gICAgICAvLyBub2RlcyB0aGUgd2hvbGUgd2F5IGRvd24uIFRoZSBzYW1lIGd1YXJkIGFsc28gZHJvcHMgYSBkdXBsaWNhdGUgcm93IGlkXG4gICAgICAvLyAob3IgdGhlIHNhbWUgcm93IG9iamVjdCBhcHBlYXJpbmcgdHdpY2UpOiBmaXJzdCBvY2N1cnJlbmNlIHdpbnMuXG4gICAgICBpZiAodmlzaXRlZERhdGEuaGFzKGRhdGEpIHx8IHZhbGlkUm93SWRzLmhhcyhyb3dJZCkpIHtcblxuICAgICAgICBjb25zb2xlLndhcm4oYFtvbmUtZ3JpZF0gY3ljbGljIG9yIGR1cGxpY2F0ZSByb3cgKGlkIFwiJHtyb3dJZH1cIikg4oCUIHNraXBwZWQsIGZpcnN0IG9jY3VycmVuY2Ugd2lucy4gVHJlZSBkYXRhIG11c3QgYmUgYWN5Y2xpYyBhbmQgcm93IGlkcyB1bmlxdWUuYCk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZpc2l0ZWREYXRhLmFkZChkYXRhKTtcblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSAoZGF0YSBhcyBhbnkpW3RoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkXSB8fCBudWxsO1xuXG4gICAgICBsZXQgbm9kZTogT25lUm93Tm9kZSA9IHRoaXMuX29yaWdpbmFsUm93Tm9kZXMuZ2V0KHJvd0lkKTtcblxuICAgICAgdmFsaWRSb3dJZHMuYWRkKHJvd0lkKTtcblxuICAgICAgaWYgKG5vZGUpIHtcblxuICAgICAgICBub2RlLmRhdGEgPSBkYXRhO1xuICAgICAgICBub2RlLnNldFJvd0luZGV4KHRoaXMuX2N1cnJlbnRJbmRleCk7XG5cbiAgICAgICAgLy8gV2hlcmUgYSByb3cgc2l0cyBpcyByZWJ1aWx0LCBub3QgcmVtZW1iZXJlZC4gQSByZXVzZWQgbm9kZSB1c2VkIHRvXG4gICAgICAgIC8vIGtlZXAgdGhlIGxldmVsIGFuZCBwYXJlbnQgaXQgaGFkIHdoZW4gaXQgd2FzIGZpcnN0IGJ1aWx0LCBzbyBhIHJvd1xuICAgICAgICAvLyB0aGF0IGNoYW5nZWQgcGxhY2UgaW4gdGhlIGhpZXJhcmNoeSDigJQgYSBsZWFmIG1vdmVkIHRvIGFub3RoZXJcbiAgICAgICAgLy8gcGFyZW50LCBvciBsaWZ0ZWQgdG8gdGhlIHJvb3Qgd2hlbiB0aGUgZ3JvdXBpbmcgY2hhbmdlZCDigJQga2VwdFxuICAgICAgICAvLyBwb2ludGluZyBhdCBpdHMgb2xkIHBhcmVudCwgYW5kIHRoZSB2aXNpYmlsaXR5IHdhbGsgKHdoaWNoIGNsaW1ic1xuICAgICAgICAvLyBwYXJlbnRzKSBoaWQgaXQgYmVoaW5kIGEgbm9kZSB0aGF0IHdhcyBubyBsb25nZXIgYWJvdmUgaXQuXG4gICAgICAgIG5vZGUubGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbm9kZSA9IG5ldyBPbmVSb3dOb2RlPFQ+KHJvd0lkLCBkYXRhLCB0aGlzLl9jdXJyZW50SW5kZXgpO1xuICAgICAgICBub2RlLmxldmVsID0gbGV2ZWw7XG4gICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50O1xuICAgICAgICBub2RlLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudDtcblxuICAgICAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLnNldChyb3dJZCwgbm9kZSk7XG5cbiAgICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvRGV0YWlsQ2hhbmdlcyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbkV4aXN0ID0gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID49IDA7XG5cbiAgICAgIC8vIENvZXJjZWQsIGJlY2F1c2UgYGNoaWxkcmVuRXhpc3RgIGlzIGBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPj0gMGBcbiAgICAgIC8vIOKAlCB3aGljaCBpcyBgbnVsbGAgZm9yIGEgcm93IHdpdGggbm8gY2hpbGRyZW4gZmllbGQsIG5vdCBgZmFsc2VgLiBUaGVzZVxuICAgICAgLy8gYXJlIGRlY2xhcmVkIGBib29sZWFuYCwgYW5kIGFzc2lnbmluZyBudWxsIG1hZGUgZXZlcnkgY29uc3VtZXIgY29tcGFyZVxuICAgICAgLy8gdHJ1dGhpbmVzcyBpbnN0ZWFkIG9mIHRoZSB2YWx1ZS5cbiAgICAgIG5vZGUuZ3JvdXAgPSB0aGlzLm1hc3RlckRldGFpbCA/IGZhbHNlIDogISFjaGlsZHJlbkV4aXN0O1xuICAgICAgbm9kZS5sZWFmID0gdGhpcy5tYXN0ZXJEZXRhaWwgPyB0cnVlIDogIW5vZGUuZ3JvdXA7XG4gICAgICBub2RlLmxlYWZHcm91cCA9IHRoaXMubWFzdGVyRGV0YWlsID8gZmFsc2UgOiAobm9kZS5ncm91cCAmJiAhY2hpbGRyZW5FeGlzdCk7XG4gICAgICBub2RlLmV4cGFuZGFibGUgPSB0aGlzLm1hc3RlckRldGFpbCA/IHRydWUgOiAobm9kZS5ncm91cCAmJiAhbm9kZS5sZWFmR3JvdXApO1xuXG4gICAgICBjb25zdCBkZWZhdWx0RXhwYW5kZWQgPSBub2RlLmV4cGFuZGFibGUgJiYgKGxldmVsIDwgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCB8fCB0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkID09PSAtMSk7XG5cbiAgICAgIG5vZGUuc2V0RXhwYW5kZWQoZXhwYW5kZWRJZHMuaGFzKHJvd0lkKSA/IHRydWUgOiBjb2xsYXBzZWRJZHMuaGFzKHJvd0lkKSA/IGZhbHNlIDogZGVmYXVsdEV4cGFuZGVkKTtcbiAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoc2VsZWN0ZWRJZHMuaGFzKHJvd0lkKSk7XG4gICAgICBub2RlLnNldENlbGxTdGF0ZXModGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZSkpO1xuXG4gICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwgJiYgdGhpcy5fYXBpVHlwZSA9PT0gJ21hc3RlcicpIHtcblxuICAgICAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhKHsgZGF0YSwgbm9kZTogbm9kZSwgc3VjY2Vzc0NhbGxiYWNrOiAoZGV0YWlsUm93RGF0YSkgPT4gbm9kZS5zZXREZXRhaWxSb3dEYXRhKGRldGFpbFJvd0RhdGEpIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jdXJyZW50SW5kZXgrKztcbiAgICAgIHRoaXMuX3Jvd05vZGVzLnB1c2gobm9kZSk7XG5cbiAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG5cbiAgICAgIG5vZGUuY2hpbGRyZW4gPSB0aGlzLnRyZWVEYXRhICYmIGNoaWxkcmVuRXhpc3QgPyB0aGlzLmJ1aWxkUm93Tm9kZXMoY2hpbGRyZW4gfHwgW10sIG5vZGUsIGxldmVsICsgMSwgdmFsaWRSb3dJZHMsIGV4cGFuZGVkSWRzLCBjb2xsYXBzZWRJZHMsIHNlbGVjdGVkSWRzLCB2aXNpdGVkRGF0YSkgOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZXM7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIEZlYXR1cmVcbiAgICovXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2FjdGl2ZUZpbHRlcnM7XG5cbiAgICBjb25zdCBxdWljayA9IHRoaXMuX3F1aWNrRmlsdGVyVmFsdWU/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG5cbiAgICAvLyBUaGUgZmllbGRzIHRoZSBncmlkIGFjdHVhbGx5IHNob3dzLiBXaXRob3V0IHRoZW0gdGhlIHF1aWNrIGZpbHRlciBmYWxsc1xuICAgIC8vIGJhY2sgdG8gZXZlcnkgcHJvcGVydHkgb24gdGhlIHJvdywgd2hpY2ggbGV0cyBhIHVzZXIgbWF0Y2ggb24gZGF0YSB0aGF0XG4gICAgLy8gaGFzIG5vIGNvbHVtbiBhbmQgbmV2ZXIgYXBwZWFycyBvbiBzY3JlZW4uXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5xdWlja0ZpbHRlckZpZWxkcygpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaChub2RlID0+IGZpbHRlclRyZWVOb2RlKG5vZGUsIGZpbHRlcnMsIHF1aWNrLCBmaWVsZHMpKTtcblxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIGZpZWxkcyB0aGUgcXVpY2sgZmlsdGVyIHNlYXJjaGVzOiBldmVyeSBjb2x1bW4gdGhhdCBoYXMgb25lLlxuICAgKlxuICAgKiBFbXB0eSB3aGlsZSB0aGUgY29sdW1ucyBhcmUgc3RpbGwgYmVpbmcgcmVnaXN0ZXJlZCwgaW4gd2hpY2ggY2FzZSB0aGVcbiAgICogaGVscGVyIGZhbGxzIGJhY2sgdG8gc2VhcmNoaW5nIHRoZSByb3cg4oCUIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBiZWZvcmUsIGFuZFxuICAgKiB0aGUgb25seSBzZW5zaWJsZSBhbnN3ZXIgd2hlbiB0aGUgZ3JpZCBkb2VzIG5vdCB5ZXQga25vdyBpdHMgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgcXVpY2tGaWx0ZXJGaWVsZHMoKTogc3RyaW5nW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZVxuICAgICAgLmdldENvbHVtblN0YXRlKClcbiAgICAgIC5jb2x1bW5zXG4gICAgICAubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQgYXMgc3RyaW5nKVxuICAgICAgLmZpbHRlcigoZmllbGQpOiBmaWVsZCBpcyBzdHJpbmcgPT4gISFmaWVsZCAmJiBmaWVsZCAhPT0gJ19vbmVSb3dOdW1iZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgUm93IE5vZGVzIERpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaFZpc2libGVOb2RlcyhkaXNwYXRjaDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHZpc2libGVOb2RlczogT25lUm93Tm9kZVtdID0gW107XG5cbiAgICBsZXQgcm93TnVtYmVyID0gMTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Jvd05vZGVzKSB7XG5cbiAgICAgIGNvbnN0IHBhcmVudFZpc2libGUgPSBub2RlLnBhcmVudCA/IHZpc2liaWxpdHlDYWNoZS5nZXQobm9kZS5wYXJlbnQucm93SWQpIDogdHJ1ZTtcblxuICAgICAgY29uc3QgaXNWaXNpYmxlID0gbm9kZS52aXNpYmxlICYmIHBhcmVudFZpc2libGUgJiYgKCFub2RlLnBhcmVudCB8fCBub2RlLnBhcmVudC5leHBhbmRlZCk7XG5cbiAgICAgIHZpc2liaWxpdHlDYWNoZS5zZXQobm9kZS5yb3dJZCwgaXNWaXNpYmxlKTtcblxuICAgICAgaWYgKGlzVmlzaWJsZSkge1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlc1snX29uZVJvd051bWJlciddID0geyB0eXBlOiAndGV4dCcsIHZhbHVlOiByb3dOdW1iZXIrKyB9O1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG5cbiAgICAgICAgdmlzaWJsZU5vZGVzLnB1c2gobm9kZSk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbm9kZS5jZWxsU3RhdGVzWydfb25lUm93TnVtYmVyJ10gPSB7IHR5cGU6ICdub25lJywgdmFsdWU6IG51bGwgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl92aXNpYmxlUm93Tm9kZXMgPSBbLi4udmlzaWJsZU5vZGVzXTtcblxuICAgIGlmIChkaXNwYXRjaCkgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgncm93RGF0YUNoYW5nZWQnLCB7IG5vZGVzOiB2aXNpYmxlTm9kZXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgcm93cyBhbmNob3JlZCB0byBvbmUgZWRnZSBvZiB0aGUgZ3JpZC5cbiAgICpcbiAgICogUGlubmVkIHJvd3MgYXJlIGRlbGliZXJhdGVseSBrZXB0IG91dCBvZiBgcm93Tm9kZXNgIGFuZFxuICAgKiBgX29yaWdpbmFsUm93Tm9kZXNgOiB0aGV5IGFyZSBub3QgZGF0YS4gU29ydGluZywgZmlsdGVyaW5nLCBzZWxlY3Rpb24sXG4gICAqIGV4cGFuc2lvbiwgcGFnaW5hdGlvbiBhbmQgdGhlIHZpc2libGUgcm93IGNvdW50IGFsbCBpZ25vcmUgdGhlbSwgd2hpY2ggaXNcbiAgICogdGhlIHdob2xlIHBvaW50IG9mIGEgc3VtbWFyeSByb3cuIFRoZXkgcmVuZGVyIHdpdGggdGhlIHNhbWUgY29sdW1uXG4gICAqIGRlZmluaXRpb25zLCBzbyByZW5kZXJlcnMgYW5kIHZhbHVlIGdldHRlcnMgd29yayBhcyB0aGV5IGRvIGV2ZXJ5d2hlcmVcbiAgICogZWxzZS5cbiAgICovXG4gIHB1YmxpYyBzZXRQaW5uZWRSb3dEYXRhKHNpZGU6IE9uZVBpbm5lZFJvd1NpZGUsIHJvd0RhdGE6IFRbXSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdKSBub2RlLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdID0gKHJvd0RhdGEgPz8gW10pLm1hcCgoZGF0YSwgaW5kZXgpID0+IHtcblxuICAgICAgLy8gSWRzIGFyZSBuYW1lc3BhY2VkIGJ5IHNpZGUgYW5kIHBvc2l0aW9uLiBUaGV5IG5ldmVyIGNvbGxpZGUgd2l0aCBhIGRhdGFcbiAgICAgIC8vIHJvdydzIGlkLCBhbmQgdGhleSBhcmUgc3RhYmxlIGFjcm9zcyByZWJ1aWxkcywgd2hpY2gga2VlcHMgdGhlIHJlbmRlcmVkXG4gICAgICAvLyBgZGF0YS1jZWxsLWlkYCBhdHRyaWJ1dGVzIHN0YWJsZSB0b28uXG4gICAgICBjb25zdCBub2RlID0gbmV3IE9uZVJvd05vZGU8VD4oYG9uZS1waW5uZWQtJHtzaWRlfS0ke2luZGV4fWAsIGRhdGEsIGluZGV4KTtcblxuICAgICAgbm9kZS5sZXZlbCA9IDA7XG4gICAgICBub2RlLmxlYWYgPSB0cnVlO1xuICAgICAgbm9kZS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIG5vZGUuc2V0Q2VsbFN0YXRlcyh0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlKSk7XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgncGlubmVkUm93RGF0YUNoYW5nZWQnLCB7XG4gICAgICBzaWRlLFxuICAgICAgbm9kZXM6IHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSByb3dzIGFuY2hvcmVkIHRvIG9uZSBlZGdlLiBSZWFkLW9ubHk7IGNoYW5nZSB0aGVtIHdpdGggYHNldFBpbm5lZFJvd0RhdGFgLiAqL1xuICBwdWJsaWMgZ2V0UGlubmVkUm93Tm9kZXMoc2lkZTogT25lUGlubmVkUm93U2lkZSk6IHJlYWRvbmx5IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fcGlubmVkUm93Tm9kZXNbc2lkZV07XG4gIH1cblxuICAvKipcbiAgICogUm93IHJlb3JkZXJpbmdcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICpcbiAgICogYF9vcmlnaW5hbFJvd05vZGVzYCBpcyB0aGUgc291cmNlIG9mIHRydXRoIGZvciByb3cgb3JkZXI6IGl0cyBpbnNlcnRpb25cbiAgICogb3JkZXIgaXMgd2hhdCBgYXBwbHlTb3J0aW5nYCBmYWxscyBiYWNrIHRvIHdoZW4gdGhlIHNvcnQgbW9kZWwgZW1wdGllcywgYW5kXG4gICAqIHdoYXQgYSByZWJ1aWxkIHdhbGtzLiBgX3Jvd05vZGVzYCBpcyBvbmx5IHRoZSBjdXJyZW50IGRpc3BsYXkgb3JkZXIuIEEgbW92ZVxuICAgKiB0aGF0IHRvdWNoZWQgb25lIGFuZCBub3QgdGhlIG90aGVyIHdvdWxkIGVpdGhlciBiZSB1bmRvbmUgYnkgdGhlIG5leHQgc29ydFxuICAgKiBjaGFuZ2Ugb3IgaW52aXNpYmxlIHVudGlsIG9uZSBoYXBwZW5lZCwgc28gYm90aCBhcmUgcmV3cml0dGVuIHRvZ2V0aGVyLlxuICAgKi9cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGlzcGxheWVkIG9yZGVyIGlzIHRoZSBkYXRhIG9yZGVyLCBhbmQgc28gd2hldGhlciBhIG1hbnVhbCBtb3ZlXG4gICAqIHdvdWxkIHN1cnZpdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSByZWFzb24gcmVvcmRlcmluZyBpcyB1bmF2YWlsYWJsZSwgb3IgYG51bGxgIHdoZW4gaXQgaXMgZmluZS5cbiAgICovXG4gIHB1YmxpYyBnZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbigpOiBPbmVSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbiB8IG51bGwge1xuXG4gICAgaWYgKHRoaXMudHJlZURhdGEpIHJldHVybiAndHJlZURhdGEnO1xuXG4gICAgaWYgKHRoaXMuX3NvcnRNb2RlbC5sZW5ndGggPiAwKSByZXR1cm4gJ3NvcnRlZCc7XG5cbiAgICBpZiAoaXNGaWx0ZXJBY3RpdmUodGhpcy5fYWN0aXZlRmlsdGVycywgdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZSA/PyAnJykpIHJldHVybiAnZmlsdGVyZWQnO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQ29udmVuaWVuY2UgaW52ZXJzZSBvZiB7QGxpbmsgZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb259LiAqL1xuICBwdWJsaWMgY2FuUmVvcmRlclJvd3MoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbigpID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSByb3cgZnJvbSBvbmUgcG9zaXRpb24gdG8gYW5vdGhlci5cbiAgICpcbiAgICogSW5kaWNlcyBhcmUgcG9zaXRpb25zIGluIHRoZSBncmlkJ3Mgcm93IG9yZGVyLCB0aGUgc2FtZSBvcmRlclxuICAgKiBgZ2V0QWxsUm93Tm9kZXMoKWAgcmV0dXJucy4gYHRhcmdldEluZGV4YCBpcyB3aGVyZSB0aGUgcm93IGVuZHMgdXAgKmFmdGVyKlxuICAgKiBpdCBoYXMgYmVlbiBsaWZ0ZWQgb3V0IG9mIGBzb3VyY2VJbmRleGAg4oCUIGRyYWdnaW5nIHJvdyAwIHRvIHRoZSBib3R0b20gb2YgYVxuICAgKiA1LXJvdyBncmlkIGlzIGBtb3ZlUm93KDAsIDQpYCwgbm90IGBtb3ZlUm93KDAsIDUpYC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByb3dzIG1vdmVkLiBgZmFsc2VgIHdoZW4gdGhlIG1vdmUgd2FzIHJlamVjdGVkIOKAlFxuICAgKiAgICAgICAgICBvdXQtb2YtcmFuZ2UgaW5kaWNlcywgYSBuby1vcCwgb3IgYW4gb3JkZXIgdGhlIGdyaWQgZG9lcyBub3Qgb3duXG4gICAqICAgICAgICAgIChzZWUge0BsaW5rIGdldFJvd0RyYWdTdXBwcmVzc2VkUmVhc29ufSkg4oCUIHNvIGEgY2FsbGVyIGNhbiB0ZWxsIGFcbiAgICogICAgICAgICAgcmVmdXNlZCBtb3ZlIGZyb20gYW4gYXBwbGllZCBvbmUuXG4gICAqL1xuICBwdWJsaWMgbW92ZVJvdyhzb3VyY2VJbmRleDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuY2FuUmVvcmRlclJvd3MoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgb3JkZXIgPSBbLi4udGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy52YWx1ZXMoKV07XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc291cmNlSW5kZXgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHRhcmdldEluZGV4KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNvdXJjZUluZGV4IDwgMCB8fCBzb3VyY2VJbmRleCA+PSBvcmRlci5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YXJnZXRJbmRleCA8IDAgfHwgdGFyZ2V0SW5kZXggPj0gb3JkZXIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoc291cmNlSW5kZXggPT09IHRhcmdldEluZGV4KSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBbbW92ZWRdID0gb3JkZXIuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcblxuICAgIG9yZGVyLnNwbGljZSh0YXJnZXRJbmRleCwgMCwgbW92ZWQpO1xuXG4gICAgLy8gUmVidWlsdCByYXRoZXIgdGhhbiBtdXRhdGVkOiBhIE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyLCBhbmQgdGhlcmVcbiAgICAvLyBpcyBubyB3YXkgdG8gcmVwb3NpdGlvbiBhIGtleSB3aXRoaW4gb25lLlxuICAgIHRoaXMuX29yaWdpbmFsUm93Tm9kZXMgPSBuZXcgTWFwKG9yZGVyLm1hcChub2RlID0+IFtub2RlLnJvd0lkLCBub2RlXSkpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMgPSBvcmRlcjtcblxuICAgIHRoaXMucmVpbmRleFJvd3MoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3Jvd09yZGVyQ2hhbmdlZCcsIHsgbm9kZXM6IHRoaXMuX3Zpc2libGVSb3dOb2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10sIG5vZGU6IG1vdmVkLCBmcm9tSW5kZXg6IHNvdXJjZUluZGV4LCB0b0luZGV4OiB0YXJnZXRJbmRleCB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSByb3cgaWRlbnRpZmllZCBieSBpZC4gQ29udmVuaWVudCB3aGVuIHRoZSBjYWxsZXIgaG9sZHMgYSBub2RlIHJhdGhlclxuICAgKiB0aGFuIGEgcG9zaXRpb24g4oCUIHRoZSBpbmRleCBpdCB3YXMgYnVpbHQgd2l0aCBnb2VzIHN0YWxlIGFmdGVyIGFueSBtb3ZlLlxuICAgKi9cbiAgcHVibGljIG1vdmVSb3dCeUlkKHJvd0lkOiBzdHJpbmcsIHRhcmdldEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcblxuICAgIGNvbnN0IHNvdXJjZUluZGV4ID0gWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldLmZpbmRJbmRleChub2RlID0+IG5vZGUucm93SWQgPT09IHJvd0lkKTtcblxuICAgIHJldHVybiBzb3VyY2VJbmRleCA9PT0gLTEgPyBmYWxzZSA6IHRoaXMubW92ZVJvdyhzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXN0YW1wIGByb3dJbmRleGAgZnJvbSB0aGUgY3VycmVudCBvcmRlci5cbiAgICpcbiAgICogUm93IGluZGV4IGlzIGRlbm9ybWFsaXNlZCBvbnRvIGV2ZXJ5IG5vZGUsIGFuZCBoYWxmIHRoZSBncmlkIHJlYWRzIGl0IOKAlFxuICAgKiBjZWxsIHBhcmFtcywgdGhlIHJhbmdlIHNlbGVjdGlvbiwgdGhlIGRldGFpbCBsb29rdXAuIExlYXZpbmcgaXQgc3RhbGUgYWZ0ZXJcbiAgICogYSBtb3ZlIHB1dHMgZXZlcnkgcm93IGJlbG93IHRoZSBkcm9wIHBvaW50IG9uZSBvdXQuXG4gICAqL1xuICBwcml2YXRlIHJlaW5kZXhSb3dzKCk6IHZvaWQge1xuXG4gICAgdGhpcy5fcm93Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IG5vZGUuc2V0Um93SW5kZXgoaW5kZXgpKTtcblxuICAgIC8vIFNpbGVudDogcm93IG51bWJlcnMgYW5kIHRoZSB2aXNpYmxlIGxpc3QgaGF2ZSB0byBiZSByZWJ1aWx0LCBidXQgdGhlXG4gICAgLy8gYHJvd0RhdGFDaGFuZ2VkYCB0aGF0IG5vcm1hbGx5IGZvbGxvd3MgZGVmZXJzIGEgZnJhbWUgYW5kIHJlLXNlZWRzIGRldGFpbFxuICAgIC8vIHJvd3MuIEEga2V5Ym9hcmQgZHJhZyBmaXJlcyBvbmUgb2YgdGhlc2UgcGVyIGFycm93IGtleSwgYW5kIGBtb3ZlUm93YFxuICAgIC8vIGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCBgcm93T3JkZXJDaGFuZ2VkYCBpbnN0ZWFkLlxuICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcyhmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzaWJsZVJvd05vZGVzKCk6IE9uZVJvd05vZGU8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZVJvd05vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRpbmcgTW9kZWwgRmVhdHVyZVxuICAgKi9cbiAgcHVibGljIG9uU29ydENoYW5nZWQoc29ydE1vZGVsOiBPbmVTb3J0TW9kZWw8VD5bXSkge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fc29ydE1vZGVsID0gc29ydE1vZGVsO1xuXG4gICAgdGhpcy5hcHBseVNvcnRpbmcoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NvcnRDaGFuZ2VkJywgeyBub2RlczogdGhpcy5fcm93Tm9kZXMsIHNvcnRNb2RlbDogdGhpcy5fc29ydE1vZGVsIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNvcnRpbmcoKTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5fc29ydE1vZGVsLmxlbmd0aCA9PT0gMCkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBhcmF0b3IgPSAoYTogT25lUm93Tm9kZTxUPiwgYjogT25lUm93Tm9kZTxUPik6IG51bWJlciA9PiB7XG5cbiAgICAgIGZvciAoY29uc3Qgc29ydEl0ZW0gb2YgdGhpcy5fc29ydE1vZGVsKSB7XG5cbiAgICAgICAgY29uc3QgeyBjb2xJZCwgc29ydCB9ID0gc29ydEl0ZW07XG4gICAgICAgIGNvbnN0IHZhbEEgPSBnZXRGaWVsZFZhbHVlKGEuZGF0YSwgY29sSWQgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgdmFsQiA9IGdldEZpZWxkVmFsdWUoYi5kYXRhLCBjb2xJZCBhcyBzdHJpbmcpO1xuICAgICAgICBjb25zdCBjb21wYXJpc29uUmVzdWx0ID0gdGhpcy5jb21wYXJlVmFsdWVzKHZhbEEsIHZhbEIsIHNvcnQpO1xuXG4gICAgICAgIGlmIChjb21wYXJpc29uUmVzdWx0ICE9PSAwKSB7XG5cbiAgICAgICAgICByZXR1cm4gY29tcGFyaXNvblJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfTtcblxuICAgIGlmICghdGhpcy50cmVlRGF0YSkge1xuXG4gICAgICB0aGlzLl9yb3dOb2RlcyA9IFsuLi50aGlzLl9vcmlnaW5hbFJvd05vZGVzLnZhbHVlcygpXS5zb3J0KGNvbXBhcmF0b3IpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSB0cmVlIHNvcnRzIHNpYmxpbmdzIHdpdGhpbiB0aGVpciBwYXJlbnQsIG5ldmVyIGFjcm9zcyBpdCDigJQgYSBmbGF0XG4gICAgLy8gc29ydCBvZiB0aGUgd2hvbGUgbGlzdCBpbnRlcmxlYXZlZCBwYXJlbnRzIHdpdGggb3RoZXIgcGFyZW50cycgY2hpbGRyZW5cbiAgICAvLyBhbmQgc2NyYW1ibGVkIHRoZSBoaWVyYXJjaHkuIFNvcnRpbmcgdGhlIHNpYmxpbmcgYXJyYXlzIGFuZCByZS13YWxraW5nXG4gICAgLy8gZGVwdGgtZmlyc3Qga2VlcHMgZXZlcnkgcGFyZW50IGltbWVkaWF0ZWx5IGFib3ZlIGl0cyBvd24gY2hpbGRyZW4sXG4gICAgLy8gd2hpY2ggYHJlZnJlc2hWaXNpYmxlTm9kZXNgIGFsc28gZGVwZW5kcyBvbiBmb3IgaXRzIHZpc2liaWxpdHkgY2FjaGUuXG4gICAgLy8gR3JvdXAgcm93cyBjYXJyeSB0aGVpciBhZ2dyZWdhdGVzIGluIGBkYXRhYCwgc28gc29ydGluZyBhIGdyb3VwZWQgZ3JpZFxuICAgIC8vIG9uIGFuIGFnZ3JlZ2F0ZWQgY29sdW1uIG9yZGVycyB0aGUgZ3JvdXBzIGJ5IHRoZWlyIGFnZ3JlZ2F0ZS5cbiAgICBjb25zdCBmbGF0dGVuZWQ6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gICAgY29uc3Qgd2FsayA9IChzaWJsaW5nczogT25lUm93Tm9kZTxUPltdKTogT25lUm93Tm9kZTxUPltdID0+IHtcblxuICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnNpYmxpbmdzXS5zb3J0KGNvbXBhcmF0b3IpO1xuXG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygc29ydGVkKSB7XG5cbiAgICAgICAgZmxhdHRlbmVkLnB1c2gobm9kZSk7XG5cbiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xuXG4gICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IHdhbGsobm9kZS5jaGlsZHJlbiBhcyBPbmVSb3dOb2RlPFQ+W10pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgfTtcblxuICAgIHdhbGsoWy4uLnRoaXMuX29yaWdpbmFsUm93Tm9kZXMudmFsdWVzKCldLmZpbHRlcihub2RlID0+ICFub2RlLnBhcmVudCkpO1xuXG4gICAgdGhpcy5fcm93Tm9kZXMgPSBmbGF0dGVuZWQ7XG4gIH1cblxuICBwcml2YXRlIGNvbXBhcmVWYWx1ZXModmFsQTogYW55LCB2YWxCOiBhbnksIHNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnKTogbnVtYmVyIHtcblxuICAgIC8vIGB1bmRlZmluZWRgIGhhcyB0byBiZSB0cmVhdGVkIGFzIGVtcHR5IGFsb25nc2lkZSBgbnVsbGA6IGdldEZpZWxkVmFsdWVcbiAgICAvLyByZXR1cm5zIHVuZGVmaW5lZCBmb3IgYSBtaXNzaW5nIGZpZWxkIG9yIGFuIHVucmVzb2x2ZWQgZG90dGVkIHBhdGgsIGFuZFxuICAgIC8vIGNvbXBhcmluZyB1bmRlZmluZWQgd2l0aCA8IC8gPiB5aWVsZHMgZmFsc2UgYm90aCB3YXlzLCB3aGljaCBtYWRlIHN1Y2hcbiAgICAvLyByb3dzIHNldHRsZSBpbiB3aGF0ZXZlciBvcmRlciB0aGUgc29ydCBoYXBwZW5lZCB0byBlbmNvdW50ZXIgdGhlbS5cbiAgICBjb25zdCBhRW1wdHkgPSB2YWxBID09PSBudWxsIHx8IHZhbEEgPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiRW1wdHkgPSB2YWxCID09PSBudWxsIHx8IHZhbEIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChhRW1wdHkgJiYgYkVtcHR5KSByZXR1cm4gMDtcbiAgICBpZiAoYUVtcHR5KSByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgaWYgKGJFbXB0eSkgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gLTEgOiAxO1xuXG4gICAgaWYgKHR5cGVvZiB2YWxBID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsQiA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgY29uc3QgY29tcGFyaXNvbiA9IHZhbEEubG9jYWxlQ29tcGFyZSh2YWxCLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IGNvbXBhcmlzb24gOiAtY29tcGFyaXNvbjtcbiAgICB9XG5cbiAgICBpZiAodmFsQSA8IHZhbEIpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcbiAgICBpZiAodmFsQSA+IHZhbEIpIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3cgU2VsZWN0aW9uIEZlYXR1cmUgKE9wdGltaXplZClcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RBbGwoKTogdm9pZCB7XG5cbiAgICBjb25zdCByb3dJZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmZvckVhY2gobm9kZSA9PiB7XG5cbiAgICAgIG5vZGUuc2V0U2VsZWN0ZWQodHJ1ZSk7XG5cbiAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG5cbiAgICAgIHJvd0lkcy5wdXNoKG5vZGUucm93SWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEFsbChyb3dJZHMpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc2VsZWN0aW9uQ2hhbmdlZCcsIHsgYWxsTm9kZXNOb3RTZWxlY3RlZDogZmFsc2UsIGFsbE5vZGVzU2VsZWN0ZWQ6IHRydWUsIHNlbGVjdGVkOiB0cnVlLCBub2RlOiBudWxsIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0IGFsbCBub2RlcyAob3B0aW1pemVkKVxuICAgKi9cbiAgcHVibGljIGRlc2VsZWN0QWxsKCk6IHZvaWQge1xuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuXG4gICAgICBub2RlLnNldFNlbGVjdGVkKGZhbHNlKTtcblxuICAgICAgbm9kZS5jZWxsU3RhdGVzID0geyAuLi5ub2RlLmNlbGxTdGF0ZXMgfTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3Rpb25Nb2RlKCkgPT09ICdtdWx0aXBsZScpIHtcblxuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc2VsZWN0aW9uQ2hhbmdlZCcsIHtcbiAgICAgICAgYWxsTm9kZXNOb3RTZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgYWxsTm9kZXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgbm9kZTogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBvciBkZXNlbGVjdCBvbmUgcm93LCBob25vdXJpbmcgdGhlIGdyaWQncyBzZWxlY3Rpb24gbW9kZS5cbiAgICpcbiAgICogVGhlIG1vZGUgcnVsZSB1c2VkIHRvIGxpdmUgaW4gdGhlIGNoZWNrYm94IGNvbXBvbmVudCwgd2hpY2ggbWVhbnQgdGhlIG9ubHlcbiAgICogd2F5IHRvIHNlbGVjdCBhIHJvdyB3YXMgdG8gY2xpY2sgdGhhdCBjaGVja2JveCDigJQgYW55dGhpbmcgZWxzZSByZWFjaGluZyBmb3JcbiAgICogYHRvZ2dsZVNlbGVjdGlvbmAgZ290IG11bHRpLXNlbGVjdCBiZWhhdmlvdXIgb24gYSBzaW5nbGUtc2VsZWN0IGdyaWQuIEl0XG4gICAqIGxpdmVzIGhlcmUgc28gZXZlcnkgcGF0aCBpbnRvIHNlbGVjdGlvbiBvYmV5cyB0aGUgc2FtZSBydWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBgZmFsc2VgIHdoZW4gdGhlIGdyaWQgaGFzIG5vIHNlbGVjdGlvbiBtb2RlLCBzbyBhIGNhbGxlciBjYW4gdGVsbFxuICAgKiAgICAgICAgICBhIHJlZnVzZWQgcmVxdWVzdCBmcm9tIGFuIGFwcGxpZWQgb25lLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVJvd1NlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBzZWxlY3RlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCB8fCAhdGhpcy5fcm93U2VsZWN0aW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFNpbmdsZSBzZWxlY3QgaXMgXCJ0aGlzIHJvdyBhbmQgbm8gb3RoZXJcIiwgd2hpY2ggbWVhbnMgY2xlYXJpbmcgZmlyc3QuXG4gICAgaWYgKHRoaXMuX3Jvd1NlbGVjdGlvbiA9PT0gJ3NpbmdsZScpIHRoaXMuZGVzZWxlY3RBbGwoKTtcblxuICAgIHRoaXMudG9nZ2xlU2VsZWN0aW9uKHJvd0lkLCBzZWxlY3RlZCk7XG5cbiAgICBub2RlLmNlbGxTdGF0ZXMgPSB7IC4uLm5vZGUuY2VsbFN0YXRlcyB9O1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGV2ZXJ5IHJvdyBiZXR3ZWVuIHR3bywgaW5jbHVzaXZlLCBpbiBkaXNwbGF5IG9yZGVyLlxuICAgKlxuICAgKiBXaGF0IGEgc2hpZnQtZXh0ZW5kZWQga2V5Ym9hcmQgc2VsZWN0aW9uIG5lZWRzLiBNdWx0aS1zZWxlY3Qgb25seSDigJQgYVxuICAgKiBzaW5nbGUtc2VsZWN0IGdyaWQgaGFzIG5vIG1lYW5pbmdmdWwgcmFuZ2UuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0Um93UmFuZ2UoZnJvbVJvd0lkOiBzdHJpbmcsIHRvUm93SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCB8fCB0aGlzLl9yb3dTZWxlY3Rpb24gIT09ICdtdWx0aXBsZScpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5fdmlzaWJsZVJvd05vZGVzLmxlbmd0aCA/IHRoaXMuX3Zpc2libGVSb3dOb2RlcyA6IHRoaXMuX3Jvd05vZGVzO1xuXG4gICAgY29uc3QgZnJvbSA9IG9yZGVyLmZpbmRJbmRleChub2RlID0+IG5vZGUucm93SWQgPT09IGZyb21Sb3dJZCk7XG4gICAgY29uc3QgdG8gPSBvcmRlci5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSB0b1Jvd0lkKTtcblxuICAgIGlmIChmcm9tID09PSAtMSB8fCB0byA9PT0gLTEpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGlkcyA9IG9yZGVyXG4gICAgICAuc2xpY2UoTWF0aC5taW4oZnJvbSwgdG8pLCBNYXRoLm1heChmcm9tLCB0bykgKyAxKVxuICAgICAgLm1hcChub2RlID0+IG5vZGUucm93SWQpO1xuXG4gICAgdGhpcy5zZXRTZWxlY3RlZEJ5SWRzKGlkcywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3Rpb24ocm93SWQ6IHN0cmluZywgc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKHJvd0lkKTtcblxuICAgIGlmIChub2RlKSB7XG5cbiAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpO1xuXG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UudG9nZ2xlU2VsZWN0aW9uKHJvd0lkLCBzZWxlY3RlZCk7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IG5vZGUsIGRhdGE6IG5vZGUuZGF0YSwgc2VsZWN0ZWQgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFNlbGVjdGVkQnlJZChyb3dJZDogc3RyaW5nKSB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSkge1xuXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGlvbk1vZGUoKSA9PT0gJ3NpbmdsZScpIHtcblxuICAgICAgICB0aGlzLl9yb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChyb3dOb2RlLnJvd0lkID09PSBub2RlLnJvd0lkKSk7XG5cbiAgICAgICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChyb3dOb2RlLnJvd0lkID09PSBub2RlLnJvd0lkKSk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbm9kZS5zZXRTZWxlY3RlZCh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ3NlbGVjdGlvbkNoYW5nZWQnLCB7IG5vZGUsIHNlbGVjdGVkOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWxlY3RlZEJ5SWRzKHJvd0lkczogc3RyaW5nW10sIHNlbGVjdGVkOiBib29sZWFuID0gdHJ1ZSkge1xuXG4gICAgcm93SWRzLmZvckVhY2gocm93SWQgPT4ge1xuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgICBpZiAobm9kZSkge1xuXG4gICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpO1xuXG4gICAgICAgIG5vZGUuY2VsbFN0YXRlcyA9IHsgLi4ubm9kZS5jZWxsU3RhdGVzIH07XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnRvZ2dsZVNlbGVjdGlvbihyb3dJZCwgc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnc2VsZWN0aW9uQ2hhbmdlZCcsIHsgbm9kZTogbnVsbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgJiBTZXQgRnVuY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsUm93Tm9kZXMoKTogT25lUm93Tm9kZTxUPltdIHtcblxuICAgIHJldHVybiB0aGlzLl9yb3dOb2Rlcz8ubGVuZ3RoID4gMCA/IFsuLi50aGlzLl9yb3dOb2Rlc10gOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3dEYXRhU2VsZWN0ZWQoKTogVFtdIHtcblxuICAgIHJldHVybiB0aGlzLl9yb3dOb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLnNlbGVjdGVkKS5tYXAobm9kZSA9PiAoeyAuLi5ub2RlLmRhdGEgfSkpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkUm93Tm9kZXMoKTogT25lUm93Tm9kZTxUPltdIHtcblxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fcm93Tm9kZXMuZmlsdGVyKG5vZGUgPT4gbm9kZS5zZWxlY3RlZCk7XG5cbiAgICByZXR1cm4gbm9kZXMgJiYgbm9kZXMubGVuZ3RoID4gMCA/IFsuLi5ub2Rlc10gOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW4gZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlck1vZGVsKCk6IE9uZUZpbHRlck1vZGVsW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0RmlsdGVyTW9kZWwobW9kZWw6IE9uZUZpbHRlck1vZGVsW10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuX2FjdGl2ZUZpbHRlcnMgPSBtb2RlbDtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyQWN0aXZlKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXJzLnNvbWUoZiA9PiBmLmZpZWxkID09PSBmaWVsZCAmJiBmLmNvbmRpdGlvbnMubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogUXVpY2sgZmlsdGVyXG4gICAqL1xuICBwdWJsaWMgc2V0UXVpY2tGaWx0ZXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fcXVpY2tGaWx0ZXJWYWx1ZSA9ICh2YWx1ZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBjb2x1bW4gdmFsaWRhdG9ycyBvdmVyIG9uZSByb3cuXG4gICAqXG4gICAqIFJ1bGVzIHJ1biBpbiBvcmRlciBhbmQgc3RvcCBhdCB0aGUgZmlyc3QgZmFpbHVyZSwgc28gYSBmaWVsZCBhcHBlYXJzIGF0XG4gICAqIG1vc3Qgb25jZS4gRmllbGRzIHRoYXQgcGFzc2VkIGFyZSBhYnNlbnQgcmF0aGVyIHRoYW4gbWFwcGVkIHRvIGBudWxsYC5cbiAgICpcbiAgICogVGhlIHJvdyB0eXBlIGNvbWVzIGZyb20gdGhlIGdyaWQncyBvd24gYFRgIOKAlCB0aGlzIHVzZWQgdG8gZGVjbGFyZSBpdHMgb3duXG4gICAqIGA8VD5gLCB3aGljaCBzaGFkb3dlZCB0aGUgY2xhc3MgcGFyYW1ldGVyIGFuZCBsZXQgYW4gYE9uZUdyaWRBcGk8RW1wbG95ZWU+YFxuICAgKiBoYXBwaWx5IHZhbGlkYXRlIGFuIHVucmVsYXRlZCBzaGFwZSBhZ2FpbnN0IGVtcGxveWVlIGNvbHVtbnMuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVSb3cocm93OiBULCBjb2x1bW5zOiBPbmVDb2x1bW5EZWY8VD5bXSk6IE9uZVJvd1ZhbGlkYXRpb25FcnJvcnM8VD4ge1xuXG4gICAgY29uc3QgZXJyb3JzOiBPbmVSb3dWYWxpZGF0aW9uRXJyb3JzPFQ+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cbiAgICAgIC8vIEEgY29sdW1uIGNhbiBvbmx5IGNvbnRyaWJ1dGUgYW4gZXJyb3IgaWYgaXQgaGFzIGJvdGggcnVsZXMgYW5kIGEgZmllbGRcbiAgICAgIC8vIHRvIGtleSB0aGVtIHVuZGVyLlxuICAgICAgaWYgKCFjb2x1bW4uZmllbGQgfHwgIWNvbHVtbi52YWxpZGF0aW9uUnVsZXM/Lmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjb2x1bW4udmFsaWRhdGlvblJ1bGVzKSB7XG5cbiAgICAgICAgY29uc3QgZXJyb3IgPSBydWxlKHJvd1tjb2x1bW4uZmllbGRdLCByb3cpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuXG4gICAgICAgICAgZXJyb3JzW2NvbHVtbi5maWVsZF0gPSBlcnJvcjtcblxuICAgICAgICAgIGJyZWFrOyAvLyBmaXJzdCBmYWlsdXJlIHBlciBjb2x1bW4gd2luc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGNvbHVtbiB2YWxpZGF0b3JzIG92ZXIgYSB3aG9sZSBkYXRhc2V0LlxuICAgKlxuICAgKiBEZWxlZ2F0ZXMgdG8gYHZhbGlkYXRlUm93YCBzbyB0aGUgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGF0IGNvdW50c1xuICAgKiBhcyBpbnZhbGlkIOKAlCB0aGV5IHByZXZpb3VzbHkgY2FycmllZCBzZXBhcmF0ZSBjb3BpZXMgb2YgdGhlIHNhbWUgbG9vcC5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZUFsbFJvd3Mocm93RGF0YTogVFtdLCBjb2x1bW5zOiBPbmVDb2x1bW5EZWY8VD5bXSk6IE9uZVZhbGlkYXRpb25SZXN1bHQ8VD4ge1xuXG4gICAgY29uc3QgYWxsRXJyb3JzID0gcm93RGF0YS5tYXAocm93ID0+IHRoaXMudmFsaWRhdGVSb3cocm93LCBjb2x1bW5zKSk7XG5cbiAgICBjb25zdCBoYXNFcnJvcnMgPSBhbGxFcnJvcnMuc29tZShlcnJvcnMgPT4gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwKTtcblxuICAgIHJldHVybiB7IGVycm9yczogYWxsRXJyb3JzLCB2YWxpZDogIWhhc0Vycm9ycywgaW52YWxpZDogaGFzRXJyb3JzIH07XG4gIH1cblxuICAvKipcbiAgICogVHJhdmVyc2UgZXZlcnkgbm9kZSwgZGVwdGgtZmlyc3QsIG9uY2UgZWFjaC5cbiAgICpcbiAgICogYHJvd05vZGVzYCBpcyBhbHJlYWR5IHRoZSBmbGF0dGVuZWQgdHJlZSDigJQgYGJ1aWxkUm93Tm9kZXNgIHB1c2hlcyBldmVyeVxuICAgKiBub2RlIGludG8gaXQgYXMgaXQgZGVzY2VuZHMg4oCUIHNvIHdhbGtpbmcgaXQgaXMgdGhlIHdob2xlIHRyYXZlcnNhbC4gVGhlXG4gICAqIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHdhbGtlZCB0aGF0IGZsYXQgbGlzdCAqYW5kKiByZWN1cnNlZCBpbnRvXG4gICAqIGBjaGlsZHJlbmAsIHZpc2l0aW5nIGV2ZXJ5IG5lc3RlZCBub2RlIHR3aWNlIGFuZCBldmVyeSBkZXB0aC0zIG5vZGUgdGhyZWVcbiAgICogdGltZXMuIGBpbmRleGAgaXMgdGhlIG5vZGUncyBwb3NpdGlvbiBpbiB0aGUgZmxhdHRlbmVkIG9yZGVyLCBtYXRjaGluZ1xuICAgKiBgbm9kZS5yb3dJbmRleGAsIHJhdGhlciB0aGFuIGl0cyBwb3NpdGlvbiBhbW9uZyBpdHMgc2libGluZ3MuXG4gICAqL1xuICBwdWJsaWMgZm9yRWFjaE5vZGUoY2FsbGJhY2s6IChub2RlOiBPbmVSb3dOb2RlPFQ+LCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKSB7XG5cbiAgICB0aGlzLl9yb3dOb2Rlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4gY2FsbGJhY2sobm9kZSwgaW5kZXgpKTtcbiAgfVxuXG4gIC8qKiBUcmF2ZXJzZSBvbmx5IGxlYWYgbm9kZXMsIG9uY2UgZWFjaCwgaW4gZmxhdHRlbmVkIG9yZGVyLiAqL1xuICBwdWJsaWMgZm9yRWFjaExlYWZOb2RlKGNhbGxiYWNrOiAobm9kZTogT25lUm93Tm9kZTxUPiwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCkge1xuXG4gICAgbGV0IGxlYWZJbmRleCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5fcm93Tm9kZXMpIHtcblxuICAgICAgaWYgKG5vZGUubGVhZikgY2FsbGJhY2sobm9kZSwgbGVhZkluZGV4KyspO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3dOb2RlQnlJZChyb3dJZDogc3RyaW5nKTogT25lUm93Tm9kZTxUPiB7XG5cbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZC9jb2xsYXBzZSBhIG5vZGVcbiAgICovXG4gIHB1YmxpYyBzZXRUcmVlRGF0YUNoaWxkcmVuRmllbGQoZmllbGQ6IHN0cmluZykge1xuXG4gICAgdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQgPSBmaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRHcm91cERlZmF1bHRFeHBhbmRlZChkZWZhdWx0RXhwYW5kZWQ6IG51bWJlcikge1xuXG4gICAgdGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCA9IGRlZmF1bHRFeHBhbmRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbnNpb24gc3RhdGUgbGl2ZXMgaW4gdHdvIHBsYWNlcywgYW5kIHRoZXkgYW5zd2VyIGRpZmZlcmVudCBxdWVzdGlvbnMuXG4gICAqXG4gICAqIGBPbmVHcmlkRXhwYW5zaW9uU2VydmljZWAgcmVjb3JkcyBvbmx5ICpkZWxpYmVyYXRlKiBjaGFuZ2VzIOKAlCBhIGNsaWNrLCBvclxuICAgKiBvbmUgb2YgdGhlIG1ldGhvZHMgYmVsb3cuIEl0IGlzIGFuIG92ZXJyaWRlIGxheWVyOiBgYnVpbGRSb3dOb2Rlc2AgY29uc3VsdHNcbiAgICogaXQgZmlyc3QgYW5kIGZhbGxzIGJhY2sgdG8gYGdyb3VwRGVmYXVsdEV4cGFuZGVkYCBmb3IgZXZlcnkgcm93IHRoZSB1c2VyXG4gICAqIGhhcyBub3QgdG91Y2hlZC4gVGhhdCBpcyB3aGF0IGxldHMgYSBsYXRlciBgZ3JvdXBEZWZhdWx0RXhwYW5kZWRgIGNoYW5nZVxuICAgKiB0YWtlIGVmZmVjdCwgYW5kIHdoYXQgbGV0cyBhIGNvbGxhcHNlIHN1cnZpdmUgYSByZWJ1aWxkLlxuICAgKlxuICAgKiBgbm9kZS5leHBhbmRlZGAgaXMgdGhlIHJlc29sdmVkIHRydXRoIGZvciBhIHJvdywgZGVmYXVsdHMgaW5jbHVkZWQuIFB1YmxpY1xuICAgKiByZWFkcyByZXBvcnQgdGhhdDsgdGhlIG92ZXJyaWRlIHNldHMgc3RheSBpbnRlcm5hbC5cbiAgICpcbiAgICogVGhlIGludmFyaWFudCB0aGUgc2V0dGVycyBiZWxvdyBtYWludGFpbjogYGV4cGFuZGVkYCBpcyBvbmx5IGV2ZXIgdHJ1ZSBmb3JcbiAgICogYSBub2RlIHRoYXQgY2FuIGV4cGFuZC5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVFeHBhbmRBbGwoZXhwYW5kZWQ6IGJvb2xlYW4pIHtcblxuICAgIHRoaXMuZm9yRWFjaE5vZGUobm9kZSA9PiB7XG5cbiAgICAgIGlmICghbm9kZS5leHBhbmRhYmxlKSByZXR1cm47XG5cbiAgICAgIG5vZGUuc2V0RXhwYW5kZWQoZXhwYW5kZWQpO1xuXG4gICAgICB0aGlzLmV4cGFuc2lvblNlcnZpY2UudG9nZ2xlRXhwYW5kZWQobm9kZS5yb3dJZCwgZXhwYW5kZWQpXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZnJlc2hWaXNpYmxlTm9kZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHBhbmRlZEJ5SWQocm93SWQ6IHN0cmluZywgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmdldChyb3dJZCk7XG5cbiAgICBpZiAobm9kZT8uZXhwYW5kYWJsZSkge1xuXG4gICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTtcblxuICAgICAgdGhpcy5leHBhbnNpb25TZXJ2aWNlLnRvZ2dsZUV4cGFuZGVkKHJvd0lkLCBleHBhbmRlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoVmlzaWJsZU5vZGVzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhwYW5kZWRCeUlkcyhyb3dJZHM6IHN0cmluZ1tdLCBleHBhbmRlZDogYm9vbGVhbikge1xuXG4gICAgaWYgKHJvd0lkcyAmJiByb3dJZHMubGVuZ3RoID4gMCkge1xuXG4gICAgICBmb3IgKGxldCByb3dJZCBvZiByb3dJZHMpIHtcblxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5nZXQocm93SWQpO1xuXG4gICAgICAgIGlmIChub2RlPy5leHBhbmRhYmxlKSB7XG5cbiAgICAgICAgICBub2RlLnNldEV4cGFuZGVkKGV4cGFuZGVkKTtcblxuICAgICAgICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS50b2dnbGVFeHBhbmRlZChyb3dJZCwgZXhwYW5kZWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVmcmVzaFZpc2libGVOb2RlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVyeSBjdXJyZW50bHkgZXhwYW5kZWQgcm93LCBpbiB0cmVlIG9yZGVyLlxuICAgKlxuICAgKiBEZXJpdmVkIGZyb20gdGhlIG5vZGVzIHJhdGhlciB0aGFuIHJlYWQgb2ZmIHRoZSBvdmVycmlkZSByZWNvcmQsIHNvIHJvd3NcbiAgICogb3BlbmVkIGJ5IGBncm91cERlZmF1bHRFeHBhbmRlZGAgYXJlIGluY2x1ZGVkIOKAlCBwcmV2aW91c2x5IHRoaXMgcmV0dXJuZWRcbiAgICogb25seSByb3dzIHNvbWVvbmUgaGFkIGV4cGxpY2l0bHkgdG9nZ2xlZCwgYW5kIGNhbWUgYmFjayBlbXB0eSBvbiBmaXJzdCBsb2FkXG4gICAqIHdoaWxlIHRoZSBmaXJzdCBsZXZlbCB3YXMgdmlzaWJseSBvcGVuLlxuICAgKi9cbiAgcHVibGljIGdldEV4cGFuZGVkQnlJZHMoKTogc3RyaW5nW10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Jvd05vZGVzXG5cbiAgICAgIC5maWx0ZXIobm9kZSA9PiBub2RlLmV4cGFuZGFibGUgJiYgbm9kZS5leHBhbmRlZClcblxuICAgICAgLm1hcChub2RlID0+IG5vZGUucm93SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hc3RlciBEZXRhaWwgRmVhdHVyZVxuICAgKi9cbiAgcHVibGljIHNldERldGFpbFJvd0RhdGEobm9kZTogT25lUm93Tm9kZTxUPiwgZGV0YWlsRGF0YTogYW55W10pIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHJvd05vZGUgPSB0aGlzLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgcm93Tm9kZS5zZXREZXRhaWxSb3dEYXRhKGRldGFpbERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRHZXREZXRhaWxSb3dEYXRhKGdldERldGFpbFJvd0RhdGE6IChwYXJhbXM6IE9uZUdldERldGFpbFJvd0RhdGFQYXJhbXMpID0+IHZvaWQpIHtcblxuICAgIHRoaXMuX2dldERldGFpbFJvd0RhdGEgPSBnZXREZXRhaWxSb3dEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbHVtbnMgU3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5TdGF0ZSgpOiBDb2x1bW5DaGFuZ2VkRXZlbnQge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuICB9XG5cbiAgcHVibGljIHNldENvbHVtbkRlZnMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5zZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnMpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgLy8gQ2VsbCBzdGF0ZSBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbHVtbnMsIHNvIHJlcGxhY2luZyB0aGVtIHdob2xlc2FsZVxuICAgIC8vIHN0YWxlcyBldmVyeSBub2RlIGJ1aWx0IGJlZm9yZSB0aGlzIHJhbi4gVHJlZSBhbmQgZ3JvdXBpbmcgbW9kZSBoaXRcbiAgICAvLyB0aGlzIG9uIGV2ZXJ5IGxvYWQ6IHRoZSBncm91cCBjb2x1bW4gcmVnaXN0ZXJzIGZyb20gYSBkZWZlcnJlZFxuICAgIC8vIHNldENvbHVtbkRlZnMsIGFmdGVyIHRoZSBob3N0IGhhcyB0eXBpY2FsbHkgYWxyZWFkeSBsb2FkZWQgcm93cyDigJRcbiAgICAvLyBob3N0cyB1c2VkIHRvIGhhdmUgdG8gZGVmZXIgc2V0Um93RGF0YSB0aGVtc2VsdmVzIHRvIGRvZGdlIGl0LlxuICAgIHRoaXMucmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29sdW1uKGlkOiBzdHJpbmcsIGNoYW5nZXM6IFBhcnRpYWw8T25lQ29sdW1uRGVmPFQ+Pik6IHZvaWQge1xuXG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy52aXNpYmxlQ29sdW1uRmllbGRzKCk7XG5cbiAgICB0aGlzLmNvbHVtblNlcnZpY2UudXBkYXRlQ29sdW1uRGVmKGlkLCBjaGFuZ2VzKTtcblxuICAgIGNvbnN0IGNvbHVtblN0YXRlID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCk7XG5cbiAgICB0aGlzLmNlbGxTZXJ2aWNlLmFwcGx5Q29sdW1uRGVmcyhjb2x1bW5TdGF0ZS5jb2x1bW5zLCB0aGlzLl9jb250ZXh0KTtcblxuICAgIC8vIE9ubHkgd2hlbiB0aGUgc2V0IG9mIHZpc2libGUgY29sdW1ucyBjaGFuZ2VkIChhIGhpZGUsIGEgc2hvdyk6IGEgY2VsbFxuICAgIC8vIHN0YXRlIGNhbiBhcHBlYXIgb3IgZGlzYXBwZWFyIHRoZW4uIFdpZHRoIHBhdGNoZXMg4oCUIHRoaXMgbWV0aG9kIHJ1bnNcbiAgICAvLyBwZXIgbW91c2Vtb3ZlIGR1cmluZyBhIHJlc2l6ZSDigJQgc2tpcCB0aGUgTyhyb3dzIMOXIGNvbHVtbnMpIHBhc3MuXG4gICAgaWYgKHRoaXMudmlzaWJsZUNvbHVtbkZpZWxkcygpICE9PSBiZWZvcmUpIHRoaXMucmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvKiogVGhlIHZpc2libGUgZmllbGRzIGFzIG9uZSBjb21wYXJhYmxlIGtleS4gKi9cbiAgcHJpdmF0ZSB2aXNpYmxlQ29sdW1uRmllbGRzKCk6IHN0cmluZyB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCkuY29sdW1ucz8ubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQpLmpvaW4oJ3wnKSA/PyAnJztcbiAgfVxuXG4gIC8qKiBSZWNvbXB1dGUgZXZlcnkgbm9kZSdzIGNlbGwgc3RhdGVzIGFnYWluc3QgdGhlIGN1cnJlbnQgY29sdW1ucy4gKi9cbiAgcHJpdmF0ZSByZWdlbmVyYXRlQ2VsbFN0YXRlcygpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJlZnJlc2ggPSAobm9kZTogT25lUm93Tm9kZSkgPT4gbm9kZS5zZXRDZWxsU3RhdGVzKHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGUpKTtcblxuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gocmVmcmVzaCk7XG4gICAgdGhpcy5fcGlubmVkUm93Tm9kZXMudG9wLmZvckVhY2gocmVmcmVzaCk7XG4gICAgdGhpcy5fcGlubmVkUm93Tm9kZXMuYm90dG9tLmZvckVhY2gocmVmcmVzaCk7XG4gIH1cblxuICBwdWJsaWMgcmVvcmRlckNvbHVtbkRlZnMoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgdGhpcy5jb2x1bW5TZXJ2aWNlLnJlb3JkZXJDb2x1bW5EZWZzKGZyb21JbmRleCwgdG9JbmRleCk7XG5cbiAgICBjb25zdCBjb2x1bW5TdGF0ZSA9IHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBSb3cgZ3JvdXBpbmdcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfcm93R3JvdXBGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgX2FnZ0NvbHVtbnM6IE9uZUFnZ0NvbHVtbjxUPltdID0gW107XG5cbiAgLyoqIFRoZSBmaWVsZHMgdGhlIHJvd3MgYXJlIGdyb3VwZWQgYnksIGluIG5lc3Rpbmcgb3JkZXIuIEVtcHR5IHdoZW4gb2ZmLiAqL1xuICBwdWJsaWMgZ2V0IHJvd0dyb3VwRmllbGRzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcblxuICAgIHJldHVybiB0aGlzLl9yb3dHcm91cEZpZWxkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcm91cCB0aGUgcm93cyBieSB0aGVzZSBmaWVsZHMsIGluIG5lc3Rpbmcgb3JkZXIg4oCUIG9yIHVuZ3JvdXAgYnkgcGFzc2luZ1xuICAgKiBhbiBlbXB0eSBhcnJheS5cbiAgICpcbiAgICogYE9uZUdyaWRDb21wb25lbnRgIGNhbGxzIHRoaXMgb25jZSBmb3IgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyB0aGF0XG4gICAqIGRlY2xhcmUgYHJvd0dyb3VwYDsgaG9zdHMgY2FsbCBpdCB0byByZWdyb3VwIGFmdGVyd2FyZHMuIEVpdGhlciB3YXkgdGhlXG4gICAqIGdyaWQgcmUtcGx1bWJzIGl0c2VsZiBhcm91bmQgdGhlIG5ldyBncm91cGluZyDigJQgdHJlZSBtb2RlLCB0aGUgYXV0byBncm91cFxuICAgKiBjb2x1bW4sIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBncm91cGVkLWJ5IGNvbHVtbnMg4oCUIGFuZCBmb2xkcyB0aGUgcm93cyBpdFxuICAgKiBhbHJlYWR5IGhvbGRzIGFnYWluLCBzbyBub3RoaW5nIGhhcyB0byBiZSByZWJvdW5kIGFuZCBubyBncmlkIGhhcyB0byBiZVxuICAgKiB0b3JuIGRvd24gYW5kIHJlLWNyZWF0ZWQgdG8gZ3JvdXAgYnkgYSBkaWZmZXJlbnQgY29sdW1uLlxuICAgKlxuICAgKiBgYWdncmVnYXRpb25zYCBkZWZhdWx0cyB0byB0aGUgYGFnZ0Z1bmNgIGNvbHVtbnMgY3VycmVudGx5IHJlZ2lzdGVyZWQsIHNvXG4gICAqIGBzZXRSb3dHcm91cGluZyhbJ2NvdW50cnknXSlgIGtlZXBzIHRoZSB0b3RhbHMgdGhlIGNvbHVtbiBkZWZpbml0aW9uc1xuICAgKiBhbHJlYWR5IGRlc2NyaWJlLlxuICAgKi9cbiAgcHVibGljIHNldFJvd0dyb3VwaW5nKGdyb3VwRmllbGRzOiBzdHJpbmdbXSwgYWdncmVnYXRpb25zPzogT25lQWdnQ29sdW1uPFQ+W10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fcm93R3JvdXBGaWVsZHM7XG5cbiAgICAvLyBFbXB0eSBmaWVsZHMgYnV5IG5vdGhpbmcgYW5kIGEgcmVwZWF0ZWQgb25lIHdvdWxkIG5lc3QgYSBsZXZlbCB1bmRlclxuICAgIC8vIGl0c2VsZiwgd2hlcmUgZXZlcnkgY2hpbGQgZ3JvdXAgaG9sZHMgdGhlIHdob2xlIHBhcmVudC5cbiAgICBjb25zdCBuZXh0ID0gKGdyb3VwRmllbGRzID8/IFtdKVxuICAgICAgLmZpbHRlcihmaWVsZCA9PiAhIWZpZWxkKVxuICAgICAgLmZpbHRlcigoZmllbGQsIGluZGV4LCBmaWVsZHMpID0+IGZpZWxkcy5pbmRleE9mKGZpZWxkKSA9PT0gaW5kZXgpO1xuXG4gICAgLy8gR3JvdXBpbmcgKmlzKiB0aGUgdHJlZS4gQSBob3N0IHRoYXQgYnJvdWdodCBpdHMgb3duIHRyZWUgZGF0YSwgb3IgYVxuICAgIC8vIG1hc3Rlci9kZXRhaWwgZ3JpZCwgYWxyZWFkeSBoYXMgYSBoaWVyYXJjaHksIGFuZCBmb2xkaW5nIGEgc2Vjb25kIG9uZVxuICAgIC8vIG92ZXIgaXQgd291bGQgdGhyb3cgdGhlIGZpcnN0IGF3YXkuXG4gICAgaWYgKG5leHQubGVuZ3RoICYmICh0aGlzLl9ob3N0VHJlZURhdGEgfHwgdGhpcy5tYXN0ZXJEZXRhaWwpKSB7XG5cbiAgICAgIGNvbnNvbGUud2FybignW29uZS1ncmlkXSBzZXRSb3dHcm91cGluZyBkb2VzIG5vdCBhcHBseSB0byB0cmVlIGRhdGEgb3IgbWFzdGVyL2RldGFpbCBncmlkcyDigJQgdGhleSBjYXJyeSB0aGVpciBvd24gaGllcmFyY2h5LiBOb3RoaW5nIHdhcyBjaGFuZ2VkLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5jaGFuZ2VkID0gbmV4dC5sZW5ndGggPT09IHByZXZpb3VzLmxlbmd0aCAmJiBuZXh0LmV2ZXJ5KChmaWVsZCwgaW5kZXgpID0+IGZpZWxkID09PSBwcmV2aW91c1tpbmRleF0pO1xuXG4gICAgaWYgKHVuY2hhbmdlZCAmJiAhYWdncmVnYXRpb25zKSByZXR1cm47XG5cbiAgICB0aGlzLl9yb3dHcm91cEZpZWxkcyA9IG5leHQ7XG4gICAgdGhpcy5fYWdnQ29sdW1ucyA9IGFnZ3JlZ2F0aW9ucyA/PyBhZ2dDb2x1bW5zPFQ+KHRoaXMuY29sdW1uU2VydmljZS5nZXRBbGxDb2x1bW5EZWZzKCkgYXMgT25lQ29sdW1uRGVmPFQ+W10pO1xuXG4gICAgLy8gVGhlIHJvdyBtb2RlbCdzIGhhbGYgb2YgdGhlIHN3aXRjaDogZ3JvdXBlZCByb3dzIGNhcnJ5IHRoZWlyIGNoaWxkcmVuXG4gICAgLy8gdW5kZXIgdGhlIGdyb3VwaW5nIGhlbHBlcidzIG93biBmaWVsZCwgYW5kIHRoZSB0cmVlIHBpcGVsaW5lIHdhbGtzIHRoZW1cbiAgICAvLyBmcm9tIHRoZXJlLiBVbmdyb3VwaW5nIHB1dHMgYm90aCBiYWNrIOKAlCB3aGljaCBpcyBzYWZlIGJlY2F1c2UgdGhlIGd1YXJkXG4gICAgLy8gYWJvdmUgbWVhbnMgdHJlZSBtb2RlIGNhbiBvbmx5IGhhdmUgY29tZSBmcm9tIGdyb3VwaW5nLlxuICAgIHRoaXMudHJlZURhdGEgPSBuZXh0Lmxlbmd0aCA+IDA7XG4gICAgdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQgPSBuZXh0Lmxlbmd0aCA/IE9ORV9HUk9VUF9DSElMRFJFTl9GSUVMRCA6IG51bGw7XG5cbiAgICAvLyBFdmVyeXRoaW5nIGdyb3VwaW5nIGltcGxpZXMgb3V0c2lkZSB0aGUgcm93IG1vZGVsIOKAlCB0aGUgYXV0byBncm91cFxuICAgIC8vIGNvbHVtbiwgd2hpY2ggb2YgdGhlIGhvc3QncyBjb2x1bW5zIGFyZSBoaWRkZW4sIHRoZSBncmlkIHR5cGUgdGhlIGJvZHlcbiAgICAvLyByZW5kZXJzIOKAlCBiZWxvbmdzIHRvIHRoZSBjb21wb25lbnQgdGhhdCBvd25zIHRoZSB0ZW1wbGF0ZS4gSXQgcmUtcGx1bWJzXG4gICAgLy8gb24gdGhpcyBldmVudCwgc3luY2hyb25vdXNseSwgc28gdGhlIHJlYnVpbGQgYmVsb3cgYWxyZWFkeSBzZWVzIHRoZVxuICAgIC8vIGNvbHVtbnMgdGhlIG5ldyBncm91cGluZyBuZWVkcy5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdyb3dHcm91cGluZ0NoYW5nZWQnLCB7IGdyb3VwRmllbGRzOiBuZXh0LCBwcmV2aW91c0dyb3VwRmllbGRzOiBwcmV2aW91cyB9KTtcblxuICAgIC8vIE5vdGhpbmcgdG8gZm9sZCBiZWZvcmUgdGhlIGZpcnN0IGxvYWQ6IGBzZXRSb3dEYXRhYCB3aWxsIGRvIGl0LlxuICAgIGlmICh0aGlzLl9yb3dOb2Rlcy5sZW5ndGgpIHRoaXMucmVidWlsZFJvd3ModGhpcy5fc291cmNlUm93cywgZmFsc2UpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFVuZG8gLyByZWRvIG9mIGNlbGwgZWRpdHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfdW5kb0xpbWl0ID0gMDtcbiAgcHJpdmF0ZSBfdW5kb1N0YWNrOiB7IHJvd0lkOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfVtdID0gW107XG4gIHByaXZhdGUgX3JlZG9TdGFjazogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTdGFydCByZWNvcmRpbmcgY29tbWl0dGVkIGNlbGwgZWRpdHMgZm9yIHVuZG8vcmVkby4gQ2FsbGVkIGJ5XG4gICAqIGBPbmVHcmlkQ29tcG9uZW50YCBmcm9tIGBbdW5kb1JlZG9DZWxsRWRpdGluZ11gOyB0aGUgc3RhY2sga2VlcHMgdGhlIGxhc3RcbiAgICogYGxpbWl0YCBlZGl0cy4gUHJvZ3JhbW1hdGljIGBzZXREYXRhVmFsdWVgIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkIOKAlCBvbmx5XG4gICAqIGNvbW1pdHMsIHRoZSBvbmVzIHRoYXQgcmFpc2UgYGNlbGxWYWx1ZUNoYW5nZWRgIHdpdGhvdXQgYSBzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlVW5kb1JlZG9DZWxsRWRpdGluZyhsaW1pdDogbnVtYmVyID0gMTApOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl91bmRvTGltaXQgPiAwKSByZXR1cm47XG5cbiAgICB0aGlzLl91bmRvTGltaXQgPSBNYXRoLm1heChNYXRoLmZsb29yKGxpbWl0KSwgMSk7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjZWxsVmFsdWVDaGFuZ2VkJywgKGV2ZW50OiBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgaWYgKGV2ZW50LnNvdXJjZSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLl91bmRvU3RhY2sucHVzaCh7IHJvd0lkOiBldmVudC5ub2RlLnJvd0lkLCBmaWVsZDogZXZlbnQuZmllbGQsIG9sZFZhbHVlOiBldmVudC5vbGRWYWx1ZSwgbmV3VmFsdWU6IGV2ZW50Lm5ld1ZhbHVlIH0pO1xuXG4gICAgICBpZiAodGhpcy5fdW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMuX3VuZG9MaW1pdCkgdGhpcy5fdW5kb1N0YWNrLnNoaWZ0KCk7XG5cbiAgICAgIC8vIEEgbmV3IGVkaXQgZm9ya3MgaGlzdG9yeTsgd2hhdCB3YXMgdW5kb25lIGNhbiBubyBsb25nZXIgYmUgcmVkb25lLlxuICAgICAgdGhpcy5fcmVkb1N0YWNrID0gW107XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV2ZXJ0IHRoZSBtb3N0IHJlY2VudCBjb21taXR0ZWQgZWRpdC4gUmV0dXJucyB3aGV0aGVyIG9uZSB3YXMgdW5kb25lLiAqL1xuICBwdWJsaWMgdW5kb0NlbGxFZGl0aW5nKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMucmVwbGF5RWRpdCh0aGlzLl91bmRvU3RhY2ssIHRoaXMuX3JlZG9TdGFjaywgJ3VuZG8nKTtcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgZWRpdC4gUmV0dXJucyB3aGV0aGVyIG9uZSB3YXMgcmVkb25lLiAqL1xuICBwdWJsaWMgcmVkb0NlbGxFZGl0aW5nKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMucmVwbGF5RWRpdCh0aGlzLl9yZWRvU3RhY2ssIHRoaXMuX3VuZG9TdGFjaywgJ3JlZG8nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50VW5kb1NpemUoKTogbnVtYmVyIHtcblxuICAgIHJldHVybiB0aGlzLl91bmRvU3RhY2subGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRSZWRvU2l6ZSgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlZG9TdGFjay5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHJlcGxheUVkaXQoXG4gICAgZnJvbTogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSxcbiAgICB0bzogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyBvbGRWYWx1ZTogYW55OyBuZXdWYWx1ZTogYW55IH1bXSxcbiAgICBzb3VyY2U6ICd1bmRvJyB8ICdyZWRvJyxcbiAgKTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5fZGVzdHJveWVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBlZGl0ID0gZnJvbS5wb3AoKTtcblxuICAgIGlmICghZWRpdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQoZWRpdC5yb3dJZCk7XG5cbiAgICAvLyBUaGUgcm93IGNhbiBiZSBnb25lIOKAlCBhIHNldFJvd0RhdGEgcmVwbGFjZWQgdGhlIGRhdGEgdW5kZXIgdGhlIHN0YWNrLlxuICAgIC8vIFRoZSBlZGl0IGlzIGRyb3BwZWQgcmF0aGVyIHRoYW4gcmVwbGF5ZWQgb250byBub3RoaW5nLlxuICAgIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2UgPT09ICd1bmRvJyA/IGVkaXQub2xkVmFsdWUgOiBlZGl0Lm5ld1ZhbHVlO1xuICAgIGNvbnN0IHByZXZpb3VzID0gc291cmNlID09PSAndW5kbycgPyBlZGl0Lm5ld1ZhbHVlIDogZWRpdC5vbGRWYWx1ZTtcblxuICAgIChub2RlLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2VkaXQuZmllbGRdID0gdmFsdWU7XG5cbiAgICB0aGlzLnVwZGF0ZUNlbGxTdGF0ZXMobm9kZSk7XG5cbiAgICB0by5wdXNoKGVkaXQpO1xuXG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5TZXJ2aWNlLmdldENvbHVtblN0YXRlKCkuY29sdW1ucz8uZmluZChjb2wgPT4gY29sLmZpZWxkID09PSBlZGl0LmZpZWxkKSA/PyBudWxsO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFZhbHVlQ2hhbmdlZCcsIHtcbiAgICAgIG5vZGUsXG4gICAgICBkYXRhOiBub2RlLmRhdGEsXG4gICAgICBjb2x1bW46IGNvbHVtbiBhcyBPbmVDb2x1bW5EZWY8VD4sXG4gICAgICBmaWVsZDogZWRpdC5maWVsZCxcbiAgICAgIG9sZFZhbHVlOiBwcmV2aW91cyxcbiAgICAgIG5ld1ZhbHVlOiB2YWx1ZSxcbiAgICAgIHNvdXJjZSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENsaWVudC1zaWRlIHBhZ2luYXRpb25cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfY2xpZW50UGFnaW5hdGlvbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wYWdlU2l6ZSA9IDI1O1xuICBwcml2YXRlIF9jdXJyZW50UGFnZSA9IDE7XG5cbiAgLyoqIFRoZSBwYWdpbmcgc3RhdGUsIHdoZW4gdGhlIGdyaWQgcGFnZXMgaXRzIG93biByb3dzLiAqL1xuICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25TdGF0ZSgpOiBSZWFkb25seTx7IGVuYWJsZWQ6IGJvb2xlYW47IHBhZ2VTaXplOiBudW1iZXI7IGN1cnJlbnRQYWdlOiBudW1iZXIgfT4ge1xuXG4gICAgcmV0dXJuIHsgZW5hYmxlZDogdGhpcy5fY2xpZW50UGFnaW5hdGlvbiwgcGFnZVNpemU6IHRoaXMuX3BhZ2VTaXplLCBjdXJyZW50UGFnZTogdGhpcy5fY3VycmVudFBhZ2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJuIGdyaWQtb3duZWQgcGFnaW5nIG9uIG9yIG9mZi4gQ2FsbGVkIGJ5IGBPbmVHcmlkQ29tcG9uZW50YCBmcm9tIGl0c1xuICAgKiBgY2xpZW50U2lkZVBhZ2luYXRpb25gIGlucHV0OyB0aGUgZGlzcGxheSBzbGljZSBpcyB3aGF0IGNoYW5nZXMg4oCUIHRoZVxuICAgKiBmdWxsIGRhdGFzZXQgc3RheXMgYmVoaW5kIHRoZSBBUEkgKHNlbGVjdGlvbiwgZmlsdGVycyBhbmQgc29ydGluZyBrZWVwXG4gICAqIG9wZXJhdGluZyBvbiBhbGwgb2YgaXQpLlxuICAgKi9cbiAgcHVibGljIHNldENsaWVudFNpZGVQYWdpbmF0aW9uKGVuYWJsZWQ6IGJvb2xlYW4sIHBhZ2VTaXplPzogbnVtYmVyKTogdm9pZCB7XG5cbiAgICB0aGlzLl9jbGllbnRQYWdpbmF0aW9uID0gZW5hYmxlZDtcblxuICAgIGlmIChwYWdlU2l6ZSAmJiBwYWdlU2l6ZSA+IDApIHRoaXMuX3BhZ2VTaXplID0gcGFnZVNpemU7XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDE7XG4gIH1cblxuICAvKiogQ2hhbmdlIHRoZSBwYWdlIHNpemUgYW5kIHJldHVybiB0byB0aGUgZmlyc3QgcGFnZS4gKi9cbiAgcHVibGljIHNldFBhZ2VTaXplKHBhZ2VTaXplOiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQgfHwgIShwYWdlU2l6ZSA+IDApKSByZXR1cm47XG5cbiAgICB0aGlzLl9wYWdlU2l6ZSA9IE1hdGguZmxvb3IocGFnZVNpemUpO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gMTtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKiogTW92ZSB0byBhIHBhZ2UgKDEtYmFzZWQpLiBDbGFtcGVkIHRvIGF0IGxlYXN0IDE7IHRoZSB0b3AgZW5kIGNsYW1wcyB3aGVuIHRoZSBzbGljZSBpcyB0YWtlbi4gKi9cbiAgcHVibGljIHNldEN1cnJlbnRQYWdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5tYXgoTWF0aC5mbG9vcihwYWdlKSwgMSk7XG5cbiAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9jdXJyZW50UGFnZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSB0YXJnZXQ7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzbGljZSBvZiByb3dzIHRoZSBjdXJyZW50IHBhZ2Ugc2hvd3Mg4oCUIGEgcGFzc3Rocm91Z2ggd2hpbGUgcGFnaW5nIGlzXG4gICAqIG9mZi4gVGhlIGJvZHkgcm91dGVzIGl0cyByZW5kZXIgbGlzdCB0aHJvdWdoIGhlcmUsIGFmdGVyIHJlcG9ydGluZyB0aGVcbiAgICogZnVsbCBjb3VudCwgc28gYHJvd0NvdW50Q2hhbmdlZGAga2VlcHMgbWVhbmluZyBcInJvd3MgYWZ0ZXIgZmlsdGVyaW5nXCJcbiAgICogd2hldGhlciBvciBub3QgdGhlIGdyaWQgcGFnZXMuXG4gICAqL1xuICBwdWJsaWMgcGFnZU5vZGVzKG5vZGVzOiByZWFkb25seSBPbmVSb3dOb2RlPFQ+W10pOiBPbmVSb3dOb2RlPFQ+W10ge1xuXG4gICAgaWYgKCF0aGlzLl9jbGllbnRQYWdpbmF0aW9uKSByZXR1cm4gKG5vZGVzID8/IFtdKSBhcyBPbmVSb3dOb2RlPFQ+W107XG5cbiAgICBjb25zdCBsYXN0UGFnZSA9IE1hdGgubWF4KE1hdGguY2VpbCgobm9kZXM/Lmxlbmd0aCA/PyAwKSAvIHRoaXMuX3BhZ2VTaXplKSwgMSk7XG5cbiAgICAvLyBBIHNocmlua2luZyBkYXRhc2V0IChhIGZpbHRlciwgYSBkZWxldGUpIGNhbiBzdHJhbmQgdGhlIHBhZ2UgcGFzdCB0aGVcbiAgICAvLyBlbmQ7IGNsYW1waW5nIGhlcmUgc2hvd3MgdGhlIGxhc3QgcGFnZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IG9uZS5cbiAgICBpZiAodGhpcy5fY3VycmVudFBhZ2UgPiBsYXN0UGFnZSkgdGhpcy5fY3VycmVudFBhZ2UgPSBsYXN0UGFnZTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMuX2N1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLl9wYWdlU2l6ZTtcblxuICAgIHJldHVybiAobm9kZXMgPz8gW10pLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMuX3BhZ2VTaXplKSBhcyBPbmVSb3dOb2RlPFQ+W107XG4gIH1cblxuICAvKipcbiAgICogU2l6ZSB0aGUgZmxleCBjb2x1bW5zIGludG8gdGhlIGdpdmVuIHdpZHRoLlxuICAgKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyaWQgYm9keSB3aXRoIGl0cyBvd24gdmlld3BvcnQgd2lkdGgg4oCUIG9uIGZpcnN0IHJlbmRlciwgb25cbiAgICogY29udGFpbmVyIHJlc2l6ZSBhbmQgYWZ0ZXIgY29sdW1uIGNoYW5nZXMg4oCUIHNvIGBjb2x1bW5EZWYuZmxleGAgd29ya3NcbiAgICogd2l0aG91dCB0aGUgaG9zdCBkb2luZyBhbnl0aGluZy4gQWxzbyBjYWxsYWJsZSBkaXJlY3RseSB3aXRoIGFueSB3aWR0aC5cbiAgICogQSBuby1vcCB3aGVuIG5vIHZpc2libGUgY29sdW1uIGRlY2xhcmVzIGBmbGV4YCBvciBub3RoaW5nIHdvdWxkIGNoYW5nZS5cbiAgICovXG4gIHB1YmxpYyBhcHBseUZsZXhXaWR0aHMoYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmNvbHVtblNlcnZpY2UuYXBwbHlGbGV4V2lkdGhzKGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY29sdW1uQ2hhbmdlZCcsIGNvbHVtblN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBncmlkIGFzIENTVjogdmlzaWJsZSBjb2x1bW5zIGluIGRpc3BsYXkgb3JkZXIsIHZpc2libGUgcm93c1xuICAgKiBpbiBjdXJyZW50IHNvcnQgb3JkZXIsIHZhbHVlcyB0aHJvdWdoIHRoZSBzYW1lIGdldHRlci9mb3JtYXR0ZXIgcGlwZWxpbmVcbiAgICogdGhlIGNlbGxzIHJlbmRlciB3aXRoLiBQaW5uZWQgcm93cyBhbmQgZGV0YWlsIGdyaWRzIGFyZSBub3QgZGF0YSBhbmQgYXJlXG4gICAqIG5vdCBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXREYXRhQXNDc3Yob3B0aW9uczogT25lQ3N2RXhwb3J0T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcblxuICAgIGNvbnN0IG5vZGVzID0gb3B0aW9ucy5vbmx5U2VsZWN0ZWQgPyB0aGlzLmdldFNlbGVjdGVkUm93Tm9kZXMoKSA6IHRoaXMuX3Zpc2libGVSb3dOb2RlcztcblxuICAgIHJldHVybiBidWlsZENzdihub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10sIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnMgYXMgT25lQ29sdW1uRGVmPFQ+W10sIHRoaXMuX2NvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBDU1YgYW5kIGhhbmQgaXQgdG8gdGhlIGJyb3dzZXIgYXMgYSBkb3dubG9hZC4gKi9cbiAgcHVibGljIGV4cG9ydERhdGFBc0NzdihvcHRpb25zOiBPbmVDc3ZFeHBvcnRPcHRpb25zID0ge30pOiB2b2lkIHtcblxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3RoaXMuZ2V0RGF0YUFzQ3N2KG9wdGlvbnMpXSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xuXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblxuICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgbGluay5kb3dubG9hZCA9IG9wdGlvbnMuZmlsZU5hbWUgPz8gJ2V4cG9ydC5jc3YnO1xuICAgIGxpbmsuY2xpY2soKTtcblxuICAgIFVSTC5yZXZva2VPYmplY3RVUkwobGluay5ocmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IG9yIGhpZGUgb25lIGNvbHVtbi4gQSBoaWRkZW4gY29sdW1uIGtlZXBzIGl0cyBvcmRlciwgd2lkdGggYW5kIHBpbixcbiAgICogc28gc2hvd2luZyBpdCBhZ2FpbiByZXN0b3JlcyBpdCBleGFjdGx5LlxuICAgKi9cbiAgcHVibGljIHNldENvbHVtblZpc2libGUoaWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuXG4gICAgdGhpcy51cGRhdGVDb2x1bW4oaWQsIHsgaGlkZTogIXZpc2libGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdGFibGUgbGF5b3V0IHN0YXRlOiBvbmUgSlNPTi1zYWZlIGVudHJ5IHBlciBjb2x1bW4g4oCUIGhpZGRlbiBvbmVzXG4gICAqIGluY2x1ZGVkIOKAlCBpbiBkaXNwbGF5IG9yZGVyLiBGZWVkIGl0IGJhY2sgdGhyb3VnaCBgYXBwbHlDb2x1bW5TdGF0ZWAuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uU3RhdGVTbmFwc2hvdCgpOiBPbmVDb2x1bW5TdGF0ZUVudHJ5W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uU2VydmljZS5nZXRDb2x1bW5TdGF0ZVNuYXBzaG90KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIHNuYXBzaG90IGZyb20gYGdldENvbHVtblN0YXRlU25hcHNob3RgOiBvcmRlciwgd2lkdGgsIHBpbiBhbmRcbiAgICogdmlzaWJpbGl0eS4gSWRzIHRoZSBncmlkIG5vIGxvbmdlciBoYXMgYXJlIHNraXBwZWQsIHNvIGEgc3RhbGUgc25hcHNob3RcbiAgICogZGVncmFkZXMgdG8gYSBwYXJ0aWFsIHJlc3RvcmUgcmF0aGVyIHRoYW4gYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgYXBwbHlDb2x1bW5TdGF0ZShlbnRyaWVzOiBPbmVDb2x1bW5TdGF0ZUVudHJ5W10pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHRoaXMuY29sdW1uU2VydmljZS5hcHBseUNvbHVtblN0YXRlKGVudHJpZXMpO1xuXG4gICAgY29uc3QgY29sdW1uU3RhdGUgPSB0aGlzLmNvbHVtblNlcnZpY2UuZ2V0Q29sdW1uU3RhdGUoKTtcblxuICAgIHRoaXMuY2VsbFNlcnZpY2UuYXBwbHlDb2x1bW5EZWZzKGNvbHVtblN0YXRlLmNvbHVtbnMsIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgLy8gQSByZXN0b3JlIGNhbiBzaG93IGNvbHVtbnMgdGhhdCB3ZXJlIGhpZGRlbiB3aGVuIHRoZSByb3dzIHdlcmUgYnVpbHQsXG4gICAgLy8gYW5kIHRoZWlyIGNlbGxzIGhhdmUgbm8gc3RhdGUgeWV0LlxuICAgIHRoaXMucmVnZW5lcmF0ZUNlbGxTdGF0ZXMoKTtcblxuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoJ2NvbHVtbkNoYW5nZWQnLCBjb2x1bW5TdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNoZWNrYm94IHNlbGVjdGlvbiBmZWF0dXJlc1xuICAgKi9cbiAgcHVibGljIHNldE5vZGVBbmRDaGlsZHJlblNlbGVjdGVkKG5vZGU6IE9uZVJvd05vZGUsIHNlbGVjdGVkOiBib29sZWFuKSB7XG5cbiAgICBjb25zdCByb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IGNvbGxlY3QgPSAobjogT25lUm93Tm9kZSkgPT4ge1xuXG4gICAgICByb3dJZHMuYWRkKG4ucm93SWQpO1xuXG4gICAgICBpZiAobi5jaGlsZHJlbiAmJiBuLmNoaWxkcmVuLmxlbmd0aCkge1xuXG4gICAgICAgIG4uY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjb2xsZWN0KGNoaWxkKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbGxlY3Qobm9kZSk7XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkQnlJZHMoQXJyYXkuZnJvbShyb3dJZHMpLCBzZWxlY3RlZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgSWRlbnRpY2FsIHRvIGB1cGRhdGVDZWxsU3RhdGVzYC4gS2VwdCBhcyBhbiBhbGlhcyBzbyBleGlzdGluZ1xuICAgKiBjYWxsZXJzIGtlZXAgd29ya2luZzsgcHJlZmVyIGB1cGRhdGVDZWxsU3RhdGVzYCwgd2hpY2ggc2F5cyB3aGF0IGl0IGRvZXMuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTm9kZVN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKSB7XG5cbiAgICB0aGlzLnVwZGF0ZUNlbGxTdGF0ZXMobm9kZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ2VsbFN0YXRlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogdm9pZCB7XG5cbiAgICBjb25zdCByb3dOb2RlID0gdGhpcy5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIHJvd05vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdID0gdGhpcy5jZWxsU2VydmljZS5nZW5lcmF0ZUNlbGxTdGF0ZShyb3dOb2RlLCBjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGUgZXZlcnkgY2VsbCBvZiBvbmUgcm93IGFuZCByZXBhaW50IGl0LlxuICAgKlxuICAgKiBUaGUgcmVwYWludCBpcyB0aGUgcG9pbnQ6IHRoaXMgaXMgd2hhdCBhIGNhbGxlciByZWFjaGVzIGZvciBhZnRlciBtdXRhdGluZ1xuICAgKiBhIHJvdyBpbiBwbGFjZSwgYW5kIGl0IHVzZWQgdG8gcmVnZW5lcmF0ZSB0aGUgc3RhdGUgYW5kIHN0b3AgdGhlcmUuIFRoZVxuICAgKiBib2R5IHJlbmRlcnMgd2l0aCBPblB1c2gsIHNvIG5vdGhpbmcgbWFya2VkIGl0IGRpcnR5IGFuZCB0aGUgbmV3IHN0YXRlIHNhdFxuICAgKiB1bnJlYWQgdW50aWwgc29tZSB1bnJlbGF0ZWQgZXZlbnQgaGFwcGVuZWQgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIOKAlFxuICAgKiB3aGljaCBpcyB3aHkgY2FsbGVycyBlbmRlZCB1cCBudWRnaW5nIHRoZSBncmlkIHdpdGggYSBzeW50aGV0aWMgRE9NIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNlbGxTdGF0ZXMobm9kZTogT25lUm93Tm9kZSk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93Tm9kZSA9IHRoaXMuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAoIXJvd05vZGUpIHJldHVybjtcblxuICAgIHJvd05vZGUuY2VsbFN0YXRlcyA9IHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKHJvd05vZGUpO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFN0YXRlQ2hhbmdlZCcsIHsgZGF0YTogcm93Tm9kZS5kYXRhLCBub2RlOiByb3dOb2RlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgdGhhdCBSZWFjdHMgdG8gRGV0YWlsIENoYW5nZXNcbiAgICovXG4gIC8qKlxuICAgKiBLZWVwIGEgbWFzdGVyIHJvdydzIHJlc2VydmVkIGhlaWdodCBpbiBzdGVwIHdpdGggaXRzIGRldGFpbCByb3dzLlxuICAgKlxuICAgKiBUd28gbGlzdGVuZXJzIHVzZWQgdG8gYmUgcmVnaXN0ZXJlZCBoZXJlIGFuZCB0aHJvd24gYXdheTogYW4gZW1wdHlcbiAgICogYHJvd0RhdGFDaGFuZ2VkYCBoYW5kbGVyIHdob3NlIHVuc3Vic2NyaWJlIHdhcyBuZXZlciBrZXB0LCBhbmQgYW5cbiAgICogYGV4cGFuZGVkQ2hhbmdlZGAgaGFuZGxlciB3aG9zZSBib2R5IHdhcyBlbnRpcmVseSBjb21tZW50ZWQgb3V0LiBCb3RoIGFyZVxuICAgKiBnb25lIOKAlCBhIGxpc3RlbmVyIHdpdGggbm8gYmVoYXZpb3VyIGlzIGEgbGVhayB3aXRoIG5vIHVwc2lkZS5cbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9EZXRhaWxDaGFuZ2VzKG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlRGV0YWlsID0gbm9kZS5vbignZGV0YWlsUm93RGF0YUNoYW5nZWQnLCAoeyBub2RlIH0pID0+IHtcblxuICAgICAgaWYgKHRoaXMuX2FwaVR5cGUgPT09ICdtYXN0ZXInKSB7XG5cbiAgICAgICAgdGhpcy5yZXNvbHZlRGV0YWlsUm93SGVpZ2h0KG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3Rlck5vZGVDbGVhbnVwKG5vZGUucm93SWQsIFt1bnN1YnNjcmliZURldGFpbF0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck5vZGVDbGVhbnVwKHJvd0lkOiBzdHJpbmcsIHVuc3ViczogQXJyYXk8KCkgPT4gdm9pZD4pOiB2b2lkIHtcblxuICAgIC8vIE1lcmdlIHdpdGggYW55IGV4aXN0aW5nIGNsZWFudXBzIGZvciB0aGlzIHJvd0lkXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9ub2RlQ2xlYW51cE1hcC5nZXQocm93SWQpID8/IFtdO1xuXG4gICAgdGhpcy5fbm9kZUNsZWFudXBNYXAuc2V0KHJvd0lkLCBbLi4uZXhpc3RpbmcsIC4uLnVuc3Vic10pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwTm9kZShyb3dJZDogc3RyaW5nKTogdm9pZCB7XG5cbiAgICBjb25zdCBjbGVhbnVwcyA9IHRoaXMuX25vZGVDbGVhbnVwTWFwLmdldChyb3dJZCk7XG5cbiAgICBjbGVhbnVwcz8uZm9yRWFjaChmbiA9PiBmbigpKTtcblxuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLmRlbGV0ZShyb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRhdGEsIHJlbGVhc2luZyB3aGF0IHRoZXkgaG9sZC5cbiAgICpcbiAgICogVGhpcyBleGlzdGVkIGJ1dCB3YXMgbmV2ZXIgY2FsbGVkOiBgc2V0Um93RGF0YWAgYW5kIGB1cGRhdGVSb3dEYXRhYCBlYWNoXG4gICAqIGRlbGV0ZWQgc3RyYWlnaHQgb3V0IG9mIGBfb3JpZ2luYWxSb3dOb2Rlc2AsIHNvIGEgcmVtb3ZlZCBub2RlIGtlcHQgaXRzXG4gICAqIGxpc3RlbmVycyBhbmQgaXRzIGVudHJ5IGluIGBfbm9kZUNsZWFudXBNYXBgIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGdyaWQuXG4gICAqIEJvdGggbm93IGNvbWUgdGhyb3VnaCBoZXJlLCB3aGljaCB1bnN1YnNjcmliZXMgYW5kIGNsZWFycyB0aGUgbm9kZSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgcHJ1bmVSZW1vdmVkTm9kZXModmFsaWRSb3dJZHM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG5cbiAgICBmb3IgKGNvbnN0IFtyb3dJZCwgbm9kZV0gb2YgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcykge1xuXG4gICAgICBpZiAoIXZhbGlkUm93SWRzLmhhcyhyb3dJZCkpIHtcblxuICAgICAgICB0aGlzLmNsZWFudXBOb2RlKHJvd0lkKTsgIC8vIHVuc3Vic2NyaWJlIGxpc3RlbmVyc1xuXG4gICAgICAgIG5vZGUuZGVzdHJveSgpOyAgICAgICAgICAgLy8gY2xlYXIgbm9kZSdzIG93biBsaXN0ZW5lciBtYXBcblxuICAgICAgICB0aGlzLl9vcmlnaW5hbFJvd05vZGVzLmRlbGV0ZShyb3dJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlaWdodCBhIG1hc3RlciByb3cgbXVzdCByZXNlcnZlIGZvciBpdHMgZGV0YWlsIGdyaWQ6XG4gICAqIHJvd0hlaWdodCB4IGNsYW1wKHJvd3MsIG1pblJvd3MsIG1heFJvd3MpICsgaGVhZGVySGVpZ2h0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGV0YWlsUm93SGVpZ2h0KG5vZGU6IE9uZVJvd05vZGUpOiB2b2lkIHtcblxuICAgIGNvbnN0IGhlaWdodE9wdGlvbnMgPSB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcz8uZGV0YWlsR3JpZE9wdGlvbnM/LmRldGFpbFJvd0hlaWdodE9wdGlvbnM7XG5cbiAgICAvLyBSZWFjaGFibGUgd2hlbmV2ZXIgbWFzdGVyRGV0YWlsIGlzIG9uIGJ1dCBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgaXNcbiAgICAvLyBpbmNvbXBsZXRlOyB3aXRob3V0IHRoZSBndWFyZCB0aGlzIHRocmV3IGZyb20gaW5zaWRlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgIGlmICghaGVpZ2h0T3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgbWluUm93cyA9IGhlaWdodE9wdGlvbnMubWluUm93cztcbiAgICBjb25zdCBtYXhSb3dzID0gaGVpZ2h0T3B0aW9ucy5tYXhSb3dzO1xuXG4gICAgY29uc3QgbWluSGVpZ2h0ID0gKHRoaXMucm93SGVpZ2h0ICogbWluUm93cykgKyB0aGlzLmhlYWRlclJvd0hlaWdodDtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSAodGhpcy5yb3dIZWlnaHQgKiBtYXhSb3dzKSArIHRoaXMuaGVhZGVyUm93SGVpZ2h0O1xuXG4gICAgY29uc3Qgcm93cyA9IG5vZGUuZGV0YWlsUm93RGF0YSAmJiBub2RlLmRldGFpbFJvd0RhdGEubGVuZ3RoID8gbm9kZS5kZXRhaWxSb3dEYXRhLmxlbmd0aCA6IDA7XG5cbiAgICBub2RlLmRldGFpbFJvd0hlaWdodCA9IHJvd3MgPD0gbWluUm93cyA/IG1pbkhlaWdodCA6IHJvd3MgPj0gbWF4Um93cyA/IG1heEhlaWdodCA6ICh0aGlzLnJvd0hlaWdodCAqIHJvd3MpICsgdGhpcy5oZWFkZXJSb3dIZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBldmVyeXRoaW5nIHRoZSBncmlkIGhvbGRzLiBDYWxsZWQgYnkgYE9uZUdyaWRDb21wb25lbnQubmdPbkRlc3Ryb3lgLlxuICAgKlxuICAgKiBUaGUgc2VydmljZXMgYXJlIGRlbGliZXJhdGVseSAqbm90KiBudWxsZWQgb3V0IGFueSBtb3JlLiBUaGV5IGFyZSBpbmplY3RlZCxcbiAgICogQW5ndWxhciBvd25zIHRoZWlyIGxpZmV0aW1lLCBhbmQgbnVsbGluZyB0aGVtIG9ubHkgZ3VhcmFudGVlZCBhXG4gICAqIGBUeXBlRXJyb3JgIGZvciBhbnkgY2FsbGJhY2sgdGhhdCBhcnJpdmVkIGFmdGVyIHRlYXJkb3duIOKAlCBhIGRldGFpbC1yb3dcbiAgICogZmV0Y2ggcmVzb2x2aW5nIGxhdGUsIG9yIHRoZSBib2R5J3MgZGVmZXJyZWQgdXBkYXRlLiBgX2Rlc3Ryb3llZGAgbWFrZXNcbiAgICogdGhvc2UgY2FsbHMgbm8tb3BzIGluc3RlYWQsIHdoaWNoIGlzIHdoYXQgYSB0b3JuLWRvd24gb2JqZWN0IHNob3VsZCBkby5cbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGV2ZXJ5IHBlci1ub2RlIGxpc3RlbmVyIGJlZm9yZSBkcm9wcGluZyB0aGUgbm9kZXMuXG4gICAgZm9yIChjb25zdCByb3dJZCBvZiBBcnJheS5mcm9tKHRoaXMuX25vZGVDbGVhbnVwTWFwLmtleXMoKSkpIHtcblxuICAgICAgdGhpcy5jbGVhbnVwTm9kZShyb3dJZCk7XG4gICAgfVxuXG4gICAgLy8gYGRlc3Ryb3lgIGRyb3BzIHRoZSB0cmVlIGxpbmtzIGFuZCB0aGUgbGlzdGVuZXJzOyB0aGUgQVBJIG5vIGxvbmdlciBoYXNcbiAgICAvLyB0byByZWFjaCBpbiBhbmQgdW5waWNrIGVhY2ggbm9kZSBpdHNlbGYuXG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gbm9kZS5kZXN0cm95KCkpO1xuICAgIHRoaXMuX3Jvd05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG5cbiAgICBmb3IgKGNvbnN0IHNpZGUgb2YgWyd0b3AnLCAnYm90dG9tJ10gYXMgT25lUGlubmVkUm93U2lkZVtdKSB7XG5cbiAgICAgIHRoaXMuX3Bpbm5lZFJvd05vZGVzW3NpZGVdLmZvckVhY2gobm9kZSA9PiBub2RlLmRlc3Ryb3koKSk7XG4gICAgICB0aGlzLl9waW5uZWRSb3dOb2Rlc1tzaWRlXSA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd05vZGVzID0gW107XG4gICAgdGhpcy5fdmlzaWJsZVJvd05vZGVzID0gW107XG4gICAgdGhpcy5fb3JpZ2luYWxSb3dOb2Rlcy5jbGVhcigpO1xuICAgIHRoaXMuX25vZGVDbGVhbnVwTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5fY3VycmVudEluZGV4ID0gMDtcblxuICAgIC8vIFJlbGVhc2UgdGhlIGJhY2stcmVmZXJlbmNlIHRoZSBjZWxsIHNlcnZpY2UgaG9sZHMsIHNvIGEgdG9ybi1kb3duIGFwaSBpc1xuICAgIC8vIG5vdCBrZXB0IGFsaXZlIGJ5IHRoZSBzZXJ2aWNlIHRoYXQgb3V0bGl2ZXMgdGhpcyBjYWxsLlxuICAgIHRoaXMuY2VsbFNlcnZpY2Uuc2V0R3JpZEFwaShudWxsKTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdEFsbCgpO1xuICAgIHRoaXMuZXhwYW5zaW9uU2VydmljZS5jbGVhcigpO1xuXG4gICAgdGhpcy5fYWN0aXZlRmlsdGVycyA9IFtdO1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyVmFsdWUgPSBudWxsO1xuICAgIHRoaXMuX3NvcnRNb2RlbCA9IFtdO1xuICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuXG4gICAgdGhpcy5tYXN0ZXJEZXRhaWwgPSBmYWxzZTtcbiAgICB0aGlzLnRyZWVEYXRhID0gZmFsc2U7XG4gICAgdGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQgPSBudWxsO1xuICAgIHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQgPSAwO1xuICAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zID0gbnVsbDtcbiAgICB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50ID0gbnVsbDtcbiAgICB0aGlzLl9nZXREZXRhaWxSb3dEYXRhID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBkZXN0cm95YCBoYXMgcnVuLiBMYXRlIGNhbGxiYWNrcyBjaGVjayB0aGlzIGJlZm9yZSBkb2luZyB3b3JrLiAqL1xuICBwdWJsaWMgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcblxuICAgIHJldHVybiB0aGlzLl9kZXN0cm95ZWQ7XG4gIH1cbn1cbiJdfQ==
|