UNPKG

systelab-components

Version:

systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.

138 lines 33.2 kB
import { Component, Input } from '@angular/core'; import { AbstractApiGrid } from '../grid/abstract-api-grid.component'; import * as i0 from "@angular/core"; import * as i1 from "systelab-preferences"; import * as i2 from "systelab-translate"; import * as i3 from "../modal/dialog/dialog.service"; import * as i4 from "ag-grid-angular"; import * as i5 from "../grid/contextmenu/grid-context-menu-component"; import * as i6 from "../grid/contextmenu/grid-header-context-menu.component"; export class SearcherTableComponent extends AbstractApiGrid { constructor(preferencesService, i18nService, dialogService) { super(preferencesService, i18nService, dialogService); this.preferencesService = preferencesService; this.i18nService = i18nService; this.dialogService = dialogService; } ngOnInit() { super.ngOnInit(); this.gridOptions.enableBrowserTooltips = true; this.gridOptions.suppressCellFocus = false; this.gridOptions.onCellKeyDown = this.onEnterPressedCallback(); } getColumnDefs() { return this.searcher.getColumnDefs(); } hideHeader() { return this.searcher.hideHeader(); } getIsFullWidthRow(isFullWidthRowParams) { return this.searcher.getIsFullWidthRow(isFullWidthRowParams); } getFullWidthCellRenderer() { return this.searcher.getFullWidthCellRenderer(); } getContextMenuOptions() { return new Array(); } getTotalItems() { return this.searcher.getTotalItems(); } getData(page, itemsPerPage) { let searchText; if (this.valueForSearch) { searchText = (this.searchForContain) ? '%' + this.valueForSearch : this.valueForSearch; } return this.searcher.getData(searchText, page, itemsPerPage); } refreshTable() { this.refresh(); } focusFirstRow() { this.gridOptions.api.setFocusedCell(0, this.gridOptions.columnApi.getColumns()[0].getColId()); } getSelectedElements() { return this.gridOptions.api.getSelectedRows(); } getGridOptionsPreferencesPrefix() { return this.searcher.getGridOptionsPreferencesPrefix(); } onModelUpdated(event) { super.onModelUpdated(event); if (this.multipleSelection) { if (this.searcher && this.searcher.multipleSelectedItemList && this.searcher.multipleSelectedItemList.length > 0) { this.gridOptions.api.forEachNode(node => { if (this.searcher.multipleSelectedItemList .filter((selectedItem) => { return (selectedItem && node.data && selectedItem[this.getSelectionField()] === node.data[this.getSelectionField()]); }).length > 0) { node.selectThisNode(true); } }); } } else if (this.searcher && this.searcher.id && this.searcher.id !== undefined) { this.gridOptions.api.forEachNode(node => { if (node.data && node.data[this.searcher.getIdField()] === this.searcher.id) { node.selectThisNode(true); } }); } } getSelectionField() { return this.searcher.useIdInMultipleSelectionGrid ? this.searcher.getIdField() : this.searcher.getCodeField(); } // overrides onRowSelected(event) { if (this.multipleSelection) { if (event.node && event.node.data && event.node.data[this.searcher.getIdField()] !== undefined) { if (this.searcher.multipleSelectedItemList) { const element = this.searcher.multipleSelectedItemList.find((item) => { return item[this.getSelectionField()] === event.node.data[this.getSelectionField()]; }); if (event.node.selected && !element) { this.addElementToMultipleSelectedItemList(event.node.data); } else if (!event.node.selected && element) { this.searcher.multipleSelectedItemList = this.searcher.multipleSelectedItemList .filter((item) => item[this.getSelectionField()] !== element[this.getSelectionField()]); } } else { this.addElementToMultipleSelectedItemList(event.node.data); } } } } addElementToMultipleSelectedItemList(element) { if (!this.searcher.multipleSelectedItemList) { this.searcher.multipleSelectedItemList = []; } this.searcher.multipleSelectedItemList.push(element); this.searcher.multipleSelectedItemList = this.searcher.multipleSelectedItemList.slice(); } onEnterPressedCallback() { return (e) => { if (e.event instanceof KeyboardEvent) { const keyEvent = e.event; if (keyEvent.key === 'Enter') { this.clickRow.emit(e.data); } } }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: SearcherTableComponent, deps: [{ token: i1.PreferencesService }, { token: i2.I18nService }, { token: i3.DialogService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: SearcherTableComponent, selector: "systelab-internal-searcher-table", inputs: { valueForSearch: "valueForSearch", searchForContain: ["contains", "searchForContain"], searcher: "searcher" }, usesInheritance: true, ngImport: i0, template: "<div #hidden class=\"height-hidden\"></div>\n<ag-grid-angular id=\"agGrid\" #agGrid style=\"position:absolute; top:0; bottom:0; left:0; right:0; overflow: hidden;\"\n class=\"ag-theme-fresh\"\n [gridOptions]=\"gridOptions\"\n (gridReady)=\"doGridReady($event)\"\n (gridSizeChanged)=\"doGridSizeChanged($event)\"\n (cellClicked)=\"doClick($event)\"\n [rowDragManaged]=\"true\"\n [animateRows]=\"true\"\n (rowDragEnd)=\"onRowDragEnd($event)\"\n (columnResized)=\"doColumnResized($event)\"\n (viewportChanged)=\"doViewportChanged()\"\n [overlayNoRowsTemplate]=\"overlayNoRowsTemplate\"\n [overlayLoadingTemplate]=\"overlayLoadingTemplate\"\n (rowSelected)=\"onRowSelected($event)\"\n (modelUpdated)=\"onModelUpdated($event)\" [rowData]=\"rowData\">\n</ag-grid-angular>\n<systelab-grid-context-menu #popupmenu [style.position]=\"'fixed'\" [isEmbedded]=\"true\"></systelab-grid-context-menu>\n<systelab-grid-header-context-menu #headerpopupmenu [style.position]=\"'fixed'\" [isEmbedded]=\"true\"></systelab-grid-header-context-menu>\n", dependencies: [{ kind: "component", type: i4.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: i5.GridContextMenuComponent, selector: "systelab-grid-context-menu" }, { kind: "component", type: i6.GridHeaderContextMenu, selector: "systelab-grid-header-context-menu" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: SearcherTableComponent, decorators: [{ type: Component, args: [{ selector: 'systelab-internal-searcher-table', template: "<div #hidden class=\"height-hidden\"></div>\n<ag-grid-angular id=\"agGrid\" #agGrid style=\"position:absolute; top:0; bottom:0; left:0; right:0; overflow: hidden;\"\n class=\"ag-theme-fresh\"\n [gridOptions]=\"gridOptions\"\n (gridReady)=\"doGridReady($event)\"\n (gridSizeChanged)=\"doGridSizeChanged($event)\"\n (cellClicked)=\"doClick($event)\"\n [rowDragManaged]=\"true\"\n [animateRows]=\"true\"\n (rowDragEnd)=\"onRowDragEnd($event)\"\n (columnResized)=\"doColumnResized($event)\"\n (viewportChanged)=\"doViewportChanged()\"\n [overlayNoRowsTemplate]=\"overlayNoRowsTemplate\"\n [overlayLoadingTemplate]=\"overlayLoadingTemplate\"\n (rowSelected)=\"onRowSelected($event)\"\n (modelUpdated)=\"onModelUpdated($event)\" [rowData]=\"rowData\">\n</ag-grid-angular>\n<systelab-grid-context-menu #popupmenu [style.position]=\"'fixed'\" [isEmbedded]=\"true\"></systelab-grid-context-menu>\n<systelab-grid-header-context-menu #headerpopupmenu [style.position]=\"'fixed'\" [isEmbedded]=\"true\"></systelab-grid-header-context-menu>\n" }] }], ctorParameters: () => [{ type: i1.PreferencesService }, { type: i2.I18nService }, { type: i3.DialogService }], propDecorators: { valueForSearch: [{ type: Input }], searchForContain: [{ type: Input, args: ['contains'] }], searcher: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoZXIudGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL3NlYXJjaGVyL3NlYXJjaGVyLnRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5c3RlbGFiLWNvbXBvbmVudHMvc3JjL2xpYi9ncmlkL2Fic3RyYWN0LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFLekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7OztBQVN0RSxNQUFNLE9BQU8sc0JBQTBCLFNBQVEsZUFBa0I7SUFNaEUsWUFBK0Isa0JBQXNDLEVBQXFCLFdBQXdCLEVBQzVGLGFBQTRCO1FBQ2pELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFGeEIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUFxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUM1RixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUVsRCxDQUFDO0lBRWUsUUFBUTtRQUN2QixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7SUFDL0QsQ0FBQztJQUVTLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFa0IsVUFBVTtRQUM1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QztpQkFDM0I7YUFDRDtRQUNGLENBQUMsQ0FBQztJQUNILENBQUM7OEdBbklXLHNCQUFzQjtrR0FBdEIsc0JBQXNCLHVOQ2RuQyx1dUNBbUJBOzsyRkRMYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0ksa0NBQWtDOzZJQU0vQixjQUFjO3NCQUE3QixLQUFLO2dCQUNvQixnQkFBZ0I7c0JBQXpDLEtBQUs7dUJBQUMsVUFBVTtnQkFDRCxRQUFRO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICdzeXN0ZWxhYi1wcmVmZXJlbmNlcyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJ3N5c3RlbGFiLXRyYW5zbGF0ZSc7XG5pbXBvcnQgeyBDZWxsS2V5RG93bkV2ZW50LCBJc0Z1bGxXaWR0aFJvd1BhcmFtcyB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcbmltcG9ydCB7IEFic3RyYWN0U2VhcmNoZXIgfSBmcm9tICcuL2Fic3RyYWN0LXNlYXJjaGVyJztcbmltcG9ydCB7IEFic3RyYWN0QXBpR3JpZCB9IGZyb20gJy4uL2dyaWQvYWJzdHJhY3QtYXBpLWdyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi9tb2RhbC9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICAgICdzeXN0ZWxhYi1pbnRlcm5hbC1zZWFyY2hlci10YWJsZScsXG5cdHRlbXBsYXRlVXJsOiAnLi4vZ3JpZC9hYnN0cmFjdC1ncmlkLmNvbXBvbmVudC5odG1sJ1xuXG59KVxuZXhwb3J0IGNsYXNzIFNlYXJjaGVyVGFibGVDb21wb25lbnQ8VD4gZXh0ZW5kcyBBYnN0cmFjdEFwaUdyaWQ8VD4gaW1wbGVtZW50cyBPbkluaXQge1xuXG5cdEBJbnB1dCgpIHB1YmxpYyB2YWx1ZUZvclNlYXJjaDogc3RyaW5nO1xuXHRASW5wdXQoJ2NvbnRhaW5zJykgcHVibGljIHNlYXJjaEZvckNvbnRhaW46IGJvb2xlYW47XG5cdEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hlcjogQWJzdHJhY3RTZWFyY2hlcjxUPjtcblxuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlZmVyZW5jZXNTZXJ2aWNlOiBQcmVmZXJlbmNlc1NlcnZpY2UsIHByb3RlY3RlZCBvdmVycmlkZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG5cdFx0XHRcdHByb3RlY3RlZCBvdmVycmlkZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKSB7XG5cdFx0c3VwZXIocHJlZmVyZW5jZXNTZXJ2aWNlLCBpMThuU2VydmljZSwgZGlhbG9nU2VydmljZSk7XG5cdH1cblxuXHRwdWJsaWMgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG5cdFx0c3VwZXIubmdPbkluaXQoKTtcblx0XHR0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUJyb3dzZXJUb29sdGlwcyA9IHRydWU7XG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5zdXBwcmVzc0NlbGxGb2N1cyA9IGZhbHNlO1xuXHRcdHRoaXMuZ3JpZE9wdGlvbnMub25DZWxsS2V5RG93biA9IHRoaXMub25FbnRlclByZXNzZWRDYWxsYmFjaygpXG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0Q29sdW1uRGVmcygpOiBBcnJheTxhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy5zZWFyY2hlci5nZXRDb2x1bW5EZWZzKCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgaGlkZUhlYWRlcigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5zZWFyY2hlci5oaWRlSGVhZGVyKCk7XG5cdH1cblxuXG5cdHByb3RlY3RlZCBvdmVycmlkZSBnZXRJc0Z1bGxXaWR0aFJvdyhpc0Z1bGxXaWR0aFJvd1BhcmFtczogSXNGdWxsV2lkdGhSb3dQYXJhbXMpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5zZWFyY2hlci5nZXRJc0Z1bGxXaWR0aFJvdyhpc0Z1bGxXaWR0aFJvd1BhcmFtcyk7XG5cdH1cblxuXHRwdWJsaWMgb3ZlcnJpZGUgZ2V0RnVsbFdpZHRoQ2VsbFJlbmRlcmVyKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VhcmNoZXIuZ2V0RnVsbFdpZHRoQ2VsbFJlbmRlcmVyKCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0Q29udGV4dE1lbnVPcHRpb25zKCk6IEFycmF5PGFueT4ge1xuXHRcdHJldHVybiBuZXcgQXJyYXk8YW55PigpO1xuXHR9XG5cblx0cHVibGljIGdldFRvdGFsSXRlbXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VhcmNoZXIuZ2V0VG90YWxJdGVtcygpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGdldERhdGEocGFnZTogbnVtYmVyLCBpdGVtc1BlclBhZ2U6IG51bWJlcik6IE9ic2VydmFibGU8QXJyYXk8VD4+IHtcblx0XHRsZXQgc2VhcmNoVGV4dDogc3RyaW5nO1xuXHRcdGlmICh0aGlzLnZhbHVlRm9yU2VhcmNoKSB7XG5cdFx0XHRzZWFyY2hUZXh0ID0gKHRoaXMuc2VhcmNoRm9yQ29udGFpbikgPyAnJScgKyB0aGlzLnZhbHVlRm9yU2VhcmNoIDogdGhpcy52YWx1ZUZvclNlYXJjaDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc2VhcmNoZXIuZ2V0RGF0YShzZWFyY2hUZXh0LCBwYWdlLCBpdGVtc1BlclBhZ2UpO1xuXHR9XG5cblx0cHVibGljIHJlZnJlc2hUYWJsZSgpOiB2b2lkIHtcblx0XHR0aGlzLnJlZnJlc2goKTtcblx0fVxuXG5cdHB1YmxpYyBmb2N1c0ZpcnN0Um93KCk6IHZvaWQge1xuXHRcdHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnNldEZvY3VzZWRDZWxsKDAsIHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uQXBpLmdldENvbHVtbnMoKVswXS5nZXRDb2xJZCgpKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRTZWxlY3RlZEVsZW1lbnRzKCk6IEFycmF5PFQ+IHtcblx0XHRyZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5hcGkuZ2V0U2VsZWN0ZWRSb3dzKCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0R3JpZE9wdGlvbnNQcmVmZXJlbmNlc1ByZWZpeCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnNlYXJjaGVyLmdldEdyaWRPcHRpb25zUHJlZmVyZW5jZXNQcmVmaXgoKTtcblx0fVxuXG5cdHB1YmxpYyBvdmVycmlkZSBvbk1vZGVsVXBkYXRlZChldmVudDogYW55KSB7XG5cdFx0c3VwZXIub25Nb2RlbFVwZGF0ZWQoZXZlbnQpO1xuXHRcdGlmICh0aGlzLm11bHRpcGxlU2VsZWN0aW9uKSB7XG5cdFx0XHRpZiAodGhpcy5zZWFyY2hlciAmJiB0aGlzLnNlYXJjaGVyLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdCAmJiB0aGlzLnNlYXJjaGVyLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmZvckVhY2hOb2RlKG5vZGUgPT4ge1xuXHRcdFx0XHRcdGlmICh0aGlzLnNlYXJjaGVyLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdFxuXHRcdFx0XHRcdFx0LmZpbHRlcigoc2VsZWN0ZWRJdGVtKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiAoc2VsZWN0ZWRJdGVtICYmIG5vZGUuZGF0YSAmJiBzZWxlY3RlZEl0ZW1bdGhpcy5nZXRTZWxlY3Rpb25GaWVsZCgpXSA9PT0gbm9kZS5kYXRhW3RoaXMuZ2V0U2VsZWN0aW9uRmllbGQoKV0pO1xuXHRcdFx0XHRcdFx0fSkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0bm9kZS5zZWxlY3RUaGlzTm9kZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGhpcy5zZWFyY2hlciAmJiB0aGlzLnNlYXJjaGVyLmlkICYmIHRoaXMuc2VhcmNoZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5hcGkuZm9yRWFjaE5vZGUobm9kZSA9PiB7XG5cdFx0XHRcdGlmIChub2RlLmRhdGEgJiYgbm9kZS5kYXRhW3RoaXMuc2VhcmNoZXIuZ2V0SWRGaWVsZCgpXSA9PT0gdGhpcy5zZWFyY2hlci5pZCkge1xuXHRcdFx0XHRcdG5vZGUuc2VsZWN0VGhpc05vZGUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0U2VsZWN0aW9uRmllbGQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VhcmNoZXIudXNlSWRJbk11bHRpcGxlU2VsZWN0aW9uR3JpZCA/IHRoaXMuc2VhcmNoZXIuZ2V0SWRGaWVsZCgpIDogdGhpcy5zZWFyY2hlci5nZXRDb2RlRmllbGQoKTtcblx0fVxuXG5cdC8vIG92ZXJyaWRlc1xuXHRwdWJsaWMgb3ZlcnJpZGUgb25Sb3dTZWxlY3RlZChldmVudDogYW55KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubXVsdGlwbGVTZWxlY3Rpb24pIHtcblx0XHRcdGlmIChldmVudC5ub2RlICYmIGV2ZW50Lm5vZGUuZGF0YSAmJiBldmVudC5ub2RlLmRhdGFbdGhpcy5zZWFyY2hlci5nZXRJZEZpZWxkKCldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHRoaXMuc2VhcmNoZXIubXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgZWxlbWVudCA9IHRoaXMuc2VhcmNoZXIubXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0LmZpbmQoKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBpdGVtW3RoaXMuZ2V0U2VsZWN0aW9uRmllbGQoKV0gPT09IGV2ZW50Lm5vZGUuZGF0YVt0aGlzLmdldFNlbGVjdGlvbkZpZWxkKCldO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmIChldmVudC5ub2RlLnNlbGVjdGVkICYmICFlbGVtZW50KSB7XG5cdFx0XHRcdFx0XHR0aGlzLmFkZEVsZW1lbnRUb011bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdChldmVudC5ub2RlLmRhdGEpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIWV2ZW50Lm5vZGUuc2VsZWN0ZWQgJiYgZWxlbWVudCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZWFyY2hlci5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QgPSB0aGlzLnNlYXJjaGVyLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdFxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKChpdGVtKSA9PiBpdGVtW3RoaXMuZ2V0U2VsZWN0aW9uRmllbGQoKV0gIT09IGVsZW1lbnRbdGhpcy5nZXRTZWxlY3Rpb25GaWVsZCgpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuYWRkRWxlbWVudFRvTXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0KGV2ZW50Lm5vZGUuZGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFkZEVsZW1lbnRUb011bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdChlbGVtZW50OiBUKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLnNlYXJjaGVyLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdCkge1xuXHRcdFx0dGhpcy5zZWFyY2hlci5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QgPSBbXTtcblx0XHR9XG5cdFx0dGhpcy5zZWFyY2hlci5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QucHVzaChlbGVtZW50KTtcblx0XHR0aGlzLnNlYXJjaGVyLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdCA9IHRoaXMuc2VhcmNoZXIubXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0LnNsaWNlKCk7XG5cdH1cblxuXHRwcml2YXRlIG9uRW50ZXJQcmVzc2VkQ2FsbGJhY2soKSB7XG5cdFx0cmV0dXJuIChlKSA9PiB7XG5cdFx0XHRpZiAoZS5ldmVudCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQpIHtcblx0XHRcdFx0Y29uc3Qga2V5RXZlbnQgPSBlLmV2ZW50O1xuXHRcdFx0XHRpZiAoa2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG5cdFx0XHRcdFx0dGhpcy5jbGlja1Jvdy5lbWl0KGUuZGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cbn1cbiIsIjxkaXYgI2hpZGRlbiBjbGFzcz1cImhlaWdodC1oaWRkZW5cIj48L2Rpdj5cbjxhZy1ncmlkLWFuZ3VsYXIgaWQ9XCJhZ0dyaWRcIiAjYWdHcmlkIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7IHRvcDowOyBib3R0b206MDsgbGVmdDowOyByaWdodDowOyBvdmVyZmxvdzogaGlkZGVuO1wiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiYWctdGhlbWUtZnJlc2hcIlxuICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwiZ3JpZE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAoZ3JpZFJlYWR5KT1cImRvR3JpZFJlYWR5KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAoZ3JpZFNpemVDaGFuZ2VkKT1cImRvR3JpZFNpemVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAoY2VsbENsaWNrZWQpPVwiZG9DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgW3Jvd0RyYWdNYW5hZ2VkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICBbYW5pbWF0ZVJvd3NdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgIChyb3dEcmFnRW5kKT1cIm9uUm93RHJhZ0VuZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgKGNvbHVtblJlc2l6ZWQpPVwiZG9Db2x1bW5SZXNpemVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAodmlld3BvcnRDaGFuZ2VkKT1cImRvVmlld3BvcnRDaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICBbb3ZlcmxheU5vUm93c1RlbXBsYXRlXT1cIm92ZXJsYXlOb1Jvd3NUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgIFtvdmVybGF5TG9hZGluZ1RlbXBsYXRlXT1cIm92ZXJsYXlMb2FkaW5nVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAocm93U2VsZWN0ZWQpPVwib25Sb3dTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgKG1vZGVsVXBkYXRlZCk9XCJvbk1vZGVsVXBkYXRlZCgkZXZlbnQpXCIgW3Jvd0RhdGFdPVwicm93RGF0YVwiPlxuPC9hZy1ncmlkLWFuZ3VsYXI+XG48c3lzdGVsYWItZ3JpZC1jb250ZXh0LW1lbnUgI3BvcHVwbWVudSBbc3R5bGUucG9zaXRpb25dPVwiJ2ZpeGVkJ1wiIFtpc0VtYmVkZGVkXT1cInRydWVcIj48L3N5c3RlbGFiLWdyaWQtY29udGV4dC1tZW51PlxuPHN5c3RlbGFiLWdyaWQtaGVhZGVyLWNvbnRleHQtbWVudSAjaGVhZGVycG9wdXBtZW51IFtzdHlsZS5wb3NpdGlvbl09XCInZml4ZWQnXCIgW2lzRW1iZWRkZWRdPVwidHJ1ZVwiPjwvc3lzdGVsYWItZ3JpZC1oZWFkZXItY29udGV4dC1tZW51PlxuIl19