@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
215 lines • 32.2 kB
JavaScript
import { Injectable } from '@angular/core';
import { InventoryService, UserService } from '@c8y/client';
import { AlertService, DataGridService, gettext, ModalService, Status, UserPreferencesService } from '@c8y/ngx-components';
import { TranslateService } from '@ngx-translate/core';
import { AlarmsDeviceGridColumn } from './columns/alarms.device-grid-column';
import { ColumnUtilService } from './columns/column-util.service';
import { GroupDeviceGridColumn } from './columns/group.device-grid-column';
import { ImeiDeviceGridColumn } from './columns/imei.device-grid-column';
import { ModelDeviceGridColumn } from './columns/model.device-grid-column';
import { NameDeviceGridColumn } from './columns/name.device-grid-column';
import { RegistrationDateDeviceGridColumn } from './columns/registration-date.device-grid-column';
import { SerialNumberDeviceGridColumn } from './columns/serial-number.device-grid-column';
import { StatusDeviceGridColumn } from './columns/status.device-grid-column';
import { SystemIdDeviceGridColumn } from './columns/system-id.device-grid-column';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
import * as i2 from "@ngx-translate/core";
import * as i3 from "@c8y/ngx-components";
import * as i4 from "./columns/column-util.service";
export class DeviceGridService extends DataGridService {
constructor(inventoryService, userService, translateService, alertService, modal, columnUtilService, userPreferencesService) {
super(userPreferencesService);
this.inventoryService = inventoryService;
this.userService = userService;
this.translateService = translateService;
this.alertService = alertService;
this.modal = modal;
this.columnUtilService = columnUtilService;
this.userPreferencesService = userPreferencesService;
this.GRID_CONFIG_DEFAULT_STORAGE_KEY = 'device-grid-config';
}
getDefaultColumns() {
const defaultColumns = [
new StatusDeviceGridColumn(),
new NameDeviceGridColumn(),
new ModelDeviceGridColumn(),
new SerialNumberDeviceGridColumn(),
new GroupDeviceGridColumn(),
new RegistrationDateDeviceGridColumn(),
new SystemIdDeviceGridColumn(),
new ImeiDeviceGridColumn(),
new AlarmsDeviceGridColumn()
];
return defaultColumns;
}
getChildDeviceGridColumns() {
const childDeviceGridColumn = [
new StatusDeviceGridColumn(),
new NameDeviceGridColumn(),
new ModelDeviceGridColumn(),
new SerialNumberDeviceGridColumn(),
new RegistrationDateDeviceGridColumn(),
new SystemIdDeviceGridColumn(),
new ImeiDeviceGridColumn(),
new AlarmsDeviceGridColumn()
];
return childDeviceGridColumn;
}
getDefaultPagination() {
return {
pageSize: 25,
currentPage: 1
};
}
getInfiniteScrollPagination() {
return {
pageSize: 50,
currentPage: 1
};
}
getDefaultBulkActionControls() {
return [];
}
getDefaultHeaderActionControls() {
return [];
}
getProperName(device) {
return this.columnUtilService.getProperName(device);
}
getModel(device) {
return this.columnUtilService.getModel(device);
}
getSerialNumber(device) {
return this.columnUtilService.getSerialNumber(device);
}
getParentsNames(device, featuredParentId) {
return this.columnUtilService.getParentsNames(device, featuredParentId);
}
getHref(groupOrDevice, prefix = '#/') {
return this.columnUtilService.getHref(groupOrDevice, prefix);
}
getAlarmsHref(device) {
return this.columnUtilService.getAlarmsHref(device);
}
async delete(device) {
try {
const deviceWithChildren = await (await this.inventoryService.detail(device, { withChildren: true })).data;
const hasChildDevices = deviceWithChildren.childDevices?.references?.length > 0;
const hasChildAdditions = deviceWithChildren.childAdditions?.references?.length > 0;
const hasChildAssets = deviceWithChildren.childAssets?.references?.length > 0;
const showDeleteChildren = () => hasChildAdditions || hasChildDevices || hasChildAssets;
const modalResult = await this.modal.confirm(gettext('Delete device'), this.translateService.instant(gettext(`You are about to delete device "{{ name }}". Do you want to proceed?`), device), Status.DANGER, { ok: gettext('Delete'), cancel: gettext('Cancel') }, {
cascade: {
text: gettext('Also delete child hierarchy of this device.'),
checked: showDeleteChildren(),
showIf: showDeleteChildren,
disabledByKey: 'withDeviceUser'
},
withDeviceUser: {
text: this.translateService.instant(gettext('Also delete associated device owner "{{ owner }}".'), device),
checked: false,
showIf: () => {
const isRootDevice = device.c8y_IsDevice;
const hasDeviceUserAsOwner = device.owner &&
this.userService.isDeviceUser({ id: device.owner });
return Boolean(isRootDevice && hasDeviceUserAsOwner);
},
disabledByKey: 'cascade'
}
});
await this.inventoryService.delete(device, modalResult.confirmOptions);
this.alertService.success(gettext('Device deleted.'));
return Promise.resolve();
}
catch (ex) {
// only if not cancel from modal
if (ex) {
this.alertService.addServerFailure(ex);
}
return Promise.reject();
}
}
async getData(columns, pagination, query = {}, withChildren = false, text = null) {
const filters = {
...this.getDevicesFilters(columns, pagination, query, false, text),
withGroups: true,
withChildren,
withTotalElements: true
};
return this.inventoryService.list(filters);
}
async getChildDeviceData(columns, pagination, query = {}, withChildren = false, id) {
const childDeviceFilters = true;
const filters = {
...this.getDevicesFilters(columns, pagination, query, childDeviceFilters),
withGroups: true,
withChildren
};
return this.inventoryService.childDevicesList(id, filters);
}
async getCount(columns, pagination, query = {}, text = null) {
const filters = {
...this.getDevicesFilters(columns, pagination, query, false, text),
withTotalElements: true
};
return (await this.inventoryService.list(filters)).paging.totalElements;
}
async getCountChildDevices(columns, pagination, query = {}, id) {
const childDeviceFilters = true;
const filters = {
...this.getDevicesFilters(columns, pagination, query, childDeviceFilters),
withTotalElements: true
};
return (await this.inventoryService.childDevicesList(id, filters)).paging.totalElements;
}
async getTotalChildDevices(query = {}, id) {
const filters = {
q: this.queriesUtil.buildQuery(query),
withTotalElements: true
};
return (await this.inventoryService.childDevicesList(id, filters)).paging.totalElements;
}
async getTotal(query = {}) {
const filters = {
q: this.queriesUtil.buildQuery(query),
withTotalElements: true
};
return (await this.inventoryService.list(filters)).paging.totalElements;
}
getDeviceQueryString(columns, query) {
let fullQuery = this.getQueryObj(columns);
fullQuery = this.queriesUtil.addAndFilter(fullQuery, query);
return this.queriesUtil.buildQuery(fullQuery);
}
clearConfig(key = this.GRID_CONFIG_DEFAULT_STORAGE_KEY) {
super.clearConfig(key);
}
getConfig$(key = this.GRID_CONFIG_DEFAULT_STORAGE_KEY) {
return super.getConfig$(key);
}
saveConfig$(config, key = this.GRID_CONFIG_DEFAULT_STORAGE_KEY) {
return super.saveConfig$(config, key);
}
getDevicesFilters(columns, pagination, query, childDeviceFilters, text) {
return {
...(childDeviceFilters
? { query: this.getDeviceQueryString(columns, query) }
: { q: this.getDeviceQueryString(columns, query) }),
...(text && { text }),
pageSize: pagination.pageSize,
currentPage: pagination.currentPage,
withChildren: false,
withTotalPages: true
};
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceGridService, deps: [{ token: i1.InventoryService }, { token: i1.UserService }, { token: i2.TranslateService }, { token: i3.AlertService }, { token: i3.ModalService }, { token: i4.ColumnUtilService }, { token: i3.UserPreferencesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceGridService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceGridService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.InventoryService }, { type: i1.UserService }, { type: i2.TranslateService }, { type: i3.AlertService }, { type: i3.ModalService }, { type: i4.ColumnUtilService }, { type: i3.UserPreferencesService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWdyaWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldmljZS1ncmlkL2RldmljZS1ncmlkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWtCLGdCQUFnQixFQUFTLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuRixPQUFPLEVBQ0wsWUFBWSxFQUdaLGVBQWUsRUFDZixPQUFPLEVBR1AsWUFBWSxFQUVaLE1BQU0sRUFDTixzQkFBc0IsRUFDdkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNsRyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7Ozs7O0FBS2xGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBR3BELFlBQ1ksZ0JBQWtDLEVBQ2xDLFdBQXdCLEVBQ3hC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O2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlLCBJVXNlciwgVXNlclNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIERhdGFHcmlkU2VydmljZSxcbiAgZ2V0dGV4dCxcbiAgR3JpZENvbmZpZyxcbiAgSGVhZGVyQWN0aW9uQ29udHJvbCxcbiAgTW9kYWxTZXJ2aWNlLFxuICBQYWdpbmF0aW9uLFxuICBTdGF0dXMsXG4gIFVzZXJQcmVmZXJlbmNlc1NlcnZpY2Vcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbGFybXNEZXZpY2VHcmlkQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW5zL2FsYXJtcy5kZXZpY2UtZ3JpZC1jb2x1bW4nO1xuaW1wb3J0IHsgQ29sdW1uVXRpbFNlcnZpY2UgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLXV0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBHcm91cERldmljZUdyaWRDb2x1bW4gfSBmcm9tICcuL2NvbHVtbnMvZ3JvdXAuZGV2aWNlLWdyaWQtY29sdW1uJztcbmltcG9ydCB7IEltZWlEZXZpY2VHcmlkQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW5zL2ltZWkuZGV2aWNlLWdyaWQtY29sdW1uJztcbmltcG9ydCB7IE1vZGVsRGV2aWNlR3JpZENvbHVtbiB9IGZyb20gJy4vY29sdW1ucy9tb2RlbC5kZXZpY2UtZ3JpZC1jb2x1bW4nO1xuaW1wb3J0IHsgTmFtZURldmljZUdyaWRDb2x1bW4gfSBmcm9tICcuL2NvbHVtbnMvbmFtZS5kZXZpY2UtZ3JpZC1jb2x1bW4nO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uRGF0ZURldmljZUdyaWRDb2x1bW4gfSBmcm9tICcuL2NvbHVtbnMvcmVnaXN0cmF0aW9uLWRhdGUuZGV2aWNlLWdyaWQtY29sdW1uJztcbmltcG9ydCB7IFNlcmlhbE51bWJlckRldmljZUdyaWRDb2x1bW4gfSBmcm9tICcuL2NvbHVtbnMvc2VyaWFsLW51bWJlci5kZXZpY2UtZ3JpZC1jb2x1bW4nO1xuaW1wb3J0IHsgU3RhdHVzRGV2aWNlR3JpZENvbHVtbiB9IGZyb20gJy4vY29sdW1ucy9zdGF0dXMuZGV2aWNlLWdyaWQtY29sdW1uJztcbmltcG9ydCB7IFN5c3RlbUlkRGV2aWNlR3JpZENvbHVtbiB9IGZyb20gJy4vY29sdW1ucy9zeXN0ZW0taWQuZGV2aWNlLWdyaWQtY29sdW1uJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRGV2aWNlR3JpZFNlcnZpY2UgZXh0ZW5kcyBEYXRhR3JpZFNlcnZpY2Uge1xuICBwcm90ZWN0ZWQgR1JJRF9DT05GSUdfREVGQVVMVF9TVE9SQUdFX0tFWSA9ICdkZXZpY2UtZ3JpZC1jb25maWcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbnZlbnRvcnlTZXJ2aWNlOiBJbnZlbnRvcnlTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBtb2RhbDogTW9kYWxTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjb2x1bW5VdGlsU2VydmljZTogQ29sdW1uVXRpbFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIodXNlclByZWZlcmVuY2VzU2VydmljZSk7XG4gIH1cblxuICBnZXREZWZhdWx0Q29sdW1ucygpOiBDb2x1bW5bXSB7XG4gICAgY29uc3QgZGVmYXVsdENvbHVtbnMgPSBbXG4gICAgICBuZXcgU3RhdHVzRGV2aWNlR3JpZENvbHVtbigpLFxuICAgICAgbmV3IE5hbWVEZXZpY2VHcmlkQ29sdW1uKCksXG4gICAgICBuZXcgTW9kZWxEZXZpY2VHcmlkQ29sdW1uKCksXG4gICAgICBuZXcgU2VyaWFsTnVtYmVyRGV2aWNlR3JpZENvbHVtbigpLFxuICAgICAgbmV3IEdyb3VwRGV2aWNlR3JpZENvbHVtbigpLFxuICAgICAgbmV3IFJlZ2lzdHJhdGlvbkRhdGVEZXZpY2VHcmlkQ29sdW1uKCksXG4gICAgICBuZXcgU3lzdGVtSWREZXZpY2VHcmlkQ29sdW1uKCksXG4gICAgICBuZXcgSW1laURldmljZUdyaWRDb2x1bW4oKSxcbiAgICAgIG5ldyBBbGFybXNEZXZpY2VHcmlkQ29sdW1uKClcbiAgICBdO1xuXG4gICAgcmV0dXJuIGRlZmF1bHRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0Q2hpbGREZXZpY2VHcmlkQ29sdW1ucygpOiBDb2x1bW5bXSB7XG4gICAgY29uc3QgY2hpbGREZXZpY2VHcmlkQ29sdW1uID0gW1xuICAgICAgbmV3IFN0YXR1c0RldmljZUdyaWRDb2x1bW4oKSxcbiAgICAgIG5ldyBOYW1lRGV2aWNlR3JpZENvbHVtbigpLFxuICAgICAgbmV3IE1vZGVsRGV2aWNlR3JpZENvbHVtbigpLFxuICAgICAgbmV3IFNlcmlhbE51bWJlckRldmljZUdyaWRDb2x1bW4oKSxcbiAgICAgIG5ldyBSZWdpc3RyYXRpb25EYXRlRGV2aWNlR3JpZENvbHVtbigpLFxuICAgICAgbmV3IFN5c3RlbUlkRGV2aWNlR3JpZENvbHVtbigpLFxuICAgICAgbmV3IEltZWlEZXZpY2VHcmlkQ29sdW1uKCksXG4gICAgICBuZXcgQWxhcm1zRGV2aWNlR3JpZENvbHVtbigpXG4gICAgXTtcblxuICAgIHJldHVybiBjaGlsZERldmljZUdyaWRDb2x1bW47XG4gIH1cblxuICBnZXREZWZhdWx0UGFnaW5hdGlvbigpOiBQYWdpbmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZVNpemU6IDI1LFxuICAgICAgY3VycmVudFBhZ2U6IDFcbiAgICB9O1xuICB9XG5cbiAgZ2V0SW5maW5pdGVTY3JvbGxQYWdpbmF0aW9uKCk6IFBhZ2luYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlU2l6ZTogNTAsXG4gICAgICBjdXJyZW50UGFnZTogMVxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0QnVsa0FjdGlvbkNvbnRyb2xzKCk6IEJ1bGtBY3Rpb25Db250cm9sW10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldERlZmF1bHRIZWFkZXJBY3Rpb25Db250cm9scygpOiBIZWFkZXJBY3Rpb25Db250cm9sW10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldFByb3Blck5hbWUoZGV2aWNlOiBJTWFuYWdlZE9iamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uVXRpbFNlcnZpY2UuZ2V0UHJvcGVyTmFtZShkZXZpY2UpO1xuICB9XG5cbiAgZ2V0TW9kZWwoZGV2aWNlOiBJTWFuYWdlZE9iamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uVXRpbFNlcnZpY2UuZ2V0TW9kZWwoZGV2aWNlKTtcbiAgfVxuXG4gIGdldFNlcmlhbE51bWJlcihkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5VdGlsU2VydmljZS5nZXRTZXJpYWxOdW1iZXIoZGV2aWNlKTtcbiAgfVxuXG4gIGdldFBhcmVudHNOYW1lcyhkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBmZWF0dXJlZFBhcmVudElkPzogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5VdGlsU2VydmljZS5nZXRQYXJlbnRzTmFtZXMoZGV2aWNlLCBmZWF0dXJlZFBhcmVudElkKTtcbiAgfVxuXG4gIGdldEhyZWYoZ3JvdXBPckRldmljZTogSU1hbmFnZWRPYmplY3QsIHByZWZpeCA9ICcjLycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblV0aWxTZXJ2aWNlLmdldEhyZWYoZ3JvdXBPckRldmljZSwgcHJlZml4KTtcbiAgfVxuXG4gIGdldEFsYXJtc0hyZWYoZGV2aWNlOiBJTWFuYWdlZE9iamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uVXRpbFNlcnZpY2UuZ2V0QWxhcm1zSHJlZihkZXZpY2UpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGRldmljZTogSU1hbmFnZWRPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGV2aWNlV2l0aENoaWxkcmVuID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGRldmljZSwgeyB3aXRoQ2hpbGRyZW46IHRydWUgfSlcbiAgICAgICkuZGF0YTtcbiAgICAgIGNvbnN0IGhhc0NoaWxkRGV2aWNlcyA9IGRldmljZVdpdGhDaGlsZHJlbi5jaGlsZERldmljZXM/LnJlZmVyZW5jZXM/Lmxlbmd0aCA+IDA7XG4gICAgICBjb25zdCBoYXNDaGlsZEFkZGl0aW9ucyA9IGRldmljZVdpdGhDaGlsZHJlbi5jaGlsZEFkZGl0aW9ucz8ucmVmZXJlbmNlcz8ubGVuZ3RoID4gMDtcbiAgICAgIGNvbnN0IGhhc0NoaWxkQXNzZXRzID0gZGV2aWNlV2l0aENoaWxkcmVuLmNoaWxkQXNzZXRzPy5yZWZlcmVuY2VzPy5sZW5ndGggPiAwO1xuICAgICAgY29uc3Qgc2hvd0RlbGV0ZUNoaWxkcmVuID0gKCkgPT4gaGFzQ2hpbGRBZGRpdGlvbnMgfHwgaGFzQ2hpbGREZXZpY2VzIHx8IGhhc0NoaWxkQXNzZXRzO1xuICAgICAgY29uc3QgbW9kYWxSZXN1bHQgPSBhd2FpdCB0aGlzLm1vZGFsLmNvbmZpcm0oXG4gICAgICAgIGdldHRleHQoJ0RlbGV0ZSBkZXZpY2UnKSxcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgZ2V0dGV4dChgWW91IGFyZSBhYm91dCB0byBkZWxldGUgZGV2aWNlIFwie3sgbmFtZSB9fVwiLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkP2ApLFxuICAgICAgICAgIGRldmljZVxuICAgICAgICApLFxuICAgICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAgICB7IG9rOiBnZXR0ZXh0KCdEZWxldGUnKSwgY2FuY2VsOiBnZXR0ZXh0KCdDYW5jZWwnKSB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2FzY2FkZToge1xuICAgICAgICAgICAgdGV4dDogZ2V0dGV4dCgnQWxzbyBkZWxldGUgY2hpbGQgaGllcmFyY2h5IG9mIHRoaXMgZGV2aWNlLicpLFxuICAgICAgICAgICAgY2hlY2tlZDogc2hvd0RlbGV0ZUNoaWxkcmVuKCksXG4gICAgICAgICAgICBzaG93SWY6IHNob3dEZWxldGVDaGlsZHJlbixcbiAgICAgICAgICAgIGRpc2FibGVkQnlLZXk6ICd3aXRoRGV2aWNlVXNlcidcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdpdGhEZXZpY2VVc2VyOiB7XG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgZ2V0dGV4dCgnQWxzbyBkZWxldGUgYXNzb2NpYXRlZCBkZXZpY2Ugb3duZXIgXCJ7eyBvd25lciB9fVwiLicpLFxuICAgICAgICAgICAgICBkZXZpY2VcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dJZjogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpc1Jvb3REZXZpY2UgPSBkZXZpY2UuYzh5X0lzRGV2aWNlO1xuICAgICAgICAgICAgICBjb25zdCBoYXNEZXZpY2VVc2VyQXNPd25lciA9XG4gICAgICAgICAgICAgICAgZGV2aWNlLm93bmVyICYmXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5pc0RldmljZVVzZXIoeyBpZDogZGV2aWNlLm93bmVyIH0gYXMgdW5rbm93biBhcyBJVXNlcik7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oaXNSb290RGV2aWNlICYmIGhhc0RldmljZVVzZXJBc093bmVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNhYmxlZEJ5S2V5OiAnY2FzY2FkZSdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGVsZXRlKFxuICAgICAgICBkZXZpY2UsXG4gICAgICAgIChtb2RhbFJlc3VsdCBhcyB7IGNvbmZpcm1PcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0pLmNvbmZpcm1PcHRpb25zXG4gICAgICApO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdEZXZpY2UgZGVsZXRlZC4nKSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIG9ubHkgaWYgbm90IGNhbmNlbCBmcm9tIG1vZGFsXG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXREYXRhKFxuICAgIGNvbHVtbnM6IENvbHVtbltdLFxuICAgIHBhZ2luYXRpb246IFBhZ2luYXRpb24sXG4gICAgcXVlcnk6IGFueSA9IHt9LFxuICAgIHdpdGhDaGlsZHJlbiA9IGZhbHNlLFxuICAgIHRleHQgPSBudWxsXG4gICkge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICAuLi50aGlzLmdldERldmljZXNGaWx0ZXJzKGNvbHVtbnMsIHBhZ2luYXRpb24sIHF1ZXJ5LCBmYWxzZSwgdGV4dCksXG4gICAgICB3aXRoR3JvdXBzOiB0cnVlLFxuICAgICAgd2l0aENoaWxkcmVuLFxuICAgICAgd2l0aFRvdGFsRWxlbWVudHM6IHRydWVcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmludmVudG9yeVNlcnZpY2UubGlzdChmaWx0ZXJzKTtcbiAgfVxuXG4gIGFzeW5jIGdldENoaWxkRGV2aWNlRGF0YShcbiAgICBjb2x1bW5zOiBDb2x1bW5bXSxcbiAgICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uLFxuICAgIHF1ZXJ5OiBhbnkgPSB7fSxcbiAgICB3aXRoQ2hpbGRyZW4gPSBmYWxzZSxcbiAgICBpZDogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IGNoaWxkRGV2aWNlRmlsdGVycyA9IHRydWU7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0RGV2aWNlc0ZpbHRlcnMoY29sdW1ucywgcGFnaW5hdGlvbiwgcXVlcnksIGNoaWxkRGV2aWNlRmlsdGVycyksXG4gICAgICB3aXRoR3JvdXBzOiB0cnVlLFxuICAgICAgd2l0aENoaWxkcmVuXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmNoaWxkRGV2aWNlc0xpc3QoaWQsIGZpbHRlcnMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q291bnQoY29sdW1uczogQ29sdW1uW10sIHBhZ2luYXRpb246IFBhZ2luYXRpb24sIHF1ZXJ5OiBhbnkgPSB7fSwgdGV4dDogc3RyaW5nID0gbnVsbCkge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICAuLi50aGlzLmdldERldmljZXNGaWx0ZXJzKGNvbHVtbnMsIHBhZ2luYXRpb24sIHF1ZXJ5LCBmYWxzZSwgdGV4dCksXG4gICAgICB3aXRoVG90YWxFbGVtZW50czogdHJ1ZVxuICAgIH07XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UubGlzdChmaWx0ZXJzKSkucGFnaW5nLnRvdGFsRWxlbWVudHM7XG4gIH1cblxuICBhc3luYyBnZXRDb3VudENoaWxkRGV2aWNlcyhcbiAgICBjb2x1bW5zOiBDb2x1bW5bXSxcbiAgICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uLFxuICAgIHF1ZXJ5OiBhbnkgPSB7fSxcbiAgICBpZDogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IGNoaWxkRGV2aWNlRmlsdGVycyA9IHRydWU7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0RGV2aWNlc0ZpbHRlcnMoY29sdW1ucywgcGFnaW5hdGlvbiwgcXVlcnksIGNoaWxkRGV2aWNlRmlsdGVycyksXG4gICAgICB3aXRoVG90YWxFbGVtZW50czogdHJ1ZVxuICAgIH07XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuY2hpbGREZXZpY2VzTGlzdChpZCwgZmlsdGVycykpLnBhZ2luZy50b3RhbEVsZW1lbnRzO1xuICB9XG5cbiAgYXN5bmMgZ2V0VG90YWxDaGlsZERldmljZXMocXVlcnk6IGFueSA9IHt9LCBpZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgcTogdGhpcy5xdWVyaWVzVXRpbC5idWlsZFF1ZXJ5KHF1ZXJ5KSxcbiAgICAgIHdpdGhUb3RhbEVsZW1lbnRzOiB0cnVlXG4gICAgfTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS5jaGlsZERldmljZXNMaXN0KGlkLCBmaWx0ZXJzKSkucGFnaW5nLnRvdGFsRWxlbWVudHM7XG4gIH1cblxuICBhc3luYyBnZXRUb3RhbChxdWVyeTogYW55ID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICBxOiB0aGlzLnF1ZXJpZXNVdGlsLmJ1aWxkUXVlcnkocXVlcnkpLFxuICAgICAgd2l0aFRvdGFsRWxlbWVudHM6IHRydWVcbiAgICB9O1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmxpc3QoZmlsdGVycykpLnBhZ2luZy50b3RhbEVsZW1lbnRzO1xuICB9XG5cbiAgZ2V0RGV2aWNlUXVlcnlTdHJpbmcoY29sdW1uczogQ29sdW1uW10sIHF1ZXJ5OiBhbnkpOiBzdHJpbmcge1xuICAgIGxldCBmdWxsUXVlcnkgPSB0aGlzLmdldFF1ZXJ5T2JqKGNvbHVtbnMpO1xuICAgIGZ1bGxRdWVyeSA9IHRoaXMucXVlcmllc1V0aWwuYWRkQW5kRmlsdGVyKGZ1bGxRdWVyeSwgcXVlcnkpO1xuICAgIHJldHVybiB0aGlzLnF1ZXJpZXNVdGlsLmJ1aWxkUXVlcnkoZnVsbFF1ZXJ5KTtcbiAgfVxuXG4gIGNsZWFyQ29uZmlnKGtleTogc3RyaW5nID0gdGhpcy5HUklEX0NPTkZJR19ERUZBVUxUX1NUT1JBR0VfS0VZKSB7XG4gICAgc3VwZXIuY2xlYXJDb25maWcoa2V5KTtcbiAgfVxuXG4gIGdldENvbmZpZyQoa2V5OiBzdHJpbmcgPSB0aGlzLkdSSURfQ09ORklHX0RFRkFVTFRfU1RPUkFHRV9LRVkpOiBPYnNlcnZhYmxlPEdyaWRDb25maWc+IHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0Q29uZmlnJChrZXkpO1xuICB9XG5cbiAgc2F2ZUNvbmZpZyQoXG4gICAgY29uZmlnOiBHcmlkQ29uZmlnLFxuICAgIGtleTogc3RyaW5nID0gdGhpcy5HUklEX0NPTkZJR19ERUZBVUxUX1NUT1JBR0VfS0VZXG4gICk6IE9ic2VydmFibGU8R3JpZENvbmZpZz4ge1xuICAgIHJldHVybiBzdXBlci5zYXZlQ29uZmlnJChjb25maWcsIGtleSk7XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZXNGaWx0ZXJzKFxuICAgIGNvbHVtbnM6IENvbHVtbltdLFxuICAgIHBhZ2luYXRpb246IFBhZ2luYXRpb24sXG4gICAgcXVlcnk6IGFueSxcbiAgICBjaGlsZERldmljZUZpbHRlcnM/OiBib29sZWFuLFxuICAgIHRleHQ/OiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihjaGlsZERldmljZUZpbHRlcnNcbiAgICAgICAgPyB7IHF1ZXJ5OiB0aGlzLmdldERldmljZVF1ZXJ5U3RyaW5nKGNvbHVtbnMsIHF1ZXJ5KSB9XG4gICAgICAgIDogeyBxOiB0aGlzLmdldERldmljZVF1ZXJ5U3RyaW5nKGNvbHVtbnMsIHF1ZXJ5KSB9KSxcbiAgICAgIC4uLih0ZXh0ICYmIHsgdGV4dCB9KSxcbiAgICAgIHBhZ2VTaXplOiBwYWdpbmF0aW9uLnBhZ2VTaXplLFxuICAgICAgY3VycmVudFBhZ2U6IHBhZ2luYXRpb24uY3VycmVudFBhZ2UsXG4gICAgICB3aXRoQ2hpbGRyZW46IGZhbHNlLFxuICAgICAgd2l0aFRvdGFsUGFnZXM6IHRydWVcbiAgICB9O1xuICB9XG59XG4iXX0=