UNPKG

ontimize-web-ngx

Version:
241 lines 35.7 kB
import { Injectable, Injector } from '@angular/core'; import { Observable, Subject } from 'rxjs'; import { share } from 'rxjs/operators'; import { AppConfig } from '../../config/app-config'; import { Util } from '../../util/util'; import { OntimizeEEPermissionsService } from './ontimize-ee-permissions.service'; import { OntimizePermissionsService } from './ontimize-permissions.service'; import * as i0 from "@angular/core"; export class PermissionsService { constructor(injector) { this.injector = injector; this.onChangePermissions = new Subject(); const appConfig = this.injector.get(AppConfig).getConfiguration(); if (Util.isDefined(appConfig.permissionsConfiguration)) { this.ontimizePermissionsConfig = appConfig.permissionsConfiguration; } } configureService() { const loadingService = OntimizePermissionsService; try { this.permissionsService = this.injector.get(loadingService); if (Util.isPermissionsService(this.permissionsService)) { if (this.permissionsService instanceof OntimizePermissionsService) { this.permissionsService.configureService(this.ontimizePermissionsConfig); } else if (this.permissionsService instanceof OntimizeEEPermissionsService) { this.permissionsService.configureService(this.ontimizePermissionsConfig); } } } catch (e) { console.error(e); } } restart() { this.permissions = undefined; this.onChangePermissions.next(this.permissions); } hasPermissions() { return this.permissions !== undefined; } getUserPermissionsAsPromise() { const self = this; return new Promise((resolve) => { self.permissions = {}; if (Util.isDefined(self.ontimizePermissionsConfig)) { self.configureService(); const subscription = self.queryPermissions().subscribe({ next: () => { resolve(true); }, error: (err) => { console.error(err); resolve(true); }, complete: () => { subscription.unsubscribe(); } }); } else { resolve(true); } }); } queryPermissions() { const self = this; const dataObservable = new Observable(innerObserver => { self.permissionsService.loadPermissions().subscribe((res) => { self.permissions = res; self.onChangePermissions.next(self.permissions); innerObserver.next(res); }, (err) => { console.error('[Permissions.queryPermissions]: error', err); innerObserver.error(err); }, () => { innerObserver.complete(); }); }); return dataObservable.pipe(share()); } getPermissionIdFromActRoute(actRoute) { if (!Util.isDefined(actRoute)) { return undefined; } let result; let snapshot = actRoute.snapshot; result = ((snapshot.data || {})['oPermission'] || {})['permissionId']; while (Util.isDefined(snapshot.firstChild) && !Util.isDefined(result)) { snapshot = snapshot.firstChild; result = ((snapshot.data || {})['oPermission'] || {})['permissionId']; } return result; } getComponentPermissionsUsingRoute(attr, actRoute) { let result; const permissionId = this.getPermissionIdFromActRoute(actRoute); if (Util.isDefined(permissionId)) { const routePermissions = (this.permissions.routes || []).find(route => route.permissionId === permissionId); if (Util.isDefined(routePermissions)) { result = (routePermissions.components || []).find(comp => comp.attr === attr); } } return result; } getOComponentPermissions(attr, actRoute, selector) { if (!Util.isDefined(this.permissions)) { return undefined; } let routePermissions; const genericRoutePerm = this.getComponentPermissionsUsingRoute(attr, actRoute); if (genericRoutePerm && genericRoutePerm.selector === selector) { routePermissions = genericRoutePerm; } let compPermissions; const attrPermissions = (this.permissions.components || []).find(comp => comp.attr === attr); if (attrPermissions && attrPermissions.selector === selector) { compPermissions = attrPermissions; } const permissions = { route: routePermissions, component: compPermissions }; return permissions; } getTablePermissions(attr, actRoute) { if (!Util.isDefined(this.permissions)) { return undefined; } const perm = this.getOComponentPermissions(attr, actRoute, 'o-table'); const routePerm = perm.route; const compPerm = perm.component; if (!Util.isDefined(routePerm) || !Util.isDefined(compPerm)) { return compPerm || routePerm; } const permissions = { selector: 'o-table', attr: routePerm.attr, menu: this.mergeOTableMenuPermissions(compPerm.menu, routePerm.menu), columns: this.mergeOPermissionsArrays(compPerm.columns, routePerm.columns), actions: this.mergeOPermissionsArrays(compPerm.actions, routePerm.actions), contextMenu: this.mergeOPermissionsArrays(compPerm.contextMenu, routePerm.contextMenu) }; return permissions; } getServiceBasePermissions(attr, actRoute, selector) { if (!Util.isDefined(this.permissions)) { return undefined; } const perm = this.getOComponentPermissions(attr, actRoute, selector); const routePerm = perm.route; const compPerm = perm.component; if (!Util.isDefined(routePerm) || !Util.isDefined(compPerm)) { return compPerm || routePerm; } const permissions = { selector: selector, attr: routePerm.attr, components: this.mergeOPermissionsArrays(compPerm.components, routePerm.components), actions: this.mergeOPermissionsArrays(compPerm.actions, routePerm.actions) }; return permissions; } getFormPermissions(attr, actRoute) { return this.getServiceBasePermissions(attr, actRoute, 'o-form'); } getListPermissions(attr, actRoute) { return this.getServiceBasePermissions(attr, actRoute, 'o-list'); } getGridPermissions(attr, actRoute) { return this.getServiceBasePermissions(attr, actRoute, 'o-grid'); } getTreePermissions(attr, actRoute) { return this.getServiceBasePermissions(attr, actRoute, 'o-tree'); } getMenuPermissions(attr) { let permissions; if (!Util.isDefined(this.permissions)) { return undefined; } const allMenu = this.permissions.menu || []; permissions = allMenu.find(comp => comp.attr === attr); return permissions; } getAllMenuPermissions() { if (!Util.isDefined(this.permissions)) { return undefined; } const permissions = this.permissions.menu || []; return permissions; } getOButtonPermissions(attr, actRoute) { let permissions; if (!Util.isDefined(this.permissions)) { return undefined; } permissions = this.getOComponentPermissions(attr, actRoute, 'o-button'); return permissions.component; } mergeOPermissionsArrays(permissionsA, permissionsB) { if (!Util.isDefined(permissionsA) || !Util.isDefined(permissionsB)) { return permissionsA || permissionsB; } const result = Object.assign([], permissionsA); permissionsB.forEach((perm) => { const found = result.find(r => r.attr === perm.attr); if (found) { found.visible = perm.visible; found.enabled = perm.enabled; } else { result.push(perm); } }); return result; } mergeOTableMenuPermissions(permissionsA, permissionsB) { if (!Util.isDefined(permissionsA) || !Util.isDefined(permissionsB)) { return permissionsA || permissionsB; } const result = { visible: permissionsB.visible, enabled: permissionsB.enabled, items: this.mergeOPermissionsArrays(permissionsA.items, permissionsB.items) }; return result; } isPermissionIdRouteRestricted(permissionId) { const routeData = (this.permissions.routes || []).find(route => route.permissionId === permissionId); return Util.isDefined(routeData) && routeData.enabled === false; } } PermissionsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PermissionsService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); PermissionsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PermissionsService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PermissionsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9zZXJ2aWNlcy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFXcEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQU01RSxNQUFNLE9BQU8sa0JBQWtCO0lBUTdCLFlBQXNCLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFQakMsd0JBQW1CLEdBQWlCLElBQUksT0FBTyxFQUFNLENBQUM7UUFRM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVsRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLEVBQUU7WUFDdEQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQztTQUNyRTtJQUNILENBQUM7SUFFUyxnQkFBZ0I7UUFDeEIsTUFBTSxjQUFjLEdBQVEsMEJBQTBCLENBQUM7UUFDdkQsSUFBSTtZQUNGLElBQUksQ0FBQyxrQkFB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WUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDO1NBQzVFLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsNkJBQTZCLENBQUMsWUFBb0I7UUFDaEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBQ3JHLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQztJQUNsRSxDQUFDOztnSEEzUFUsa0JBQWtCO29IQUFsQixrQkFBa0IsY0FGakIsTUFBTTs0RkFFUCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBcHBDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcvYXBwLWNvbmZpZyc7XG5pbXBvcnQgeyBPQ29tcG9uZW50UGVybWlzc2lvbnNCeVJvdXRlIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1jb21wb25lbnQtcGVybWlzc2lvbnMtYnktcm91dGUudHlwZSc7XG5pbXBvcnQgeyBPQ29tcG9uZW50UGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9vLWNvbXBvbmVudC1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9Gb3JtUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9vLWZvcm0tcGVybWlzc2lvbnMudHlwZSc7XG5pbXBvcnQgeyBPR3JpZFBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1ncmlkLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT0xpc3RQZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL28tbGlzdC1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9QZXJtaXNzaW9uc0RlZmluaXRpb24gfSBmcm9tICcuLi8uLi90eXBlcy9vLXBlcm1pc3Npb25zLWRlZmluaXRpb24udHlwZSc7XG5pbXBvcnQgeyBPUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9vLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1JvdXRlUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9vLXJvdXRlLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1RhYmxlTWVudVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1tZW51LXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1RhYmxlUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPbnRpbWl6ZUVFUGVybWlzc2lvbnNTZXJ2aWNlIH0gZnJvbSAnLi9vbnRpbWl6ZS1lZS1wZXJtaXNzaW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplUGVybWlzc2lvbnNTZXJ2aWNlIH0gZnJvbSAnLi9vbnRpbWl6ZS1wZXJtaXNzaW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IE9UcmVlUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9vLXRyZWUtcGVybWlzc2lvbnMudHlwZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25zU2VydmljZSB7XG4gIHB1YmxpYyBvbkNoYW5nZVBlcm1pc3Npb25zOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxbXT4oKTtcblxuICBwcm90ZWN0ZWQgcGVybWlzc2lvbnNTZXJ2aWNlOiBhbnk7XG4gIHByb3RlY3RlZCBvbnRpbWl6ZVBlcm1pc3Npb25zQ29uZmlnOiBhbnk7XG5cbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnNEZWZpbml0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBjb25zdCBhcHBDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChBcHBDb25maWcpLmdldENvbmZpZ3VyYXRpb24oKTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChhcHBDb25maWcucGVybWlzc2lvbnNDb25maWd1cmF0aW9uKSkge1xuICAgICAgdGhpcy5vbnRpbWl6ZVBlcm1pc3Npb25zQ29uZmlnID0gYXBwQ29uZmlnLnBlcm1pc3Npb25zQ29uZmlndXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlU2VydmljZSgpIHtcbiAgICBjb25zdCBsb2FkaW5nU2VydmljZTogYW55ID0gT250aW1pemVQZXJtaXNzaW9uc1NlcnZpY2U7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQobG9hZGluZ1NlcnZpY2UpO1xuICAgICAgaWYgKFV0aWwuaXNQZXJtaXNzaW9uc1NlcnZpY2UodGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UpKSB7XG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25zU2VydmljZSBpbnN0YW5jZW9mIE9udGltaXplUGVybWlzc2lvbnNTZXJ2aWNlKSB7XG4gICAgICAgICAgKHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlIGFzIE9udGltaXplUGVybWlzc2lvbnNTZXJ2aWNlKS5jb25maWd1cmVTZXJ2aWNlKHRoaXMub250aW1pemVQZXJtaXNzaW9uc0NvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UgaW5zdGFuY2VvZiBPbnRpbWl6ZUVFUGVybWlzc2lvbnNTZXJ2aWNlKSB7XG4gICAgICAgICAgKHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlIGFzIE9udGltaXplRUVQZXJtaXNzaW9uc1NlcnZpY2UpLmNvbmZpZ3VyZVNlcnZpY2UodGhpcy5vbnRpbWl6ZVBlcm1pc3Npb25zQ29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgcmVzdGFydCgpIHtcbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub25DaGFuZ2VQZXJtaXNzaW9ucy5uZXh0KHRoaXMucGVybWlzc2lvbnMpO1xuICB9XG5cbiAgaGFzUGVybWlzc2lvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFVzZXJQZXJtaXNzaW9uc0FzUHJvbWlzZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgPT4ge1xuICAgICAgc2VsZi5wZXJtaXNzaW9ucyA9IHt9O1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHNlbGYub250aW1pemVQZXJtaXNzaW9uc0NvbmZpZykpIHtcbiAgICAgICAgc2VsZi5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHNlbGYucXVlcnlQZXJtaXNzaW9ucygpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5UGVybWlzc2lvbnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBkYXRhT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbmV3IE9ic2VydmFibGUoaW5uZXJPYnNlcnZlciA9PiB7XG4gICAgICBzZWxmLnBlcm1pc3Npb25zU2VydmljZS5sb2FkUGVybWlzc2lvbnMoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHNlbGYucGVybWlzc2lvbnMgPSByZXM7XG4gICAgICAgIHNlbGYub25DaGFuZ2VQZXJtaXNzaW9ucy5uZXh0KHNlbGYucGVybWlzc2lvbnMpO1xuICAgICAgICBpbm5lck9ic2VydmVyLm5leHQocmVzKTtcbiAgICAgIH0sIChlcnI6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbUGVybWlzc2lvbnMucXVlcnlQZXJtaXNzaW9uc106IGVycm9yJywgZXJyKTtcbiAgICAgICAgaW5uZXJPYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgfSwgKCkgPT4ge1xuICAgICAgICBpbm5lck9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YU9ic2VydmFibGUucGlwZShzaGFyZSgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQZXJtaXNzaW9uSWRGcm9tQWN0Um91dGUoYWN0Um91dGU6IEFjdGl2YXRlZFJvdXRlKTogc3RyaW5nIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKGFjdFJvdXRlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xuICAgIGxldCBzbmFwc2hvdDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCA9IGFjdFJvdXRlLnNuYXBzaG90O1xuICAgIHJlc3VsdCA9ICgoc25hcHNob3QuZGF0YSB8fCB7fSlbJ29QZXJtaXNzaW9uJ10gfHwge30pWydwZXJtaXNzaW9uSWQnXTtcbiAgICB3aGlsZSAoVXRpbC5pc0RlZmluZWQoc25hcHNob3QuZmlyc3RDaGlsZCkgJiYgIVV0aWwuaXNEZWZpbmVkKHJlc3VsdCkpIHtcbiAgICAgIHNuYXBzaG90ID0gc25hcHNob3QuZmlyc3RDaGlsZDtcbiAgICAgIHJlc3VsdCA9ICgoc25hcHNob3QuZGF0YSB8fCB7fSlbJ29QZXJtaXNzaW9uJ10gfHwge30pWydwZXJtaXNzaW9uSWQnXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb21wb25lbnRQZXJtaXNzaW9uc1VzaW5nUm91dGUoYXR0cjogc3RyaW5nLCBhY3RSb3V0ZTogQWN0aXZhdGVkUm91dGUpOiBPQ29tcG9uZW50UGVybWlzc2lvbnMge1xuICAgIGxldCByZXN1bHQ6IE9Db21wb25lbnRQZXJtaXNzaW9ucztcbiAgICBjb25zdCBwZXJtaXNzaW9uSWQgPSB0aGlzLmdldFBlcm1pc3Npb25JZEZyb21BY3RSb3V0ZShhY3RSb3V0ZSk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHBlcm1pc3Npb25JZCkpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGVybWlzc2lvbnM6IE9Sb3V0ZVBlcm1pc3Npb25zID0gKHRoaXMucGVybWlzc2lvbnMucm91dGVzIHx8IFtdKS5maW5kKHJvdXRlID0+IHJvdXRlLnBlcm1pc3Npb25JZCA9PT0gcGVybWlzc2lvbklkKTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChyb3V0ZVBlcm1pc3Npb25zKSkge1xuICAgICAgICByZXN1bHQgPSAocm91dGVQZXJtaXNzaW9ucy5jb21wb25lbnRzIHx8IFtdKS5maW5kKGNvbXAgPT4gY29tcC5hdHRyID09PSBhdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPQ29tcG9uZW50UGVybWlzc2lvbnMoYXR0cjogc3RyaW5nLCBhY3RSb3V0ZTogQWN0aXZhdGVkUm91dGUsIHNlbGVjdG9yOiBzdHJpbmcpOiBPQ29tcG9uZW50UGVybWlzc2lvbnNCeVJvdXRlIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMucGVybWlzc2lvbnMpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgcm91dGVQZXJtaXNzaW9uczogYW55O1xuICAgIGNvbnN0IGdlbmVyaWNSb3V0ZVBlcm06IE9Db21wb25lbnRQZXJtaXNzaW9ucyA9IHRoaXMuZ2V0Q29tcG9uZW50UGVybWlzc2lvbnNVc2luZ1JvdXRlKGF0dHIsIGFjdFJvdXRlKTtcbiAgICBpZiAoZ2VuZXJpY1JvdXRlUGVybSAmJiBnZW5lcmljUm91dGVQZXJtLnNlbGVjdG9yID09PSBzZWxlY3Rvcikge1xuICAgICAgcm91dGVQZXJtaXNzaW9ucyA9IGdlbmVyaWNSb3V0ZVBlcm07XG4gICAgfVxuICAgIGxldCBjb21wUGVybWlzc2lvbnM6IGFueTtcbiAgICBjb25zdCBhdHRyUGVybWlzc2lvbnMgPSAodGhpcy5wZXJtaXNzaW9ucy5jb21wb25lbnRzIHx8IFtdKS5maW5kKGNvbXAgPT4gY29tcC5hdHRyID09PSBhdHRyKTtcbiAgICBpZiAoYXR0clBlcm1pc3Npb25zICYmIGF0dHJQZXJtaXNzaW9ucy5zZWxlY3RvciA9PT0gc2VsZWN0b3IpIHtcbiAgICAgIGNvbXBQZXJtaXNzaW9ucyA9IGF0dHJQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgY29uc3QgcGVybWlzc2lvbnM6IE9Db21wb25lbnRQZXJtaXNzaW9uc0J5Um91dGUgPSB7XG4gICAgICByb3V0ZTogcm91dGVQZXJtaXNzaW9ucyxcbiAgICAgIGNvbXBvbmVudDogY29tcFBlcm1pc3Npb25zXG4gICAgfTtcbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH1cblxuICBnZXRUYWJsZVBlcm1pc3Npb25zKGF0dHI6IHN0cmluZywgYWN0Um91dGU6IEFjdGl2YXRlZFJvdXRlKTogT1RhYmxlUGVybWlzc2lvbnMge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5wZXJtaXNzaW9ucykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHBlcm0gPSB0aGlzLmdldE9Db21wb25lbnRQZXJtaXNzaW9ucyhhdHRyLCBhY3RSb3V0ZSwgJ28tdGFibGUnKTtcbiAgICBjb25zdCByb3V0ZVBlcm06IE9UYWJsZVBlcm1pc3Npb25zID0gPE9UYWJsZVBlcm1pc3Npb25zPnBlcm0ucm91dGU7XG4gICAgY29uc3QgY29tcFBlcm06IE9UYWJsZVBlcm1pc3Npb25zID0gPE9UYWJsZVBlcm1pc3Npb25zPnBlcm0uY29tcG9uZW50O1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQocm91dGVQZXJtKSB8fCAhVXRpbC5pc0RlZmluZWQoY29tcFBlcm0pKSB7XG4gICAgICByZXR1cm4gY29tcFBlcm0gfHwgcm91dGVQZXJtO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9uczogT1RhYmxlUGVybWlzc2lvbnMgPSB7XG4gICAgICBzZWxlY3RvcjogJ28tdGFibGUnLFxuICAgICAgYXR0cjogcm91dGVQZXJtLmF0dHIsXG4gICAgICBtZW51OiB0aGlzLm1lcmdlT1RhYmxlTWVudVBlcm1pc3Npb25zKGNvbXBQZXJtLm1lbnUsIHJvdXRlUGVybS5tZW51KSxcbiAgICAgIGNvbHVtbnM6IHRoaXMubWVyZ2VPUGVybWlzc2lvbnNBcnJheXMoY29tcFBlcm0uY29sdW1ucywgcm91dGVQZXJtLmNvbHVtbnMpLFxuICAgICAgYWN0aW9uczogdGhpcy5tZXJnZU9QZXJtaXNzaW9uc0FycmF5cyhjb21wUGVybS5hY3Rpb25zLCByb3V0ZVBlcm0uYWN0aW9ucyksXG4gICAgICBjb250ZXh0TWVudTogdGhpcy5tZXJnZU9QZXJtaXNzaW9uc0FycmF5cyhjb21wUGVybS5jb250ZXh0TWVudSwgcm91dGVQZXJtLmNvbnRleHRNZW51KVxuICAgIH07XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG4gIHByaXZhdGUgZ2V0U2VydmljZUJhc2VQZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcsIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgc2VsZWN0b3I6IHN0cmluZyk6IE9Db21wb25lbnRQZXJtaXNzaW9ucyB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLnBlcm1pc3Npb25zKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcGVybSA9IHRoaXMuZ2V0T0NvbXBvbmVudFBlcm1pc3Npb25zKGF0dHIsIGFjdFJvdXRlLCBzZWxlY3Rvcik7XG4gICAgY29uc3Qgcm91dGVQZXJtOiBPQ29tcG9uZW50UGVybWlzc2lvbnMgPSBwZXJtLnJvdXRlO1xuICAgIGNvbnN0IGNvbXBQZXJtOiBPQ29tcG9uZW50UGVybWlzc2lvbnMgPSBwZXJtLmNvbXBvbmVudDtcblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQocm91dGVQZXJtKSB8fCAhVXRpbC5pc0RlZmluZWQoY29tcFBlcm0pKSB7XG4gICAgICByZXR1cm4gY29tcFBlcm0gfHwgcm91dGVQZXJtO1xuICAgIH1cblxuICAgIGNvbnN0IHBlcm1pc3Npb25zOiBPQ29tcG9uZW50UGVybWlzc2lvbnMgPSB7XG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICBhdHRyOiByb3V0ZVBlcm0uYXR0cixcbiAgICAgIGNvbXBvbmVudHM6IHRoaXMubWVyZ2VPUGVybWlzc2lvbnNBcnJheXMoY29tcFBlcm0uY29tcG9uZW50cywgcm91dGVQZXJtLmNvbXBvbmVudHMpLFxuICAgICAgYWN0aW9uczogdGhpcy5tZXJnZU9QZXJtaXNzaW9uc0FycmF5cyhjb21wUGVybS5hY3Rpb25zLCByb3V0ZVBlcm0uYWN0aW9ucylcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG4gIGdldEZvcm1QZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcsIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IE9Gb3JtUGVybWlzc2lvbnMge1xuICAgIHJldHVybiA8T0Zvcm1QZXJtaXNzaW9ucz50aGlzLmdldFNlcnZpY2VCYXNlUGVybWlzc2lvbnMoYXR0ciwgYWN0Um91dGUsICdvLWZvcm0nKTtcbiAgfVxuXG4gIGdldExpc3RQZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcsIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IE9MaXN0UGVybWlzc2lvbnMge1xuICAgIHJldHVybiA8T0xpc3RQZXJtaXNzaW9ucz50aGlzLmdldFNlcnZpY2VCYXNlUGVybWlzc2lvbnMoYXR0ciwgYWN0Um91dGUsICdvLWxpc3QnKTtcbiAgfVxuXG4gIGdldEdyaWRQZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcsIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IE9HcmlkUGVybWlzc2lvbnMge1xuICAgIHJldHVybiA8T0dyaWRQZXJtaXNzaW9ucz50aGlzLmdldFNlcnZpY2VCYXNlUGVybWlzc2lvbnMoYXR0ciwgYWN0Um91dGUsICdvLWdyaWQnKTtcbiAgfVxuXG4gIGdldFRyZWVQZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcsIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IE9UcmVlUGVybWlzc2lvbnMge1xuICAgIHJldHVybiA8T1RyZWVQZXJtaXNzaW9ucz50aGlzLmdldFNlcnZpY2VCYXNlUGVybWlzc2lvbnMoYXR0ciwgYWN0Um91dGUsICdvLXRyZWUnKTtcbiAgfVxuXG4gIGdldE1lbnVQZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcpOiBPUGVybWlzc2lvbnMge1xuICAgIGxldCBwZXJtaXNzaW9ucztcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMucGVybWlzc2lvbnMpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBhbGxNZW51OiBPUGVybWlzc2lvbnNbXSA9IHRoaXMucGVybWlzc2lvbnMubWVudSB8fCBbXTtcblxuICAgIHBlcm1pc3Npb25zID0gYWxsTWVudS5maW5kKGNvbXAgPT4gY29tcC5hdHRyID09PSBhdHRyKTtcblxuICAgIHJldHVybiBwZXJtaXNzaW9ucztcbiAgfVxuXG4gIGdldEFsbE1lbnVQZXJtaXNzaW9ucygpOiBPUGVybWlzc2lvbnNbXSB7XG5cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMucGVybWlzc2lvbnMpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zW10gPSB0aGlzLnBlcm1pc3Npb25zLm1lbnUgfHwgW107XG5cbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH1cblxuXG4gIGdldE9CdXR0b25QZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcsIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IE9QZXJtaXNzaW9ucyB7XG4gICAgbGV0IHBlcm1pc3Npb25zO1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5wZXJtaXNzaW9ucykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHBlcm1pc3Npb25zID0gdGhpcy5nZXRPQ29tcG9uZW50UGVybWlzc2lvbnMoYXR0ciwgYWN0Um91dGUsICdvLWJ1dHRvbicpO1xuXG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLmNvbXBvbmVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZU9QZXJtaXNzaW9uc0FycmF5cyhwZXJtaXNzaW9uc0E6IE9QZXJtaXNzaW9uc1tdLCBwZXJtaXNzaW9uc0I6IE9QZXJtaXNzaW9uc1tdKTogT1Blcm1pc3Npb25zW10ge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQocGVybWlzc2lvbnNBKSB8fCAhVXRpbC5pc0RlZmluZWQocGVybWlzc2lvbnNCKSkge1xuICAgICAgcmV0dXJuIHBlcm1pc3Npb25zQSB8fCBwZXJtaXNzaW9uc0I7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oW10sIHBlcm1pc3Npb25zQSk7XG4gICAgcGVybWlzc2lvbnNCLmZvckVhY2goKHBlcm06IE9QZXJtaXNzaW9ucykgPT4ge1xuICAgICAgY29uc3QgZm91bmQgPSByZXN1bHQuZmluZChyID0+IHIuYXR0ciA9PT0gcGVybS5hdHRyKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBmb3VuZC52aXNpYmxlID0gcGVybS52aXNpYmxlO1xuICAgICAgICBmb3VuZC5lbmFibGVkID0gcGVybS5lbmFibGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocGVybSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZU9UYWJsZU1lbnVQZXJtaXNzaW9ucyhwZXJtaXNzaW9uc0E6IE9UYWJsZU1lbnVQZXJtaXNzaW9ucywgcGVybWlzc2lvbnNCOiBPVGFibGVNZW51UGVybWlzc2lvbnMpOiBPVGFibGVNZW51UGVybWlzc2lvbnMge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQocGVybWlzc2lvbnNBKSB8fCAhVXRpbC5pc0RlZmluZWQocGVybWlzc2lvbnNCKSkge1xuICAgICAgcmV0dXJuIHBlcm1pc3Npb25zQSB8fCBwZXJtaXNzaW9uc0I7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHZpc2libGU6IHBlcm1pc3Npb25zQi52aXNpYmxlLFxuICAgICAgZW5hYmxlZDogcGVybWlzc2lvbnNCLmVuYWJsZWQsXG4gICAgICBpdGVtczogdGhpcy5tZXJnZU9QZXJtaXNzaW9uc0FycmF5cyhwZXJtaXNzaW9uc0EuaXRlbXMsIHBlcm1pc3Npb25zQi5pdGVtcylcbiAgICB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpc1Blcm1pc3Npb25JZFJvdXRlUmVzdHJpY3RlZChwZXJtaXNzaW9uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvdXRlRGF0YSA9ICh0aGlzLnBlcm1pc3Npb25zLnJvdXRlcyB8fCBbXSkuZmluZChyb3V0ZSA9PiByb3V0ZS5wZXJtaXNzaW9uSWQgPT09IHBlcm1pc3Npb25JZCk7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHJvdXRlRGF0YSkgJiYgcm91dGVEYXRhLmVuYWJsZWQgPT09IGZhbHNlO1xuICB9XG59XG4iXX0=