@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
118 lines • 14.3 kB
JavaScript
import { Injectable } from '@angular/core';
import { OperationService } from '@c8y/client';
import { AlertService, gettext } from '@c8y/ngx-components';
import { map } from 'lodash-es';
import { SERVICE_COMMANDS_MAP } from './services.model';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
import * as i2 from "@c8y/ngx-components";
export class ServiceCommandService {
constructor(operationService, alertService) {
this.operationService = operationService;
this.alertService = alertService;
}
/**
* Check if the service supports service commands.
* @param service The service object containing supported operations.
* @returns boolean indicating if the service supports service commands.
*/
isServiceCommandSupported(service) {
return service.c8y_SupportedOperations?.includes('c8y_ServiceCommand');
}
/**
* Get the list of supported service commands for the given service object.
* @param service The service object containing the c8y_SupportedServiceCommands fragment.
* @returns Array of supported commands.
*/
getSupportedCommands(service) {
return service.c8y_SupportedServiceCommands || map(SERVICE_COMMANDS_MAP, 'command');
}
/**
* Check if a specific command is supported for the given service.
* @param service The service object.
* @param command The command to check (e.g., START, STOP).
* @returns boolean indicating if the command is supported.
*/
isCommandSupported(service, command) {
const supportedCommands = this.getSupportedCommands(service);
return supportedCommands.includes(command);
}
/**
* Get all supported commands for a list of services.
* @param services The list of service objects to evaluate.
* @returns Array of all unique supported commands.
*/
getAllSupportedCommands(services) {
const allCommands = services
.filter(service => this.isServiceCommandSupported(service))
.flatMap(service => this.getSupportedCommands(service));
return Array.from(new Set(allCommands));
}
/**
* Create an operation for the selected service command.
* @param service The service object the operation should target.
* @param command The command to execute (e.g., START, STOP).
* @returns Promise of the created operation.
*/
createOperation({ id, name, serviceType }, command) {
const operation = {
deviceId: id,
description: `${command} ${name}`,
c8y_ServiceCommand: {
command,
serviceName: name,
serviceType: serviceType
}
};
return this.operationService.create(operation);
}
/**
* Generate a static list of action controls.
* The specific logic for each service is handled dynamically in showIf and callback.
* @returns Array of ActionControl objects.
*/
generateActionControls(commands) {
return commands.map(command => ({
type: command.toLowerCase(),
icon: this.getCommandIcon(command),
iconClasses: this.getCommandIconClass(command),
text: command,
showIf: (service) => this.isServiceCommandSupported(service) && this.isCommandSupported(service, command),
callback: async (service) => {
try {
await this.createOperation(service, command);
this.alertService.success(gettext('Operation created.'));
}
catch (error) {
const alertMessage = gettext('Could not create operation.');
this.alertService.danger(alertMessage, error);
}
}
}));
}
/**
* Get the icon for a specific command.
* @param command The command name.
* @returns Icon string for the command.
*/
getCommandIcon(command) {
return SERVICE_COMMANDS_MAP[command]?.icon || 'console';
}
/**
* Get the icon class for a specific command.
* @param command The command name.
* @returns Icon class string for the command.
*/
getCommandIconClass(command) {
return SERVICE_COMMANDS_MAP[command]?.styleClass;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceCommandService, deps: [{ token: i1.OperationService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceCommandService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceCommandService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.OperationService }, { type: i2.AlertService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1jb21tYW5kLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zaGFyZWQvc2VydmljZS1jb21tYW5kLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQXVCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BFLE9BQU8sRUFBaUIsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFXLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFLakUsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUNVLGdCQUFrQyxFQUNsQyxZQUEwQjtRQUQxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO0lBQ2pDLENBQUM7SUFFSjs7OztPQUlHO0lBQ0gseUJBQXlCLENBQUMsT0FBZ0I7UUFDeEMsT0FBTyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxPQUFnQjtRQUNuQyxPQUFPLE9BQU8sQ0FBQyw0QkFBNEIsSUFBSSxHQUFHLENBQUMsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsT0FBZ0IsRUFBRSxPQUFlO1FBQ2xELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsUUFBbUI7UUFDekMsTUFBTSxXQUFXLEdBQUcsUUFBUTthQUN6QixNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFMUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUNiLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQVcsRUFDbEMsT0FBZTtRQUVmLE1BQU0sU0FBUyxHQUFlO1lBQzVCLFFBQVEsRUFBRSxFQUFFO1lBQ1osV0FBVyxFQUFFLEdBQUcsT0FBTyxJQUFJLElBQUksRUFBRTtZQUNqQyxrQkFBa0IsRUFBRTtnQkFDbEIsT0FBTztnQkFDUCxXQUFXLEVBQUUsSUFBSTtnQkFDakIsV0FBVyxFQUFFLFdBQVc7YUFDekI7U0FDRixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsc0JBQXNCLENBQUMsUUFBa0I7UUFDdkMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDOUMsSUFBSSxFQUFFLE9BQU87WUFDYixNQUFNLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUUsQ0FDM0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO1lBQ3RGLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO29CQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGNBQWMsQ0FBQyxPQUFlO1FBQ3BDLE9BQU8sb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG1CQUFtQixDQUFDLE9BQWU7UUFDekMsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLENBQUM7SUFDbkQsQ0FBQzsrR0FoSFUscUJBQXFCO21IQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElPcGVyYXRpb24sIElSZXN1bHQsIE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBY3Rpb25Db250cm9sLCBBbGVydFNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBTZXJ2aWNlLCBTRVJWSUNFX0NPTU1BTkRTX01BUCB9IGZyb20gJy4vc2VydmljZXMubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlQ29tbWFuZFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG9wZXJhdGlvblNlcnZpY2U6IE9wZXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIHNlcnZpY2UgY29tbWFuZHMuXG4gICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIG9iamVjdCBjb250YWluaW5nIHN1cHBvcnRlZCBvcGVyYXRpb25zLlxuICAgKiBAcmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgc2VydmljZSBjb21tYW5kcy5cbiAgICovXG4gIGlzU2VydmljZUNvbW1hbmRTdXBwb3J0ZWQoc2VydmljZTogU2VydmljZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzZXJ2aWNlLmM4eV9TdXBwb3J0ZWRPcGVyYXRpb25zPy5pbmNsdWRlcygnYzh5X1NlcnZpY2VDb21tYW5kJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzZXJ2aWNlIGNvbW1hbmRzIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBvYmplY3QuXG4gICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIG9iamVjdCBjb250YWluaW5nIHRoZSBjOHlfU3VwcG9ydGVkU2VydmljZUNvbW1hbmRzIGZyYWdtZW50LlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBzdXBwb3J0ZWQgY29tbWFuZHMuXG4gICAqL1xuICBnZXRTdXBwb3J0ZWRDb21tYW5kcyhzZXJ2aWNlOiBTZXJ2aWNlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBzZXJ2aWNlLmM4eV9TdXBwb3J0ZWRTZXJ2aWNlQ29tbWFuZHMgfHwgbWFwKFNFUlZJQ0VfQ09NTUFORFNfTUFQLCAnY29tbWFuZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc3BlY2lmaWMgY29tbWFuZCBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSBvYmplY3QuXG4gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIGNoZWNrIChlLmcuLCBTVEFSVCwgU1RPUCkuXG4gICAqIEByZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29tbWFuZCBpcyBzdXBwb3J0ZWQuXG4gICAqL1xuICBpc0NvbW1hbmRTdXBwb3J0ZWQoc2VydmljZTogU2VydmljZSwgY29tbWFuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3VwcG9ydGVkQ29tbWFuZHMgPSB0aGlzLmdldFN1cHBvcnRlZENvbW1hbmRzKHNlcnZpY2UpO1xuICAgIHJldHVybiBzdXBwb3J0ZWRDb21tYW5kcy5pbmNsdWRlcyhjb21tYW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHN1cHBvcnRlZCBjb21tYW5kcyBmb3IgYSBsaXN0IG9mIHNlcnZpY2VzLlxuICAgKiBAcGFyYW0gc2VydmljZXMgVGhlIGxpc3Qgb2Ygc2VydmljZSBvYmplY3RzIHRvIGV2YWx1YXRlLlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBhbGwgdW5pcXVlIHN1cHBvcnRlZCBjb21tYW5kcy5cbiAgICovXG4gIGdldEFsbFN1cHBvcnRlZENvbW1hbmRzKHNlcnZpY2VzOiBTZXJ2aWNlW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYWxsQ29tbWFuZHMgPSBzZXJ2aWNlc1xuICAgICAgLmZpbHRlcihzZXJ2aWNlID0+IHRoaXMuaXNTZXJ2aWNlQ29tbWFuZFN1cHBvcnRlZChzZXJ2aWNlKSlcbiAgICAgIC5mbGF0TWFwKHNlcnZpY2UgPT4gdGhpcy5nZXRTdXBwb3J0ZWRDb21tYW5kcyhzZXJ2aWNlKSk7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFsbENvbW1hbmRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIG9wZXJhdGlvbiBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UgY29tbWFuZC5cbiAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2Ugb2JqZWN0IHRoZSBvcGVyYXRpb24gc2hvdWxkIHRhcmdldC5cbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSAoZS5nLiwgU1RBUlQsIFNUT1ApLlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHRoZSBjcmVhdGVkIG9wZXJhdGlvbi5cbiAgICovXG4gIGNyZWF0ZU9wZXJhdGlvbihcbiAgICB7IGlkLCBuYW1lLCBzZXJ2aWNlVHlwZSB9OiBTZXJ2aWNlLFxuICAgIGNvbW1hbmQ6IHN0cmluZ1xuICApOiBQcm9taXNlPElSZXN1bHQ8SU9wZXJhdGlvbj4+IHtcbiAgICBjb25zdCBvcGVyYXRpb246IElPcGVyYXRpb24gPSB7XG4gICAgICBkZXZpY2VJZDogaWQsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7Y29tbWFuZH0gJHtuYW1lfWAsXG4gICAgICBjOHlfU2VydmljZUNvbW1hbmQ6IHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgc2VydmljZU5hbWU6IG5hbWUsXG4gICAgICAgIHNlcnZpY2VUeXBlOiBzZXJ2aWNlVHlwZVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25TZXJ2aWNlLmNyZWF0ZShvcGVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgc3RhdGljIGxpc3Qgb2YgYWN0aW9uIGNvbnRyb2xzLlxuICAgKiBUaGUgc3BlY2lmaWMgbG9naWMgZm9yIGVhY2ggc2VydmljZSBpcyBoYW5kbGVkIGR5bmFtaWNhbGx5IGluIHNob3dJZiBhbmQgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIEFjdGlvbkNvbnRyb2wgb2JqZWN0cy5cbiAgICovXG4gIGdlbmVyYXRlQWN0aW9uQ29udHJvbHMoY29tbWFuZHM6IHN0cmluZ1tdKTogQWN0aW9uQ29udHJvbFtdIHtcbiAgICByZXR1cm4gY29tbWFuZHMubWFwKGNvbW1hbmQgPT4gKHtcbiAgICAgIHR5cGU6IGNvbW1hbmQudG9Mb3dlckNhc2UoKSxcbiAgICAgIGljb246IHRoaXMuZ2V0Q29tbWFuZEljb24oY29tbWFuZCksXG4gICAgICBpY29uQ2xhc3NlczogdGhpcy5nZXRDb21tYW5kSWNvbkNsYXNzKGNvbW1hbmQpLFxuICAgICAgdGV4dDogY29tbWFuZCxcbiAgICAgIHNob3dJZjogKHNlcnZpY2U6IFNlcnZpY2UpID0+XG4gICAgICAgIHRoaXMuaXNTZXJ2aWNlQ29tbWFuZFN1cHBvcnRlZChzZXJ2aWNlKSAmJiB0aGlzLmlzQ29tbWFuZFN1cHBvcnRlZChzZXJ2aWNlLCBjb21tYW5kKSxcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoc2VydmljZTogU2VydmljZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlT3BlcmF0aW9uKHNlcnZpY2UsIGNvbW1hbmQpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnT3BlcmF0aW9uIGNyZWF0ZWQuJykpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGFsZXJ0TWVzc2FnZSA9IGdldHRleHQoJ0NvdWxkIG5vdCBjcmVhdGUgb3BlcmF0aW9uLicpO1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihhbGVydE1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGljb24gZm9yIGEgc3BlY2lmaWMgY29tbWFuZC5cbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgbmFtZS5cbiAgICogQHJldHVybnMgSWNvbiBzdHJpbmcgZm9yIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb21tYW5kSWNvbihjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBTRVJWSUNFX0NPTU1BTkRTX01BUFtjb21tYW5kXT8uaWNvbiB8fCAnY29uc29sZSc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpY29uIGNsYXNzIGZvciBhIHNwZWNpZmljIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIG5hbWUuXG4gICAqIEByZXR1cm5zIEljb24gY2xhc3Mgc3RyaW5nIGZvciB0aGUgY29tbWFuZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29tbWFuZEljb25DbGFzcyhjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBTRVJWSUNFX0NPTU1BTkRTX01BUFtjb21tYW5kXT8uc3R5bGVDbGFzcztcbiAgfVxufVxuIl19