UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

201 lines 31.1 kB
import { Injectable } from '@angular/core'; import { FetchClient } from '@c8y/client'; import { BehaviorSubject, Subject, from, of, throwError } from 'rxjs'; import { catchError, map, switchMap, takeUntil, tap } from 'rxjs/operators'; import { Lwm2mClientService } from './lwm2m-client.service'; import { AlertService, gettext } from '@c8y/ngx-components'; import { LWM2MEndpoint, agentBaseUrl, ValidationType, Mode } from '@c8y/ngx-components/protocol-lwm2m/model'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/client"; import * as i2 from "@c8y/ngx-components"; export class Lwm2mConfigurationService extends Lwm2mClientService { constructor(client, alertService) { super(client); this.alertService = alertService; this.baseUrl = `${agentBaseUrl}/v1`; this._destroy$ = new Subject(); this._listServers$ = new Subject(); this._servers$ = new BehaviorSubject([]); this._settings$ = new BehaviorSubject({}); this._certificates$ = new BehaviorSubject([]); this._securityModeDictRaw$ = new BehaviorSubject([]); this._securityModeByScope$ = new BehaviorSubject([]); this.servers$ = this._servers$.asObservable(); this.settings$ = this._settings$.asObservable(); this.certificates$ = this._certificates$.asObservable(); this.securityModesByScope$ = this._securityModeByScope$.asObservable(); this.securityModesRaw$ = this._securityModeDictRaw$.asObservable(); this._listServers$ .pipe(switchMap(() => this.listServers$().pipe(map(resp => this._servers$.next(resp?.data)))), catchError(error => { this.alertService.addServerFailure(error); return of([]); }), takeUntil(this._destroy$)) .subscribe(); } ngOnDestroy() { this._destroy$.next(); this._destroy$.complete(); } getSettingsFor(urlCfg) { this.detail$(urlCfg) .pipe(map(({ data }) => data), catchError(error => { this.alertService.addServerFailure(error); return of({}); }), takeUntil(this._destroy$)) .subscribe(data => this._settings$.next(data)); } listServers() { this._listServers$.next(); } updateConfig(entity, endpoint) { this.update$({ ...entity, endpoint }) .pipe(catchError(error => { this.alertService.addServerFailure(error); return of(null); }), takeUntil(this._destroy$)) .subscribe(); } onBeforeUpdate(entity) { return this.deleteFieldsInRequest(entity); } onBeforeCreate(entity) { return this.deleteFieldsInRequest(entity); } getDetailUrl(entity) { const { endpoint } = entity; const id = entity.id ?? ''; const deviceConfigUrl = `device/${this.deviceId}/configuration`; if (!endpoint) { throw { data: { message: gettext('Unable to find endpoint') } }; } return id.length > 0 && endpoint === LWM2MEndpoint.servers ? `${deviceConfigUrl}/${endpoint}/${id}` : `${deviceConfigUrl}/${endpoint}`; } validate(certificate, type) { if (certificate?.length > 0) { const body = JSON.stringify({ [type === ValidationType.PRIVATE_KEY ? 'encodedPrivateKey' : 'encodedCertificate']: certificate }); return this.fetch$(`device/configuration/${type}/validate`, { method: 'POST', headers: { 'content-type': 'application/json', accept: 'application/json' }, body }).pipe(switchMap(result => from(result.json()).pipe(map(data => data['fingerprint'] || data['commonName']))), catchError((e) => { const { message, error } = e?.data; this.alertService.addServerFailure({ data: { message, exceptionMessage: error } }); return throwError(e); })); } } getServerCertificates() { this.fetchServerCertificates$() .pipe(catchError(error => { this.alertService.addServerFailure(error); return of([]); }), takeUntil(this._destroy$)) .subscribe(); } fetchServerCertificates$() { return this.fetch$('dictionary/server-certificates').pipe(switchMap(result => result.json()), tap(result => { this._certificates$.next(result); })); } getSecurityModes() { this.fetchSecurityModes$() .pipe(catchError(error => { // Use this as fallback. There is the possibility that // the UI version runs against an agent version without the needed endpoint: // 'dictionary/security-modes' const { data: { status } } = error; status !== 404 ? this.alertService.addServerFailure(error) : this._securityModeDictRaw$.next([ { label: Mode.DISABLED, value: Mode.DISABLED, useInBootstrapConnectivity: true, useInServerConnectivity: true }, { label: Mode.NO_SEC, value: Mode.NO_SEC, useInBootstrapConnectivity: true, useInServerConnectivity: true }, { label: Mode.PSK, value: Mode.PSK, useInBootstrapConnectivity: true, useInServerConnectivity: true }, { label: 'X.509', value: Mode.X509, useInBootstrapConnectivity: true, useInServerConnectivity: true } ]); return of([]); })) .subscribe(); } fetchSecurityModes$() { return this.fetch$('dictionary/security-modes').pipe(switchMap(result => result.json()), map((result) => result.map(({ name, useInBootstrapConnectivity, useInServerConnectivity }) => ({ label: name.replace('X509', 'X.509'), value: name, useInBootstrapConnectivity, useInServerConnectivity }))), tap((result) => { this._securityModeDictRaw$.next(result); })); } getSecurityModeByScope(scope) { this._securityModeByScope$.next(this._securityModeDictRaw$ .getValue() .filter(({ useInBootstrapConnectivity, useInServerConnectivity }) => (useInBootstrapConnectivity && scope === 'useInBootstrapConnectivity') || (useInServerConnectivity && scope === 'useInServerConnectivity'))); } cleanUpBase64Data(fileReadAsDataURL) { const base64RegExp = RegExp(/data:\S+;base64,/gi); return fileReadAsDataURL?.length > 0 && base64RegExp.test(fileReadAsDataURL) ? fileReadAsDataURL.replace(base64RegExp, '') : undefined; } listServers$() { this.listUrl = this.getDetailUrl({ endpoint: LWM2MEndpoint.servers }); return from(super.list()); } createServer$(server) { return from(super.create({ ...server, endpoint: LWM2MEndpoint.servers })); } deleteServer$(server) { return from(super.delete({ ...server, endpoint: LWM2MEndpoint.servers })); } update$(entity) { return from(super.update(entity)); } detail$(urlCfg) { return from(super.detail(urlCfg)); } fetch$(url, init) { return from(super.fetch(url, init)); } deleteFieldsInRequest(entity) { delete entity?.id; delete entity?.endpoint; delete entity?.deviceInfo; return entity; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Lwm2mConfigurationService, deps: [{ token: i1.FetchClient }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Lwm2mConfigurationService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Lwm2mConfigurationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.FetchClient }, { type: i2.AlertService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHdtMm0tY29uZmlndXJhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvdG9jb2wtbHdtMm0vc2VydmljZXMvbHdtMm0tY29uZmlndXJhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBb0QsTUFBTSxhQUFhLENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFDTCxhQUFhLEVBRWIsWUFBWSxFQUdaLGNBQWMsRUFHZCxJQUFJLEVBQ0wsTUFBTSwwQ0FBMEMsQ0FBQzs7OztBQUtsRCxNQUFNLE9BQU8seUJBQ1gsU0FBUSxrQkFBcUI7SUF3QjdCLFlBQ0UsTUFBbUIsRUFDWCxZQUEwQjtRQUVsQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFGTixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXRCMUIsWUFBTyxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUM7UUFFeEIsY0FBUyxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLGtCQUFhLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0MsY0FBUyxHQUFzQyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RSxlQUFVLEdBQXVCLElBQUksZUFBZSxD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Q0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8scUJBQXFCLENBQUMsTUFBYztRQUMxQyxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDbEIsT0FBTyxNQUFNLEVBQUUsUUFBUSxDQUFDO1FBQ3hCLE9BQVEsTUFBc0IsRUFBRSxVQUFVLENBQUM7UUFDM0MsT0FBTyxNQUFXLENBQUM7SUFDckIsQ0FBQzsrR0ExUVUseUJBQXlCO21IQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7NEZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmV0Y2hDbGllbnQsIElGZXRjaE9wdGlvbnMsIElJZGVudGlmaWVkLCBJUmVzdWx0LCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZnJvbSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEx3bTJtQ2xpZW50U2VydmljZSB9IGZyb20gJy4vbHdtMm0tY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBMV00yTUVuZHBvaW50LFxuICBTZXJ2ZXJTZXR0aW5ncyxcbiAgYWdlbnRCYXNlVXJsLFxuICBFbnRpdHksXG4gIFVybENvbmZpZyxcbiAgVmFsaWRhdGlvblR5cGUsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgU2VjdXJpdHlNb2RlRGljdGlvbmFyeU9iaixcbiAgTW9kZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3Byb3RvY29sLWx3bTJtL21vZGVsJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTHdtMm1Db25maWd1cmF0aW9uU2VydmljZTxUID0gRW50aXR5PlxuICBleHRlbmRzIEx3bTJtQ2xpZW50U2VydmljZTxUPlxuICBpbXBsZW1lbnRzIE9uRGVzdHJveVxue1xuICBkZXZpY2VJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYmFzZVVybCA9IGAke2FnZW50QmFzZVVybH0vdjFgO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbGlzdFNlcnZlcnMkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VydmVycyQ6IEJlaGF2aW9yU3ViamVjdDxTZXJ2ZXJTZXR0aW5nc1tdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXR0aW5ncyQ6IEJlaGF2aW9yU3ViamVjdDxUPiA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30gYXMgVCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NlcnRpZmljYXRlcyQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdIGFzIHN0cmluZ1tdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VjdXJpdHlNb2RlRGljdFJhdyQ6IEJlaGF2aW9yU3ViamVjdDxTZWN1cml0eU1vZGVEaWN0aW9uYXJ5T2JqW10+ID1cbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdIGFzIFNlY3VyaXR5TW9kZURpY3Rpb25hcnlPYmpbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlY3VyaXR5TW9kZUJ5U2NvcGUkOiBCZWhhdmlvclN1YmplY3Q8U2VjdXJpdHlNb2RlRGljdGlvbmFyeU9ialtdPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdChbXSBhcyBTZWN1cml0eU1vZGVEaWN0aW9uYXJ5T2JqW10pO1xuXG4gIHNlcnZlcnMkOiBPYnNlcnZhYmxlPFNlcnZlclNldHRpbmdzW10+ID0gdGhpcy5fc2VydmVycyQuYXNPYnNlcnZhYmxlKCk7XG4gIHNldHRpbmdzJDogT2JzZXJ2YWJsZTxUPiA9IHRoaXMuX3NldHRpbmdzJC5hc09ic2VydmFibGUoKTtcbiAgY2VydGlmaWNhdGVzJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4gPSB0aGlzLl9jZXJ0aWZpY2F0ZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICBzZWN1cml0eU1vZGVzQnlTY29wZSQ6IE9ic2VydmFibGU8U2VjdXJpdHlNb2RlRGljdGlvbmFyeU9ialtdPiA9XG4gICAgdGhpcy5fc2VjdXJpdHlNb2RlQnlTY29wZSQuYXNPYnNlcnZhYmxlKCk7XG4gIHNlY3VyaXR5TW9kZXNSYXckOiBPYnNlcnZhYmxlPFNlY3VyaXR5TW9kZURpY3Rpb25hcnlPYmpbXT4gPVxuICAgIHRoaXMuX3NlY3VyaXR5TW9kZURpY3RSYXckLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogRmV0Y2hDbGllbnQsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHtcbiAgICBzdXBlcihjbGllbnQpO1xuXG4gICAgdGhpcy5fbGlzdFNlcnZlcnMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgdGhpcy5saXN0U2VydmVycyQoKS5waXBlKFxuICAgICAgICAgICAgbWFwKHJlc3AgPT4gdGhpcy5fc2VydmVycyQubmV4dChyZXNwPy5kYXRhIGFzIHVua25vd24gYXMgU2VydmVyU2V0dGluZ3NbXSkpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXRTZXR0aW5nc0Zvcih1cmxDZmc6IFVybENvbmZpZykge1xuICAgIHRoaXMuZGV0YWlsJCh1cmxDZmcpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZih7fSBhcyBUKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLl9zZXR0aW5ncyQubmV4dChkYXRhIGFzIFQpKTtcbiAgfVxuXG4gIGxpc3RTZXJ2ZXJzKCkge1xuICAgIHRoaXMuX2xpc3RTZXJ2ZXJzJC5uZXh0KCk7XG4gIH1cblxuICB1cGRhdGVDb25maWcoZW50aXR5OiBULCBlbmRwb2ludDogTFdNMk1FbmRwb2ludCkge1xuICAgIHRoaXMudXBkYXRlJCh7IC4uLmVudGl0eSwgZW5kcG9pbnQgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBvbkJlZm9yZVVwZGF0ZShlbnRpdHk6IEVudGl0eSkge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUZpZWxkc0luUmVxdWVzdChlbnRpdHkpO1xuICB9XG5cbiAgb25CZWZvcmVDcmVhdGUoZW50aXR5OiBFbnRpdHkpIHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVGaWVsZHNJblJlcXVlc3QoZW50aXR5KTtcbiAgfVxuXG4gIGdldERldGFpbFVybChlbnRpdHk6IEVudGl0eSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBlbmRwb2ludCB9ID0gZW50aXR5O1xuICAgIGNvbnN0IGlkID0gZW50aXR5LmlkID8/ICcnO1xuICAgIGNvbnN0IGRldmljZUNvbmZpZ1VybCA9IGBkZXZpY2UvJHt0aGlzLmRldmljZUlkfS9jb25maWd1cmF0aW9uYDtcblxuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IHsgZGF0YTogeyBtZXNzYWdlOiBnZXR0ZXh0KCdVbmFibGUgdG8gZmluZCBlbmRwb2ludCcpIH0gfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWQubGVuZ3RoID4gMCAmJiBlbmRwb2ludCA9PT0gTFdNMk1FbmRwb2ludC5zZXJ2ZXJzXG4gICAgICA/IGAke2RldmljZUNvbmZpZ1VybH0vJHtlbmRwb2ludH0vJHtpZH1gXG4gICAgICA6IGAke2RldmljZUNvbmZpZ1VybH0vJHtlbmRwb2ludH1gO1xuICB9XG5cbiAgdmFsaWRhdGUoY2VydGlmaWNhdGU6IHN0cmluZywgdHlwZTogVmFsaWRhdGlvblR5cGUpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmIChjZXJ0aWZpY2F0ZT8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgW3R5cGUgPT09IFZhbGlkYXRpb25UeXBlLlBSSVZBVEVfS0VZID8gJ2VuY29kZWRQcml2YXRlS2V5JyA6ICdlbmNvZGVkQ2VydGlmaWNhdGUnXTpcbiAgICAgICAgICBjZXJ0aWZpY2F0ZVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmZldGNoJChgZGV2aWNlL2NvbmZpZ3VyYXRpb24vJHt0eXBlfS92YWxpZGF0ZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keVxuICAgICAgfSkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHJlc3VsdCA9PlxuICAgICAgICAgIGZyb20ocmVzdWx0Lmpzb24oKSBhcyBQcm9taXNlPG9iamVjdD4pLnBpcGUoXG4gICAgICAgICAgICBtYXAoZGF0YSA9PiBkYXRhWydmaW5nZXJwcmludCddIHx8IGRhdGFbJ2NvbW1vbk5hbWUnXSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIGNhdGNoRXJyb3IoKGU6IElSZXN1bHQ8VmFsaWRhdGlvbkVycm9yPikgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgZXJyb3IgfSA9IGU/LmRhdGE7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZSh7XG4gICAgICAgICAgICBkYXRhOiB7IG1lc3NhZ2UsIGV4Y2VwdGlvbk1lc3NhZ2U6IGVycm9yIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VydmVyQ2VydGlmaWNhdGVzKCkge1xuICAgIHRoaXMuZmV0Y2hTZXJ2ZXJDZXJ0aWZpY2F0ZXMkKClcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZmV0Y2hTZXJ2ZXJDZXJ0aWZpY2F0ZXMkKCkge1xuICAgIHJldHVybiB0aGlzLmZldGNoJCgnZGljdGlvbmFyeS9zZXJ2ZXItY2VydGlmaWNhdGVzJykucGlwZShcbiAgICAgIHN3aXRjaE1hcChyZXN1bHQgPT4gcmVzdWx0Lmpzb24oKSksXG4gICAgICB0YXAocmVzdWx0ID0+IHtcbiAgICAgICAgdGhpcy5fY2VydGlmaWNhdGVzJC5uZXh0KHJlc3VsdCk7XG4gICAgICB9KVxuICAgICkgYXMgT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIH1cblxuICBnZXRTZWN1cml0eU1vZGVzKCkge1xuICAgIHRoaXMuZmV0Y2hTZWN1cml0eU1vZGVzJCgpXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgLy8gVXNlIHRoaXMgYXMgZmFsbGJhY2suIFRoZXJlIGlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0XG4gICAgICAgICAgLy8gdGhlIFVJIHZlcnNpb24gcnVucyBhZ2FpbnN0IGFuIGFnZW50IHZlcnNpb24gd2l0aG91dCB0aGUgbmVlZGVkIGVuZHBvaW50OlxuICAgICAgICAgIC8vICdkaWN0aW9uYXJ5L3NlY3VyaXR5LW1vZGVzJ1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGRhdGE6IHsgc3RhdHVzIH1cbiAgICAgICAgICB9ID0gZXJyb3I7XG4gICAgICAgICAgc3RhdHVzICE9PSA0MDRcbiAgICAgICAgICAgID8gdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcilcbiAgICAgICAgICAgIDogdGhpcy5fc2VjdXJpdHlNb2RlRGljdFJhdyQubmV4dChbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbGFiZWw6IE1vZGUuRElTQUJMRUQsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogTW9kZS5ESVNBQkxFRCxcbiAgICAgICAgICAgICAgICAgIHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBNb2RlLk5PX1NFQyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBNb2RlLk5PX1NFQyxcbiAgICAgICAgICAgICAgICAgIHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBNb2RlLlBTSyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBNb2RlLlBTSyxcbiAgICAgICAgICAgICAgICAgIHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnWC41MDknLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IE1vZGUuWDUwOSxcbiAgICAgICAgICAgICAgICAgIHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHk6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBmZXRjaFNlY3VyaXR5TW9kZXMkKCkge1xuICAgIHJldHVybiB0aGlzLmZldGNoJCgnZGljdGlvbmFyeS9zZWN1cml0eS1tb2RlcycpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAocmVzdWx0ID0+IHJlc3VsdC5qc29uKCkpLFxuICAgICAgbWFwKChyZXN1bHQ6IFNlY3VyaXR5TW9kZURpY3Rpb25hcnlPYmpbXSkgPT5cbiAgICAgICAgcmVzdWx0Lm1hcCgoeyBuYW1lLCB1c2VJbkJvb3RzdHJhcENvbm5lY3Rpdml0eSwgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHkgfSkgPT4gKHtcbiAgICAgICAgICBsYWJlbDogbmFtZS5yZXBsYWNlKCdYNTA5JywgJ1guNTA5JyksXG4gICAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgICAgdXNlSW5Cb290c3RyYXBDb25uZWN0aXZpdHksXG4gICAgICAgICAgdXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHlcbiAgICAgICAgfSkpXG4gICAgICApLFxuICAgICAgdGFwKChyZXN1bHQ6IFNlY3VyaXR5TW9kZURpY3Rpb25hcnlPYmpbXSkgPT4ge1xuICAgICAgICB0aGlzLl9zZWN1cml0eU1vZGVEaWN0UmF3JC5uZXh0KHJlc3VsdCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRTZWN1cml0eU1vZGVCeVNjb3BlKHNjb3BlOiAndXNlSW5Cb290c3RyYXBDb25uZWN0aXZpdHknIHwgJ3VzZUluU2VydmVyQ29ubmVjdGl2aXR5Jykge1xuICAgIHRoaXMuX3NlY3VyaXR5TW9kZUJ5U2NvcGUkLm5leHQoXG4gICAgICB0aGlzLl9zZWN1cml0eU1vZGVEaWN0UmF3JFxuICAgICAgICAuZ2V0VmFsdWUoKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICh7IHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5LCB1c2VJblNlcnZlckNvbm5lY3Rpdml0eSB9KSA9PlxuICAgICAgICAgICAgKHVzZUluQm9vdHN0cmFwQ29ubmVjdGl2aXR5ICYmIHNjb3BlID09PSAndXNlSW5Cb290c3RyYXBDb25uZWN0aXZpdHknKSB8fFxuICAgICAgICAgICAgKHVzZUluU2VydmVyQ29ubmVjdGl2aXR5ICYmIHNjb3BlID09PSAndXNlSW5TZXJ2ZXJDb25uZWN0aXZpdHknKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFuVXBCYXNlNjREYXRhKGZpbGVSZWFkQXNEYXRhVVJMOiBzdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlNjRSZWdFeHAgPSBSZWdFeHAoL2RhdGE6XFxTKztiYXNlNjQsL2dpKTtcbiAgICByZXR1cm4gZmlsZVJlYWRBc0RhdGFVUkw/Lmxlbmd0aCA+IDAgJiYgYmFzZTY0UmVnRXhwLnRlc3QoZmlsZVJlYWRBc0RhdGFVUkwpXG4gICAgICA/IGZpbGVSZWFkQXNEYXRhVVJMLnJlcGxhY2UoYmFzZTY0UmVnRXhwLCAnJylcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGlzdFNlcnZlcnMkKCkge1xuICAgIHRoaXMubGlzdFVybCA9IHRoaXMuZ2V0RGV0YWlsVXJsKHsgZW5kcG9pbnQ6IExXTTJNRW5kcG9pbnQuc2VydmVycyB9KTtcbiAgICByZXR1cm4gZnJvbShzdXBlci5saXN0KCkgYXMgUHJvbWlzZTxJUmVzdWx0TGlzdDxTZXJ2ZXJTZXR0aW5ncz4+KTtcbiAgfVxuXG4gIGNyZWF0ZVNlcnZlciQoc2VydmVyOiBTZXJ2ZXJTZXR0aW5ncykge1xuICAgIHJldHVybiBmcm9tKFxuICAgICAgc3VwZXIuY3JlYXRlKHsgLi4uc2VydmVyLCBlbmRwb2ludDogTFdNMk1FbmRwb2ludC5zZXJ2ZXJzIH0pIGFzIFByb21pc2U8XG4gICAgICAgIElSZXN1bHQ8U2VydmVyU2V0dGluZ3M+XG4gICAgICA+XG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZVNlcnZlciQoc2VydmVyOiBTZXJ2ZXJTZXR0aW5ncykge1xuICAgIHJldHVybiBmcm9tKHN1cGVyLmRlbGV0ZSh7IC4uLnNlcnZlciwgZW5kcG9pbnQ6IExXTTJNRW5kcG9pbnQuc2VydmVycyB9KSk7XG4gIH1cblxuICB1cGRhdGUkKGVudGl0eTogRW50aXR5KSB7XG4gICAgcmV0dXJuIGZyb20oc3VwZXIudXBkYXRlKGVudGl0eSBhcyBUKSBhcyBQcm9taXNlPElSZXN1bHQ8VD4+KTtcbiAgfVxuXG4gIGRldGFpbCQodXJsQ2ZnOiBVcmxDb25maWcpIHtcbiAgICByZXR1cm4gZnJvbShzdXBlci5kZXRhaWwodXJsQ2ZnIGFzIFQpIGFzIFByb21pc2U8SVJlc3VsdDxUPj4pO1xuICB9XG5cbiAgZmV0Y2gkKHVybDogc3RyaW5nLCBpbml0PzogSUZldGNoT3B0aW9ucykge1xuICAgIHJldHVybiBmcm9tKHN1cGVyLmZldGNoKHVybCwgaW5pdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVGaWVsZHNJblJlcXVlc3QoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBkZWxldGUgZW50aXR5Py5pZDtcbiAgICBkZWxldGUgZW50aXR5Py5lbmRwb2ludDtcbiAgICBkZWxldGUgKGVudGl0eSBhcyBJSWRlbnRpZmllZCk/LmRldmljZUluZm87XG4gICAgcmV0dXJuIGVudGl0eSBhcyBUO1xuICB9XG59XG4iXX0=