angular-firebase-authorizator
Version:
Beta version of authorizator for angular linked to firebase, it creates a model in firestore to assign permissions to users an roles, and creates a view to update this permissions
161 lines • 24.3 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, Input } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { DataSource } from '@angular/cdk/table';
import { AuthorizatorService } from '../../services/authorizator.service';
import { MatDialog } from '@angular/material/dialog';
import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
import { UpsertRoleComponent } from './upsert-role/upsert-role.component';
import { DeleteRoleWarningComponent } from './delete-role-warning/delete-role-warning.component';
import { PermissionManagerComponent } from '../permission-manager/permission-manager.component';
import { ProgressbarService } from '../../services/progressbar.service';
export class RolesDatabase {
constructor() {
this.dataChange = new BehaviorSubject([]);
}
get data() { return this.dataChange.value; }
}
export class RolesDataSource extends DataSource {
constructor(rolesDatabase) {
super();
this.rolesDatabase = rolesDatabase;
}
connect() {
return this.rolesDatabase.dataChange;
}
disconnect() { }
}
let RolesComponent = class RolesComponent {
constructor(authorizatorservice, dialog, snackbar, progressbarservice) {
this.authorizatorservice = authorizatorservice;
this.dialog = dialog;
this.snackbar = snackbar;
this.progressbarservice = progressbarservice;
this.displayedColumns = ['remove', 'edit', 'role', 'permissions'];
this.rolesDatabase = new RolesDatabase();
this.roles = [];
}
ngOnInit() {
this.progressbarservice.showRolesWaitBar(true);
this.authorizatorservice.getRoles(this.rootFirebasePath).then(roles => {
if (roles) {
this.roles = roles.sort((prev, curr) => {
if (prev.data.name > curr.data.name) {
return 1;
}
if (prev.data.name < curr.data.name) {
return -1;
}
return 0;
});
this.rolesDataSource = new RolesDataSource(this.rolesDatabase);
this.rolesDatabase.dataChange.next(roles);
this.progressbarservice.showRolesWaitBar(false);
}
}).catch(error => {
console.error(error);
}).finally(() => {
this.progressbarservice.showRolesWaitBar(false);
});
}
addRole() {
const dialogRef = this.dialog.open(UpsertRoleComponent, {
width: '95%',
maxWidth: '500px',
data: { role: null, rootFirebasePath: this.rootFirebasePath }
});
dialogRef.afterClosed().subscribe(roleAdded => {
if (roleAdded) {
this.roles.push(roleAdded);
this.roles = this.roles.sort((prev, curr) => {
if (prev.data.name > curr.data.name) {
return 1;
}
if (prev.data.name < curr.data.name) {
return -1;
}
return 0;
});
this.rolesDatabase.dataChange.next(this.roles);
const config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['success-bar'];
this.snackbar.open('Role added successfully', null, config);
}
});
}
editRole(inputRole) {
const dialogRef = this.dialog.open(UpsertRoleComponent, {
width: '95%',
maxWidth: '500px',
data: { role: inputRole, rootFirebasePath: this.rootFirebasePath }
});
dialogRef.afterClosed().subscribe(roleUpdated => {
if (roleUpdated) {
const roleUpdatedIndex = this.roles.findIndex(role => role.id === roleUpdated.id);
if (roleUpdatedIndex > -1) {
this.roles[roleUpdatedIndex].data = roleUpdated.data;
this.rolesDatabase.dataChange.next(this.roles);
}
const config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['success-bar'];
this.snackbar.open('Role updated successfully', null, config);
}
});
}
removeRole(role) {
const dialogRef = this.dialog.open(DeleteRoleWarningComponent, {
width: '300px',
data: role
});
dialogRef.afterClosed().subscribe(response => {
if (response) {
this.progressbarservice.showRolesWaitBar(true);
this.authorizatorservice.removeRole(this.rootFirebasePath, role.id).then(() => {
this.roles.splice(this.roles.findIndex(roleArr => roleArr.id === role.id), 1);
this.rolesDatabase.dataChange.next(this.roles);
const config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['success-bar'];
this.snackbar.open('Role removed successfully', null, config);
this.progressbarservice.showRolesWaitBar(false);
}).catch(error => {
const config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['error-bar'];
this.snackbar.open(error.message, null, config);
});
}
});
}
setPermissions(roleInput) {
const dialogRef = this.dialog.open(PermissionManagerComponent, {
width: '95%',
maxWidth: '600px',
data: { rootFirebasePath: this.rootFirebasePath, role: roleInput }
});
}
};
RolesComponent.ctorParameters = () => [
{ type: AuthorizatorService },
{ type: MatDialog },
{ type: MatSnackBar },
{ type: ProgressbarService }
];
__decorate([
Input(),
__metadata("design:type", String)
], RolesComponent.prototype, "rootFirebasePath", void 0);
RolesComponent = __decorate([
Component({
selector: 'lib-roles',
template: "<div class=\"roles-container\">\n <button mat-raised-button (click)=\"addRole()\"><mat-icon color=\"primary\">group_add</mat-icon> Add Role</button>\n <table mat-table [dataSource]=\"rolesDataSource\" style=\"width: 100%;\">\n <!--- Note that these columns can be defined in any order.\n The actual rendered columns are set as a property on the row definition\" -->\n \n <!-- Remove Column -->\n <ng-container matColumnDef=\"remove\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'icon-column'\"></th>\n <td mat-cell *matCellDef=\"let role\" [ngClass]=\"'icon-column'\">\n <button mat-icon-button (click)=\"removeRole(role)\">\n <mat-icon color=\"primary\" aria-label=\"Remove role\">delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <!-- Edit Column -->\n <ng-container matColumnDef=\"edit\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'icon-column'\"></th>\n <td mat-cell *matCellDef=\"let role\" [ngClass]=\"'icon-column'\">\n <button mat-icon-button (click)=\"editRole(role)\">\n <mat-icon color=\"primary\" aria-label=\"Edit role\">edit</mat-icon>\n </button>\n </td>\n </ng-container>\n \n <!-- Role Column -->\n <ng-container matColumnDef=\"role\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'roles-column'\"> User </th>\n <td mat-cell *matCellDef=\"let role\" [ngClass]=\"'roles-column'\">\n <div>{{role.data.name}}</div>\n <div>{{role.data.email}}</div>\n </td>\n </ng-container>\n \n <!-- Permissions Column -->\n <ng-container matColumnDef=\"permissions\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'permissions-column'\">Permissions</th>\n <td mat-cell *matCellDef=\"let role\" [ngClass]=\"'permissions-column'\">\n <button mat-button (click)=\"setPermissions(role)\">\n <mat-icon color=\"primary\" aria-label=\"Set permissions\">vpn_key</mat-icon>\n </button>\n </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n</div>\n ",
styles: [".icon-column{-webkit-box-flex:0;flex:0 0 50px}.permissions-column{-webkit-box-flex:0;flex:0 0 100px}.roles-column{-webkit-box-flex:0;flex:0 0 300px}.roles-container{width:470px;margin:auto;padding:20px}"]
}),
__metadata("design:paramtypes", [AuthorizatorService, MatDialog,
MatSnackBar,
ProgressbarService])
], RolesComponent);
export { RolesComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1maXJlYmFzZS1hdXRob3JpemF0b3IvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9yb2xlcy9yb2xlcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFjLE1BQU0scUNBQXFDLENBQUM7QUFDdEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDakcsT0FBTyxFQUFFLDBCQUEwQixFQUFrQixNQUFNLG9EQUFvRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE1BQU0sT0FBTyxhQUFhO0lBSXhCO1FBSEEsZUFBVSxHQUErQixJQUFJLGVBQWUsQ0FBWSxFQUFFLENBQUMsQ0FBQztJQUc1RCxDQUFDO0lBRmpCLElBQUksSUFBSSxLQUFnQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztDQUd4RDtBQUVELE1BQU0sT0FBTyxlQUFnQixTQUFRLFVBQWU7SUFDbEQsWUFBb0IsYUFBNEI7UUFDOUMsS0FBSyxFQUFFLENBQUM7UUFEVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUVoRCxDQUFDO0lBRUQsT0FB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QW9CO1NBQ3JGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFBOztZQW5IZ0MsbUJBQW1CO1lBQWlCLFNBQVM7WUFDeEQsV0FBVztZQUNELGtCQUFrQjs7QUFSdkM7SUFBUixLQUFLLEVBQUU7O3dEQUEwQjtBQUR2QixjQUFjO0lBTDFCLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxXQUFXO1FBQ3JCLDZxRUFBcUM7O0tBRXRDLENBQUM7cUNBUStCLG1CQUFtQixFQUFpQixTQUFTO1FBQ3hELFdBQVc7UUFDRCxrQkFBa0I7R0FUckMsY0FBYyxDQTBIMUI7U0ExSFksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSb2xlT2JqIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9yb2xlLW9iaic7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcbmltcG9ydCB7IEF1dGhvcml6YXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRob3JpemF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIsIE1hdFNuYWNrQmFyQ29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IFVwc2VydFJvbGVDb21wb25lbnQsIERpYWxvZ0RhdGEgfSBmcm9tICcuL3Vwc2VydC1yb2xlL3Vwc2VydC1yb2xlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWxldGVSb2xlV2FybmluZ0NvbXBvbmVudCB9IGZyb20gJy4vZGVsZXRlLXJvbGUtd2FybmluZy9kZWxldGUtcm9sZS13YXJuaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uTWFuYWdlckNvbXBvbmVudCwgUGVybWlzc2lvbkRhdGEgfSBmcm9tICcuLi9wZXJtaXNzaW9uLW1hbmFnZXIvcGVybWlzc2lvbi1tYW5hZ2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9ncmVzc2JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9ncmVzc2Jhci5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFJvbGVzRGF0YWJhc2Uge1xuICBkYXRhQ2hhbmdlOiBCZWhhdmlvclN1YmplY3Q8Um9sZU9ialtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um9sZU9ialtdPihbXSk7XG4gIGdldCBkYXRhKCk6IFJvbGVPYmpbXSB7IHJldHVybiB0aGlzLmRhdGFDaGFuZ2UudmFsdWU7IH1cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuXG5leHBvcnQgY2xhc3MgUm9sZXNEYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZTxhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb2xlc0RhdGFiYXNlOiBSb2xlc0RhdGFiYXNlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGNvbm5lY3QoKTogT2JzZXJ2YWJsZTxSb2xlT2JqW10+IHtcbiAgICByZXR1cm4gdGhpcy5yb2xlc0RhdGFiYXNlLmRhdGFDaGFuZ2U7XG4gIH1cblxuICBkaXNjb25uZWN0KCkge31cbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcm9sZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vcm9sZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xlcy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvbGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcm9vdEZpcmViYXNlUGF0aDogc3RyaW5nO1xuICBwdWJsaWMgZGlzcGxheWVkQ29sdW1ucyA9IFsncmVtb3ZlJywgJ2VkaXQnLCAncm9sZScsICdwZXJtaXNzaW9ucyddO1xuICBwcml2YXRlIHJvbGVzRGF0YWJhc2UgPSBuZXcgUm9sZXNEYXRhYmFzZSgpO1xuICBwdWJsaWMgcm9sZXNEYXRhU291cmNlOiBSb2xlc0RhdGFTb3VyY2UgfCBudWxsO1xuICBwdWJsaWMgcm9sZXM6IFJvbGVPYmpbXSA9IFtdO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGhvcml6YXRvcnNlcnZpY2U6IEF1dGhvcml6YXRvclNlcnZpY2UsIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHNuYWNrYmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIHByb2dyZXNzYmFyc2VydmljZTogUHJvZ3Jlc3NiYXJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wcm9ncmVzc2JhcnNlcnZpY2Uuc2hvd1JvbGVzV2FpdEJhcih0cnVlKTtcbiAgICB0aGlzLmF1dGhvcml6YXRvcnNlcnZpY2UuZ2V0Um9sZXModGhpcy5yb290RmlyZWJhc2VQYXRoKS50aGVuKHJvbGVzID0+IHtcbiAgICAgIGlmIChyb2xlcykge1xuICAgICAgICB0aGlzLnJvbGVzID0gcm9sZXMuc29ydCgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgIGlmIChwcmV2LmRhdGEubmFtZSA+IGN1cnIuZGF0YS5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lIDwgY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvbGVzRGF0YVNvdXJjZSA9IG5ldyBSb2xlc0RhdGFTb3VyY2UodGhpcy5yb2xlc0RhdGFiYXNlKTtcbiAgICAgICAgdGhpcy5yb2xlc0RhdGFiYXNlLmRhdGFDaGFuZ2UubmV4dChyb2xlcyk7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NiYXJzZXJ2aWNlLnNob3dSb2xlc1dhaXRCYXIoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5wcm9ncmVzc2JhcnNlcnZpY2Uuc2hvd1JvbGVzV2FpdEJhcihmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRSb2xlKCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVXBzZXJ0Um9sZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc5NSUnLFxuICAgICAgbWF4V2lkdGg6ICc1MDBweCcsXG4gICAgICBkYXRhOiB7IHJvbGU6IG51bGwsIHJvb3RGaXJlYmFzZVBhdGg6IHRoaXMucm9vdEZpcmViYXNlUGF0aCB9IGFzIERpYWxvZ0RhdGFcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyb2xlQWRkZWQgPT4ge1xuICAgICAgaWYgKHJvbGVBZGRlZCkge1xuICAgICAgICB0aGlzLnJvbGVzLnB1c2gocm9sZUFkZGVkKTtcbiAgICAgICAgdGhpcy5yb2xlcyA9IHRoaXMucm9sZXMuc29ydCgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgIGlmIChwcmV2LmRhdGEubmFtZSA+IGN1cnIuZGF0YS5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lIDwgY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvbGVzRGF0YWJhc2UuZGF0YUNoYW5nZS5uZXh0KHRoaXMucm9sZXMpO1xuICAgICAgICBjb25zdCBjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnID0gbmV3IE1hdFNuYWNrQmFyQ29uZmlnKCk7XG4gICAgICAgIGNvbmZpZy5kdXJhdGlvbiA9IDMwMDA7XG4gICAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gWydzdWNjZXNzLWJhciddO1xuICAgICAgICB0aGlzLnNuYWNrYmFyLm9wZW4oJ1JvbGUgYWRkZWQgc3VjY2Vzc2Z1bGx5JywgbnVsbCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGVkaXRSb2xlKGlucHV0Um9sZTogUm9sZU9iaikge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVXBzZXJ0Um9sZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc5NSUnLFxuICAgICAgbWF4V2lkdGg6ICc1MDBweCcsXG4gICAgICBkYXRhOiB7IHJvbGU6IGlucHV0Um9sZSwgcm9vdEZpcmViYXNlUGF0aDogdGhpcy5yb290RmlyZWJhc2VQYXRoIH0gYXMgRGlhbG9nRGF0YVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJvbGVVcGRhdGVkID0+IHtcbiAgICAgIGlmIChyb2xlVXBkYXRlZCkge1xuICAgICAgICBjb25zdCByb2xlVXBkYXRlZEluZGV4ID0gdGhpcy5yb2xlcy5maW5kSW5kZXgocm9sZSA9PiByb2xlLmlkID09PSByb2xlVXBkYXRlZC5pZCk7XG4gICAgICAgIGlmIChyb2xlVXBkYXRlZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICB0aGlzLnJvbGVzW3JvbGVVcGRhdGVkSW5kZXhdLmRhdGEgPSByb2xlVXBkYXRlZC5kYXRhO1xuICAgICAgICAgIHRoaXMucm9sZXNEYXRhYmFzZS5kYXRhQ2hhbmdlLm5leHQodGhpcy5yb2xlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uZmlnOiBNYXRTbmFja0JhckNvbmZpZyA9IG5ldyBNYXRTbmFja0JhckNvbmZpZygpO1xuICAgICAgICBjb25maWcuZHVyYXRpb24gPSAzMDAwO1xuICAgICAgICBjb25maWcucGFuZWxDbGFzcyA9IFsnc3VjY2Vzcy1iYXInXTtcbiAgICAgICAgdGhpcy5zbmFja2Jhci5vcGVuKCdSb2xlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5JywgbnVsbCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZVJvbGUocm9sZTogUm9sZU9iaikge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVsZXRlUm9sZVdhcm5pbmdDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMzAwcHgnLFxuICAgICAgZGF0YTogcm9sZVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICB0aGlzLnByb2dyZXNzYmFyc2VydmljZS5zaG93Um9sZXNXYWl0QmFyKHRydWUpO1xuICAgICAgICB0aGlzLmF1dGhvcml6YXRvcnNlcnZpY2UucmVtb3ZlUm9sZSh0aGlzLnJvb3RGaXJlYmFzZVBhdGgsIHJvbGUuaWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMucm9sZXMuc3BsaWNlKFxuICAgICAgICAgICAgdGhpcy5yb2xlcy5maW5kSW5kZXgocm9sZUFyciA9PiByb2xlQXJyLmlkID09PSByb2xlLmlkKSwgMVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yb2xlc0RhdGFiYXNlLmRhdGFDaGFuZ2UubmV4dCh0aGlzLnJvbGVzKTtcbiAgICAgICAgICBjb25zdCBjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnID0gbmV3IE1hdFNuYWNrQmFyQ29uZmlnKCk7XG4gICAgICAgICAgY29uZmlnLmR1cmF0aW9uID0gMzAwMDtcbiAgICAgICAgICBjb25maWcucGFuZWxDbGFzcyA9IFsnc3VjY2Vzcy1iYXInXTtcbiAgICAgICAgICB0aGlzLnNuYWNrYmFyLm9wZW4oJ1JvbGUgcmVtb3ZlZCBzdWNjZXNzZnVsbHknLCBudWxsLCBjb25maWcpO1xuICAgICAgICAgIHRoaXMucHJvZ3Jlc3NiYXJzZXJ2aWNlLnNob3dSb2xlc1dhaXRCYXIoZmFsc2UpO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc3QgY29uZmlnOiBNYXRTbmFja0JhckNvbmZpZyA9IG5ldyBNYXRTbmFja0JhckNvbmZpZygpO1xuICAgICAgICAgIGNvbmZpZy5kdXJhdGlvbiA9IDMwMDA7XG4gICAgICAgICAgY29uZmlnLnBhbmVsQ2xhc3MgPSBbJ2Vycm9yLWJhciddO1xuICAgICAgICAgIHRoaXMuc25hY2tiYXIub3BlbihlcnJvci5tZXNzYWdlLCBudWxsLCBjb25maWcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFBlcm1pc3Npb25zKHJvbGVJbnB1dDogUm9sZU9iaikge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUGVybWlzc2lvbk1hbmFnZXJDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnOTUlJyxcbiAgICAgIG1heFdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YTogeyByb290RmlyZWJhc2VQYXRoOiB0aGlzLnJvb3RGaXJlYmFzZVBhdGgsIHJvbGU6IHJvbGVJbnB1dCB9IGFzIFBlcm1pc3Npb25EYXRhXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==