@tolle_/tolle-ui 0.0.28-beta → 0.0.29-beta

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.
@@ -1,7 +1,7 @@
1
1
  import { Component, Input, ContentChildren, ViewChild, HostListener } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
4
- import { computePosition, flip, shift, offset, autoUpdate } from '@floating-ui/dom';
4
+ import { computePosition, flip, shift, offset, autoUpdate, size } from '@floating-ui/dom';
5
5
  import { SelectItemComponent } from './select-item.component';
6
6
  import { SelectService } from './select.service';
7
7
  import { cn } from './utils/cn';
@@ -18,6 +18,9 @@ export class MultiSelectComponent {
18
18
  searchable = false;
19
19
  disabled = false;
20
20
  class = '';
21
+ maxSelections;
22
+ maxDisplayItems = 3;
23
+ error = false; // Added to support error styling
21
24
  trigger;
22
25
  popover;
23
26
  items;
@@ -34,10 +37,58 @@ export class MultiSelectComponent {
34
37
  this.toggleValue(val);
35
38
  });
36
39
  }
40
+ // NEW: Matches InputComponent styles exactly
41
+ get computedTriggerClass() {
42
+ return cn(
43
+ // Base styles
44
+ 'flex min-h-10 w-full items-center justify-between rounded-md border transition-all duration-200 h-auto', 'bg-background text-sm',
45
+ // Border and shadow
46
+ 'border-input shadow-sm',
47
+ // Padding based on size (aligned with InputComponent logic)
48
+ this.size === 'xs' && 'px-2 py-1', this.size === 'sm' && 'px-3 py-1.5', this.size === 'default' && 'px-3 py-2', this.size === 'lg' && 'px-4 py-2',
49
+ // Focus state - ZARDUI STYLE (Soft ring, no offset)
50
+ !this.disabled && [
51
+ 'focus:outline-none',
52
+ 'focus:ring-4',
53
+ 'focus:ring-ring/30',
54
+ 'focus:ring-offset-0',
55
+ 'focus:shadow-none',
56
+ 'focus:border-primary/80' // Darkens border on focus
57
+ ],
58
+ // Hover state
59
+ !this.disabled && 'hover:border-accent',
60
+ // Error state
61
+ this.error && [
62
+ 'border-destructive',
63
+ !this.disabled && [
64
+ 'focus:border-destructive/80',
65
+ 'focus:ring-destructive/30'
66
+ ]
67
+ ],
68
+ // Disabled state
69
+ this.disabled && [
70
+ 'cursor-not-allowed opacity-50',
71
+ 'border-opacity-50'
72
+ ], this.class);
73
+ }
37
74
  ngAfterContentInit() {
38
75
  this.syncItems();
39
76
  this.items.changes.subscribe(() => this.syncItems());
40
77
  }
