@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
150 lines • 20.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { isCodeError } from '@iotize/common/error';
import { PathParameter, TapError, } from '@iotize/tap';
import { TapRequestFrame } from '@iotize/tap/client/api';
import { TapClientError } from '@iotize/tap/client/impl';
import { CurrentDeviceService } from '../current-device.service';
import { debug } from '../logger';
import { TapApiExplorerService } from '../tap-api-explorer.service';
import { TapInfoCacheService } from './tap-info-cache.service';
import { TapInfoConfigService } from './tap-info-config.service';
import { createCacheKey } from './utility';
import * as i0 from "@angular/core";
import * as i1 from "./tap-info-config.service";
import * as i2 from "./tap-info-cache.service";
import * as i3 from "../current-device.service";
import * as i4 from "../tap-api-explorer.service";
const TAG = 'TapInfoDAOService';
/**
* Tap info Data Access Object service for real LwM2M resources
*/
export class TapInfoDAOService {
tapInfoConfigService;
tapInfoCacheService;
tapService;
tapApiExplorerService;
constructor(tapInfoConfigService, tapInfoCacheService, tapService, tapApiExplorerService) {
this.tapInfoConfigService = tapInfoConfigService;
this.tapInfoCacheService = tapInfoCacheService;
this.tapService = tapService;
this.tapApiExplorerService = tapApiExplorerService;
}
hasPut(result) {
return this._getPut(result) !== undefined;
}
_getPut(key) {
const infoConfig = this.tapInfoConfigService.findByKey(key);
if (!infoConfig?.putValue) {
const nativeLwm2mRequestTemplate = this.tapApiExplorerService.getByUrl(TapRequestFrame.MethodType.PUT, key.key);
if (!nativeLwm2mRequestTemplate) {
return undefined;
}
return async (tap, value, ...pathParameters) => {
const request = pathParameters.length > 0
? fillWithPathParameters(nativeLwm2mRequestTemplate, pathParameters)
: { ...nativeLwm2mRequestTemplate };
request.body = value;
return await tap.lwm2m.execute(request);
};
}
else {
return infoConfig.putValue;
}
}
async put(key, value) {
const tap = this.tapService.tapOrUndefined;
const put = this._getPut(key);
if (!put) {
throw new Error(`Tap resource '${key.key}' is not editable`);
}
if (!tap) {
throw new Error(`No tap selected`);
}
return put(tap, value, ...(key.params || [])).then((result) => {
result.successful();
return result;
});
}
async get(key) {
try {
const tap = this.tapService.tapOrUndefined;
debug(TAG, `refreshKey "${createCacheKey(key)}" start`);
if (!tap) {
throw TapClientError.notConnectedError();
}
this.tapInfoCacheService.clearKey(key);
let reader;
const infoConfig = this.tapInfoConfigService.findByKey(key);
if (!infoConfig?.getValue) {
const nativeLwm2mRequestTemplate = this.tapApiExplorerService.getByUrl(TapRequestFrame.MethodType.GET, key.key);
if (nativeLwm2mRequestTemplate) {
let nativeLwm2mRequest = nativeLwm2mRequestTemplate;
if (key.params) {
nativeLwm2mRequest = fillWithPathParameters(nativeLwm2mRequestTemplate, key.params);
}
reader = async (tap) => {
return (await tap.lwm2m.execute(nativeLwm2mRequest)).body();
};
}
else {
throw new Error(`Unknown Tap Resource 'GET ${key.key}'`);
}
}
else {
reader = infoConfig.getValue;
}
if (!reader) {
// Check resource info exist
return this.tapInfoCacheService.setKeyInfo(key, {
loadDate: new Date(),
});
}
if (!tap.isConnected()) {
throw TapClientError.notConnectedError();
}
// let cacheKey = this._createCacheKey(key, params);
const responseOrBody = await reader(tap, ...(key.params || []));
const body = typeof responseOrBody['body'] === 'function'
? responseOrBody['body']()
: responseOrBody;
return this.tapInfoCacheService.setKeyValue(key, body);
}
catch (err) {
this.tapInfoCacheService.setKeyError(key, err);
if (isCodeError(TapError.Code.ResponseStatusError, err)) {
// Do not throw, tap request was successful
return;
}
throw err;
}
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoDAOService, deps: [{ token: i1.TapInfoConfigService }, { token: i2.TapInfoCacheService }, { token: i3.CurrentDeviceService }, { token: i4.TapApiExplorerService }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoDAOService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoDAOService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: () => [{ type: i1.TapInfoConfigService }, { type: i2.TapInfoCacheService }, { type: i3.CurrentDeviceService }, { type: i4.TapApiExplorerService }] });
function fillWithPathParameters(nativeLwm2mRequest, params) {
const parameters = PathParameter.extractParams(nativeLwm2mRequest.path);
if (parameters.length !== params.length) {
throw new Error(`${nativeLwm2mRequest.pathAlias || nativeLwm2mRequest.path} expects ${parameters.length} path parameters but given ${params.length}`);
}
if (parameters.length > 0) {
if (parameters.length === 1) {
nativeLwm2mRequest = {
...nativeLwm2mRequest,
pathParameters: {
[parameters[0]]: params[0],
},
};
}
else {
throw new Error(`${nativeLwm2mRequest.pathAlias || nativeLwm2mRequest.path} more than 1 path parameter is not implemented yet`);
}
}
return nativeLwm2mRequest;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWluZm8tZGFvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvc3JjL2xpYi90YXAtaW5mby90YXAtaW5mby1kYW8uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsYUFBYSxFQUViLFFBQVEsR0FFVCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFNcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7Ozs7O0FBRTNDLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixDQUFDO0FBRWhDOztHQUVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUVsQjtJQUNBO0lBQ0E7SUFDQTtJQUpWLFlBQ1Usb0JBQTBDLEVBQzFDLG1CQUF3QyxFQUN4QyxVQUFnQyxFQUNoQyxxQkFBNEM7UUFINUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGVBQVUsR0FBVixVQUFVLENBQXNC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O0lBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixrQkFBa0IsR0FBRztnQkFDbkIsR0FBRyxrQkFBa0I7Z0JBQ3JCLGNBQWMsRUFBRTtvQkFDZCxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQzNCO2FBQ0YsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixHQUNFLGtCQUFrQixDQUFDLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxJQUNyRCxvREFBb0QsQ0FDckQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNDb2RlRXJyb3IgfSBmcm9tICdAaW90aXplL2NvbW1vbi9lcnJvcic7XG5pbXBvcnQge1xuICBQYXRoUGFyYW1ldGVyLFxuICBTZXJ2aWNlQ2FsbFR5cGUsXG4gIFRhcEVycm9yLFxuICBUYXBSZXNwb25zZSxcbn0gZnJvbSAnQGlvdGl6ZS90YXAnO1xuaW1wb3J0IHsgVGFwUmVxdWVzdEZyYW1lIH0gZnJvbSAnQGlvdGl6ZS90YXAvY2xpZW50L2FwaSc7XG5pbXBvcnQgeyBUYXBDbGllbnRFcnJvciB9IGZyb20gJ0Bpb3RpemUvdGFwL2NsaWVudC9pbXBsJztcbmltcG9ydCB7IEN1cnJlbnREZXZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vY3VycmVudC1kZXZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBUYXBBcGlFeHBsb3JlclNlcnZpY2UgfSBmcm9tICcuLi90YXAtYXBpLWV4cGxvcmVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVGFwQ29uZmlnR2V0VmFsdWVUeXBlLFxuICBUYXBDb25maWdQdXRWYWx1ZVR5cGUsXG59IGZyb20gJy4uL3RhcC1jb25maWctaXRlbS90YXAtY29uZmlnLWl0ZW0tYmFzZSc7XG5pbXBvcnQgeyBUYXBJbmZvS2V5IH0gZnJvbSAnLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBUYXBJbmZvQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi90YXAtaW5mby1jYWNoZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRhcEluZm9Db25maWdTZXJ2aWNlIH0gZnJvbSAnLi90YXAtaW5mby1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBjcmVhdGVDYWNoZUtleSB9IGZyb20gJy4vdXRpbGl0eSc7XG5cbmNvbnN0IFRBRyA9ICdUYXBJbmZvREFPU2VydmljZSc7XG5cbi8qKlxuICogVGFwIGluZm8gRGF0YSBBY2Nlc3MgT2JqZWN0IHNlcnZpY2UgZm9yIHJlYWwgTHdNMk0gcmVzb3VyY2VzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBJbmZvREFPU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGFwSW5mb0NvbmZpZ1NlcnZpY2U6IFRhcEluZm9Db25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFwSW5mb0NhY2hlU2VydmljZTogVGFwSW5mb0NhY2hlU2VydmljZSxcbiAgICBwcml2YXRlIHRhcFNlcnZpY2U6IEN1cnJlbnREZXZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFwQXBpRXhwbG9yZXJTZXJ2aWNlOiBUYXBBcGlFeHBsb3JlclNlcnZpY2VcbiAgKSB7fVxuXG4gIGhhc1B1dChyZXN1bHQ6IFRhcEluZm9LZXkpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0UHV0KHJlc3VsdCkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFB1dChrZXk6IFRhcEluZm9LZXkpOiBUYXBDb25maWdQdXRWYWx1ZVR5cGU8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5mb0NvbmZpZyA9IHRoaXMudGFwSW5mb0NvbmZpZ1NlcnZpY2UuZmluZEJ5S2V5KGtleSk7XG4gICAgaWYgKCFpbmZvQ29uZmlnPy5wdXRWYWx1ZSkge1xuICAgICAgY29uc3QgbmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUgPSB0aGlzLnRhcEFwaUV4cGxvcmVyU2VydmljZS5nZXRCeVVybChcbiAgICAgICAgVGFwUmVxdWVzdEZyYW1lLk1ldGhvZFR5cGUuUFVULFxuICAgICAgICBrZXkua2V5XG4gICAgICApO1xuICAgICAgaWYgKCFuYXRpdmVMd20ybVJlcXVlc3RUZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFzeW5jICh0YXAsIHZhbHVlLCAuLi5wYXRoUGFyYW1ldGVycykgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID1cbiAgICAgICAgICBwYXRoUGFyYW1ldGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGZpbGxXaXRoUGF0aFBhcmFtZXRlcnMobmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUsIHBhdGhQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgOiB7IC4uLm5hdGl2ZUx3bTJtUmVxdWVzdFRlbXBsYXRlIH07XG4gICAgICAgIHJlcXVlc3QuYm9keSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGFwLmx3bTJtLmV4ZWN1dGUocmVxdWVzdCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5mb0NvbmZpZy5wdXRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwdXQ8VmFsdWVUeXBlPihcbiAgICBrZXk6IFRhcEluZm9LZXksXG4gICAgdmFsdWU6IFZhbHVlVHlwZVxuICApOiBQcm9taXNlPFRhcFJlc3BvbnNlPGFueT4+IHtcbiAgICBjb25zdCB0YXAgPSB0aGlzLnRhcFNlcnZpY2UudGFwT3JVbmRlZmluZWQ7XG4gICAgY29uc3QgcHV0ID0gdGhpcy5fZ2V0UHV0KGtleSk7XG4gICAgaWYgKCFwdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFwIHJlc291cmNlICcke2tleS5rZXl9JyBpcyBub3QgZWRpdGFibGVgKTtcbiAgICB9XG4gICAgaWYgKCF0YXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGFwIHNlbGVjdGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBwdXQodGFwLCB2YWx1ZSwgLi4uKGtleS5wYXJhbXMgfHwgW10pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIHJlc3VsdC5zdWNjZXNzZnVsKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0KGtleTogVGFwSW5mb0tleSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXAgPSB0aGlzLnRhcFNlcnZpY2UudGFwT3JVbmRlZmluZWQ7XG4gICAgICBkZWJ1ZyhUQUcsIGByZWZyZXNoS2V5IFwiJHtjcmVhdGVDYWNoZUtleShrZXkpfVwiIHN0YXJ0YCk7XG4gICAgICBpZiAoIXRhcCkge1xuICAgICAgICB0aHJvdyBUYXBDbGllbnRFcnJvci5ub3RDb25uZWN0ZWRFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLmNsZWFyS2V5KGtleSk7XG5cbiAgICAgIGxldCByZWFkZXI6IFRhcENvbmZpZ0dldFZhbHVlVHlwZTxhbnk+IHwgZmFsc2UgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpbmZvQ29uZmlnID0gdGhpcy50YXBJbmZvQ29uZmlnU2VydmljZS5maW5kQnlLZXkoa2V5KTtcbiAgICAgIGlmICghaW5mb0NvbmZpZz8uZ2V0VmFsdWUpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUgPSB0aGlzLnRhcEFwaUV4cGxvcmVyU2VydmljZS5nZXRCeVVybChcbiAgICAgICAgICBUYXBSZXF1ZXN0RnJhbWUuTWV0aG9kVHlwZS5HRVQsXG4gICAgICAgICAga2V5LmtleVxuICAgICAgICApO1xuICAgICAgICBpZiAobmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGUpIHtcbiAgICAgICAgICBsZXQgbmF0aXZlTHdtMm1SZXF1ZXN0ID0gbmF0aXZlTHdtMm1SZXF1ZXN0VGVtcGxhdGU7XG4gICAgICAgICAgaWYgKGtleS5wYXJhbXMpIHtcbiAgICAgICAgICAgIG5hdGl2ZUx3bTJtUmVxdWVzdCA9IGZpbGxXaXRoUGF0aFBhcmFtZXRlcnMoXG4gICAgICAgICAgICAgIG5hdGl2ZUx3bTJtUmVxdWVzdFRlbXBsYXRlLFxuICAgICAgICAgICAgICBrZXkucGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWFkZXIgPSBhc3luYyAodGFwKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IHRhcC5sd20ybS5leGVjdXRlKG5hdGl2ZUx3bTJtUmVxdWVzdCkpLmJvZHkoKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBUYXAgUmVzb3VyY2UgJ0dFVCAke2tleS5rZXl9J2ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWFkZXIgPSBpbmZvQ29uZmlnLmdldFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgLy8gQ2hlY2sgcmVzb3VyY2UgaW5mbyBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLnNldEtleUluZm8oa2V5LCB7XG4gICAgICAgICAgbG9hZERhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF0YXAuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICB0aHJvdyBUYXBDbGllbnRFcnJvci5ub3RDb25uZWN0ZWRFcnJvcigpO1xuICAgICAgfVxuICAgICAgLy8gbGV0IGNhY2hlS2V5ID0gdGhpcy5fY3JlYXRlQ2FjaGVLZXkoa2V5LCBwYXJhbXMpO1xuICAgICAgY29uc3QgcmVzcG9uc2VPckJvZHkgPSBhd2FpdCByZWFkZXIodGFwLCAuLi4oa2V5LnBhcmFtcyB8fCBbXSkpO1xuICAgICAgY29uc3QgYm9keSA9XG4gICAgICAgIHR5cGVvZiByZXNwb25zZU9yQm9keVsnYm9keSddID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyByZXNwb25zZU9yQm9keVsnYm9keSddKClcbiAgICAgICAgICA6IHJlc3BvbnNlT3JCb2R5O1xuICAgICAgcmV0dXJuIHRoaXMudGFwSW5mb0NhY2hlU2VydmljZS5zZXRLZXlWYWx1ZShrZXksIGJvZHkpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2Uuc2V0S2V5RXJyb3Ioa2V5LCBlcnIpO1xuICAgICAgaWYgKGlzQ29kZUVycm9yKFRhcEVycm9yLkNvZGUuUmVzcG9uc2VTdGF0dXNFcnJvciwgZXJyKSkge1xuICAgICAgICAvLyBEbyBub3QgdGhyb3csIHRhcCByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsbFdpdGhQYXRoUGFyYW1ldGVycyhcbiAgbmF0aXZlTHdtMm1SZXF1ZXN0OiBTZXJ2aWNlQ2FsbFR5cGU8YW55LCBhbnk+LFxuICBwYXJhbXM6IGFueVtdXG4pOiBTZXJ2aWNlQ2FsbFR5cGU8YW55LCBhbnk+IHtcbiAgY29uc3QgcGFyYW1ldGVycyA9IFBhdGhQYXJhbWV0ZXIuZXh0cmFjdFBhcmFtcyhuYXRpdmVMd20ybVJlcXVlc3QucGF0aCk7XG4gIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCAhPT0gcGFyYW1zLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke25hdGl2ZUx3bTJtUmVxdWVzdC5wYXRoQWxpYXMgfHwgbmF0aXZlTHdtMm1SZXF1ZXN0LnBhdGh9IGV4cGVjdHMgJHtcbiAgICAgICAgcGFyYW1ldGVycy5sZW5ndGhcbiAgICAgIH0gcGF0aCBwYXJhbWV0ZXJzIGJ1dCBnaXZlbiAke3BhcmFtcy5sZW5ndGh9YFxuICAgICk7XG4gIH1cbiAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgbmF0aXZlTHdtMm1SZXF1ZXN0ID0ge1xuICAgICAgICAuLi5uYXRpdmVMd20ybVJlcXVlc3QsXG4gICAgICAgIHBhdGhQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgW3BhcmFtZXRlcnNbMF1dOiBwYXJhbXNbMF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke1xuICAgICAgICAgIG5hdGl2ZUx3bTJtUmVxdWVzdC5wYXRoQWxpYXMgfHwgbmF0aXZlTHdtMm1SZXF1ZXN0LnBhdGhcbiAgICAgICAgfSBtb3JlIHRoYW4gMSBwYXRoIHBhcmFtZXRlciBpcyBub3QgaW1wbGVtZW50ZWQgeWV0YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hdGl2ZUx3bTJtUmVxdWVzdDtcbn1cbiJdfQ==