@myrmidon/auth-jwt-admin 1.0.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/esm2022/lib/auth-jwt-admin.module.mjs +120 -0
  2. package/esm2022/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +165 -0
  3. package/esm2022/lib/components/confirm-dialog/confirm-dialog.component.mjs +30 -0
  4. package/esm2022/lib/components/password-strength-bar/password-strength-bar.component.mjs +81 -0
  5. package/esm2022/lib/components/state/user-list.repository.mjs +145 -0
  6. package/esm2022/lib/components/user-editor/user-editor.component.mjs +113 -0
  7. package/esm2022/lib/components/user-filter/user-filter.component.mjs +56 -0
  8. package/esm2022/lib/components/user-list/user-list.component.mjs +71 -0
  9. package/esm2022/lib/services/auth-jwt-account.service.mjs +182 -0
  10. package/esm2022/lib/services/dialog.service.mjs +38 -0
  11. package/{esm2020 → esm2022}/lib/validators/password.validators.mjs +48 -48
  12. package/{esm2020 → esm2022}/myrmidon-auth-jwt-admin.mjs +4 -4
  13. package/{esm2020 → esm2022}/public-api.mjs +12 -12
  14. package/fesm2022/myrmidon-auth-jwt-admin.mjs +992 -0
  15. package/fesm2022/myrmidon-auth-jwt-admin.mjs.map +1 -0
  16. package/index.d.ts +5 -5
  17. package/lib/auth-jwt-admin.module.d.ts +30 -30
  18. package/lib/components/auth-jwt-registration/auth-jwt-registration.component.d.ts +37 -37
  19. package/lib/components/confirm-dialog/confirm-dialog.component.d.ts +15 -15
  20. package/lib/components/password-strength-bar/password-strength-bar.component.d.ts +17 -17
  21. package/lib/components/state/user-list.repository.d.ts +36 -36
  22. package/lib/components/user-editor/user-editor.component.d.ts +29 -29
  23. package/lib/components/user-filter/user-filter.component.d.ts +21 -21
  24. package/lib/components/user-list/user-list.component.d.ts +29 -28
  25. package/lib/services/auth-jwt-account.service.d.ts +114 -114
  26. package/lib/services/dialog.service.d.ts +19 -19
  27. package/lib/validators/password.validators.d.ts +6 -6
  28. package/package.json +24 -17
  29. package/public-api.d.ts +8 -8
  30. package/esm2020/lib/auth-jwt-admin.module.mjs +0 -119
  31. package/esm2020/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +0 -164
  32. package/esm2020/lib/components/confirm-dialog/confirm-dialog.component.mjs +0 -29
  33. package/esm2020/lib/components/password-strength-bar/password-strength-bar.component.mjs +0 -80
  34. package/esm2020/lib/components/state/user-list.repository.mjs +0 -144
  35. package/esm2020/lib/components/user-editor/user-editor.component.mjs +0 -112
  36. package/esm2020/lib/components/user-filter/user-filter.component.mjs +0 -55
  37. package/esm2020/lib/components/user-list/user-list.component.mjs +0 -69
  38. package/esm2020/lib/services/auth-jwt-account.service.mjs +0 -181
  39. package/esm2020/lib/services/dialog.service.mjs +0 -37
  40. package/fesm2015/myrmidon-auth-jwt-admin.mjs +0 -997
  41. package/fesm2015/myrmidon-auth-jwt-admin.mjs.map +0 -1
  42. package/fesm2020/myrmidon-auth-jwt-admin.mjs +0 -991
  43. package/fesm2020/myrmidon-auth-jwt-admin.mjs.map +0 -1
