asp-lib 1.0.5 → 1.0.7

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 (85) hide show
  1. package/esm2022/lib/application-menu/application-menu.component.mjs +4 -3
  2. package/esm2022/lib/asp-lib.module.mjs +91 -7
  3. package/esm2022/lib/assign-roles/assign-roles.component.mjs +151 -0
  4. package/esm2022/lib/basic-item/basic-item.component.mjs +32 -0
  5. package/esm2022/lib/checkbox/checkbox.component.mjs +29 -0
  6. package/esm2022/lib/checkbox-field/checkbox-field.component.mjs +28 -0
  7. package/esm2022/lib/company-dropdown/company-dropdown.component.mjs +3 -4
  8. package/esm2022/lib/dropdown/dropdown.component.mjs +3 -3
  9. package/esm2022/lib/form/form.component.mjs +131 -0
  10. package/esm2022/lib/header/header.component.mjs +17 -6
  11. package/esm2022/lib/input/input.component.mjs +28 -4
  12. package/esm2022/lib/interfaces/interfaces.mjs +1 -1
  13. package/esm2022/lib/items-selector/items-selector.component.mjs +79 -0
  14. package/esm2022/lib/items-viewer/items-viewer.component.mjs +206 -58
  15. package/esm2022/lib/list/list.component.mjs +11 -0
  16. package/esm2022/lib/loader/loader.component.mjs +45 -0
  17. package/esm2022/lib/menu/menu-child-report/menu-child-report.component.mjs +98 -0
  18. package/esm2022/lib/menu/menu.component.mjs +128 -22
  19. package/esm2022/lib/menu-admin/menu-admin.component.mjs +281 -0
  20. package/esm2022/lib/move-menu-option/move-menu-option.component.mjs +58 -0
  21. package/esm2022/lib/multi-option-dialog/multi-option-dialog.component.mjs +31 -0
  22. package/esm2022/lib/notifications/notifications.component.mjs +3 -3
  23. package/esm2022/lib/radio-button/radio-button.component.mjs +19 -0
  24. package/esm2022/lib/radio-group/radio-group.component.mjs +56 -0
  25. package/esm2022/lib/recents-dropdown/recents-dropdown.component.mjs +3 -3
  26. package/esm2022/lib/resource-actions/resource-actions.component.mjs +79 -0
  27. package/esm2022/lib/role-card/role-card.component.mjs +40 -0
  28. package/esm2022/lib/role-info/role-info.component.mjs +75 -0
  29. package/esm2022/lib/security-admin/security-admin.component.mjs +256 -81
  30. package/esm2022/lib/select/select.component.mjs +55 -14
  31. package/esm2022/lib/services/dialog.service.mjs +27 -0
  32. package/esm2022/lib/services/security-admin.service.mjs +194 -0
  33. package/esm2022/lib/services/snackbar.service.mjs +41 -0
  34. package/esm2022/lib/snackbar/snackbar.component.mjs +26 -0
  35. package/esm2022/lib/tree/tree.component.mjs +73 -0
  36. package/esm2022/lib/user-dropdown/user-dropdown.component.mjs +3 -3
  37. package/esm2022/lib/users-admin/users-admin.component.mjs +238 -17
  38. package/esm2022/public-api.mjs +8 -1
  39. package/fesm2022/asp-lib.mjs +2537 -289
  40. package/fesm2022/asp-lib.mjs.map +1 -1
  41. package/lib/asp-lib.module.d.ts +33 -11
  42. package/lib/assign-roles/assign-roles.component.d.ts +55 -0
  43. package/lib/basic-item/basic-item.component.d.ts +18 -0
  44. package/lib/checkbox/checkbox.component.d.ts +11 -0
  45. package/lib/checkbox-field/checkbox-field.component.d.ts +11 -0
  46. package/lib/form/form.component.d.ts +45 -0
  47. package/lib/header/header.component.d.ts +6 -82
  48. package/lib/input/input.component.d.ts +11 -1
  49. package/lib/interfaces/interfaces.d.ts +40 -0
  50. package/lib/items-selector/items-selector.component.d.ts +29 -0
  51. package/lib/items-viewer/items-viewer.component.d.ts +73 -11
  52. package/lib/list/list.component.d.ts +5 -0
  53. package/lib/loader/loader.component.d.ts +13 -0
  54. package/lib/menu/menu-child-report/menu-child-report.component.d.ts +21 -0
  55. package/lib/menu/menu.component.d.ts +31 -7
  56. package/lib/menu-admin/menu-admin.component.d.ts +64 -0
  57. package/lib/move-menu-option/move-menu-option.component.d.ts +28 -0
  58. package/lib/multi-option-dialog/multi-option-dialog.component.d.ts +27 -0
  59. package/lib/radio-button/radio-button.component.d.ts +7 -0
  60. package/lib/radio-group/radio-group.component.d.ts +20 -0
  61. package/lib/resource-actions/resource-actions.component.d.ts +46 -0
  62. package/lib/role-card/role-card.component.d.ts +16 -0
  63. package/lib/role-info/role-info.component.d.ts +36 -0
  64. package/lib/security-admin/security-admin.component.d.ts +63 -55
  65. package/lib/select/select.component.d.ts +18 -2
  66. package/lib/services/dialog.service.d.ts +17 -0
  67. package/lib/services/security-admin.service.d.ts +91 -0
  68. package/lib/services/snackbar.service.d.ts +16 -0
  69. package/lib/snackbar/snackbar.component.d.ts +16 -0
  70. package/lib/tree/tree.component.d.ts +35 -0
  71. package/lib/users-admin/users-admin.component.d.ts +60 -9
  72. package/package.json +1 -1
  73. package/public-api.d.ts +7 -0
  74. package/src/lib/assets/fonts/fonts/arrow-reportmenu.svg +11 -0
  75. package/src/lib/assets/fonts/fonts/asp-lib-icons.eot +0 -0
  76. package/src/lib/assets/fonts/fonts/asp-lib-icons.svg +46 -33
  77. package/src/lib/assets/fonts/fonts/asp-lib-icons.ttf +0 -0
  78. package/src/lib/assets/fonts/fonts/asp-lib-icons.woff +0 -0
  79. package/src/lib/assets/fonts/fonts/ico_closeFolderReport.svg +11 -0
  80. package/src/lib/assets/fonts/fonts/ico_openFolderReport.svg +11 -0
  81. package/src/lib/assets/fonts/fonts/newTab.svg +12 -0
  82. package/src/lib/assets/fonts/fonts/new_report_icon.svg +15 -0
  83. package/src/lib/assets/fonts/selection.json +1 -1
  84. package/src/lib/assets/fonts/style.css +144 -99
  85. package/src/lib/assets/theme.css +68 -0
