UNPKG

@formio-tmt/angular

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.

189 lines 25.9 kB
import { Injectable } from '@angular/core'; import { Formio } from '@formio-tmt/js'; import _intersection from 'lodash/intersection'; import * as i0 from "@angular/core"; import * as i1 from "@formio-tmt/angular"; import * as i2 from "./form-manager.config"; import * as i3 from "@formio-tmt/angular/auth"; class FormManagerService { appConfig; config; auth; formio; access; allAccessMap; ownAccessMap; ready; formReady; actionAllowed; form = null; formSrc = ''; perms = { delete: false, edit: false }; constructor(appConfig, config, auth) { this.appConfig = appConfig; this.config = config; this.auth = auth; if (this.appConfig && this.appConfig.appUrl) { Formio.setBaseUrl(this.appConfig.apiUrl); Formio.setProjectUrl(this.appConfig.appUrl); } else { console.error('You must provide an AppConfig within your application!'); } this.allAccessMap = { 'update_all': 'formEdit', 'delete_all': 'formDelete' }; this.ownAccessMap = { 'update_own': 'formEdit', 'delete_own': 'formDelete' }; this.actionAllowed = (action) => this.isActionAllowed(action); this.reset(); } isActionAllowed(action) { return this.access[action]; } setAccess() { this.access = { formCreate: true, formView: true, formSubmission: true, formEdit: true, formPermission: true, formDelete: true, projectSettings: true, userManagement: true }; if (this.auth) { this.access = { formCreate: false, formView: false, formSubmission: false, formEdit: false, formPermission: false, formDelete: false, projectSettings: false, userManagement: false }; this.ready = this.auth.ready.then(() => { let administrator = this.auth.roles["administrator"]; let formbuilder = this.auth.roles["formbuilder"]; let formadmin = this.auth.roles["formadmin"]; if (this.auth.user && this.auth.user.roles) { this.auth.user.roles.forEach((roleId) => { if (administrator._id === roleId) { this.access.formCreate = true; this.access.formView = true; this.access.formSubmission = true; this.access.formEdit = true; this.access.formPermission = true; this.access.formDelete = true; this.access.projectSettings = true; this.access.userManagement = true; } else { if (formadmin._id === roleId) { this.access.formCreate = this.auth.formAccess.create_all.includes(roleId); this.access.formEdit = this.auth.formAccess.update_all.includes(roleId); this.access.formPermission = this.auth.formAccess.update_all.includes(roleId); this.access.formDelete = this.auth.formAccess.delete_all.includes(roleId); this.access.formView = this.auth.formAccess.read_all.includes(roleId); this.access.formSubmission = this.auth.formAccess.read_all.includes(roleId); } if (formbuilder._id === roleId) { this.access.formCreate = this.auth.formAccess.create_all.includes(roleId); this.access.formEdit = this.auth.formAccess.update_all.includes(roleId); this.access.formPermission = this.auth.formAccess.update_all.includes(roleId); this.access.formDelete = this.auth.formAccess.delete_all.includes(roleId); this.access.formView = this.auth.formAccess.read_all.includes(roleId); } } }); } }); } else { this.ready = Promise.resolve(false); } } reset(route) { if (route) { route.params.subscribe(params => { if (params.id) { this.formio = new Formio(`${this.formio.formsUrl}/${params.id}`); } else { this.reset(); } }); } else { this.formio = new Formio(this.appConfig.appUrl); this.setAccess(); } } hasAccess(roles) { if (!this.auth.user) { return false; } return !!_intersection(roles, this.auth.user.roles).length; } setForm(form) { this.form = form; this.formSrc = this.appConfig.appUrl + '/' + form.path; if (form.access) { // Check if they have access here. form.access.forEach(access => { // Check for all access. if (this.allAccessMap[access.type] && !this.access[this.allAccessMap[access.type]]) { this.access[this.allAccessMap[access.type]] = this.hasAccess(access.roles); } // Check for own access. if (this.auth && this.auth.user && (form._id === this.auth.user._id) && this.ownAccessMap[access.type] && !this.access[this.ownAccessMap[access.type]]) { this.access[this.ownAccessMap[access.type]] = this.hasAccess(access.roles); } }); } return form; } loadForm() { this.form = null; this.formReady = this.formio.loadForm().then(form => this.setForm(form)); return this.formReady; } setSubmission(route) { return new Promise((resolve) => { route.params.subscribe(params => { this.formio = new Formio(`${this.formio.submissionsUrl}/${params.id}`); resolve(this.formio); }); }); } submissionLoaded(submission) { this.auth.ready.then(() => { this.formio.userPermissions(this.auth.user, this.form, submission).then((perms) => { this.perms.delete = perms.delete; this.perms.edit = perms.edit; }); }); } loadForms() { return this.formio.loadForms({ params: { tags: this.config.tag } }); } createForm(form) { return this.formio.createform(form); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormManagerService, deps: [{ token: i1.FormioAppConfig }, { token: i2.FormManagerConfig }, { token: i3.FormioAuthService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormManagerService }); } export { FormManagerService }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormManagerService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.FormioAppConfig }, { type: i2.FormManagerConfig }, { type: i3.FormioAuthService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWZvcm1pby9tYW5hZ2VyL3NyYy9mb3JtLW1hbmFnZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4QyxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFFaEQsTUFDYSxrQkFBa0I7SUFhcEI7SUFDQTtJQUNBO0lBZEYsTUFBTSxDQUFTO0lBQ2YsTUFBTSxDQUFNO0lBQ1osWUFBWSxDQUFNO0lBQ2xCLFlBQVksQ0FBTTtJQUNsQixLQUFLLENBQWU7SUFDcEIsU0FBUyxDQUFlO0lBQ3hCLGFBQWEsQ0FBTTtJQUNuQixJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ1osT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssR0FBRyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBRTVDLFlBQ1MsU0FBMEIsRUFDMUIsTUFBeUIsRUFDekIsSUFBdUI7UUFGdkIsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFDekIsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFFOUIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzNDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0RBQXdELENB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VSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDeEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzs2QkFDN0U7NEJBQ0QsSUFBSSxXQUFXLENBQUMsR0FBRyxLQUFLLE1BQU0sRUFBRTtnQ0FDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDeEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FD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QyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRTtnQkFDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRzthQUN0QixFQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBUztRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7dUdBdkxVLGtCQUFrQjsyR0FBbEIsa0JBQWtCOztTQUFsQixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybWlvQXBwQ29uZmlnIH0gZnJvbSAnQGZvcm1pby10bXQvYW5ndWxhcic7XHJcbmltcG9ydCB7IEZvcm1NYW5hZ2VyQ29uZmlnIH0gZnJvbSAnLi9mb3JtLW1hbmFnZXIuY29uZmlnJztcclxuaW1wb3J0IHsgRm9ybWlvIH0gZnJvbSAnQGZvcm1pby10bXQvanMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEZvcm1pb0F1dGhTZXJ2aWNlIH0gZnJvbSAnQGZvcm1pby10bXQvYW5ndWxhci9hdXRoJztcclxuaW1wb3J0IF9lYWNoIGZyb20gJ2xvZGFzaC9lYWNoJztcclxuaW1wb3J0IF9pbnRlcnNlY3Rpb24gZnJvbSAnbG9kYXNoL2ludGVyc2VjdGlvbic7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBGb3JtTWFuYWdlclNlcnZpY2Uge1xyXG4gIHB1YmxpYyBmb3JtaW86IEZvcm1pbztcclxuICBwdWJsaWMgYWNjZXNzOiBhbnk7XHJcbiAgcHVibGljIGFsbEFjY2Vzc01hcDogYW55O1xyXG4gIHB1YmxpYyBvd25BY2Nlc3NNYXA6IGFueTtcclxuICBwdWJsaWMgcmVhZHk6IFByb21pc2U8YW55PjtcclxuICBwdWJsaWMgZm9ybVJlYWR5OiBQcm9taXNlPGFueT47XHJcbiAgcHVibGljIGFjdGlvbkFsbG93ZWQ6IGFueTtcclxuICBwdWJsaWMgZm9ybSA9IG51bGw7XHJcbiAgcHVibGljIGZvcm1TcmMgPSAnJztcclxuICBwdWJsaWMgcGVybXMgPSB7ZGVsZXRlOiBmYWxzZSwgZWRpdDogZmFsc2V9O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBhcHBDb25maWc6IEZvcm1pb0FwcENvbmZpZyxcclxuICAgIHB1YmxpYyBjb25maWc6IEZvcm1NYW5hZ2VyQ29uZmlnLFxyXG4gICAgcHVibGljIGF1dGg6IEZvcm1pb0F1dGhTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5hcHBDb25maWcgJiYgdGhpcy5hcHBDb25maWcuYXBwVXJsKSB7XHJcbiAgICAgIEZvcm1pby5zZXRCYXNlVXJsKHRoaXMuYXBwQ29uZmlnLmFwaVVybCk7XHJcbiAgICAgIEZvcm1pby5zZXRQcm9qZWN0VXJsKHRoaXMuYXBwQ29uZmlnLmFwcFVybCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGFuIEFwcENvbmZpZyB3aXRoaW4geW91ciBhcHBsaWNhdGlvbiEnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFsbEFjY2Vzc01hcCA9IHtcclxuICAgICAgJ3VwZGF0ZV9hbGwnOiAnZm9ybUVkaXQnLFxyXG4gICAgICAnZGVsZXRlX2FsbCc6ICdmb3JtRGVsZXRlJ1xyXG4gICAgfTtcclxuICAgIHRoaXMub3duQWNjZXNzTWFwID0ge1xyXG4gICAgICAndXBkYXRlX293bic6ICdmb3JtRWRpdCcsXHJcbiAgICAgICdkZWxldGVfb3duJzogJ2Zvcm1EZWxldGUnXHJcbiAgICB9O1xyXG4gICAgdGhpcy5hY3Rpb25BbGxvd2VkID0gKGFjdGlvbikgPT4gdGhpcy5pc0FjdGlvbkFsbG93ZWQoYWN0aW9uKTtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIGlzQWN0aW9uQWxsb3dlZChhY3Rpb246IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuYWNjZXNzW2FjdGlvbl07XHJcbiAgfVxyXG5cclxuICBzZXRBY2Nlc3MoKSB7XHJcbiAgICB0aGlzLmFjY2VzcyA9IHtcclxuICAgICAgZm9ybUNyZWF0ZTogdHJ1ZSxcclxuICAgICAgZm9ybVZpZXc6IHRydWUsXHJcbiAgICAgIGZvcm1TdWJtaXNzaW9uOiB0cnVlLFxyXG4gICAgICBmb3JtRWRpdDogdHJ1ZSxcclxuICAgICAgZm9ybVBlcm1pc3Npb246IHRydWUsXHJcbiAgICAgIGZvcm1EZWxldGU6IHRydWUsXHJcbiAgICAgIHByb2plY3RTZXR0aW5nczogdHJ1ZSxcclxuICAgICAgdXNlck1hbmFnZW1lbnQ6IHRydWVcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy5hdXRoKSB7XHJcbiAgICAgIHRoaXMuYWNjZXNzID0ge1xyXG4gICAgICAgIGZvcm1DcmVhdGU6IGZhbHNlLFxyXG4gICAgICAgIGZvcm1WaWV3OiBmYWxzZSxcclxuICAgICAgICBmb3JtU3VibWlzc2lvbjogZmFsc2UsXHJcbiAgICAgICAgZm9ybUVkaXQ6IGZhbHNlLFxyXG4gICAgICAgIGZvcm1QZXJtaXNzaW9uOiBmYWxzZSxcclxuICAgICAgICBmb3JtRGVsZXRlOiBmYWxzZSxcclxuICAgICAgICBwcm9qZWN0U2V0dGluZ3M6IGZhbHNlLFxyXG4gICAgICAgIHVzZXJNYW5hZ2VtZW50OiBmYWxzZVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnJlYWR5ID0gdGhpcy5hdXRoLnJlYWR5LnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGxldCBhZG1pbmlzdHJhdG9yID0gdGhpcy5hdXRoLnJvbGVzW1wiYWRtaW5pc3RyYXRvclwiXTtcclxuICAgICAgICBsZXQgZm9ybWJ1aWxkZXIgPSB0aGlzLmF1dGgucm9sZXNbXCJmb3JtYnVpbGRlclwiXTtcclxuICAgICAgICBsZXQgZm9ybWFkbWluID0gdGhpcy5hdXRoLnJvbGVzW1wiZm9ybWFkbWluXCJdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hdXRoLnVzZXIgJiYgdGhpcy5hdXRoLnVzZXIucm9sZXMpIHtcclxuICAgICAgICAgIHRoaXMuYXV0aC51c2VyLnJvbGVzLmZvckVhY2goKHJvbGVJZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhZG1pbmlzdHJhdG9yLl9pZCA9PT0gcm9sZUlkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybUNyZWF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybVZpZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1TdWJtaXNzaW9uPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1FZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtUGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybURlbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MucHJvamVjdFNldHRpbmdzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy51c2VyTWFuYWdlbWVudCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvcm1hZG1pbi5faWQgPT09IHJvbGVJZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybUNyZWF0ZSA9IHRoaXMuYXV0aC5mb3JtQWNjZXNzLmNyZWF0ZV9hbGwuaW5jbHVkZXMocm9sZUlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1FZGl0ID0gdGhpcy5hdXRoLmZvcm1BY2Nlc3MudXBkYXRlX2FsbC5pbmNsdWRlcyhyb2xlSWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybVBlcm1pc3Npb24gPSB0aGlzLmF1dGguZm9ybUFjY2Vzcy51cGRhdGVfYWxsLmluY2x1ZGVzKHJvbGVJZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtRGVsZXRlID0gIHRoaXMuYXV0aC5mb3JtQWNjZXNzLmRlbGV0ZV9hbGwuaW5jbHVkZXMocm9sZUlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1WaWV3ID0gdGhpcy5hdXRoLmZvcm1BY2Nlc3MucmVhZF9hbGwuaW5jbHVkZXMocm9sZUlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1TdWJtaXNzaW9uID0gdGhpcy5hdXRoLmZvcm1BY2Nlc3MucmVhZF9hbGwuaW5jbHVkZXMocm9sZUlkKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGZvcm1idWlsZGVyLl9pZCA9PT0gcm9sZUlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtQ3JlYXRlID0gdGhpcy5hdXRoLmZvcm1BY2Nlc3MuY3JlYXRlX2FsbC5pbmNsdWRlcyhyb2xlSWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybUVkaXQgPSB0aGlzLmF1dGguZm9ybUFjY2Vzcy51cGRhdGVfYWxsLmluY2x1ZGVzKHJvbGVJZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzcy5mb3JtUGVybWlzc2lvbiA9IHRoaXMuYXV0aC5mb3JtQWNjZXNzLnVwZGF0ZV9hbGwuaW5jbHVkZXMocm9sZUlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzLmZvcm1EZWxldGUgPSAgdGhpcy5hdXRoLmZvcm1BY2Nlc3MuZGVsZXRlX2FsbC5pbmNsdWRlcyhyb2xlSWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MuZm9ybVZpZXcgPSB0aGlzLmF1dGguZm9ybUFjY2Vzcy5yZWFkX2FsbC5pbmNsdWRlcyhyb2xlSWQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVhZHkgPSBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXQocm91dGU/OiBBY3RpdmF0ZWRSb3V0ZSkge1xyXG4gICAgaWYgKHJvdXRlKSB7XHJcbiAgICAgIHJvdXRlLnBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcclxuICAgICAgICBpZiAocGFyYW1zLmlkKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1pbyA9IG5ldyBGb3JtaW8oYCR7dGhpcy5mb3JtaW8uZm9ybXNVcmx9LyR7cGFyYW1zLmlkfWApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybWlvID0gbmV3IEZvcm1pbyh0aGlzLmFwcENvbmZpZy5hcHBVcmwpO1xyXG4gICAgICB0aGlzLnNldEFjY2VzcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFzQWNjZXNzKHJvbGVzKSB7XHJcbiAgICBpZiAoIXRoaXMuYXV0aC51c2VyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAhIV9pbnRlcnNlY3Rpb24ocm9sZXMsIHRoaXMuYXV0aC51c2VyLnJvbGVzKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBzZXRGb3JtKGZvcm06IGFueSkge1xyXG4gICAgdGhpcy5mb3JtID0gZm9ybTtcclxuICAgIHRoaXMuZm9ybVNyYyA9IHRoaXMuYXBwQ29uZmlnLmFwcFVybCArICcvJyArIGZvcm0ucGF0aDtcclxuICAgIGlmIChmb3JtLmFjY2Vzcykge1xyXG4gICAgICAvLyBDaGVjayBpZiB0aGV5IGhhdmUgYWNjZXNzIGhlcmUuXHJcbiAgICAgIGZvcm0uYWNjZXNzLmZvckVhY2goYWNjZXNzID0+IHtcclxuICAgICAgICAvLyBDaGVjayBmb3IgYWxsIGFjY2Vzcy5cclxuICAgICAgICBpZiAodGhpcy5hbGxBY2Nlc3NNYXBbYWNjZXNzLnR5cGVdICYmICF0aGlzLmFjY2Vzc1t0aGlzLmFsbEFjY2Vzc01hcFthY2Nlc3MudHlwZV1dKSB7XHJcbiAgICAgICAgICB0aGlzLmFjY2Vzc1t0aGlzLmFsbEFjY2Vzc01hcFthY2Nlc3MudHlwZV1dID0gdGhpcy5oYXNBY2Nlc3MoYWNjZXNzLnJvbGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBvd24gYWNjZXNzLlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuYXV0aCAmJiB0aGlzLmF1dGgudXNlciAmJlxyXG4gICAgICAgICAgKGZvcm0uX2lkID09PSB0aGlzLmF1dGgudXNlci5faWQpICYmXHJcbiAgICAgICAgICB0aGlzLm93bkFjY2Vzc01hcFthY2Nlc3MudHlwZV0gJiZcclxuICAgICAgICAgICF0aGlzLmFjY2Vzc1t0aGlzLm93bkFjY2Vzc01hcFthY2Nlc3MudHlwZV1dXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmFjY2Vzc1t0aGlzLm93bkFjY2Vzc01hcFthY2Nlc3MudHlwZV1dID0gdGhpcy5oYXNBY2Nlc3MoYWNjZXNzLnJvbGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICBsb2FkRm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybSA9IG51bGw7XHJcbiAgICB0aGlzLmZvcm1SZWFkeSA9IHRoaXMuZm9ybWlvLmxvYWRGb3JtKCkudGhlbihmb3JtID0+IHRoaXMuc2V0Rm9ybShmb3JtKSk7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtUmVhZHk7XHJcbiAgfVxyXG5cclxuICBzZXRTdWJtaXNzaW9uKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIHJvdXRlLnBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcclxuICAgICAgICB0aGlzLmZvcm1pbyA9IG5ldyBGb3JtaW8oYCR7dGhpcy5mb3JtaW8uc3VibWlzc2lvbnNVcmx9LyR7cGFyYW1zLmlkfWApO1xyXG4gICAgICAgIHJlc29sdmUodGhpcy5mb3JtaW8pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWlzc2lvbkxvYWRlZChzdWJtaXNzaW9uOiBhbnkpIHtcclxuICAgIHRoaXMuYXV0aC5yZWFkeS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5mb3JtaW8udXNlclBlcm1pc3Npb25zKHRoaXMuYXV0aC51c2VyLCB0aGlzLmZvcm0sIHN1Ym1pc3Npb24pLnRoZW4oKHBlcm1zKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZXJtcy5kZWxldGUgPSBwZXJtcy5kZWxldGU7XHJcbiAgICAgICAgdGhpcy5wZXJtcy5lZGl0ID0gcGVybXMuZWRpdDtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRGb3JtcygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1pby5sb2FkRm9ybXMoe3BhcmFtczoge1xyXG4gICAgICB0YWdzOiB0aGlzLmNvbmZpZy50YWdcclxuICAgIH19KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUZvcm0oZm9ybTogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtaW8uY3JlYXRlZm9ybShmb3JtKTtcclxuICB9XHJcbn1cclxuIl19