@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
123 lines • 19.7 kB
JavaScript
import { Injectable } from '@angular/core';
import { InventoryService, FetchClient, IdentityService } from '@c8y/client';
import { get, orderBy } from 'lodash-es';
import { MultipleLnsConnectorService } from './multiple-lns-connectors';
import { ConnectionType } from './multiple-lns-connectors/multiple-lns-connector.model';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
import * as i2 from "./multiple-lns-connectors";
export class LpwanSetDeviceProtocolService {
constructor(inventoryService, client, identityService, lnsService) {
this.inventoryService = inventoryService;
this.client = client;
this.identityService = identityService;
this.lnsService = lnsService;
this.supportedDevicesCfgs = [
{
name: 'actility',
match: device => get(device, 'c8y_LpwanDevice.lpwanDeviceType') === 'Lora' &&
get(device, 'c8y_LpwanDevice.serviceProvider') === 'Actility',
protocolTypes: ['c8y_ActilityDeviceType', 'c8y_LoraDeviceType', 'c8y_LpwanDeviceType'],
externalIdTypes: ['c8y_LoriotEUI', 'c8y_Serial'],
connectionType: ConnectionType.ACTILITY
},
{
name: 'loriot',
match: device => get(device, 'c8y_LpwanDevice.lpwanDeviceType') === 'Lora' &&
get(device, 'c8y_LpwanDevice.serviceProvider') === 'Loriot',
protocolTypes: ['c8y_LoraDeviceType', 'c8y_LpwanDeviceType'],
externalIdTypes: ['c8y_LoriotEUI', 'c8y_Serial'],
connectionType: ConnectionType.LORIOT
},
{
name: 'sigfox',
match: device => get(device, 'c8y_LpwanDevice.serviceProvider') === 'Sigfox',
protocolTypes: ['c8y_SigfoxDeviceType', 'c8y_LpwanDeviceType'],
externalIdTypes: ['com.sigfox.deviceId'],
connectionType: ConnectionType.SIGFOX
}
];
this.header = { 'Content-Type': 'application/json' };
}
async refreshCache(device) {
const externalId = await this.getExternalId(device);
if (externalId) {
const url = `${this.getMicroserviceUrl(device)}/refreshCache/${externalId}`;
const options = {
method: 'POST',
headers: this.header,
body: JSON.stringify({})
};
return this.client.fetch(url, options);
}
}
getMicroserviceUrl(device) {
const { serviceProvider } = device.c8y_LpwanDevice;
let serviceName = serviceProvider.toLowerCase();
if (serviceProvider === 'Sigfox') {
serviceName = 'sigfox-agent';
}
return `/service/${serviceName}`;
}
isSupportedDevice(device) {
return this.supportedDevicesCfgs.some(({ match }) => match(device));
}
async getCurrentProtocol(device) {
const lpwanDevice = device.c8y_LpwanDevice;
let protocolId;
if (lpwanDevice.typeExternalId) {
const externalId = (await this.identityService.detail(lpwanDevice.typeExternalId)).data;
protocolId = externalId.managedObject.id;
}
if (!protocolId && lpwanDevice.type) {
protocolId = lpwanDevice.type.split('/')[2];
}
if (!protocolId) {
return null;
}
return (await this.inventoryService.detail(protocolId)).data;
}
async applyProtocol(device, selectedProtocol) {
const [protocolExternalId] = (await this.identityService.list(selectedProtocol.id)).data;
const { externalId, type } = protocolExternalId;
device.c8y_LpwanDevice.typeExternalId = { externalId, type };
device.c8y_LpwanDevice.type = 'inventory/managedObjects/' + selectedProtocol.id;
device.type = selectedProtocol.name;
return this.inventoryService.update(device);
}
async getAvailableProtocols(device) {
const query = {
__filter: {
type: { __in: this.getProtocolTypesMatchingDevice(device) }
},
__orderby: [{ name: 1 }]
};
return this.inventoryService.listQuery(query, { withTotalPages: true, pageSize: 5 });
}
async getAvailableConnections(device) {
let list;
const matchingCfg = this.supportedDevicesCfgs.find(({ match }) => match(device));
const response = await this.lnsService.list(matchingCfg.connectionType);
if (response && response.status === 200) {
list = await response.json();
list = orderBy(list, ['name'], ['asc']);
return { res: response, data: list };
}
}
getProtocolTypesMatchingDevice(device) {
const matchingCfg = this.supportedDevicesCfgs.find(({ match }) => match(device));
return matchingCfg ? matchingCfg.protocolTypes : [];
}
async getExternalId(device) {
const matchingCfg = this.supportedDevicesCfgs.find(({ match }) => match(device));
const externalIds = (await this.identityService.list(device.id)).data;
const externalId = externalIds.find(({ type }) => matchingCfg.externalIdTypes.includes(type));
return externalId ? externalId.externalId : null;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LpwanSetDeviceProtocolService, deps: [{ token: i1.InventoryService }, { token: i1.FetchClient }, { token: i1.IdentityService }, { token: i2.MultipleLnsConnectorService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LpwanSetDeviceProtocolService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LpwanSetDeviceProtocolService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.InventoryService }, { type: i1.FetchClient }, { type: i1.IdentityService }, { type: i2.MultipleLnsConnectorService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHB3YW4tc2V0LWRldmljZS1wcm90b2NvbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvdG9jb2wtbHB3YW4vbHB3YW4tc2V0LWRldmljZS1wcm90b2NvbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUVoQixXQUFXLEVBRVgsZUFBZSxFQUNoQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RSxPQUFPLEVBRUwsY0FBYyxFQUVmLE1BQU0sd0RBQXdELENBQUM7Ozs7QUFHaEUsTUFBTSxPQUFPLDZCQUE2QjtJQStCeEMsWUFDVSxnQkFBa0MsRUFDbEMsTUFBbUIsRUFDbkIsZUFBZ0MsRUFDaEMsVUFBdUM7UUFIdkMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ25CLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxlQUFVLEdBQVYsVUFBVSxDQUE2QjtRQWxDakQseUJBQW9CLEdBQUc7WUFDckI7Z0JBQ0UsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxDQUNkLEdBQUcsQ0FBQyxNQUFNLEVBQUUsaUNBQWlDLENBQUMsS0FBSyxNQUFNO29CQUN6RCxHQUFHLENBQUMsTUFBTSxFQUFFLGlDQUFpQyxDQUFDLEtBQUssVUFBVTtnQkFDL0QsYUFBYSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLENBQUM7Z0JBQ3RGLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUM7Z0JBQ2hELGNBQWMsRUFB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RSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUYsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNuRCxDQUFDOytHQWhJVSw2QkFBNkI7bUhBQTdCLDZCQUE2Qjs7NEZBQTdCLDZCQUE2QjtrQkFEekMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJbnZlbnRvcnlTZXJ2aWNlLFxuICBJUmVzdWx0TGlzdCxcbiAgRmV0Y2hDbGllbnQsXG4gIElGZXRjaE9wdGlvbnMsXG4gIElkZW50aXR5U2VydmljZVxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBnZXQsIG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgTXVsdGlwbGVMbnNDb25uZWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi9tdWx0aXBsZS1sbnMtY29ubmVjdG9ycyc7XG5pbXBvcnQge1xuICBBY3RpbGl0eUNvbm5lY3Rpb24sXG4gIENvbm5lY3Rpb25UeXBlLFxuICBTaWdmb3hDb25uZWN0aW9uXG59IGZyb20gJy4vbXVsdGlwbGUtbG5zLWNvbm5lY3RvcnMvbXVsdGlwbGUtbG5zLWNvbm5lY3Rvci5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMcHdhblNldERldmljZVByb3RvY29sU2VydmljZSB7XG4gIHN1cHBvcnRlZERldmljZXNDZmdzID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdhY3RpbGl0eScsXG4gICAgICBtYXRjaDogZGV2aWNlID0+XG4gICAgICAgIGdldChkZXZpY2UsICdjOHlfTHB3YW5EZXZpY2UubHB3YW5EZXZpY2VUeXBlJykgPT09ICdMb3JhJyAmJlxuICAgICAgICBnZXQoZGV2aWNlLCAnYzh5X0xwd2FuRGV2aWNlLnNlcnZpY2VQcm92aWRlcicpID09PSAnQWN0aWxpdHknLFxuICAgICAgcHJvdG9jb2xUeXBlczogWydjOHlfQWN0aWxpdHlEZXZpY2VUeXBlJywgJ2M4eV9Mb3JhRGV2aWNlVHlwZScsICdjOHlfTHB3YW5EZXZpY2VUeXBlJ10sXG4gICAgICBleHRlcm5hbElkVHlwZXM6IFsnYzh5X0xvcmlvdEVVSScsICdjOHlfU2VyaWFsJ10sXG4gICAgICBjb25uZWN0aW9uVHlwZTogQ29ubmVjdGlvblR5cGUuQUNUSUxJVFlcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdsb3Jpb3QnLFxuICAgICAgbWF0Y2g6IGRldmljZSA9PlxuICAgICAgICBnZXQoZGV2aWNlLCAnYzh5X0xwd2FuRGV2aWNlLmxwd2FuRGV2aWNlVHlwZScpID09PSAnTG9yYScgJiZcbiAgICAgICAgZ2V0KGRldmljZSwgJ2M4eV9McHdhbkRldmljZS5zZXJ2aWNlUHJvdmlkZXInKSA9PT0gJ0xvcmlvdCcsXG4gICAgICBwcm90b2NvbFR5cGVzOiBbJ2M4eV9Mb3JhRGV2aWNlVHlwZScsICdjOHlfTHB3YW5EZXZpY2VUeXBlJ10sXG4gICAgICBleHRlcm5hbElkVHlwZXM6IFsnYzh5X0xvcmlvdEVVSScsICdjOHlfU2VyaWFsJ10sXG4gICAgICBjb25uZWN0aW9uVHlwZTogQ29ubmVjdGlvblR5cGUuTE9SSU9UXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnc2lnZm94JyxcbiAgICAgIG1hdGNoOiBkZXZpY2UgPT4gZ2V0KGRldmljZSwgJ2M4eV9McHdhbkRldmljZS5zZXJ2aWNlUHJvdmlkZXInKSA9PT0gJ1NpZ2ZveCcsXG4gICAgICBwcm90b2NvbFR5cGVzOiBbJ2M4eV9TaWdmb3hEZXZpY2VUeXBlJywgJ2M4eV9McHdhbkRldmljZVR5cGUnXSxcbiAgICAgIGV4dGVybmFsSWRUeXBlczogWydjb20uc2lnZm94LmRldmljZUlkJ10sXG4gICAgICBjb25uZWN0aW9uVHlwZTogQ29ubmVjdGlvblR5cGUuU0lHRk9YXG4gICAgfVxuICBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhZGVyOiBhbnkgPSB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjbGllbnQ6IEZldGNoQ2xpZW50LFxuICAgIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlOiBJZGVudGl0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsbnNTZXJ2aWNlOiBNdWx0aXBsZUxuc0Nvbm5lY3RvclNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIHJlZnJlc2hDYWNoZShkZXZpY2UpIHtcbiAgICBjb25zdCBleHRlcm5hbElkID0gYXdhaXQgdGhpcy5nZXRFeHRlcm5hbElkKGRldmljZSk7XG4gICAgaWYgKGV4dGVybmFsSWQpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0TWljcm9zZXJ2aWNlVXJsKGRldmljZSl9L3JlZnJlc2hDYWNoZS8ke2V4dGVybmFsSWR9YDtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IElGZXRjaE9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcixcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0TWljcm9zZXJ2aWNlVXJsKGRldmljZSkge1xuICAgIGNvbnN0IHsgc2VydmljZVByb3ZpZGVyIH0gPSBkZXZpY2UuYzh5X0xwd2FuRGV2aWNlO1xuXG4gICAgbGV0IHNlcnZpY2VOYW1lID0gc2VydmljZVByb3ZpZGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHNlcnZpY2VQcm92aWRlciA9PT0gJ1NpZ2ZveCcpIHtcbiAgICAgIHNlcnZpY2VOYW1lID0gJ3NpZ2ZveC1hZ2VudCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAvc2VydmljZS8ke3NlcnZpY2VOYW1lfWA7XG4gIH1cblxuICBpc1N1cHBvcnRlZERldmljZShkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcG9ydGVkRGV2aWNlc0NmZ3Muc29tZSgoeyBtYXRjaCB9KSA9PiBtYXRjaChkZXZpY2UpKTtcbiAgfVxuXG4gIGFzeW5jIGdldEN1cnJlbnRQcm90b2NvbChkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgY29uc3QgbHB3YW5EZXZpY2UgPSBkZXZpY2UuYzh5X0xwd2FuRGV2aWNlO1xuICAgIGxldCBwcm90b2NvbElkO1xuXG4gICAgaWYgKGxwd2FuRGV2aWNlLnR5cGVFeHRlcm5hbElkKSB7XG4gICAgICBjb25zdCBleHRlcm5hbElkID0gKGF3YWl0IHRoaXMuaWRlbnRpdHlTZXJ2aWNlLmRldGFpbChscHdhbkRldmljZS50eXBlRXh0ZXJuYWxJZCkpLmRhdGE7XG4gICAgICBwcm90b2NvbElkID0gZXh0ZXJuYWxJZC5tYW5hZ2VkT2JqZWN0LmlkO1xuICAgIH1cblxuICAgIGlmICghcHJvdG9jb2xJZCAmJiBscHdhbkRldmljZS50eXBlKSB7XG4gICAgICBwcm90b2NvbElkID0gbHB3YW5EZXZpY2UudHlwZS5zcGxpdCgnLycpWzJdO1xuICAgIH1cblxuICAgIGlmICghcHJvdG9jb2xJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKHByb3RvY29sSWQpKS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgYXBwbHlQcm90b2NvbChkZXZpY2U6IElNYW5hZ2VkT2JqZWN0LCBzZWxlY3RlZFByb3RvY29sOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IFtwcm90b2NvbEV4dGVybmFsSWRdID0gKGF3YWl0IHRoaXMuaWRlbnRpdHlTZXJ2aWNlLmxpc3Qoc2VsZWN0ZWRQcm90b2NvbC5pZCkpLmRhdGE7XG4gICAgY29uc3QgeyBleHRlcm5hbElkLCB0eXBlIH0gPSBwcm90b2NvbEV4dGVybmFsSWQ7XG4gICAgZGV2aWNlLmM4eV9McHdhbkRldmljZS50eXBlRXh0ZXJuYWxJZCA9IHsgZXh0ZXJuYWxJZCwgdHlwZSB9O1xuICAgIGRldmljZS5jOHlfTHB3YW5EZXZpY2UudHlwZSA9ICdpbnZlbnRvcnkvbWFuYWdlZE9iamVjdHMvJyArIHNlbGVjdGVkUHJvdG9jb2wuaWQ7XG4gICAgZGV2aWNlLnR5cGUgPSBzZWxlY3RlZFByb3RvY29sLm5hbWU7XG4gICAgcmV0dXJuIHRoaXMuaW52ZW50b3J5U2VydmljZS51cGRhdGUoZGV2aWNlKTtcbiAgfVxuXG4gIGFzeW5jIGdldEF2YWlsYWJsZVByb3RvY29scyhkZXZpY2U6IElNYW5hZ2VkT2JqZWN0KTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+IHtcbiAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgIF9fZmlsdGVyOiB7XG4gICAgICAgIHR5cGU6IHsgX19pbjogdGhpcy5nZXRQcm90b2NvbFR5cGVzTWF0Y2hpbmdEZXZpY2UoZGV2aWNlKSB9XG4gICAgICB9LFxuICAgICAgX19vcmRlcmJ5OiBbeyBuYW1lOiAxIH1dXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmxpc3RRdWVyeShxdWVyeSwgeyB3aXRoVG90YWxQYWdlczogdHJ1ZSwgcGFnZVNpemU6IDUgfSk7XG4gIH1cblxuICBhc3luYyBnZXRBdmFpbGFibGVDb25uZWN0aW9ucyhcbiAgICBkZXZpY2U6IElNYW5hZ2VkT2JqZWN0XG4gICk6IFByb21pc2U8SVJlc3VsdExpc3Q8QWN0aWxpdHlDb25uZWN0aW9uIHwgU2lnZm94Q29ubmVjdGlvbj4+IHtcbiAgICBsZXQgbGlzdDtcbiAgICBjb25zdCBtYXRjaGluZ0NmZyA9IHRoaXMuc3VwcG9ydGVkRGV2aWNlc0NmZ3MuZmluZCgoeyBtYXRjaCB9KSA9PiBtYXRjaChkZXZpY2UpKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubG5zU2VydmljZS5saXN0KG1hdGNoaW5nQ2ZnLmNvbm5lY3Rpb25UeXBlKTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcbiAgICAgIGxpc3QgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBsaXN0ID0gb3JkZXJCeShsaXN0LCBbJ25hbWUnXSwgWydhc2MnXSk7XG4gICAgICByZXR1cm4geyByZXM6IHJlc3BvbnNlLCBkYXRhOiBsaXN0IH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm90b2NvbFR5cGVzTWF0Y2hpbmdEZXZpY2UoZGV2aWNlOiBJTWFuYWdlZE9iamVjdCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBtYXRjaGluZ0NmZyA9IHRoaXMuc3VwcG9ydGVkRGV2aWNlc0NmZ3MuZmluZCgoeyBtYXRjaCB9KSA9PiBtYXRjaChkZXZpY2UpKTtcbiAgICByZXR1cm4gbWF0Y2hpbmdDZmcgPyBtYXRjaGluZ0NmZy5wcm90b2NvbFR5cGVzIDogW107XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEV4dGVybmFsSWQoZGV2aWNlOiBJTWFuYWdlZE9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbWF0Y2hpbmdDZmcgPSB0aGlzLnN1cHBvcnRlZERldmljZXNDZmdzLmZpbmQoKHsgbWF0Y2ggfSkgPT4gbWF0Y2goZGV2aWNlKSk7XG4gICAgY29uc3QgZXh0ZXJuYWxJZHMgPSAoYXdhaXQgdGhpcy5pZGVudGl0eVNlcnZpY2UubGlzdChkZXZpY2UuaWQpKS5kYXRhO1xuICAgIGNvbnN0IGV4dGVybmFsSWQgPSBleHRlcm5hbElkcy5maW5kKCh7IHR5cGUgfSkgPT4gbWF0Y2hpbmdDZmcuZXh0ZXJuYWxJZFR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICByZXR1cm4gZXh0ZXJuYWxJZCA/IGV4dGVybmFsSWQuZXh0ZXJuYWxJZCA6IG51bGw7XG4gIH1cbn1cbiJdfQ==