@@ -0,0 +1,27 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { MultiOptionDialogComponent } from '../multi-option-dialog/multi-option-dialog.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/material/dialog";
5
+ export class DialogService {
6
+ constructor(dialog) {
7
+ this.dialog = dialog;
8
+ }
9
+ multiOption(config) {
10
+ this.dialog.open(MultiOptionDialogComponent, { data: {
11
+ message: config.message,
12
+ options: config.options,
13
+ theme: config.theme
14
+ } }).afterClosed().subscribe(result => {
15
+ console.log('result', result);
16
+ });
17
+ }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DialogService, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Injectable }); }
19
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DialogService, providedIn: 'root' }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DialogService, decorators: [{
22
+ type: Injectable,
23
+ args: [{
24
+ providedIn: 'root'
25
+ }]
26
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }]; } });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3AtbGliL3NyYy9saWIvc2VydmljZXMvZGlhbG9nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7O0FBS2xHLE1BQU0sT0FBTyxhQUFhO0lBRXhCLFlBQW1CLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFNLENBQVc7SUFBSSxDQUFDO0lBRTFDLFdBQVcsQ0FBQyxNQUFvRztRQUMvRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFDLElBQUksRUFBRTtnQkFDaEQsT0FBTyxFQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUN0QixPQUFPLEVBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQ3pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSzthQUNqQixFQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFBLEVBQUU7WUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDOytHQVpXLGFBQWE7bUhBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE11bHRpT3B0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vbXVsdGktb3B0aW9uLWRpYWxvZy9tdWx0aS1vcHRpb24tZGlhbG9nLmNvbXBvbmVudCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERpYWxvZ1NlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZykgeyB9XG5cblx0bXVsdGlPcHRpb24oY29uZmlnOnttZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM6e2xhYmVsOnN0cmluZywgY2FsbGJhY2s6RnVuY3Rpb24sIHR5cGU/OiBzdHJpbmd9W10sIHRoZW1lPzogc3RyaW5nfSkge1xuXHRcdHRoaXMuZGlhbG9nLm9wZW4oTXVsdGlPcHRpb25EaWFsb2dDb21wb25lbnQsIHtkYXRhOiB7XG4gICAgICBtZXNzYWdlOmNvbmZpZy5tZXNzYWdlLFxuICAgICAgb3B0aW9uczpjb25maWcub3B0aW9ucyxcblx0XHRcdHRoZW1lOiBjb25maWcudGhlbWVcbiAgICB9fSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0PT57XG4gICAgICBjb25zb2xlLmxvZygncmVzdWx0JywgcmVzdWx0KTtcbiAgICB9KVxuXHR9XG59XG4iXX0=
@@ -0,0 +1,194 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common/http";
5
+ const paramNames = {
6
+ Customer: "customerId",
7
+ User: "userId"
8
+ };
9
+ export class SecurityAdminService {
10
+ get userReload() { return this.reloadByEntity['User']; }
11
+ get customerReload() { return this.reloadByEntity['Customer']; }
12
+ get roleReload() { return this.reloadByEntity['Role']; }
13
+ get subjects() {
14
+ return ({
15
+ "User": this.selectedUserSubject,
16
+ "Customer": this.selectedCustomerSubject,
17
+ "Role": this.selectedRoleSubject
18
+ });
19
+ }
20
+ constructor(http) {
21
+ this.http = http;
22
+ this.selectedUserSubject = new Subject();
23
+ this.selectedCustomerSubject = new Subject();
24
+ this.selectedRoleSubject = new Subject();
25
+ this.reloadSubject = new Subject();
26
+ this.usersByCustomerEndpoint = '';
27
+ this.assignResourceEndpoint = '';
28
+ this.getActionsEndpoint = '';
29
+ this.savePermissionsEndpoint = '';
30
+ this.listRolesEndpoint = '';
31
+ this.resourcesByRoleEndpoint = '';
32
+ this.rolesByUserEndpoint = '';
33
+ this.getMenuTreeEndpoint = '';
34
+ this.saveMenuOptionEndpoint = '';
35
+ this.deleteMenuOptionEndpoint = '';
36
+ this.assignUserRoleEndpoint = '';
37
+ this.rolesByCustomerEndpoint = '';
38
+ this.assignCustomerRoleEndpoint = '';
39
+ this.usersByRoleEndpoint = '';
40
+ this.customersByRoleEndpoint = '';
41
+ this.listUsersEndpoint = '';
42
+ this.assignRoleUsersEndpoint = '';
43
+ this.assignRoleCustomersEndpoint = '';
44
+ this.theme = 'default';
45
+ this.msgLabel = { "User": "Usuario", "Customer": "Cliente", "Role": "Rol" };
46
+ this.reloadByEntity = {
47
+ "User": new Subject(),
48
+ "Customer": new Subject(),
49
+ "Role": new Subject()
50
+ };
51
+ this.reloadSubject.subscribe({
52
+ next: (entityName) => { this.reloadByEntity[entityName]?.next(true); }
53
+ });
54
+ for (let subject of Object.values(this.subjects)) {
55
+ subject.subscribe({ next: (item) => this.selectedItem = item });
56
+ }
57
+ }
58
+ getRoles() {
59
+ return this.http.get(this.listRolesEndpoint);
60
+ }
61
+ deleteMenuOption(option) {
62
+ return this.http.get(`${this.deleteMenuOptionEndpoint}?optionId=${option.id}`);
63
+ }
64
+ setTheme(theme) {
65
+ this.theme = Boolean(theme) ? theme : 'default';
66
+ }
67
+ getActions(roleId, resourceId) {
68
+ return this.http.get(`${this.getActionsEndpoint}?roleId=${roleId}&resourceId=${resourceId}`);
69
+ }
70
+ setDeleteMenuOptionEndpoint(endpoint) {
71
+ this.deleteMenuOptionEndpoint = endpoint;
72
+ }
73
+ getResourcesByRole(roleId) {
74
+ return this.http.get(`${this.resourcesByRoleEndpoint}?roledId=${roleId}`);
75
+ }
76
+ setListUsersEndpoint(endpoint) {
77
+ this.listUsersEndpoint = endpoint;
78
+ }
79
+ setMenuOptionFormComponent(component) {
80
+ this.menuOptionFormComponent = component;
81
+ }
82
+ setUsersByRoleEndpoint(endpoint) {
83
+ this.usersByRoleEndpoint = endpoint;
84
+ }
85
+ setCustomersByRoleEndpoint(endpoint) {
86
+ this.customersByRoleEndpoint = endpoint;
87
+ }
88
+ setSaveMenuOptionEndpoint(endpoint) {
89
+ this.saveMenuOptionEndpoint = endpoint;
90
+ }
91
+ setGetMenuTreeEndpoint(endpoint) { this.getMenuTreeEndpoint = endpoint; }
92
+ setAssignRoleUsersEndpoint(endpoint) { this.assignRoleUsersEndpoint = endpoint; }
93
+ setAssignRoleCustomersEndpoint(endpoint) {
94
+ this.assignRoleCustomersEndpoint = endpoint;
95
+ }
96
+ saveMenuOption(option) {
97
+ return this.http.post(this.saveMenuOptionEndpoint, { ...option, id: option.id > -1 ? option.id : null });
98
+ }
99
+ getUsers(page = 1, pageSize = 10) {
100
+ return this.http.get(`this.listUsersEndpoint?page=${page}&pageSize=${pageSize}`);
101
+ }
102
+ getAssignedRoles(id, type) {
103
+ return this.http.get(`${type === "User" ? this.rolesByUserEndpoint : this.rolesByCustomerEndpoint}?${paramNames[type]}=${id}`);
104
+ }
105
+ assignRoles(id, roles, type) {
106
+ return this.http.post(type === "User" ? this.assignUserRoleEndpoint : this.assignCustomerRoleEndpoint, {
107
+ [paramNames[type]]: id,
108
+ roles
109
+ });
110
+ }
111
+ assignRoleUsers(roleId, users) {
112
+ return this.http.post(this.assignRoleUsersEndpoint, {
113
+ roleId,
114
+ users
115
+ });
116
+ }
117
+ assignRoleCustomers(roleId, customers) {
118
+ return this.http.post(this.assignRoleCustomersEndpoint, {
119
+ roleId,
120
+ customers
121
+ });
122
+ }
123
+ setRolesByUserEndpoint(endpoint) {
124
+ this.rolesByUserEndpoint = endpoint;
125
+ }
126
+ setAssignUserRoleEndpoint(endpoint) {
127
+ this.assignUserRoleEndpoint = endpoint;
128
+ }
129
+ setRolesByCustomerEndpoint(endpoint) {
130
+ this.rolesByCustomerEndpoint = endpoint;
131
+ }
132
+ setAssignCustomerRoleEndpoint(endpoint) {
133
+ this.assignCustomerRoleEndpoint = endpoint;
134
+ }
135
+ setSavePermissionsEndpoint(endpoint) {
136
+ this.savePermissionsEndpoint = endpoint;
137
+ }
138
+ setUsersByCustomerEndpoint(endpoint) {
139
+ this.usersByCustomerEndpoint = endpoint;
140
+ }
141
+ setListRolesEndpoint(endpoint) {
142
+ this.listRolesEndpoint = endpoint;
143
+ }
144
+ setAssignResourceEndpoint(endpoint) {
145
+ this.assignResourceEndpoint = endpoint;
146
+ }
147
+ setResourcesByRoleEndpoint(endpoint) {
148
+ this.resourcesByRoleEndpoint = endpoint;
149
+ }
150
+ setActionsByRoleAndResourceEndpoint(endpoint) {
151
+ this.getActionsEndpoint = endpoint;
152
+ }
153
+ selectUser(user) {
154
+ this.selectedUserSubject.next(user);
155
+ }
156
+ selectCustomer(customer) {
157
+ this.selectedCustomerSubject.next(customer);
158
+ // this.http.get(this.usersByCustomerEndpoint + '?customerId=' + customer.id.toString()).subscribe({
159
+ // next: (response: any) => {
160
+ // if (response.responseCode === 200) {
161
+ // this.selectedCustomerSubject.next({...customer, users: response.load});
162
+ // console.log('new Customer', {...customer, users: response.load});
163
+ // }
164
+ // },
165
+ // })
166
+ }
167
+ selectRole(role) {
168
+ this.selectedRoleSubject.next(role);
169
+ }
170
+ saveItem(endpoint, updatedItem) {
171
+ return this.http.post(endpoint, updatedItem);
172
+ }
173
+ assignResource(roleId, resources) {
174
+ return this.http.post(this.assignResourceEndpoint, { roleId, resources });
175
+ }
176
+ savePermissions(permissions) {
177
+ return this.http.post(this.savePermissionsEndpoint, permissions);
178
+ }
179
+ getMenuTree() {
180
+ return this.http.get(this.getMenuTreeEndpoint);
181
+ }
182
+ reloadEntity(entityName) {
183
+ this.reloadSubject.next(entityName);
184
+ }
185
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SecurityAdminService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
186
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SecurityAdminService, providedIn: 'root' }); }
187
+ }
188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SecurityAdminService, decorators: [{
189
+ type: Injectable,
190
+ args: [{
191
+ providedIn: 'root'
192
+ }]
193
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktYWRtaW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzcC1saWIvc3JjL2xpYi9zZXJ2aWNlcy9zZWN1cml0eS1hZG1pbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBRzNDLE1BQU0sVUFBVSxHQUFHO0lBQ2xCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLElBQUksRUFBRSxRQUFRO0NBQ2QsQ0FBQTtBQUtELE1BQU0sT0FBTyxvQkFBb0I7SUF1Q2hDLElBQUksVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDdkQsSUFBSSxjQUFjLEtBQUssT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUMvRCxJQUFJLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRXZELElBQUksUUFBUTtRQUNYLE9BQU8sQ0FBQztZQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQ2hDLFVBQVUsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CO1NBQ2hDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRCxZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBakRwQyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQ3pDLDRCQUF1QixHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDN0Msd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUN6QyxrQkFBYSxHQUFHLElB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LENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUSxDQUFDLFFBQWdCLEVBQUUsV0FBZ0I7UUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFjLEVBQUUsU0FBZ0I7UUFDOUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsZUFBZSxDQUFDLFdBQWtCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxXQUFXO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsWUFBWSxDQUFDLFVBQXdDO1FBQ3BELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBN05XLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRnBCLE1BQU07OzRGQUVOLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU25hY2tiYXJTZXJ2aWNlIH0gZnJvbSAnLi9zbmFja2Jhci5zZXJ2aWNlJztcclxuXHJcbmNvbnN0IHBhcmFtTmFtZXMgPSB7XHJcblx0Q3VzdG9tZXI6IFwiY3VzdG9tZXJJZFwiLFxyXG5cdFVzZXI6IFwidXNlcklkXCJcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlBZG1pblNlcnZpY2Uge1xyXG5cclxuXHRzZWxlY3RlZFVzZXJTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdHNlbGVjdGVkQ3VzdG9tZXJTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdHNlbGVjdGVkUm9sZVN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblx0cmVsb2FkU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHR1c2Vyc0J5Q3VzdG9tZXJFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0YXNzaWduUmVzb3VyY2VFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0Z2V0QWN0aW9uc0VuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRzYXZlUGVybWlzc2lvbnNFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0bGlzdFJvbGVzRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdHJlc291cmNlc0J5Um9sZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRyb2xlc0J5VXNlckVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRnZXRNZW51VHJlZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRzYXZlTWVudU9wdGlvbkVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRkZWxldGVNZW51T3B0aW9uRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cclxuXHRhc3NpZ25Vc2VyUm9sZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRyb2xlc0J5Q3VzdG9tZXJFbmRwb2ludDogc3RyaW5nID0gJyc7XHJcblx0YXNzaWduQ3VzdG9tZXJSb2xlRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdHVzZXJzQnlSb2xlRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdGN1c3RvbWVyc0J5Um9sZUVuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRtZW51T3B0aW9uRm9ybUNvbXBvbmVudD86IFR5cGU8YW55PjtcclxuXHJcblx0bGlzdFVzZXJzRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cdGFzc2lnblJvbGVVc2Vyc0VuZHBvaW50OiBzdHJpbmcgPSAnJztcclxuXHRhc3NpZ25Sb2xlQ3VzdG9tZXJzRW5kcG9pbnQ6IHN0cmluZyA9ICcnO1xyXG5cclxuXHRzZWxlY3RlZEl0ZW06IGFueTtcclxuXHR0aGVtZTogc3RyaW5nID0gJ2RlZmF1bHQnO1xyXG5cclxuXHRtc2dMYWJlbCA9IHsgXCJVc2VyXCI6IFwiVXN1YXJpb1wiLCBcIkN1c3RvbWVyXCI6IFwiQ2xpZW50ZVwiLCBcIlJvbGVcIjogXCJSb2xcIiB9XHJcblxyXG5cdHJlbG9hZEJ5RW50aXR5ID0ge1xyXG5cdFx0XCJVc2VyXCI6IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCksXHJcblx0XHRcIkN1c3RvbWVyXCI6IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCksXHJcblx0XHRcIlJvbGVcIjogbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKVxyXG5cdH1cclxuXHJcblx0Z2V0IHVzZXJSZWxvYWQoKSB7IHJldHVybiB0aGlzLnJlbG9hZEJ5RW50aXR5WydVc2VyJ10gfVxyXG5cdGdldCBjdXN0b21lclJlbG9hZCgpIHsgcmV0dXJuIHRoaXMucmVsb2FkQnlFbnRpdHlbJ0N1c3RvbWVyJ10gfVxyXG5cdGdldCByb2xlUmVsb2FkKCkgeyByZXR1cm4gdGhpcy5yZWxvYWRCeUVudGl0eVsnUm9sZSddIH1cclxuXHJcblx0Z2V0IHN1YmplY3RzKCkge1xyXG5cdFx0cmV0dXJuICh7XHJcblx0XHRcdFwiVXNlclwiOiB0aGlzLnNlbGVjdGVkVXNlclN1YmplY3QsXHJcblx0XHRcdFwiQ3VzdG9tZXJcIjogdGhpcy5zZWxlY3RlZEN1c3RvbWVyU3ViamVjdCxcclxuXHRcdFx0XCJSb2xlXCI6IHRoaXMuc2VsZWN0ZWRSb2xlU3ViamVjdFxyXG5cdFx0fSlcclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xyXG5cdFx0dGhpcy5yZWxvYWRTdWJqZWN0LnN1YnNjcmliZSh7XHJcblx0XHRcdG5leHQ6IChlbnRpdHlOYW1lOiBhbnkpID0+IHsgdGhpcy5yZWxvYWRCeUVudGl0eVtlbnRpdHlOYW1lIGFzIFwiVXNlclwiIHwgXCJDdXN0b21lclwiIHwgXCJSb2xlXCJdPy5uZXh0KHRydWUpIH1cclxuXHRcdH0pXHJcblx0XHRmb3IgKGxldCBzdWJqZWN0IG9mIE9iamVjdC52YWx1ZXModGhpcy5zdWJqZWN0cykpIHtcclxuXHRcdFx0c3ViamVjdC5zdWJzY3JpYmUoeyBuZXh0OiAoaXRlbSkgPT4gdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtIH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Z2V0Um9sZXMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmxpc3RSb2xlc0VuZHBvaW50KTtcclxuXHR9XHJcblxyXG5cdGRlbGV0ZU1lbnVPcHRpb24ob3B0aW9uOiBhbnkpe1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5kZWxldGVNZW51T3B0aW9uRW5kcG9pbnR9P29wdGlvbklkPSR7b3B0aW9uLmlkfWApXHJcblx0fVxyXG5cclxuXHRzZXRUaGVtZSh0aGVtZTogc3RyaW5nKXtcclxuXHRcdHRoaXMudGhlbWUgPSBCb29sZWFuKHRoZW1lKSA/IHRoZW1lIDogJ2RlZmF1bHQnO1xyXG5cdH1cclxuXHJcblx0Z2V0QWN0aW9ucyhyb2xlSWQ6IG51bWJlciwgcmVzb3VyY2VJZDogbnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmdldEFjdGlvbnNFbmRwb2ludH0/cm9sZUlkPSR7cm9sZUlkfSZyZXNvdXJjZUlkPSR7cmVzb3VyY2VJZH1gKTtcclxuXHR9XHJcblxyXG5cdHNldERlbGV0ZU1lbnVPcHRpb25FbmRwb2ludChlbmRwb2ludDogc3RyaW5nKXtcclxuXHRcdHRoaXMuZGVsZXRlTWVudU9wdGlvbkVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRnZXRSZXNvdXJjZXNCeVJvbGUocm9sZUlkOiBudW1iZXIpIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMucmVzb3VyY2VzQnlSb2xlRW5kcG9pbnR9P3JvbGVkSWQ9JHtyb2xlSWR9YCk7XHJcblx0fVxyXG5cclxuXHRzZXRMaXN0VXNlcnNFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmxpc3RVc2Vyc0VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRNZW51T3B0aW9uRm9ybUNvbXBvbmVudChjb21wb25lbnQ/OiBUeXBlPGFueT4pe1xyXG5cdFx0dGhpcy5tZW51T3B0aW9uRm9ybUNvbXBvbmVudCA9IGNvbXBvbmVudDtcclxuXHR9XHJcblxyXG5cdHNldFVzZXJzQnlSb2xlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy51c2Vyc0J5Um9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cdHNldEN1c3RvbWVyc0J5Um9sZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuY3VzdG9tZXJzQnlSb2xlRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNldFNhdmVNZW51T3B0aW9uRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5zYXZlTWVudU9wdGlvbkVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRHZXRNZW51VHJlZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHsgdGhpcy5nZXRNZW51VHJlZUVuZHBvaW50ID0gZW5kcG9pbnQgfVxyXG5cdHNldEFzc2lnblJvbGVVc2Vyc0VuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHsgdGhpcy5hc3NpZ25Sb2xlVXNlcnNFbmRwb2ludCA9IGVuZHBvaW50IH1cclxuXHRzZXRBc3NpZ25Sb2xlQ3VzdG9tZXJzRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5hc3NpZ25Sb2xlQ3VzdG9tZXJzRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNhdmVNZW51T3B0aW9uKG9wdGlvbjogYW55KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zYXZlTWVudU9wdGlvbkVuZHBvaW50LCB7Li4ub3B0aW9uLCBpZDogb3B0aW9uLmlkID4gLTEgPyBvcHRpb24uaWQ6IG51bGx9KTtcclxuXHR9XHJcblxyXG5cdGdldFVzZXJzKHBhZ2U6IG51bWJlciA9IDEsIHBhZ2VTaXplOiBudW1iZXIgPSAxMCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQoYHRoaXMubGlzdFVzZXJzRW5kcG9pbnQ/cGFnZT0ke3BhZ2V9JnBhZ2VTaXplPSR7cGFnZVNpemV9YCk7XHJcblx0fVxyXG5cclxuXHRnZXRBc3NpZ25lZFJvbGVzKGlkOiBudW1iZXIsIHR5cGU6IFwiVXNlclwiIHwgXCJDdXN0b21lclwiKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0eXBlID09PSBcIlVzZXJcIiA/IHRoaXMucm9sZXNCeVVzZXJFbmRwb2ludCA6IHRoaXMucm9sZXNCeUN1c3RvbWVyRW5kcG9pbnR9PyR7cGFyYW1OYW1lc1t0eXBlXX09JHtpZH1gKTtcclxuXHR9XHJcblxyXG5cdGFzc2lnblJvbGVzKGlkOiBudW1iZXIsIHJvbGVzOiBhbnlbXSwgdHlwZTogXCJVc2VyXCIgfCBcIkN1c3RvbWVyXCIpIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAucG9zdCh0eXBlID09PSBcIlVzZXJcIiA/IHRoaXMuYXNzaWduVXNlclJvbGVFbmRwb2ludCA6IHRoaXMuYXNzaWduQ3VzdG9tZXJSb2xlRW5kcG9pbnQsIHtcclxuXHRcdFx0W3BhcmFtTmFtZXNbdHlwZV1dOiBpZCxcclxuXHRcdFx0cm9sZXNcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YXNzaWduUm9sZVVzZXJzKHJvbGVJZDogbnVtYmVyLCB1c2VyczogYW55W10pIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmFzc2lnblJvbGVVc2Vyc0VuZHBvaW50LCB7XHJcblx0XHRcdHJvbGVJZCxcclxuXHRcdFx0dXNlcnNcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRhc3NpZ25Sb2xlQ3VzdG9tZXJzKHJvbGVJZDogbnVtYmVyLCBjdXN0b21lcnM6IGFueVtdKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5hc3NpZ25Sb2xlQ3VzdG9tZXJzRW5kcG9pbnQsIHtcclxuXHRcdFx0cm9sZUlkLFxyXG5cdFx0XHRjdXN0b21lcnNcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRzZXRSb2xlc0J5VXNlckVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMucm9sZXNCeVVzZXJFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdH1cclxuXHJcblx0c2V0QXNzaWduVXNlclJvbGVFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmFzc2lnblVzZXJSb2xlRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNldFJvbGVzQnlDdXN0b21lckVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMucm9sZXNCeUN1c3RvbWVyRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNldEFzc2lnbkN1c3RvbWVyUm9sZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuYXNzaWduQ3VzdG9tZXJSb2xlRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNldFNhdmVQZXJtaXNzaW9uc0VuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuc2F2ZVBlcm1pc3Npb25zRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNldFVzZXJzQnlDdXN0b21lckVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMudXNlcnNCeUN1c3RvbWVyRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNldExpc3RSb2xlc0VuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMubGlzdFJvbGVzRW5kcG9pbnQgPSBlbmRwb2ludDtcclxuXHR9XHJcblxyXG5cdHNldEFzc2lnblJlc291cmNlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5hc3NpZ25SZXNvdXJjZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRSZXNvdXJjZXNCeVJvbGVFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnJlc291cmNlc0J5Um9sZUVuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0fVxyXG5cclxuXHRzZXRBY3Rpb25zQnlSb2xlQW5kUmVzb3VyY2VFbmRwb2ludChlbmRwb2ludDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmdldEFjdGlvbnNFbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdH1cclxuXHJcblx0c2VsZWN0VXNlcih1c2VyOiBhbnkpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xyXG5cdH1cclxuXHJcblx0c2VsZWN0Q3VzdG9tZXIoY3VzdG9tZXI6IGFueSkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEN1c3RvbWVyU3ViamVjdC5uZXh0KGN1c3RvbWVyKTtcclxuXHRcdC8vIHRoaXMuaHR0cC5nZXQodGhpcy51c2Vyc0J5Q3VzdG9tZXJFbmRwb2ludCArICc/Y3VzdG9tZXJJZD0nICsgY3VzdG9tZXIuaWQudG9TdHJpbmcoKSkuc3Vic2NyaWJlKHtcclxuXHRcdC8vIFx0bmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuXHRcdC8vIFx0XHRpZiAocmVzcG9uc2UucmVzcG9uc2VDb2RlID09PSAyMDApIHtcclxuXHRcdC8vIFx0XHRcdHRoaXMuc2VsZWN0ZWRDdXN0b21lclN1YmplY3QubmV4dCh7Li4uY3VzdG9tZXIsIHVzZXJzOiByZXNwb25zZS5sb2FkfSk7XHJcblx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZygnbmV3IEN1c3RvbWVyJywgey4uLmN1c3RvbWVyLCB1c2VyczogcmVzcG9uc2UubG9hZH0pO1xyXG5cdFx0Ly8gXHRcdH1cclxuXHRcdC8vIFx0fSxcclxuXHRcdC8vIH0pXHJcblx0fVxyXG5cclxuXHRzZWxlY3RSb2xlKHJvbGU6IGFueSkge1xyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRSb2xlU3ViamVjdC5uZXh0KHJvbGUpO1xyXG5cdH1cclxuXHJcblx0c2F2ZUl0ZW0oZW5kcG9pbnQ6IHN0cmluZywgdXBkYXRlZEl0ZW06IGFueSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCB1cGRhdGVkSXRlbSk7XHJcblx0fVxyXG5cclxuXHRhc3NpZ25SZXNvdXJjZShyb2xlSWQ6IG51bWJlciwgcmVzb3VyY2VzOiBhbnlbXSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXNzaWduUmVzb3VyY2VFbmRwb2ludCwgeyByb2xlSWQsIHJlc291cmNlcyB9KTtcclxuXHR9XHJcblxyXG5cdHNhdmVQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogYW55W10pIHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnNhdmVQZXJtaXNzaW9uc0VuZHBvaW50LCBwZXJtaXNzaW9ucyk7XHJcblx0fVxyXG5cclxuXHRnZXRNZW51VHJlZSgpe1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5nZXRNZW51VHJlZUVuZHBvaW50KTtcclxuXHR9XHJcblxyXG5cdHJlbG9hZEVudGl0eShlbnRpdHlOYW1lOiBcIlVzZXJcIiB8IFwiQ3VzdG9tZXJcIiB8IFwiUm9sZVwiKSB7XHJcblx0XHR0aGlzLnJlbG9hZFN1YmplY3QubmV4dChlbnRpdHlOYW1lKTtcclxuXHR9XHJcbn1cclxuIl19
@@ -0,0 +1,41 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { SnackbarComponent } from '../snackbar/snackbar.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/material/snack-bar";
5
+ export class SnackbarService {
6
+ constructor(_snackBar) {
7
+ this._snackBar = _snackBar;
8
+ this.horizontalPosition = 'center';
9
+ this.verticalPosition = 'top';
10
+ this.theme = 'default';
11
+ }
12
+ setTheme(theme) {
13
+ this.theme = theme;
14
+ }
15
+ openSnackBar(message, type = 'info', duration = 3000) {
16
+ this._snackBar.openFromComponent(SnackbarComponent, {
17
+ data: { theme: this.theme, message, type },
18
+ duration,
19
+ horizontalPosition: this.horizontalPosition,
20
+ verticalPosition: this.verticalPosition,
21
+ });
22
+ }
23
+ success(message, duration = 3000) {
24
+ this.openSnackBar(message, 'success', duration);
25
+ }
26
+ warning(message, duration = 3000) {
27
+ this.openSnackBar(message, 'warning', duration);
28
+ }
29
+ info(message, duration = 3000) {
30
+ this.openSnackBar(message, 'info', duration);
31
+ }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SnackbarService, deps: [{ token: i1.MatSnackBar }], target: i0.ɵɵFactoryTarget.Injectable }); }
33
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SnackbarService, providedIn: 'root' }); }
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SnackbarService, decorators: [{
36
+ type: Injectable,
37
+ args: [{
38
+ providedIn: 'root'
39
+ }]
40
+ }], ctorParameters: function () { return [{ type: i1.MatSnackBar }]; } });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hY2tiYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzcC1saWIvc3JjL2xpYi9zZXJ2aWNlcy9zbmFja2Jhci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7OztBQUtuRSxNQUFNLE9BQU8sZUFBZTtJQUszQixZQUFvQixTQUFzQjtRQUF0QixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBSjFDLHVCQUFrQixHQUFrQyxRQUFRLENBQUM7UUFDN0QscUJBQWdCLEdBQWdDLEtBQUssQ0FBQztRQUN0RCxVQUFLLEdBQVcsU0FBUyxDQUFDO0lBRW9CLENBQUM7SUFFL0MsUUFBUSxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFlLEVBQUUsSUFBSSxHQUFHLE1BQU0sRUFBRSxXQUFtQixJQUFJO1FBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUU7WUFDbkQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtZQUMxQyxRQUFRO1lBQ1Isa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUN4QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQzFDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsT0FBZSxFQUFFLFdBQW1CLElBQUk7UUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxPQUFPLENBQUMsT0FBZSxFQUFFLFdBQW1CLElBQUk7UUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUFJLENBQUMsT0FBZSxFQUFFLFdBQW1CLElBQUk7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7K0dBOUJXLGVBQWU7bUhBQWYsZUFBZSxjQUZmLE1BQU07OzRGQUVOLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciwgTWF0U25hY2tCYXJIb3Jpem9udGFsUG9zaXRpb24sIE1hdFNuYWNrQmFyVmVydGljYWxQb3NpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IFNuYWNrYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vc25hY2tiYXIvc25hY2tiYXIuY29tcG9uZW50JztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNuYWNrYmFyU2VydmljZSB7XHJcblx0aG9yaXpvbnRhbFBvc2l0aW9uOiBNYXRTbmFja0Jhckhvcml6b250YWxQb3NpdGlvbiA9ICdjZW50ZXInO1xyXG5cdHZlcnRpY2FsUG9zaXRpb246IE1hdFNuYWNrQmFyVmVydGljYWxQb3NpdGlvbiA9ICd0b3AnO1xyXG5cdHRoZW1lOiBzdHJpbmcgPSAnZGVmYXVsdCc7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgX3NuYWNrQmFyOiBNYXRTbmFja0JhcikgeyB9XHJcblxyXG5cdHNldFRoZW1lKHRoZW1lOiBzdHJpbmcpe1xyXG5cdFx0dGhpcy50aGVtZSA9IHRoZW1lO1xyXG5cdH1cclxuXHJcblx0b3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZywgdHlwZSA9ICdpbmZvJywgZHVyYXRpb246IG51bWJlciA9IDMwMDApIHtcclxuXHRcdHRoaXMuX3NuYWNrQmFyLm9wZW5Gcm9tQ29tcG9uZW50KFNuYWNrYmFyQ29tcG9uZW50LCB7XHJcblx0XHRcdGRhdGE6IHsgdGhlbWU6IHRoaXMudGhlbWUsIG1lc3NhZ2UsIHR5cGUgfSwgXHJcblx0XHRcdGR1cmF0aW9uLFxyXG5cdFx0XHRob3Jpem9udGFsUG9zaXRpb246IHRoaXMuaG9yaXpvbnRhbFBvc2l0aW9uLFxyXG4gICAgICB2ZXJ0aWNhbFBvc2l0aW9uOiB0aGlzLnZlcnRpY2FsUG9zaXRpb24sXHJcblx0XHR9KVxyXG5cdH1cclxuXHJcblx0c3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIGR1cmF0aW9uOiBudW1iZXIgPSAzMDAwKSB7XHJcblx0XHR0aGlzLm9wZW5TbmFja0JhcihtZXNzYWdlLCAnc3VjY2VzcycsIGR1cmF0aW9uKTtcclxuXHR9XHJcblxyXG5cdHdhcm5pbmcobWVzc2FnZTogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyID0gMzAwMCkge1xyXG5cdFx0dGhpcy5vcGVuU25hY2tCYXIobWVzc2FnZSwgJ3dhcm5pbmcnLCBkdXJhdGlvbik7XHJcblx0fVxyXG5cclxuXHRpbmZvKG1lc3NhZ2U6IHN0cmluZywgZHVyYXRpb246IG51bWJlciA9IDMwMDApIHtcclxuXHRcdHRoaXMub3BlblNuYWNrQmFyKG1lc3NhZ2UsICdpbmZvJywgZHVyYXRpb24pO1xyXG5cdH1cclxufVxyXG4iXX0=