@@ -1,112 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { Validators, } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/forms";
5
- import * as i2 from "@myrmidon/auth-jwt-login";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "@angular/material/button";
8
- import * as i5 from "@angular/material/checkbox";
9
- import * as i6 from "@angular/material/icon";
10
- import * as i7 from "@angular/material/input";
11
- import * as i8 from "@angular/material/form-field";
12
- import * as i9 from "@angular/material/tooltip";
13
- export class UserEditorComponent {
14
- constructor(formBuilder, _authService) {
15
- this._authService = _authService;
16
- // events
17
- this.userChange = new EventEmitter();
18
- this.editorClose = new EventEmitter();
19
- // form
20
- this.email = formBuilder.control(null, [
21
- Validators.required,
22
- Validators.email,
23
- ]);
24
- this.emailConfirmed = formBuilder.control(false);
25
- this.lockoutEnabled = formBuilder.control(false);
26
- this.firstName = formBuilder.control(null, [
27
- Validators.required,
28
- Validators.maxLength(50),
29
- ]);
30
- this.lastName = formBuilder.control(null, [
31
- Validators.required,
32
- Validators.maxLength(50),
33
- ]);
34
- this.roles = formBuilder.control(null, Validators.maxLength(200));
35
- this.form = formBuilder.group({
36
- email: this.email,
37
- emailConfirmed: this.emailConfirmed,
38
- lockoutEnabled: this.lockoutEnabled,
39
- firstName: this.firstName,
40
- lastName: this.lastName,
41
- roles: this.roles,
42
- });
43
- }
44
- set user(value) {
45
- this._user = value;
46
- this.updateForm(value);
47
- }
48
- get user() {
49
- return this._user;
50
- }
51
- ngOnInit() { }
52
- updateForm(user) {
53
- if (!user) {
54
- this.form.reset();
55
- }
56
- else {
57
- this.email.setValue(user.email);
58
- this.emailConfirmed.setValue(user.emailConfirmed);
59
- this.lockoutEnabled.setValue(user.lockoutEnabled);
60
- this.firstName.setValue(user.firstName);
61
- this.lastName.setValue(user.lastName);
62
- if (user.roles?.length > 0) {
63
- this.roles.setValue(user.roles.join(' '));
64
- }
65
- else {
66
- this.roles.setValue(null);
67
- }
68
- }
69
- }
70
- getUserFromForm() {
71
- return {
72
- userName: this._user?.userName || '',
73
- email: this.email.value,
74
- emailConfirmed: this.emailConfirmed.value,
75
- lockoutEnabled: this.lockoutEnabled.value,
76
- firstName: this.firstName.value,
77
- lastName: this.lastName.value,
78
- roles: this.roles.value
79
- ? this.roles.value.split(' ').filter((s) => s)
80
- : [],
81
- };
82
- }
83
- endLockout() {
84
- if (this.unlocked) {
85
- return;
86
- }
87
- this._user.lockoutEnd = this._authService.getUTCDate();
88
- this.unlocked = true;
89
- }
90
- close() {
91
- this.editorClose.emit();
92
- }
93
- save() {
94
- if (this.form.invalid) {
95
- return;
96
- }
97
- this.userChange.emit(this.getUserFromForm());
98
- }
99
- }
100
- UserEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: UserEditorComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.AuthJwtService }], target: i0.ɵɵFactoryTarget.Component });
101
- UserEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: { user: "user" }, outputs: { userChange: "userChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- email -->\r\n <mat-form-field>\r\n <mat-label>email</mat-label>\r\n <input type=\"text\" matInput [formControl]=\"email\" />\r\n <mat-error\r\n *ngIf=\"email.hasError('required') && (email.dirty || email.touched)\"\r\n >\r\n email address required\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"email.hasError('pattern') && (email.dirty || email.touched)\"\r\n >\r\n invalid email address\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <!-- emailConfirmed -->\r\n <mat-checkbox [formControl]=\"emailConfirmed\"\r\n >email address confirmed</mat-checkbox\r\n >\r\n </div>\r\n\r\n <!-- lockoutEnabled -->\r\n <div class=\"form-row\">\r\n <mat-checkbox [formControl]=\"lockoutEnabled\">lockout enabled</mat-checkbox>\r\n <button\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"endLockout()\"\r\n [disabled]=\"unlocked\"\r\n matTooltip=\"Unlock this user if locked\"\r\n >\r\n <mat-icon>lock_open</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- firstName -->\r\n <mat-form-field>\r\n <mat-label>first name</mat-label>\r\n <input type=\"text\" matInput [formControl]=\"firstName\" />\r\n <mat-error\r\n *ngIf=\"\r\n firstName.hasError('required') &&\r\n (firstName.dirty || firstName.touched)\r\n \"\r\n >\r\n first name required\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"\r\n firstName.hasError('maxlength') &&\r\n (firstName.dirty || firstName.touched)\r\n \"\r\n >\r\n first name too long\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <!-- lastName -->\r\n <mat-form-field>\r\n <mat-label>last name</mat-label>\r\n <input type=\"text\" matInput [formControl]=\"lastName\" />\r\n <mat-error\r\n *ngIf=\"\r\n lastName.hasError('required') && (lastName.dirty || lastName.touched)\r\n \"\r\n >\r\n last name required\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"\r\n lastName.hasError('maxlength') && (lastName.dirty || lastName.touched)\r\n \"\r\n >\r\n last name too long\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- roles -->\r\n <div>\r\n <mat-form-field style=\"width: 16em\">\r\n <mat-label>roles</mat-label>\r\n <input type=\"text\" matInput [formControl]=\"roles\" />\r\n <mat-error\r\n *ngIf=\"roles.hasError('maxlength') && (roles.dirty || roles.touched)\"\r\n >\r\n too long\r\n </mat-error>\r\n <mat-hint>roles (separated by space)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <br />\r\n <div>\r\n <button mat-icon-button color=\"warn\" matTooltip=\"Close\" (click)=\"close()\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"form.invalid\"\r\n matTooltip=\"Save user\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: UserEditorComponent, decorators: [{
103
- type: Component,
104
- args: [{ selector: 'auth-jwt-user-editor', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- email -->\r\n <mat-form-field>\r\n <mat-label>email</mat-label>\r\n <input type=\"text\" matInput [formControl]=\"email\" />\r\n <mat-error\r\n *ngIf=\"email.hasError('required') && (email.dirty || email.touched)\"\r\n >\r\n email address required\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"email.hasError('pattern') && (email.dirty || email.touched)\"\r\n >\r\n invalid email address\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <!-- emailConfirmed -->\r\n <mat-checkbox [formControl]=\"emailConfirmed\"\r\n >email address confirmed</mat-checkbox\r\n >\r\n </div>\r\n\r\n <!-- lockoutEnabled -->\r\n <div class=\"form-row\">\r\n <mat-checkbox [formControl]=\"lockoutEnabled\">lockout enabled</mat-checkbox>\r\n <button\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"endLockout()\"\r\n [disabled]=\"unlocked\"\r\n matTooltip=\"Unlock this user if locked\"\r\n >\r\n <mat-icon>lock_open</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"form-row\">\r\n <!-- firstName -->\r\n <mat-form-field>\r\n <mat-label>first name</mat-label>\r\n <input type=\"text\" matInput [formControl]=\"firstName\" />\r\n <mat-error\r\n *ngIf=\"\r\n firstName.hasError('required') &&\r\n (firstName.dirty || firstName.touched)\r\n \"\r\n >\r\n first name required\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"\r\n firstName.hasError('maxlength') &&\r\n (firstName.dirty || firstName.touched)\r\n \"\r\n >\r\n first name too long\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <!-- lastName -->\r\n <mat-form-field>\r\n <mat-label>last name</mat-label>\r\n <input type=\"text\" matInput [formControl]=\"lastName\" />\r\n <mat-error\r\n *ngIf=\"\r\n lastName.hasError('required') && (lastName.dirty || lastName.touched)\r\n \"\r\n >\r\n last name required\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"\r\n lastName.hasError('maxlength') && (lastName.dirty || lastName.touched)\r\n \"\r\n >\r\n last name too long\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- roles -->\r\n <div>\r\n <mat-form-field style=\"width: 16em\">\r\n <mat-label>roles</mat-label>\r\n <input type=\"text\" matInput [formControl]=\"roles\" />\r\n <mat-error\r\n *ngIf=\"roles.hasError('maxlength') && (roles.dirty || roles.touched)\"\r\n >\r\n too long\r\n </mat-error>\r\n <mat-hint>roles (separated by space)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- buttons -->\r\n <br />\r\n <div>\r\n <button mat-icon-button color=\"warn\" matTooltip=\"Close\" (click)=\"close()\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"form.invalid\"\r\n matTooltip=\"Save user\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
105
- }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.AuthJwtService }]; }, propDecorators: { user: [{
106
- type: Input
107
- }], userChange: [{
108
- type: Output
109
- }], editorClose: [{
110
- type: Output
111
- }] } });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZWRpdG9yL3VzZXItZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWVkaXRvci91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFReEIsTUFBTSxPQUFPLG1CQUFtQjtJQXdCOUIsWUFBWSxXQUErQixFQUFVLFlBQTRCO1FBQTVCLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUMvRSxTQUFTO1FBQ1QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMzQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtZQUNyQyxVQUFVLENBQUMsUUFBUTtZQUNuQixVQUFVLENBQUMsS0FBSztTQUNqQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDekMsVUFBVSxDQUFDLFFBQVE7WUFDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDekIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtZQUN4QyxVQUFVLENBQUMsUUFBUTtZQUNuQixVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztTQUN6QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNuQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQXhDRCxJQUFvQixJQUFJLENBQUMsS0FBdUI7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFvQ0QsUUFBUSxLQUFVLENBQUM7SUFFWCxVQUFVLENBQUMsSUFBc0I7UUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDbkI7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDM0M7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDM0I7U0FDRjtJQUNILENBQUM7SUFFTyxlQUFlO1FBQ3JCLE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLElBQUksRUFBRTtZQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQ3ZCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUs7WUFDekMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSztZQUN6QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1lBQy9CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7WUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztnQkFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLEVBQUU7U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEtBQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7O2dIQXpHVSxtQkFBbUI7b0dBQW5CLG1CQUFtQix5SkNkaEMsdXVHQWlIQTsyRkRuR2EsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLHNCQUFzQjtzSUFpQlosSUFBSTtzQkFBdkIsS0FBSztnQkFRSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXV0aEp3dFNlcnZpY2UsIFVzZXIgfSBmcm9tICdAbXlybWlkb24vYXV0aC1qd3QtbG9naW4nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdXRoLWp3dC11c2VyLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItZWRpdG9yLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX3VzZXI6IFVzZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGVtYWlsOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBlbWFpbENvbmZpcm1lZDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwdWJsaWMgbG9ja291dEVuYWJsZWQ6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHVibGljIGZpcnN0TmFtZTogVW50eXBlZEZvcm1Db250cm9sO1xuICBwdWJsaWMgbGFzdE5hbWU6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHVibGljIHJvbGVzOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gIHB1YmxpYyB1bmxvY2tlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKSBwdWJsaWMgc2V0IHVzZXIodmFsdWU6IFVzZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl91c2VyID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHVzZXIoKTogVXNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBAT3V0cHV0KCkgdXNlckNoYW5nZTogRXZlbnRFbWl0dGVyPFVzZXI+O1xuICBAT3V0cHV0KCkgZWRpdG9yQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgX2F1dGhTZXJ2aWNlOiBBdXRoSnd0U2VydmljZSkge1xuICAgIC8vIGV2ZW50c1xuICAgIHRoaXMudXNlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlcj4oKTtcbiAgICB0aGlzLmVkaXRvckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgLy8gZm9ybVxuICAgIHRoaXMuZW1haWwgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICBWYWxpZGF0b3JzLmVtYWlsLFxuICAgIF0pO1xuICAgIHRoaXMuZW1haWxDb25maXJtZWQgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlKTtcbiAgICB0aGlzLmxvY2tvdXRFbmFibGVkID0gZm9ybUJ1aWxkZXIuY29udHJvbChmYWxzZSk7XG4gICAgdGhpcy5maXJzdE5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXG4gICAgXSk7XG4gICAgdGhpcy5sYXN0TmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcbiAgICBdKTtcbiAgICB0aGlzLnJvbGVzID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyMDApKTtcblxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsLFxuICAgICAgZW1haWxDb25maXJtZWQ6IHRoaXMuZW1haWxDb25maXJtZWQsXG4gICAgICBsb2Nrb3V0RW5hYmxlZDogdGhpcy5sb2Nrb3V0RW5hYmxlZCxcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5maXJzdE5hbWUsXG4gICAgICBsYXN0TmFtZTogdGhpcy5sYXN0TmFtZSxcbiAgICAgIHJvbGVzOiB0aGlzLnJvbGVzLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIHByaXZhdGUgdXBkYXRlRm9ybSh1c2VyOiBVc2VyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWFpbC5zZXRWYWx1ZSh1c2VyLmVtYWlsKTtcbiAgICAgIHRoaXMuZW1haWxDb25maXJtZWQuc2V0VmFsdWUodXNlci5lbWFpbENvbmZpcm1lZCk7XG4gICAgICB0aGlzLmxvY2tvdXRFbmFibGVkLnNldFZhbHVlKHVzZXIubG9ja291dEVuYWJsZWQpO1xuICAgICAgdGhpcy5maXJzdE5hbWUuc2V0VmFsdWUodXNlci5maXJzdE5hbWUpO1xuICAgICAgdGhpcy5sYXN0TmFtZS5zZXRWYWx1ZSh1c2VyLmxhc3ROYW1lKTtcbiAgICAgIGlmICh1c2VyLnJvbGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucm9sZXMuc2V0VmFsdWUodXNlci5yb2xlcy5qb2luKCcgJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yb2xlcy5zZXRWYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJGcm9tRm9ybSgpOiBVc2VyIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlck5hbWU6IHRoaXMuX3VzZXI/LnVzZXJOYW1lIHx8ICcnLFxuICAgICAgZW1haWw6IHRoaXMuZW1haWwudmFsdWUsXG4gICAgICBlbWFpbENvbmZpcm1lZDogdGhpcy5lbWFpbENvbmZpcm1lZC52YWx1ZSxcbiAgICAgIGxvY2tvdXRFbmFibGVkOiB0aGlzLmxvY2tvdXRFbmFibGVkLnZhbHVlLFxuICAgICAgZmlyc3ROYW1lOiB0aGlzLmZpcnN0TmFtZS52YWx1ZSxcbiAgICAgIGxhc3ROYW1lOiB0aGlzLmxhc3ROYW1lLnZhbHVlLFxuICAgICAgcm9sZXM6IHRoaXMucm9sZXMudmFsdWVcbiAgICAgICAgPyB0aGlzLnJvbGVzLnZhbHVlLnNwbGl0KCcgJykuZmlsdGVyKChzOiBzdHJpbmcpID0+IHMpXG4gICAgICAgIDogW10sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBlbmRMb2Nrb3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVubG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3VzZXIhLmxvY2tvdXRFbmQgPSB0aGlzLl9hdXRoU2VydmljZS5nZXRVVENEYXRlKCk7XG4gICAgdGhpcy51bmxvY2tlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JDbG9zZS5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51c2VyQ2hhbmdlLmVtaXQodGhpcy5nZXRVc2VyRnJvbUZvcm0oKSk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8IS0tIGVtYWlsIC0tPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPmVtYWlsPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJlbWFpbFwiIC8+XHJcbiAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAqbmdJZj1cImVtYWlsLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKVwiXHJcbiAgICAgID5cclxuICAgICAgICBlbWFpbCBhZGRyZXNzIHJlcXVpcmVkXHJcbiAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCJlbWFpbC5oYXNFcnJvcigncGF0dGVybicpICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKVwiXHJcbiAgICAgID5cclxuICAgICAgICBpbnZhbGlkIGVtYWlsIGFkZHJlc3NcclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDwhLS0gZW1haWxDb25maXJtZWQgLS0+XHJcbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbF09XCJlbWFpbENvbmZpcm1lZFwiXHJcbiAgICAgID5lbWFpbCBhZGRyZXNzIGNvbmZpcm1lZDwvbWF0LWNoZWNrYm94XHJcbiAgICA+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gbG9ja291dEVuYWJsZWQgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbF09XCJsb2Nrb3V0RW5hYmxlZFwiPmxvY2tvdXQgZW5hYmxlZDwvbWF0LWNoZWNrYm94PlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgKGNsaWNrKT1cImVuZExvY2tvdXQoKVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJ1bmxvY2tlZFwiXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJVbmxvY2sgdGhpcyB1c2VyIGlmIGxvY2tlZFwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5sb2NrX29wZW48L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgPCEtLSBmaXJzdE5hbWUgLS0+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWw+Zmlyc3QgbmFtZTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZmlyc3ROYW1lXCIgLz5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBmaXJzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiZcclxuICAgICAgICAgIChmaXJzdE5hbWUuZGlydHkgfHwgZmlyc3ROYW1lLnRvdWNoZWQpXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIGZpcnN0IG5hbWUgcmVxdWlyZWRcclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgZmlyc3ROYW1lLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSAmJlxyXG4gICAgICAgICAgKGZpcnN0TmFtZS5kaXJ0eSB8fCBmaXJzdE5hbWUudG91Y2hlZClcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAgZmlyc3QgbmFtZSB0b28gbG9uZ1xyXG4gICAgICA8L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPCEtLSBsYXN0TmFtZSAtLT5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD5sYXN0IG5hbWU8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImxhc3ROYW1lXCIgLz5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBsYXN0TmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiAobGFzdE5hbWUuZGlydHkgfHwgbGFzdE5hbWUudG91Y2hlZClcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAgbGFzdCBuYW1lIHJlcXVpcmVkXHJcbiAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgIGxhc3ROYW1lLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSAmJiAobGFzdE5hbWUuZGlydHkgfHwgbGFzdE5hbWUudG91Y2hlZClcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAgbGFzdCBuYW1lIHRvbyBsb25nXHJcbiAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSByb2xlcyAtLT5cclxuICA8ZGl2PlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwid2lkdGg6IDE2ZW1cIj5cclxuICAgICAgPG1hdC1sYWJlbD5yb2xlczwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicm9sZXNcIiAvPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCJyb2xlcy5oYXNFcnJvcignbWF4bGVuZ3RoJykgJiYgKHJvbGVzLmRpcnR5IHx8IHJvbGVzLnRvdWNoZWQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHRvbyBsb25nXHJcbiAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICA8bWF0LWhpbnQ+cm9sZXMgKHNlcGFyYXRlZCBieSBzcGFjZSk8L21hdC1oaW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBidXR0b25zIC0tPlxyXG4gIDxiciAvPlxyXG4gIDxkaXY+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiBtYXRUb29sdGlwPVwiQ2xvc2VcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxyXG4gICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIlxyXG4gICAgICBtYXRUb29sdGlwPVwiU2F2ZSB1c2VyXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=
@@ -1,55 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/forms";
4
- import * as i2 from "../state/user-list.repository";
5
- import * as i3 from "@angular/material/button";
6
- import * as i4 from "@angular/material/icon";
7
- import * as i5 from "@angular/material/input";
8
- import * as i6 from "@angular/material/form-field";
9
- import * as i7 from "@angular/material/tooltip";
10
- export class UserFilterComponent {
11
- constructor(formBuilder, _repository) {
12
- this._repository = _repository;
13
- this.filter$ = _repository.filter$;
14
- // form
15
- this.name = formBuilder.control(null);
16
- this.form = formBuilder.group({
17
- name: this.name,
18
- });
19
- }
20
- ngOnInit() {
21
- this.filter$.subscribe((f) => {
22
- this.updateForm(f);
23
- });
24
- }
25
- updateForm(filter) {
26
- this.name.setValue(filter.name || null);
27
- this.form.markAsPristine();
28
- }
29
- reset() {
30
- this.form.reset();
31
- this.apply();
32
- }
33
- getFilter() {
34
- return {
35
- name: this.name.value?.trim(),
36
- };
37
- }
38
- apply() {
39
- if (this.form.invalid) {
40
- return;
41
- }
42
- const filter = this.getFilter();
43
- // update filter in state
44
- this._repository.setFilter(filter);
45
- }
46
- }
47
- UserFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: UserFilterComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UserListRepository }], target: i0.ɵɵFactoryTarget.Component });
48
- UserFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: { disabled: "disabled" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label>name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n style=\"margin-top: -20px\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
49
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: UserFilterComponent, decorators: [{
50
- type: Component,
51
- args: [{ selector: 'auth-jwt-user-filter', template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label>name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n style=\"margin-top: -20px\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
52
- }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.UserListRepository }]; }, propDecorators: { disabled: [{
53
- type: Input
54
- }] } });
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZmlsdGVyL3VzZXItZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWZpbHRlci91c2VyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBWXpELE1BQU0sT0FBTyxtQkFBbUI7SUFTOUIsWUFDRSxXQUF3QixFQUNoQixXQUErQjtRQUEvQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFFdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBRW5DLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQWtCO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVoQyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQzs7Z0hBcERVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDhGQ1poQyx3MEJBOEJBOzJGRGxCYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0Usc0JBQXNCO21JQU16QixRQUFRO3NCQURkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFVzZXJGaWx0ZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLWp3dC1hY2NvdW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyTGlzdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9zdGF0ZS91c2VyLWxpc3QucmVwb3NpdG9yeSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2F1dGgtand0LXVzZXItZmlsdGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3VzZXItZmlsdGVyLmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRpc2FibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgZmlsdGVyJDogT2JzZXJ2YWJsZTxVc2VyRmlsdGVyPjtcclxuXHJcbiAgcHVibGljIG5hbWU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBfcmVwb3NpdG9yeTogVXNlckxpc3RSZXBvc2l0b3J5XHJcbiAgKSB7XHJcbiAgICB0aGlzLmZpbHRlciQgPSBfcmVwb3NpdG9yeS5maWx0ZXIkO1xyXG5cclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMubmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlciQuc3Vic2NyaWJlKChmKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlRm9ybShmKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKGZpbHRlcjogVXNlckZpbHRlcik6IHZvaWQge1xyXG4gICAgdGhpcy5uYW1lLnNldFZhbHVlKGZpbHRlci5uYW1lIHx8IG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgIHRoaXMuYXBwbHkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmlsdGVyKCk6IFVzZXJGaWx0ZXIge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLnZhbHVlPy50cmltKCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFwcGx5KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyKCk7XHJcblxyXG4gICAgLy8gdXBkYXRlIGZpbHRlciBpbiBzdGF0ZVxyXG4gICAgdGhpcy5fcmVwb3NpdG9yeS5zZXRGaWx0ZXIoZmlsdGVyKTtcclxuICB9XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJhcHBseSgpXCIgbmctZGlzYWJsZWQ9XCJkaXNhYmxlZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPm5hbWUgb3IgSUQ8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJuYW1lXCIgLz5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIChjbGljayk9XCJyZXNldCgpXCJcclxuICAgICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAgIG1hdFRvb2x0aXA9XCJSZXNldCBmaWx0ZXJzXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxidXR0b25cclxuICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiAtMjBweFwiXHJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgbWF0VG9vbHRpcD1cIkFwcGx5IGZpbHRlcnNcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==
@@ -1,69 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import { take } from 'rxjs/operators';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../state/user-list.repository";
5
- import * as i2 from "../../services/dialog.service";
6
- import * as i3 from "@myrmidon/auth-jwt-login";
7
- import * as i4 from "@angular/common";
8
- import * as i5 from "@angular/material/button";
9
- import * as i6 from "@angular/material/expansion";
10
- import * as i7 from "@angular/material/icon";
11
- import * as i8 from "@angular/material/paginator";
12
- import * as i9 from "@angular/material/progress-bar";
13
- import * as i10 from "@angular/material/tooltip";
14
- import * as i11 from "../user-filter/user-filter.component";
15
- import * as i12 from "../user-editor/user-editor.component";
16
- export class UserListComponent {
17
- constructor(_repository, _dialogService, _gravatarService) {
18
- this._repository = _repository;
19
- this._dialogService = _dialogService;
20
- this._gravatarService = _gravatarService;
21
- this.pagination$ = _repository.pagination$;
22
- this.active$ = _repository.activeUser$;
23
- this.loading$ = _repository.loading$;
24
- }
25
- pageChange(event) {
26
- this._repository.loadPage(event.pageIndex + 1, event.pageSize);
27
- }
28
- deleteUser(user) {
29
- this._dialogService
30
- .confirm('Confirm', `Delete User ${user.userName}?`)
31
- .pipe(take(1))
32
- .subscribe((yes) => {
33
- if (!yes) {
34
- return;
35
- }
36
- this._repository.deleteUser(user.userName).finally(() => {
37
- this._repository.clearCache();
38
- this._repository.loadPage(1);
39
- });
40
- });
41
- }
42
- setActiveUser(user) {
43
- this._repository.setActive(user?.userName || null);
44
- }
45
- resetActiveUser() {
46
- this._repository.setActive(null);
47
- }
48
- saveActiveUser(user) {
49
- this._repository.updateActive(user);
50
- this._repository.setActive(null);
51
- }
52
- onUserEditorClose() {
53
- this._repository.setActive(null);
54
- }
55
- getGravatarUrl(email, size = 80) {
56
- return this._gravatarService.buildGravatarUrl(email, size);
57
- }
58
- clearCache() {
59
- this._repository.clearCache();
60
- this._repository.loadPage(1);
61
- }
62
- }
63
- UserListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: UserListComponent, deps: [{ token: i1.UserListRepository }, { token: i2.DialogService }, { token: i3.GravatarService }], target: i0.ɵɵFactoryTarget.Component });
64
- UserListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: UserListComponent, selector: "auth-jwt-user-list", ngImport: i0, template: "<div id=\"container\">\r\n <div>\r\n <!-- filters -->\r\n <div style=\"grid-area: filters\">\r\n <auth-jwt-user-filter></auth-jwt-user-filter>\r\n </div>\r\n\r\n <!-- list -->\r\n <div style=\"grid-area: list\" *ngIf=\"pagination$ | async as pagination\">\r\n <div *ngIf=\"loading$ | async\" gdArea=\"progress\">\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n </div>\r\n <table>\r\n <thead>\r\n <td></td>\r\n <td></td>\r\n <th>name</th>\r\n <th class=\"noif-lt-md\">first</th>\r\n <th class=\"noif-lt-md\">last</th>\r\n <th class=\"noif-lt-md\">email</th>\r\n <th>roles</th>\r\n <th class=\"noif-lt-md\">lock end</th>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let user of pagination.data\">\r\n <td>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Edit {{ user.userName }}\"\r\n color=\"primary\"\r\n (click)=\"setActiveUser(user)\"\r\n >\r\n <mat-icon>mode_edit</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Delete {{ user.userName }}\"\r\n color=\"warn\"\r\n (click)=\"deleteUser(user)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n <img\r\n [src]=\"getGravatarUrl(user.email, 32)\"\r\n [alt]=\"user.userName\"\r\n />\r\n </td>\r\n <td>{{ user.userName }}</td>\r\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\r\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\r\n <td class=\"noif-lt-md\">\r\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\r\n </td>\r\n <td>{{ user.roles.join(\" \") }}</td>\r\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- paginator -->\r\n <div style=\"grid-area: paginator; justify-content: end\" class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Clear items cache\"\r\n (click)=\"clearCache()\"\r\n >\r\n <mat-icon>autorenew</mat-icon>\r\n </button>\r\n\r\n <mat-paginator\r\n gdArea=\"pager\"\r\n gdAlignColumns=\"center\"\r\n gdAlignRows=\"start\"\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.perPage\"\r\n [pageSizeOptions]=\"[20, 50, 75, 100]\"\r\n [pageIndex]=\"pagination.currentPage - 1\"\r\n [showFirstLastButtons]=\"true\"\r\n (page)=\"pageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- editor -->\r\n <mat-expansion-panel style=\"grid-area: editor\"\r\n [expanded]=\"active$ | async\"\r\n [disabled]=\"!(active$ | async)\"\r\n >\r\n <div *ngIf=\"active$ | async as active\">\r\n <fieldset>\r\n <legend>{{ active.userName }}</legend>\r\n <auth-jwt-user-editor\r\n [user]=\"active\"\r\n (userChange)=\"saveActiveUser($event)\"\r\n (editorClose)=\"resetActiveUser()\"\r\n ></auth-jwt-user-editor>\r\n </fieldset>\r\n </div>\r\n </mat-expansion-panel>\r\n</div>\r\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.command{width:24px}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#container{display:grid;grid-template-rows:auto 1fr auto auto;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));grid-template-areas:\"filters\" \"list\" \"paginator\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.UserFilterComponent, selector: "auth-jwt-user-filter", inputs: ["disabled"] }, { kind: "component", type: i12.UserEditorComponent, selector: "auth-jwt-user-editor", inputs: ["user"], outputs: ["userChange", "editorClose"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
65
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: UserListComponent, decorators: [{
66
- type: Component,
67
- args: [{ selector: 'auth-jwt-user-list', template: "<div id=\"container\">\r\n <div>\r\n <!-- filters -->\r\n <div style=\"grid-area: filters\">\r\n <auth-jwt-user-filter></auth-jwt-user-filter>\r\n </div>\r\n\r\n <!-- list -->\r\n <div style=\"grid-area: list\" *ngIf=\"pagination$ | async as pagination\">\r\n <div *ngIf=\"loading$ | async\" gdArea=\"progress\">\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n </div>\r\n <table>\r\n <thead>\r\n <td></td>\r\n <td></td>\r\n <th>name</th>\r\n <th class=\"noif-lt-md\">first</th>\r\n <th class=\"noif-lt-md\">last</th>\r\n <th class=\"noif-lt-md\">email</th>\r\n <th>roles</th>\r\n <th class=\"noif-lt-md\">lock end</th>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let user of pagination.data\">\r\n <td>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Edit {{ user.userName }}\"\r\n color=\"primary\"\r\n (click)=\"setActiveUser(user)\"\r\n >\r\n <mat-icon>mode_edit</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Delete {{ user.userName }}\"\r\n color=\"warn\"\r\n (click)=\"deleteUser(user)\"\r\n >\r\n <mat-icon>remove_circle</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n <img\r\n [src]=\"getGravatarUrl(user.email, 32)\"\r\n [alt]=\"user.userName\"\r\n />\r\n </td>\r\n <td>{{ user.userName }}</td>\r\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\r\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\r\n <td class=\"noif-lt-md\">\r\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\r\n </td>\r\n <td>{{ user.roles.join(\" \") }}</td>\r\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- paginator -->\r\n <div style=\"grid-area: paginator; justify-content: end\" class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Clear items cache\"\r\n (click)=\"clearCache()\"\r\n >\r\n <mat-icon>autorenew</mat-icon>\r\n </button>\r\n\r\n <mat-paginator\r\n gdArea=\"pager\"\r\n gdAlignColumns=\"center\"\r\n gdAlignRows=\"start\"\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.perPage\"\r\n [pageSizeOptions]=\"[20, 50, 75, 100]\"\r\n [pageIndex]=\"pagination.currentPage - 1\"\r\n [showFirstLastButtons]=\"true\"\r\n (page)=\"pageChange($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- editor -->\r\n <mat-expansion-panel style=\"grid-area: editor\"\r\n [expanded]=\"active$ | async\"\r\n [disabled]=\"!(active$ | async)\"\r\n >\r\n <div *ngIf=\"active$ | async as active\">\r\n <fieldset>\r\n <legend>{{ active.userName }}</legend>\r\n <auth-jwt-user-editor\r\n [user]=\"active\"\r\n (userChange)=\"saveActiveUser($event)\"\r\n (editorClose)=\"resetActiveUser()\"\r\n ></auth-jwt-user-editor>\r\n </fieldset>\r\n </div>\r\n </mat-expansion-panel>\r\n</div>\r\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.command{width:24px}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#container{display:grid;grid-template-rows:auto 1fr auto auto;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));grid-template-areas:\"filters\" \"list\" \"paginator\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}\n"] }]
68
- }], ctorParameters: function () { return [{ type: i1.UserListRepository }, { type: i2.DialogService }, { type: i3.GravatarService }]; } });
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQWN0QyxNQUFNLE9BQU8saUJBQWlCO0lBSzVCLFlBQ1UsV0FBK0IsRUFDL0IsY0FBNkIsRUFDN0IsZ0JBQWlDO1FBRmpDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBRXpDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBZ0I7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTSxVQUFVLENBQUMsSUFBVTtRQUMxQixJQUFJLENBQUMsY0FBYzthQUNoQixPQUFPLENBQUMsU0FBUyxFQUFFLGVBQWUsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDO2FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYixTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNSLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO2dCQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGFBQWEsQ0FBQyxJQUFpQjtRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBVTtRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxjQUFjLENBQUMsS0FBYSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQzVDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7OEdBMURVLGlCQUFpQjtrR0FBakIsaUJBQWlCLDBEQ2pCOUIsNG1IQTJHQTsyRkQxRmEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBQYWdpbmF0aW9uRGF0YSB9IGZyb20gJ0BuZ25lYXQvZWxmLXBhZ2luYXRpb24nO1xyXG5cclxuaW1wb3J0IHsgR3JhdmF0YXJTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcclxuXHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJMaXN0UmVwb3NpdG9yeSB9IGZyb20gJy4uL3N0YXRlL3VzZXItbGlzdC5yZXBvc2l0b3J5JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtdXNlci1saXN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1saXN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91c2VyLWxpc3QuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckxpc3RDb21wb25lbnQge1xyXG4gIHB1YmxpYyBwYWdpbmF0aW9uJDogT2JzZXJ2YWJsZTxQYWdpbmF0aW9uRGF0YSAmIHsgZGF0YTogVXNlcltdIH0+O1xyXG4gIHB1YmxpYyBhY3RpdmUkOiBPYnNlcnZhYmxlPFVzZXIgfCB1bmRlZmluZWQ+O1xyXG4gIHB1YmxpYyBsb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9yZXBvc2l0b3J5OiBVc2VyTGlzdFJlcG9zaXRvcnksXHJcbiAgICBwcml2YXRlIF9kaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZ3JhdmF0YXJTZXJ2aWNlOiBHcmF2YXRhclNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMucGFnaW5hdGlvbiQgPSBfcmVwb3NpdG9yeS5wYWdpbmF0aW9uJDtcclxuICAgIHRoaXMuYWN0aXZlJCA9IF9yZXBvc2l0b3J5LmFjdGl2ZVVzZXIkO1xyXG4gICAgdGhpcy5sb2FkaW5nJCA9IF9yZXBvc2l0b3J5LmxvYWRpbmckO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVwb3NpdG9yeS5sb2FkUGFnZShldmVudC5wYWdlSW5kZXggKyAxLCBldmVudC5wYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlVXNlcih1c2VyOiBVc2VyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kaWFsb2dTZXJ2aWNlXHJcbiAgICAgIC5jb25maXJtKCdDb25maXJtJywgYERlbGV0ZSBVc2VyICR7dXNlci51c2VyTmFtZX0/YClcclxuICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgLnN1YnNjcmliZSgoeWVzKSA9PiB7XHJcbiAgICAgICAgaWYgKCF5ZXMpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmVwb3NpdG9yeS5kZWxldGVVc2VyKHVzZXIudXNlck5hbWUpLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fcmVwb3NpdG9yeS5jbGVhckNhY2hlKCk7XHJcbiAgICAgICAgICB0aGlzLl9yZXBvc2l0b3J5LmxvYWRQYWdlKDEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRBY3RpdmVVc2VyKHVzZXI6IFVzZXIgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnNldEFjdGl2ZSh1c2VyPy51c2VyTmFtZSB8fCBudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldEFjdGl2ZVVzZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnNldEFjdGl2ZShudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlQWN0aXZlVXNlcih1c2VyOiBVc2VyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnVwZGF0ZUFjdGl2ZSh1c2VyKTtcclxuICAgIHRoaXMuX3JlcG9zaXRvcnkuc2V0QWN0aXZlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVXNlckVkaXRvckNsb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVwb3NpdG9yeS5zZXRBY3RpdmUobnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0R3JhdmF0YXJVcmwoZW1haWw6IHN0cmluZywgc2l6ZSA9IDgwKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ3JhdmF0YXJTZXJ2aWNlLmJ1aWxkR3JhdmF0YXJVcmwoZW1haWwsIHNpemUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LmNsZWFyQ2FjaGUoKTtcclxuICAgIHRoaXMuX3JlcG9zaXRvcnkubG9hZFBhZ2UoMSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgaWQ9XCJjb250YWluZXJcIj5cclxuICA8ZGl2PlxyXG4gICAgPCEtLSBmaWx0ZXJzIC0tPlxyXG4gICAgPGRpdiBzdHlsZT1cImdyaWQtYXJlYTogZmlsdGVyc1wiPlxyXG4gICAgICA8YXV0aC1qd3QtdXNlci1maWx0ZXI+PC9hdXRoLWp3dC11c2VyLWZpbHRlcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gbGlzdCAtLT5cclxuICAgIDxkaXYgc3R5bGU9XCJncmlkLWFyZWE6IGxpc3RcIiAqbmdJZj1cInBhZ2luYXRpb24kIHwgYXN5bmMgYXMgcGFnaW5hdGlvblwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZyQgfCBhc3luY1wiIGdkQXJlYT1cInByb2dyZXNzXCI+XHJcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8dGFibGU+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRkPjwvdGQ+XHJcbiAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgIDx0aD5uYW1lPC90aD5cclxuICAgICAgICAgIDx0aCBjbGFzcz1cIm5vaWYtbHQtbWRcIj5maXJzdDwvdGg+XHJcbiAgICAgICAgICA8dGggY2xhc3M9XCJub2lmLWx0LW1kXCI+bGFzdDwvdGg+XHJcbiAgICAgICAgICA8dGggY2xhc3M9XCJub2lmLWx0LW1kXCI+ZW1haWw8L3RoPlxyXG4gICAgICAgICAgPHRoPnJvbGVzPC90aD5cclxuICAgICAgICAgIDx0aCBjbGFzcz1cIm5vaWYtbHQtbWRcIj5sb2NrIGVuZDwvdGg+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHVzZXIgb2YgcGFnaW5hdGlvbi5kYXRhXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkVkaXQge3sgdXNlci51c2VyTmFtZSB9fVwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEFjdGl2ZVVzZXIodXNlcilcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb2RlX2VkaXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRGVsZXRlIHt7IHVzZXIudXNlck5hbWUgfX1cIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVVc2VyKHVzZXIpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImdldEdyYXZhdGFyVXJsKHVzZXIuZW1haWwsIDMyKVwiXHJcbiAgICAgICAgICAgICAgICBbYWx0XT1cInVzZXIudXNlck5hbWVcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyB1c2VyLnVzZXJOYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibm9pZi1sdC1tZFwiPnt7IHVzZXIuZmlyc3ROYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibm9pZi1sdC1tZFwiPnt7IHVzZXIubGFzdE5hbWUgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJub2lmLWx0LW1kXCI+XHJcbiAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiJ21haWx0bzonICsgdXNlci5lbWFpbFwiPnt7IHVzZXIuZW1haWwgfX08L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyB1c2VyLnJvbGVzLmpvaW4oXCIgXCIpIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibm9pZi1sdC1tZFwiPnt7IHVzZXIubG9ja291dEVuZCB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgICA8IS0tIHBhZ2luYXRvciAtLT5cclxuICAgICAgPGRpdiBzdHlsZT1cImdyaWQtYXJlYTogcGFnaW5hdG9yOyBqdXN0aWZ5LWNvbnRlbnQ6IGVuZFwiIGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJDbGVhciBpdGVtcyBjYWNoZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiY2xlYXJDYWNoZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24+YXV0b3JlbmV3PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPG1hdC1wYWdpbmF0b3JcclxuICAgICAgICAgIGdkQXJlYT1cInBhZ2VyXCJcclxuICAgICAgICAgIGdkQWxpZ25Db2x1bW5zPVwiY2VudGVyXCJcclxuICAgICAgICAgIGdkQWxpZ25Sb3dzPVwic3RhcnRcIlxyXG4gICAgICAgICAgW2xlbmd0aF09XCJwYWdpbmF0aW9uLnRvdGFsXCJcclxuICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdpbmF0aW9uLnBlclBhZ2VcIlxyXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbMjAsIDUwLCA3NSwgMTAwXVwiXHJcbiAgICAgICAgICBbcGFnZUluZGV4XT1cInBhZ2luYXRpb24uY3VycmVudFBhZ2UgLSAxXCJcclxuICAgICAgICAgIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCJcclxuICAgICAgICAgIChwYWdlKT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvbWF0LXBhZ2luYXRvcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBlZGl0b3IgLS0+XHJcbiAgPG1hdC1leHBhbnNpb24tcGFuZWwgc3R5bGU9XCJncmlkLWFyZWE6IGVkaXRvclwiXHJcbiAgICBbZXhwYW5kZWRdPVwiYWN0aXZlJCB8IGFzeW5jXCJcclxuICAgIFtkaXNhYmxlZF09XCIhKGFjdGl2ZSQgfCBhc3luYylcIlxyXG4gID5cclxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmUkIHwgYXN5bmMgYXMgYWN0aXZlXCI+XHJcbiAgICAgIDxmaWVsZHNldD5cclxuICAgICAgICA8bGVnZW5kPnt7IGFjdGl2ZS51c2VyTmFtZSB9fTwvbGVnZW5kPlxyXG4gICAgICAgIDxhdXRoLWp3dC11c2VyLWVkaXRvclxyXG4gICAgICAgICAgW3VzZXJdPVwiYWN0aXZlXCJcclxuICAgICAgICAgICh1c2VyQ2hhbmdlKT1cInNhdmVBY3RpdmVVc2VyKCRldmVudClcIlxyXG4gICAgICAgICAgKGVkaXRvckNsb3NlKT1cInJlc2V0QWN0aXZlVXNlcigpXCJcclxuICAgICAgICA+PC9hdXRoLWp3dC11c2VyLWVkaXRvcj5cclxuICAgICAgPC9maWVsZHNldD5cclxuICAgIDwvZGl2PlxyXG4gIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -1,181 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { HttpParams } from '@angular/common/http';
3
- import { retry, catchError } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common/http";
6
- import * as i2 from "@myrmidon/ng-tools";
7
- export class AuthJwtAccountService {
8
- constructor(_http, _error, _env) {
9
- this._http = _http;
10
- this._error = _error;
11
- this._env = _env;
12
- }
13
- /**
14
- * Checks if the specified email address is registered on the server.
15
- * @param email email address to test.
16
- * @returns result.
17
- */
18
- isEmailRegistered(email) {
19
- return this._http.get(this._env.get('apiUrl') +
20
- 'accounts/emailexists/' +
21
- encodeURIComponent(email));
22
- }
23
- /**
24
- * Checks if the specified user's given name is registered on the server.
25
- * This name is a nickname chosen by users during registration, and is the key
26
- * used for referencing users when talking to the server.
27
- * @param name name to test.
28
- * @returns result.
29
- */
30
- isNameRegistered(name) {
31
- return this._http.get(this._env.get('apiUrl') +
32
- 'accounts/nameexists/' +
33
- encodeURIComponent(name));
34
- }
35
- /**
36
- * Register the user with the specified registration data.
37
- * @param registration The registration data.
38
- * @param confirmed True to automatically confirm the user's email address
39
- * without sending the confirmation email message.
40
- */
41
- register(registration, confirmed = false) {
42
- return this._http.post(this._env.get('apiUrl') +
43
- 'accounts/register' +
44
- (confirmed ? '?confirmed=true' : ''), registration);
45
- }
46
- /**
47
- * Resend the confirmation email to the specified address.
48
- * @param email address.
49
- */
50
- resendConfirmEmail(email) {
51
- return this._http.get(this._env.get('apiUrl') +
52
- 'accounts/resendconfirm/' +
53
- encodeURIComponent(email)
54
- // options
55
- );
56
- }
57
- /**
58
- * Request a password reset for the specified email address.
59
- * @param email Email address.
60
- */
61
- requestPasswordReset(email) {
62
- return this._http.post(this._env.get('apiUrl') + 'accounts/resetpassword/request', { email });
63
- }
64
- getAllUsers() {
65
- return this._http
66
- .get(this._env.get('apiUrl') + 'users', {
67
- params: new HttpParams().set('pageNumber', '1'),
68
- })
69
- .pipe(retry(3), catchError(this._error.handleError));
70
- }
71
- getUsers(filter, pageNumber = 1, pageSize = 20) {
72
- let httpParams = new HttpParams();
73
- httpParams = httpParams.set('pageNumber', pageNumber.toString());
74
- httpParams = httpParams.set('pageSize', pageSize.toString());
75
- if (filter.name) {
76
- httpParams = httpParams.set('name', filter.name);
77
- }
78
- return this._http
79
- .get(this._env.get('apiUrl') + 'users', {
80
- params: httpParams,
81
- })
82
- .pipe(retry(3), catchError(this._error.handleError));
83
- }
84
- /**
85
- * Get the top N users matching the specified name filter.
86
- * @param nameFilter The user name filter.
87
- * @param limit The maximum number of users to get.
88
- */
89
- getTopUsers(nameFilter, limit = 10) {
90
- let httpParams = new HttpParams();
91
- httpParams = httpParams.set('pageNumber', '1');
92
- httpParams = httpParams.set('pageSize', limit.toString());
93
- if (nameFilter) {
94
- httpParams = httpParams.set('name', nameFilter);
95
- }
96
- const options = httpParams.keys().length > 0
97
- ? {
98
- params: httpParams,
99
- }
100
- : {};
101
- return this._http
102
- .get(this._env.get('apiUrl') + 'users', options)
103
- .pipe(retry(3), catchError(this._error.handleError));
104
- }
105
- /**
106
- * Get information about all the users listed in the specified names.
107
- * @param names User(s) names.
108
- */
109
- getUsersFromNames(names) {
110
- let httpParams = new HttpParams();
111
- if (names && names.length > 0) {
112
- httpParams = httpParams.set('names', names.join(','));
113
- }
114
- const options = httpParams.keys().length > 0
115
- ? {
116
- params: httpParams,
117
- }
118
- : {};
119
- return this._http
120
- .get(this._env.get('apiUrl') + 'users-from-names', options)
121
- .pipe(retry(3), catchError(this._error.handleError));
122
- }
123
- /**
124
- * Get data about the specified user.
125
- * @param name The user name.
126
- */
127
- getUser(name) {
128
- return this._http
129
- .get(this._env.get('apiUrl') + 'users/' + name)
130
- .pipe(retry(3), catchError(this._error.handleError));
131
- }
132
- /**
133
- * Update the editable data for the specified user.
134
- * @param user The user to update.
135
- */
136
- updateUser(user) {
137
- return this._http
138
- .put(this._env.get('apiUrl') +
139
- 'users' +
140
- (user.emailConfirmed ? '?confirmed=true' : ''), user)
141
- .pipe(catchError(this._error.handleError));
142
- }
143
- /**
144
- * Request a password reset email for the specified email address.
145
- * @param email The email address to receive the reset message.
146
- */
147
- resetPassword(email) {
148
- return this._http
149
- .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {
150
- email: email,
151
- })
152
- .pipe(catchError(this._error.handleError));
153
- }
154
- /**
155
- * Change the password.
156
- * @param change The password change data.
157
- */
158
- changePassword(change) {
159
- return this._http
160
- .post(this._env.get('apiUrl') + 'accounts/changepassword', change)
161
- .pipe(catchError(this._error.handleError));
162
- }
163
- /**
164
- * Delete the user with the specified username.
165
- * @param name The user name.
166
- */
167
- deleteUser(name) {
168
- return this._http
169
- .delete(this._env.get('apiUrl') + 'accounts/' + name)
170
- .pipe(catchError(this._error.handleError));
171
- }
172
- }
173
- AuthJwtAccountService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: AuthJwtAccountService, deps: [{ token: i1.HttpClient }, { token: i2.ErrorService }, { token: i2.EnvService }], target: i0.ɵɵFactoryTarget.Injectable });
174
- AuthJwtAccountService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: AuthJwtAccountService, providedIn: 'root' });
175
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: AuthJwtAccountService, decorators: [{
176
- type: Injectable,
177
- args: [{
178
- providedIn: 'root',
179
- }]
180
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ErrorService }, { type: i2.EnvService }]; } });
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoLWp3dC1hY2NvdW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQTRDbkQsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUNVLEtBQWlCLEVBQ2pCLE1BQW9CLEVBQ3BCLElBQWdCO1FBRmhCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQ3ZCLENBQUM7SUFFSjs7OztPQUlHO0lBQ0ksaUJBQWlCLENBQUMsS0FBYTtRQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDckIsdUJBQXVCO1lBQ3ZCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQixDQUFDLElBQVk7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ3JCLHNCQUFzQjtZQUN0QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FDM0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVEsQ0FDYixZQUErQixFQUMvQixTQUFTLEdBQUcsS0FBSztRQUVqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDckIsbUJBQW1CO1lBQ25CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3RDLFlBQVksQ0FDYixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLGtCQUFrQixDQUFDLEtBQWE7UUFDckMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ3JCLHlCQUF5QjtZQUN6QixrQkFBa0IsQ0FBQyxLQUFLLENBQUM7UUFDM0IsVUFBVTtTQUNYLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksb0JBQW9CLENBQUMsS0FBYTtRQUN2QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxnQ0FBZ0MsRUFDMUQsRUFBRSxLQUFLLEVBQUUsQ0FDVixDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLEdBQUcsQ0FBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxFQUFFO1lBQ3RELE1BQU0sRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO1NBQ2hELENBQUM7YUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLFFBQVEsQ0FDYixNQUFrQixFQUNsQixVQUFVLEdBQUcsQ0FBQyxFQUNkLFFBQVEsR0FBRyxFQUFFO1FBRWIsSUFBSSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNsQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDakUsVUFBVSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUNmLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEQ7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsR0FBRyxDQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLEVBQUU7WUFDdEQsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQzthQUNELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxVQUFrQixFQUFFLEtBQUssR0FBRyxFQUFFO1FBQy9DLElBQUksVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbEMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLFVBQVUsRUFBRTtZQUNkLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNqRDtRQUNELE1BQU0sT0FBTyxHQUNYLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUMxQixDQUFDLENBQUM7Z0JBQ0UsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVQsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLEdBQUcsQ0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLEVBQUUsT0FBTyxDQUFDO2FBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksaUJBQWlCLENBQUMsS0FBZTtRQUN0QyxJQUFJLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxNQUFNLE9BQU8sR0FDWCxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDMUIsQ0FBQyxDQUFDO2dCQUNFLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVULE9BQU8sSUFBSSxDQUFDLEtBQUs7YUFDZCxHQUFHLENBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsT0FBTyxDQUFDO2FBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksT0FBTyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLEdBQUcsQ0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDO2FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLElBQVU7UUFDMUIsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLEdBQUcsQ0FDRixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDckIsT0FBTztZQUNQLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNoRCxJQUFJLENBQ0w7YUFDQSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksYUFBYSxDQUFDLEtBQWE7UUFDaEMsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxnQ0FBZ0MsRUFBRTtZQUNoRSxLQUFLLEVBQUUsS0FBSztTQUNiLENBQUM7YUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksY0FBYyxDQUFDLE1BQXNCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEtBQUs7YUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcseUJBQXlCLEVBQUUsTUFBTSxDQUFDO2FBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7a0hBM01VLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRnBCLE1BQU07MkZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyByZXRyeSwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IERhdGFQYWdlLCBFbnZTZXJ2aWNlLCBFcnJvclNlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcclxuXHJcbi8qKlxyXG4gKiBVc2VyIHJlZ2lzdHJhdGlvbiBtb2RlbC4gWW91IGNhbiBleHBhbmQgdGhpcyBpbnRlcmZhY2UgdG8gYWRkIG1vcmUgZGF0YS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cmF0aW9uTW9kZWwge1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGZpcnN0TmFtZT86IHN0cmluZztcclxuICBsYXN0TmFtZT86IHN0cmluZztcclxuICBwYXNzd29yZDogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzdWx0IG9mIGFuIGV4aXN0aW5nIHJlc291cmNlIGNoZWNrLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBFeGlzdFJlc3VsdCB7XHJcbiAgZW50cnk6IHN0cmluZztcclxuICBpc0V4aXN0aW5nOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogUGFzc3dvcmQgY2hhbmdlIGRhdGEuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkQ2hhbmdlIHtcclxuICBlbWFpbDogc3RyaW5nO1xyXG4gIG9sZFBhc3N3b3JkOiBzdHJpbmc7XHJcbiAgbmV3UGFzc3dvcmQ6IHN0cmluZztcclxuICBjb25maXJtUGFzc3dvcmQ6IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIFVzZXIgZmlsdGVyIHBhcmFtZXRlcnMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJGaWx0ZXIge1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoSnd0QWNjb3VudFNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgX2Vycm9yOiBFcnJvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9lbnY6IEVudlNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGVtYWlsIGFkZHJlc3MgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgc2VydmVyLlxyXG4gICAqIEBwYXJhbSBlbWFpbCBlbWFpbCBhZGRyZXNzIHRvIHRlc3QuXHJcbiAgICogQHJldHVybnMgcmVzdWx0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0VtYWlsUmVnaXN0ZXJlZChlbWFpbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxFeGlzdFJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PEV4aXN0UmVzdWx0PihcclxuICAgICAgdGhpcy5fZW52LmdldCgnYXBpVXJsJykgK1xyXG4gICAgICAgICdhY2NvdW50cy9lbWFpbGV4aXN0cy8nICtcclxuICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoZW1haWwpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgdXNlcidzIGdpdmVuIG5hbWUgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgc2VydmVyLlxyXG4gICAqIFRoaXMgbmFtZSBpcyBhIG5pY2tuYW1lIGNob3NlbiBieSB1c2VycyBkdXJpbmcgcmVnaXN0cmF0aW9uLCBhbmQgaXMgdGhlIGtleVxyXG4gICAqIHVzZWQgZm9yIHJlZmVyZW5jaW5nIHVzZXJzIHdoZW4gdGFsa2luZyB0byB0aGUgc2VydmVyLlxyXG4gICAqIEBwYXJhbSBuYW1lIG5hbWUgdG8gdGVzdC5cclxuICAgKiBAcmV0dXJucyByZXN1bHQuXHJcbiAgICovXHJcbiAgcHVibGljIGlzTmFtZVJlZ2lzdGVyZWQobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxFeGlzdFJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PEV4aXN0UmVzdWx0PihcclxuICAgICAgdGhpcy5fZW52LmdldCgnYXBpVXJsJykgK1xyXG4gICAgICAgICdhY2NvdW50cy9uYW1lZXhpc3RzLycgK1xyXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIHRoZSB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RyYXRpb24gZGF0YS5cclxuICAgKiBAcGFyYW0gcmVnaXN0cmF0aW9uIFRoZSByZWdpc3RyYXRpb24gZGF0YS5cclxuICAgKiBAcGFyYW0gY29uZmlybWVkIFRydWUgdG8gYXV0b21hdGljYWxseSBjb25maXJtIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzc1xyXG4gICAqIHdpdGhvdXQgc2VuZGluZyB0aGUgY29uZmlybWF0aW9uIGVtYWlsIG1lc3NhZ2UuXHJcbiAgICovXHJcbiAgcHVibGljIHJlZ2lzdGVyKFxyXG4gICAgcmVnaXN0cmF0aW9uOiBSZWdpc3RyYXRpb25Nb2RlbCxcclxuICAgIGNvbmZpcm1lZCA9IGZhbHNlXHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwLnBvc3QoXHJcbiAgICAgIHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICtcclxuICAgICAgICAnYWNjb3VudHMvcmVnaXN0ZXInICtcclxuICAgICAgICAoY29uZmlybWVkID8gJz9jb25maXJtZWQ9dHJ1ZScgOiAnJyksXHJcbiAgICAgIHJlZ2lzdHJhdGlvblxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2VuZCB0aGUgY29uZmlybWF0aW9uIGVtYWlsIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy5cclxuICAgKiBAcGFyYW0gZW1haWwgYWRkcmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZW5kQ29uZmlybUVtYWlsKGVtYWlsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0KFxyXG4gICAgICB0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArXHJcbiAgICAgICAgJ2FjY291bnRzL3Jlc2VuZGNvbmZpcm0vJyArXHJcbiAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGVtYWlsKVxyXG4gICAgICAvLyBvcHRpb25zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVxdWVzdCBhIHBhc3N3b3JkIHJlc2V0IGZvciB0aGUgc3BlY2lmaWVkIGVtYWlsIGFkZHJlc3MuXHJcbiAgICogQHBhcmFtIGVtYWlsIEVtYWlsIGFkZHJlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIHJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdChcclxuICAgICAgdGhpcy5fZW52LmdldCgnYXBpVXJsJykgKyAnYWNjb3VudHMvcmVzZXRwYXNzd29yZC9yZXF1ZXN0JyxcclxuICAgICAgeyBlbWFpbCB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFsbFVzZXJzKCk6IE9ic2VydmFibGU8RGF0YVBhZ2U8VXNlcj4+IHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgIC5nZXQ8RGF0YVBhZ2U8VXNlcj4+KHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICsgJ3VzZXJzJywge1xyXG4gICAgICAgIHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ3BhZ2VOdW1iZXInLCAnMScpLFxyXG4gICAgICB9KVxyXG4gICAgICAucGlwZShyZXRyeSgzKSwgY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFVzZXJzKFxyXG4gICAgZmlsdGVyOiBVc2VyRmlsdGVyLFxyXG4gICAgcGFnZU51bWJlciA9IDEsXHJcbiAgICBwYWdlU2l6ZSA9IDIwXHJcbiAgKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxVc2VyPj4ge1xyXG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuc2V0KCdwYWdlTnVtYmVyJywgcGFnZU51bWJlci50b1N0cmluZygpKTtcclxuICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLnNldCgncGFnZVNpemUnLCBwYWdlU2l6ZS50b1N0cmluZygpKTtcclxuICAgIGlmIChmaWx0ZXIubmFtZSkge1xyXG4gICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5zZXQoJ25hbWUnLCBmaWx0ZXIubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgLmdldDxEYXRhUGFnZTxVc2VyPj4odGhpcy5fZW52LmdldCgnYXBpVXJsJykgKyAndXNlcnMnLCB7XHJcbiAgICAgICAgcGFyYW1zOiBodHRwUGFyYW1zLFxyXG4gICAgICB9KVxyXG4gICAgICAucGlwZShyZXRyeSgzKSwgY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHRvcCBOIHVzZXJzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgbmFtZSBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIG5hbWVGaWx0ZXIgVGhlIHVzZXIgbmFtZSBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIGxpbWl0IFRoZSBtYXhpbXVtIG51bWJlciBvZiB1c2VycyB0byBnZXQuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFRvcFVzZXJzKG5hbWVGaWx0ZXI6IHN0cmluZywgbGltaXQgPSAxMCk6IE9ic2VydmFibGU8VXNlcltdPiB7XHJcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5zZXQoJ3BhZ2VOdW1iZXInLCAnMScpO1xyXG4gICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuc2V0KCdwYWdlU2l6ZScsIGxpbWl0LnRvU3RyaW5nKCkpO1xyXG4gICAgaWYgKG5hbWVGaWx0ZXIpIHtcclxuICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuc2V0KCduYW1lJywgbmFtZUZpbHRlcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zID1cclxuICAgICAgaHR0cFBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMFxyXG4gICAgICAgID8ge1xyXG4gICAgICAgICAgICBwYXJhbXM6IGh0dHBQYXJhbXMsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgOiB7fTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAuZ2V0PFVzZXJbXT4odGhpcy5fZW52LmdldCgnYXBpVXJsJykgKyAndXNlcnMnLCBvcHRpb25zKVxyXG4gICAgICAucGlwZShyZXRyeSgzKSwgY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgdXNlcnMgbGlzdGVkIGluIHRoZSBzcGVjaWZpZWQgbmFtZXMuXHJcbiAgICogQHBhcmFtIG5hbWVzIFVzZXIocykgbmFtZXMuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFVzZXJzRnJvbU5hbWVzKG5hbWVzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8VXNlcltdPiB7XHJcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBpZiAobmFtZXMgJiYgbmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5zZXQoJ25hbWVzJywgbmFtZXMuam9pbignLCcpKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9wdGlvbnMgPVxyXG4gICAgICBodHRwUGFyYW1zLmtleXMoKS5sZW5ndGggPiAwXHJcbiAgICAgICAgPyB7XHJcbiAgICAgICAgICAgIHBhcmFtczogaHR0cFBhcmFtcyxcclxuICAgICAgICAgIH1cclxuICAgICAgICA6IHt9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgIC5nZXQ8VXNlcltdPih0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArICd1c2Vycy1mcm9tLW5hbWVzJywgb3B0aW9ucylcclxuICAgICAgLnBpcGUocmV0cnkoMyksIGNhdGNoRXJyb3IodGhpcy5fZXJyb3IuaGFuZGxlRXJyb3IpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkYXRhIGFib3V0IHRoZSBzcGVjaWZpZWQgdXNlci5cclxuICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlciBuYW1lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRVc2VyKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8VXNlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgLmdldDxVc2VyPih0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArICd1c2Vycy8nICsgbmFtZSlcclxuICAgICAgLnBpcGUocmV0cnkoMyksIGNhdGNoRXJyb3IodGhpcy5fZXJyb3IuaGFuZGxlRXJyb3IpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgZWRpdGFibGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB1c2VyLlxyXG4gICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHRvIHVwZGF0ZS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlVXNlcih1c2VyOiBVc2VyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgIC5wdXQoXHJcbiAgICAgICAgdGhpcy5fZW52LmdldCgnYXBpVXJsJykgK1xyXG4gICAgICAgICAgJ3VzZXJzJyArXHJcbiAgICAgICAgICAodXNlci5lbWFpbENvbmZpcm1lZCA/ICc/Y29uZmlybWVkPXRydWUnIDogJycpLFxyXG4gICAgICAgIHVzZXJcclxuICAgICAgKVxyXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuX2Vycm9yLmhhbmRsZUVycm9yKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXF1ZXN0IGEgcGFzc3dvcmQgcmVzZXQgZW1haWwgZm9yIHRoZSBzcGVjaWZpZWQgZW1haWwgYWRkcmVzcy5cclxuICAgKiBAcGFyYW0gZW1haWwgVGhlIGVtYWlsIGFkZHJlc3MgdG8gcmVjZWl2ZSB0aGUgcmVzZXQgbWVzc2FnZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXRQYXNzd29yZChlbWFpbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgIC5wb3N0KHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICsgJ2FjY291bnRzL3Jlc2V0cGFzc3dvcmQvcmVxdWVzdCcsIHtcclxuICAgICAgICBlbWFpbDogZW1haWwsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5fZXJyb3IuaGFuZGxlRXJyb3IpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSB0aGUgcGFzc3dvcmQuXHJcbiAgICogQHBhcmFtIGNoYW5nZSBUaGUgcGFzc3dvcmQgY2hhbmdlIGRhdGEuXHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVBhc3N3b3JkKGNoYW5nZTogUGFzc3dvcmRDaGFuZ2UpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgLnBvc3QodGhpcy5fZW52LmdldCgnYXBpVXJsJykgKyAnYWNjb3VudHMvY2hhbmdlcGFzc3dvcmQnLCBjaGFuZ2UpXHJcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5fZXJyb3IuaGFuZGxlRXJyb3IpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUuXHJcbiAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXIgbmFtZS5cclxuICAgKi9cclxuICBwdWJsaWMgZGVsZXRlVXNlcihuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgLmRlbGV0ZSh0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArICdhY2NvdW50cy8nICsgbmFtZSlcclxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,37 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { ConfirmDialogComponent } from '../components/confirm-dialog/confirm-dialog.component';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/material/dialog";
5
- // https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41
6
- /**
7
- * This service acts as a wrapper for MatDialog to simplify the process of calling
8
- * the dialog and subscribing to it. What it will do is create an Instance of
9
- * MatDialog with our custom component (ConfirmDialogComponent). Then it will set
10
- * any public properties it needs to by setting the properties on the
11
- * componentInstance object. It will return the observable afterClosed()
12
- * to the caller so they can subscribe to it. This will emit an event whenever
13
- * the dialog is closed.
14
- */
15
- export class DialogService {
16
- constructor(dialog) {
17
- this.dialog = dialog;
18
- }
19
- confirm(title, prompt, ok = 'yes', cancel = 'no') {
20
- let dialogRef;
21
- dialogRef = this.dialog.open(ConfirmDialogComponent);
22
- dialogRef.componentInstance.title = title;
23
- dialogRef.componentInstance.prompt = prompt;
24
- dialogRef.componentInstance.ok = ok;
25
- dialogRef.componentInstance.cancel = cancel;
26
- return dialogRef.afterClosed();
27
- }
28
- }
29
- DialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: DialogService, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Injectable });
30
- DialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: DialogService, providedIn: 'root' });
31
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: DialogService, decorators: [{
32
- type: Injectable,
33
- args: [{
34
- providedIn: 'root'
35
- }]
36
- }], ctorParameters: function () { return [{ type: i1.MatDialog }]; } });
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9hdXRoLWp3dC1hZG1pbi9zcmMvbGliL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7OztBQUcvRix5RkFBeUY7QUFFekY7Ozs7Ozs7O0dBUUc7QUFJSCxNQUFNLE9BQU8sYUFBYTtJQUV4QixZQUFvQixNQUFpQjtRQUFqQixXQUFNLEdBQU4sTUFBTSxDQUFXO0lBQUksQ0FBQztJQUVuQyxPQUFPLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxJQUFJO1FBR3JFLElBQUksU0FBK0MsQ0FBQztRQUVwRCxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNyRCxTQUFTLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMxQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUM1QyxTQUFTLENBQUMsaUJBQWlCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNwQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUU1QyxPQUFPLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxDQUFDOzswR0FoQlUsYUFBYTs4R0FBYixhQUFhLGNBRlosTUFBTTsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vLyBodHRwczovL21lZGl1bS5jb20vQHRhcmlrLm56bC9tYWtpbmctdXNlLW9mLWRpYWxvZ3MtaW4tbWF0ZXJpYWwtMi1tZGRpYWxvZy03NTMzZDI3ZGY0MVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgc2VydmljZSBhY3RzIGFzIGEgd3JhcHBlciBmb3IgTWF0RGlhbG9nIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIGNhbGxpbmdcclxuICogdGhlIGRpYWxvZyBhbmQgc3Vic2NyaWJpbmcgdG8gaXQuIFdoYXQgaXQgd2lsbCBkbyBpcyBjcmVhdGUgYW4gSW5zdGFuY2Ugb2ZcclxuICogTWF0RGlhbG9nIHdpdGggb3VyIGN1c3RvbSBjb21wb25lbnQgKENvbmZpcm1EaWFsb2dDb21wb25lbnQpLiBUaGVuIGl0IHdpbGwgc2V0XHJcbiAqIGFueSBwdWJsaWMgcHJvcGVydGllcyBpdCBuZWVkcyB0byBieSBzZXR0aW5nIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZVxyXG4gKiBjb21wb25lbnRJbnN0YW5jZSBvYmplY3QuIEl0IHdpbGwgcmV0dXJuIHRoZSBvYnNlcnZhYmxlIGFmdGVyQ2xvc2VkKClcclxuICogdG8gdGhlIGNhbGxlciBzbyB0aGV5IGNhbiBzdWJzY3JpYmUgdG8gaXQuIFRoaXMgd2lsbCBlbWl0IGFuIGV2ZW50IHdoZW5ldmVyXHJcbiAqIHRoZSBkaWFsb2cgaXMgY2xvc2VkLlxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlhbG9nU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2cpIHsgfVxyXG5cclxuICBwdWJsaWMgY29uZmlybSh0aXRsZTogc3RyaW5nLCBwcm9tcHQ6IHN0cmluZywgb2sgPSAneWVzJywgY2FuY2VsID0gJ25vJyk6XHJcbiAgICBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuXHJcbiAgICBsZXQgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Q29uZmlybURpYWxvZ0NvbXBvbmVudD47XHJcblxyXG4gICAgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50KTtcclxuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9IHRpdGxlO1xyXG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLnByb21wdCA9IHByb21wdDtcclxuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5vayA9IG9rO1xyXG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmNhbmNlbCA9IGNhbmNlbDtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==