lib-portal-angular 0.0.51 → 0.0.53

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,30 +1,46 @@
1
1
  import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, forwardRef } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { of } from 'rxjs';
3
+ import { of, Subject } from 'rxjs';
4
+ import { debounceTime, switchMap, catchError, startWith, map } from 'rxjs/operators';
4
5
  import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/forms";
7
- import * as i3 from "@ng-select/ng-select";
6
+ import * as i1 from "../../service/auth-service.service";
7
+ import * as i2 from "@angular/common/http";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@angular/forms";
10
+ import * as i5 from "@ng-select/ng-select";
8
11
  export class MultiSelectComponent {
9
- constructor() {
12
+ constructor(authService, http) {
13
+ this.authService = authService;
14
+ this.http = http;
10
15
  this.label = 'Multi Select';
11
- this.data = []; // Aceita um array de objetos genéricos
16
+ this.data = []; // Accepts an array of generic objects
12
17
  this.placeholder = 'Select items';
13
- this.selected = []; // A variável selected deve ser um array
18
+ this.selected = []; // The selected variable should be an array
14
19
  this.id = 'multiSelectId';
15
- this.bindLabel = ''; // Label dinâmico genérico
16
- this.marginTop = 0;
17
- this.marginBottom = 0;
18
- this.marginLeft = 0;
19
- this.marginRight = 0;
20
+ this.bindLabel = ''; // Generic dynamic label
21
+ this.bindValue = ''; // Generic dynamic value
22
+ this.closeOnSelect = false; // New property to control dropdown close behavior
23
+ this.searchUrl = ''; // URL for backend search
20
24
  this.keyupEvent = new EventEmitter();
21
- this.items = of([]); // Inicialização da propriedade
25
+ this.originalData = []; // Store the original list
26
+ this.allItems = []; // Store the combined list
27
+ this.items = of([]); // Initialization of the property
28
+ this.filteredItems = of([]); // Filtered items
29
+ this.searchTerms = new Subject(); // For search debounce
30
+ this.backendItems = []; // Items found from backend
22
31
  this.onChangeCallback = () => { };
23
32
  this.onTouchedCallback = () => { };
24
33
  this.isCourseEntered = false;
34
+ this.compareFn = (item1, item2) => {
35
+ return item1 && item2 ? item1[this.bindValue] === item2[this.bindValue] : item1 === item2;
36
+ };
25
37
  }
26
38
  ngOnInit() {
27
- this.items = of(this.data);
39
+ this.originalData = [...this.data]; // Preserve the original data
40
+ this.allItems = [...this.data]; // Initialize allItems with the original data
41
+ this.items = of(this.allItems);
42
+ this.filteredItems = this.searchTerms.pipe(debounceTime(700), startWith(''), // Start with an empty search to load the original list
43
+ switchMap(term => this.search(term)));
28
44
  }
29
45
  onFocus() {
30
46
  this.isCourseEntered = true;
@@ -35,6 +51,66 @@ export class MultiSelectComponent {
35
51
  onKeyUp(event) {
36
52
  this.keyupEvent.emit(event);
37
53
  }
54
+ onSelectedChange(event) {
55
+ const newlySelectedItems = event.filter((item) => !this.selected.includes(item));
56
+ this.selected = event;
57
+ // Check if any newly selected item is from backendItems
58
+ const addedFromBackend = this.backendItems.filter((item) => newlySelectedItems.includes(item));
59
+ if (addedFromBackend.length > 0) {
60
+ // Transform the backend items to match the format expected by the component
61
+ const transformedItems = addedFromBackend.map((item) => ({
62
+ [this.bindValue]: item[this.bindValue],
63
+ [this.bindLabel]: item[this.bindLabel]
64
+ }));
65
+ // Add backend items to the allItems list and update the observable
66
+ this.originalData = [...this.originalData, ...transformedItems];
67
+ this.allItems = [...this.originalData];
68
+ this.items = of(this.allItems); // Update the observable with new data
69
+ this.backendItems = []; // Clear backend items after processing
70
+ this.searchTerms.next(''); // Reset the search term to update the list
71
+ console.log('Added items from backend to the list and reset the dropdown.');
72
+ }
73
+ this.onChangeCallback(this.selected);
74
+ }
75
+ onInputChange(event) {
76
+ const input = event.target.value;
77
+ this.searchTerms.next(input);
78
+ }
79
+ search(term) {
80
+ if (!term.trim()) {
81
+ // If the search term is empty, show the complete list
82
+ return of(this.allItems);
83
+ }
84
+ const filtered = this.allItems.filter((item) => item[this.bindLabel].toLowerCase().includes(term.toLowerCase()));
85
+ if (filtered.length > 0) {
86
+ console.log('Items filtered locally.');
87
+ return of(filtered);
88
+ }
89
+ else if (this.searchUrl) {
90
+ return this.http.get(`${this.searchUrl}?term=${term}`).pipe(map((response) => {
91
+ if (response && response.length > 0) {
92
+ // Transform the backend items to match the format expected by the component
93
+ const transformedItems = response.map((item) => ({
94
+ [this.bindValue]: item[this.bindValue],
95
+ [this.bindLabel]: item[this.bindLabel]
96
+ }));
97
+ this.backendItems = transformedItems;
98
+ return [...filtered, ...transformedItems];
99
+ }
100
+ else {
101
+ console.log('No items found in the backend search.');
102
+ return filtered;
103
+ }
104
+ }), catchError((error) => {
105
+ console.error('Error fetching from backend:', error);
106
+ return of(filtered);
107
+ }));
108
+ }
109
+ else {
110
+ console.log('No search URL provided and no items found locally.');
111
+ return of(filtered);
112
+ }
113
+ }
38
114
  writeValue(value) {
39
115
  this.selected = value || [];
40
116
  }
@@ -47,31 +123,47 @@ export class MultiSelectComponent {
47
123
  setDisabledState(isDisabled) {
48
124
  // No implementation needed for this example
49
125
  }
50
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
51
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiSelectComponent, selector: "sim-app-multi-select", inputs: { label: "label", data: "data", placeholder: "placeholder", selected: "selected", id: "id", bindLabel: "bindLabel", marginTop: "marginTop", marginBottom: "marginBottom", marginLeft: "marginLeft", marginRight: "marginRight" }, outputs: { keyupEvent: "keyupEvent" }, providers: [
126
+ hasPermission() {
127
+ if (!this.permissions || this.permissions.length === 0) {
128
+ return true;
129
+ }
130
+ try {
131
+ return this.authService.hasPermission(this.permissions);
132
+ }
133
+ catch (error) {
134
+ if (error instanceof Error) {
135
+ console.error('Permission error:', error.message);
136
+ }
137
+ else {
138
+ console.error('Unknown error occurred during permission check');
139
+ }
140
+ return true;
141
+ }
142
+ }
143
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i1.AuthService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
144
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiSelectComponent, selector: "argenta-custom-multi-select", inputs: { label: "label", data: "data", placeholder: "placeholder", selected: "selected", id: "id", bindLabel: "bindLabel", bindValue: "bindValue", permissions: "permissions", closeOnSelect: "closeOnSelect", searchUrl: "searchUrl" }, outputs: { keyupEvent: "keyupEvent" }, providers: [
52
145
  {
53
146
  provide: NG_VALUE_ACCESSOR,
54
147
  useExisting: forwardRef(() => MultiSelectComponent),
55
148
  multi: true
56
149
  }
57
150
  ], ngImport: i0, template: `
58
- <div class="form-group" [ngStyle]="{
59
- 'margin-top': marginTop + 'rem',
60
- 'margin-bottom': marginBottom + 'rem',
61
- 'margin-left': marginLeft + 'rem',
62
- 'margin-right': marginRight + 'rem'
63
- }">
151
+ <div *ngIf="hasPermission()" class="form-group">
64
152
  <label [for]="id" class="form-label">{{ label }}</label>
65
153
  <ng-select
66
154
  [class.course-entry]="isCourseEntered"
67
155
  class="ng-select"
68
- [items]="items | async"
156
+ [items]="filteredItems | async"
69
157
  [multiple]="true"
70
- [closeOnSelect]="false"
158
+ [closeOnSelect]="closeOnSelect"
71
159
  [hideSelected]="true"
72
160
  [bindLabel]="bindLabel"
161
+ [bindValue]="bindValue"
73
162
  [(ngModel)]="selected"
163
+ [compareWith]="compareFn"
164
+ (change)="onSelectedChange($event)"
74
165
  (keyup)="onKeyUp($event)"
166
+ (input)="onInputChange($event)"
75
167
  [id]="id"
76
168
  [placeholder]="selected && selected.length === 0 ? placeholder : ''"
77
169
  (focus)="onFocus()"
@@ -82,28 +174,27 @@ export class MultiSelectComponent {
82
174
  </ng-template>
83
175
  </ng-select>
84
176
  </div>
85
- `, isInline: true, styles: [".form-group{font-family:Arial,sans-serif;font-size:1rem}.form-label{font-weight:700}\n"], dependencies: [{ kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i3.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
177
+ `, isInline: true, styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.form-group{font-family:Inter,Arial,sans-serif;font-size:1rem}.form-check-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem}.form-check-label{width:623px;height:19px;top:1608px;left:133px;gap:0px;opacity:0px;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left}.custom-select{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:400;border:1px solid #ccc;border-radius:4px;padding:.5rem 2rem .5rem .5rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:none;background-repeat:no-repeat;background-position:right .5rem center}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:400;border:1px solid #ccc;border-radius:4px;padding:.5rem}.form-label{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.select-container{position:relative;display:inline-block;width:100%}.select-container lucide-icon{position:absolute;right:.75rem;top:50%;transform:translateY(-50%);pointer-events:none;color:#5e6366}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i5.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
86
178
  }
87
179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, decorators: [{
88
180
  type: Component,
89
- args: [{ selector: 'sim-app-multi-select', template: `
90
- <div class="form-group" [ngStyle]="{
91
- 'margin-top': marginTop + 'rem',
92
- 'margin-bottom': marginBottom + 'rem',
93
- 'margin-left': marginLeft + 'rem',
94
- 'margin-right': marginRight + 'rem'
95
- }">
181
+ args: [{ selector: 'argenta-custom-multi-select', template: `
182
+ <div *ngIf="hasPermission()" class="form-group">
96
183
  <label [for]="id" class="form-label">{{ label }}</label>
97
184
  <ng-select
98
185
  [class.course-entry]="isCourseEntered"
99
186
  class="ng-select"
100
- [items]="items | async"
187
+ [items]="filteredItems | async"
101
188
  [multiple]="true"
102
- [closeOnSelect]="false"
189
+ [closeOnSelect]="closeOnSelect"
103
190
  [hideSelected]="true"
104
191
  [bindLabel]="bindLabel"
192
+ [bindValue]="bindValue"
105
193
  [(ngModel)]="selected"
194
+ [compareWith]="compareFn"
195
+ (change)="onSelectedChange($event)"
106
196
  (keyup)="onKeyUp($event)"
197
+ (input)="onInputChange($event)"
107
198
  [id]="id"
108
199
  [placeholder]="selected && selected.length === 0 ? placeholder : ''"
109
200
  (focus)="onFocus()"
@@ -120,8 +211,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
120
211
  useExisting: forwardRef(() => MultiSelectComponent),
121
212
  multi: true
122
213
  }
123
- ], changeDetection: ChangeDetectionStrategy.OnPush, styles: [".form-group{font-family:Arial,sans-serif;font-size:1rem}.form-label{font-weight:700}\n"] }]
124
- }], propDecorators: { label: [{
214
+ ], changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.form-group{font-family:Inter,Arial,sans-serif;font-size:1rem}.form-check-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem}.form-check-label{width:623px;height:19px;top:1608px;left:133px;gap:0px;opacity:0px;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left}.custom-select{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:400;border:1px solid #ccc;border-radius:4px;padding:.5rem 2rem .5rem .5rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:none;background-repeat:no-repeat;background-position:right .5rem center}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:400;border:1px solid #ccc;border-radius:4px;padding:.5rem}.form-label{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.select-container{position:relative;display:inline-block;width:100%}.select-container lucide-icon{position:absolute;right:.75rem;top:50%;transform:translateY(-50%);pointer-events:none;color:#5e6366}\n"] }]
215
+ }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.HttpClient }]; }, propDecorators: { label: [{
125
216
  type: Input
126
217
  }], data: [{
127
218
  type: Input
@@ -133,15 +224,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
133
224
  type: Input
134
225
  }], bindLabel: [{
135
226
  type: Input
136
- }], marginTop: [{
227
+ }], bindValue: [{
137
228
  type: Input
138
- }], marginBottom: [{
229
+ }], permissions: [{
139
230
  type: Input
140
- }], marginLeft: [{
231
+ }], closeOnSelect: [{
141
232
  type: Input
142
- }], marginRight: [{
233
+ }], searchUrl: [{
143
234
  type: Input
144
235
  }], keyupEvent: [{
145
236
  type: Output
146
237
  }] } });
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1wb3J0YWwtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBbUR0QyxNQUFNLE9BQU8sb0JBQW9CO0lBakRqQztRQWtEVyxVQUFLLEdBQVcsY0FBYyxDQUFDO1FBQy9CLFNBQUksR0FBVSxFQUFFLENBQUMsQ0FBQyx1Q0FBdUM7UUFDekQsZ0JBQVcsR0FBVyxjQUFjLENBQUM7UUFDckMsYUFBUSxHQUFVLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztRQUM5RCxPQUFFLEdBQVcsZUFBZSxDQUFDO1FBQzdCLGNBQVMsR0FBVyxFQUFFLENBQUMsQ0FBQywwQkFBMEI7UUFFbEQsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUN6QixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBRXZCLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVsRSxVQUFLLEdBQXNCLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtRQU0xRCxxQkFBZ0IsR0FBcUIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLHNCQUFpQixHQUFlLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVsRCxvQkFBZSxHQUFHLEtBQUssQ0FBQztLQTZCekI7SUFwQ0MsUUFBUTtRQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBT0QsT0FBTztRQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFvQjtRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCLENBQUUsVUFBbUI7UUFDbkMsNENBQTRDO0lBQzlDLENBQUM7K0dBcERVLG9CQUFvQjttR0FBcEIsb0JBQW9CLGdVQVRwQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkE1Q1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0QlQ7OzRGQW1CVSxvQkFBb0I7a0JBakRoQyxTQUFTOytCQUNFLHNCQUFzQixZQUN0Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCVCxhQVVVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbS1hcHAtbXVsdGktc2VsZWN0JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiIFtuZ1N0eWxlXT1cIntcbiAgICAgICdtYXJnaW4tdG9wJzogbWFyZ2luVG9wICsgJ3JlbScsXG4gICAgICAnbWFyZ2luLWJvdHRvbSc6IG1hcmdpbkJvdHRvbSArICdyZW0nLFxuICAgICAgJ21hcmdpbi1sZWZ0JzogbWFyZ2luTGVmdCArICdyZW0nLFxuICAgICAgJ21hcmdpbi1yaWdodCc6IG1hcmdpblJpZ2h0ICsgJ3JlbSdcbiAgICB9XCI+XG4gICAgICA8bGFiZWwgW2Zvcl09XCJpZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIDxuZy1zZWxlY3RcbiAgICAgICAgW2NsYXNzLmNvdXJzZS1lbnRyeV09XCJpc0NvdXJzZUVudGVyZWRcIlxuICAgICAgICBjbGFzcz1cIm5nLXNlbGVjdFwiXG4gICAgICAgIFtpdGVtc109XCJpdGVtcyB8IGFzeW5jXCJcbiAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICBbY2xvc2VPblNlbGVjdF09XCJmYWxzZVwiXG4gICAgICAgIFtoaWRlU2VsZWN0ZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtiaW5kTGFiZWxdPVwiYmluZExhYmVsXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFwiXG4gICAgICAgIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIlxuICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gcGxhY2Vob2xkZXIgOiAnJ1wiXG4gICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxuICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1pdGVtPVwiaXRlbVwiPlxuICAgICAgICAgIHt7IGl0ZW1bYmluZExhYmVsXSB9fVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1zZWxlY3Q+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAuZm9ybS1ncm91cCB7XG4gICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgICBmb250LXNpemU6IDFyZW07XG4gICAgfVxuICAgIC5mb3JtLWxhYmVsIHtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIH1cbiAgYF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnTXVsdGkgU2VsZWN0JztcbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTsgLy8gQWNlaXRhIHVtIGFycmF5IGRlIG9iamV0b3MgZ2Vuw6lyaWNvc1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBpdGVtcyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBhbnlbXSA9IFtdOyAvLyBBIHZhcmnDoXZlbCBzZWxlY3RlZCBkZXZlIHNlciB1bSBhcnJheVxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gJ211bHRpU2VsZWN0SWQnO1xuICBASW5wdXQoKSBiaW5kTGFiZWw6IHN0cmluZyA9ICcnOyAvLyBMYWJlbCBkaW7Dom1pY28gZ2Vuw6lyaWNvXG5cbiAgQElucHV0KCkgbWFyZ2luVG9wOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBtYXJnaW5Cb3R0b206IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIG1hcmdpbkxlZnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIG1hcmdpblJpZ2h0OiBudW1iZXIgPSAwO1xuXG4gIEBPdXRwdXQoKSBrZXl1cEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPiA9IG9mKFtdKTsgLy8gSW5pY2lhbGl6YcOnw6NvIGRhIHByb3ByaWVkYWRlXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtcyA9IG9mKHRoaXMuZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7IH07XG4gIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgaXNDb3Vyc2VFbnRlcmVkID0gZmFsc2U7XG5cbiAgb25Gb2N1cygpIHtcbiAgICB0aGlzLmlzQ291cnNlRW50ZXJlZCA9IHRydWU7XG4gIH1cblxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5pc0NvdXJzZUVudGVyZWQgPSBmYWxzZTtcbiAgfVxuXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLmtleXVwRXZlbnQuZW1pdChldmVudCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWUgfHwgW107XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gTm8gaW1wbGVtZW50YXRpb24gbmVlZGVkIGZvciB0aGlzIGV4YW1wbGVcbiAgfVxufVxuIl19
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1wb3J0YWwtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUE0Q3JGLE1BQU0sT0FBTyxvQkFBb0I7SUFxQi9CLFlBQW9CLFdBQXdCLEVBQVUsSUFBZ0I7UUFBbEQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBcEI3RCxVQUFLLEdBQVcsY0FBYyxDQUFDO1FBQy9CLFNBQUksR0FBVSxFQUFFLENBQUMsQ0FBQyxzQ0FBc0M7UUFDeEQsZ0JBQVcsR0FBVyxjQUFjLENBQUM7UUFDckMsYUFBUSxHQUFVLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQztRQUNqRSxPQUFFLEdBQVcsZUFBZSxDQUFDO1FBQzdCLGNBQVMsR0FBVyxFQUFFLENBQUMsQ0FBQyx3QkFBd0I7UUFDaEQsY0FBUyxHQUFXLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUVoRCxrQkFBYSxHQUFZLEtBQUssQ0FBQyxDQUFDLGtEQUFrRDtRQUNsRixjQUFTLEdBQVcsRUFBRSxDQUFDLENBQUMseUJBQXlCO1FBRWhELGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUUxRCxpQkFBWSxHQUFVLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQjtRQUNwRCxhQUFRLEdBQVUsRUFBRSxDQUFDLENBQUMsMEJBQTBCO1FBQ3hELFVBQUssR0FBc0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO1FBQ3BFLGtCQUFhLEdBQXNCLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtRQUNwRCxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUMsQ0FBQyxzQkFBc0I7UUFDM0QsaUJBQVksR0FBVSxFQUFFLENBQUMsQ0FBQywyQkFBMkI7UUFlckQscUJBQWdCLEdBQXFCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxzQkFBaUIsR0FBZSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFbEQsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFxR3hCLGNBQVMsR0FBRyxDQUFDLEtBQVUsRUFBRSxLQUFVLEVBQVcsRUFBRTtZQUM5QyxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQztRQUM1RixDQUFDLENBQUM7SUF2SHdFLENBQUM7SUFFM0UsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDZCQUE2QjtRQUNqRSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw2Q0FBNkM7UUFDN0UsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3hDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLHVEQUF1RDtRQUN0RSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBT0QsT0FBTztRQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFvQjtRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBVTtRQUN6QixNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUV0Qix3REFBd0Q7UUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFcEcsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLDRFQUE0RTtZQUM1RSxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUQsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3RDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1lBRUosbUVBQW1FO1lBQ25FLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxzQ0FBc0M7WUFDdEUsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyx1Q0FBdUM7WUFDL0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7WUFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1NBQzdFO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFZO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDaEIsc0RBQXNEO1lBQ3RELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMxQjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQ2hFLENBQUM7UUFFRixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUN2QyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNyQjthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDOUQsR0FBRyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNuQyw0RUFBNEU7b0JBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDcEQsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3RDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO3FCQUN2QyxDQUFDLENBQUMsQ0FBQztvQkFDSixJQUFJLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDO29CQUNyQyxPQUFPLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUMzQztxQkFBTTtvQkFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7b0JBQ3JELE9BQU8sUUFBUSxDQUFDO2lCQUNqQjtZQUNILENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNyRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0RBQW9ELENBQUMsQ0FBQztZQUNsRSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyw0Q0FBNEM7SUFDOUMsQ0FBQztJQU1ELGFBQWE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6RDtRQUFDLE9BQU8sS0FBYyxFQUFFO1lBQ3ZCLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbkQ7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ2pFO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7K0dBN0pVLG9CQUFvQjttR0FBcEIsb0JBQW9CLHVVQVRwQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkFsQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCVDs7NEZBVVUsb0JBQW9CO2tCQXhDaEMsU0FBUzsrQkFDRSw2QkFBNkIsWUFFN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCVCxhQUNVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTsySEFHdEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCwgY2F0Y2hFcnJvciwgc3RhcnRXaXRoLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvYXV0aC1zZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXJnZW50YS1jdXN0b20tbXVsdGktc2VsZWN0JyxcbiAgc3R5bGVVcmxzOiBbJy4vbXVsdGktc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cImhhc1Blcm1pc3Npb24oKVwiIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgPGxhYmVsIFtmb3JdPVwiaWRcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gICAgICA8bmctc2VsZWN0XG4gICAgICAgIFtjbGFzcy5jb3Vyc2UtZW50cnldPVwiaXNDb3Vyc2VFbnRlcmVkXCJcbiAgICAgICAgY2xhc3M9XCJuZy1zZWxlY3RcIlxuICAgICAgICBbaXRlbXNdPVwiZmlsdGVyZWRJdGVtcyB8IGFzeW5jXCJcbiAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICBbY2xvc2VPblNlbGVjdF09XCJjbG9zZU9uU2VsZWN0XCJcbiAgICAgICAgW2hpZGVTZWxlY3RlZF09XCJ0cnVlXCJcbiAgICAgICAgW2JpbmRMYWJlbF09XCJiaW5kTGFiZWxcIlxuICAgICAgICBbYmluZFZhbHVlXT1cImJpbmRWYWx1ZVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRcIlxuICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUZuXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdGVkQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoa2V5dXApPVwib25LZXlVcCgkZXZlbnQpXCJcbiAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGggPT09IDAgPyBwbGFjZWhvbGRlciA6ICcnXCJcbiAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCI+XG4gICAgICAgICAge3sgaXRlbVtiaW5kTGFiZWxdIH19XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aVNlbGVjdENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdNdWx0aSBTZWxlY3QnO1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdOyAvLyBBY2NlcHRzIGFuIGFycmF5IG9mIGdlbmVyaWMgb2JqZWN0c1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBpdGVtcyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBhbnlbXSA9IFtdOyAvLyBUaGUgc2VsZWN0ZWQgdmFyaWFibGUgc2hvdWxkIGJlIGFuIGFycmF5XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSAnbXVsdGlTZWxlY3RJZCc7XG4gIEBJbnB1dCgpIGJpbmRMYWJlbDogc3RyaW5nID0gJyc7IC8vIEdlbmVyaWMgZHluYW1pYyBsYWJlbFxuICBASW5wdXQoKSBiaW5kVmFsdWU6IHN0cmluZyA9ICcnOyAvLyBHZW5lcmljIGR5bmFtaWMgdmFsdWVcbiAgQElucHV0KCkgcGVybWlzc2lvbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkOyAvLyBBZGRpbmcgcGVybWlzc2lvbnMgYXMgaW5wdXRcbiAgQElucHV0KCkgY2xvc2VPblNlbGVjdDogYm9vbGVhbiA9IGZhbHNlOyAvLyBOZXcgcHJvcGVydHkgdG8gY29udHJvbCBkcm9wZG93biBjbG9zZSBiZWhhdmlvclxuICBASW5wdXQoKSBzZWFyY2hVcmw6IHN0cmluZyA9ICcnOyAvLyBVUkwgZm9yIGJhY2tlbmQgc2VhcmNoXG5cbiAgQE91dHB1dCgpIGtleXVwRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHJpdmF0ZSBvcmlnaW5hbERhdGE6IGFueVtdID0gW107IC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBsaXN0XG4gIHByaXZhdGUgYWxsSXRlbXM6IGFueVtdID0gW107IC8vIFN0b3JlIHRoZSBjb21iaW5lZCBsaXN0XG4gIGl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPiA9IG9mKFtdKTsgLy8gSW5pdGlhbGl6YXRpb24gb2YgdGhlIHByb3BlcnR5XG4gIGZpbHRlcmVkSXRlbXM6IE9ic2VydmFibGU8YW55W10+ID0gb2YoW10pOyAvLyBGaWx0ZXJlZCBpdGVtc1xuICBwcml2YXRlIHNlYXJjaFRlcm1zID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpOyAvLyBGb3Igc2VhcmNoIGRlYm91bmNlXG4gIHByaXZhdGUgYmFja2VuZEl0ZW1zOiBhbnlbXSA9IFtdOyAvLyBJdGVtcyBmb3VuZCBmcm9tIGJhY2tlbmRcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IFsuLi50aGlzLmRhdGFdOyAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgZGF0YVxuICAgIHRoaXMuYWxsSXRlbXMgPSBbLi4udGhpcy5kYXRhXTsgLy8gSW5pdGlhbGl6ZSBhbGxJdGVtcyB3aXRoIHRoZSBvcmlnaW5hbCBkYXRhXG4gICAgdGhpcy5pdGVtcyA9IG9mKHRoaXMuYWxsSXRlbXMpO1xuICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuc2VhcmNoVGVybXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSg3MDApLFxuICAgICAgc3RhcnRXaXRoKCcnKSwgLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWFyY2ggdG8gbG9hZCB0aGUgb3JpZ2luYWwgbGlzdFxuICAgICAgc3dpdGNoTWFwKHRlcm0gPT4gdGhpcy5zZWFyY2godGVybSkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICBpc0NvdXJzZUVudGVyZWQgPSBmYWxzZTtcblxuICBvbkZvY3VzKCkge1xuICAgIHRoaXMuaXNDb3Vyc2VFbnRlcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICB0aGlzLmlzQ291cnNlRW50ZXJlZCA9IGZhbHNlO1xuICB9XG5cbiAgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5dXBFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWRDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IG5ld2x5U2VsZWN0ZWRJdGVtcyA9IGV2ZW50LmZpbHRlcigoaXRlbTogYW55KSA9PiAhdGhpcy5zZWxlY3RlZC5pbmNsdWRlcyhpdGVtKSk7XG4gICAgdGhpcy5zZWxlY3RlZCA9IGV2ZW50O1xuXG4gICAgLy8gQ2hlY2sgaWYgYW55IG5ld2x5IHNlbGVjdGVkIGl0ZW0gaXMgZnJvbSBiYWNrZW5kSXRlbXNcbiAgICBjb25zdCBhZGRlZEZyb21CYWNrZW5kID0gdGhpcy5iYWNrZW5kSXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IG5ld2x5U2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyhpdGVtKSk7XG5cbiAgICBpZiAoYWRkZWRGcm9tQmFja2VuZC5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUcmFuc2Zvcm0gdGhlIGJhY2tlbmQgaXRlbXMgdG8gbWF0Y2ggdGhlIGZvcm1hdCBleHBlY3RlZCBieSB0aGUgY29tcG9uZW50XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZEl0ZW1zID0gYWRkZWRGcm9tQmFja2VuZC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgW3RoaXMuYmluZFZhbHVlXTogaXRlbVt0aGlzLmJpbmRWYWx1ZV0sXG4gICAgICAgIFt0aGlzLmJpbmRMYWJlbF06IGl0ZW1bdGhpcy5iaW5kTGFiZWxdXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIEFkZCBiYWNrZW5kIGl0ZW1zIHRvIHRoZSBhbGxJdGVtcyBsaXN0IGFuZCB1cGRhdGUgdGhlIG9ic2VydmFibGVcbiAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gWy4uLnRoaXMub3JpZ2luYWxEYXRhLCAuLi50cmFuc2Zvcm1lZEl0ZW1zXTtcbiAgICAgIHRoaXMuYWxsSXRlbXMgPSBbLi4udGhpcy5vcmlnaW5hbERhdGFdO1xuICAgICAgdGhpcy5pdGVtcyA9IG9mKHRoaXMuYWxsSXRlbXMpOyAvLyBVcGRhdGUgdGhlIG9ic2VydmFibGUgd2l0aCBuZXcgZGF0YVxuICAgICAgdGhpcy5iYWNrZW5kSXRlbXMgPSBbXTsgLy8gQ2xlYXIgYmFja2VuZCBpdGVtcyBhZnRlciBwcm9jZXNzaW5nXG4gICAgICB0aGlzLnNlYXJjaFRlcm1zLm5leHQoJycpOyAvLyBSZXNldCB0aGUgc2VhcmNoIHRlcm0gdG8gdXBkYXRlIHRoZSBsaXN0XG4gICAgICBjb25zb2xlLmxvZygnQWRkZWQgaXRlbXMgZnJvbSBiYWNrZW5kIHRvIHRoZSBsaXN0IGFuZCByZXNldCB0aGUgZHJvcGRvd24uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWQpO1xuICB9XG5cbiAgb25JbnB1dENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtcy5uZXh0KGlucHV0KTtcbiAgfVxuXG4gIHNlYXJjaCh0ZXJtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueVtdPiB7XG4gICAgaWYgKCF0ZXJtLnRyaW0oKSkge1xuICAgICAgLy8gSWYgdGhlIHNlYXJjaCB0ZXJtIGlzIGVtcHR5LCBzaG93IHRoZSBjb21wbGV0ZSBsaXN0XG4gICAgICByZXR1cm4gb2YodGhpcy5hbGxJdGVtcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmFsbEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PlxuICAgICAgaXRlbVt0aGlzLmJpbmRMYWJlbF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcblxuICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnSXRlbXMgZmlsdGVyZWQgbG9jYWxseS4nKTtcbiAgICAgIHJldHVybiBvZihmaWx0ZXJlZCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaFVybCkge1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHt0aGlzLnNlYXJjaFVybH0/dGVybT0ke3Rlcm19YCkucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgYmFja2VuZCBpdGVtcyB0byBtYXRjaCB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBjb21wb25lbnRcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSByZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgW3RoaXMuYmluZFZhbHVlXTogaXRlbVt0aGlzLmJpbmRWYWx1ZV0sXG4gICAgICAgICAgICAgIFt0aGlzLmJpbmRMYWJlbF06IGl0ZW1bdGhpcy5iaW5kTGFiZWxdXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRJdGVtcyA9IHRyYW5zZm9ybWVkSXRlbXM7XG4gICAgICAgICAgICByZXR1cm4gWy4uLmZpbHRlcmVkLCAuLi50cmFuc2Zvcm1lZEl0ZW1zXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIGl0ZW1zIGZvdW5kIGluIHRoZSBiYWNrZW5kIHNlYXJjaC4nKTtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgZnJvbSBiYWNrZW5kOicsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YoZmlsdGVyZWQpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ05vIHNlYXJjaCBVUkwgcHJvdmlkZWQgYW5kIG5vIGl0ZW1zIGZvdW5kIGxvY2FsbHkuJyk7XG4gICAgICByZXR1cm4gb2YoZmlsdGVyZWQpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZSB8fCBbXTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBObyBpbXBsZW1lbnRhdGlvbiBuZWVkZWQgZm9yIHRoaXMgZXhhbXBsZVxuICB9XG5cbiAgY29tcGFyZUZuID0gKGl0ZW0xOiBhbnksIGl0ZW0yOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gaXRlbTEgJiYgaXRlbTIgPyBpdGVtMVt0aGlzLmJpbmRWYWx1ZV0gPT09IGl0ZW0yW3RoaXMuYmluZFZhbHVlXSA6IGl0ZW0xID09PSBpdGVtMjtcbiAgfTtcblxuICBoYXNQZXJtaXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5wZXJtaXNzaW9ucyB8fCB0aGlzLnBlcm1pc3Npb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmhhc1Blcm1pc3Npb24odGhpcy5wZXJtaXNzaW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Blcm1pc3Npb24gZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIGVycm9yIG9jY3VycmVkIGR1cmluZyBwZXJtaXNzaW9uIGNoZWNrJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,21 +1,22 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, forwardRef } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { Subject } from 'rxjs';
3
4
  import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/forms";
5
+ import * as i1 from "../../service/auth-service.service";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "@angular/forms";
8
+ import * as i4 from "lucide-angular";
6
9
  export class SelectComponent {
7
- constructor() {
10
+ constructor(authService) {
11
+ this.authService = authService;
8
12
  this.label = 'Default Label';
9
13
  this.id = 'selectId';
10
14
  this.disabled = false;
11
15
  this.options = [];
12
- this.marginTop = 0;
13
- this.marginBottom = 0;
14
- this.marginLeft = 0;
15
- this.marginRight = 0;
16
16
  this.changeEvent = new EventEmitter();
17
17
  this.onChangeCallback = () => { };
18
18
  this.onTouchedCallback = () => { };
19
+ this.destroy$ = new Subject();
19
20
  }
20
21
  onSelectChange(event) {
21
22
  const selectElement = event.target;
@@ -35,48 +36,73 @@ export class SelectComponent {
35
36
  setDisabledState(isDisabled) {
36
37
  this.disabled = isDisabled;
37
38
  }
38
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SelectComponent, selector: "sim-app-select", inputs: { label: "label", id: "id", disabled: "disabled", options: "options", marginTop: "marginTop", marginBottom: "marginBottom", marginLeft: "marginLeft", marginRight: "marginRight" }, outputs: { changeEvent: "changeEvent" }, providers: [
39
+ ngOnChanges(changes) {
40
+ if (changes['options'] && changes['options'].currentValue !== changes['options'].previousValue) {
41
+ this.updateOptions(changes['options'].currentValue);
42
+ }
43
+ }
44
+ updateOptions(newOptions) {
45
+ this.options = newOptions;
46
+ }
47
+ hasPermission() {
48
+ if (!this.permissions || this.permissions.length === 0) {
49
+ return true;
50
+ }
51
+ try {
52
+ return this.authService.hasPermission(this.permissions);
53
+ }
54
+ catch (error) {
55
+ if (error instanceof Error) {
56
+ console.error('Permission error:', error.message);
57
+ }
58
+ else {
59
+ console.error('Unknown error occurred during permission check');
60
+ }
61
+ return true;
62
+ }
63
+ }
64
+ ngOnDestroy() {
65
+ this.destroy$.next();
66
+ this.destroy$.complete();
67
+ }
68
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectComponent, deps: [{ token: i1.AuthService }], target: i0.ɵɵFactoryTarget.Component }); }
69
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SelectComponent, selector: "argenta-custom-select", inputs: { label: "label", id: "id", disabled: "disabled", options: "options", permissions: "permissions" }, outputs: { changeEvent: "changeEvent" }, providers: [
40
70
  {
41
71
  provide: NG_VALUE_ACCESSOR,
42
72
  useExisting: forwardRef(() => SelectComponent),
43
73
  multi: true
44
74
  }
45
- ], ngImport: i0, template: `
46
- <div class="form-group" [ngStyle]="{
47
- 'margin-top': marginTop + 'rem',
48
- 'margin-bottom': marginBottom + 'rem',
49
- 'margin-left': marginLeft + 'rem',
50
- 'margin-right': marginRight + 'rem'
51
- }">
52
- <label [for]="id">{{ label }}</label>
53
- <select class="form-control custom-select"
54
- [id]="id"
55
- [value]="value"
56
- (change)="onSelectChange($event)"
57
- [disabled]="disabled">
58
- <option *ngFor="let option of options" [value]="option.value">{{ option.label }}</option>
59
- </select>
75
+ ], usesOnChanges: true, ngImport: i0, template: `
76
+ <div *ngIf="hasPermission()" class="form-group">
77
+ <label [for]="id" [ngClass]="'label-styles'">{{ label }}</label>
78
+ <div class="select-container">
79
+ <select class="form-control custom-select"
80
+ [id]="id"
81
+ [value]="value"
82
+ (change)="onSelectChange($event)"
83
+ [disabled]="disabled">
84
+ <option *ngFor="let option of options" [value]="option.value">{{ option.label }}</option>
85
+ </select>
86
+ <lucide-icon name="chevron-down" [size]="16" color="#5E6366" [strokeWidth]="1.75"></lucide-icon>
87
+ </div>
60
88
  </div>
61
- `, isInline: true, styles: [".form-group{margin-bottom:1rem}.form-label{font-family:Arial,sans-serif;color:#333;font-size:1rem;font-weight:700}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
89
+ `, isInline: true, styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.form-group{font-family:Inter,Arial,sans-serif;font-size:1rem;font-weight:700}.form-check-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem}.form-check-label{width:623px;height:19px;top:1608px;left:133px;gap:0px;opacity:0px;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left}.custom-select{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:400;border:1px solid #ccc;border-radius:4px;padding:.5rem 2rem .5rem .5rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:none;background-repeat:no-repeat;background-position:right .5rem center}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:400;border:1px solid #ccc;border-radius:4px;padding:.5rem}.form-label{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:700}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.select-container{position:relative;display:inline-block;width:100%}.select-container lucide-icon{position:absolute;right:.75rem;top:50%;transform:translateY(-50%);pointer-events:none;color:#5e6366}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i4.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
62
90
  }
63
91
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectComponent, decorators: [{
64
92
  type: Component,
65
- args: [{ selector: 'sim-app-select', template: `
66
- <div class="form-group" [ngStyle]="{
67
- 'margin-top': marginTop + 'rem',
68
- 'margin-bottom': marginBottom + 'rem',
69
- 'margin-left': marginLeft + 'rem',
70
- 'margin-right': marginRight + 'rem'
71
- }">
72
- <label [for]="id">{{ label }}</label>
73
- <select class="form-control custom-select"
74
- [id]="id"
75
- [value]="value"
76
- (change)="onSelectChange($event)"
77
- [disabled]="disabled">
78
- <option *ngFor="let option of options" [value]="option.value">{{ option.label }}</option>
79
- </select>
93
+ args: [{ selector: 'argenta-custom-select', template: `
94
+ <div *ngIf="hasPermission()" class="form-group">
95
+ <label [for]="id" [ngClass]="'label-styles'">{{ label }}</label>
96
+ <div class="select-container">
97
+ <select class="form-control custom-select"
98
+ [id]="id"
99
+ [value]="value"
100
+ (change)="onSelectChange($event)"
101
+ [disabled]="disabled">
102
+ <option *ngFor="let option of options" [value]="option.value">{{ option.label }}</option>
103
+ </select>
104
+ <lucide-icon name="chevron-down" [size]="16" color="#5E6366" [strokeWidth]="1.75"></lucide-icon>
105
+ </div>
80
106
  </div>
81
107
  `, providers: [
82
108
  {
@@ -84,8 +110,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
84
110
  useExisting: forwardRef(() => SelectComponent),
85
111
  multi: true
86
112
  }
87
- ], changeDetection: ChangeDetectionStrategy.OnPush, styles: [".form-group{margin-bottom:1rem}.form-label{font-family:Arial,sans-serif;color:#333;font-size:1rem;font-weight:700}\n"] }]
88
- }], propDecorators: { label: [{
113
+ ], changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\";body{font-family:Inter,sans-serif}.form-group{font-family:Inter,Arial,sans-serif;font-size:1rem;font-weight:700}.form-check-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:.9rem}.form-check-label{width:623px;height:19px;top:1608px;left:133px;gap:0px;opacity:0px;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left}.custom-select{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:400;border:1px solid #ccc;border-radius:4px;padding:.5rem 2rem .5rem .5rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:none;background-repeat:no-repeat;background-position:right .5rem center}.custom-input{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:400;border:1px solid #ccc;border-radius:4px;padding:.5rem}.form-label{font-family:Inter,Arial,sans-serif;color:#333;font-size:1rem;font-weight:700}.label-styles{font-weight:400;font-family:Inter,Arial,sans-serif;font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.5rem}.select-container{position:relative;display:inline-block;width:100%}.select-container lucide-icon{position:absolute;right:.75rem;top:50%;transform:translateY(-50%);pointer-events:none;color:#5e6366}\n"] }]
114
+ }], ctorParameters: function () { return [{ type: i1.AuthService }]; }, propDecorators: { label: [{
89
115
  type: Input
90
116
  }], id: [{
91
117
  type: Input
@@ -93,15 +119,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
93
119
  type: Input
94
120
  }], options: [{
95
121
  type: Input
96
- }], marginTop: [{
97
- type: Input
98
- }], marginBottom: [{
99
- type: Input
100
- }], marginLeft: [{
101
- type: Input
102
- }], marginRight: [{
122
+ }], permissions: [{
103
123
  type: Input
104
124
  }], changeEvent: [{
105
125
  type: Output
106
126
  }] } });
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1wb3J0YWwtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBeUN6RSxNQUFNLE9BQU8sZUFBZTtJQXZDNUI7UUF3Q1csVUFBSyxHQUFXLGVBQWUsQ0FBQztRQUNoQyxPQUFFLEdBQVcsVUFBVSxDQUFDO1FBQ3hCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsWUFBTyxHQUFvQyxFQUFFLENBQUM7UUFDOUMsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUN6QixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBRXZCLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFM0QscUJBQWdCLEdBQXFCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxzQkFBaUIsR0FBZSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7S0EwQm5EO0lBdEJDLGNBQWMsQ0FBQyxLQUFZO1FBQ3pCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUEyQixDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDOytHQXRDVSxlQUFlO21HQUFmLGVBQWUsOFFBVGY7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDBCQWxDUzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCVDs7NEZBcUJVLGVBQWU7a0JBdkMzQixTQUFTOytCQUNFLGdCQUFnQixZQUNoQjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCVCxhQVlVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDOzRCQUM5QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ltLWFwcC1zZWxlY3QnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgW25nU3R5bGVdPVwie1xuICAgICAgJ21hcmdpbi10b3AnOiBtYXJnaW5Ub3AgKyAncmVtJyxcbiAgICAgICdtYXJnaW4tYm90dG9tJzogbWFyZ2luQm90dG9tICsgJ3JlbScsXG4gICAgICAnbWFyZ2luLWxlZnQnOiBtYXJnaW5MZWZ0ICsgJ3JlbScsXG4gICAgICAnbWFyZ2luLXJpZ2h0JzogbWFyZ2luUmlnaHQgKyAncmVtJ1xuICAgIH1cIj5cbiAgICAgIDxsYWJlbCBbZm9yXT1cImlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBjdXN0b20tc2VsZWN0XCJcbiAgICAgICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPnt7IG9wdGlvbi5sYWJlbCB9fTwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgIC5mb3JtLWdyb3VwIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG4gICAgfVxuICAgIC5mb3JtLWxhYmVsIHtcbiAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICAgIGNvbG9yOiAjMzMzO1xuICAgICAgZm9udC1zaXplOiAxcmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgfVxuICBgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdEZWZhdWx0IExhYmVsJztcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICdzZWxlY3RJZCc7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IHsgdmFsdWU6IGFueSwgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgQElucHV0KCkgbWFyZ2luVG9wOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBtYXJnaW5Cb3R0b206IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIG1hcmdpbkxlZnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIG1hcmdpblJpZ2h0OiBudW1iZXIgPSAwO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7IH07XG4gIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgdmFsdWU6IGFueTtcblxuICBvblNlbGVjdENoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBzZWxlY3RFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgIHRoaXMudmFsdWUgPSBzZWxlY3RFbGVtZW50LnZhbHVlO1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cbiJdfQ==
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1wb3J0YWwtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBdUMsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pKLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUErQi9CLE1BQU0sT0FBTyxlQUFlO0lBZTFCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBZG5DLFVBQUssR0FBVyxlQUFlLENBQUM7UUFDaEMsT0FBRSxHQUFXLFVBQVUsQ0FBQztRQUN4QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFlBQU8sR0FBb0MsRUFBRSxDQUFDO1FBRzdDLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFM0QscUJBQWdCLEdBQXFCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxzQkFBaUIsR0FBZSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFHMUMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFUyxDQUFDO0lBRWpELGNBQWMsQ0FBQyxLQUFZO1FBQ3pCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUEyQixDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRTtZQUM5RixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRDtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsVUFBMkM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6RDtRQUFDLE9BQU8sS0FBYyxFQUFFO1lBQ3ZCLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbkQ7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ2pFO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7K0dBdEVVLGVBQWU7bUdBQWYsZUFBZSxxTUFUZjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDO2dCQUM5QyxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsK0NBckJTOzs7Ozs7Ozs7Ozs7OztHQWNUOzs0RkFVVSxlQUFlO2tCQTNCM0IsU0FBUzsrQkFDRSx1QkFBdUIsWUFFdkI7Ozs7Ozs7Ozs7Ozs7O0dBY1QsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQzs0QkFDOUMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07a0dBR3RDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2F1dGgtc2VydmljZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXJnZW50YS1jdXN0b20tc2VsZWN0JyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cImhhc1Blcm1pc3Npb24oKVwiIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgPGxhYmVsIFtmb3JdPVwiaWRcIiBbbmdDbGFzc109XCInbGFiZWwtc3R5bGVzJ1wiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtY29udGFpbmVyXCI+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgY3VzdG9tLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+e3sgb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjE2XCIgY29sb3I9XCIjNUU2MzY2XCIgW3N0cm9rZVdpZHRoXT1cIjEuNzVcIj48L2x1Y2lkZS1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJ0RlZmF1bHQgTGFiZWwnO1xuICBASW5wdXQoKSBpZDogc3RyaW5nID0gJ3NlbGVjdElkJztcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgb3B0aW9uczogeyB2YWx1ZTogYW55LCBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICBASW5wdXQoKSBwZXJtaXNzaW9uczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgQE91dHB1dCgpIGNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICB2YWx1ZTogYW55O1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSkgeyB9XG5cbiAgb25TZWxlY3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICB0aGlzLnZhbHVlID0gc2VsZWN0RWxlbWVudC52YWx1ZTtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsdWUpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydvcHRpb25zJ10gJiYgY2hhbmdlc1snb3B0aW9ucyddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snb3B0aW9ucyddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlT3B0aW9ucyhjaGFuZ2VzWydvcHRpb25zJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVPcHRpb25zKG5ld09wdGlvbnM6IHsgdmFsdWU6IGFueSwgbGFiZWw6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBuZXdPcHRpb25zO1xuICB9XG5cbiAgaGFzUGVybWlzc2lvbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucGVybWlzc2lvbnMgfHwgdGhpcy5wZXJtaXNzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5oYXNQZXJtaXNzaW9uKHRoaXMucGVybWlzc2lvbnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQZXJtaXNzaW9uIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGVybWlzc2lvbiBjaGVjaycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=