78
+ get displayItems() {
79
+ return this.selectedItems.slice(0, this.maxDisplayItems);
80
+ }
81
+ get exceedsDisplayLimit() {
82
+ return this.value.length > this.maxDisplayItems;
83
+ }
84
+ get selectableItems() {
85
+ return this.items ? this.items.filter(item => !item.disabled) : [];
86
+ }
87
+ get availableSelections() {
88
+ if (!this.maxSelections)
89
+ return Infinity;
90
+ return Math.max(0, this.maxSelections - this.value.length);
91
+ }
41
92
  toggle() {
42
93
  if (this.disabled)
43
94
  return;
@@ -49,16 +100,34 @@ export class MultiSelectComponent {
49
100
  }
50
101
  close() {
51
102
  this.isOpen = false;
103
+ this.searchQuery = '';
104
+ this.onSearchChange('');
52
105
  if (this.cleanup)
53
106
  this.cleanup();
54
107
  }
55
108
  updatePosition() {
109
+ if (!this.trigger || !this.popover)
110
+ return;
56
111
  this.cleanup = autoUpdate(this.trigger.nativeElement, this.popover.nativeElement, () => {
57
112
  computePosition(this.trigger.nativeElement, this.popover.nativeElement, {
113
+ strategy: 'fixed',
58
114
  placement: 'bottom-start',
59
- middleware: [offset(4), flip(), shift({ padding: 8 })],
60
- }).then(({ x, y }) => {
115
+ middleware: [
116
+ offset(4),
117
+ flip(),
118
+ shift({ padding: 8 }),
119
+ size({
120
+ apply({ rects, elements, availableHeight }) {
121
+ Object.assign(elements.floating.style, {
122
+ width: `${rects.reference.width}px`,
123
+ maxHeight: `${availableHeight}px`
124
+ });
125
+ },
126
+ }),
127
+ ],
128
+ }).then(({ x, y, strategy }) => {
61
129
  Object.assign(this.popover.nativeElement.style, {
130
+ position: strategy,
62
131
  left: `${x}px`,
63
132
  top: `${y}px`,
64
133
  visibility: 'visible',
@@ -68,12 +137,32 @@ export class MultiSelectComponent {
68
137
  }
69
138
  toggleValue(val) {
70
139
  const index = this.value.indexOf(val);
71
- index > -1 ? this.value.splice(index, 1) : this.value.push(val);
140
+ if (index > -1) {
141
+ this.value.splice(index, 1);
142
+ }
143
+ else {
144
+ if (this.maxSelections && this.value.length >= this.maxSelections)
145
+ return;
146
+ this.value.push(val);
147
+ }
72
148
  this.syncItems();
73
- this.onChange([...this.value]); // Return new array reference for Change Detection
149
+ this.onChange([...this.value]);
74
150
  }
75
151
  selectAll() {
76
- this.value = this.items.map(i => i.value);
152
+ if (!this.items)
153
+ return;
154
+ let itemsToSelect = [];
155
+ if (this.maxSelections) {
156
+ const availableItems = this.items
157
+ .filter(item => !item.disabled && !this.value.includes(item.value))
158
+ .slice(0, this.availableSelections)
159
+ .map(item => item.value);
160
+ itemsToSelect = [...this.value, ...availableItems];
161
+ }
162
+ else {
163
+ itemsToSelect = this.items.filter(item => !item.disabled).map(item => item.value);
164
+ }
165
+ this.value = itemsToSelect;
77
166
  this.syncItems();
78
167
  this.onChange([...this.value]);
79
168
  }
@@ -92,8 +181,15 @@ export class MultiSelectComponent {
92
181
  this.selectedItems = [];
93
182
  this.items.forEach(item => {
94
183
  item.selected = this.value.includes(item.value);
95
- if (item.selected)
184
+ if (item.selected) {
96
185
  this.selectedItems.push({ label: item.getLabel(), value: item.value });
186
+ }
187
+ if (this.maxSelections && this.value.length >= this.maxSelections) {
188
+ item.disabled = !this.value.includes(item.value);
189
+ }
190
+ else if (item.disabled) {
191
+ item.disabled = false;
192
+ }
97
193
  });
98
194
  }
99
195
  onSearchChange(q) {
@@ -115,45 +211,93 @@ export class MultiSelectComponent {
115
211
  // ControlValueAccessor
116
212
  onChange = () => { };
117
213
  onTouched = () => { };
118
- writeValue(v) { this.value = Array.isArray(v) ? v : []; this.syncItems(); }
214
+ writeValue(v) {
215
+ this.value = Array.isArray(v) ? v : [];
216
+ this.syncItems();
217
+ }
119
218
  registerOnChange(fn) { this.onChange = fn; }
120
219
  registerOnTouched(fn) { this.onTouched = fn; }
220
+ setDisabledState(isDisabled) { this.disabled = isDisabled; }
121
221
  cn = cn;
122
222
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i1.SelectService }], target: i0.ɵɵFactoryTarget.Component });
123
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MultiSelectComponent, isStandalone: true, selector: "tolle-multi-select", inputs: { placeholder: "placeholder", size: "size", searchable: "searchable", disabled: "disabled", class: "class" }, host: { listeners: { "document:mousedown": "onClickOutside($event)" } }, providers: [
223
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MultiSelectComponent, isStandalone: true, selector: "tolle-multi-select", inputs: { placeholder: "placeholder", size: "size", searchable: "searchable", disabled: "disabled", class: "class", maxSelections: "maxSelections", maxDisplayItems: "maxDisplayItems", error: "error" }, host: { listeners: { "document:mousedown": "onClickOutside($event)" } }, providers: [
124
224
  SelectService,
125
225
  { provide: NG_VALUE_ACCESSOR, useExisting: MultiSelectComponent, multi: true }
126
226
  ], queries: [{ propertyName: "items", predicate: SelectItemComponent, descendants: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "popover", first: true, predicate: ["popover"], descendants: true }], ngImport: i0, template: `
127
227
  <div [class]="cn('relative w-full', 'size-' + size)" #container>
128
- <button #trigger type="button" (click)="toggle()" [disabled]="disabled"
129
- [class]="cn('flex min-h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm focus:ring-2 focus:ring-ring focus:ring-offset-2 transition-all h-auto', class)">
228
+ <button
229
+ #trigger
230
+ type="button"
231
+ (click)="toggle()"
232
+ [disabled]="disabled"
233
+ [class]="computedTriggerClass">
234
+
130
235
  <div class="flex flex-wrap gap-1 items-center max-w-[95%]">
131
236
  <ng-container *ngIf="value?.length; else placeholderTpl">
132
- <tolle-badge *ngFor="let item of selectedItems" size="xs" variant="secondary" [removable]="true" (onRemove)="removeValue($event, item.value)">
237
+ <tolle-badge *ngFor="let item of displayItems" size="xs" variant="secondary" [removable]="true" (onRemove)="removeValue($event, item.value)">
133
238
  {{ item.label }}
134
239
  </tolle-badge>
240
+ <span *ngIf="exceedsDisplayLimit" class="text-xs text-muted-foreground px-1">
241
+ +{{ value.length - maxDisplayItems }} more
242
+ </span>
243
+ <span *ngIf="maxSelections && value.length >= maxSelections" class="text-xs text-muted-foreground px-1">
244
+ (Max reached)
245
+ </span>
135
246
  </ng-container>
136
247
  <ng-template #placeholderTpl><span class="text-muted-foreground">{{ placeholder }}</span></ng-template>
137
248
  </div>
138
- <i [class]="cn('ri-arrow-down-s-line text-muted-foreground ml-2 transition-transform', isOpen ? 'rotate-180' : '')"></i>
249
+ <i [class]="cn('ri-arrow-down-s-line text-muted-foreground ml-2 transition-transform duration-200', isOpen ? 'rotate-180' : '')"></i>
139
250
  </button>
140
251
 
141
- <div #popover *ngIf="isOpen" class="absolute bg-popover z-50 min-w-full rounded-md border border-border shadow-md overflow-hidden" style="visibility: hidden;">
252
+ <div #popover *ngIf="isOpen"
253
+ class="fixed bg-popover z-[999] rounded-md border border-border shadow-md overflow-hidden"
254
+ style="visibility: hidden; top: 0; left: 0;">
142
255
 
143
256
  <div class="p-2 border-b border-border space-y-2 bg-popover">
257
+ <div class="flex items-center justify-between px-1 text-xs">
258
+ <span class="text-muted-foreground">
259
+ {{ value.length }} selected
260
+ <span *ngIf="maxSelections">/ {{ maxSelections }} max</span>
261
+ </span>
262
+ <span *ngIf="maxSelections && value.length >= maxSelections" class="text-destructive text-xs font-medium">
263
+ Maximum reached
264
+ </span>
265
+ </div>
266
+
144
267
  <tolle-input *ngIf="searchable" size="xs" placeholder="Search..." [(ngModel)]="searchQuery" (ngModelChange)="onSearchChange($event)">
145
268
  <i prefix class="ri-search-line"></i>
146
269
  </tolle-input>
147
270
 
148
271
  <div class="flex items-center justify-between px-1">
149
- <button type="button" (click)="selectAll()" class="text-[10px] font-bold uppercase text-primary hover:underline">Select All</button>
150
- <button type="button" (click)="clearAll()" class="text-[10px] font-bold uppercase text-muted-foreground hover:underline">Clear</button>
272
+ <button type="button"
273
+ (click)="selectAll()"
274
+ [disabled]="maxSelections && selectableItems.length > maxSelections"
275
+ [class]="cn(
276
+ 'text-[10px] font-bold uppercase transition-colors',
277
+ maxSelections && selectableItems.length > maxSelections
278
+ ? 'text-muted-foreground cursor-not-allowed'
279
+ : 'text-primary hover:underline'
280
+ )">
281
+ Select All
282
+ </button>
283
+ <button type="button" (click)="clearAll()" class="text-[10px] font-bold uppercase text-muted-foreground hover:underline">
284
+ Clear
285
+ </button>
151
286
  </div>
152
287
  </div>
153
288
 
154
289
  <div class="p-1 max-h-60 overflow-y-auto">
155
290
  <ng-content></ng-content>
156
- <div *ngIf="noResults" class="py-4 text-center text-xs text-muted-foreground">No results found for "{{searchQuery}}"</div>
291
+ <div *ngIf="noResults" class="py-4 text-center text-xs text-muted-foreground">
292
+ No results found for "{{searchQuery}}"
293
+ </div>
294
+ <div *ngIf="maxSelections && value.length >= maxSelections"
295
+ class="p-2 text-center border-t border-border bg-muted/20">
296
+ <span class="text-xs text-destructive">
297
+ <i class="ri-alert-line mr-1"></i>
298
+ Maximum selection limit reached ({{maxSelections}})
299
+ </span>
300
+ </div>
157
301
  </div>
158
302
  </div>
159
303
  </div>
@@ -171,35 +315,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
171
315
  ],
172
316
  template: `
173
317
  <div [class]="cn('relative w-full', 'size-' + size)" #container>
174
- <button #trigger type="button" (click)="toggle()" [disabled]="disabled"
175
- [class]="cn('flex min-h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm focus:ring-2 focus:ring-ring focus:ring-offset-2 transition-all h-auto', class)">
318
+ <button
319
+ #trigger
320
+ type="button"
321
+ (click)="toggle()"
322
+ [disabled]="disabled"
323
+ [class]="computedTriggerClass">
324
+
176
325
  <div class="flex flex-wrap gap-1 items-center max-w-[95%]">
177
326
  <ng-container *ngIf="value?.length; else placeholderTpl">
178
- <tolle-badge *ngFor="let item of selectedItems" size="xs" variant="secondary" [removable]="true" (onRemove)="removeValue($event, item.value)">
327
+ <tolle-badge *ngFor="let item of displayItems" size="xs" variant="secondary" [removable]="true" (onRemove)="removeValue($event, item.value)">
179
328
  {{ item.label }}
180
329
  </tolle-badge>
330
+ <span *ngIf="exceedsDisplayLimit" class="text-xs text-muted-foreground px-1">
331
+ +{{ value.length - maxDisplayItems }} more
332
+ </span>
333
+ <span *ngIf="maxSelections && value.length >= maxSelections" class="text-xs text-muted-foreground px-1">
334
+ (Max reached)
335
+ </span>
181
336
  </ng-container>
182
337
  <ng-template #placeholderTpl><span class="text-muted-foreground">{{ placeholder }}</span></ng-template>
183
338
  </div>
184
- <i [class]="cn('ri-arrow-down-s-line text-muted-foreground ml-2 transition-transform', isOpen ? 'rotate-180' : '')"></i>
339
+ <i [class]="cn('ri-arrow-down-s-line text-muted-foreground ml-2 transition-transform duration-200', isOpen ? 'rotate-180' : '')"></i>
185
340
  </button>
186
341
 
187
- <div #popover *ngIf="isOpen" class="absolute bg-popover z-50 min-w-full rounded-md border border-border shadow-md overflow-hidden" style="visibility: hidden;">
342
+ <div #popover *ngIf="isOpen"
343
+ class="fixed bg-popover z-[999] rounded-md border border-border shadow-md overflow-hidden"
344
+ style="visibility: hidden; top: 0; left: 0;">
188
345
 
189
346
  <div class="p-2 border-b border-border space-y-2 bg-popover">
347
+ <div class="flex items-center justify-between px-1 text-xs">
348
+ <span class="text-muted-foreground">
349
+ {{ value.length }} selected
350
+ <span *ngIf="maxSelections">/ {{ maxSelections }} max</span>
351
+ </span>
352
+ <span *ngIf="maxSelections && value.length >= maxSelections" class="text-destructive text-xs font-medium">
353
+ Maximum reached
354
+ </span>
355
+ </div>
356
+
190
357
  <tolle-input *ngIf="searchable" size="xs" placeholder="Search..." [(ngModel)]="searchQuery" (ngModelChange)="onSearchChange($event)">
191
358
  <i prefix class="ri-search-line"></i>
192
359
  </tolle-input>
193
360
 
194
361
  <div class="flex items-center justify-between px-1">
195
- <button type="button" (click)="selectAll()" class="text-[10px] font-bold uppercase text-primary hover:underline">Select All</button>
196
- <button type="button" (click)="clearAll()" class="text-[10px] font-bold uppercase text-muted-foreground hover:underline">Clear</button>
362
+ <button type="button"
363
+ (click)="selectAll()"
364
+ [disabled]="maxSelections && selectableItems.length > maxSelections"
365
+ [class]="cn(
366
+ 'text-[10px] font-bold uppercase transition-colors',
367
+ maxSelections && selectableItems.length > maxSelections
368
+ ? 'text-muted-foreground cursor-not-allowed'
369
+ : 'text-primary hover:underline'
370
+ )">
371
+ Select All
372
+ </button>
373
+ <button type="button" (click)="clearAll()" class="text-[10px] font-bold uppercase text-muted-foreground hover:underline">
374
+ Clear
375
+ </button>
197
376
  </div>
198
377
  </div>
199
378
 
200
379
  <div class="p-1 max-h-60 overflow-y-auto">
201
380
  <ng-content></ng-content>
202
- <div *ngIf="noResults" class="py-4 text-center text-xs text-muted-foreground">No results found for "{{searchQuery}}"</div>
381
+ <div *ngIf="noResults" class="py-4 text-center text-xs text-muted-foreground">
382
+ No results found for "{{searchQuery}}"
383
+ </div>
384
+ <div *ngIf="maxSelections && value.length >= maxSelections"
385
+ class="p-2 text-center border-t border-border bg-muted/20">
386
+ <span class="text-xs text-destructive">
387
+ <i class="ri-alert-line mr-1"></i>
388
+ Maximum selection limit reached ({{maxSelections}})
389
+ </span>
390
+ </div>
203
391
  </div>
204
392
  </div>
205
393
  </div>
@@ -215,6 +403,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
215
403
  type: Input
216
404
  }], class: [{
217
405
  type: Input
406
+ }], maxSelections: [{
407
+ type: Input
408
+ }], maxDisplayItems: [{
409
+ type: Input
410
+ }], error: [{
411
+ type: Input
218
412
  }], trigger: [{
219
413
  type: ViewChild,
220
414
  args: ['trigger']
@@ -228,4 +422,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
228
422
  type: HostListener,
229
423
  args: ['document:mousedown', ['$event']]
230
424
  }] } });
231
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQTJDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDOzs7OztBQThDakQsTUFBTSxPQUFPLG9CQUFvQjtJQWtCWDtJQWpCWCxXQUFXLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsSUFBSSxHQUFtQyxTQUFTLENBQUM7SUFDakQsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFRSxPQUFPLENBQWM7SUFDckIsT0FBTyxDQUFjO0lBQ2tCLEtBQUssQ0FBa0M7SUFFcEcsS0FBSyxHQUFVLEVBQUUsQ0FBQztJQUNsQixhQUFhLEdBQWtDLEVBQUUsQ0FBQztJQUNsRCxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2YsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ1YsT0FBTyxDQUFjO0lBRTdCLFlBQW9CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoRCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDckYsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO2dCQUN0RSxTQUFTLEVBQUUsY0FBYztnQkFDekIsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNuQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtvQkFDOUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO29CQUNkLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSTtvQkFDYixVQUFVLEVBQUUsU0FBUztpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBUTtRQUNsQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsa0RBQWtEO0lBQ3BGLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWlCLEVBQUUsR0FBUTtRQUNyQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxDQUFTO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFDekIsSUFBSSxTQUFTO2dCQUFFLFlBQVksRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUdELGNBQWMsQ0FBQyxLQUFpQjtRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzdILElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLFFBQVEsR0FBUSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDekIsU0FBUyxHQUFRLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUMxQixVQUFVLENBQUMsQ0FBUSxJQUFVLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLGdCQUFnQixDQUFDLEVBQU8sSUFBVSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsaUJBQWlCLENBQUMsRUFBTyxJQUFVLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxFQUFFLEdBQUcsRUFBRSxDQUFDO3dHQXBIUCxvQkFBb0I7NEZBQXBCLG9CQUFvQixnUUF4Q3BCO1lBQ1QsYUFBYTtZQUNiLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1NBQy9FLGdEQThDZ0IsbUJBQW1CLHlPQTdDMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ1QsMkRBdkNTLFlBQVksK1BBQUUsV0FBVywrVkFBRSxjQUFjLGtJQUFFLGNBQWM7OzRGQXlDeEQsb0JBQW9CO2tCQTVDaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDO29CQUNwRSxTQUFTLEVBQUU7d0JBQ1QsYUFBYTt3QkFDYixFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLHNCQUFzQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7cUJBQy9FO29CQUNELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDVDtpQkFDRjtrRkFFVSxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVnQixPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ0UsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQUN5QyxLQUFLO3NCQUFqRSxlQUFlO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkErRjNELGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBBZnRlckNvbnRlbnRJbml0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjb21wdXRlUG9zaXRpb24sIGZsaXAsIHNoaWZ0LCBvZmZzZXQsIGF1dG9VcGRhdGUgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IFNlbGVjdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL3NlbGVjdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi9zZWxlY3Quc2VydmljZSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHtJbnB1dENvbXBvbmVudH0gZnJvbSAnLi9pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHtCYWRnZUNvbXBvbmVudH0gZnJvbSAnLi9iYWRnZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1tdWx0aS1zZWxlY3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQmFkZ2VDb21wb25lbnQsIElucHV0Q29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgU2VsZWN0U2VydmljZSxcbiAgICB7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogTXVsdGlTZWxlY3RDb21wb25lbnQsIG11bHRpOiB0cnVlIH1cbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjbigncmVsYXRpdmUgdy1mdWxsJywgJ3NpemUtJyArIHNpemUpXCIgI2NvbnRhaW5lcj5cbiAgICAgIDxidXR0b24gI3RyaWdnZXIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ0b2dnbGUoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJjbignZmxleCBtaW4taC0xMCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1yaW5nIGZvY3VzOnJpbmctb2Zmc2V0LTIgdHJhbnNpdGlvbi1hbGwgaC1hdXRvJywgY2xhc3MpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMSBpdGVtcy1jZW50ZXIgbWF4LXctWzk1JV1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFsdWU/Lmxlbmd0aDsgZWxzZSBwbGFjZWhvbGRlclRwbFwiPlxuICAgICAgICAgICAgPHRvbGxlLWJhZGdlICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkSXRlbXNcIiBzaXplPVwieHNcIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKG9uUmVtb3ZlKT1cInJlbW92ZVZhbHVlKCRldmVudCwgaXRlbS52YWx1ZSlcIj5cbiAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgPC90b2xsZS1iYWRnZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVHBsPjxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgcGxhY2Vob2xkZXIgfX08L3NwYW4+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpIFtjbGFzc109XCJjbigncmktYXJyb3ctZG93bi1zLWxpbmUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG1sLTIgdHJhbnNpdGlvbi10cmFuc2Zvcm0nLCBpc09wZW4gPyAncm90YXRlLTE4MCcgOiAnJylcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGRpdiAjcG9wb3ZlciAqbmdJZj1cImlzT3BlblwiIGNsYXNzPVwiYWJzb2x1dGUgYmctcG9wb3ZlciB6LTUwIG1pbi13LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWJvcmRlciBzaGFkb3ctbWQgb3ZlcmZsb3ctaGlkZGVuXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtMiBib3JkZXItYiBib3JkZXItYm9yZGVyIHNwYWNlLXktMiBiZy1wb3BvdmVyXCI+XG4gICAgICAgICAgPHRvbGxlLWlucHV0ICpuZ0lmPVwic2VhcmNoYWJsZVwiIHNpemU9XCJ4c1wiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hRdWVyeVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxpIHByZWZpeCBjbGFzcz1cInJpLXNlYXJjaC1saW5lXCI+PC9pPlxuICAgICAgICAgIDwvdG9sbGUtaW5wdXQ+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZWxlY3RBbGwoKVwiIGNsYXNzPVwidGV4dC1bMTBweF0gZm9udC1ib2xkIHVwcGVyY2FzZSB0ZXh0LXByaW1hcnkgaG92ZXI6dW5kZXJsaW5lXCI+U2VsZWN0IEFsbDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsZWFyQWxsKClcIiBjbGFzcz1cInRleHQtWzEwcHhdIGZvbnQtYm9sZCB1cHBlcmNhc2UgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnVuZGVybGluZVwiPkNsZWFyPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLTEgbWF4LWgtNjAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJub1Jlc3VsdHNcIiBjbGFzcz1cInB5LTQgdGV4dC1jZW50ZXIgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5ObyByZXN1bHRzIGZvdW5kIGZvciBcInt7c2VhcmNoUXVlcnl9fVwiPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdCBvcHRpb25zLi4uJztcbiAgQElucHV0KCkgc2l6ZTogJ3hzJyB8ICdzbScgfCAnZGVmYXVsdCcgfCAnbGcnID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBzZWFyY2hhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicpIHRyaWdnZXIhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwb3BvdmVyJykgcG9wb3ZlciE6IEVsZW1lbnRSZWY7XG4gIEBDb250ZW50Q2hpbGRyZW4oU2VsZWN0SXRlbUNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBpdGVtcyE6IFF1ZXJ5TGlzdDxTZWxlY3RJdGVtQ29tcG9uZW50PjtcblxuICB2YWx1ZTogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRJdGVtczoge2xhYmVsOiBzdHJpbmcsIHZhbHVlOiBhbnl9W10gPSBbXTtcbiAgaXNPcGVuID0gZmFsc2U7XG4gIHNlYXJjaFF1ZXJ5ID0gJyc7XG4gIG5vUmVzdWx0cyA9IGZhbHNlO1xuICBwcml2YXRlIGNsZWFudXA/OiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VsZWN0U2VydmljZTogU2VsZWN0U2VydmljZSkge1xuICAgIHRoaXMuc2VsZWN0U2VydmljZS5zZWxlY3RlZFZhbHVlJC5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmlzT3BlbikgdGhpcy50b2dnbGVWYWx1ZSh2YWwpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5pdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN5bmNJdGVtcygpKTtcbiAgfVxuXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID8gdGhpcy5jbG9zZSgpIDogdGhpcy5vcGVuKCk7XG4gIH1cblxuICBvcGVuKCkge1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNsZWFudXApIHRoaXMuY2xlYW51cCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQb3NpdGlvbigpIHtcbiAgICB0aGlzLmNsZWFudXAgPSBhdXRvVXBkYXRlKHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudCwgKCkgPT4ge1xuICAgICAgY29tcHV0ZVBvc2l0aW9uKHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudCwge1xuICAgICAgICBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnLFxuICAgICAgICBtaWRkbGV3YXJlOiBbb2Zmc2V0KDQpLCBmbGlwKCksIHNoaWZ0KHsgcGFkZGluZzogOCB9KV0sXG4gICAgICB9KS50aGVuKCh7IHgsIHkgfSkgPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgbGVmdDogYCR7eH1weGAsXG4gICAgICAgICAgdG9wOiBgJHt5fXB4YCxcbiAgICAgICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVWYWx1ZSh2YWw6IGFueSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWx1ZS5pbmRleE9mKHZhbCk7XG4gICAgaW5kZXggPiAtMSA/IHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKSA6IHRoaXMudmFsdWUucHVzaCh2YWwpO1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5vbkNoYW5nZShbLi4udGhpcy52YWx1ZV0pOyAvLyBSZXR1cm4gbmV3IGFycmF5IHJlZmVyZW5jZSBmb3IgQ2hhbmdlIERldGVjdGlvblxuICB9XG5cbiAgc2VsZWN0QWxsKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLml0ZW1zLm1hcChpID0+IGkudmFsdWUpO1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5vbkNoYW5nZShbLi4udGhpcy52YWx1ZV0pO1xuICB9XG5cbiAgY2xlYXJBbGwoKSB7XG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gICAgdGhpcy5vbkNoYW5nZShbXSk7XG4gIH1cblxuICByZW1vdmVWYWx1ZShldmVudDogTW91c2VFdmVudCwgdmFsOiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnRvZ2dsZVZhbHVlKHZhbCk7XG4gIH1cblxuICBwcml2YXRlIHN5bmNJdGVtcygpIHtcbiAgICBpZiAoIXRoaXMuaXRlbXMpIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpdGVtLnNlbGVjdGVkID0gdGhpcy52YWx1ZS5pbmNsdWRlcyhpdGVtLnZhbHVlKTtcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkKSB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaCh7IGxhYmVsOiBpdGVtLmdldExhYmVsKCksIHZhbHVlOiBpdGVtLnZhbHVlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25TZWFyY2hDaGFuZ2UocTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsdGVyID0gKHEgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IHZpc2libGVDb3VudCA9IDA7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgaXNWaXNpYmxlID0gaXRlbS5nZXRMYWJlbCgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICAgIGl0ZW0uaGlkZGVuID0gIWlzVmlzaWJsZTtcbiAgICAgIGlmIChpc1Zpc2libGUpIHZpc2libGVDb3VudCsrO1xuICAgIH0pO1xuICAgIHRoaXMubm9SZXN1bHRzID0gdmlzaWJsZUNvdW50ID09PSAwICYmIGZpbHRlciAhPT0gJyc7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBvbkNsaWNrT3V0c2lkZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmlzT3BlbiAmJiAhdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhdGhpcy5wb3BvdmVyPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvclxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG4gIHdyaXRlVmFsdWUodjogYW55W10pOiB2b2lkIHsgdGhpcy52YWx1ZSA9IEFycmF5LmlzQXJyYXkodikgPyB2IDogW107IHRoaXMuc3luY0l0ZW1zKCk7IH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQTJDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUEwRm5ELE1BQU0sT0FBTyxvQkFBb0I7SUFxQlg7SUFwQlgsV0FBVyxHQUFHLG1CQUFtQixDQUFDO0lBQ2xDLElBQUksR0FBbUMsU0FBUyxDQUFDO0lBQ2pELFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ1gsYUFBYSxDQUFVO0lBQ3ZCLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDcEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLGlDQUFpQztJQUVu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QUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRWdCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDRSxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ3lDLEtBQUs7c0JBQWpFLGVBQWU7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQXlNM0QsY0FBYztzQkFEYixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIEFmdGVyQ29udGVudEluaXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNvbXB1dGVQb3NpdGlvbiwgZmxpcCwgc2hpZnQsIG9mZnNldCwgYXV0b1VwZGF0ZSwgc2l6ZSB9IGZyb20gJ0BmbG9hdGluZy11aS9kb20nO1xuaW1wb3J0IHsgU2VsZWN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vc2VsZWN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IFNlbGVjdFNlcnZpY2UgfSBmcm9tICcuL3NlbGVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5pbXBvcnQgeyBJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnLi9iYWRnZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1tdWx0aS1zZWxlY3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQmFkZ2VDb21wb25lbnQsIElucHV0Q29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgU2VsZWN0U2VydmljZSxcbiAgICB7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogTXVsdGlTZWxlY3RDb21wb25lbnQsIG11bHRpOiB0cnVlIH1cbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjbigncmVsYXRpdmUgdy1mdWxsJywgJ3NpemUtJyArIHNpemUpXCIgI2NvbnRhaW5lcj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgI3RyaWdnZXJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzc109XCJjb21wdXRlZFRyaWdnZXJDbGFzc1wiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMSBpdGVtcy1jZW50ZXIgbWF4LXctWzk1JV1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFsdWU/Lmxlbmd0aDsgZWxzZSBwbGFjZWhvbGRlclRwbFwiPlxuICAgICAgICAgICAgPHRvbGxlLWJhZGdlICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRpc3BsYXlJdGVtc1wiIHNpemU9XCJ4c1wiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiAob25SZW1vdmUpPVwicmVtb3ZlVmFsdWUoJGV2ZW50LCBpdGVtLnZhbHVlKVwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L3RvbGxlLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJleGNlZWRzRGlzcGxheUxpbWl0XCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0xXCI+XG4gICAgICAgICAgICAgICt7eyB2YWx1ZS5sZW5ndGggLSBtYXhEaXNwbGF5SXRlbXMgfX0gbW9yZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhTZWxlY3Rpb25zICYmIHZhbHVlLmxlbmd0aCA+PSBtYXhTZWxlY3Rpb25zXCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0xXCI+XG4gICAgICAgICAgICAgIChNYXggcmVhY2hlZClcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVHBsPjxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgcGxhY2Vob2xkZXIgfX08L3NwYW4+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpIFtjbGFzc109XCJjbigncmktYXJyb3ctZG93bi1zLWxpbmUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG1sLTIgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwJywgaXNPcGVuID8gJ3JvdGF0ZS0xODAnIDogJycpXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxkaXYgI3BvcG92ZXIgKm5nSWY9XCJpc09wZW5cIlxuICAgICAgICAgICBjbGFzcz1cImZpeGVkIGJnLXBvcG92ZXIgei1bOTk5XSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIHNoYWRvdy1tZCBvdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgICAgICBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjsgdG9wOiAwOyBsZWZ0OiAwO1wiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLTIgYm9yZGVyLWIgYm9yZGVyLWJvcmRlciBzcGFjZS15LTIgYmctcG9wb3ZlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtMSB0ZXh0LXhzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICB7eyB2YWx1ZS5sZW5ndGggfX0gc2VsZWN0ZWRcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXhTZWxlY3Rpb25zXCI+LyB7eyBtYXhTZWxlY3Rpb25zIH19IG1heDwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibWF4U2VsZWN0aW9ucyAmJiB2YWx1ZS5sZW5ndGggPj0gbWF4U2VsZWN0aW9uc1wiIGNsYXNzPVwidGV4dC1kZXN0cnVjdGl2ZSB0ZXh0LXhzIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgIE1heGltdW0gcmVhY2hlZFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHRvbGxlLWlucHV0ICpuZ0lmPVwic2VhcmNoYWJsZVwiIHNpemU9XCJ4c1wiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hRdWVyeVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxpIHByZWZpeCBjbGFzcz1cInJpLXNlYXJjaC1saW5lXCI+PC9pPlxuICAgICAgICAgIDwvdG9sbGUtaW5wdXQ+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtYXhTZWxlY3Rpb25zICYmIHNlbGVjdGFibGVJdGVtcy5sZW5ndGggPiBtYXhTZWxlY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LVsxMHB4XSBmb250LWJvbGQgdXBwZXJjYXNlIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgICAgICAgICAgICAgICBtYXhTZWxlY3Rpb25zICYmIHNlbGVjdGFibGVJdGVtcy5sZW5ndGggPiBtYXhTZWxlY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0ZXh0LW11dGVkLWZvcmVncm91bmQgY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAndGV4dC1wcmltYXJ5IGhvdmVyOnVuZGVybGluZSdcbiAgICAgICAgICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAgICBTZWxlY3QgQWxsXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbGVhckFsbCgpXCIgY2xhc3M9XCJ0ZXh0LVsxMHB4XSBmb250LWJvbGQgdXBwZXJjYXNlIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp1bmRlcmxpbmVcIj5cbiAgICAgICAgICAgICAgQ2xlYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwicC0xIG1heC1oLTYwIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibm9SZXN1bHRzXCIgY2xhc3M9XCJweS00IHRleHQtY2VudGVyIHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICBObyByZXN1bHRzIGZvdW5kIGZvciBcInt7c2VhcmNoUXVlcnl9fVwiXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm1heFNlbGVjdGlvbnMgJiYgdmFsdWUubGVuZ3RoID49IG1heFNlbGVjdGlvbnNcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJwLTIgdGV4dC1jZW50ZXIgYm9yZGVyLXQgYm9yZGVyLWJvcmRlciBiZy1tdXRlZC8yMFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHRleHQtZGVzdHJ1Y3RpdmVcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJyaS1hbGVydC1saW5lIG1yLTFcIj48L2k+XG4gICAgICAgICAgICAgIE1heGltdW0gc2VsZWN0aW9uIGxpbWl0IHJlYWNoZWQgKHt7bWF4U2VsZWN0aW9uc319KVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyQ29udGVudEluaXQge1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdTZWxlY3Qgb3B0aW9ucy4uLic7XG4gIEBJbnB1dCgpIHNpemU6ICd4cycgfCAnc20nIHwgJ2RlZmF1bHQnIHwgJ2xnJyA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgc2VhcmNoYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBASW5wdXQoKSBtYXhTZWxlY3Rpb25zPzogbnVtYmVyO1xuICBASW5wdXQoKSBtYXhEaXNwbGF5SXRlbXMgPSAzO1xuICBASW5wdXQoKSBlcnJvciA9IGZhbHNlOyAvLyBBZGRlZCB0byBzdXBwb3J0IGVycm9yIHN0eWxpbmdcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJykgdHJpZ2dlciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3BvcG92ZXInKSBwb3BvdmVyITogRWxlbWVudFJlZjtcbiAgQENvbnRlbnRDaGlsZHJlbihTZWxlY3RJdGVtQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGl0ZW1zITogUXVlcnlMaXN0PFNlbGVjdEl0ZW1Db21wb25lbnQ+O1xuXG4gIHZhbHVlOiBhbnlbXSA9IFtdO1xuICBzZWxlY3RlZEl0ZW1zOiB7bGFiZWw6IHN0cmluZywgdmFsdWU6IGFueX1bXSA9IFtdO1xuICBpc09wZW4gPSBmYWxzZTtcbiAgc2VhcmNoUXVlcnkgPSAnJztcbiAgbm9SZXN1bHRzID0gZmFsc2U7XG4gIHByaXZhdGUgY2xlYW51cD86ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZWxlY3RTZXJ2aWNlOiBTZWxlY3RTZXJ2aWNlKSB7XG4gICAgdGhpcy5zZWxlY3RTZXJ2aWNlLnNlbGVjdGVkVmFsdWUkLnN1YnNjcmliZSh2YWwgPT4ge1xuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNPcGVuKSB0aGlzLnRvZ2dsZVZhbHVlKHZhbCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBORVc6IE1hdGNoZXMgSW5wdXRDb21wb25lbnQgc3R5bGVzIGV4YWN0bHlcbiAgZ2V0IGNvbXB1dGVkVHJpZ2dlckNsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgIC8vIEJhc2Ugc3R5bGVzXG4gICAgICAnZmxleCBtaW4taC0xMCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByb3VuZGVkLW1kIGJvcmRlciB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgaC1hdXRvJyxcbiAgICAgICdiZy1iYWNrZ3JvdW5kIHRleHQtc20nLFxuXG4gICAgICAvLyBCb3JkZXIgYW5kIHNoYWRvd1xuICAgICAgJ2JvcmRlci1pbnB1dCBzaGFkb3ctc20nLFxuXG4gICAgICAvLyBQYWRkaW5nIGJhc2VkIG9uIHNpemUgKGFsaWduZWQgd2l0aCBJbnB1dENvbXBvbmVudCBsb2dpYylcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ3hzJyAmJiAncHgtMiBweS0xJyxcbiAgICAgIHRoaXMuc2l6ZSA9PT0gJ3NtJyAmJiAncHgtMyBweS0xLjUnLFxuICAgICAgdGhpcy5zaXplID09PSAnZGVmYXVsdCcgJiYgJ3B4LTMgcHktMicsXG4gICAgICB0aGlzLnNpemUgPT09ICdsZycgJiYgJ3B4LTQgcHktMicsXG5cbiAgICAgIC8vIEZvY3VzIHN0YXRlIC0gWkFSRFVJIFNUWUxFIChTb2Z0IHJpbmcsIG5vIG9mZnNldClcbiAgICAgICF0aGlzLmRpc2FibGVkICYmIFtcbiAgICAgICAgJ2ZvY3VzOm91dGxpbmUtbm9uZScsXG4gICAgICAgICdmb2N1czpyaW5nLTQnLFxuICAgICAgICAnZm9jdXM6cmluZy1yaW5nLzMwJyxcbiAgICAgICAgJ2ZvY3VzOnJpbmctb2Zmc2V0LTAnLFxuICAgICAgICAnZm9jdXM6c2hhZG93LW5vbmUnLFxuICAgICAgICAnZm9jdXM6Ym9yZGVyLXByaW1hcnkvODAnIC8vIERhcmtlbnMgYm9yZGVyIG9uIGZvY3VzXG4gICAgICBdLFxuXG4gICAgICAvLyBIb3ZlciBzdGF0ZVxuICAgICAgIXRoaXMuZGlzYWJsZWQgJiYgJ2hvdmVyOmJvcmRlci1hY2NlbnQnLFxuXG4gICAgICAvLyBFcnJvciBzdGF0ZVxuICAgICAgdGhpcy5lcnJvciAmJiBbXG4gICAgICAgICdib3JkZXItZGVzdHJ1Y3RpdmUnLFxuICAgICAgICAhdGhpcy5kaXNhYmxlZCAmJiBbXG4gICAgICAgICAgJ2ZvY3VzOmJvcmRlci1kZXN0cnVjdGl2ZS84MCcsXG4gICAgICAgICAgJ2ZvY3VzOnJpbmctZGVzdHJ1Y3RpdmUvMzAnXG4gICAgICAgIF1cbiAgICAgIF0sXG5cbiAgICAgIC8vIERpc2FibGVkIHN0YXRlXG4gICAgICB0aGlzLmRpc2FibGVkICYmIFtcbiAgICAgICAgJ2N1cnNvci1ub3QtYWxsb3dlZCBvcGFjaXR5LTUwJyxcbiAgICAgICAgJ2JvcmRlci1vcGFjaXR5LTUwJ1xuICAgICAgXSxcblxuICAgICAgdGhpcy5jbGFzc1xuICAgICk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zeW5jSXRlbXMoKTtcbiAgICB0aGlzLml0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3luY0l0ZW1zKCkpO1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlJdGVtcygpOiB7bGFiZWw6IHN0cmluZywgdmFsdWU6IGFueX1bXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcy5zbGljZSgwLCB0aGlzLm1heERpc3BsYXlJdGVtcyk7XG4gIH1cblxuICBnZXQgZXhjZWVkc0Rpc3BsYXlMaW1pdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggPiB0aGlzLm1heERpc3BsYXlJdGVtcztcbiAgfVxuXG4gIGdldCBzZWxlY3RhYmxlSXRlbXMoKTogU2VsZWN0SXRlbUNvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcyA/IHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQpIDogW107XG4gIH1cblxuICBnZXQgYXZhaWxhYmxlU2VsZWN0aW9ucygpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5tYXhTZWxlY3Rpb25zKSByZXR1cm4gSW5maW5pdHk7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMubWF4U2VsZWN0aW9ucyAtIHRoaXMudmFsdWUubGVuZ3RoKTtcbiAgfVxuXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID8gdGhpcy5jbG9zZSgpIDogdGhpcy5vcGVuKCk7XG4gIH1cblxuICBvcGVuKCkge1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcbiAgICB0aGlzLm9uU2VhcmNoQ2hhbmdlKCcnKTtcbiAgICBpZiAodGhpcy5jbGVhbnVwKSB0aGlzLmNsZWFudXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIgfHwgIXRoaXMucG9wb3ZlcikgcmV0dXJuO1xuXG4gICAgdGhpcy5jbGVhbnVwID0gYXV0b1VwZGF0ZSh0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wb3BvdmVyLm5hdGl2ZUVsZW1lbnQsICgpID0+IHtcbiAgICAgIGNvbXB1dGVQb3NpdGlvbih0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wb3BvdmVyLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgICAgc3RyYXRlZ3k6ICdmaXhlZCcsXG4gICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbS1zdGFydCcsXG4gICAgICAgIG1pZGRsZXdhcmU6IFtcbiAgICAgICAgICBvZmZzZXQoNCksXG4gICAgICAgICAgZmxpcCgpLFxuICAgICAgICAgIHNoaWZ0KHsgcGFkZGluZzogOCB9KSxcbiAgICAgICAgICBzaXplKHtcbiAgICAgICAgICAgIGFwcGx5KHsgcmVjdHMsIGVsZW1lbnRzLCBhdmFpbGFibGVIZWlnaHQgfSkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnRzLmZsb2F0aW5nLnN0eWxlLCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGAke3JlY3RzLnJlZmVyZW5jZS53aWR0aH1weGAsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBgJHthdmFpbGFibGVIZWlnaHR9cHhgXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLnRoZW4oKHsgeCwgeSwgc3RyYXRlZ3kgfSkgPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMucG9wb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLCB7XG4gICAgICAgICAgcG9zaXRpb246IHN0cmF0ZWd5LFxuICAgICAgICAgIGxlZnQ6IGAke3h9cHhgLFxuICAgICAgICAgIHRvcDogYCR7eX1weGAsXG4gICAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlVmFsdWUodmFsOiBhbnkpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsdWUuaW5kZXhPZih2YWwpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm1heFNlbGVjdGlvbnMgJiYgdGhpcy52YWx1ZS5sZW5ndGggPj0gdGhpcy5tYXhTZWxlY3Rpb25zKSByZXR1cm47XG4gICAgICB0aGlzLnZhbHVlLnB1c2godmFsKTtcbiAgICB9XG4gICAgdGhpcy5zeW5jSXRlbXMoKTtcbiAgICB0aGlzLm9uQ2hhbmdlKFsuLi50aGlzLnZhbHVlXSk7XG4gIH1cblxuICBzZWxlY3RBbGwoKSB7XG4gICAgaWYgKCF0aGlzLml0ZW1zKSByZXR1cm47XG4gICAgbGV0IGl0ZW1zVG9TZWxlY3Q6IGFueVtdID0gW107XG4gICAgaWYgKHRoaXMubWF4U2VsZWN0aW9ucykge1xuICAgICAgY29uc3QgYXZhaWxhYmxlSXRlbXMgPSB0aGlzLml0ZW1zXG4gICAgICAgIC5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCAmJiAhdGhpcy52YWx1ZS5pbmNsdWRlcyhpdGVtLnZhbHVlKSlcbiAgICAgICAgLnNsaWNlKDAsIHRoaXMuYXZhaWxhYmxlU2VsZWN0aW9ucylcbiAgICAgICAgLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpO1xuICAgICAgaXRlbXNUb1NlbGVjdCA9IFsuLi50aGlzLnZhbHVlLCAuLi5hdmFpbGFibGVJdGVtc107XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zVG9TZWxlY3QgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkKS5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IGl0ZW1zVG9TZWxlY3Q7XG4gICAgdGhpcy5zeW5jSXRlbXMoKTtcbiAgICB0aGlzLm9uQ2hhbmdlKFsuLi50aGlzLnZhbHVlXSk7XG4gIH1cblxuICBjbGVhckFsbCgpIHtcbiAgICB0aGlzLnZhbHVlID0gW107XG4gICAgdGhpcy5zeW5jSXRlbXMoKTtcbiAgICB0aGlzLm9uQ2hhbmdlKFtdKTtcbiAgfVxuXG4gIHJlbW92ZVZhbHVlKGV2ZW50OiBNb3VzZUV2ZW50LCB2YWw6IGFueSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudG9nZ2xlVmFsdWUodmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY0l0ZW1zKCkge1xuICAgIGlmICghdGhpcy5pdGVtcykgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGl0ZW0uc2VsZWN0ZWQgPSB0aGlzLnZhbHVlLmluY2x1ZGVzKGl0ZW0udmFsdWUpO1xuICAgICAgaWYgKGl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2goeyBsYWJlbDogaXRlbS5nZXRMYWJlbCgpLCB2YWx1ZTogaXRlbS52YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1heFNlbGVjdGlvbnMgJiYgdGhpcy52YWx1ZS5sZW5ndGggPj0gdGhpcy5tYXhTZWxlY3Rpb25zKSB7XG4gICAgICAgIGl0ZW0uZGlzYWJsZWQgPSAhdGhpcy52YWx1ZS5pbmNsdWRlcyhpdGVtLnZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5kaXNhYmxlZCkge1xuICAgICAgICBpdGVtLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblNlYXJjaENoYW5nZShxOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSAocSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBsZXQgdmlzaWJsZUNvdW50ID0gMDtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBpc1Zpc2libGUgPSBpdGVtLmdldExhYmVsKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgICAgaXRlbS5oaWRkZW4gPSAhaXNWaXNpYmxlO1xuICAgICAgaWYgKGlzVmlzaWJsZSkgdmlzaWJsZUNvdW50Kys7XG4gICAgfSk7XG4gICAgdGhpcy5ub1Jlc3VsdHMgPSB2aXNpYmxlQ291bnQgPT09IDAgJiYgZmlsdGVyICE9PSAnJztcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuICYmICF0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmICF0aGlzLnBvcG92ZXI/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcbiAgd3JpdGVWYWx1ZSh2OiBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBBcnJheS5pc0FycmF5KHYpID8gdiA6IFtdO1xuICAgIHRoaXMuc3luY0l0ZW1zKCk7XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7IHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkOyB9XG5cbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
@@ -177,7 +177,7 @@ export class PaginationComponent {
177
177
  </div>
178
178
  </div>
179
179
  </div>
180
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { 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: SelectComponent, selector: "tolle-select", inputs: ["placeholder", "class", "disabled", "searchable", "size", "readonly"] }, { kind: "component", type: SelectItemComponent, selector: "tolle-select-item", inputs: ["value", "class", "selected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
180
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { 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: SelectComponent, selector: "tolle-select", inputs: ["placeholder", "class", "disabled", "searchable", "size", "readonly"] }, { kind: "component", type: SelectItemComponent, selector: "tolle-select-item", inputs: ["value", "class", "selected", "disabled", "multiSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
181
181
  }
182
182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PaginationComponent, decorators: [{
183
183
  type: Component,