@one-grid-core/angular 0.5.3 → 0.5.5
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 +1 -1
- package/esm2022/lib/components/one-grid/one-grid.component.mjs +10 -4
- package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +9 -3
- package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +26 -8
- package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
- package/fesm2022/one-grid-core-angular.mjs +42 -12
- package/fesm2022/one-grid-core-angular.mjs.map +1 -1
- package/lib/components/one-grid/one-grid.component.d.ts +3 -1
- package/lib/components/one-grid-body/one-grid-body.component.d.ts +3 -1
- package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +6 -1
- package/lib/core/models/one-column-def-types.model.d.ts +3 -0
- package/package.json +1 -1
- package/scss/_one-grid.scss +27 -13
package/README.md
CHANGED
|
@@ -158,7 +158,7 @@ Legacy `@import` with pre-defined variables also still works.
|
|
|
158
158
|
| `cell-line-height` | `1.2` | Text line height |
|
|
159
159
|
| `row-drag-handle-color` | `var(--bs-secondary-color, #6c757d)` | Row drag handle at rest |
|
|
160
160
|
| `row-drag-indicator-size` | `2px` | Thickness of the drop indicator line |
|
|
161
|
-
| `detail-padding` | `
|
|
161
|
+
| `detail-padding` | `8px` | Inset around a master/detail row's nested grid. It is height the virtual scroller cannot account for; set it to `0` for a flush detail area. |
|
|
162
162
|
| `action-btn-size` | `20px` | Row action buttons, checkboxes, icons |
|
|
163
163
|
| `action-btn-radius` | `4px` | Small control corner radius |
|
|
164
164
|
| `border-radius` | `0` | Outer grid corner radius |
|
|
@@ -130,6 +130,7 @@ export class OneGridComponent {
|
|
|
130
130
|
this.editType = null;
|
|
131
131
|
this.onGridReady = new EventEmitter();
|
|
132
132
|
this.onRowGotoDetail = new EventEmitter();
|
|
133
|
+
this.onRowDetail = new EventEmitter();
|
|
133
134
|
this.onRowAddNew = new EventEmitter();
|
|
134
135
|
this.onRowView = new EventEmitter();
|
|
135
136
|
this.onRowLocation = new EventEmitter();
|
|
@@ -473,6 +474,9 @@ export class OneGridComponent {
|
|
|
473
474
|
invokeRowActionGotoDetail(event) {
|
|
474
475
|
this.onRowGotoDetail.emit(event);
|
|
475
476
|
}
|
|
477
|
+
invokeRowActionDetail(event) {
|
|
478
|
+
this.onRowDetail.emit(event);
|
|
479
|
+
}
|
|
476
480
|
invokeRowActionAddNew(event) {
|
|
477
481
|
this.onRowAddNew.emit(event);
|
|
478
482
|
}
|
|
@@ -593,7 +597,7 @@ export class OneGridComponent {
|
|
|
593
597
|
this.subscriptions.unsubscribe();
|
|
594
598
|
}
|
|
595
599
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridComponent, deps: [{ token: i1.OneGridApi }, { token: i2.OneGridEventService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
596
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridComponent, isStandalone: true, selector: "one-grid", inputs: { rowNumber: "rowNumber", allowedEdit: "allowedEdit", submitted: "submitted", context: "context", rowData: "rowData", rowSelection: "rowSelection", gridLabel: "gridLabel", enableGroupColumnDefs: "enableGroupColumnDefs", groupColumnDefs: "groupColumnDefs", defaultColumnDef: "defaultColumnDef", columnDefs: "columnDefs", pinnedTopRowData: "pinnedTopRowData", pinnedBottomRowData: "pinnedBottomRowData", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded", headerMenu: "headerMenu", filterRow: "filterRow", undoRedoCellEditing: "undoRedoCellEditing", undoRedoCellEditingLimit: "undoRedoCellEditingLimit", editType: "editType", pagination: "pagination", paginate: "paginate", clientSidePagination: "clientSidePagination", pageSize: "pageSize" }, outputs: { rowDragEnd: "rowDragEnd", headerMenuClick: "headerMenuClick", onGridReady: "onGridReady", onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowCopy: "onRowCopy", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", selectionChanged: "selectionChanged", expansionChanged: "expansionChanged", sortChanged: "sortChanged", cellValueChanged: "cellValueChanged", columnMoved: "columnMoved", columnResized: "columnResized", cellOptionSelect: "cellOptionSelect", onRowCellOption: "onRowCellOption", goToFirst: "goToFirst", goToPrevious: "goToPrevious", goToNext: "goToNext", goToLast: "goToLast", pageSizeChange: "pageSizeChange" }, providers: [
|
|
600
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridComponent, isStandalone: true, selector: "one-grid", inputs: { rowNumber: "rowNumber", allowedEdit: "allowedEdit", submitted: "submitted", context: "context", rowData: "rowData", rowSelection: "rowSelection", gridLabel: "gridLabel", enableGroupColumnDefs: "enableGroupColumnDefs", groupColumnDefs: "groupColumnDefs", defaultColumnDef: "defaultColumnDef", columnDefs: "columnDefs", pinnedTopRowData: "pinnedTopRowData", pinnedBottomRowData: "pinnedBottomRowData", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded", headerMenu: "headerMenu", filterRow: "filterRow", undoRedoCellEditing: "undoRedoCellEditing", undoRedoCellEditingLimit: "undoRedoCellEditingLimit", editType: "editType", pagination: "pagination", paginate: "paginate", clientSidePagination: "clientSidePagination", pageSize: "pageSize" }, outputs: { rowDragEnd: "rowDragEnd", headerMenuClick: "headerMenuClick", onGridReady: "onGridReady", onRowGotoDetail: "onRowGotoDetail", onRowDetail: "onRowDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowCopy: "onRowCopy", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", selectionChanged: "selectionChanged", expansionChanged: "expansionChanged", sortChanged: "sortChanged", cellValueChanged: "cellValueChanged", columnMoved: "columnMoved", columnResized: "columnResized", cellOptionSelect: "cellOptionSelect", onRowCellOption: "onRowCellOption", goToFirst: "goToFirst", goToPrevious: "goToPrevious", goToNext: "goToNext", goToLast: "goToLast", pageSizeChange: "pageSizeChange" }, providers: [
|
|
597
601
|
OneGridEventService,
|
|
598
602
|
OneGridApi,
|
|
599
603
|
OgColumnService,
|
|
@@ -602,7 +606,7 @@ export class OneGridComponent {
|
|
|
602
606
|
OneGridRowService,
|
|
603
607
|
OneGridCellService,
|
|
604
608
|
OneGridRowDragService
|
|
605
|
-
], viewQueries: [{ propertyName: "ogRef", first: true, predicate: ["ogRef"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<!-- role=\"grid\" is what turns this from a pile of divs into something a screen\n reader can navigate. The counts are the *total* \u2014 `aria-rowcount` includes\n the header row and any pinned rows, and both stay correct while the body is\n virtualised and most rows are not in the DOM, which is exactly what these\n attributes exist to communicate. -->\n<div #ogRef\n class=\"one-grid\"\n role=\"grid\"\n [attr.aria-label]=\"gridLabel\"\n [attr.aria-rowcount]=\"ariaRowCount\"\n [attr.aria-colcount]=\"ariaColCount\"\n [attr.aria-multiselectable]=\"rowSelection === 'multiple' ? true : null\"\n (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n [headerMenu]=\"headerMenu\"\n [filterRow]=\"filterRow\"\n (headerMenuClick)=\"headerMenuClick.emit($event)\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [editType]=\"editType\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination || clientSidePagination) {\n <one-grid-pagination\n [paginate]=\"clientSidePagination ? internalPaginate : paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>", styles: [""], dependencies: [{ kind: "component", type: OneGridComponent, selector: "one-grid", inputs: ["rowNumber", "allowedEdit", "submitted", "context", "rowData", "rowSelection", "gridLabel", "enableGroupColumnDefs", "groupColumnDefs", "defaultColumnDef", "columnDefs", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailCellRendererParams", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded", "headerMenu", "filterRow", "undoRedoCellEditing", "undoRedoCellEditingLimit", "editType", "pagination", "paginate", "clientSidePagination", "pageSize"], outputs: ["rowDragEnd", "headerMenuClick", "onGridReady", "onRowGotoDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "selectionChanged", "expansionChanged", "sortChanged", "cellValueChanged", "columnMoved", "columnResized", "cellOptionSelect", "onRowCellOption", "goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }, { kind: "component", type: OneGridHeaderComponent, selector: "one-grid-header", inputs: ["scrollLeft", "allowedEdit", "enableGroupColumnDefs", "api", "filterRow", "headerMenu"], outputs: ["headerMenuClick"] }, { kind: "component", type: OneGridBodyComponent, selector: "one-grid-body", inputs: ["rowData", "rowNumber", "api", "pagination", "allowedEdit", "enableGroupColumnDefs", "submitted", "editType", "context", "getRowId", "gridCopy$", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailRowMaxHeight", "detailCellRendererParams", "detailGridTemplate", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded"], outputs: ["onRowGotoDetail", "onRowAddNew", "onRowView", "onRowCopy", "onRowLocation", "onRowDocument", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "expansionChanged", "bodyScroll", "cellOptionSelect", "rowDragEnd"] }, { kind: "component", type: OneGridPaginationComponent, selector: "one-grid-pagination", inputs: ["paginate"], outputs: ["goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }] }); }
|
|
609
|
+
], viewQueries: [{ propertyName: "ogRef", first: true, predicate: ["ogRef"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<!-- role=\"grid\" is what turns this from a pile of divs into something a screen\n reader can navigate. The counts are the *total* \u2014 `aria-rowcount` includes\n the header row and any pinned rows, and both stay correct while the body is\n virtualised and most rows are not in the DOM, which is exactly what these\n attributes exist to communicate. -->\n<div #ogRef\n class=\"one-grid\"\n role=\"grid\"\n [attr.aria-label]=\"gridLabel\"\n [attr.aria-rowcount]=\"ariaRowCount\"\n [attr.aria-colcount]=\"ariaColCount\"\n [attr.aria-multiselectable]=\"rowSelection === 'multiple' ? true : null\"\n (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n [headerMenu]=\"headerMenu\"\n [filterRow]=\"filterRow\"\n (headerMenuClick)=\"headerMenuClick.emit($event)\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [editType]=\"editType\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowDetail)=\"invokeRowActionDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination || clientSidePagination) {\n <one-grid-pagination\n [paginate]=\"clientSidePagination ? internalPaginate : paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>", styles: [""], dependencies: [{ kind: "component", type: OneGridComponent, selector: "one-grid", inputs: ["rowNumber", "allowedEdit", "submitted", "context", "rowData", "rowSelection", "gridLabel", "enableGroupColumnDefs", "groupColumnDefs", "defaultColumnDef", "columnDefs", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailCellRendererParams", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded", "headerMenu", "filterRow", "undoRedoCellEditing", "undoRedoCellEditingLimit", "editType", "pagination", "paginate", "clientSidePagination", "pageSize"], outputs: ["rowDragEnd", "headerMenuClick", "onGridReady", "onRowGotoDetail", "onRowDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "selectionChanged", "expansionChanged", "sortChanged", "cellValueChanged", "columnMoved", "columnResized", "cellOptionSelect", "onRowCellOption", "goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }, { kind: "component", type: OneGridHeaderComponent, selector: "one-grid-header", inputs: ["scrollLeft", "allowedEdit", "enableGroupColumnDefs", "api", "filterRow", "headerMenu"], outputs: ["headerMenuClick"] }, { kind: "component", type: OneGridBodyComponent, selector: "one-grid-body", inputs: ["rowData", "rowNumber", "api", "pagination", "allowedEdit", "enableGroupColumnDefs", "submitted", "editType", "context", "getRowId", "gridCopy$", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailRowMaxHeight", "detailCellRendererParams", "detailGridTemplate", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded"], outputs: ["onRowGotoDetail", "onRowDetail", "onRowAddNew", "onRowView", "onRowCopy", "onRowLocation", "onRowDocument", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "expansionChanged", "bodyScroll", "cellOptionSelect", "rowDragEnd"] }, { kind: "component", type: OneGridPaginationComponent, selector: "one-grid-pagination", inputs: ["paginate"], outputs: ["goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }] }); }
|
|
606
610
|
}
|
|
607
611
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridComponent, decorators: [{
|
|
608
612
|
type: Component,
|
|
@@ -620,7 +624,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
620
624
|
OneGridRowService,
|
|
621
625
|
OneGridCellService,
|
|
622
626
|
OneGridRowDragService
|
|
623
|
-
], template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<!-- role=\"grid\" is what turns this from a pile of divs into something a screen\n reader can navigate. The counts are the *total* \u2014 `aria-rowcount` includes\n the header row and any pinned rows, and both stay correct while the body is\n virtualised and most rows are not in the DOM, which is exactly what these\n attributes exist to communicate. -->\n<div #ogRef\n class=\"one-grid\"\n role=\"grid\"\n [attr.aria-label]=\"gridLabel\"\n [attr.aria-rowcount]=\"ariaRowCount\"\n [attr.aria-colcount]=\"ariaColCount\"\n [attr.aria-multiselectable]=\"rowSelection === 'multiple' ? true : null\"\n (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n [headerMenu]=\"headerMenu\"\n [filterRow]=\"filterRow\"\n (headerMenuClick)=\"headerMenuClick.emit($event)\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [editType]=\"editType\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination || clientSidePagination) {\n <one-grid-pagination\n [paginate]=\"clientSidePagination ? internalPaginate : paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>" }]
|
|
627
|
+
], template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<!-- role=\"grid\" is what turns this from a pile of divs into something a screen\n reader can navigate. The counts are the *total* \u2014 `aria-rowcount` includes\n the header row and any pinned rows, and both stay correct while the body is\n virtualised and most rows are not in the DOM, which is exactly what these\n attributes exist to communicate. -->\n<div #ogRef\n class=\"one-grid\"\n role=\"grid\"\n [attr.aria-label]=\"gridLabel\"\n [attr.aria-rowcount]=\"ariaRowCount\"\n [attr.aria-colcount]=\"ariaColCount\"\n [attr.aria-multiselectable]=\"rowSelection === 'multiple' ? true : null\"\n (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n [headerMenu]=\"headerMenu\"\n [filterRow]=\"filterRow\"\n (headerMenuClick)=\"headerMenuClick.emit($event)\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [editType]=\"editType\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowDetail)=\"invokeRowActionDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination || clientSidePagination) {\n <one-grid-pagination\n [paginate]=\"clientSidePagination ? internalPaginate : paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>" }]
|
|
624
628
|
}], ctorParameters: () => [{ type: i1.OneGridApi }, { type: i2.OneGridEventService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { ogRef: [{
|
|
625
629
|
type: ViewChild,
|
|
626
630
|
args: ['ogRef', { static: true }]
|
|
@@ -686,6 +690,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
686
690
|
type: Output
|
|
687
691
|
}], onRowGotoDetail: [{
|
|
688
692
|
type: Output
|
|
693
|
+
}], onRowDetail: [{
|
|
694
|
+
type: Output
|
|
689
695
|
}], onRowAddNew: [{
|
|
690
696
|
type: Output
|
|
691
697
|
}], onRowView: [{
|
|
@@ -751,4 +757,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
751
757
|
}], pageSizeChange: [{
|
|
752
758
|
type: Output
|
|
753
759
|
}] } });
|
|
754
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb21wb25lbnRzL29uZS1ncmlkL29uZS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC9vbmUtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQXVCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuTCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUV0RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxN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Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQU9HLFdBQVc7c0JBQXBCLE1BQU07Z0JBT0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUdHLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0csYUFBYTtzQkFBdEIsTUFBTTtnQkFHRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFLRSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBVUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBUeXBlLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiwgT25lR3JvdXBDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkQXBpIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtZ3JpZC1hcGkuY2xhc3MnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLXJvdy1ub2RlLmNsYXNzJztcbmltcG9ydCB7IE9uZUdyaWRSZWFkeUV2ZW50LCBPbmVHcmlkUm93QWN0aW9uRXZlbnQsIE9uZUdyaWRUeXBlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVQYWdpbmF0aW9uUGFyYW1zIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLXBhZ2luYXRpb24tdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudCwgQ2VsbFZhbHVlQ2hhbmdlZEV2ZW50LCBDb2x1bW5Nb3ZlZEV2ZW50LCBDb2x1bW5SZXNpemVkRXZlbnQsIEV4cGFuc2lvbkNoYW5nZWRFdmVudCwgUm93R3JvdXBpbmdDaGFuZ2VkRXZlbnQsIFJvd1NlbGVjdGlvbk1vZGUsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCwgU29ydENoYW5nZWRFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1leHBhbnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtbWFzdGVyLWRldGFpbC5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkUm93U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtcm93LnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1jZWxsLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2dDb2x1bW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vZy1jb2x1bW4uc2VydmljZSc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLXRyZWUtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkUm93RHJhZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLXJvdy1kcmFnLnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lUm93RHJhZ0V2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLXJvdy1kcmFnLm1vZGVsJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgYWdnQ29sdW1ucywgT05FX0dST1VQX0NISUxEUkVOX0ZJRUxELCBPTkVfR1JPVVBfVkFMVUVfRklFTEQsIHJvd0dyb3VwRmllbGRzIH0gZnJvbSAnLi4vLi4vaGVscGVycy9vbmUtcm93LWdyb3VwaW5nLmhlbHBlcic7XG5pbXBvcnQgeyBPbmVHcmlkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vb25lLWdyaWQtaGVhZGVyL29uZS1ncmlkLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lR3JpZEJvZHlDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1ib2R5L29uZS1ncmlkLWJvZHkuY29tcG9uZW50JztcbmltcG9ydCB7IE9uZUdyaWRQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vb25lLWdyaWQtcGFnaW5hdGlvbi9vbmUtZ3JpZC1wYWdpbmF0aW9uLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBPbmVHcmlkSGVhZGVyQ29tcG9uZW50LFxuICAgIE9uZUdyaWRCb2R5Q29tcG9uZW50LFxuICAgIE9uZUdyaWRQYWdpbmF0aW9uQ29tcG9uZW50LFxuICBdLFxuICBzZWxlY3RvcjogJ29uZS1ncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29uZS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLmNvbXBvbmVudC5zY3NzJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBPbmVHcmlkQXBpLFxuICAgIE9nQ29sdW1uU2VydmljZSxcbiAgICBPbmVHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICBPbmVHcmlkRXhwYW5zaW9uU2VydmljZSxcbiAgICBPbmVHcmlkUm93U2VydmljZSxcbiAgICBPbmVHcmlkQ2VsbFNlcnZpY2UsXG4gICAgT25lR3JpZFJvd0RyYWdTZXJ2aWNlXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogR2V0IEdlbmVyYWwgRGF0YSBmcm9tIFBhcmVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnb2dSZWYnLCB7IHN0YXRpYzogdHJ1ZSB9KSBvZ1JlZiE6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIHJvd051bWJlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd2VkRWRpdDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb250ZXh0OiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSByb3dEYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcm93U2VsZWN0aW9uOiBSb3dTZWxlY3Rpb25Nb2RlID0gbnVsbDtcblxuICAvKipcbiAgICogVGhlIGdyaWQncyBhY2Nlc3NpYmxlIG5hbWUuXG4gICAqXG4gICAqIEEgYHJvbGU9XCJncmlkXCJgIHdpdGggbm8gbmFtZSBpcyBhbm5vdW5jZWQgYXMgYW4gdW5sYWJlbGxlZCBncmlkLCB3aGljaFxuICAgKiB0ZWxscyBhIHNjcmVlbi1yZWFkZXIgdXNlciBub3RoaW5nIGFib3V0IHdoYXQgdGhleSBoYXZlIGxhbmRlZCBpbi4gU2V0IGl0XG4gICAqIHRvIHdoYXRldmVyIHRoZSBncmlkIGlzIHNob3dpbmcg4oCUIFwiRW1wbG95ZWVzXCIsIFwiT3JkZXIgbGluZXNcIi5cbiAgICovXG4gIEBJbnB1dCgpIGdyaWRMYWJlbDogc3RyaW5nID0gJ0RhdGEgZ3JpZCc7XG5cbiAgQElucHV0KCkgZW5hYmxlR3JvdXBDb2x1bW5EZWZzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZjxUPiA9IHt9O1xuICBASW5wdXQoKSBjb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWY8VD5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBSb3dzIGFuY2hvcmVkIGFib3ZlIHRoZSBzY3JvbGxpbmcgYXJlYSDigJQgYSBoZWFkZXIgc3VtbWFyeSwgb3IgYW4gZW50cnkgbGluZS5cbiAgICogVGhleSBrZWVwIGNvbHVtbiBhbGlnbm1lbnQgYW5kIHNjcm9sbCBzaWRld2F5cyB3aXRoIHRoZSBib2R5LCBidXQgYXJlIG5vdFxuICAgKiBkYXRhOiBzb3J0aW5nLCBmaWx0ZXJpbmcsIHNlbGVjdGlvbiBhbmQgdGhlIHJvdyBjb3VudCBhbGwgcGFzcyB0aGVtIGJ5LlxuICAgKi9cbiAgQElucHV0KCkgcGlubmVkVG9wUm93RGF0YTogVFtdID0gW107XG5cbiAgLyoqIFJvd3MgYW5jaG9yZWQgYmVsb3cgdGhlIHNjcm9sbGluZyBhcmVhLCB0eXBpY2FsbHkgYSB0b3RhbHMgcm93LiAqL1xuICBASW5wdXQoKSBwaW5uZWRCb3R0b21Sb3dEYXRhOiBUW10gPSBbXTtcblxuICAvLyBSWEpTIFByb3BlcnRpZXNcbiAgcHJvdGVjdGVkIGdyaWRDb3B5JCA9IG5ldyBTdWJqZWN0PENsaXBib2FyZEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIEZlYXR1cmVcbiAgICovXG4gIEBJbnB1dCgpIGdyaWRUeXBlOiBPbmVHcmlkVHlwZSA9ICdtYXN0ZXInO1xuICBASW5wdXQoKSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFzdGVyTm9kZTogT25lUm93Tm9kZSA9IG51bGw7XG4gIEBJbnB1dCgpIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBASW5wdXQoKSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDogVHlwZTxPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBUcmVlIERhdGEgRmVhdHVyZVxuICAgKi9cbiAgQElucHV0KCkgdHJlZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdHJlZURhdGFDaGlsZHJlbkZpZWxkOiBzdHJpbmcgPSBudWxsO1xuICBASW5wdXQoKSBhdXRvR3JvdXBDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZjtcbiAgQElucHV0KCkgZ3JvdXBEZWZhdWx0RXhwYW5kZWQ6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIEJpbmQgUm93IEFjdGlvbiBFdmVudHMgJiBEYXRhIHRvIFBhcmVudFxuICAgKi9cbiAgLyoqXG4gICAqIEEgcm93IGZpbmlzaGVkIG1vdmluZy4gRmlyZXMgb25jZSBwZXIgY29tcGxldGVkIHJlb3JkZXIg4oCUIG5vdCB3aGlsZSB0aGVcbiAgICogcG9pbnRlciBpcyBpbiBmbGlnaHQg4oCUIGFuZCBvbmx5IHdoZW4gdGhlIHBvc2l0aW9uIGFjdHVhbGx5IGNoYW5nZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcm93RHJhZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lUm93RHJhZ0V2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgaGVhZGVyJ3Mg4ouuIGJ1dHRvbiB3YXMgcHJlc3NlZCBmb3IgdGhpcyBjb2x1bW4uXG4gICAqXG4gICAqIFRoZSBncmlkIGhhcyBubyBjb2x1bW4gbWVudSBvZiBpdHMgb3duIOKAlCB0aGlzIHJlcG9ydHMgdGhlIGludGVudCBzbyB0aGVcbiAgICogaG9zdCBjYW4gc2hvdyB3aGF0ZXZlciBhIGNvbHVtbiBtZW51IG1lYW5zIGluIGl0cyBhcHAuIFNldFxuICAgKiBgY29sdW1uRGVmLnN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbmAgdG8gaGlkZSB0aGUgYnV0dG9uIGVudGlyZWx5LlxuICAgKi9cbiAgQE91dHB1dCgpIGhlYWRlck1lbnVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8T25lQ29sdW1uRGVmPFQ+PigpO1xuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGdyaWQncyBvd24gY29sdW1uIG1lbnUgYmVoaW5kIHRoZSBoZWFkZXIg4ouuIGJ1dHRvbjogc29ydCwgcGluLFxuICAgKiBoaWRlLiBPcHQtaW4g4oCUIGEgaG9zdCB0aGF0IGJ1aWx0IGl0cyBtZW51IG9uIGAoaGVhZGVyTWVudUNsaWNrKWAga2VlcHNcbiAgICogZXhhY3RseSB3aGF0IGl0IGhhZCwgYW5kIHRoZSBpbnRlbnQgc3RpbGwgZW1pdHMgZWl0aGVyIHdheS5cbiAgICovXG4gIEBJbnB1dCgpIGhlYWRlck1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVuZGVyIGEgZmlsdGVyIGlucHV0IHVuZGVyIGV2ZXJ5IGNvbHVtbiB3aG9zZSBgZmlsdGVyYWJsZWAgcmVzb2x2ZXNcbiAgICogdHJ1ZS4gVGhlIGlucHV0cyBmZWVkIGBhcGkuc2V0RmlsdGVyTW9kZWxgIHdpdGggY29udGFpbnMtY29uZGl0aW9ucyxcbiAgICogZGVib3VuY2VkOyBmaWx0ZXJzIG9uIGZpZWxkcyB3aXRob3V0IGFuIGlucHV0IGFyZSBsZWZ0IHVudG91Y2hlZC5cbiAgICovXG4gIEBJbnB1dCgpIGZpbHRlclJvdzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZWNvcmQgY29tbWl0dGVkIGNlbGwgZWRpdHMgc28gYGFwaS51bmRvQ2VsbEVkaXRpbmdgIC9cbiAgICogYGFwaS5yZWRvQ2VsbEVkaXRpbmdgIChhbmQgQ3RybCtaIC8gQ3RybCtZIGluIHRoZSBncmlkKSBjYW4gd2FsayB0aGVtLlxuICAgKiBQcm9ncmFtbWF0aWMgYHNldERhdGFWYWx1ZWAgd3JpdGVzIGFyZSBub3QgcmVjb3JkZWQuXG4gICAqL1xuICBASW5wdXQoKSB1bmRvUmVkb0NlbGxFZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEhvdyBtYW55IGVkaXRzIHRoZSB1bmRvIHN0YWNrIGtlZXBzLiAqL1xuICBASW5wdXQoKSB1bmRvUmVkb0NlbGxFZGl0aW5nTGltaXQ6IG51bWJlciA9IDEwO1xuXG4gIC8qKlxuICAgKiBgJ2Z1bGxSb3cnYCBvcGVucyBldmVyeSBlZGl0YWJsZSBjZWxsIG9mIHRoZSByb3cgb24gYSBkb3VibGUtY2xpY2sgYW5kXG4gICAqIGNvbW1pdHMgdGhlbSB0b2dldGhlciDigJQgRW50ZXIgYW55d2hlcmUgaW4gdGhlIHJvdywgb3IgZm9jdXMgbGVhdmluZyB0aGVcbiAgICogcm93LiBFc2NhcGUgY2xvc2VzIHRoZSB3aG9sZSByb3cgd2l0aG91dCBjb21taXR0aW5nLiBEZWZhdWx0OiBjZWxscyBlZGl0XG4gICAqIG9uZSBhdCBhIHRpbWUuXG4gICAqL1xuICBASW5wdXQoKSBlZGl0VHlwZTogJ2Z1bGxSb3cnIHwgbnVsbCA9IG51bGw7XG5cbiAgQE91dHB1dCgpIG9uR3JpZFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUmVhZHlFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93R290b0RldGFpbCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dBZGROZXcgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93VmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dMb2NhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dEb2N1bWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0RlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1ByaW50ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0hpc3RvcnkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93T3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0xhbmd1YWdlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1NlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25TaGlmdERvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSByb3dDb3VudENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwYW5zaW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgc29ydCBtb2RlbCBjaGFuZ2VkIOKAlCBhIGhlYWRlciBjbGljayBvciBgYXBpLm9uU29ydENoYW5nZWRgLiBDYXJyaWVzXG4gICAqIHRoZSByZS1zb3J0ZWQgbm9kZXMgYW5kIHRoZSBtb2RlbCB0aGF0IHByb2R1Y2VkIHRoZW07IGBhcGkuc29ydE1vZGVsYFxuICAgKiBzdGF5cyByZWFkYWJsZSBiZXR3ZWVuIGVtaXNzaW9ucy5cbiAgICovXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ydENoYW5nZWRFdmVudDxUPj4oKTtcblxuICAvKipcbiAgICogQW4gaW5saW5lIGVkaXQgd2FzIGNvbW1pdHRlZCB3aXRoIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpdFxuICAgKiBzdGFydGVkIHdpdGguIFByb2dyYW1tYXRpYyBgbm9kZS5zZXREYXRhVmFsdWVgIGRvZXMgbm90IGVtaXQgaGVyZSDigJQgdGhlXG4gICAqIGNhbGxlciBhbHJlYWR5IGhvbGRzIGJvdGggdmFsdWVzLlxuICAgKi9cbiAgQE91dHB1dCgpIGNlbGxWYWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxWYWx1ZUNoYW5nZWRFdmVudDxUPj4oKTtcblxuICAvKiogQSBoZWFkZXIgZHJhZyBmaW5pc2hlZCBzb21ld2hlcmUgb3RoZXIgdGhhbiB3aGVyZSBpdCBzdGFydGVkLiAqL1xuICBAT3V0cHV0KCkgY29sdW1uTW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbk1vdmVkRXZlbnQ+KCk7XG5cbiAgLyoqIEEgcmVzaXplIGdlc3R1cmUgZmluaXNoZWQg4oCUIG9uZSBldmVudCBwZXIgZ2VzdHVyZSwgbm90IHBlciBwaXhlbC4gKi9cbiAgQE91dHB1dCgpIGNvbHVtblJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtblJlc2l6ZWRFdmVudD4oKTtcblxuICAvLyBGb3IgY29udGV4dCBtZW51IG9wdGlvblxuICBAT3V0cHV0KCkgY2VsbE9wdGlvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25Sb3dDZWxsT3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG5cbiAgLyoqXG4gICAqIEJpbmQgT25lIEdyaWQgUGFnaW5hdGlvbiBGZWF0dXJlXG4gICAqL1xuICBASW5wdXQoKSBwYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhZ2luYXRlOiBPbmVQYWdpbmF0aW9uUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBMZXQgdGhlIGdyaWQgcGFnZSBpdHMgb3duIHJvd3MuIFRoZSBiYXIgcmVuZGVycywgdGhlIGdyaWQgc2xpY2VzIHRoZVxuICAgKiBmaWx0ZXJlZCByb3dzIHRvIHRoZSBjdXJyZW50IHBhZ2UsIGFuZCB0aGUgbmF2aWdhdGlvbiBidXR0b25zIHdvcmtcbiAgICogd2l0aG91dCB0aGUgaG9zdCBoYW5kbGluZyBhbnl0aGluZyDigJQgYFtwYWdpbmF0ZV1gIGlzIGlnbm9yZWQgaW4gdGhpc1xuICAgKiBtb2RlICh0aGUgZ3JpZCBvd25zIHRob3NlIG51bWJlcnMpIGV4Y2VwdCBmb3IgYHBhZ2VTaXplT3B0aW9uc2AuIFRoZVxuICAgKiBuYXZpZ2F0aW9uIG91dHB1dHMgc3RpbGwgZW1pdCwgYXMgbm90aWZpY2F0aW9ucyByYXRoZXIgdGhhbiBpbnRlbnRzLlxuICAgKiBTZWxlY3Rpb24sIGZpbHRlcmluZyBhbmQgc29ydGluZyBrZWVwIG9wZXJhdGluZyBvbiB0aGUgd2hvbGUgZGF0YXNldC5cbiAgICovXG4gIEBJbnB1dCgpIGNsaWVudFNpZGVQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFJvd3MgcGVyIHBhZ2UgZm9yIGBjbGllbnRTaWRlUGFnaW5hdGlvbmAuICovXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAyNTtcblxuICBAT3V0cHV0KCkgZ29Ub0ZpcnN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub1ByZXZpb3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub05leHQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBnb1RvTGFzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgLyoqIFRoZSBwYWdpbmcgbnVtYmVycyB0aGUgYmFyIHNob3dzIHdoZW4gdGhlIGdyaWQgcGFnZXMgaXRzIG93biByb3dzLiAqL1xuICBwcm90ZWN0ZWQgaW50ZXJuYWxQYWdpbmF0ZTogT25lUGFnaW5hdGlvblBhcmFtcyA9IHtcbiAgICB0b3RhbDogMCwgY3VycmVudFBhZ2U6IDEsIGxhc3RQYWdlOiAxLCBwZXJQYWdlOiAyNSwgZmlyc3RSb3dJbmRleDogMCwgbGFzdFJvd0luZGV4OiAwLFxuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGUgdGhlIGJhcidzIG51bWJlcnMgZnJvbSB0aGUgZmlsdGVyZWQgcm93IGNvdW50IGFuZCB0aGUgQVBJJ3NcbiAgICogcGFnaW5nIHN0YXRlLiBEZWZlcnJlZCBhIHRpY2sgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgYXJpYSBjb3VudHMgYXJlOlxuICAgKiB0aGUgY291bnQgYXJyaXZlcyB3aGlsZSB0aGUgZmlyc3QgY2hhbmdlIGRldGVjdGlvbiBwYXNzIGlzIHN0aWxsIHJ1bm5pbmcuXG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hDbGllbnRQYWdpbmF0aW9uKHRvdGFsOiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGNvbnN0IHsgcGFnZVNpemUsIGN1cnJlbnRQYWdlIH0gPSB0aGlzLmFwaS5wYWdpbmF0aW9uU3RhdGU7XG5cbiAgICBjb25zdCBsYXN0UGFnZSA9IE1hdGgubWF4KE1hdGguY2VpbCh0b3RhbCAvIHBhZ2VTaXplKSwgMSk7XG4gICAgY29uc3QgcGFnZSA9IE1hdGgubWluKGN1cnJlbnRQYWdlLCBsYXN0UGFnZSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcblxuICAgICAgdGhpcy5pbnRlcm5hbFBhZ2luYXRlID0ge1xuICAgICAgICB0b3RhbCxcbiAgICAgICAgY3VycmVudFBhZ2U6IHBhZ2UsXG4gICAgICAgIGxhc3RQYWdlLFxuICAgICAgICBwZXJQYWdlOiBwYWdlU2l6ZSxcbiAgICAgICAgZmlyc3RSb3dJbmRleDogdG90YWwgPT09IDAgPyAwIDogKHBhZ2UgLSAxKSAqIHBhZ2VTaXplICsgMSxcbiAgICAgICAgbGFzdFJvd0luZGV4OiBNYXRoLm1pbihwYWdlICogcGFnZVNpemUsIHRvdGFsKSxcbiAgICAgICAgcGFnZVNpemVPcHRpb25zOiB0aGlzLnBhZ2luYXRlPy5wYWdlU2l6ZU9wdGlvbnMsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgR3JpZCBQcm9wZXJ0aWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYm9keVNjcm9sbExlZnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX29uZVJvd051bWJlckNvbHVtbkRlZjogT25lQ29sdW1uRGVmID0gbnVsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIC8qKlxuICAgKiBSb3cgZ3JvdXBpbmcsIGFzIHRoZSBncmlkIHNlZXMgaXQuXG4gICAqXG4gICAqIFRoZSB0aHJlZSBgX2hvc3QqYCBmaWVsZHMgaG9sZCB3aGF0IHdhcyBib3VuZCBiZWZvcmUgZ3JvdXBpbmcgdG91Y2hlZFxuICAgKiBhbnl0aGluZywgYmVjYXVzZSBncm91cGluZyBpcyByZXZlcnNpYmxlOiB0dXJuIGl0IG9mZiBhbmQgdGhlIGNvbHVtbnMsXG4gICAqIHRoZSBncm91cCBjb2x1bW4gYW5kIHRoZSBncmlkIHR5cGUgYWxsIGhhdmUgdG8gZ28gYmFjayB0byB3aGF0IHRoZSBob3N0XG4gICAqIGFza2VkIGZvci4gYF9hcHBsaWVkR3JvdXBGaWVsZHNgIGlzIHRoZSBncm91cGluZyB0aGUgcmVnaXN0ZXJlZCBjb2x1bW5zXG4gICAqIGN1cnJlbnRseSByZWZsZWN0IOKAlCB0aGUgcm93IG1vZGVsJ3MgY29weSBsaXZlcyBpbiBgYXBpLnJvd0dyb3VwRmllbGRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hvc3RDb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWY8VD5bXSA9IFtdO1xuICBwcml2YXRlIF9ob3N0QXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWYgPSBudWxsO1xuICBwcml2YXRlIF9ob3N0R3JpZFR5cGU6IE9uZUdyaWRUeXBlID0gJ21hc3Rlcic7XG4gIHByaXZhdGUgX2hvc3RUcmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hcHBsaWVkR3JvdXBGaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGFwaTogT25lR3JpZEFwaSxcbiAgICBwcm90ZWN0ZWQgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuXG4gICAgaWYgKGNoYW5nZXNbJ21hc3Rlck5vZGUnXSAmJiBjaGFuZ2VzWydtYXN0ZXJOb2RlJ10uaXNGaXJzdENoYW5nZSkge1xuXG4gICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwgJiYgdGhpcy5tYXN0ZXJOb2RlLmV4cGFuZGVkICYmIHRoaXMuZ3JpZFR5cGUgPT09ICdkZXRhaWwnKSB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwaS5zZXRSb3dEYXRhKFsuLi50aGlzLm1hc3Rlck5vZGUuZGV0YWlsUm93RGF0YV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1tcInJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJyb3dEYXRhXCJdPy5maXJzdENoYW5nZSkge1xuXG4gICAgICB0aGlzLnRyZWVEYXRhIHx8IHRoaXMubWFzdGVyRGV0YWlsID8gdGhpcy5hcGkudXBkYXRlUm93RGF0YSh0aGlzLnJvd0RhdGEpIDogdGhpcy5hcGkuc2V0Um93RGF0YSh0aGlzLnJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgbGF0ZXIgY2hhbmdlcy4gVGhlIGZpcnN0IG9uZSBhcnJpdmVzIGJlZm9yZSBuZ09uSW5pdCBoYXMgcnVuXG4gICAgLy8gYXBpLmluaXQsIHNvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgYXJlIG5vdCByZWdpc3RlcmVkIHlldCBhbmQgdGhlIGJvZHlcbiAgICAvLyBoYXMgbm90IHN1YnNjcmliZWQg4oCUIHRoZSBpbml0aWFsIGxvYWQgaGFwcGVucyBpbiBuZ0FmdGVyVmlld0luaXQgaW5zdGVhZC5cbiAgICBpZiAoY2hhbmdlc1tcInBpbm5lZFRvcFJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJwaW5uZWRUb3BSb3dEYXRhXCJdLmZpcnN0Q2hhbmdlKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldFBpbm5lZFJvd0RhdGEoJ3RvcCcsIHRoaXMucGlubmVkVG9wUm93RGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJwaW5uZWRCb3R0b21Sb3dEYXRhXCJdICYmICFjaGFuZ2VzW1wicGlubmVkQm90dG9tUm93RGF0YVwiXS5maXJzdENoYW5nZSkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLyoqXG4gICAgICogSW5pdCBSb3cgTnVtYmVyIENvbHVtbiBEZWZcbiAgICAgKi9cbiAgICBpZiAodGhpcy5yb3dOdW1iZXIpIHtcblxuICAgICAgIHRoaXMuX29uZVJvd051bWJlckNvbHVtbkRlZiA9IHtcbiAgICAgICAgICBncm91cElkOiB0aGlzLmNvbHVtbkRlZnNbMF0/Lmdyb3VwSWQgPz8gbnVsbCxcbiAgICAgICAgICBmaWVsZDogJ19vbmVSb3dOdW1iZXInLFxuICAgICAgICAgIGhlYWRlck5hbWU6ICdOwronLFxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgICAgICBoZWFkZXJTdHlsZToge1xuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIGFsaWduSXRlbTogJ2NlbnRlcidcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsaWduQ29udGVudDogJ3JpZ2h0JyxcbiAgICAgICAgICBjZWxsQ2xhc3M6ICdmdy1ib2xkJyxcbiAgICAgICAgICB3aWR0aDogNjAsXG4gICAgICAgICAgbWluV2lkdGg6IDQwLFxuICAgICAgICAgIG1heFdpZHRoOiAyMDBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvdyBncm91cGluZzogY29sdW1uIGRlZnMgZGVjbGFyaW5nIGByb3dHcm91cGAgdHVybiB0aGUgZ3JpZCBpbnRvIGFcbiAgICAgKiB0cmVlIG92ZXIgc3ludGhldGljIGdyb3VwIHJvd3MuIENvbmZpZ3VyZWQgYmVmb3JlIGBhcGkuaW5pdGAgYmVjYXVzZVxuICAgICAqIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSDigJQgdGhlIHRyZWVEYXRhIGZsYWcgdGhlIEFQSSBjYXB0dXJlcywgdGhlIGdyb3VwXG4gICAgICogY29sdW1uIHRoZSB0cmVlIGJsb2NrIGJlbG93IHByZXBlbmRzIOKAlCBoYXMgdG8gc2VlIHRoZSB0cmVlIHNoYXBlLlxuICAgICAqXG4gICAgICogV2hhdCB0aGUgaG9zdCBkZWNsYXJlZCBpcyBrZXB0IGFzIGl0IHdhcyBnaXZlbjogcmVncm91cGluZyBhdCBydW50aW1lXG4gICAgICogcmUtZGVyaXZlcyB0aGUgcmVnaXN0ZXJlZCBjb2x1bW5zIGZyb20gaXQsIHNvIGEgY29sdW1uIGhpZGRlbiBiZWNhdXNlXG4gICAgICogaXQgd2FzIGdyb3VwZWQgY29tZXMgYmFjayB3aGVuIGl0IHN0b3BzIGJlaW5nLCBhbmQgb25lIHRoZSBob3N0IGhpZFxuICAgICAqIGl0c2VsZiBzdGF5cyBoaWRkZW4uXG4gICAgICovXG4gICAgdGhpcy5faG9zdENvbHVtbkRlZnMgPSB0aGlzLmNvbHVtbkRlZnMgPz8gW107XG4gICAgdGhpcy5faG9zdEF1dG9Hcm91cENvbHVtbkRlZiA9IHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmO1xuICAgIHRoaXMuX2hvc3RHcmlkVHlwZSA9IHRoaXMuZ3JpZFR5cGU7XG4gICAgdGhpcy5faG9zdFRyZWVEYXRhID0gdGhpcy50cmVlRGF0YTtcblxuICAgIGNvbnN0IHJvd0dyb3VwQ29sdW1uRmllbGRzID0gdGhpcy50cmVlRGF0YSB8fCB0aGlzLm1hc3RlckRldGFpbFxuICAgICAgPyBbXVxuICAgICAgOiByb3dHcm91cEZpZWxkcyh0aGlzLmNvbHVtbkRlZnMpO1xuXG4gICAgaWYgKHJvd0dyb3VwQ29sdW1uRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICB0aGlzLl9hcHBsaWVkR3JvdXBGaWVsZHMgPSByb3dHcm91cENvbHVtbkZpZWxkcztcblxuICAgICAgdGhpcy50cmVlRGF0YSA9IHRydWU7XG4gICAgICB0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCA9IE9ORV9HUk9VUF9DSElMRFJFTl9GSUVMRDtcbiAgICAgIHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmID0gdGhpcy5idWlsZEF1dG9Hcm91cENvbHVtbkRlZigpO1xuICAgICAgdGhpcy5jb2x1bW5EZWZzID0gdGhpcy5ncm91cGVkQ29sdW1uRGVmcyhyb3dHcm91cENvbHVtbkZpZWxkcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBPbmUgR3JpZCBBUElcbiAgICAgKi9cbiAgICB0aGlzLmFwaS5pbml0KHtcbiAgICAgIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLFxuICAgICAgY29sdW1uRGVmczogdGhpcy5jb2x1bW5EZWZzLFxuICAgICAgZGVmYXVsdENvbHVtbkRlZjogdGhpcy5kZWZhdWx0Q29sdW1uRGVmLFxuICAgICAgZ3JvdXBDb2x1bW5EZWZzOiB0aGlzLmdyb3VwQ29sdW1uRGVmcyxcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgIHJvd1NlbGVjdGlvbjogdGhpcy5yb3dTZWxlY3Rpb24sXG4gICAgICBtYXN0ZXJEZXRhaWw6IHRoaXMubWFzdGVyRGV0YWlsLFxuICAgICAgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zOiB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcyxcbiAgICAgIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50OiB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgLy8gVGhlIGhvc3QncyBvd24gdHJlZSBkYXRhLCBub3QgdGhlIHRyZWUgZ3JvdXBpbmcgYnVpbGRzOiBgc2V0Um93R3JvdXBpbmdgXG4gICAgICAvLyB0dXJucyB0aGF0IG9uIGJlbG93LCBhbmQgdGhlIEFQSSBoYXMgdG8gYmUgYWJsZSB0byB0ZWxsIHdob3NlIHRyZWUgaXRcbiAgICAgIC8vIGlzIGJlZm9yZSBpdCBtYXkgcmVwbGFjZSBvbmUuXG4gICAgICB0cmVlRGF0YTogdGhpcy5faG9zdFRyZWVEYXRhLFxuICAgIH0pO1xuXG4gICAgaWYgKHJvd0dyb3VwQ29sdW1uRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRSb3dHcm91cGluZyhyb3dHcm91cENvbHVtbkZpZWxkcywgYWdnQ29sdW1ucyh0aGlzLmNvbHVtbkRlZnMpKTtcbiAgICB9XG5cbiAgICAvLyBSZWdyb3VwaW5nIGF0IHJ1bnRpbWUuIGBhcGkuc2V0Um93R3JvdXBpbmdgIG93bnMgdGhlIHJvdyBtb2RlbCBoYWxmIG9mXG4gICAgLy8gdGhlIHN3aXRjaDsgdGhpcyBpcyB0aGUgb3RoZXIgaGFsZiDigJQgdGhlIGNvbHVtbnMgdGhlIGdyaWQgcmVnaXN0ZXJzIGFuZFxuICAgIC8vIHRoZSBzaGFwZSB0aGUgYm9keSByZW5kZXJzLiBTdWJzY3JpYmVkIGFmdGVyIHRoZSBpbml0aWFsIGNhbGwgYWJvdmUsXG4gICAgLy8gd2hpY2ggYG5nT25Jbml0YCBoYXMgYWxyZWFkeSBhcHBsaWVkLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcigncm93R3JvdXBpbmdDaGFuZ2VkJywgKHBheWxvYWQ6IFJvd0dyb3VwaW5nQ2hhbmdlZEV2ZW50KSA9PiB7XG5cbiAgICAgIHRoaXMuYXBwbHlSb3dHcm91cGluZ0NvbHVtbnMocGF5bG9hZC5ncm91cEZpZWxkcyk7XG4gICAgfSkpO1xuXG4gICAgaWYgKHRoaXMudW5kb1JlZG9DZWxsRWRpdGluZykge1xuXG4gICAgICB0aGlzLmFwaS5lbmFibGVVbmRvUmVkb0NlbGxFZGl0aW5nKHRoaXMudW5kb1JlZG9DZWxsRWRpdGluZ0xpbWl0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikge1xuXG4gICAgICB0aGlzLmFwaS5zZXRDbGllbnRTaWRlUGFnaW5hdGlvbih0cnVlLCB0aGlzLnBhZ2luYXRlPy5wZXJQYWdlID8/IHRoaXMucGFnZVNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHVwIE1hc3RlciBEZXRhaWwgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRHcm91cERlZmF1bHRFeHBhbmRlZCh0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkKTtcbiAgICAgIHRoaXMuYXBpLnNldEdldERldGFpbFJvd0RhdGEodGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM/LmdldERldGFpbFJvd0RhdGEgPz8gbnVsbCk7XG5cbiAgICAgIGlmICh0aGlzLnJvd051bWJlcikge1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbkRlZnMgPSBfLmNvbmNhdCh0aGlzLl9vbmVSb3dOdW1iZXJDb2x1bW5EZWYsIHRoaXMuY29sdW1uRGVmcyk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwaS5zZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCBUcmVlIERhdGEgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGlmICh0aGlzLnRyZWVEYXRhKSB7XG5cbiAgICAgIHRoaXMuZ3JpZFR5cGUgPSAndHJlZSc7XG5cbiAgICAgIHRoaXMuYXBpLnNldFRyZWVEYXRhQ2hpbGRyZW5GaWVsZCh0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCk7XG4gICAgICB0aGlzLmFwaS5zZXRHcm91cERlZmF1bHRFeHBhbmRlZCh0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwaS5zZXRDb2x1bW5EZWZzKHRoaXMuY29sdW1uU3RhY2soKSkpO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiBTZWxlY3Rpb24gQ2hhbmdlZCBFdmVudFxuICAgIC8vIENvbHVtbnMgY2FuIGJlIHJlcGxhY2VkIGF0IHJ1bnRpbWUgdGhyb3VnaCBgYXBpLnNldENvbHVtbkRlZnNgLCBhbmRcbiAgICAvLyBgYXJpYS1jb2xjb3VudGAgaGFzIHRvIGZvbGxvdy5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbHVtbkNoYW5nZWQnLCAoKSA9PiB7XG5cbiAgICAgIHRoaXMuYXJpYUNvbENvdW50ID0gdGhpcy5hcGk/LmdldENvbHVtblN0YXRlKCk/LmNvbHVtbnM/Lmxlbmd0aCA/PyAtMTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbkNoYW5nZWQnLCAocGF5bG9hZDogU2VsZWN0aW9uQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLmVtaXQocGF5bG9hZCk7XG4gICAgfSkpO1xuXG4gICAgLy8gVGhlIGludGVybmFsIGV2ZW50cyBhIGhvc3QgY2FuIGFjdCBvbiwgc3VyZmFjZWQgYXMgb3V0cHV0cy4gU2FtZVxuICAgIC8vIGZvcndhcmRpbmcgcGF0dGVybiBhcyBzZWxlY3Rpb25DaGFuZ2VkIGFib3ZlLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc29ydENoYW5nZWQnLCAocGF5bG9hZDogU29ydENoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICAgIHRoaXMuc29ydENoYW5nZWQuZW1pdChwYXlsb2FkKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NlbGxWYWx1ZUNoYW5nZWQnLCAocGF5bG9hZDogQ2VsbFZhbHVlQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgICAgdGhpcy5jZWxsVmFsdWVDaGFuZ2VkLmVtaXQocGF5bG9hZCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjb2x1bW5Nb3ZlZCcsIChwYXlsb2FkOiBDb2x1bW5Nb3ZlZEV2ZW50KSA9PiB7XG5cbiAgICAgICAgdGhpcy5jb2x1bW5Nb3ZlZC5lbWl0KHBheWxvYWQpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uUmVzaXplZCcsIChwYXlsb2FkOiBDb2x1bW5SZXNpemVkRXZlbnQpID0+IHtcblxuICAgICAgICB0aGlzLmNvbHVtblJlc2l6ZWQuZW1pdChwYXlsb2FkKTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGdyb3VwIGNvbHVtbjogaG9zdC10dW5lZCB0aHJvdWdoIGBhdXRvR3JvdXBDb2x1bW5EZWZgLCBidXQgaXRzIGZpZWxkXG4gICAqIGlzIGFsd2F5cyB0aGUgc3ludGhldGljIGxhYmVsIOKAlCB0aGF0IGlzIHdoZXJlIGEgZ3JvdXAgcm93IGNhcnJpZXMgaXRzXG4gICAqIGRpc3BsYXkgdmFsdWUg4oCUIGFuZCBpdCBhbHdheXMgY2FycmllcyB0aGUgbWFya2VyIHRoZSB0cmVlIG1hY2hpbmVyeSBrZXlzXG4gICAqIG9uLCB3aGljaCBpcyB3aGF0IHB1dHMgdGhlIGV4cGFuZGVyIG9uIHRoaXMgY29sdW1uLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEF1dG9Hcm91cENvbHVtbkRlZigpOiBPbmVDb2x1bW5EZWYge1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlck5hbWU6ICdHcm91cCcsXG4gICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgLi4udGhpcy5faG9zdEF1dG9Hcm91cENvbHVtbkRlZixcbiAgICAgIGZpZWxkOiBPTkVfR1JPVVBfVkFMVUVfRklFTEQsXG4gICAgICBhdXRvR3JvdXBGaWVsZDogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBob3N0J3MgY29sdW1ucyB3aXRoIHRoZSBncm91cGVkLWJ5IG9uZXMgaGlkZGVuLlxuICAgKlxuICAgKiBBIGdyb3VwZWQtYnkgY29sdW1uJ3MgdmFsdWUgaXMgb24gdGhlIGdyb3VwIHJvdzsgc2hvd2luZyB0aGUgZmxhdCBjb2x1bW5cbiAgICogdG9vIHJlcGVhdHMgaXQgZG93biBldmVyeSBsZWFmLiBIaWRkZW4sIG5vdCByZW1vdmVkIOKAlCB0aGUgaG9zdCBjYW4gYnJpbmdcbiAgICogb25lIGJhY2sgd2l0aCBgYXBpLnNldENvbHVtblZpc2libGVgLCBhbmQgdW5ncm91cGluZyByZXN0b3JlcyB3aGF0ZXZlclxuICAgKiB2aXNpYmlsaXR5IHRoZSBob3N0IGl0c2VsZiBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ3JvdXBlZENvbHVtbkRlZnMoZ3JvdXBGaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogT25lQ29sdW1uRGVmPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2hvc3RDb2x1bW5EZWZzLm1hcChjb2x1bW4gPT5cbiAgICAgIGNvbHVtbi5maWVsZCAmJiBncm91cEZpZWxkcy5pbmNsdWRlcyhjb2x1bW4uZmllbGQpID8geyAuLi5jb2x1bW4sIGhpZGU6IHRydWUgfSA6IGNvbHVtbik7XG4gIH1cblxuICAvKiogVGhlIGNvbHVtbnMgdGhlIGdyaWQgcmVnaXN0ZXJzOiByb3cgbnVtYmVycywgdGhlIGdyb3VwIGNvbHVtbiwgdGhlIGhvc3Qncy4gKi9cbiAgcHJpdmF0ZSBjb2x1bW5TdGFjaygpOiBPbmVDb2x1bW5EZWY8VD5bXSB7XG5cbiAgICByZXR1cm4gXy5jb21wYWN0KFtcbiAgICAgIHRoaXMucm93TnVtYmVyID8gdGhpcy5fb25lUm93TnVtYmVyQ29sdW1uRGVmIDogbnVsbCxcbiAgICAgIHRoaXMudHJlZURhdGEgPyB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiA6IG51bGwsXG4gICAgICAuLi50aGlzLmNvbHVtbkRlZnMsXG4gICAgXSkgYXMgT25lQ29sdW1uRGVmPFQ+W107XG4gIH1cblxuICAvKipcbiAgICogUmUtcGx1bWIgZXZlcnl0aGluZyBncm91cGluZyBvd25zIG91dHNpZGUgdGhlIHJvdyBtb2RlbDogdHJlZSBtb2RlLCB0aGVcbiAgICogY2hpbGRyZW4gZmllbGQsIHRoZSBncm91cCBjb2x1bW4sIGFuZCB3aGljaCBvZiB0aGUgaG9zdCdzIGNvbHVtbnMgYXJlXG4gICAqIGhpZGRlbiBiZWNhdXNlIHRoZWlyIHZhbHVlIG5vdyBzaG93cyBvbiBhIGdyb3VwIHJvdy5cbiAgICpcbiAgICogRHJpdmVuIGJ5IGByb3dHcm91cGluZ0NoYW5nZWRgLCBzbyBhIGhvc3QgcmVncm91cHMgdGhyb3VnaCBvbmUgY2FsbCDigJRcbiAgICogYGFwaS5zZXRSb3dHcm91cGluZyhbJ2NvdW50cnknLCAnY2l0eSddKWAg4oCUIGluc3RlYWQgb2YgcmUtY3JlYXRpbmcgdGhlXG4gICAqIGdyaWQuIEdyb3VwaW5nIGFuZCBob3N0IHRyZWUgZGF0YSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCB3aGljaCB0aGUgQVBJXG4gICAqIGVuZm9yY2VzLCBzbyB0aGlzIG9ubHkgZXZlciBzd2l0Y2hlcyBhIHRyZWUgdGhhdCBncm91cGluZyBpdHNlbGYgYnVpbHQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5Um93R3JvdXBpbmdDb2x1bW5zKGdyb3VwRmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuXG4gICAgY29uc3QgdW5jaGFuZ2VkID0gZ3JvdXBGaWVsZHMubGVuZ3RoID09PSB0aGlzLl9hcHBsaWVkR3JvdXBGaWVsZHMubGVuZ3RoXG4gICAgICAmJiBncm91cEZpZWxkcy5ldmVyeSgoZmllbGQsIGluZGV4KSA9PiBmaWVsZCA9PT0gdGhpcy5fYXBwbGllZEdyb3VwRmllbGRzW2luZGV4XSk7XG5cbiAgICBpZiAodW5jaGFuZ2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBncm91cGluZyA9IGdyb3VwRmllbGRzLmxlbmd0aCA+IDA7XG5cbiAgICB0aGlzLl9hcHBsaWVkR3JvdXBGaWVsZHMgPSBbLi4uZ3JvdXBGaWVsZHNdO1xuXG4gICAgdGhpcy50cmVlRGF0YSA9IGdyb3VwaW5nO1xuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gZ3JvdXBpbmcgPyBPTkVfR1JPVVBfQ0hJTERSRU5fRklFTEQgOiBudWxsO1xuICAgIHRoaXMuZ3JpZFR5cGUgPSBncm91cGluZyA/ICd0cmVlJyA6IHRoaXMuX2hvc3RHcmlkVHlwZTtcbiAgICB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiA9IGdyb3VwaW5nID8gdGhpcy5idWlsZEF1dG9Hcm91cENvbHVtbkRlZigpIDogdGhpcy5faG9zdEF1dG9Hcm91cENvbHVtbkRlZjtcbiAgICB0aGlzLmNvbHVtbkRlZnMgPSB0aGlzLmdyb3VwZWRDb2x1bW5EZWZzKGdyb3VwRmllbGRzKTtcblxuICAgIHRoaXMuYXBpLnNldEdyb3VwRGVmYXVsdEV4cGFuZGVkKHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQpO1xuICAgIHRoaXMuYXBpLnNldENvbHVtbkRlZnModGhpcy5jb2x1bW5TdGFjaygpKTtcblxuICAgIC8vIFRoZSBncmlkIHR5cGUsIHRoZSB0cmVlIGZsYWcgYW5kIHRoZSBncm91cCBjb2x1bW4gYXJlIGFsbCByZW5kZXJlZFxuICAgIC8vIHRocm91Z2ggYmluZGluZ3MsIGFuZCB0aGlzIHJ1bnMgZnJvbSBhbiBldmVudCByYXRoZXIgdGhhbiBmcm9tIGFcbiAgICAvLyB0ZW1wbGF0ZSBjYWxsYmFjay5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFRoZSBoZWFkZXIgZm9sbG93cyB0aGUgYm9keSB0aHJvdWdoIChib2R5U2Nyb2xsKSAtPiBbc2Nyb2xsTGVmdF0uIEEgc2Vjb25kXG4gICAgLy8gc3Vic2NyaXB0aW9uIHVzZWQgdG8gbGl2ZSBoZXJlIHRoYXQgcXVlcmllZCAnLm9uZS1ncmlkLWhlYWRlci1jb2x1bW4nIOKAlCBhXG4gICAgLy8gaGVhZGVyICpjZWxsKiwgbm90IHRoZSB2aWV3cG9ydCDigJQgYW5kIGFzc2lnbmVkIHNjcm9sbExlZnQgdG8gaXQsIHdoaWNoXG4gICAgLy8gZG9lcyBub3RoaW5nLiBJdCBoYXMgYmVlbiByZW1vdmVkIHJhdGhlciB0aGFuIHJlcGFpcmVkOiB0aGUgYmluZGluZyBwYXRoXG4gICAgLy8gaXMgdGhlIG9uZSB0aGF0IHdvcmtzLCBhbmQgaXQgbm93IGRyaXZlcyB0aGUgcGlubmVkIGNvbHVtbnMgdG9vLlxuXG4gICAgLy8gUGlubmVkIHJvd3MsIG5vdyB0aGF0IHRoZSBjb2x1bW5zIGFyZSByZWdpc3RlcmVkIGFuZCB0aGUgYm9keSBpc1xuICAgIC8vIGxpc3RlbmluZy4gVW5saWtlIHJvd0RhdGEgdGhlc2UgYXJlIG5vdCBsb2FkZWQgdGhyb3VnaCAob25HcmlkUmVhZHkpIOKAlFxuICAgIC8vIGJpbmRpbmcgdGhlbSBpcyB0aGUgd2hvbGUgY29udHJhY3Qg4oCUIHNvIHRoZSBncmlkIGxvYWRzIHRoZW0gaXRzZWxmLlxuICAgIGlmICh0aGlzLnBpbm5lZFRvcFJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCd0b3AnLCB0aGlzLnBpbm5lZFRvcFJvd0RhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgR3JpZCBSZWFkeSBFdmVudFxuICAgICAqL1xuICAgIHRoaXMub25HcmlkUmVhZHkuZW1pdCh7IGFwaTogdGhpcy5hcGkgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEJvZHkgU2Nyb2xsIEV2ZW50XG4gICAqL1xuICBvbkJvZHlTY3JvbGwoc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLmJvZHlTY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgUmVhZHkgRXZlbnQgb2YgYSBuZXN0ZWQgTWFzdGVyIERldGFpbCBHcmlkXG4gICAqL1xuICBvbkRldGFpbEdyaWRSZWFkeShwYXJhbXM6IE9uZUdyaWRSZWFkeUV2ZW50KSB7XG5cbiAgICBwYXJhbXMuYXBpLnNldFJvd0RhdGEodGhpcy5tYXN0ZXJOb2RlPy5kZXRhaWxSb3dEYXRhID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXNzaW5nIGNvcHkgZXZlbnQgdG8gZ3JpZCBib2R5XG4gICAqL1xuICBvbkdyaWRDb3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuXG4gICAgdGhpcy5ncmlkQ29weSQubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBSb3cgQWN0aW9uIEV2ZW50cyB0byBQYXJlbnQgQ29tcG9uZW50XG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQWRkTmV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dBZGROZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25WaWV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dWaWV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTG9jYXRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xvY2F0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RvY3VtZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ29weShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Q29weS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRlbGV0ZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RGVsZXRlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uR290b0xpc3QoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0dvdG9MaXN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRWRpdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RWRpdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblByaW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dQcmludC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkhpc3RvcnkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0hpc3RvcnkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25PcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd09wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxhbmd1YWdlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMYW5ndWFnZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0NlbGxPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1NlbGVjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVNoaWZ0RG91YmxlQ2xpY2soZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblNoaWZ0RG91YmxlQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogVG90YWxzIGZvciBgYXJpYS1yb3djb3VudGAgLyBgYXJpYS1jb2xjb3VudGAuXG4gICAqXG4gICAqIEhlbGQgYXMgZmllbGRzIHJhdGhlciB0aGFuIGNvbXB1dGVkIGluIHRoZSB0ZW1wbGF0ZTogdGhleSBhcmUgcmVhZCBvbiBldmVyeVxuICAgKiBjaGFuZ2UgZGV0ZWN0aW9uIHBhc3MgYW5kIG9ubHkgYWN0dWFsbHkgY2hhbmdlIHdoZW4gdGhlIGRhdGEgb3IgdGhlIGNvbHVtbnNcbiAgICogZG8uIGAtMWAgaXMgdGhlIEFSSUEgdmFsdWUgZm9yIFwidW5rbm93blwiLCB3aGljaCBpcyB0aGUgaG9uZXN0IGFuc3dlciBiZWZvcmVcbiAgICogdGhlIGZpcnN0IHJvdyBhcnJpdmVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFyaWFSb3dDb3VudCA9IC0xO1xuICBwcm90ZWN0ZWQgYXJpYUNvbENvdW50ID0gLTE7XG5cbiAgaW52b2tlUm93Q291bnRDaGFuZ2VkKGxlbmd0aDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLnJlZnJlc2hBcmlhQ291bnRzKGxlbmd0aCk7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5yZWZyZXNoQ2xpZW50UGFnaW5hdGlvbihsZW5ndGgpO1xuXG4gICAgdGhpcy5yb3dDb3VudENoYW5nZWQuZW1pdChsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZSB0aGUgdG90YWxzIGEgc2NyZWVuIHJlYWRlciBpcyB0b2xkIGFib3V0LlxuICAgKlxuICAgKiBgYXJpYS1yb3djb3VudGAgY291bnRzIGV2ZXJ5IHJvdyB0aGUgZ3JpZCByZXByZXNlbnRzLCBub3QgdGhlIGhhbmRmdWwgdGhlXG4gICAqIHZpcnR1YWwgc2Nyb2xsZXIgY3VycmVudGx5IGhhcyBpbiB0aGUgRE9NIOKAlCB0aGUgaGVhZGVyIHJvdywgdGhlIHBpbm5lZCByb3dzXG4gICAqIGVpdGhlciBzaWRlLCBhbmQgYWxsIHRoZSBkYXRhIHJvd3MuXG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hBcmlhQ291bnRzKGRhdGFSb3dzOiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGNvbnN0IHBpbm5lZCA9ICh0aGlzLnBpbm5lZFRvcFJvd0RhdGE/Lmxlbmd0aCA/PyAwKSArICh0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGE/Lmxlbmd0aCA/PyAwKTtcblxuICAgIGNvbnN0IHJvd3MgPSAxICsgcGlubmVkICsgZGF0YVJvd3M7XG4gICAgY29uc3QgY29scyA9IHRoaXMuYXBpPy5nZXRDb2x1bW5TdGF0ZSgpPy5jb2x1bW5zPy5sZW5ndGggPz8gLTE7XG5cbiAgICBpZiAocm93cyA9PT0gdGhpcy5hcmlhUm93Q291bnQgJiYgY29scyA9PT0gdGhpcy5hcmlhQ29sQ291bnQpIHJldHVybjtcblxuICAgIC8vIERlZmVycmVkIGEgdGljay4gVGhlIGJvZHkgZW1pdHMgaXRzIHJvdyBjb3VudCB3aGlsZSB0aGUgZmlyc3QgY2hhbmdlXG4gICAgLy8gZGV0ZWN0aW9uIHBhc3MgaXMgc3RpbGwgcnVubmluZywgYWZ0ZXIgdGhpcyBjb21wb25lbnQncyBvd24gYXR0cmlidXRlc1xuICAgIC8vIHdlcmUgY2hlY2tlZCDigJQgYXNzaWduaW5nIGhlcmUgZGlyZWN0bHkgaXMgdGhlIHRleHRib29rIE5HMDEwMC4gVGhlIGJvZHlcbiAgICAvLyBkZWZlcnMgaXRzIG5vZGUgbGlzdCBmb3IgdGhlIHNhbWUgcmVhc29uLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuXG4gICAgICB0aGlzLmFyaWFSb3dDb3VudCA9IHJvd3M7XG4gICAgICB0aGlzLmFyaWFDb2xDb3VudCA9IGNvbHM7XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VsbE9wdGlvbk1lbnVTZWxlY3RlZChldmVudDogQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50KSB7XG5cbiAgICB0aGlzLmNlbGxPcHRpb25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZyBQYWdpbmF0aW9uIEV2ZW50cyB0byBQYXJlbnQgQ29tcG9uZW50XG4gICAqL1xuICBpbnZva2VHb1RvRmlyc3QoKSB7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5hcGkuc2V0Q3VycmVudFBhZ2UoMSk7XG5cbiAgICB0aGlzLmdvVG9GaXJzdC5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VHb1RvUHJldmlvdXMoKSB7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5hcGkuc2V0Q3VycmVudFBhZ2UodGhpcy5hcGkucGFnaW5hdGlvblN0YXRlLmN1cnJlbnRQYWdlIC0gMSk7XG5cbiAgICB0aGlzLmdvVG9QcmV2aW91cy5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VHb1RvTmV4dCgpIHtcblxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVQYWdpbmF0aW9uKSB0aGlzLmFwaS5zZXRDdXJyZW50UGFnZSh0aGlzLmFwaS5wYWdpbmF0aW9uU3RhdGUuY3VycmVudFBhZ2UgKyAxKTtcblxuICAgIHRoaXMuZ29Ub05leHQuZW1pdCgpO1xuICB9XG5cbiAgaW52b2tlR29Ub0xhc3QoKSB7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5hcGkuc2V0Q3VycmVudFBhZ2UodGhpcy5pbnRlcm5hbFBhZ2luYXRlLmxhc3RQYWdlID8/IDEpO1xuXG4gICAgdGhpcy5nb1RvTGFzdC5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VQYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogbnVtYmVyKSB7XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikgdGhpcy5hcGkuc2V0UGFnZVNpemUocGFnZVNpemUpO1xuXG4gICAgdGhpcy5wYWdlU2l6ZUNoYW5nZS5lbWl0KHBhZ2VTaXplKTtcbiAgfVxuXG4gIGludm9rZVJvd0RyYWdFbmQoZXZlbnQ6IE9uZVJvd0RyYWdFdmVudDxUPikge1xuXG4gICAgdGhpcy5yb3dEcmFnRW5kLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlRXhwYW5zaW9uQ2hhbmdlZENsaWNrKGV2ZW50OiBFeHBhbnNpb25DaGFuZ2VkRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMuZXhwYW5zaW9uQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgVW5zdWJzY3JpYmUgQWxsIEV2ZW50IExpc3RlbmRlcnNcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gICAgdGhpcy5yb3dEYXRhID0gW107XG5cbiAgICB0aGlzLmFwaS5kZXN0cm95KCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPCEtLSBObyB0YWJpbmRleCBoZXJlLiBUaGUgdGFiIHN0b3AgYmVsb25ncyBvbiB0aGUgYm9keSB2aWV3cG9ydCwgd2hpY2ggaXMgdGhlXG4gICAgIGVsZW1lbnQgdGhhdCBhY3R1YWxseSBzY3JvbGxzOyBhIGZvY3VzYWJsZSB3cmFwcGVyIGFyb3VuZCBhIHNjcm9sbGFibGVcbiAgICAgY2hpbGQgaXMgcmVhY2hhYmxlIGJ1dCBjYW5ub3QgYmUgc2Nyb2xsZWQgd2l0aCB0aGUga2V5Ym9hcmQuIFRoZSBjb3B5XG4gICAgIGhhbmRsZXIgaXMgdW5hZmZlY3RlZDogYSBjb3B5IGV2ZW50IGZpcmVkIGF0IHRoZSBmb2N1c2VkIHZpZXdwb3J0IGJ1YmJsZXNcbiAgICAgdXAgdG8gaGVyZS4gLS0+XG48IS0tIHJvbGU9XCJncmlkXCIgaXMgd2hhdCB0dXJucyB0aGlzIGZyb20gYSBwaWxlIG9mIGRpdnMgaW50byBzb21ldGhpbmcgYSBzY3JlZW5cbiAgICAgcmVhZGVyIGNhbiBuYXZpZ2F0ZS4gVGhlIGNvdW50cyBhcmUgdGhlICp0b3RhbCog4oCUIGBhcmlhLXJvd2NvdW50YCBpbmNsdWRlc1xuICAgICB0aGUgaGVhZGVyIHJvdyBhbmQgYW55IHBpbm5lZCByb3dzLCBhbmQgYm90aCBzdGF5IGNvcnJlY3Qgd2hpbGUgdGhlIGJvZHkgaXNcbiAgICAgdmlydHVhbGlzZWQgYW5kIG1vc3Qgcm93cyBhcmUgbm90IGluIHRoZSBET00sIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGVzZVxuICAgICBhdHRyaWJ1dGVzIGV4aXN0IHRvIGNvbW11bmljYXRlLiAtLT5cbjxkaXYgI29nUmVmXG4gICAgY2xhc3M9XCJvbmUtZ3JpZFwiXG4gICAgcm9sZT1cImdyaWRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ3JpZExhYmVsXCJcbiAgICBbYXR0ci5hcmlhLXJvd2NvdW50XT1cImFyaWFSb3dDb3VudFwiXG4gICAgW2F0dHIuYXJpYS1jb2xjb3VudF09XCJhcmlhQ29sQ291bnRcIlxuICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cInJvd1NlbGVjdGlvbiA9PT0gJ211bHRpcGxlJyA/IHRydWUgOiBudWxsXCJcbiAgICAoY29weSk9XCJvbkdyaWRDb3B5KCRldmVudClcIj5cbiAgICBcbiAgICA8IS0tIEhlYWRlcnMgLS0+XG4gICAgPG9uZS1ncmlkLWhlYWRlclxuICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgIFtlbmFibGVHcm91cENvbHVtbkRlZnNdPVwiZW5hYmxlR3JvdXBDb2x1bW5EZWZzXCJcbiAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgW3Njcm9sbExlZnRdPVwiYm9keVNjcm9sbExlZnRcIlxuICAgICAgICBbaGVhZGVyTWVudV09XCJoZWFkZXJNZW51XCJcbiAgICAgICAgW2ZpbHRlclJvd109XCJmaWx0ZXJSb3dcIlxuICAgICAgICAoaGVhZGVyTWVudUNsaWNrKT1cImhlYWRlck1lbnVDbGljay5lbWl0KCRldmVudClcIlxuICAgIC8+XG5cbiAgICA8IS0tIEJvZHkgLS0+XG4gICAgPG9uZS1ncmlkLWJvZHlcbiAgICAgICAgW2dyaWRDb3B5JF09XCJncmlkQ29weSRcIlxuICAgICAgICBbcm93RGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgW3Bpbm5lZFRvcFJvd0RhdGFdPVwicGlubmVkVG9wUm93RGF0YVwiXG4gICAgICAgIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cInBpbm5lZEJvdHRvbVJvd0RhdGFcIlxuICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgIFtyb3dOdW1iZXJdPVwicm93TnVtYmVyXCJcbiAgICAgICAgW3BhZ2luYXRpb25dPVwicGFnaW5hdGlvblwiXG4gICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgIFtlZGl0VHlwZV09XCJlZGl0VHlwZVwiXG4gICAgICAgIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgIFt0cmVlRGF0YV09XCJ0cmVlRGF0YVwiXG4gICAgICAgIFtncmlkVHlwZV09XCJncmlkVHlwZVwiXG4gICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgW21hc3Rlck5vZGVdPVwibWFzdGVyTm9kZVwiXG4gICAgICAgIFtkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgW2RldGFpbFJlbmRlcmVyQ29tcG9uZW50XT1cImRldGFpbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgW2RldGFpbEdyaWRUZW1wbGF0ZV09XCJkZXRhaWxHcmlkVHBsXCJcbiAgICAgICAgW3RyZWVEYXRhQ2hpbGRyZW5GaWVsZF09XCJ0cmVlRGF0YUNoaWxkcmVuRmllbGRcIlxuICAgICAgICBbYXV0b0dyb3VwQ29sdW1uRGVmXT1cImF1dG9Hcm91cENvbHVtbkRlZlwiXG4gICAgICAgIFtncm91cERlZmF1bHRFeHBhbmRlZF09XCJncm91cERlZmF1bHRFeHBhbmRlZFwiXG4gICAgICAgIChyb3dEcmFnRW5kKT1cImludm9rZVJvd0RyYWdFbmQoJGV2ZW50KVwiXG4gICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAob25Sb3dBZGROZXcpPVwiaW52b2tlUm93QWN0aW9uQWRkTmV3KCRldmVudClcIlxuICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dEb2N1bWVudCk9XCJpbnZva2VSb3dBY3Rpb25Eb2N1bWVudCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAob25Sb3dHb3RvTGlzdCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93SGlzdG9yeSk9XCJpbnZva2VSb3dBY3Rpb25IaXN0b3J5KCRldmVudClcIlxuICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93Q2VsbE9wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25DZWxsT3B0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dTZWxlY3Rpb24pPVwiaW52b2tlUm93QWN0aW9uU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAob25TaGlmdERvdWJsZUNsaWNrKT1cImludm9rZVNoaWZ0RG91YmxlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChyb3dDb3VudENoYW5nZWQpPVwiaW52b2tlUm93Q291bnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAoY2VsbE9wdGlvblNlbGVjdCk9XCJjZWxsT3B0aW9uTWVudVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAoYm9keVNjcm9sbCk9XCJvbkJvZHlTY3JvbGwoJGV2ZW50KVwiXG4gICAgLz5cbiAgICBcbiAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgQGlmIChwYWdpbmF0aW9uIHx8IGNsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICAgIDxvbmUtZ3JpZC1wYWdpbmF0aW9uXG4gICAgICAgICAgICBbcGFnaW5hdGVdPVwiY2xpZW50U2lkZVBhZ2luYXRpb24gPyBpbnRlcm5hbFBhZ2luYXRlIDogcGFnaW5hdGVcIlxuICAgICAgICAgICAgKGdvVG9GaXJzdCk9XCJpbnZva2VHb1RvRmlyc3QoKVwiXG4gICAgICAgICAgICAoZ29Ub0xhc3QpPVwiaW52b2tlR29Ub0xhc3QoKVwiXG4gICAgICAgICAgICAoZ29Ub1ByZXZpb3VzKT1cImludm9rZUdvVG9QcmV2aW91cygpXCJcbiAgICAgICAgICAgIChnb1RvTmV4dCk9XCJpbnZva2VHb1RvTmV4dCgpXCJcbiAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJpbnZva2VQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICB9XG5cbiAgICA8IS0tIE1hc3RlciBEZXRhaWwgR3JpZCB0ZW1wbGF0ZSwgcmVuZGVyZWQgaW5zaWRlIG9uZS1ncmlkLWJvZHkgdmlhIG5nVGVtcGxhdGVPdXRsZXQuXG4gICAgICAgICBEZWNsYXJlZCBoZXJlIChzZWxmLXJlZmVyZW5jZSkgc28gb25lLWdyaWQtYm9keSdzIHRlbXBsYXRlIGRvZXMgbm90IG5lZWQgdG9cbiAgICAgICAgIGltcG9ydCBvbmUtZ3JpZCwgd2hpY2ggd291bGQgY3JlYXRlIGFuIHVuc3VwcG9ydGVkIGNvbXBpbGUtdGltZSBjeWNsZS4gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNkZXRhaWxHcmlkVHBsIGxldC1ub2RlPVwibm9kZVwiPlxuICAgICAgICA8b25lLWdyaWRcbiAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibm9kZS5kZXRhaWxSb3dIZWlnaHRcIlxuICAgICAgICAgICAgW2dyaWRUeXBlXT1cIidkZXRhaWwnXCJcbiAgICAgICAgICAgIFttYXN0ZXJOb2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgW21hc3RlckRldGFpbF09XCJtYXN0ZXJEZXRhaWxcIlxuICAgICAgICAgICAgW2RlZmF1bHRDb2x1bW5EZWZdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zLmRlZmF1bHRDb2x1bW5EZWZcIlxuICAgICAgICAgICAgW2NvbHVtbkRlZnNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zLmNvbHVtbkRlZnNcIlxuICAgICAgICAgICAgW3Jvd0RhdGFdPVwibm9kZT8uZGV0YWlsUm93RGF0YVwiXG4gICAgICAgICAgICBbcm93TnVtYmVyXT1cImRldGFpbENlbGxSZW5kZXJlclBhcmFtcy5kZXRhaWxHcmlkT3B0aW9ucz8ucm93TnVtYmVyXCJcbiAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICBbc3VibWl0dGVkXT1cInN1Ym1pdHRlZFwiXG4gICAgICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0dvdG9EZXRhaWwpPVwiaW52b2tlUm93QWN0aW9uR290b0RldGFpbCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dMb2NhdGlvbik9XCJpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RGVsZXRlKT1cImludm9rZVJvd0FjdGlvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93UHJpbnQpPVwiaW52b2tlUm93QWN0aW9uUHJpbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93TGFuZ3VhZ2UpPVwiaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAob25HcmlkUmVhZHkpPVwib25EZXRhaWxHcmlkUmVhZHkoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PiJdfQ==
|
|
760
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb21wb25lbnRzL29uZS1ncmlkL29uZS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC9vbmUtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQXVCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuTCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUV0RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxN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cEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBT0csV0FBVztzQkFBcEIsTUFBTTtnQkFPRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBR0csV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxhQUFhO3NCQUF0QixNQUFNO2dCQUdHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUtFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFVRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFR5cGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lQ29sdW1uRGVmLCBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgT25lR3JpZFJlYWR5RXZlbnQsIE9uZUdyaWRSb3dBY3Rpb25FdmVudCwgT25lR3JpZFR5cGUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZ3JpZC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZVBhZ2luYXRpb25QYXJhbXMgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcGFnaW5hdGlvbi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50LCBDZWxsVmFsdWVDaGFuZ2VkRXZlbnQsIENvbHVtbk1vdmVkRXZlbnQsIENvbHVtblJlc2l6ZWRFdmVudCwgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50LCBSb3dHcm91cGluZ0NoYW5nZWRFdmVudCwgUm93U2VsZWN0aW9uTW9kZSwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LCBTb3J0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV4cGFuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRSb3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29nLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRSb3dEcmFnU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtcm93LWRyYWcuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dEcmFnRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcm93LWRyYWcubW9kZWwnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBhZ2dDb2x1bW5zLCBPTkVfR1JPVVBfQ0hJTERSRU5fRklFTEQsIE9ORV9HUk9VUF9WQUxVRV9GSUVMRCwgcm93R3JvdXBGaWVsZHMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL29uZS1yb3ctZ3JvdXBpbmcuaGVscGVyJztcbmltcG9ydCB7IE9uZUdyaWRIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPbmVHcmlkQm9keUNvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLWJvZHkvb25lLWdyaWQtYm9keS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lR3JpZFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1wYWdpbmF0aW9uL29uZS1ncmlkLXBhZ2luYXRpb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE9uZUdyaWRIZWFkZXJDb21wb25lbnQsXG4gICAgT25lR3JpZEJvZHlDb21wb25lbnQsXG4gICAgT25lR3JpZFBhZ2luYXRpb25Db21wb25lbnQsXG4gIF0sXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQuY29tcG9uZW50LnNjc3MnLFxuICBwcm92aWRlcnM6IFtcbiAgICBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIE9uZUdyaWRBcGksXG4gICAgT2dDb2x1bW5TZXJ2aWNlLFxuICAgIE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlLFxuICAgIE9uZUdyaWRSb3dTZXJ2aWNlLFxuICAgIE9uZUdyaWRDZWxsU2VydmljZSxcbiAgICBPbmVHcmlkUm93RHJhZ1NlcnZpY2VcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBHZXQgR2VuZXJhbCBEYXRhIGZyb20gUGFyZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdvZ1JlZicsIHsgc3RhdGljOiB0cnVlIH0pIG9nUmVmITogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgcm93TnVtYmVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93ZWRFZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbnRleHQ6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIHJvd0RhdGE6IFRbXSA9IFtdO1xuICBASW5wdXQoKSByb3dTZWxlY3Rpb246IFJvd1NlbGVjdGlvbk1vZGUgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZ3JpZCdzIGFjY2Vzc2libGUgbmFtZS5cbiAgICpcbiAgICogQSBgcm9sZT1cImdyaWRcImAgd2l0aCBubyBuYW1lIGlzIGFubm91bmNlZCBhcyBhbiB1bmxhYmVsbGVkIGdyaWQsIHdoaWNoXG4gICAqIHRlbGxzIGEgc2NyZWVuLXJlYWRlciB1c2VyIG5vdGhpbmcgYWJvdXQgd2hhdCB0aGV5IGhhdmUgbGFuZGVkIGluLiBTZXQgaXRcbiAgICogdG8gd2hhdGV2ZXIgdGhlIGdyaWQgaXMgc2hvd2luZyDigJQgXCJFbXBsb3llZXNcIiwgXCJPcmRlciBsaW5lc1wiLlxuICAgKi9cbiAgQElucHV0KCkgZ3JpZExhYmVsOiBzdHJpbmcgPSAnRGF0YSBncmlkJztcblxuICBASW5wdXQoKSBlbmFibGVHcm91cENvbHVtbkRlZnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZ3JvdXBDb2x1bW5EZWZzOiBPbmVHcm91cENvbHVtbkRlZltdID0gW107XG5cbiAgQElucHV0KCkgZGVmYXVsdENvbHVtbkRlZjogT25lQ29sdW1uRGVmPFQ+ID0ge307XG4gIEBJbnB1dCgpIGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdID0gW107XG5cbiAgLyoqXG4gICAqIFJvd3MgYW5jaG9yZWQgYWJvdmUgdGhlIHNjcm9sbGluZyBhcmVhIOKAlCBhIGhlYWRlciBzdW1tYXJ5LCBvciBhbiBlbnRyeSBsaW5lLlxuICAgKiBUaGV5IGtlZXAgY29sdW1uIGFsaWdubWVudCBhbmQgc2Nyb2xsIHNpZGV3YXlzIHdpdGggdGhlIGJvZHksIGJ1dCBhcmUgbm90XG4gICAqIGRhdGE6IHNvcnRpbmcsIGZpbHRlcmluZywgc2VsZWN0aW9uIGFuZCB0aGUgcm93IGNvdW50IGFsbCBwYXNzIHRoZW0gYnkuXG4gICAqL1xuICBASW5wdXQoKSBwaW5uZWRUb3BSb3dEYXRhOiBUW10gPSBbXTtcblxuICAvKiogUm93cyBhbmNob3JlZCBiZWxvdyB0aGUgc2Nyb2xsaW5nIGFyZWEsIHR5cGljYWxseSBhIHRvdGFscyByb3cuICovXG4gIEBJbnB1dCgpIHBpbm5lZEJvdHRvbVJvd0RhdGE6IFRbXSA9IFtdO1xuXG4gIC8vIFJYSlMgUHJvcGVydGllc1xuICBwcm90ZWN0ZWQgZ3JpZENvcHkkID0gbmV3IFN1YmplY3Q8Q2xpcGJvYXJkRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIE1hc3RlciBEZXRhaWwgRmVhdHVyZVxuICAgKi9cbiAgQElucHV0KCkgZ3JpZFR5cGU6IE9uZUdyaWRUeXBlID0gJ21hc3Rlcic7XG4gIEBJbnB1dCgpIG1hc3RlckRldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXN0ZXJOb2RlOiBPbmVSb3dOb2RlID0gbnVsbDtcbiAgQElucHV0KCkgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zOiBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM7XG4gIEBJbnB1dCgpIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50OiBUeXBlPE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIFRyZWUgRGF0YSBGZWF0dXJlXG4gICAqL1xuICBASW5wdXQoKSB0cmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZyA9IG51bGw7XG4gIEBJbnB1dCgpIGF1dG9Hcm91cENvbHVtbkRlZjogT25lQ29sdW1uRGVmO1xuICBASW5wdXQoKSBncm91cERlZmF1bHRFeHBhbmRlZDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogQmluZCBSb3cgQWN0aW9uIEV2ZW50cyAmIERhdGEgdG8gUGFyZW50XG4gICAqL1xuICAvKipcbiAgICogQSByb3cgZmluaXNoZWQgbW92aW5nLiBGaXJlcyBvbmNlIHBlciBjb21wbGV0ZWQgcmVvcmRlciDigJQgbm90IHdoaWxlIHRoZVxuICAgKiBwb2ludGVyIGlzIGluIGZsaWdodCDigJQgYW5kIG9ubHkgd2hlbiB0aGUgcG9zaXRpb24gYWN0dWFsbHkgY2hhbmdlZC5cbiAgICovXG4gIEBPdXRwdXQoKSByb3dEcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVSb3dEcmFnRXZlbnQ8VD4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBoZWFkZXIncyDii64gYnV0dG9uIHdhcyBwcmVzc2VkIGZvciB0aGlzIGNvbHVtbi5cbiAgICpcbiAgICogVGhlIGdyaWQgaGFzIG5vIGNvbHVtbiBtZW51IG9mIGl0cyBvd24g4oCUIHRoaXMgcmVwb3J0cyB0aGUgaW50ZW50IHNvIHRoZVxuICAgKiBob3N0IGNhbiBzaG93IHdoYXRldmVyIGEgY29sdW1uIG1lbnUgbWVhbnMgaW4gaXRzIGFwcC4gU2V0XG4gICAqIGBjb2x1bW5EZWYuc3VwcHJlc3NIZWFkZXJNZW51QnV0dG9uYCB0byBoaWRlIHRoZSBidXR0b24gZW50aXJlbHkuXG4gICAqL1xuICBAT3V0cHV0KCkgaGVhZGVyTWVudUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVDb2x1bW5EZWY8VD4+KCk7XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgZ3JpZCdzIG93biBjb2x1bW4gbWVudSBiZWhpbmQgdGhlIGhlYWRlciDii64gYnV0dG9uOiBzb3J0LCBwaW4sXG4gICAqIGhpZGUuIE9wdC1pbiDigJQgYSBob3N0IHRoYXQgYnVpbHQgaXRzIG1lbnUgb24gYChoZWFkZXJNZW51Q2xpY2spYCBrZWVwc1xuICAgKiBleGFjdGx5IHdoYXQgaXQgaGFkLCBhbmQgdGhlIGludGVudCBzdGlsbCBlbWl0cyBlaXRoZXIgd2F5LlxuICAgKi9cbiAgQElucHV0KCkgaGVhZGVyTWVudTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSBmaWx0ZXIgaW5wdXQgdW5kZXIgZXZlcnkgY29sdW1uIHdob3NlIGBmaWx0ZXJhYmxlYCByZXNvbHZlc1xuICAgKiB0cnVlLiBUaGUgaW5wdXRzIGZlZWQgYGFwaS5zZXRGaWx0ZXJNb2RlbGAgd2l0aCBjb250YWlucy1jb25kaXRpb25zLFxuICAgKiBkZWJvdW5jZWQ7IGZpbHRlcnMgb24gZmllbGRzIHdpdGhvdXQgYW4gaW5wdXQgYXJlIGxlZnQgdW50b3VjaGVkLlxuICAgKi9cbiAgQElucHV0KCkgZmlsdGVyUm93OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJlY29yZCBjb21taXR0ZWQgY2VsbCBlZGl0cyBzbyBgYXBpLnVuZG9DZWxsRWRpdGluZ2AgL1xuICAgKiBgYXBpLnJlZG9DZWxsRWRpdGluZ2AgKGFuZCBDdHJsK1ogLyBDdHJsK1kgaW4gdGhlIGdyaWQpIGNhbiB3YWxrIHRoZW0uXG4gICAqIFByb2dyYW1tYXRpYyBgc2V0RGF0YVZhbHVlYCB3cml0ZXMgYXJlIG5vdCByZWNvcmRlZC5cbiAgICovXG4gIEBJbnB1dCgpIHVuZG9SZWRvQ2VsbEVkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSG93IG1hbnkgZWRpdHMgdGhlIHVuZG8gc3RhY2sga2VlcHMuICovXG4gIEBJbnB1dCgpIHVuZG9SZWRvQ2VsbEVkaXRpbmdMaW1pdDogbnVtYmVyID0gMTA7XG5cbiAgLyoqXG4gICAqIGAnZnVsbFJvdydgIG9wZW5zIGV2ZXJ5IGVkaXRhYmxlIGNlbGwgb2YgdGhlIHJvdyBvbiBhIGRvdWJsZS1jbGljayBhbmRcbiAgICogY29tbWl0cyB0aGVtIHRvZ2V0aGVyIOKAlCBFbnRlciBhbnl3aGVyZSBpbiB0aGUgcm93LCBvciBmb2N1cyBsZWF2aW5nIHRoZVxuICAgKiByb3cuIEVzY2FwZSBjbG9zZXMgdGhlIHdob2xlIHJvdyB3aXRob3V0IGNvbW1pdHRpbmcuIERlZmF1bHQ6IGNlbGxzIGVkaXRcbiAgICogb25lIGF0IGEgdGltZS5cbiAgICovXG4gIEBJbnB1dCgpIGVkaXRUeXBlOiAnZnVsbFJvdycgfCBudWxsID0gbnVsbDtcblxuICBAT3V0cHV0KCkgb25HcmlkUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSZWFkeUV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvRGV0YWlsID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0RldGFpbCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dBZGROZXcgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93VmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dMb2NhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dEb2N1bWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0RlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1ByaW50ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0hpc3RvcnkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93T3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0xhbmd1YWdlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1NlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25TaGlmdERvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSByb3dDb3VudENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwYW5zaW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgc29ydCBtb2RlbCBjaGFuZ2VkIOKAlCBhIGhlYWRlciBjbGljayBvciBgYXBpLm9uU29ydENoYW5nZWRgLiBDYXJyaWVzXG4gICAqIHRoZSByZS1zb3J0ZWQgbm9kZXMgYW5kIHRoZSBtb2RlbCB0aGF0IHByb2R1Y2VkIHRoZW07IGBhcGkuc29ydE1vZGVsYFxuICAgKiBzdGF5cyByZWFkYWJsZSBiZXR3ZWVuIGVtaXNzaW9ucy5cbiAgICovXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ydENoYW5nZWRFdmVudDxUPj4oKTtcblxuICAvKipcbiAgICogQW4gaW5saW5lIGVkaXQgd2FzIGNvbW1pdHRlZCB3aXRoIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpdFxuICAgKiBzdGFydGVkIHdpdGguIFByb2dyYW1tYXRpYyBgbm9kZS5zZXREYXRhVmFsdWVgIGRvZXMgbm90IGVtaXQgaGVyZSDigJQgdGhlXG4gICAqIGNhbGxlciBhbHJlYWR5IGhvbGRzIGJvdGggdmFsdWVzLlxuICAgKi9cbiAgQE91dHB1dCgpIGNlbGxWYWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxWYWx1ZUNoYW5nZWRFdmVudDxUPj4oKTtcblxuICAvKiogQSBoZWFkZXIgZHJhZyBmaW5pc2hlZCBzb21ld2hlcmUgb3RoZXIgdGhhbiB3aGVyZSBpdCBzdGFydGVkLiAqL1xuICBAT3V0cHV0KCkgY29sdW1uTW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbk1vdmVkRXZlbnQ+KCk7XG5cbiAgLyoqIEEgcmVzaXplIGdlc3R1cmUgZmluaXNoZWQg4oCUIG9uZSBldmVudCBwZXIgZ2VzdHVyZSwgbm90IHBlciBwaXhlbC4gKi9cbiAgQE91dHB1dCgpIGNvbHVtblJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtblJlc2l6ZWRFdmVudD4oKTtcblxuICAvLyBGb3IgY29udGV4dCBtZW51IG9wdGlvblxuICBAT3V0cHV0KCkgY2VsbE9wdGlvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25Sb3dDZWxsT3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG5cbiAgLyoqXG4gICAqIEJpbmQgT25lIEdyaWQgUGFnaW5hdGlvbiBGZWF0dXJlXG4gICAqL1xuICBASW5wdXQoKSBwYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhZ2luYXRlOiBPbmVQYWdpbmF0aW9uUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBMZXQgdGhlIGdyaWQgcGFnZSBpdHMgb3duIHJvd3MuIFRoZSBiYXIgcmVuZGVycywgdGhlIGdyaWQgc2xpY2VzIHRoZVxuICAgKiBmaWx0ZXJlZCByb3dzIHRvIHRoZSBjdXJyZW50IHBhZ2UsIGFuZCB0aGUgbmF2aWdhdGlvbiBidXR0b25zIHdvcmtcbiAgICogd2l0aG91dCB0aGUgaG9zdCBoYW5kbGluZyBhbnl0aGluZyDigJQgYFtwYWdpbmF0ZV1gIGlzIGlnbm9yZWQgaW4gdGhpc1xuICAgKiBtb2RlICh0aGUgZ3JpZCBvd25zIHRob3NlIG51bWJlcnMpIGV4Y2VwdCBmb3IgYHBhZ2VTaXplT3B0aW9uc2AuIFRoZVxuICAgKiBuYXZpZ2F0aW9uIG91dHB1dHMgc3RpbGwgZW1pdCwgYXMgbm90aWZpY2F0aW9ucyByYXRoZXIgdGhhbiBpbnRlbnRzLlxuICAgKiBTZWxlY3Rpb24sIGZpbHRlcmluZyBhbmQgc29ydGluZyBrZWVwIG9wZXJhdGluZyBvbiB0aGUgd2hvbGUgZGF0YXNldC5cbiAgICovXG4gIEBJbnB1dCgpIGNsaWVudFNpZGVQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFJvd3MgcGVyIHBhZ2UgZm9yIGBjbGllbnRTaWRlUGFnaW5hdGlvbmAuICovXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAyNTtcblxuICBAT3V0cHV0KCkgZ29Ub0ZpcnN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub1ByZXZpb3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub05leHQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBnb1RvTGFzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgLyoqIFRoZSBwYWdpbmcgbnVtYmVycyB0aGUgYmFyIHNob3dzIHdoZW4gdGhlIGdyaWQgcGFnZXMgaXRzIG93biByb3dzLiAqL1xuICBwcm90ZWN0ZWQgaW50ZXJuYWxQYWdpbmF0ZTogT25lUGFnaW5hdGlvblBhcmFtcyA9IHtcbiAgICB0b3RhbDogMCwgY3VycmVudFBhZ2U6IDEsIGxhc3RQYWdlOiAxLCBwZXJQYWdlOiAyNSwgZmlyc3RSb3dJbmRleDogMCwgbGFzdFJvd0luZGV4OiAwLFxuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGUgdGhlIGJhcidzIG51bWJlcnMgZnJvbSB0aGUgZmlsdGVyZWQgcm93IGNvdW50IGFuZCB0aGUgQVBJJ3NcbiAgICogcGFnaW5nIHN0YXRlLiBEZWZlcnJlZCBhIHRpY2sgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgYXJpYSBjb3VudHMgYXJlOlxuICAgKiB0aGUgY291bnQgYXJyaXZlcyB3aGlsZSB0aGUgZmlyc3QgY2hhbmdlIGRldGVjdGlvbiBwYXNzIGlzIHN0aWxsIHJ1bm5pbmcuXG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hDbGllbnRQYWdpbmF0aW9uKHRvdGFsOiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGNvbnN0IHsgcGFnZVNpemUsIGN1cnJlbnRQYWdlIH0gPSB0aGlzLmFwaS5wYWdpbmF0aW9uU3RhdGU7XG5cbiAgICBjb25zdCBsYXN0UGFnZSA9IE1hdGgubWF4KE1hdGguY2VpbCh0b3RhbCAvIHBhZ2VTaXplKSwgMSk7XG4gICAgY29uc3QgcGFnZSA9IE1hdGgubWluKGN1cnJlbnRQYWdlLCBsYXN0UGFnZSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcblxuICAgICAgdGhpcy5pbnRlcm5hbFBhZ2luYXRlID0ge1xuICAgICAgICB0b3RhbCxcbiAgICAgICAgY3VycmVudFBhZ2U6IHBhZ2UsXG4gICAgICAgIGxhc3RQYWdlLFxuICAgICAgICBwZXJQYWdlOiBwYWdlU2l6ZSxcbiAgICAgICAgZmlyc3RSb3dJbmRleDogdG90YWwgPT09IDAgPyAwIDogKHBhZ2UgLSAxKSAqIHBhZ2VTaXplICsgMSxcbiAgICAgICAgbGFzdFJvd0luZGV4OiBNYXRoLm1pbihwYWdlICogcGFnZVNpemUsIHRvdGFsKSxcbiAgICAgICAgcGFnZVNpemVPcHRpb25zOiB0aGlzLnBhZ2luYXRlPy5wYWdlU2l6ZU9wdGlvbnMsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgR3JpZCBQcm9wZXJ0aWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYm9keVNjcm9sbExlZnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX29uZVJvd051bWJlckNvbHVtbkRlZjogT25lQ29sdW1uRGVmID0gbnVsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIC8qKlxuICAgKiBSb3cgZ3JvdXBpbmcsIGFzIHRoZSBncmlkIHNlZXMgaXQuXG4gICAqXG4gICAqIFRoZSB0aHJlZSBgX2hvc3QqYCBmaWVsZHMgaG9sZCB3aGF0IHdhcyBib3VuZCBiZWZvcmUgZ3JvdXBpbmcgdG91Y2hlZFxuICAgKiBhbnl0aGluZywgYmVjYXVzZSBncm91cGluZyBpcyByZXZlcnNpYmxlOiB0dXJuIGl0IG9mZiBhbmQgdGhlIGNvbHVtbnMsXG4gICAqIHRoZSBncm91cCBjb2x1bW4gYW5kIHRoZSBncmlkIHR5cGUgYWxsIGhhdmUgdG8gZ28gYmFjayB0byB3aGF0IHRoZSBob3N0XG4gICAqIGFza2VkIGZvci4gYF9hcHBsaWVkR3JvdXBGaWVsZHNgIGlzIHRoZSBncm91cGluZyB0aGUgcmVnaXN0ZXJlZCBjb2x1bW5zXG4gICAqIGN1cnJlbnRseSByZWZsZWN0IOKAlCB0aGUgcm93IG1vZGVsJ3MgY29weSBsaXZlcyBpbiBgYXBpLnJvd0dyb3VwRmllbGRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hvc3RDb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWY8VD5bXSA9IFtdO1xuICBwcml2YXRlIF9ob3N0QXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWYgPSBudWxsO1xuICBwcml2YXRlIF9ob3N0R3JpZFR5cGU6IE9uZUdyaWRUeXBlID0gJ21hc3Rlcic7XG4gIHByaXZhdGUgX2hvc3RUcmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hcHBsaWVkR3JvdXBGaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGFwaTogT25lR3JpZEFwaSxcbiAgICBwcm90ZWN0ZWQgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuXG4gICAgaWYgKGNoYW5nZXNbJ21hc3Rlck5vZGUnXSAmJiBjaGFuZ2VzWydtYXN0ZXJOb2RlJ10uaXNGaXJzdENoYW5nZSkge1xuXG4gICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwgJiYgdGhpcy5tYXN0ZXJOb2RlLmV4cGFuZGVkICYmIHRoaXMuZ3JpZFR5cGUgPT09ICdkZXRhaWwnKSB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwaS5zZXRSb3dEYXRhKFsuLi50aGlzLm1hc3Rlck5vZGUuZGV0YWlsUm93RGF0YV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1tcInJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJyb3dEYXRhXCJdPy5maXJzdENoYW5nZSkge1xuXG4gICAgICB0aGlzLnRyZWVEYXRhIHx8IHRoaXMubWFzdGVyRGV0YWlsID8gdGhpcy5hcGkudXBkYXRlUm93RGF0YSh0aGlzLnJvd0RhdGEpIDogdGhpcy5hcGkuc2V0Um93RGF0YSh0aGlzLnJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgbGF0ZXIgY2hhbmdlcy4gVGhlIGZpcnN0IG9uZSBhcnJpdmVzIGJlZm9yZSBuZ09uSW5pdCBoYXMgcnVuXG4gICAgLy8gYXBpLmluaXQsIHNvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgYXJlIG5vdCByZWdpc3RlcmVkIHlldCBhbmQgdGhlIGJvZHlcbiAgICAvLyBoYXMgbm90IHN1YnNjcmliZWQg4oCUIHRoZSBpbml0aWFsIGxvYWQgaGFwcGVucyBpbiBuZ0FmdGVyVmlld0luaXQgaW5zdGVhZC5cbiAgICBpZiAoY2hhbmdlc1tcInBpbm5lZFRvcFJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJwaW5uZWRUb3BSb3dEYXRhXCJdLmZpcnN0Q2hhbmdlKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldFBpbm5lZFJvd0RhdGEoJ3RvcCcsIHRoaXMucGlubmVkVG9wUm93RGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJwaW5uZWRCb3R0b21Sb3dEYXRhXCJdICYmICFjaGFuZ2VzW1wicGlubmVkQm90dG9tUm93RGF0YVwiXS5maXJzdENoYW5nZSkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLyoqXG4gICAgICogSW5pdCBSb3cgTnVtYmVyIENvbHVtbiBEZWZcbiAgICAgKi9cbiAgICBpZiAodGhpcy5yb3dOdW1iZXIpIHtcblxuICAgICAgIHRoaXMuX29uZVJvd051bWJlckNvbHVtbkRlZiA9IHtcbiAgICAgICAgICBncm91cElkOiB0aGlzLmNvbHVtbkRlZnNbMF0/Lmdyb3VwSWQgPz8gbnVsbCxcbiAgICAgICAgICBmaWVsZDogJ19vbmVSb3dOdW1iZXInLFxuICAgICAgICAgIGhlYWRlck5hbWU6ICdOwronLFxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgICAgICBoZWFkZXJTdHlsZToge1xuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIGFsaWduSXRlbTogJ2NlbnRlcidcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsaWduQ29udGVudDogJ3JpZ2h0JyxcbiAgICAgICAgICBjZWxsQ2xhc3M6ICdmdy1ib2xkJyxcbiAgICAgICAgICB3aWR0aDogNjAsXG4gICAgICAgICAgbWluV2lkdGg6IDQwLFxuICAgICAgICAgIG1heFdpZHRoOiAyMDBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvdyBncm91cGluZzogY29sdW1uIGRlZnMgZGVjbGFyaW5nIGByb3dHcm91cGAgdHVybiB0aGUgZ3JpZCBpbnRvIGFcbiAgICAgKiB0cmVlIG92ZXIgc3ludGhldGljIGdyb3VwIHJvd3MuIENvbmZpZ3VyZWQgYmVmb3JlIGBhcGkuaW5pdGAgYmVjYXVzZVxuICAgICAqIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSDigJQgdGhlIHRyZWVEYXRhIGZsYWcgdGhlIEFQSSBjYXB0dXJlcywgdGhlIGdyb3VwXG4gICAgICogY29sdW1uIHRoZSB0cmVlIGJsb2NrIGJlbG93IHByZXBlbmRzIOKAlCBoYXMgdG8gc2VlIHRoZSB0cmVlIHNoYXBlLlxuICAgICAqXG4gICAgICogV2hhdCB0aGUgaG9zdCBkZWNsYXJlZCBpcyBrZXB0IGFzIGl0IHdhcyBnaXZlbjogcmVncm91cGluZyBhdCBydW50aW1lXG4gICAgICogcmUtZGVyaXZlcyB0aGUgcmVnaXN0ZXJlZCBjb2x1bW5zIGZyb20gaXQsIHNvIGEgY29sdW1uIGhpZGRlbiBiZWNhdXNlXG4gICAgICogaXQgd2FzIGdyb3VwZWQgY29tZXMgYmFjayB3aGVuIGl0IHN0b3BzIGJlaW5nLCBhbmQgb25lIHRoZSBob3N0IGhpZFxuICAgICAqIGl0c2VsZiBzdGF5cyBoaWRkZW4uXG4gICAgICovXG4gICAgdGhpcy5faG9zdENvbHVtbkRlZnMgPSB0aGlzLmNvbHVtbkRlZnMgPz8gW107XG4gICAgdGhpcy5faG9zdEF1dG9Hcm91cENvbHVtbkRlZiA9IHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmO1xuICAgIHRoaXMuX2hvc3RHcmlkVHlwZSA9IHRoaXMuZ3JpZFR5cGU7XG4gICAgdGhpcy5faG9zdFRyZWVEYXRhID0gdGhpcy50cmVlRGF0YTtcblxuICAgIGNvbnN0IHJvd0dyb3VwQ29sdW1uRmllbGRzID0gdGhpcy50cmVlRGF0YSB8fCB0aGlzLm1hc3RlckRldGFpbFxuICAgICAgPyBbXVxuICAgICAgOiByb3dHcm91cEZpZWxkcyh0aGlzLmNvbHVtbkRlZnMpO1xuXG4gICAgaWYgKHJvd0dyb3VwQ29sdW1uRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICB0aGlzLl9hcHBsaWVkR3JvdXBGaWVsZHMgPSByb3dHcm91cENvbHVtbkZpZWxkcztcblxuICAgICAgdGhpcy50cmVlRGF0YSA9IHRydWU7XG4gICAgICB0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCA9IE9ORV9HUk9VUF9DSElMRFJFTl9GSUVMRDtcbiAgICAgIHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmID0gdGhpcy5idWlsZEF1dG9Hcm91cENvbHVtbkRlZigpO1xuICAgICAgdGhpcy5jb2x1bW5EZWZzID0gdGhpcy5ncm91cGVkQ29sdW1uRGVmcyhyb3dHcm91cENvbHVtbkZpZWxkcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBPbmUgR3JpZCBBUElcbiAgICAgKi9cbiAgICB0aGlzLmFwaS5pbml0KHtcbiAgICAgIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLFxuICAgICAgY29sdW1uRGVmczogdGhpcy5jb2x1bW5EZWZzLFxuICAgICAgZGVmYXVsdENvbHVtbkRlZjogdGhpcy5kZWZhdWx0Q29sdW1uRGVmLFxuICAgICAgZ3JvdXBDb2x1bW5EZWZzOiB0aGlzLmdyb3VwQ29sdW1uRGVmcyxcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgIHJvd1NlbGVjdGlvbjogdGhpcy5yb3dTZWxlY3Rpb24sXG4gICAgICBtYXN0ZXJEZXRhaWw6IHRoaXMubWFzdGVyRGV0YWlsLFxuICAgICAgZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zOiB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcyxcbiAgICAgIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50OiB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgLy8gVGhlIGhvc3QncyBvd24gdHJlZSBkYXRhLCBub3QgdGhlIHRyZWUgZ3JvdXBpbmcgYnVpbGRzOiBgc2V0Um93R3JvdXBpbmdgXG4gICAgICAvLyB0dXJucyB0aGF0IG9uIGJlbG93LCBhbmQgdGhlIEFQSSBoYXMgdG8gYmUgYWJsZSB0byB0ZWxsIHdob3NlIHRyZWUgaXRcbiAgICAgIC8vIGlzIGJlZm9yZSBpdCBtYXkgcmVwbGFjZSBvbmUuXG4gICAgICB0cmVlRGF0YTogdGhpcy5faG9zdFRyZWVEYXRhLFxuICAgIH0pO1xuXG4gICAgaWYgKHJvd0dyb3VwQ29sdW1uRmllbGRzLmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRSb3dHcm91cGluZyhyb3dHcm91cENvbHVtbkZpZWxkcywgYWdnQ29sdW1ucyh0aGlzLmNvbHVtbkRlZnMpKTtcbiAgICB9XG5cbiAgICAvLyBSZWdyb3VwaW5nIGF0IHJ1bnRpbWUuIGBhcGkuc2V0Um93R3JvdXBpbmdgIG93bnMgdGhlIHJvdyBtb2RlbCBoYWxmIG9mXG4gICAgLy8gdGhlIHN3aXRjaDsgdGhpcyBpcyB0aGUgb3RoZXIgaGFsZiDigJQgdGhlIGNvbHVtbnMgdGhlIGdyaWQgcmVnaXN0ZXJzIGFuZFxuICAgIC8vIHRoZSBzaGFwZSB0aGUgYm9keSByZW5kZXJzLiBTdWJzY3JpYmVkIGFmdGVyIHRoZSBpbml0aWFsIGNhbGwgYWJvdmUsXG4gICAgLy8gd2hpY2ggYG5nT25Jbml0YCBoYXMgYWxyZWFkeSBhcHBsaWVkLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcigncm93R3JvdXBpbmdDaGFuZ2VkJywgKHBheWxvYWQ6IFJvd0dyb3VwaW5nQ2hhbmdlZEV2ZW50KSA9PiB7XG5cbiAgICAgIHRoaXMuYXBwbHlSb3dHcm91cGluZ0NvbHVtbnMocGF5bG9hZC5ncm91cEZpZWxkcyk7XG4gICAgfSkpO1xuXG4gICAgaWYgKHRoaXMudW5kb1JlZG9DZWxsRWRpdGluZykge1xuXG4gICAgICB0aGlzLmFwaS5lbmFibGVVbmRvUmVkb0NlbGxFZGl0aW5nKHRoaXMudW5kb1JlZG9DZWxsRWRpdGluZ0xpbWl0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGllbnRTaWRlUGFnaW5hdGlvbikge1xuXG4gICAgICB0aGlzLmFwaS5zZXRDbGllbnRTaWRlUGFnaW5hdGlvbih0cnVlLCB0aGlzLnBhZ2luYXRlPy5wZXJQYWdlID8/IHRoaXMucGFnZVNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHVwIE1hc3RlciBEZXRhaWwgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRHcm91cERlZmF1bHRFeHBhbmRlZCh0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkKTtcbiAgICAgIHRoaXMuYXBpLnNldEdldERldGFpbFJvd0RhdGEodGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM/LmdldERldGFpbFJvd0RhdGEgPz8gbnVsbCk7XG5cbiAgICAgIGlmICh0aGlzLnJvd051bWJlcikge1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbkRlZnMgPSBfLmNvbmNhdCh0aGlzLl9vbmVSb3dOdW1iZXJDb2x1bW5EZWYsIHRoaXMuY29sdW1uRGVmcyk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwaS5zZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCBUcmVlIERhdGEgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGlmICh0aGlzLnRyZWVEYXRhKSB7XG5cbiAgICAgIHRoaXMuZ3JpZFR5cGUgPSAndHJlZSc7XG5cbiAgICAgIHRoaXMuYXBpLnNldFRyZWVEYXRhQ2hpbGRyZW5GaWVsZCh0aGlzLnRyZWVEYXRhQ2hpbGRyZW5GaWVsZCk7XG4gICAgICB0aGlzLmFwaS5zZXRHcm91cERlZmF1bHRFeHBhbmRlZCh0aGlzLmdyb3VwRGVmYXVsdEV4cGFuZGVkKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwaS5zZXRDb2x1bW5EZWZzKHRoaXMuY29sdW1uU3RhY2soKSkpO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiBTZWxlY3Rpb24gQ2hhbmdlZCBFdmVudFxuICAgIC8vIENvbHVtbnMgY2FuIGJlIHJlcGxhY2VkIGF0IHJ1bnRpbWUgdGhyb3VnaCBgYXBpLnNldENvbHVtbkRlZnNgLCBhbmRcbiAgICAvLyBgYXJpYS1jb2xjb3VudGAgaGFzIHRvIGZvbGxvdy5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbHVtbkNoYW5nZWQnLCAoKSA9PiB7XG5cbiAgICAgIHRoaXMuYXJpYUNvbENvdW50ID0gdGhpcy5hcGk/LmdldENvbHVtblN0YXRlKCk/LmNvbHVtbnM/Lmxlbmd0aCA/PyAtMTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbkNoYW5nZWQnLCAocGF5bG9hZDogU2VsZWN0aW9uQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLmVtaXQocGF5bG9hZCk7XG4gICAgfSkpO1xuXG4gICAgLy8gVGhlIGludGVybmFsIGV2ZW50cyBhIGhvc3QgY2FuIGFjdCBvbiwgc3VyZmFjZWQgYXMgb3V0cHV0cy4gU2FtZVxuICAgIC8vIGZvcndhcmRpbmcgcGF0dGVybiBhcyBzZWxlY3Rpb25DaGFuZ2VkIGFib3ZlLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc29ydENoYW5nZWQnLCAocGF5bG9hZDogU29ydENoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICAgIHRoaXMuc29ydENoYW5nZWQuZW1pdChwYXlsb2FkKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NlbGxWYWx1ZUNoYW5nZWQnLCAocGF5bG9hZDogQ2VsbFZhbHVlQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgICAgdGhpcy5jZWxsVmFsdWVDaGFuZ2VkLmVtaXQocGF5bG9hZCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjb2x1bW5Nb3ZlZCcsIChwYXlsb2FkOiBDb2x1bW5Nb3ZlZEV2ZW50KSA9PiB7XG5cbiAgICAgICAgdGhpcy5jb2x1bW5Nb3ZlZC5lbWl0KHBheWxvYWQpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uUmVzaXplZCcsIChwYXlsb2FkOiBDb2x1bW5SZXNpemVkRXZlbnQpID0+IHtcblxuICAgICAgICB0aGlzLmNvbHVtblJlc2l6ZWQuZW1pdChwYXlsb2FkKTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGdyb3VwIGNvbHVtbjogaG9zdC10dW5lZCB0aHJvdWdoIGBhdXRvR3JvdXBDb2x1bW5EZWZgLCBidXQgaXRzIGZpZWxkXG4gICAqIGlzIGFsd2F5cyB0aGUgc3ludGhldGljIGxhYmVsIOKAlCB0aGF0IGlzIHdoZXJlIGEgZ3JvdXAgcm93IGNhcnJpZXMgaXRzXG4gICAqIGRpc3BsYXkgdmFsdWUg4oCUIGFuZCBpdCBhbHdheXMgY2FycmllcyB0aGUgbWFya2VyIHRoZSB0cmVlIG1hY2hpbmVyeSBrZXlzXG4gICAqIG9uLCB3aGljaCBpcyB3aGF0IHB1dHMgdGhlIGV4cGFuZGVyIG9uIHRoaXMgY29sdW1uLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEF1dG9Hcm91cENvbHVtbkRlZigpOiBPbmVDb2x1bW5EZWYge1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlck5hbWU6ICdHcm91cCcsXG4gICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgLi4udGhpcy5faG9zdEF1dG9Hcm91cENvbHVtbkRlZixcbiAgICAgIGZpZWxkOiBPTkVfR1JPVVBfVkFMVUVfRklFTEQsXG4gICAgICBhdXRvR3JvdXBGaWVsZDogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBob3N0J3MgY29sdW1ucyB3aXRoIHRoZSBncm91cGVkLWJ5IG9uZXMgaGlkZGVuLlxuICAgKlxuICAgKiBBIGdyb3VwZWQtYnkgY29sdW1uJ3MgdmFsdWUgaXMgb24gdGhlIGdyb3VwIHJvdzsgc2hvd2luZyB0aGUgZmxhdCBjb2x1bW5cbiAgICogdG9vIHJlcGVhdHMgaXQgZG93biBldmVyeSBsZWFmLiBIaWRkZW4sIG5vdCByZW1vdmVkIOKAlCB0aGUgaG9zdCBjYW4gYnJpbmdcbiAgICogb25lIGJhY2sgd2l0aCBgYXBpLnNldENvbHVtblZpc2libGVgLCBhbmQgdW5ncm91cGluZyByZXN0b3JlcyB3aGF0ZXZlclxuICAgKiB2aXNpYmlsaXR5IHRoZSBob3N0IGl0c2VsZiBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ3JvdXBlZENvbHVtbkRlZnMoZ3JvdXBGaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogT25lQ29sdW1uRGVmPFQ+W10ge1xuXG4gICAgcmV0dXJuIHRoaXMuX2hvc3RDb2x1bW5EZWZzLm1hcChjb2x1bW4gPT5cbiAgICAgIGNvbHVtbi5maWVsZCAmJiBncm91cEZpZWxkcy5pbmNsdWRlcyhjb2x1bW4uZmllbGQpID8geyAuLi5jb2x1bW4sIGhpZGU6IHRydWUgfSA6IGNvbHVtbik7XG4gIH1cblxuICAvKiogVGhlIGNvbHVtbnMgdGhlIGdyaWQgcmVnaXN0ZXJzOiByb3cgbnVtYmVycywgdGhlIGdyb3VwIGNvbHVtbiwgdGhlIGhvc3Qncy4gKi9cbiAgcHJpdmF0ZSBjb2x1bW5TdGFjaygpOiBPbmVDb2x1bW5EZWY8VD5bXSB7XG5cbiAgICByZXR1cm4gXy5jb21wYWN0KFtcbiAgICAgIHRoaXMucm93TnVtYmVyID8gdGhpcy5fb25lUm93TnVtYmVyQ29sdW1uRGVmIDogbnVsbCxcbiAgICAgIHRoaXMudHJlZURhdGEgPyB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiA6IG51bGwsXG4gICAgICAuLi50aGlzLmNvbHVtbkRlZnMsXG4gICAgXSkgYXMgT25lQ29sdW1uRGVmPFQ+W107XG4gIH1cblxuICAvKipcbiAgICogUmUtcGx1bWIgZXZlcnl0aGluZyBncm91cGluZyBvd25zIG91dHNpZGUgdGhlIHJvdyBtb2RlbDogdHJlZSBtb2RlLCB0aGVcbiAgICogY2hpbGRyZW4gZmllbGQsIHRoZSBncm91cCBjb2x1bW4sIGFuZCB3aGljaCBvZiB0aGUgaG9zdCdzIGNvbHVtbnMgYXJlXG4gICAqIGhpZGRlbiBiZWNhdXNlIHRoZWlyIHZhbHVlIG5vdyBzaG93cyBvbiBhIGdyb3VwIHJvdy5cbiAgICpcbiAgICogRHJpdmVuIGJ5IGByb3dHcm91cGluZ0NoYW5nZWRgLCBzbyBhIGhvc3QgcmVncm91cHMgdGhyb3VnaCBvbmUgY2FsbCDigJRcbiAgICogYGFwaS5zZXRSb3dHcm91cGluZyhbJ2NvdW50cnknLCAnY2l0eSddKWAg4oCUIGluc3RlYWQgb2YgcmUtY3JlYXRpbmcgdGhlXG4gICAqIGdyaWQuIEdyb3VwaW5nIGFuZCBob3N0IHRyZWUgZGF0YSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCB3aGljaCB0aGUgQVBJXG4gICAqIGVuZm9yY2VzLCBzbyB0aGlzIG9ubHkgZXZlciBzd2l0Y2hlcyBhIHRyZWUgdGhhdCBncm91cGluZyBpdHNlbGYgYnVpbHQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5Um93R3JvdXBpbmdDb2x1bW5zKGdyb3VwRmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuXG4gICAgY29uc3QgdW5jaGFuZ2VkID0gZ3JvdXBGaWVsZHMubGVuZ3RoID09PSB0aGlzLl9hcHBsaWVkR3JvdXBGaWVsZHMubGVuZ3RoXG4gICAgICAmJiBncm91cEZpZWxkcy5ldmVyeSgoZmllbGQsIGluZGV4KSA9PiBmaWVsZCA9PT0gdGhpcy5fYXBwbGllZEdyb3VwRmllbGRzW2luZGV4XSk7XG5cbiAgICBpZiAodW5jaGFuZ2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBncm91cGluZyA9IGdyb3VwRmllbGRzLmxlbmd0aCA+IDA7XG5cbiAgICB0aGlzLl9hcHBsaWVkR3JvdXBGaWVsZHMgPSBbLi4uZ3JvdXBGaWVsZHNdO1xuXG4gICAgdGhpcy50cmVlRGF0YSA9IGdyb3VwaW5nO1xuICAgIHRoaXMudHJlZURhdGFDaGlsZHJlbkZpZWxkID0gZ3JvdXBpbmcgPyBPTkVfR1JPVVBfQ0hJTERSRU5fRklFTEQgOiBudWxsO1xuICAgIHRoaXMuZ3JpZFR5cGUgPSBncm91cGluZyA/ICd0cmVlJyA6IHRoaXMuX2hvc3RHcmlkVHlwZTtcbiAgICB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiA9IGdyb3VwaW5nID8gdGhpcy5idWlsZEF1dG9Hcm91cENvbHVtbkRlZigpIDogdGhpcy5faG9zdEF1dG9Hcm91cENvbHVtbkRlZjtcbiAgICB0aGlzLmNvbHVtbkRlZnMgPSB0aGlzLmdyb3VwZWRDb2x1bW5EZWZzKGdyb3VwRmllbGRzKTtcblxuICAgIHRoaXMuYXBpLnNldEdyb3VwRGVmYXVsdEV4cGFuZGVkKHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQpO1xuICAgIHRoaXMuYXBpLnNldENvbHVtbkRlZnModGhpcy5jb2x1bW5TdGFjaygpKTtcblxuICAgIC8vIFRoZSBncmlkIHR5cGUsIHRoZSB0cmVlIGZsYWcgYW5kIHRoZSBncm91cCBjb2x1bW4gYXJlIGFsbCByZW5kZXJlZFxuICAgIC8vIHRocm91Z2ggYmluZGluZ3MsIGFuZCB0aGlzIHJ1bnMgZnJvbSBhbiBldmVudCByYXRoZXIgdGhhbiBmcm9tIGFcbiAgICAvLyB0ZW1wbGF0ZSBjYWxsYmFjay5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFRoZSBoZWFkZXIgZm9sbG93cyB0aGUgYm9keSB0aHJvdWdoIChib2R5U2Nyb2xsKSAtPiBbc2Nyb2xsTGVmdF0uIEEgc2Vjb25kXG4gICAgLy8gc3Vic2NyaXB0aW9uIHVzZWQgdG8gbGl2ZSBoZXJlIHRoYXQgcXVlcmllZCAnLm9uZS1ncmlkLWhlYWRlci1jb2x1bW4nIOKAlCBhXG4gICAgLy8gaGVhZGVyICpjZWxsKiwgbm90IHRoZSB2aWV3cG9ydCDigJQgYW5kIGFzc2lnbmVkIHNjcm9sbExlZnQgdG8gaXQsIHdoaWNoXG4gICAgLy8gZG9lcyBub3RoaW5nLiBJdCBoYXMgYmVlbiByZW1vdmVkIHJhdGhlciB0aGFuIHJlcGFpcmVkOiB0aGUgYmluZGluZyBwYXRoXG4gICAgLy8gaXMgdGhlIG9uZSB0aGF0IHdvcmtzLCBhbmQgaXQgbm93IGRyaXZlcyB0aGUgcGlubmVkIGNvbHVtbnMgdG9vLlxuXG4gICAgLy8gUGlubmVkIHJvd3MsIG5vdyB0aGF0IHRoZSBjb2x1bW5zIGFyZSByZWdpc3RlcmVkIGFuZCB0aGUgYm9keSBpc1xuICAgIC8vIGxpc3RlbmluZy4gVW5saWtlIHJvd0RhdGEgdGhlc2UgYXJlIG5vdCBsb2FkZWQgdGhyb3VnaCAob25HcmlkUmVhZHkpIOKAlFxuICAgIC8vIGJpbmRpbmcgdGhlbSBpcyB0aGUgd2hvbGUgY29udHJhY3Qg4oCUIHNvIHRoZSBncmlkIGxvYWRzIHRoZW0gaXRzZWxmLlxuICAgIGlmICh0aGlzLnBpbm5lZFRvcFJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCd0b3AnLCB0aGlzLnBpbm5lZFRvcFJvd0RhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgR3JpZCBSZWFkeSBFdmVudFxuICAgICAqL1xuICAgIHRoaXMub25HcmlkUmVhZHkuZW1pdCh7IGFwaTogdGhpcy5hcGkgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEJvZHkgU2Nyb2xsIEV2ZW50XG4gICAqL1xuICBvbkJvZHlTY3JvbGwoc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLmJvZHlTY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgUmVhZHkgRXZlbnQgb2YgYSBuZXN0ZWQgTWFzdGVyIERldGFpbCBHcmlkXG4gICAqL1xuICBvbkRldGFpbEdyaWRSZWFkeShwYXJhbXM6IE9uZUdyaWRSZWFkeUV2ZW50KSB7XG5cbiAgICBwYXJhbXMuYXBpLnNldFJvd0RhdGEodGhpcy5tYXN0ZXJOb2RlPy5kZXRhaWxSb3dEYXRhID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXNzaW5nIGNvcHkgZXZlbnQgdG8gZ3JpZCBib2R5XG4gICAqL1xuICBvbkdyaWRDb3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuXG4gICAgdGhpcy5ncmlkQ29weSQubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBSb3cgQWN0aW9uIEV2ZW50cyB0byBQYXJlbnQgQ29tcG9uZW50XG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dEZXRhaWwuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25BZGROZXcoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0FkZE5ldy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblZpZXcoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1ZpZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93TG9jYXRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Eb2N1bWVudChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RG9jdW1lbnQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Db3B5KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dDb3B5LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRGVsZXRlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dEZWxldGUuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93R290b0xpc3QuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25FZGl0KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dFZGl0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uUHJpbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1ByaW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uSGlzdG9yeShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93SGlzdG9yeS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbk9wdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93T3B0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xhbmd1YWdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Q2VsbE9wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblNlbGVjdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93U2VsZWN0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlU2hpZnREb3VibGVDbGljayhldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uU2hpZnREb3VibGVDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbHMgZm9yIGBhcmlhLXJvd2NvdW50YCAvIGBhcmlhLWNvbGNvdW50YC5cbiAgICpcbiAgICogSGVsZCBhcyBmaWVsZHMgcmF0aGVyIHRoYW4gY29tcHV0ZWQgaW4gdGhlIHRlbXBsYXRlOiB0aGV5IGFyZSByZWFkIG9uIGV2ZXJ5XG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gcGFzcyBhbmQgb25seSBhY3R1YWxseSBjaGFuZ2Ugd2hlbiB0aGUgZGF0YSBvciB0aGUgY29sdW1uc1xuICAgKiBkby4gYC0xYCBpcyB0aGUgQVJJQSB2YWx1ZSBmb3IgXCJ1bmtub3duXCIsIHdoaWNoIGlzIHRoZSBob25lc3QgYW5zd2VyIGJlZm9yZVxuICAgKiB0aGUgZmlyc3Qgcm93IGFycml2ZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXJpYVJvd0NvdW50ID0gLTE7XG4gIHByb3RlY3RlZCBhcmlhQ29sQ291bnQgPSAtMTtcblxuICBpbnZva2VSb3dDb3VudENoYW5nZWQobGVuZ3RoOiBudW1iZXIpIHtcblxuICAgIHRoaXMucmVmcmVzaEFyaWFDb3VudHMobGVuZ3RoKTtcblxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVQYWdpbmF0aW9uKSB0aGlzLnJlZnJlc2hDbGllbnRQYWdpbmF0aW9uKGxlbmd0aCk7XG5cbiAgICB0aGlzLnJvd0NvdW50Q2hhbmdlZC5lbWl0KGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb21wdXRlIHRoZSB0b3RhbHMgYSBzY3JlZW4gcmVhZGVyIGlzIHRvbGQgYWJvdXQuXG4gICAqXG4gICAqIGBhcmlhLXJvd2NvdW50YCBjb3VudHMgZXZlcnkgcm93IHRoZSBncmlkIHJlcHJlc2VudHMsIG5vdCB0aGUgaGFuZGZ1bCB0aGVcbiAgICogdmlydHVhbCBzY3JvbGxlciBjdXJyZW50bHkgaGFzIGluIHRoZSBET00g4oCUIHRoZSBoZWFkZXIgcm93LCB0aGUgcGlubmVkIHJvd3NcbiAgICogZWl0aGVyIHNpZGUsIGFuZCBhbGwgdGhlIGRhdGEgcm93cy5cbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaEFyaWFDb3VudHMoZGF0YVJvd3M6IG51bWJlcik6IHZvaWQge1xuXG4gICAgY29uc3QgcGlubmVkID0gKHRoaXMucGlubmVkVG9wUm93RGF0YT8ubGVuZ3RoID8/IDApICsgKHRoaXMucGlubmVkQm90dG9tUm93RGF0YT8ubGVuZ3RoID8/IDApO1xuXG4gICAgY29uc3Qgcm93cyA9IDEgKyBwaW5uZWQgKyBkYXRhUm93cztcbiAgICBjb25zdCBjb2xzID0gdGhpcy5hcGk/LmdldENvbHVtblN0YXRlKCk/LmNvbHVtbnM/Lmxlbmd0aCA/PyAtMTtcblxuICAgIGlmIChyb3dzID09PSB0aGlzLmFyaWFSb3dDb3VudCAmJiBjb2xzID09PSB0aGlzLmFyaWFDb2xDb3VudCkgcmV0dXJuO1xuXG4gICAgLy8gRGVmZXJyZWQgYSB0aWNrLiBUaGUgYm9keSBlbWl0cyBpdHMgcm93IGNvdW50IHdoaWxlIHRoZSBmaXJzdCBjaGFuZ2VcbiAgICAvLyBkZXRlY3Rpb24gcGFzcyBpcyBzdGlsbCBydW5uaW5nLCBhZnRlciB0aGlzIGNvbXBvbmVudCdzIG93biBhdHRyaWJ1dGVzXG4gICAgLy8gd2VyZSBjaGVja2VkIOKAlCBhc3NpZ25pbmcgaGVyZSBkaXJlY3RseSBpcyB0aGUgdGV4dGJvb2sgTkcwMTAwLiBUaGUgYm9keVxuICAgIC8vIGRlZmVycyBpdHMgbm9kZSBsaXN0IGZvciB0aGUgc2FtZSByZWFzb24uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgIHRoaXMuYXJpYVJvd0NvdW50ID0gcm93cztcbiAgICAgIHRoaXMuYXJpYUNvbENvdW50ID0gY29scztcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBjZWxsT3B0aW9uTWVudVNlbGVjdGVkKGV2ZW50OiBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQpIHtcblxuICAgIHRoaXMuY2VsbE9wdGlvblNlbGVjdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5nIFBhZ2luYXRpb24gRXZlbnRzIHRvIFBhcmVudCBDb21wb25lbnRcbiAgICovXG4gIGludm9rZUdvVG9GaXJzdCgpIHtcblxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVQYWdpbmF0aW9uKSB0aGlzLmFwaS5zZXRDdXJyZW50UGFnZSgxKTtcblxuICAgIHRoaXMuZ29Ub0ZpcnN0LmVtaXQoKTtcbiAgfVxuXG4gIGludm9rZUdvVG9QcmV2aW91cygpIHtcblxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVQYWdpbmF0aW9uKSB0aGlzLmFwaS5zZXRDdXJyZW50UGFnZSh0aGlzLmFwaS5wYWdpbmF0aW9uU3RhdGUuY3VycmVudFBhZ2UgLSAxKTtcblxuICAgIHRoaXMuZ29Ub1ByZXZpb3VzLmVtaXQoKTtcbiAgfVxuXG4gIGludm9rZUdvVG9OZXh0KCkge1xuXG4gICAgaWYgKHRoaXMuY2xpZW50U2lkZVBhZ2luYXRpb24pIHRoaXMuYXBpLnNldEN1cnJlbnRQYWdlKHRoaXMuYXBpLnBhZ2luYXRpb25TdGF0ZS5jdXJyZW50UGFnZSArIDEpO1xuXG4gICAgdGhpcy5nb1RvTmV4dC5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VHb1RvTGFzdCgpIHtcblxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVQYWdpbmF0aW9uKSB0aGlzLmFwaS5zZXRDdXJyZW50UGFnZSh0aGlzLmludGVybmFsUGFnaW5hdGUubGFzdFBhZ2UgPz8gMSk7XG5cbiAgICB0aGlzLmdvVG9MYXN0LmVtaXQoKTtcbiAgfVxuXG4gIGludm9rZVBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBudW1iZXIpIHtcblxuICAgIGlmICh0aGlzLmNsaWVudFNpZGVQYWdpbmF0aW9uKSB0aGlzLmFwaS5zZXRQYWdlU2l6ZShwYWdlU2l6ZSk7XG5cbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlLmVtaXQocGFnZVNpemUpO1xuICB9XG5cbiAgaW52b2tlUm93RHJhZ0VuZChldmVudDogT25lUm93RHJhZ0V2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLnJvd0RyYWdFbmQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soZXZlbnQ6IEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPikge1xuXG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBVbnN1YnNjcmliZSBBbGwgRXZlbnQgTGlzdGVuZGVyc1xuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICB0aGlzLnJvd0RhdGEgPSBbXTtcblxuICAgIHRoaXMuYXBpLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8IS0tIE5vIHRhYmluZGV4IGhlcmUuIFRoZSB0YWIgc3RvcCBiZWxvbmdzIG9uIHRoZSBib2R5IHZpZXdwb3J0LCB3aGljaCBpcyB0aGVcbiAgICAgZWxlbWVudCB0aGF0IGFjdHVhbGx5IHNjcm9sbHM7IGEgZm9jdXNhYmxlIHdyYXBwZXIgYXJvdW5kIGEgc2Nyb2xsYWJsZVxuICAgICBjaGlsZCBpcyByZWFjaGFibGUgYnV0IGNhbm5vdCBiZSBzY3JvbGxlZCB3aXRoIHRoZSBrZXlib2FyZC4gVGhlIGNvcHlcbiAgICAgaGFuZGxlciBpcyB1bmFmZmVjdGVkOiBhIGNvcHkgZXZlbnQgZmlyZWQgYXQgdGhlIGZvY3VzZWQgdmlld3BvcnQgYnViYmxlc1xuICAgICB1cCB0byBoZXJlLiAtLT5cbjwhLS0gcm9sZT1cImdyaWRcIiBpcyB3aGF0IHR1cm5zIHRoaXMgZnJvbSBhIHBpbGUgb2YgZGl2cyBpbnRvIHNvbWV0aGluZyBhIHNjcmVlblxuICAgICByZWFkZXIgY2FuIG5hdmlnYXRlLiBUaGUgY291bnRzIGFyZSB0aGUgKnRvdGFsKiDigJQgYGFyaWEtcm93Y291bnRgIGluY2x1ZGVzXG4gICAgIHRoZSBoZWFkZXIgcm93IGFuZCBhbnkgcGlubmVkIHJvd3MsIGFuZCBib3RoIHN0YXkgY29ycmVjdCB3aGlsZSB0aGUgYm9keSBpc1xuICAgICB2aXJ0dWFsaXNlZCBhbmQgbW9zdCByb3dzIGFyZSBub3QgaW4gdGhlIERPTSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZXNlXG4gICAgIGF0dHJpYnV0ZXMgZXhpc3QgdG8gY29tbXVuaWNhdGUuIC0tPlxuPGRpdiAjb2dSZWZcbiAgICBjbGFzcz1cIm9uZS1ncmlkXCJcbiAgICByb2xlPVwiZ3JpZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJncmlkTGFiZWxcIlxuICAgIFthdHRyLmFyaWEtcm93Y291bnRdPVwiYXJpYVJvd0NvdW50XCJcbiAgICBbYXR0ci5hcmlhLWNvbGNvdW50XT1cImFyaWFDb2xDb3VudFwiXG4gICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwicm93U2VsZWN0aW9uID09PSAnbXVsdGlwbGUnID8gdHJ1ZSA6IG51bGxcIlxuICAgIChjb3B5KT1cIm9uR3JpZENvcHkoJGV2ZW50KVwiPlxuICAgIFxuICAgIDwhLS0gSGVhZGVycyAtLT5cbiAgICA8b25lLWdyaWQtaGVhZGVyXG4gICAgICAgIFthcGldPVwiYXBpXCJcbiAgICAgICAgW2VuYWJsZUdyb3VwQ29sdW1uRGVmc109XCJlbmFibGVHcm91cENvbHVtbkRlZnNcIlxuICAgICAgICBbYWxsb3dlZEVkaXRdPVwiYWxsb3dlZEVkaXRcIlxuICAgICAgICBbc2Nyb2xsTGVmdF09XCJib2R5U2Nyb2xsTGVmdFwiXG4gICAgICAgIFtoZWFkZXJNZW51XT1cImhlYWRlck1lbnVcIlxuICAgICAgICBbZmlsdGVyUm93XT1cImZpbHRlclJvd1wiXG4gICAgICAgIChoZWFkZXJNZW51Q2xpY2spPVwiaGVhZGVyTWVudUNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgLz5cblxuICAgIDwhLS0gQm9keSAtLT5cbiAgICA8b25lLWdyaWQtYm9keVxuICAgICAgICBbZ3JpZENvcHkkXT1cImdyaWRDb3B5JFwiXG4gICAgICAgIFtyb3dEYXRhXT1cInJvd0RhdGFcIlxuICAgICAgICBbcGlubmVkVG9wUm93RGF0YV09XCJwaW5uZWRUb3BSb3dEYXRhXCJcbiAgICAgICAgW3Bpbm5lZEJvdHRvbVJvd0RhdGFdPVwicGlubmVkQm90dG9tUm93RGF0YVwiXG4gICAgICAgIFthcGldPVwiYXBpXCJcbiAgICAgICAgW3Jvd051bWJlcl09XCJyb3dOdW1iZXJcIlxuICAgICAgICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcbiAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgW2VkaXRUeXBlXT1cImVkaXRUeXBlXCJcbiAgICAgICAgW3N1Ym1pdHRlZF09XCJzdWJtaXR0ZWRcIlxuICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgW3RyZWVEYXRhXT1cInRyZWVEYXRhXCJcbiAgICAgICAgW2dyaWRUeXBlXT1cImdyaWRUeXBlXCJcbiAgICAgICAgW21hc3RlckRldGFpbF09XCJtYXN0ZXJEZXRhaWxcIlxuICAgICAgICBbbWFzdGVyTm9kZV09XCJtYXN0ZXJOb2RlXCJcbiAgICAgICAgW2RldGFpbENlbGxSZW5kZXJlclBhcmFtc109XCJkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNcIlxuICAgICAgICBbZGV0YWlsUmVuZGVyZXJDb21wb25lbnRdPVwiZGV0YWlsUmVuZGVyZXJDb21wb25lbnRcIlxuICAgICAgICBbZGV0YWlsR3JpZFRlbXBsYXRlXT1cImRldGFpbEdyaWRUcGxcIlxuICAgICAgICBbdHJlZURhdGFDaGlsZHJlbkZpZWxkXT1cInRyZWVEYXRhQ2hpbGRyZW5GaWVsZFwiXG4gICAgICAgIFthdXRvR3JvdXBDb2x1bW5EZWZdPVwiYXV0b0dyb3VwQ29sdW1uRGVmXCJcbiAgICAgICAgW2dyb3VwRGVmYXVsdEV4cGFuZGVkXT1cImdyb3VwRGVmYXVsdEV4cGFuZGVkXCJcbiAgICAgICAgKHJvd0RyYWdFbmQpPVwiaW52b2tlUm93RHJhZ0VuZCgkZXZlbnQpXCJcbiAgICAgICAgKGV4cGFuc2lvbkNoYW5nZWQpPVwiaW52b2tlRXhwYW5zaW9uQ2hhbmdlZENsaWNrKCRldmVudClcIlxuICAgICAgICAob25Sb3dHb3RvRGV0YWlsKT1cImludm9rZVJvd0FjdGlvbkdvdG9EZXRhaWwoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25EZXRhaWwoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd1ZpZXcpPVwiaW52b2tlUm93QWN0aW9uVmlldygkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93TG9jYXRpb24pPVwiaW52b2tlUm93QWN0aW9uTG9jYXRpb24oJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAob25Sb3dDb3B5KT1cImludm9rZVJvd0FjdGlvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0RlbGV0ZSk9XCJpbnZva2VSb3dBY3Rpb25EZWxldGUoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAob25Sb3dFZGl0KT1cImludm9rZVJvd0FjdGlvbkVkaXQoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd1ByaW50KT1cImludm9rZVJvd0FjdGlvblByaW50KCRldmVudClcIlxuICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd09wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25PcHRpb24oJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0xhbmd1YWdlKT1cImludm9rZVJvd0FjdGlvbkxhbmd1YWdlKCRldmVudClcIlxuICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgIChvblJvd1NlbGVjdGlvbik9XCJpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgIChvblNoaWZ0RG91YmxlQ2xpY2spPVwiaW52b2tlU2hpZnREb3VibGVDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKHJvd0NvdW50Q2hhbmdlZCk9XCJpbnZva2VSb3dDb3VudENoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChjZWxsT3B0aW9uU2VsZWN0KT1cImNlbGxPcHRpb25NZW51U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChib2R5U2Nyb2xsKT1cIm9uQm9keVNjcm9sbCgkZXZlbnQpXCJcbiAgICAvPlxuICAgIFxuICAgIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgICBAaWYgKHBhZ2luYXRpb24gfHwgY2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgICAgPG9uZS1ncmlkLXBhZ2luYXRpb25cbiAgICAgICAgICAgIFtwYWdpbmF0ZV09XCJjbGllbnRTaWRlUGFnaW5hdGlvbiA/IGludGVybmFsUGFnaW5hdGUgOiBwYWdpbmF0ZVwiXG4gICAgICAgICAgICAoZ29Ub0ZpcnN0KT1cImludm9rZUdvVG9GaXJzdCgpXCJcbiAgICAgICAgICAgIChnb1RvTGFzdCk9XCJpbnZva2VHb1RvTGFzdCgpXCJcbiAgICAgICAgICAgIChnb1RvUHJldmlvdXMpPVwiaW52b2tlR29Ub1ByZXZpb3VzKClcIlxuICAgICAgICAgICAgKGdvVG9OZXh0KT1cImludm9rZUdvVG9OZXh0KClcIlxuICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cImludm9rZVBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAvPlxuICAgIH1cblxuICAgIDwhLS0gTWFzdGVyIERldGFpbCBHcmlkIHRlbXBsYXRlLCByZW5kZXJlZCBpbnNpZGUgb25lLWdyaWQtYm9keSB2aWEgbmdUZW1wbGF0ZU91dGxldC5cbiAgICAgICAgIERlY2xhcmVkIGhlcmUgKHNlbGYtcmVmZXJlbmNlKSBzbyBvbmUtZ3JpZC1ib2R5J3MgdGVtcGxhdGUgZG9lcyBub3QgbmVlZCB0b1xuICAgICAgICAgaW1wb3J0IG9uZS1ncmlkLCB3aGljaCB3b3VsZCBjcmVhdGUgYW4gdW5zdXBwb3J0ZWQgY29tcGlsZS10aW1lIGN5Y2xlLiAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2RldGFpbEdyaWRUcGwgbGV0LW5vZGU9XCJub2RlXCI+XG4gICAgICAgIDxvbmUtZ3JpZFxuICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJub2RlLmRldGFpbFJvd0hlaWdodFwiXG4gICAgICAgICAgICBbZ3JpZFR5cGVdPVwiJ2RldGFpbCdcIlxuICAgICAgICAgICAgW21hc3Rlck5vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICBbbWFzdGVyRGV0YWlsXT1cIm1hc3RlckRldGFpbFwiXG4gICAgICAgICAgICBbZGVmYXVsdENvbHVtbkRlZl09XCJkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMuZGV0YWlsR3JpZE9wdGlvbnMuZGVmYXVsdENvbHVtbkRlZlwiXG4gICAgICAgICAgICBbY29sdW1uRGVmc109XCJkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMuZGV0YWlsR3JpZE9wdGlvbnMuY29sdW1uRGVmc1wiXG4gICAgICAgICAgICBbcm93RGF0YV09XCJub2RlPy5kZXRhaWxSb3dEYXRhXCJcbiAgICAgICAgICAgIFtyb3dOdW1iZXJdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zPy5yb3dOdW1iZXJcIlxuICAgICAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCJcbiAgICAgICAgICAgIFtjb250ZXh0XT1cImNvbnRleHRcIlxuICAgICAgICAgICAgKGV4cGFuc2lvbkNoYW5nZWQpPVwiaW52b2tlRXhwYW5zaW9uQ2hhbmdlZENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93QWRkTmV3KT1cImludm9rZVJvd0FjdGlvbkFkZE5ldygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd1ZpZXcpPVwiaW52b2tlUm93QWN0aW9uVmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RG9jdW1lbnQpPVwiaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dDb3B5KT1cImludm9rZVJvd0FjdGlvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93R290b0xpc3QpPVwiaW52b2tlUm93QWN0aW9uR290b0xpc3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dFZGl0KT1cImludm9rZVJvd0FjdGlvbkVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0hpc3RvcnkpPVwiaW52b2tlUm93QWN0aW9uSGlzdG9yeSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd09wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25PcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0NlbGxPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkdyaWRSZWFkeSk9XCJvbkRldGFpbEdyaWRSZWFkeSgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+Il19
|