UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

220 lines 36.5 kB
import { Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core'; import { alertOnError, DataGridComponent, FilteringActionType, gettext, PRODUCT_EXPERIENCE_EVENT_SOURCE } from '@c8y/ngx-components'; import { Subject } from 'rxjs'; import { DeviceGridService } from './device-grid.service'; import * as i0 from "@angular/core"; import * as i1 from "./device-grid.service"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@angular/common"; export class DeviceGridComponent { /** Pagination settings, e.g. allows for setting current page or page size. If not given, defaults to standard settings. */ set _pagination(value) { if (value) { this.pagination = value; } } /** Sets load more mode. */ set _infiniteScroll(infiniteScroll) { this.infiniteScroll = infiniteScroll; if (infiniteScroll) { this.pagination = this.deviceGridService.getInfiniteScrollPagination(); } } /** Sets action controls (actions available for individual items). If not given, it defaults to standard actions. */ set _actionControls(value) { this.actionControls = value; } /** Sets bulk action controls (actions available for items selected by user). If not given, it defaults to standard bulk actions. */ set _bulkActionControls(value) { if (value) { this.bulkActionControls = value; } else { this.bulkActionControls = this.deviceGridService.getDefaultBulkActionControls(); } } /** Sets header action controls (actions available from the grid header). If not given, it defaults to empty list of actions. */ set _headerActionControls(value) { if (value) { this.headerActionControls = value; } else { this.headerActionControls = this.deviceGridService.getDefaultHeaderActionControls(); } } constructor(deviceGridService) { this.deviceGridService = deviceGridService; /** Takes an event emitter. When an event is emitted, the grid will be reloaded. */ this.refresh = new EventEmitter(); /** The title for the data grid, it's displayed in the grid's header. */ this.title = gettext('Devices'); /** The label for load more button. */ this.loadMoreItemsLabel = gettext('Load more devices'); /** The label for loading indicator. */ this.loadingItemsLabel = gettext('Loading devices…'); /** The list of columns to be displayed in the grid. If not given, it defaults to standard columns. */ this.columns = this.deviceGridService.getDefaultColumns(); /** Determines whether items can be selected by clicking a checkbox in the first column. */ this.selectable = false; /** Restricts selection to a single row only. Selection column displays radio button instead of checkboxes */ this.singleSelection = false; /** Sets the base query which is appended to the request for data. */ this.baseQuery = {}; this.childDeviceGrid = false; /** Sets the withChildren query which is appended to the request. */ this.withChildren = false; /** * Enables the search for devices where any device propery is matched agains the search term. * Enabled by default. This input does not take effect if the <code>childDeviceGrid</code> input is set to <code>true</code> */ this.showSearch = true; /** * Sets the class name used for active rows (last clicked). * Set empty string to disable appending active class to grid rows. */ this.activeClassName = 'active'; /** Emits an event when columns configuration changes. */ this.onColumnsChange = new EventEmitter(); this.onFilterChange = new EventEmitter(); this.onDeviceQueryStringChange = new EventEmitter(); /** Emits an event when items selection changes. The array contains ids of selected items. */ this.itemsSelect = new EventEmitter(); this.actionControls = []; this.appliedFilters = []; this.pagination = this.deviceGridService.getDefaultPagination(); this.bulkActionControls = this.deviceGridService.getDefaultBulkActionControls(); this.headerActionControls = this.deviceGridService.getDefaultHeaderActionControls(); this.noResultsMessage = gettext('No matching devices.'); this.noDataMessage = gettext('No devices to display.'); this.noResultsSubtitle = gettext('Refine your search terms'); this.destroyed$ = new Subject(); this.serverSideDataCallback = this.onDataSourceModifier.bind(this); } ngOnDestroy() { this.destroyed$.next(); this.destroyed$.complete(); } trackByName(_index, column) { return column.name; } async onDataSourceModifier(dataSourceModifier) { let serverSideDataResult; let filteredSize; let size; if (this.childDeviceGrid) { const { res, data, paging } = await alertOnError(this.deviceGridService.getChildDeviceData(dataSourceModifier.columns, dataSourceModifier.pagination, this.baseQuery, this.withChildren, this.parentDeviceId)); filteredSize = await alertOnError(this.deviceGridService.getCountChildDevices(dataSourceModifier.columns, dataSourceModifier.pagination, this.baseQuery, this.parentDeviceId)); size = await alertOnError(this.deviceGridService.getTotalChildDevices(this.baseQuery, this.parentDeviceId)); serverSideDataResult = { res, data, paging, filteredSize, size }; } else { const { res, data, paging } = await alertOnError(this.deviceGridService.getData(dataSourceModifier.columns, dataSourceModifier.pagination, this.baseQuery, this.withChildren, dataSourceModifier.searchText)); filteredSize = await alertOnError(this.deviceGridService.getCount(dataSourceModifier.columns, dataSourceModifier.pagination, this.baseQuery, dataSourceModifier.searchText)); size = await alertOnError(this.deviceGridService.getTotal(this.baseQuery)); serverSideDataResult = { res, data, paging, filteredSize, size }; } this.onColumnsChange.emit(dataSourceModifier.columns); this.onDeviceQueryStringChange.emit(this.deviceGridService.getDeviceQueryString(dataSourceModifier.columns, this.baseQuery)); if (this.dataCallback) { serverSideDataResult = this.dataCallback(serverSideDataResult); } return serverSideDataResult; } updateFiltering(columnNames, action) { const { type } = action; if (type === FilteringActionType.ResetFilter) { this.dataGrid.clearFilters(); } else { this.dataGrid.updateFiltering(columnNames, action); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceGridComponent, deps: [{ token: i1.DeviceGridService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DeviceGridComponent, selector: "c8y-device-grid", inputs: { dataCallback: "dataCallback", refresh: "refresh", title: "title", loadMoreItemsLabel: "loadMoreItemsLabel", loadingItemsLabel: "loadingItemsLabel", legacyConfigKey: "legacyConfigKey", legacyFilterKey: "legacyFilterKey", columns: "columns", _pagination: ["pagination", "_pagination"], _infiniteScroll: ["infiniteScroll", "_infiniteScroll"], _actionControls: ["actionControls", "_actionControls"], selectable: "selectable", singleSelection: "singleSelection", baseQuery: "baseQuery", _bulkActionControls: ["bulkActionControls", "_bulkActionControls"], _headerActionControls: ["headerActionControls", "_headerActionControls"], childDeviceGrid: "childDeviceGrid", parentDeviceId: "parentDeviceId", withChildren: "withChildren", showSearch: "showSearch", activeClassName: "activeClassName" }, outputs: { onColumnsChange: "onColumnsChange", onFilterChange: "onFilterChange", onDeviceQueryStringChange: "onDeviceQueryStringChange", itemsSelect: "itemsSelect" }, providers: [ { provide: PRODUCT_EXPERIENCE_EVENT_SOURCE, useExisting: forwardRef(() => DeviceGridComponent) } ], viewQueries: [{ propertyName: "dataGrid", first: true, predicate: DataGridComponent, descendants: true, static: true }], ngImport: i0, template: "<c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"infiniteScroll\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [singleSelection]=\"singleSelection\"\n [bulkActionControls]=\"bulkActionControls\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n (itemsSelect)=\"itemsSelect.emit($event)\"\n [refresh]=\"refresh\"\n [showSearch]=\"showSearch && !childDeviceGrid\"\n [headerActionControls]=\"headerActionControls\"\n [activeClassName]=\"activeClassName\"\n c8yProductExperience\n inherit\n>\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-device-management'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : null\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n <c8y-column [name]=\"column.name\"></c8y-column>\n </ng-container>\n</c8y-data-grid>\n", dependencies: [{ kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i2.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "directive", type: i2.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceGridComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-device-grid', providers: [ { provide: PRODUCT_EXPERIENCE_EVENT_SOURCE, useExisting: forwardRef(() => DeviceGridComponent) } ], template: "<c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"infiniteScroll\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [singleSelection]=\"singleSelection\"\n [bulkActionControls]=\"bulkActionControls\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n (itemsSelect)=\"itemsSelect.emit($event)\"\n [refresh]=\"refresh\"\n [showSearch]=\"showSearch && !childDeviceGrid\"\n [headerActionControls]=\"headerActionControls\"\n [activeClassName]=\"activeClassName\"\n c8yProductExperience\n inherit\n>\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-device-management'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : null\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n <c8y-column [name]=\"column.name\"></c8y-column>\n </ng-container>\n</c8y-data-grid>\n" }] }], ctorParameters: () => [{ type: i1.DeviceGridService }], propDecorators: { dataCallback: [{ type: Input }], refresh: [{ type: Input }], title: [{ type: Input }], loadMoreItemsLabel: [{ type: Input }], loadingItemsLabel: [{ type: Input }], legacyConfigKey: [{ type: Input }], legacyFilterKey: [{ type: Input }], columns: [{ type: Input, args: ['columns'] }], _pagination: [{ type: Input, args: ['pagination'] }], _infiniteScroll: [{ type: Input, args: ['infiniteScroll'] }], _actionControls: [{ type: Input, args: ['actionControls'] }], selectable: [{ type: Input }], singleSelection: [{ type: Input }], baseQuery: [{ type: Input }], _bulkActionControls: [{ type: Input, args: ['bulkActionControls'] }], _headerActionControls: [{ type: Input, args: ['headerActionControls'] }], childDeviceGrid: [{ type: Input }], parentDeviceId: [{ type: Input }], withChildren: [{ type: Input }], showSearch: [{ type: Input }], activeClassName: [{ type: Input }], onColumnsChange: [{ type: Output }], onFilterChange: [{ type: Output }], onDeviceQueryStringChange: [{ type: Output }], itemsSelect: [{ type: Output }], dataGrid: [{ type: ViewChild, args: [DataGridComponent, { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2aWNlLWdyaWQvZGV2aWNlLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2aWNlLWdyaWQvZGV2aWNlLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxZQUFZLEVBR1osaUJBQWlCLEVBRWpCLG1CQUFtQixFQUVuQixPQUFPLEVBTVAsK0JBQStCLEVBR2hDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7QUFZMUQsTUFBTSxPQUFPLG1CQUFtQjtJQXlCOUIsMkhBQTJIO0lBQzNILElBQXlCLFdBQVcsQ0FBQyxLQUFpQjtRQUNwRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFBNkIsZUFBZSxDQUFDLGNBQTRCO1FBQ3ZFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUNELG9IQUFvSDtJQUNwSCxJQUE2QixlQUFlLENBQUMsS0FBc0I7UUFDakUsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQU9ELG9JQUFv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ZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFNTixlQUFlO3NCQURkLEtBQUs7Z0JBR0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQVdQLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3Rpb25Db250cm9sLFxuICBhbGVydE9uRXJyb3IsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIERhdGFHcmlkQ29tcG9uZW50LFxuICBEYXRhU291cmNlTW9kaWZpZXIsXG4gIEZpbHRlcmluZ0FjdGlvblR5cGUsXG4gIEZpbHRlcmluZ01vZGlmaWVyLFxuICBnZXR0ZXh0LFxuICBIZWFkZXJBY3Rpb25Db250cm9sLFxuICBMb2FkTW9yZU1vZGUsXG4gIFBhZ2luYXRpb24sXG4gIFByb2R1Y3RFeHBlcmllbmNlRXZlbnQsXG4gIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2UsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gIFNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gIFNlcnZlclNpZGVEYXRhUmVzdWx0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGF0YUNhbGxiYWNrLCBGaWx0ZXJDb25maWcgfSBmcm9tICcuL2RldmljZS1ncmlkLm1vZGVsJztcbmltcG9ydCB7IERldmljZUdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9kZXZpY2UtZ3JpZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRldmljZS1ncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RldmljZS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERldmljZUdyaWRDb21wb25lbnQpXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERldmljZUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2Uge1xuICAvKiogT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gbW9kaWZ5IHNlcnZlciBzaWRlIGRhdGEgcmVzdWx0IGJlZm9yZSBpdCdzIHJlbmRlcmVkLiAqL1xuICBASW5wdXQoKSBkYXRhQ2FsbGJhY2s6IERhdGFDYWxsYmFjaztcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogVGhlIHRpdGxlIGZvciB0aGUgZGF0YSBncmlkLCBpdCdzIGRpc3BsYXllZCBpbiB0aGUgZ3JpZCdzIGhlYWRlci4gKi9cbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyA9IGdldHRleHQoJ0RldmljZXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsID0gZ2V0dGV4dCgnTG9hZCBtb3JlIGRldmljZXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGRldmljZXPigKYnKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqXG4gICAqIEludGVybmFsIHVzZSBvbmx5OiB1c2VkIHRvIGRlZmluZSB1c2VyIHByZWZlcmVuY2VzIGtleSB1bmRlciB3aGljaCAnQWxsIGRldmljZXMnIGNvbHVtbiBjb25maWcgaXMgc3RvcmVkLlxuICAgKi9cbiAgQElucHV0KCkgbGVnYWN5Q29uZmlnS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKlxuICAgKiBJbnRlcm5hbCB1c2Ugb25seTogdXNlZCB0byBkZWZpbmUgdXNlciBwcmVmZXJlbmNlcyBrZXkgdW5kZXIgd2hpY2ggJ0FsbCBkZXZpY2VzJyBmaWx0ZXIvc29ydGluZyBjb25maWcgaXMgc3RvcmVkLlxuICAgKi9cbiAgQElucHV0KCkgbGVnYWN5RmlsdGVyS2V5OiBzdHJpbmc7XG4gIC8qKiBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC4gSWYgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byBzdGFuZGFyZCBjb2x1bW5zLiAqL1xuICBASW5wdXQoJ2NvbHVtbnMnKSBjb2x1bW5zOiBDb2x1bW5bXSA9IHRoaXMuZGV2aWNlR3JpZFNlcnZpY2UuZ2V0RGVmYXVsdENvbHVtbnMoKTtcbiAgLyoqIFBhZ2luYXRpb24gc2V0dGluZ3MsIGUuZy4gYWxsb3dzIGZvciBzZXR0aW5nIGN1cnJlbnQgcGFnZSBvciBwYWdlIHNpemUuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gc3RhbmRhcmQgc2V0dGluZ3MuICovXG4gIEBJbnB1dCgncGFnaW5hdGlvbicpIHNldCBfcGFnaW5hdGlvbih2YWx1ZTogUGFnaW5hdGlvbikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGluZmluaXRlU2Nyb2xsOiBMb2FkTW9yZU1vZGU7XG4gIC8qKiBTZXRzIGxvYWQgbW9yZSBtb2RlLiAqL1xuICBASW5wdXQoJ2luZmluaXRlU2Nyb2xsJykgc2V0IF9pbmZpbml0ZVNjcm9sbChpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlKSB7XG4gICAgdGhpcy5pbmZpbml0ZVNjcm9sbCA9IGluZmluaXRlU2Nyb2xsO1xuICAgIGlmIChpbmZpbml0ZVNjcm9sbCkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0gdGhpcy5kZXZpY2VHcmlkU2VydmljZS5nZXRJbmZpbml0ZVNjcm9sbFBhZ2luYXRpb24oKTtcbiAgICB9XG4gIH1cbiAgLyoqIFNldHMgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaW5kaXZpZHVhbCBpdGVtcykuIElmIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gc3RhbmRhcmQgYWN0aW9ucy4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpIHNldCBfYWN0aW9uQ29udHJvbHModmFsdWU6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHMgPSB2YWx1ZTtcbiAgfVxuICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW1zIGNhbiBiZSBzZWxlY3RlZCBieSBjbGlja2luZyBhIGNoZWNrYm94IGluIHRoZSBmaXJzdCBjb2x1bW4uICovXG4gIEBJbnB1dCgpIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgLyoqIFJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcm93IG9ubHkuIFNlbGVjdGlvbiBjb2x1bW4gZGlzcGxheXMgcmFkaW8gYnV0dG9uIGluc3RlYWQgb2YgY2hlY2tib3hlcyAqL1xuICBASW5wdXQoKSBzaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqIFNldHMgdGhlIGJhc2UgcXVlcnkgd2hpY2ggaXMgYXBwZW5kZWQgdG8gdGhlIHJlcXVlc3QgZm9yIGRhdGEuICovXG4gIEBJbnB1dCgpIGJhc2VRdWVyeTogb2JqZWN0ID0ge307XG4gIC8qKiBTZXRzIGJ1bGsgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaXRlbXMgc2VsZWN0ZWQgYnkgdXNlcikuIElmIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gc3RhbmRhcmQgYnVsayBhY3Rpb25zLiAqL1xuICBASW5wdXQoJ2J1bGtBY3Rpb25Db250cm9scycpIHNldCBfYnVsa0FjdGlvbkNvbnRyb2xzKHZhbHVlOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmJ1bGtBY3Rpb25Db250cm9scyA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1bGtBY3Rpb25Db250cm9scyA9IHRoaXMuZGV2aWNlR3JpZFNlcnZpY2UuZ2V0RGVmYXVsdEJ1bGtBY3Rpb25Db250cm9scygpO1xuICAgIH1cbiAgfVxuICAvKiogU2V0cyBoZWFkZXIgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmcm9tIHRoZSBncmlkIGhlYWRlcikuIElmIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gZW1wdHkgbGlzdCBvZiBhY3Rpb25zLiAqL1xuICBASW5wdXQoJ2hlYWRlckFjdGlvbkNvbnRyb2xzJykgc2V0IF9oZWFkZXJBY3Rpb25Db250cm9scyh2YWx1ZTogSGVhZGVyQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmhlYWRlckFjdGlvbkNvbnRyb2xzID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyQWN0aW9uQ29udHJvbHMgPSB0aGlzLmRldmljZUdyaWRTZXJ2aWNlLmdldERlZmF1bHRIZWFkZXJBY3Rpb25Db250cm9scygpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKSBjaGlsZERldmljZUdyaWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcGFyZW50RGV2aWNlSWQ6IHN0cmluZztcbiAgLyoqIFNldHMgdGhlIHdpdGhDaGlsZHJlbiBxdWVyeSB3aGljaCBpcyBhcHBlbmRlZCB0byB0aGUgcmVxdWVzdC4gKi9cbiAgQElucHV0KCkgd2l0aENoaWxkcmVuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBzZWFyY2ggZm9yIGRldmljZXMgd2hlcmUgYW55IGRldmljZSBwcm9wZXJ5IGlzIG1hdGNoZWQgYWdhaW5zIHRoZSBzZWFyY2ggdGVybS5cbiAgICogRW5hYmxlZCBieSBkZWZhdWx0LiBUaGlzIGlucHV0IGRvZXMgbm90IHRha2UgZWZmZWN0IGlmIHRoZSA8Y29kZT5jaGlsZERldmljZUdyaWQ8L2NvZGU+IGlucHV0IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NlYXJjaCA9IHRydWU7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjbGFzcyBuYW1lIHVzZWQgZm9yIGFjdGl2ZSByb3dzIChsYXN0IGNsaWNrZWQpLlxuICAgKiBTZXQgZW1wdHkgc3RyaW5nIHRvIGRpc2FibGUgYXBwZW5kaW5nIGFjdGl2ZSBjbGFzcyB0byBncmlkIHJvd3MuXG4gICAqL1xuICBASW5wdXQoKVxuICBhY3RpdmVDbGFzc05hbWUgPSAnYWN0aXZlJztcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1ucyBjb25maWd1cmF0aW9uIGNoYW5nZXMuICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtbnNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxDb2x1bW5bXT4gPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbltdPigpO1xuICBAT3V0cHV0KCkgb25GaWx0ZXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGaWx0ZXJDb25maWdbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlckNvbmZpZ1tdPigpO1xuICBAT3V0cHV0KCkgb25EZXZpY2VRdWVyeVN0cmluZ0NoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gaXRlbXMgc2VsZWN0aW9uIGNoYW5nZXMuIFRoZSBhcnJheSBjb250YWlucyBpZHMgb2Ygc2VsZWN0ZWQgaXRlbXMuICovXG4gIEBPdXRwdXQoKSBpdGVtc1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICBhcHBsaWVkRmlsdGVyczogRmlsdGVyQ29uZmlnW10gPSBbXTtcbiAgcGFnaW5hdGlvbjogUGFnaW5hdGlvbiA9IHRoaXMuZGV2aWNlR3JpZFNlcnZpY2UuZ2V0RGVmYXVsdFBhZ2luYXRpb24oKTtcbiAgYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdID0gdGhpcy5kZXZpY2VHcmlkU2VydmljZS5nZXREZWZhdWx0QnVsa0FjdGlvbkNvbnRyb2xzKCk7XG4gIGhlYWRlckFjdGlvbkNvbnRyb2xzOiBIZWFkZXJBY3Rpb25Db250cm9sW10gPVxuICAgIHRoaXMuZGV2aWNlR3JpZFNlcnZpY2UuZ2V0RGVmYXVsdEhlYWRlckFjdGlvbkNvbnRyb2xzKCk7XG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG5cbiAgQFZpZXdDaGlsZChEYXRhR3JpZENvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgZGF0YUdyaWQ6IERhdGFHcmlkQ29tcG9uZW50O1xuICBwcm9kdWN0RXhwZXJpZW5jZUV2ZW50OiBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50O1xuXG4gIG5vUmVzdWx0c01lc3NhZ2UgPSBnZXR0ZXh0KCdObyBtYXRjaGluZyBkZXZpY2VzLicpO1xuICBub0RhdGFNZXNzYWdlID0gZ2V0dGV4dCgnTm8gZGV2aWNlcyB0byBkaXNwbGF5LicpO1xuICBub1Jlc3VsdHNTdWJ0aXRsZSA9IGdldHRleHQoJ1JlZmluZSB5b3VyIHNlYXJjaCB0ZXJtcycpO1xuXG4gIHByaXZhdGUgZGVzdHJveWVkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGRldmljZUdyaWRTZXJ2aWNlOiBEZXZpY2VHcmlkU2VydmljZSkge1xuICAgIHRoaXMuc2VydmVyU2lkZURhdGFDYWxsYmFjayA9IHRoaXMub25EYXRhU291cmNlTW9kaWZpZXIuYmluZCh0aGlzKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICB0cmFja0J5TmFtZShfaW5kZXgsIGNvbHVtbjogQ29sdW1uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29sdW1uLm5hbWU7XG4gIH1cblxuICBhc3luYyBvbkRhdGFTb3VyY2VNb2RpZmllcihcbiAgICBkYXRhU291cmNlTW9kaWZpZXI6IERhdGFTb3VyY2VNb2RpZmllclxuICApOiBQcm9taXNlPFNlcnZlclNpZGVEYXRhUmVzdWx0PiB7XG4gICAgbGV0IHNlcnZlclNpZGVEYXRhUmVzdWx0OiBTZXJ2ZXJTaWRlRGF0YVJlc3VsdDtcbiAgICBsZXQgZmlsdGVyZWRTaXplOiBudW1iZXI7XG4gICAgbGV0IHNpemU6IG51bWJlcjtcbiAgICBpZiAodGhpcy5jaGlsZERldmljZUdyaWQpIHtcbiAgICAgIGNvbnN0IHsgcmVzLCBkYXRhLCBwYWdpbmcgfSA9IGF3YWl0IGFsZXJ0T25FcnJvcihcbiAgICAgICAgdGhpcy5kZXZpY2VHcmlkU2VydmljZS5nZXRDaGlsZERldmljZURhdGEoXG4gICAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLmNvbHVtbnMsXG4gICAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLnBhZ2luYXRpb24sXG4gICAgICAgICAgdGhpcy5iYXNlUXVlcnksXG4gICAgICAgICAgdGhpcy53aXRoQ2hpbGRyZW4sXG4gICAgICAgICAgdGhpcy5wYXJlbnREZXZpY2VJZFxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICBmaWx0ZXJlZFNpemUgPSBhd2FpdCBhbGVydE9uRXJyb3IoXG4gICAgICAgIHRoaXMuZGV2aWNlR3JpZFNlcnZpY2UuZ2V0Q291bnRDaGlsZERldmljZXMoXG4gICAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLmNvbHVtbnMsXG4gICAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLnBhZ2luYXRpb24sXG4gICAgICAgICAgdGhpcy5iYXNlUXVlcnksXG4gICAgICAgICAgdGhpcy5wYXJlbnREZXZpY2VJZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgc2l6ZSA9IGF3YWl0IGFsZXJ0T25FcnJvcihcbiAgICAgICAgdGhpcy5kZXZpY2VHcmlkU2VydmljZS5nZXRUb3RhbENoaWxkRGV2aWNlcyh0aGlzLmJhc2VRdWVyeSwgdGhpcy5wYXJlbnREZXZpY2VJZClcbiAgICAgICk7XG5cbiAgICAgIHNlcnZlclNpZGVEYXRhUmVzdWx0ID0ge1xuICAgICAgICByZXMsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHBhZ2luZyxcbiAgICAgICAgZmlsdGVyZWRTaXplLFxuICAgICAgICBzaXplXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IHJlcywgZGF0YSwgcGFnaW5nIH0gPSBhd2FpdCBhbGVydE9uRXJyb3IoXG4gICAgICAgIHRoaXMuZGV2aWNlR3JpZFNlcnZpY2UuZ2V0RGF0YShcbiAgICAgICAgICBkYXRhU291cmNlTW9kaWZpZXIuY29sdW1ucyxcbiAgICAgICAgICBkYXRhU291cmNlTW9kaWZpZXIucGFnaW5hdGlvbixcbiAgICAgICAgICB0aGlzLmJhc2VRdWVyeSxcbiAgICAgICAgICB0aGlzLndpdGhDaGlsZHJlbixcbiAgICAgICAgICBkYXRhU291cmNlTW9kaWZpZXIuc2VhcmNoVGV4dFxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICBmaWx0ZXJlZFNpemUgPSBhd2FpdCBhbGVydE9uRXJyb3IoXG4gICAgICAgIHRoaXMuZGV2aWNlR3JpZFNlcnZpY2UuZ2V0Q291bnQoXG4gICAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLmNvbHVtbnMsXG4gICAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLnBhZ2luYXRpb24sXG4gICAgICAgICAgdGhpcy5iYXNlUXVlcnksXG4gICAgICAgICAgZGF0YVNvdXJjZU1vZGlmaWVyLnNlYXJjaFRleHRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHNpemUgPSBhd2FpdCBhbGVydE9uRXJyb3IodGhpcy5kZXZpY2VHcmlkU2VydmljZS5nZXRUb3RhbCh0aGlzLmJhc2VRdWVyeSkpO1xuXG4gICAgICBzZXJ2ZXJTaWRlRGF0YVJlc3VsdCA9IHtcbiAgICAgICAgcmVzLFxuICAgICAgICBkYXRhLFxuICAgICAgICBwYWdpbmcsXG4gICAgICAgIGZpbHRlcmVkU2l6ZSxcbiAgICAgICAgc2l6ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZS5lbWl0KGRhdGFTb3VyY2VNb2RpZmllci5jb2x1bW5zKTtcbiAgICB0aGlzLm9uRGV2aWNlUXVlcnlTdHJpbmdDaGFuZ2UuZW1pdChcbiAgICAgIHRoaXMuZGV2aWNlR3JpZFNlcnZpY2UuZ2V0RGV2aWNlUXVlcnlTdHJpbmcoZGF0YVNvdXJjZU1vZGlmaWVyLmNvbHVtbnMsIHRoaXMuYmFzZVF1ZXJ5KVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kYXRhQ2FsbGJhY2spIHtcbiAgICAgIHNlcnZlclNpZGVEYXRhUmVzdWx0ID0gdGhpcy5kYXRhQ2FsbGJhY2soc2VydmVyU2lkZURhdGFSZXN1bHQpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXJTaWRlRGF0YVJlc3VsdDtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZyhcbiAgICBjb2x1bW5OYW1lczogc3RyaW5nW10sXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlO1xuICAgICAgcGF5bG9hZD86IHsgZmlsdGVyaW5nTW9kaWZpZXI6IEZpbHRlcmluZ01vZGlmaWVyIH07XG4gICAgfVxuICApIHtcbiAgICBjb25zdCB7IHR5cGUgfSA9IGFjdGlvbjtcbiAgICBpZiAodHlwZSA9PT0gRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlcikge1xuICAgICAgdGhpcy5kYXRhR3JpZC5jbGVhckZpbHRlcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhR3JpZC51cGRhdGVGaWx0ZXJpbmcoY29sdW1uTmFtZXMsIGFjdGlvbik7XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LWRhdGEtZ3JpZFxuICBbdGl0bGVdPVwidGl0bGVcIlxuICBbbG9hZE1vcmVJdGVtc0xhYmVsXT1cImxvYWRNb3JlSXRlbXNMYWJlbFwiXG4gIFtsb2FkaW5nSXRlbXNMYWJlbF09XCJsb2FkaW5nSXRlbXNMYWJlbFwiXG4gIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcbiAgW2luZmluaXRlU2Nyb2xsXT1cImluZmluaXRlU2Nyb2xsXCJcbiAgW2FjdGlvbkNvbnRyb2xzXT1cImFjdGlvbkNvbnRyb2xzXCJcbiAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gIFtzaW5nbGVTZWxlY3Rpb25dPVwic2luZ2xlU2VsZWN0aW9uXCJcbiAgW2J1bGtBY3Rpb25Db250cm9sc109XCJidWxrQWN0aW9uQ29udHJvbHNcIlxuICBbc2VydmVyU2lkZURhdGFDYWxsYmFja109XCJzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrXCJcbiAgKGl0ZW1zU2VsZWN0KT1cIml0ZW1zU2VsZWN0LmVtaXQoJGV2ZW50KVwiXG4gIFtyZWZyZXNoXT1cInJlZnJlc2hcIlxuICBbc2hvd1NlYXJjaF09XCJzaG93U2VhcmNoICYmICFjaGlsZERldmljZUdyaWRcIlxuICBbaGVhZGVyQWN0aW9uQ29udHJvbHNdPVwiaGVhZGVyQWN0aW9uQ29udHJvbHNcIlxuICBbYWN0aXZlQ2xhc3NOYW1lXT1cImFjdGl2ZUNsYXNzTmFtZVwiXG4gIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gIGluaGVyaXRcbj5cbiAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgIFtpY29uXT1cInN0YXRzPy5zaXplID4gMCA/ICdzZWFyY2gnIDogJ2M4eS1kZXZpY2UtbWFuYWdlbWVudCdcIlxuICAgIFt0aXRsZV09XCJzdGF0cz8uc2l6ZSA+IDAgPyAobm9SZXN1bHRzTWVzc2FnZSB8IHRyYW5zbGF0ZSkgOiAobm9EYXRhTWVzc2FnZSB8IHRyYW5zbGF0ZSlcIlxuICAgIFtzdWJ0aXRsZV09XCJzdGF0cz8uc2l6ZSA+IDAgPyAobm9SZXN1bHRzU3VidGl0bGUgfCB0cmFuc2xhdGUpIDogbnVsbFwiXG4gICAgKmVtcHR5U3RhdGVDb250ZXh0PVwibGV0IHN0YXRzXCJcbiAgICBbaG9yaXpvbnRhbF09XCJzdGF0cz8uc2l6ZSA+IDBcIlxuICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrQnk6IHRyYWNrQnlOYW1lXCI+XG4gICAgPGM4eS1jb2x1bW4gW25hbWVdPVwiY29sdW1uLm5hbWVcIj48L2M4eS1jb2x1bW4+XG4gIDwvbmctY29udGFpbmVyPlxuPC9jOHktZGF0YS1ncmlkPlxuIl19