@paperless/angular 2.22.0-alpha.9 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +4 -31
  2. package/fesm2022/paperless-angular.mjs +1930 -1863
  3. package/fesm2022/paperless-angular.mjs.map +1 -1
  4. package/package.json +6 -8
  5. package/paperless.css +28 -20
  6. package/types/paperless-angular.d.ts +1802 -0
  7. package/esm2022/lib/animations/fade.mjs +0 -22
  8. package/esm2022/lib/animations/index.mjs +0 -3
  9. package/esm2022/lib/animations/slide.mjs +0 -20
  10. package/esm2022/lib/base/form.component.mjs +0 -113
  11. package/esm2022/lib/base/index.mjs +0 -4
  12. package/esm2022/lib/base/number-value-accessor.mjs +0 -36
  13. package/esm2022/lib/base/upload.component.mjs +0 -57
  14. package/esm2022/lib/base/value-accessor.mjs +0 -43
  15. package/esm2022/lib/directives/index.mjs +0 -33
  16. package/esm2022/lib/directives/p-checkbox.directive.mjs +0 -39
  17. package/esm2022/lib/directives/p-cropper.directive.mjs +0 -37
  18. package/esm2022/lib/directives/p-datepicker.directive.mjs +0 -38
  19. package/esm2022/lib/directives/p-field-number.directive.mjs +0 -34
  20. package/esm2022/lib/directives/p-field.directive.mjs +0 -38
  21. package/esm2022/lib/directives/p-pagination-pages.directive.mjs +0 -41
  22. package/esm2022/lib/directives/p-pagination-size.directive.mjs +0 -41
  23. package/esm2022/lib/directives/p-radio.directive.mjs +0 -63
  24. package/esm2022/lib/directives/p-select.directive.mjs +0 -37
  25. package/esm2022/lib/directives/p-toggle.directive.mjs +0 -38
  26. package/esm2022/lib/modules/index.mjs +0 -8
  27. package/esm2022/lib/modules/overlay/index.mjs +0 -4
  28. package/esm2022/lib/modules/overlay/overlay.module.mjs +0 -40
  29. package/esm2022/lib/modules/overlay/overlay.ref.mjs +0 -14
  30. package/esm2022/lib/modules/overlay/overlay.service.mjs +0 -77
  31. package/esm2022/lib/modules/table/base/index.mjs +0 -2
  32. package/esm2022/lib/modules/table/base/table.component.mjs +0 -229
  33. package/esm2022/lib/modules/table/components/index.mjs +0 -18
  34. package/esm2022/lib/modules/table/components/table/constants.mjs +0 -3
  35. package/esm2022/lib/modules/table/components/table/table.component.mjs +0 -1078
  36. package/esm2022/lib/modules/table/components/table-cell/table-cell.component.mjs +0 -170
  37. package/esm2022/lib/modules/table/components/table-column/table-column.component.mjs +0 -62
  38. package/esm2022/lib/modules/table/components/table-extra-header/table-extra-header.component.mjs +0 -40
  39. package/esm2022/lib/modules/table/components/table-row-action/table-row-action.component.mjs +0 -88
  40. package/esm2022/lib/modules/table/directives/index.mjs +0 -27
  41. package/esm2022/lib/modules/table/directives/p-table-custom-actions.directive.mjs +0 -13
  42. package/esm2022/lib/modules/table/directives/p-table-custom-filter.directive.mjs +0 -13
  43. package/esm2022/lib/modules/table/directives/p-table-custom-row.directive.mjs +0 -20
  44. package/esm2022/lib/modules/table/directives/p-table-filter-modal.directive.mjs +0 -13
  45. package/esm2022/lib/modules/table/directives/p-table-footer.directive.mjs +0 -52
  46. package/esm2022/lib/modules/table/directives/p-table-header.directive.mjs +0 -59
  47. package/esm2022/lib/modules/table/directives/p-table-ngx.directive.mjs +0 -129
  48. package/esm2022/lib/modules/table/directives/p-table.directive.mjs +0 -77
  49. package/esm2022/lib/modules/table/index.mjs +0 -6
  50. package/esm2022/lib/modules/table/table.module.mjs +0 -34
  51. package/esm2022/lib/modules/table/utils.mjs +0 -29
  52. package/esm2022/lib/modules/toast/components/index.mjs +0 -4
  53. package/esm2022/lib/modules/toast/components/toast-container/toast-container.component.mjs +0 -38
  54. package/esm2022/lib/modules/toast/directives/index.mjs +0 -4
  55. package/esm2022/lib/modules/toast/directives/toast.directive.mjs +0 -51
  56. package/esm2022/lib/modules/toast/index.mjs +0 -6
  57. package/esm2022/lib/modules/toast/toast.module.mjs +0 -24
  58. package/esm2022/lib/modules/toast/toast.service.mjs +0 -51
  59. package/esm2022/lib/modules/toast/types.mjs +0 -11
  60. package/esm2022/lib/paperless.module.mjs +0 -41
  61. package/esm2022/lib/pipes/currency.pipe.mjs +0 -21
  62. package/esm2022/lib/pipes/date.pipe.mjs +0 -21
  63. package/esm2022/lib/pipes/index.mjs +0 -18
  64. package/esm2022/lib/pipes/safe.pipe.mjs +0 -34
  65. package/esm2022/lib/pipes/select-autocomplete.pipe.mjs +0 -17
  66. package/esm2022/lib/pipes/select-select-all.pipe.mjs +0 -17
  67. package/esm2022/lib/stencil/angular-component-lib/utils.mjs +0 -59
  68. package/esm2022/lib/stencil/components.mjs +0 -2013
  69. package/esm2022/lib/stencil/index.mjs +0 -78
  70. package/esm2022/lib/stencil.module.mjs +0 -17
  71. package/esm2022/paperless-angular.mjs +0 -5
  72. package/esm2022/public-api.mjs +0 -12
  73. package/index.d.ts +0 -5
  74. package/lib/animations/fade.d.ts +0 -2
  75. package/lib/animations/index.d.ts +0 -2
  76. package/lib/animations/slide.d.ts +0 -2
  77. package/lib/base/form.component.d.ts +0 -15
  78. package/lib/base/index.d.ts +0 -3
  79. package/lib/base/number-value-accessor.d.ts +0 -14
  80. package/lib/base/upload.component.d.ts +0 -16
  81. package/lib/base/value-accessor.d.ts +0 -17
  82. package/lib/directives/index.d.ts +0 -14
  83. package/lib/directives/p-checkbox.directive.d.ts +0 -9
  84. package/lib/directives/p-cropper.directive.d.ts +0 -9
  85. package/lib/directives/p-datepicker.directive.d.ts +0 -9
  86. package/lib/directives/p-field-number.directive.d.ts +0 -8
  87. package/lib/directives/p-field.directive.d.ts +0 -9
  88. package/lib/directives/p-pagination-pages.directive.d.ts +0 -10
  89. package/lib/directives/p-pagination-size.directive.d.ts +0 -10
  90. package/lib/directives/p-radio.directive.d.ts +0 -18
  91. package/lib/directives/p-select.directive.d.ts +0 -9
  92. package/lib/directives/p-toggle.directive.d.ts +0 -9
  93. package/lib/modules/index.d.ts +0 -5
  94. package/lib/modules/overlay/index.d.ts +0 -3
  95. package/lib/modules/overlay/overlay.module.d.ts +0 -12
  96. package/lib/modules/overlay/overlay.ref.d.ts +0 -9
  97. package/lib/modules/overlay/overlay.service.d.ts +0 -24
  98. package/lib/modules/table/base/index.d.ts +0 -1
  99. package/lib/modules/table/base/table.component.d.ts +0 -70
  100. package/lib/modules/table/components/index.d.ts +0 -11
  101. package/lib/modules/table/components/table/constants.d.ts +0 -2
  102. package/lib/modules/table/components/table/table.component.d.ts +0 -337
  103. package/lib/modules/table/components/table-cell/table-cell.component.d.ts +0 -53
  104. package/lib/modules/table/components/table-column/table-column.component.d.ts +0 -17
  105. package/lib/modules/table/components/table-extra-header/table-extra-header.component.d.ts +0 -17
  106. package/lib/modules/table/components/table-row-action/table-row-action.component.d.ts +0 -48
  107. package/lib/modules/table/directives/index.d.ts +0 -15
  108. package/lib/modules/table/directives/p-table-custom-actions.directive.d.ts +0 -5
  109. package/lib/modules/table/directives/p-table-custom-filter.directive.d.ts +0 -5
  110. package/lib/modules/table/directives/p-table-custom-row.directive.d.ts +0 -9
  111. package/lib/modules/table/directives/p-table-filter-modal.directive.d.ts +0 -5
  112. package/lib/modules/table/directives/p-table-footer.directive.d.ts +0 -11
  113. package/lib/modules/table/directives/p-table-header.directive.d.ts +0 -17
  114. package/lib/modules/table/directives/p-table-ngx.directive.d.ts +0 -27
  115. package/lib/modules/table/directives/p-table.directive.d.ts +0 -22
  116. package/lib/modules/table/index.d.ts +0 -5
  117. package/lib/modules/table/table.module.d.ts +0 -22
  118. package/lib/modules/table/utils.d.ts +0 -10
  119. package/lib/modules/toast/components/index.d.ts +0 -3
  120. package/lib/modules/toast/components/toast-container/toast-container.component.d.ts +0 -16
  121. package/lib/modules/toast/directives/index.d.ts +0 -3
  122. package/lib/modules/toast/directives/toast.directive.d.ts +0 -16
  123. package/lib/modules/toast/index.d.ts +0 -5
  124. package/lib/modules/toast/toast.module.d.ts +0 -10
  125. package/lib/modules/toast/toast.service.d.ts +0 -12
  126. package/lib/modules/toast/types.d.ts +0 -32
  127. package/lib/paperless.module.d.ts +0 -26
  128. package/lib/pipes/currency.pipe.d.ts +0 -10
  129. package/lib/pipes/date.pipe.d.ts +0 -10
  130. package/lib/pipes/index.d.ts +0 -10
  131. package/lib/pipes/safe.pipe.d.ts +0 -10
  132. package/lib/pipes/select-autocomplete.pipe.d.ts +0 -7
  133. package/lib/pipes/select-select-all.pipe.d.ts +0 -7
  134. package/lib/stencil/angular-component-lib/utils.d.ts +0 -9
  135. package/lib/stencil/components.d.ts +0 -883
  136. package/lib/stencil/index.d.ts +0 -2
  137. package/lib/stencil.module.d.ts +0 -7
  138. package/public-api.d.ts +0 -8
@@ -1,1078 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, TemplateRef, ViewChild, ViewChildren, } from '@angular/core';
3
- import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
4
- import { cn, floatingMenuContainerClass, isMobile, onStateChange, state, tableColumSizesOptions, } from '@paperless/core';
5
- import { BehaviorSubject, debounceTime, distinctUntilChanged, filter, take, } from 'rxjs';
6
- import { PTableRow } from '../../../../stencil/components';
7
- import { TableCustomActionsDirective, TableCustomFilterDirective, TableFilterModalDirective, } from '../../directives';
8
- import { TableCustomRowDirective } from '../../directives/p-table-custom-row.directive';
9
- import { TableCell } from '../table-cell/table-cell.component';
10
- import { TableColumn } from '../table-column/table-column.component';
11
- import { TableExtraHeader } from '../table-extra-header/table-extra-header.component';
12
- import { TableRowAction, } from '../table-row-action/table-row-action.component';
13
- import { defaultSize, defaultSizeOptions } from './constants';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "@angular/common";
16
- import * as i2 from "@angular/router";
17
- import * as i3 from "../../../../stencil/components";
18
- import * as i4 from "../table-cell/table-cell.component";
19
- import * as i5 from "../../directives/p-table-footer.directive";
20
- import * as i6 from "../../directives/p-table-header.directive";
21
- let Table = class Table {
22
- _cd;
23
- className = 'flex flex-col z-0';
24
- theme = state.theme;
25
- /**
26
- * The items to be fed to the table
27
- */
28
- items;
29
- /**
30
- * Wether data is loading
31
- */
32
- loading = false;
33
- /**
34
- * Wether the header should show loading state
35
- */
36
- headerLoading = false;
37
- /**
38
- * Wether the footer should show loading state
39
- */
40
- footerLoading = false;
41
- /**
42
- * The amount of loading rows to show
43
- */
44
- amountOfLoadingRows = 6;
45
- /**
46
- * Wether to enable selection
47
- */
48
- enableRowSelection = true;
49
- /**
50
- * A limit to the amount of rows that can be selected
51
- */
52
- rowSelectionLimit = undefined;
53
- /**
54
- * Wether to enable row clicking
55
- */
56
- enableRowClick = true;
57
- /**
58
- * The current selection of items
59
- */
60
- selectedRows = [];
61
- /**
62
- * Event whenever the current selection changes
63
- */
64
- selectedRowsChange = new EventEmitter();
65
- /**
66
- * The key to determine if a row is selected
67
- */
68
- selectionKey;
69
- /**
70
- * A key to determine if a row can be selected
71
- */
72
- canSelectKey;
73
- /**
74
- * Wether to enable the floating menu
75
- */
76
- enableFloatingMenu = true;
77
- /**
78
- * The floating menu amount item text
79
- */
80
- floatingMenuAmountSelectedText = '0 items selected';
81
- /**
82
- * The template for amount selected item in the floating menu
83
- */
84
- floatingMenuAmountSelectedTemplate;
85
- /**
86
- * Wether the floating menu has been shown atleast once
87
- */
88
- floatingMenuShown$ = new BehaviorSubject(false);
89
- /**
90
- * Event whenever a row is clicked
91
- */
92
- rowClick = new EventEmitter();
93
- /**
94
- * Event whenever a row is selected
95
- */
96
- rowSelected = new EventEmitter();
97
- /**
98
- * Event whenever a row is deselected
99
- */
100
- rowDeselected = new EventEmitter();
101
- /** START HEADER */
102
- /**
103
- * Wether to show the header
104
- */
105
- enableHeader = true;
106
- /**
107
- * Quick filters to show
108
- */
109
- quickFilters = [];
110
- /**
111
- * Active quick filter identifier
112
- */
113
- activeQuickFilterIdentifier;
114
- /**
115
- * Wether to show the search input
116
- */
117
- enableSearch = true;
118
- /**
119
- * The query to show in the search bar
120
- */
121
- query;
122
- /**
123
- * Wether to show the filter button
124
- */
125
- enableFilter = true;
126
- /**
127
- * Wether to show the filter button on desktop
128
- */
129
- enableFilterDesktop = true;
130
- /**
131
- * The amount of filters being selected
132
- */
133
- selectedFiltersAmount;
134
- /**
135
- * The template for the filter button text
136
- */
137
- filterButtonTemplate;
138
- /**
139
- * Wether to show the action button
140
- */
141
- enableAction = false;
142
- /**
143
- * Wether the action button is loading
144
- */
145
- actionButtonLoading = false;
146
- /**
147
- * The action button icon
148
- */
149
- actionButtonIcon = 'pencil';
150
- /**
151
- * Wether the action button is enabled
152
- */
153
- actionButtonEnabled = true;
154
- /**
155
- * The action button text if changed
156
- */
157
- actionButtonText;
158
- /**
159
- * The template for the action button text
160
- */
161
- actionButtonTemplate;
162
- /**
163
- * Event when one of the quick filters is clicked
164
- */
165
- quickFilter = new EventEmitter();
166
- /**
167
- * Event when the query changes
168
- */
169
- queryChange = new EventEmitter();
170
- /**
171
- * Event when the filter button is clicked
172
- */
173
- filter = new EventEmitter();
174
- /**
175
- * Event when the action button is clicked
176
- */
177
- action = new EventEmitter();
178
- /** START FOOTER */
179
- /**
180
- * Wether to show the footer
181
- */
182
- enableFooter = true;
183
- /**
184
- * Wether to enable pagination size select
185
- */
186
- enablePaginationSize = true;
187
- /**
188
- * Wether to enable pagination pages
189
- */
190
- enablePaginationPages = true;
191
- /**
192
- * Wether to enable export
193
- */
194
- enableExport = true;
195
- /**
196
- * The current page
197
- */
198
- page = 1;
199
- /**
200
- * The total amount of items
201
- */
202
- total;
203
- /**
204
- * Event whenever the page changes
205
- */
206
- pageChange = new EventEmitter();
207
- /**
208
- * The amount of items per page
209
- */
210
- pageSize = defaultSize;
211
- /**
212
- * The options for the page size
213
- */
214
- pageSizeOptions = defaultSizeOptions;
215
- /**
216
- * Event whenever the page changes
217
- */
218
- pageSizeChange = new EventEmitter();
219
- /**
220
- * Event whenever the page changes
221
- */
222
- export = new EventEmitter();
223
- /**
224
- * Wether to hide when there is only 1 page available
225
- */
226
- hideOnSinglePage = true;
227
- /* Empty state start */
228
- emptyStateType = 'no_filter';
229
- emptyStateIllustration = 'table';
230
- emptyStateHeader;
231
- emptyStateContent;
232
- emptyStateAction;
233
- emptyStateActionIcon = 'plus';
234
- enableEmptyStateAction = true;
235
- emptyStateFilteredIllustration = 'search';
236
- emptyStateFilteredHeader;
237
- emptyStateFilteredContent;
238
- /**
239
- * Wether to enable scrolling
240
- */
241
- enableScroll = false;
242
- tableRows;
243
- tableCells;
244
- scrollContainer;
245
- reachedScrollStart$ = new BehaviorSubject(true);
246
- reachedScrollEnd$ = new BehaviorSubject(false);
247
- _totalWidth = 0;
248
- _calculateColumnWidthsTimeout;
249
- _rowChangesSubscription;
250
- _cellChangesSubscription;
251
- /**
252
- * Event whenever the empty state is clicked
253
- */
254
- emptyStateActionClick = new EventEmitter();
255
- /* Empty state end */
256
- /*
257
- * Wether to show the shadow or not
258
- */
259
- shadow = true;
260
- extraHeaders$ = new BehaviorSubject([]);
261
- columns$ = new BehaviorSubject([]);
262
- parsedItems = [];
263
- loadingRows = Array.from({
264
- length: this.amountOfLoadingRows,
265
- });
266
- _ctrlDown = false;
267
- // Angular stuff
268
- // custom filter template
269
- headerCustomFilterTemplate;
270
- // custom actions template
271
- headerCustomActionsTemplate;
272
- // column templates
273
- columnDefinitions;
274
- extraHeaderDefinitions;
275
- // filter modal
276
- filterModalTemplate;
277
- filterModalShow$ = new BehaviorSubject(false);
278
- // row actions templates
279
- _rowActions;
280
- _rowActionsSubscriptions = [];
281
- set rowActions(v) {
282
- this._rowActions = v;
283
- this._setRowSelectionData();
284
- }
285
- get rowActions() {
286
- return this._rowActions;
287
- }
288
- // custom rows templates
289
- customRows;
290
- filterModalHeaderText = 'Filters';
291
- filterModalSaveText = 'Save';
292
- filterModalCancelText = 'Cancel';
293
- filterModalResetText = 'Reset filters';
294
- filterModalShowReset = false;
295
- filterModalShowResetMobile = false;
296
- filterModalShow = new EventEmitter();
297
- filterModalSave = new EventEmitter();
298
- filterModalReset = new EventEmitter();
299
- rowActionsRow$ = new BehaviorSubject([]);
300
- rowActionsFloatingAll$ = new BehaviorSubject([]);
301
- rowActionsFloating$ = new BehaviorSubject([]);
302
- isMobile$ = new BehaviorSubject(isMobile());
303
- // sticky self-center
304
- // mt-4 -mb-5 bottom-11 z-[3]
305
- // my-4 bottom-0
306
- // pointer-events-none animate-floating-menu-container-out
307
- // animate-floating-menu-container-in
308
- // hidden
309
- // inline-block
310
- floatingMenuContainerClass = floatingMenuContainerClass;
311
- _resizeTimeout;
312
- _inputEnableRowSelection = this.enableRowSelection;
313
- _inputRowSelectionLimit = this.rowSelectionLimit;
314
- _themeDebounce;
315
- footerHidden$ = new BehaviorSubject(false);
316
- cn = cn;
317
- constructor(_cd) {
318
- this._cd = _cd;
319
- }
320
- ngOnInit() {
321
- this._parseItems(this.items);
322
- onStateChange('theme', value => this._checkTheme(value));
323
- this.loadingRows = Array.from({
324
- length: this.amountOfLoadingRows,
325
- });
326
- this.filterModalShow$
327
- .pipe(untilDestroyed(this), distinctUntilChanged())
328
- .subscribe(value => this.filterModalShow.next(value));
329
- }
330
- ngOnChanges(changes) {
331
- if (changes['items']) {
332
- this._parseItems(changes['items'].currentValue);
333
- }
334
- if (changes['amountOfLoadingRows']) {
335
- this.loadingRows = Array.from({
336
- length: changes['amountOfLoadingRows'].currentValue,
337
- });
338
- }
339
- let calculateRowSelectionData = false;
340
- if (changes['enableRowSelection']) {
341
- this._inputEnableRowSelection =
342
- changes['enableRowSelection'].currentValue;
343
- calculateRowSelectionData = true;
344
- }
345
- if (changes['rowSelectionLimit']) {
346
- this._inputRowSelectionLimit = changes['rowSelectionLimit'].currentValue;
347
- calculateRowSelectionData = true;
348
- }
349
- if (calculateRowSelectionData || changes['selectedRows']) {
350
- this._setRowSelectionData();
351
- }
352
- if (changes['enableScroll']?.currentValue) {
353
- this._checkChangesSubscriptions();
354
- }
355
- }
356
- ngAfterViewInit() {
357
- if (this.enableScroll) {
358
- this._checkChangesSubscriptions();
359
- }
360
- if (this.columnDefinitions) {
361
- this.columnDefinitions.changes
362
- .pipe(untilDestroyed(this), debounceTime(100))
363
- .subscribe(() => this._generateColumns());
364
- this._generateColumns();
365
- }
366
- if (this.extraHeaderDefinitions) {
367
- this.extraHeaderDefinitions.changes
368
- .pipe(untilDestroyed(this), debounceTime(100))
369
- .subscribe(() => this._generateExtraHeaders());
370
- this._generateExtraHeaders();
371
- }
372
- }
373
- onResize() {
374
- this._setRowSelectionData();
375
- this._calculateColumnWidths();
376
- }
377
- keyDown({ key }) {
378
- if (key !== 'Control' || this._ctrlDown === true) {
379
- return;
380
- }
381
- this._ctrlDown = true;
382
- }
383
- keyUp({ key }) {
384
- if (key !== 'Control' || this._ctrlDown === false) {
385
- return;
386
- }
387
- this._ctrlDown = false;
388
- }
389
- visibilityChange() {
390
- if (document.visibilityState !== 'hidden' || this._ctrlDown === false) {
391
- return;
392
- }
393
- this._ctrlDown = false;
394
- }
395
- onQueryChange({ detail }) {
396
- this.queryChange.emit(detail);
397
- }
398
- onQuickFilter({ detail }) {
399
- this.quickFilter.emit(detail);
400
- }
401
- onPageSizeChange({ detail }) {
402
- this.pageSize = detail;
403
- this.pageSizeChange.emit(detail);
404
- }
405
- onPageChange({ detail }) {
406
- this.page = detail;
407
- this.pageChange.emit(detail);
408
- }
409
- onFilterModalSave() {
410
- this.filterModalSave.next();
411
- this.filterModalShow$.next(false);
412
- }
413
- onFilterModalReset(resetQuickFilter = false) {
414
- this.filterModalReset.next(resetQuickFilter);
415
- this.filterModalShow$.next(false);
416
- }
417
- emptyStateClicked() {
418
- if (this.enableAction) {
419
- this.action.emit();
420
- return;
421
- }
422
- if (!this.enableEmptyStateAction) {
423
- return;
424
- }
425
- this.emptyStateActionClick.emit();
426
- }
427
- parseRowActionsRow(actions, rowIndex) {
428
- if (!actions?.length) {
429
- return [];
430
- }
431
- return actions.filter(a => !a.showFunction || a.showFunction(this.parsedItems[rowIndex]));
432
- }
433
- onContainerXScroll(ev) {
434
- if (!this.enableScroll) {
435
- return;
436
- }
437
- this._calculateScrollPosition(ev);
438
- }
439
- _parseItems(items) {
440
- if (!items) {
441
- this.parsedItems = [];
442
- return;
443
- }
444
- if (Array.isArray(items)) {
445
- this.parsedItems = items;
446
- return;
447
- }
448
- this.parsedItems = JSON.parse(items);
449
- }
450
- _generateColumns() {
451
- let definitionsArray = Array.from(this.columnDefinitions);
452
- definitionsArray = this._parseDefinitions(definitionsArray);
453
- this.columns$.next(definitionsArray);
454
- }
455
- _generateExtraHeaders() {
456
- let definitionsArray = Array.from(this.extraHeaderDefinitions);
457
- definitionsArray = this._parseDefinitions(definitionsArray);
458
- for (const col of definitionsArray) {
459
- col.sticky = col.sticky === true ? 'secondary' : false;
460
- }
461
- this.extraHeaders$.next(definitionsArray);
462
- }
463
- _checkboxDisabled(item, rowIndex) {
464
- const selectionContains = this._selectionContains(item, rowIndex);
465
- return ((this.canSelectKey && !item[this.canSelectKey]) ||
466
- (this.rowSelectionLimit !== undefined &&
467
- !selectionContains &&
468
- this.selectedRows.length === this.rowSelectionLimit));
469
- }
470
- _selectAllChange($event, forceValue) {
471
- if (!this.enableRowSelection) {
472
- return;
473
- }
474
- const value = forceValue === undefined ? $event.detail : forceValue;
475
- if (value) {
476
- const toAdd = [];
477
- for (let i = 0; i < this.parsedItems.length; i++) {
478
- const row = this.parsedItems[i];
479
- if (this.canSelectKey && !row[this.canSelectKey]) {
480
- continue;
481
- }
482
- if (this._selectionContains(row, i)) {
483
- continue;
484
- }
485
- toAdd.push(row);
486
- this.rowSelected.emit(row);
487
- if (this.rowSelectionLimit !== undefined &&
488
- this.selectedRows.length + toAdd.length === this.rowSelectionLimit) {
489
- break;
490
- }
491
- }
492
- this.selectedRows = [...this.selectedRows, ...toAdd];
493
- this.selectedRowsChange.emit(this.selectedRows);
494
- if (this.enableFloatingMenu) {
495
- this._showFloatingMenu();
496
- }
497
- return;
498
- }
499
- for (let i = 0; i < this.selectedRows.length; i++) {
500
- const value = this.selectedRows[i];
501
- const row = this.parsedItems.find(d => this._getSelectionValue(d, i) === this._getSelectionValue(value, i));
502
- if (!row) {
503
- continue;
504
- }
505
- this.rowDeselected.emit(row);
506
- }
507
- this.selectedRows = [];
508
- this.selectedRowsChange.emit(this.selectedRows);
509
- }
510
- _checkboxChange(target, index) {
511
- if (!this.enableRowSelection) {
512
- return;
513
- }
514
- const value = this._getCheckedValue(target);
515
- if (value &&
516
- this.rowSelectionLimit !== undefined &&
517
- this.selectedRows.length >= this.rowSelectionLimit) {
518
- target.checked = false;
519
- return;
520
- }
521
- const row = this.parsedItems[index];
522
- if (this.canSelectKey && !row[this.canSelectKey]) {
523
- target.checked = false;
524
- return;
525
- }
526
- if (value) {
527
- this.selectedRows = [...this.selectedRows, row];
528
- this.selectedRowsChange.emit(this.selectedRows);
529
- this.rowSelected.emit(row);
530
- if (this.enableFloatingMenu) {
531
- this._showFloatingMenu();
532
- }
533
- return;
534
- }
535
- const indexOfToRemove = this._selectionContains(row, index, true);
536
- // we need to do this, because splice does not trigger the selection setter.
537
- const selection = [...this.selectedRows];
538
- selection.splice(indexOfToRemove, 1);
539
- this.selectedRows = selection;
540
- this.selectedRowsChange.emit(this.selectedRows);
541
- this.rowDeselected.emit(row);
542
- }
543
- _getCheckedValue(target) {
544
- return target?.checked;
545
- }
546
- _getSelectionValue(row, index) {
547
- return this.selectionKey ? row?.[this.selectionKey] || index : index;
548
- }
549
- _selectionContains(row, index, returnIndex = false) {
550
- const returnValue = this.selectedRows.findIndex(item => this._getSelectionValue(row, index) ===
551
- this._getSelectionValue(item, index));
552
- return !returnIndex ? returnValue >= 0 : returnValue;
553
- }
554
- _selectionContainsAll() {
555
- let returnValue = true;
556
- if (!this.parsedItems?.length) {
557
- return false;
558
- }
559
- if (this.rowSelectionLimit !== undefined &&
560
- this.selectedRows.length === this.rowSelectionLimit) {
561
- return true;
562
- }
563
- for (let i = 0; i < this.parsedItems?.length; i++) {
564
- const item = this.parsedItems[i];
565
- const contains = this._selectionContains(item, i);
566
- if (!contains) {
567
- returnValue = false;
568
- break;
569
- }
570
- }
571
- return returnValue;
572
- }
573
- _selectionIndeterminate() {
574
- if (!this.parsedItems?.length || !this.selectedRows?.length) {
575
- return false;
576
- }
577
- if (this.rowSelectionLimit !== undefined &&
578
- this.selectedRows.length === this.rowSelectionLimit) {
579
- return false;
580
- }
581
- let containsCount = 0;
582
- for (let i = 0; i < this.parsedItems?.length; i++) {
583
- const item = this.parsedItems[i];
584
- const contains = this._selectionContains(item, i);
585
- if (contains) {
586
- containsCount++;
587
- }
588
- }
589
- return containsCount > 0 && containsCount !== this.parsedItems.length;
590
- }
591
- _rowClick($event, index) {
592
- const target = $event.target;
593
- if (target.tagName.toLowerCase() === 'input' ||
594
- target.type === 'checkbox') {
595
- return;
596
- }
597
- const row = this._findRow(target);
598
- const action = this._findRowAction(target);
599
- if (action) {
600
- return;
601
- }
602
- if (this.enableRowClick) {
603
- const item = this.parsedItems[index];
604
- this.rowClick.emit({
605
- item,
606
- ctrlDown: this._ctrlDown,
607
- });
608
- return;
609
- }
610
- if (!this.enableRowSelection) {
611
- return;
612
- }
613
- const checkbox = row?.querySelector('input[type="checkbox"]');
614
- if (!checkbox) {
615
- return;
616
- }
617
- checkbox.checked = !checkbox.checked;
618
- this._checkboxChange(checkbox, index);
619
- }
620
- _getActionRouterLink(routerLink, rowIndex) {
621
- if (typeof routerLink === 'function') {
622
- const item = this.parsedItems[rowIndex];
623
- return this._getActionRouterLink(routerLink(item), rowIndex);
624
- }
625
- if (typeof routerLink === 'string' || Array.isArray(routerLink)) {
626
- return new BehaviorSubject(routerLink);
627
- }
628
- return routerLink;
629
- }
630
- _getActionQueryParams(queryParams, rowIndex) {
631
- if (typeof queryParams === 'function') {
632
- const item = this.parsedItems[rowIndex];
633
- return this._getActionQueryParams(queryParams(item), rowIndex);
634
- }
635
- if (queryParams instanceof Object && queryParams.constructor === Object) {
636
- return new BehaviorSubject(queryParams);
637
- }
638
- return queryParams;
639
- }
640
- _rowActionClick(action, rowIndex) {
641
- if (action.disabled) {
642
- return;
643
- }
644
- if (action.loading) {
645
- return;
646
- }
647
- if (!action.action) {
648
- return;
649
- }
650
- if (action.type === 'multi' ||
651
- (action.type === 'both' && rowIndex === undefined)) {
652
- action.action.emit({
653
- items: this.selectedRows,
654
- multi: true,
655
- ctrlDown: this._ctrlDown,
656
- });
657
- return;
658
- }
659
- if (action.routerLink ||
660
- (Array.isArray(action.routerLink) && action.routerLink.length)) {
661
- return;
662
- }
663
- const item = rowIndex !== undefined
664
- ? this.parsedItems[rowIndex]
665
- : this.selectedRows[0];
666
- action.action.emit({
667
- item,
668
- multi: false,
669
- ctrlDown: this._ctrlDown,
670
- });
671
- }
672
- _findRow(el) {
673
- if (!el) {
674
- return el;
675
- }
676
- if (el?.tagName?.toLowerCase() === 'p-table-row') {
677
- return el;
678
- }
679
- return this._findRow(el?.parentElement);
680
- }
681
- _findRowAction(el) {
682
- if (!el) {
683
- return null;
684
- }
685
- if (el.getAttribute('data-is-action') !== null &&
686
- el.getAttribute('data-is-action') !== 'false') {
687
- return el;
688
- }
689
- if (el?.tagName?.toLowerCase() === 'p-table-row') {
690
- return null;
691
- }
692
- return this._findRowAction(el?.parentElement);
693
- }
694
- _setRowSelectionData() {
695
- if (this._resizeTimeout) {
696
- clearTimeout(this._resizeTimeout);
697
- }
698
- // We add a timeout here because it's a lot easier on the machine to do these when someone is done
699
- // resizing and playing around with their browser
700
- this._resizeTimeout = setTimeout(() => {
701
- const mobile = isMobile();
702
- this.isMobile$.next(mobile);
703
- const actions = Array.from(this._rowActions);
704
- if (this._rowActionsSubscriptions.length) {
705
- for (let subscription of this._rowActionsSubscriptions) {
706
- subscription.unsubscribe();
707
- }
708
- }
709
- this._rowActionsSubscriptions = actions.map(action => action._loadingChanged
710
- .pipe(untilDestroyed(this))
711
- .subscribe(() => this._cd.detectChanges()));
712
- // we hack this to any[] to make it work..
713
- const rowActionsRow = actions.filter(a => a.type === 'both' || a.type === 'single');
714
- const rowActionsFloating = actions.filter(a => (this._inputEnableRowSelection &&
715
- (a.type === 'both' || a.type === 'multi')) ||
716
- (mobile && a.type === 'single' && !a.routerLink));
717
- let rowSelectionLimit = this._inputRowSelectionLimit;
718
- if (mobile && // we're mobile
719
- rowActionsFloating?.length && // we have atleast 1 item in _rowActionsFloating
720
- ((rowSelectionLimit !== undefined && this.enableRowSelection) ||
721
- !this.enableRowSelection)) {
722
- rowSelectionLimit = 1;
723
- }
724
- this.rowSelectionLimit = rowSelectionLimit;
725
- let enableRowSelection = this._inputEnableRowSelection;
726
- if (mobile && // we're mobile
727
- rowActionsFloating?.length && // we have atleast 1 item in _rowActionsFloating
728
- !enableRowSelection) {
729
- enableRowSelection = true;
730
- }
731
- this.enableRowSelection = enableRowSelection;
732
- this.rowActionsRow$.next(rowActionsRow);
733
- this.rowActionsFloatingAll$.next(rowActionsFloating);
734
- this.floatingMenuShown$
735
- .pipe(take(1), filter(v => !!v))
736
- .subscribe(() => this._showFloatingMenu());
737
- }, 200);
738
- }
739
- _showFloatingMenu() {
740
- this.rowActionsFloatingAll$.pipe(take(1)).subscribe(actions => {
741
- if (this.rowSelectionLimit === 1 &&
742
- actions.findIndex(a => (a.type === 'single' || a.type === 'both') && a.showFunction) >= 0) {
743
- actions = actions.filter(a => a.type === 'multi' ||
744
- !a.showFunction ||
745
- a.showFunction(this.selectedRows[0]));
746
- }
747
- this.rowActionsFloating$.next(actions);
748
- this.floatingMenuShown$.next(true);
749
- });
750
- }
751
- _parseDefinitions(definitionsArray) {
752
- return definitionsArray.map(definition => this._parseDefinitionSizes(definition));
753
- }
754
- _parseDefinitionSizes(definition) {
755
- const definitionAny = definition;
756
- let parsedSizes = { default: 'full' };
757
- for (const [index, size] of tableColumSizesOptions.entries()) {
758
- if (definitionAny.sizes === 'auto' ||
759
- definitionAny.sizes === 'hidden' ||
760
- definitionAny.sizes === 'full' ||
761
- typeof definitionAny.sizes === 'number') {
762
- parsedSizes[size] =
763
- definitionAny.sizes === 'auto' ? 'full' : definitionAny.sizes;
764
- continue;
765
- }
766
- parsedSizes[size] =
767
- definitionAny.sizes[size] ??
768
- parsedSizes[tableColumSizesOptions[index - 1]];
769
- }
770
- definition.parsedSizes = parsedSizes;
771
- return definition;
772
- }
773
- _checkChangesSubscriptions() {
774
- if (!this._rowChangesSubscription && this.tableRows) {
775
- this._rowChangesSubscription = this.tableRows.changes
776
- .pipe(untilDestroyed(this), debounceTime(100))
777
- .subscribe(() => this._calculateColumnWidths());
778
- }
779
- if (!this._cellChangesSubscription && this.tableCells) {
780
- this._cellChangesSubscription = this.tableCells.changes
781
- .pipe(untilDestroyed(this), debounceTime(100))
782
- .subscribe(() => this._calculateColumnWidths());
783
- }
784
- }
785
- _calculateColumnWidths() {
786
- if (!this.enableScroll) {
787
- return;
788
- }
789
- if (!this.tableCells || !this.tableRows) {
790
- return;
791
- }
792
- if (this._calculateColumnWidthsTimeout) {
793
- clearTimeout(this._calculateColumnWidthsTimeout);
794
- this._calculateColumnWidthsTimeout = 0;
795
- }
796
- const rows = this.tableRows.map(c => c.nativeElement);
797
- const cells = rows.flatMap(row => Array.from(row.querySelectorAll('p-table-cell-ngx')));
798
- this._calculateColumnWidthsTimeout = setTimeout(async () => {
799
- this._setRowsWidth(rows);
800
- const promises = [];
801
- for (const cell of cells) {
802
- if (cell.style.width?.length) {
803
- cell.setAttribute('style', '');
804
- }
805
- promises.push(new Promise(resolve => setTimeout(() => {
806
- const rect = cell.getBoundingClientRect();
807
- cell.setAttribute('style', `width: ${rect.width}px !important`);
808
- resolve();
809
- }, 100)));
810
- }
811
- await Promise.all(promises);
812
- this._setRowsWidth(rows, 'min-content');
813
- this._resetScrollPosition();
814
- }, 200);
815
- }
816
- _setRowsWidth(rows, value = null) {
817
- for (let i = 0; i < rows.length; i++) {
818
- const row = rows[i];
819
- const shadow = row.shadowRoot;
820
- if (!shadow) {
821
- continue;
822
- }
823
- const firstDiv = shadow.querySelector('*:nth-child(1)');
824
- if (!firstDiv) {
825
- continue;
826
- }
827
- const secondDiv = firstDiv.querySelector('*:nth-child(1)');
828
- if (!secondDiv) {
829
- continue;
830
- }
831
- if (value === null) {
832
- firstDiv.setAttribute('style', '');
833
- secondDiv.setAttribute('style', '');
834
- continue;
835
- }
836
- firstDiv.setAttribute('style', 'width: min-content;');
837
- secondDiv.setAttribute('style', 'width: min-content;');
838
- if (i === 0) {
839
- this._totalWidth = firstDiv.getBoundingClientRect().width;
840
- }
841
- }
842
- }
843
- _resetScrollPosition() {
844
- if (this.scrollContainer) {
845
- this.scrollContainer.nativeElement.scrollLeft = 0;
846
- }
847
- this.reachedScrollStart$.next(true);
848
- this.reachedScrollEnd$.next(false);
849
- this._calculateScrollPosition({
850
- target: this.scrollContainer.nativeElement,
851
- });
852
- }
853
- _calculateScrollPosition({ target }) {
854
- this.reachedScrollStart$.next(target.scrollLeft < 10);
855
- const right = target.scrollLeft + target.getBoundingClientRect().width;
856
- this.reachedScrollEnd$.next(right > this._totalWidth - 10);
857
- }
858
- _checkTheme(value) {
859
- if (this._themeDebounce) {
860
- clearTimeout(this._themeDebounce);
861
- this._themeDebounce = undefined;
862
- }
863
- this._themeDebounce = setTimeout(() => {
864
- this.theme = value;
865
- this._cd.detectChanges();
866
- }, 100);
867
- }
868
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Table, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
869
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: Table, selector: "p-table-ngx", inputs: { items: "items", loading: "loading", headerLoading: "headerLoading", footerLoading: "footerLoading", amountOfLoadingRows: "amountOfLoadingRows", enableRowSelection: "enableRowSelection", rowSelectionLimit: "rowSelectionLimit", enableRowClick: "enableRowClick", selectedRows: "selectedRows", selectionKey: "selectionKey", canSelectKey: "canSelectKey", enableFloatingMenu: "enableFloatingMenu", floatingMenuAmountSelectedText: "floatingMenuAmountSelectedText", floatingMenuAmountSelectedTemplate: "floatingMenuAmountSelectedTemplate", enableHeader: "enableHeader", quickFilters: "quickFilters", activeQuickFilterIdentifier: "activeQuickFilterIdentifier", enableSearch: "enableSearch", query: "query", enableFilter: "enableFilter", enableFilterDesktop: "enableFilterDesktop", selectedFiltersAmount: "selectedFiltersAmount", filterButtonTemplate: "filterButtonTemplate", enableAction: "enableAction", actionButtonLoading: "actionButtonLoading", actionButtonIcon: "actionButtonIcon", actionButtonEnabled: "actionButtonEnabled", actionButtonText: "actionButtonText", actionButtonTemplate: "actionButtonTemplate", enableFooter: "enableFooter", enablePaginationSize: "enablePaginationSize", enablePaginationPages: "enablePaginationPages", enableExport: "enableExport", page: "page", total: "total", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hideOnSinglePage: "hideOnSinglePage", emptyStateType: "emptyStateType", emptyStateIllustration: "emptyStateIllustration", emptyStateHeader: "emptyStateHeader", emptyStateContent: "emptyStateContent", emptyStateAction: "emptyStateAction", emptyStateActionIcon: "emptyStateActionIcon", enableEmptyStateAction: "enableEmptyStateAction", emptyStateFilteredIllustration: "emptyStateFilteredIllustration", emptyStateFilteredHeader: "emptyStateFilteredHeader", emptyStateFilteredContent: "emptyStateFilteredContent", enableScroll: "enableScroll", shadow: "shadow", filterModalHeaderText: "filterModalHeaderText", filterModalSaveText: "filterModalSaveText", filterModalCancelText: "filterModalCancelText", filterModalResetText: "filterModalResetText", filterModalShowReset: "filterModalShowReset", filterModalShowResetMobile: "filterModalShowResetMobile" }, outputs: { selectedRowsChange: "selectedRowsChange", rowClick: "rowClick", rowSelected: "rowSelected", rowDeselected: "rowDeselected", quickFilter: "quickFilter", queryChange: "queryChange", filter: "filter", action: "action", pageChange: "pageChange", pageSizeChange: "pageSizeChange", export: "export", emptyStateActionClick: "emptyStateActionClick", filterModalShow: "filterModalShow", filterModalSave: "filterModalSave", filterModalReset: "filterModalReset" }, host: { listeners: { "window:resize": "onResize($event)", "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:visibilitychange": "visibilityChange($event)" }, properties: { "class": "this.className", "attr.data-theme": "this.theme" } }, queries: [{ propertyName: "headerCustomFilterTemplate", first: true, predicate: TableCustomFilterDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "headerCustomActionsTemplate", first: true, predicate: TableCustomActionsDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "filterModalTemplate", first: true, predicate: TableFilterModalDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "columnDefinitions", predicate: TableColumn }, { propertyName: "extraHeaderDefinitions", predicate: TableExtraHeader }, { propertyName: "rowActions", predicate: TableRowAction }, { propertyName: "customRows", predicate: TableCustomRowDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "tableRows", predicate: PTableRow, descendants: true, read: ElementRef }, { propertyName: "tableCells", predicate: TableCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<p-table-container>\n\t<p-table-header\n\t\t*ngIf=\"enableHeader\"\n\t\tclass=\"mb-8\"\n\t\t[quickFilters]=\"quickFilters\"\n\t\t[activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n\t\t(quickFilter)=\"onQuickFilter($event)\"\n\t\t[enableSearch]=\"enableSearch\"\n\t\t[query]=\"query\"\n\t\t(queryChange)=\"onQueryChange($event)\"\n\t\t[enableFilter]=\"enableFilter\"\n\t\t[enableFilterDesktop]=\"enableFilterDesktop\"\n\t\t[selectedFiltersAmount]=\"selectedFiltersAmount\"\n\t\t[filterButtonTemplate]=\"filterButtonTemplate\"\n\t\t(filter)=\"filterModalShow$.next(true)\"\n\t\t[enableAction]=\"enableAction\"\n\t\t[canUseAction]=\"actionButtonEnabled\"\n\t\t[actionButtonTemplate]=\"actionButtonTemplate\"\n\t\t[actionLoading]=\"actionButtonLoading\"\n\t\t[actionText]=\"actionButtonText\"\n\t\t[actionIcon]=\"actionButtonIcon\"\n\t\t(action)=\"action.emit()\"\n\t\t[itemsSelectedAmount]=\"selectedRows.length\"\n\t\t[enableExport]=\"enableExport\"\n\t\t(export)=\"export.emit()\"\n\t\t[loading]=\"headerLoading\"\n\t>\n\t\t<ng-container *ngIf=\"headerCustomFilterTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomFilterTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\n\t\t<ng-container *ngIf=\"headerCustomActionsTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomActionsTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\t</p-table-header>\n\n\t<div\n\t\tclass=\"relative flex-1\"\n\t\t*ngIf=\"enableScroll; else rowsTemplate\"\n\t>\n\t\t<div\n\t\t\tclass=\"flex flex-col overflow-x-auto\"\n\t\t\t#scrollContainer\n\t\t\t[class]=\"\n\t\t\t\tcn(\n\t\t\t\t\t'before:absolute before:top-0 before:left-0 before:z-[1] before:pointer-events-none',\n\t\t\t\t\t'before:w-24 before:h-full before:transition-opacity',\n\t\t\t\t\t'before:bg-gradient-to-r before:from-white dark:before:from-hurricane-700 before:via-white/80 dark:before:via-hurricane-700/90 before:to-transparent',\n\t\t\t\t\t'after:absolute after:top-0 after:right-0 after:z-[0] before:pointer-events-none',\n\t\t\t\t\t'after:w-24 after:h-full after:transition-opacity',\n\t\t\t\t\t'after:bg-gradient-to-l after:from-white after:dark:from-hurricane-700 after:via-white/80 dark:after:via-hurricane-700/90 after:to-transparent',\n\t\t\t\t\t{\n\t\t\t\t\t\t'before:opacity-0': reachedScrollStart$ | async,\n\t\t\t\t\t\t'after:opacity-0': reachedScrollEnd$ | async,\n\t\t\t\t\t\t'before:opacity-100': (reachedScrollStart$ | async) === false,\n\t\t\t\t\t\t'after:opacity-100': (reachedScrollEnd$ | async) === false\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\"\n\t\t\t(scroll)=\"onContainerXScroll($event)\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"rowsTemplate\"></ng-container>\n\t\t</div>\n\t</div>\n\n\t<ng-container *ngIf=\"enableFloatingMenu && enableRowSelection\">\n\t\t<p-floating-menu-container\n\t\t\t[usedInTable]=\"true\"\n\t\t\t[class]=\"\n\t\t\t\tfloatingMenuContainerClass({\n\t\t\t\t\thasFooter: enableFooter && (footerHidden$ | async) === false,\n\t\t\t\t\tactive: selectedRows.length > 0,\n\t\t\t\t\tshown: $any(floatingMenuShown$ | async)\n\t\t\t\t})\n\t\t\t\"\n\t\t\t[amount]=\"floatingMenuAmountSelectedText\"\n\t\t\t[enableAmountSelected]=\"!!(rowActionsFloating$ | async)?.length\"\n\t\t\t(close)=\"_selectAllChange(null, false)\"\n\t\t>\n\t\t\t<p-floating-menu-item\n\t\t\t\t*ngFor=\"let action of rowActionsFloating$ | async\"\n\t\t\t\tslot=\"floating-menu-item\"\n\t\t\t\t[disabled]=\"\n\t\t\t\t\t(action['type'] === 'single' && selectedRows.length > 1) ||\n\t\t\t\t\taction['disabled']\n\t\t\t\t\"\n\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t[iconFlip]=\"action['iconFlip']\"\n\t\t\t\t(click)=\"_rowActionClick(action)\"\n\t\t\t>\n\t\t\t\t{{ action['label'] }}\n\t\t\t</p-floating-menu-item>\n\t\t</p-floating-menu-container>\n\t</ng-container>\n\n\t<p-table-footer\n\t\t*ngIf=\"enableFooter\"\n\t\t[hideOnSinglePage]=\"hideOnSinglePage\"\n\t\t[enablePaginationSize]=\"enablePaginationSize\"\n\t\t[pageSize]=\"pageSize\"\n\t\t[pageSizeOptions]=\"pageSizeOptions\"\n\t\t(pageSizeChange)=\"onPageSizeChange($event)\"\n\t\t[enablePaginationPages]=\"enablePaginationPages\"\n\t\t[page]=\"page\"\n\t\t[total]=\"total\"\n\t\t(pageChange)=\"onPageChange($event)\"\n\t\t[loading]=\"footerLoading\"\n\t\t(hiddenChange)=\"footerHidden$.next($event.detail)\"\n\t\t[tableHeaderHasAction]=\"enableHeader && enableAction && actionButtonEnabled\"\n\t></p-table-footer>\n</p-table-container>\n\n<ng-template #rowsTemplate>\n\t<p-table-row\n\t\t*ngIf=\"(extraHeaders$ | async)?.length\"\n\t\tvariant=\"header-secondary\"\n\t\tclass=\"z-[2]\"\n\t\t[isLast]=\"true\"\n\t>\n\t\t<ng-container *ngFor=\"let col of extraHeaders$ | async; let index = index\">\n\t\t\t<p-table-cell-ngx\n\t\t\t\t[definition]=\"col\"\n\t\t\t\tvariant=\"header-secondary\"\n\t\t\t\t[index]=\"index\"\n\t\t\t\t[checkboxOffset]=\"index === 0 && enableRowSelection\"\n\t\t\t\t[scrollable]=\"this.enableScroll\"\n\t\t\t>\n\t\t\t\t<b>{{ col.name }}</b>\n\t\t\t</p-table-cell-ngx>\n\t\t</ng-container>\n\t</p-table-row>\n\n\t<p-table-row variant=\"header\">\n\t\t<ng-container *ngFor=\"let col of columns$ | async; let index = index\">\n\t\t\t<p-table-cell-ngx\n\t\t\t\t[definition]=\"col\"\n\t\t\t\t[value]=\"col.name\"\n\t\t\t\tvariant=\"header\"\n\t\t\t\t[index]=\"index\"\n\t\t\t\t[checkbox]=\"\n\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t\t[scrollable]=\"this.enableScroll\"\n\t\t\t></p-table-cell-ngx>\n\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t<p-checkbox\n\t\t\t\t\t(checkedChange)=\"_selectAllChange($event)\"\n\t\t\t\t\t[checked]=\"_selectionContainsAll()\"\n\t\t\t\t\t[indeterminate]=\"_selectionIndeterminate()\"\n\t\t\t\t\t[class.opacity-0]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t\t[disabled]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t></p-checkbox>\n\t\t\t</ng-template>\n\t\t</ng-container>\n\t</p-table-row>\n\n\t<div class=\"flex flex-1 flex-col\">\n\t\t<ng-container *ngIf=\"loading; else contentTemplate\">\n\t\t\t<p-table-row\n\t\t\t\t*ngFor=\"let r of loadingRows; let rowIndex = index\"\n\t\t\t\tclass=\"group\"\n\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t[isLast]=\"rowIndex === loadingRows.length - 1\"\n\t\t\t>\n\t\t\t\t<ng-container *ngFor=\"let col of columns$ | async; let index = index\">\n\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\tvariant=\"loading\"\n\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t\t[scrollable]=\"this.enableScroll\"\n\t\t\t\t\t></p-table-cell-ngx>\n\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t<p-loader\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclass=\"h-6 w-6 rounded\"\n\t\t\t\t\t\t></p-loader>\n\t\t\t\t\t</ng-template>\n\t\t\t\t</ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\n\t\t<ng-template #contentTemplate>\n\t\t\t<ng-container *ngIf=\"parsedItems?.length; else emptyStateTemplate\">\n\t\t\t\t<p-table-row\n\t\t\t\t\t*ngFor=\"let item of parsedItems; let rowIndex = index\"\n\t\t\t\t\tclass=\"group\"\n\t\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t[isLast]=\"rowIndex === parsedItems.length - 1\"\n\t\t\t\t\t(click)=\"_rowClick($event, rowIndex)\"\n\t\t\t\t>\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\tparseRowActionsRow(\n\t\t\t\t\t\t\t\trowActionsRow$ | async,\n\t\t\t\t\t\t\t\trowIndex\n\t\t\t\t\t\t\t) as rowActionsRow\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t*ngFor=\"let col of columns$ | async; let index = index\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\t\t\t[item]=\"item\"\n\t\t\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t\t\t\t[template]=\"col.template\"\n\t\t\t\t\t\t\t\t[scrollable]=\"this.enableScroll\"\n\t\t\t\t\t\t\t></p-table-cell-ngx>\n\n\t\t\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t\t\t<p-checkbox\n\t\t\t\t\t\t\t\t\t(checkedChange)=\"_checkboxChange($event.target, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"_checkboxDisabled(item, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t\t\t\t></p-checkbox>\n\t\t\t\t\t\t\t</ng-template>\n\t\t\t\t\t\t</ng-container>\n\n\t\t\t\t\t\t<p-table-row-actions-container\n\t\t\t\t\t\t\t*ngIf=\"!!rowActionsRow?.length && !(isMobile$ | async)\"\n\t\t\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t\t\tslot=\"actions\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-container *ngFor=\"let action of rowActionsRow\">\n\t\t\t\t\t\t\t\t<p-tooltip\n\t\t\t\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\t\t\t\taction.showFunction\n\t\t\t\t\t\t\t\t\t\t\t? action.showFunction(parsedItems[rowIndex])\n\t\t\t\t\t\t\t\t\t\t\t: true\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[content]=\"action['label']\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p-button\n\t\t\t\t\t\t\t\t\t\tdata-is-action\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\t\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t\t\t\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t\t\t\t\t\t\ticonFlip=\"action.iconFlip\"\n\t\t\t\t\t\t\t\t\t\ticonOnly=\"true\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"action['disabled']\"\n\t\t\t\t\t\t\t\t\t\t[routerLink]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.routerLink\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionRouterLink(action.routerLink, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t[queryParams]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.queryParams\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionQueryParams(action.queryParams, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t(onClick)=\"_rowActionClick(action, rowIndex)\"\n\t\t\t\t\t\t\t\t\t></p-button>\n\t\t\t\t\t\t\t\t</p-tooltip>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</p-table-row-actions-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</p-table-row>\n\t\t\t</ng-container>\n\t\t</ng-template>\n\n\t\t<ng-container *ngFor=\"let customRow of customRows\">\n\t\t\t<p-table-row\n\t\t\t\t[variant]=\"customRow.variant\"\n\t\t\t\t[class]=\"{\n\t\t\t\t\t'z-[2]': customRow.variant === 'secondary'\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<ng-container *ngTemplateOutlet=\"customRow.templateRef\"></ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\t</div>\n</ng-template>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n\t<p-modal\n\t\t[header]=\"filterModalHeaderText\"\n\t\t[show]=\"filterModalShow$ | async\"\n\t\t(closed)=\"filterModalShow$.next(false)\"\n\t>\n\t\t<div\n\t\t\tslot=\"content\"\n\t\t\tclass=\"flex flex-col gap-6\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"filterModalTemplate\"></ng-container>\n\t\t</div>\n\t\t<div\n\t\t\tslot=\"footer\"\n\t\t\tclass=\"flex w-full justify-between gap-4\"\n\t\t>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowResetMobile\"\n\t\t\t\tclass=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset(true)\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowReset\"\n\t\t\t\tclass=\"hidden w-full tablet:w-auto desktop-xs:flex\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset()\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\tclass=\"ml-auto w-full tablet:w-auto\"\n\t\t\t\ticon=\"checkmark\"\n\t\t\t\t(onClick)=\"onFilterModalSave()\"\n\t\t\t>\n\t\t\t\t{{ filterModalSaveText }}\n\t\t\t</p-button>\n\t\t</div>\n\t</p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n\t<p-empty-state\n\t\t*ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateFilteredIllustration\"\n\t\t[header]=\"emptyStateFilteredHeader\"\n\t\t[content]=\"emptyStateFilteredContent\"\n\t\t[enableAction]=\"false\"\n\t></p-empty-state>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n\t<p-empty-state\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateIllustration\"\n\t\t[header]=\"emptyStateHeader\"\n\t\t[content]=\"emptyStateContent\"\n\t\t[enableAction]=\"enableEmptyStateAction\"\n\t\t[actionText]=\"emptyStateAction\"\n\t\t[actionIcon]=\"emptyStateActionIcon\"\n\t\t(action)=\"emptyStateClicked()\"\n\t></p-empty-state>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PButton, selector: "p-button", inputs: ["active", "as", "buttonGroupPosition", "chevron", "chevronPosition", "class", "disabled", "error", "href", "icon", "iconClass", "iconFlip", "iconOnly", "iconPosition", "iconRotate", "inheritText", "label", "loading", "size", "tabIndex", "target", "type", "underline", "variant"] }, { kind: "component", type: i3.PCheckbox, selector: "p-checkbox", inputs: ["checked", "disabled", "id", "indeterminate", "name", "required"] }, { kind: "component", type: i3.PEmptyState, selector: "p-empty-state", inputs: ["actionIcon", "actionIconPosition", "actionLoading", "actionText", "actionVariant", "content", "enableAction", "header", "illustration"] }, { kind: "component", type: i3.PFloatingMenuContainer, selector: "p-floating-menu-container", inputs: ["amount", "amountSelectedTemplate", "enableAmountSelected", "enableClose", "usedInTable"] }, { kind: "component", type: i3.PFloatingMenuItem, selector: "p-floating-menu-item", inputs: ["disabled", "hover", "icon", "iconFlip", "iconPosition", "iconRotate", "loading"] }, { kind: "component", type: i3.PLoader, selector: "p-loader", inputs: ["color", "modalDescription", "modalTitle", "show", "variant"] }, { kind: "component", type: i3.PModal, selector: "p-modal", inputs: ["applyBlur", "backdropClickClose", "header", "scrollLock", "show", "showClose", "showMobileFooter", "size"] }, { kind: "component", type: i3.PTableContainer, selector: "p-table-container" }, { kind: "component", type: i3.PTableFooter, selector: "p-table-footer", inputs: ["enablePaginationPages", "enablePaginationSize", "hideOnSinglePage", "loading", "page", "pageSize", "pageSizeOptions", "tableHeaderHasAction", "total"] }, { kind: "component", type: i3.PTableHeader, selector: "p-table-header", inputs: ["actionButtonTemplate", "actionIcon", "actionLoading", "actionText", "activeQuickFilterIdentifier", "canUseAction", "enableAction", "enableExport", "enableFilter", "enableFilterDesktop", "enableSearch", "filterButtonTemplate", "itemsSelectedAmount", "loading", "query", "quickFilters", "selectedFiltersAmount"] }, { kind: "component", type: i3.PTableRow, selector: "p-table-row", inputs: ["checked", "enableHover", "isLast", "variant"] }, { kind: "component", type: i3.PTableRowActionsContainer, selector: "p-table-row-actions-container", inputs: ["checked"] }, { kind: "component", type: i3.PTooltip, selector: "p-tooltip", inputs: ["canManuallyClose", "content", "enableUserInput", "offset", "placement", "show", "strategy", "variant"] }, { kind: "component", type: i4.TableCell, selector: "p-table-cell-ngx", inputs: ["variant", "index", "rowIndex", "definition", "item", "value", "checkbox", "checkboxOffset", "template", "scrollable"] }, { kind: "directive", type: i5.TableFooterDirective, selector: "p-table-footer" }, { kind: "directive", type: i6.TableHeaderDirective, selector: "p-table-header" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
870
- };
871
- Table = __decorate([
872
- UntilDestroy({ checkProperties: true })
873
- ], Table);
874
- export { Table };
875
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Table, decorators: [{
876
- type: Component,
877
- args: [{ selector: 'p-table-ngx', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-table-container>\n\t<p-table-header\n\t\t*ngIf=\"enableHeader\"\n\t\tclass=\"mb-8\"\n\t\t[quickFilters]=\"quickFilters\"\n\t\t[activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n\t\t(quickFilter)=\"onQuickFilter($event)\"\n\t\t[enableSearch]=\"enableSearch\"\n\t\t[query]=\"query\"\n\t\t(queryChange)=\"onQueryChange($event)\"\n\t\t[enableFilter]=\"enableFilter\"\n\t\t[enableFilterDesktop]=\"enableFilterDesktop\"\n\t\t[selectedFiltersAmount]=\"selectedFiltersAmount\"\n\t\t[filterButtonTemplate]=\"filterButtonTemplate\"\n\t\t(filter)=\"filterModalShow$.next(true)\"\n\t\t[enableAction]=\"enableAction\"\n\t\t[canUseAction]=\"actionButtonEnabled\"\n\t\t[actionButtonTemplate]=\"actionButtonTemplate\"\n\t\t[actionLoading]=\"actionButtonLoading\"\n\t\t[actionText]=\"actionButtonText\"\n\t\t[actionIcon]=\"actionButtonIcon\"\n\t\t(action)=\"action.emit()\"\n\t\t[itemsSelectedAmount]=\"selectedRows.length\"\n\t\t[enableExport]=\"enableExport\"\n\t\t(export)=\"export.emit()\"\n\t\t[loading]=\"headerLoading\"\n\t>\n\t\t<ng-container *ngIf=\"headerCustomFilterTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomFilterTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\n\t\t<ng-container *ngIf=\"headerCustomActionsTemplate\">\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"headerCustomActionsTemplate\"\n\t\t\t></ng-container>\n\t\t</ng-container>\n\t</p-table-header>\n\n\t<div\n\t\tclass=\"relative flex-1\"\n\t\t*ngIf=\"enableScroll; else rowsTemplate\"\n\t>\n\t\t<div\n\t\t\tclass=\"flex flex-col overflow-x-auto\"\n\t\t\t#scrollContainer\n\t\t\t[class]=\"\n\t\t\t\tcn(\n\t\t\t\t\t'before:absolute before:top-0 before:left-0 before:z-[1] before:pointer-events-none',\n\t\t\t\t\t'before:w-24 before:h-full before:transition-opacity',\n\t\t\t\t\t'before:bg-gradient-to-r before:from-white dark:before:from-hurricane-700 before:via-white/80 dark:before:via-hurricane-700/90 before:to-transparent',\n\t\t\t\t\t'after:absolute after:top-0 after:right-0 after:z-[0] before:pointer-events-none',\n\t\t\t\t\t'after:w-24 after:h-full after:transition-opacity',\n\t\t\t\t\t'after:bg-gradient-to-l after:from-white after:dark:from-hurricane-700 after:via-white/80 dark:after:via-hurricane-700/90 after:to-transparent',\n\t\t\t\t\t{\n\t\t\t\t\t\t'before:opacity-0': reachedScrollStart$ | async,\n\t\t\t\t\t\t'after:opacity-0': reachedScrollEnd$ | async,\n\t\t\t\t\t\t'before:opacity-100': (reachedScrollStart$ | async) === false,\n\t\t\t\t\t\t'after:opacity-100': (reachedScrollEnd$ | async) === false\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\"\n\t\t\t(scroll)=\"onContainerXScroll($event)\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"rowsTemplate\"></ng-container>\n\t\t</div>\n\t</div>\n\n\t<ng-container *ngIf=\"enableFloatingMenu && enableRowSelection\">\n\t\t<p-floating-menu-container\n\t\t\t[usedInTable]=\"true\"\n\t\t\t[class]=\"\n\t\t\t\tfloatingMenuContainerClass({\n\t\t\t\t\thasFooter: enableFooter && (footerHidden$ | async) === false,\n\t\t\t\t\tactive: selectedRows.length > 0,\n\t\t\t\t\tshown: $any(floatingMenuShown$ | async)\n\t\t\t\t})\n\t\t\t\"\n\t\t\t[amount]=\"floatingMenuAmountSelectedText\"\n\t\t\t[enableAmountSelected]=\"!!(rowActionsFloating$ | async)?.length\"\n\t\t\t(close)=\"_selectAllChange(null, false)\"\n\t\t>\n\t\t\t<p-floating-menu-item\n\t\t\t\t*ngFor=\"let action of rowActionsFloating$ | async\"\n\t\t\t\tslot=\"floating-menu-item\"\n\t\t\t\t[disabled]=\"\n\t\t\t\t\t(action['type'] === 'single' && selectedRows.length > 1) ||\n\t\t\t\t\taction['disabled']\n\t\t\t\t\"\n\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t[iconFlip]=\"action['iconFlip']\"\n\t\t\t\t(click)=\"_rowActionClick(action)\"\n\t\t\t>\n\t\t\t\t{{ action['label'] }}\n\t\t\t</p-floating-menu-item>\n\t\t</p-floating-menu-container>\n\t</ng-container>\n\n\t<p-table-footer\n\t\t*ngIf=\"enableFooter\"\n\t\t[hideOnSinglePage]=\"hideOnSinglePage\"\n\t\t[enablePaginationSize]=\"enablePaginationSize\"\n\t\t[pageSize]=\"pageSize\"\n\t\t[pageSizeOptions]=\"pageSizeOptions\"\n\t\t(pageSizeChange)=\"onPageSizeChange($event)\"\n\t\t[enablePaginationPages]=\"enablePaginationPages\"\n\t\t[page]=\"page\"\n\t\t[total]=\"total\"\n\t\t(pageChange)=\"onPageChange($event)\"\n\t\t[loading]=\"footerLoading\"\n\t\t(hiddenChange)=\"footerHidden$.next($event.detail)\"\n\t\t[tableHeaderHasAction]=\"enableHeader && enableAction && actionButtonEnabled\"\n\t></p-table-footer>\n</p-table-container>\n\n<ng-template #rowsTemplate>\n\t<p-table-row\n\t\t*ngIf=\"(extraHeaders$ | async)?.length\"\n\t\tvariant=\"header-secondary\"\n\t\tclass=\"z-[2]\"\n\t\t[isLast]=\"true\"\n\t>\n\t\t<ng-container *ngFor=\"let col of extraHeaders$ | async; let index = index\">\n\t\t\t<p-table-cell-ngx\n\t\t\t\t[definition]=\"col\"\n\t\t\t\tvariant=\"header-secondary\"\n\t\t\t\t[index]=\"index\"\n\t\t\t\t[checkboxOffset]=\"index === 0 && enableRowSelection\"\n\t\t\t\t[scrollable]=\"this.enableScroll\"\n\t\t\t>\n\t\t\t\t<b>{{ col.name }}</b>\n\t\t\t</p-table-cell-ngx>\n\t\t</ng-container>\n\t</p-table-row>\n\n\t<p-table-row variant=\"header\">\n\t\t<ng-container *ngFor=\"let col of columns$ | async; let index = index\">\n\t\t\t<p-table-cell-ngx\n\t\t\t\t[definition]=\"col\"\n\t\t\t\t[value]=\"col.name\"\n\t\t\t\tvariant=\"header\"\n\t\t\t\t[index]=\"index\"\n\t\t\t\t[checkbox]=\"\n\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t\t[scrollable]=\"this.enableScroll\"\n\t\t\t></p-table-cell-ngx>\n\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t<p-checkbox\n\t\t\t\t\t(checkedChange)=\"_selectAllChange($event)\"\n\t\t\t\t\t[checked]=\"_selectionContainsAll()\"\n\t\t\t\t\t[indeterminate]=\"_selectionIndeterminate()\"\n\t\t\t\t\t[class.opacity-0]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t\t[disabled]=\"rowSelectionLimit !== undefined\"\n\t\t\t\t></p-checkbox>\n\t\t\t</ng-template>\n\t\t</ng-container>\n\t</p-table-row>\n\n\t<div class=\"flex flex-1 flex-col\">\n\t\t<ng-container *ngIf=\"loading; else contentTemplate\">\n\t\t\t<p-table-row\n\t\t\t\t*ngFor=\"let r of loadingRows; let rowIndex = index\"\n\t\t\t\tclass=\"group\"\n\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t[isLast]=\"rowIndex === loadingRows.length - 1\"\n\t\t\t>\n\t\t\t\t<ng-container *ngFor=\"let col of columns$ | async; let index = index\">\n\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\tvariant=\"loading\"\n\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t\t[scrollable]=\"this.enableScroll\"\n\t\t\t\t\t></p-table-cell-ngx>\n\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t<p-loader\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tclass=\"h-6 w-6 rounded\"\n\t\t\t\t\t\t></p-loader>\n\t\t\t\t\t</ng-template>\n\t\t\t\t</ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\n\t\t<ng-template #contentTemplate>\n\t\t\t<ng-container *ngIf=\"parsedItems?.length; else emptyStateTemplate\">\n\t\t\t\t<p-table-row\n\t\t\t\t\t*ngFor=\"let item of parsedItems; let rowIndex = index\"\n\t\t\t\t\tclass=\"group\"\n\t\t\t\t\t[enableHover]=\"enableRowSelection || enableRowClick\"\n\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t[isLast]=\"rowIndex === parsedItems.length - 1\"\n\t\t\t\t\t(click)=\"_rowClick($event, rowIndex)\"\n\t\t\t\t>\n\t\t\t\t\t<ng-container\n\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\tparseRowActionsRow(\n\t\t\t\t\t\t\t\trowActionsRow$ | async,\n\t\t\t\t\t\t\t\trowIndex\n\t\t\t\t\t\t\t) as rowActionsRow\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ng-container\n\t\t\t\t\t\t\t*ngFor=\"let col of columns$ | async; let index = index\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p-table-cell-ngx\n\t\t\t\t\t\t\t\t[definition]=\"col\"\n\t\t\t\t\t\t\t\t[item]=\"item\"\n\t\t\t\t\t\t\t\t[checkbox]=\"\n\t\t\t\t\t\t\t\t\t(index === 0 || col.hasCheckbox) && enableRowSelection\n\t\t\t\t\t\t\t\t\t\t? checkboxTemplate\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t[index]=\"index\"\n\t\t\t\t\t\t\t\t[rowIndex]=\"rowIndex\"\n\t\t\t\t\t\t\t\t[template]=\"col.template\"\n\t\t\t\t\t\t\t\t[scrollable]=\"this.enableScroll\"\n\t\t\t\t\t\t\t></p-table-cell-ngx>\n\n\t\t\t\t\t\t\t<ng-template #checkboxTemplate>\n\t\t\t\t\t\t\t\t<p-checkbox\n\t\t\t\t\t\t\t\t\t(checkedChange)=\"_checkboxChange($event.target, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"_checkboxDisabled(item, rowIndex)\"\n\t\t\t\t\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t\t\t\t></p-checkbox>\n\t\t\t\t\t\t\t</ng-template>\n\t\t\t\t\t\t</ng-container>\n\n\t\t\t\t\t\t<p-table-row-actions-container\n\t\t\t\t\t\t\t*ngIf=\"!!rowActionsRow?.length && !(isMobile$ | async)\"\n\t\t\t\t\t\t\t[checked]=\"_selectionContains(item, rowIndex)\"\n\t\t\t\t\t\t\tslot=\"actions\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ng-container *ngFor=\"let action of rowActionsRow\">\n\t\t\t\t\t\t\t\t<p-tooltip\n\t\t\t\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\t\t\t\taction.showFunction\n\t\t\t\t\t\t\t\t\t\t\t? action.showFunction(parsedItems[rowIndex])\n\t\t\t\t\t\t\t\t\t\t\t: true\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t[content]=\"action['label']\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<p-button\n\t\t\t\t\t\t\t\t\t\tdata-is-action\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tslot=\"trigger\"\n\t\t\t\t\t\t\t\t\t\t[icon]=\"action['icon']\"\n\t\t\t\t\t\t\t\t\t\t[iconRotate]=\"action['iconRotate']\"\n\t\t\t\t\t\t\t\t\t\ticonFlip=\"action.iconFlip\"\n\t\t\t\t\t\t\t\t\t\ticonOnly=\"true\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t[loading]=\"action['loading']\"\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"action['disabled']\"\n\t\t\t\t\t\t\t\t\t\t[routerLink]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.routerLink\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionRouterLink(action.routerLink, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t[queryParams]=\"\n\t\t\t\t\t\t\t\t\t\t\taction.queryParams\n\t\t\t\t\t\t\t\t\t\t\t\t? (_getActionQueryParams(action.queryParams, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t | async)\n\t\t\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t(onClick)=\"_rowActionClick(action, rowIndex)\"\n\t\t\t\t\t\t\t\t\t></p-button>\n\t\t\t\t\t\t\t\t</p-tooltip>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t</p-table-row-actions-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</p-table-row>\n\t\t\t</ng-container>\n\t\t</ng-template>\n\n\t\t<ng-container *ngFor=\"let customRow of customRows\">\n\t\t\t<p-table-row\n\t\t\t\t[variant]=\"customRow.variant\"\n\t\t\t\t[class]=\"{\n\t\t\t\t\t'z-[2]': customRow.variant === 'secondary'\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<ng-container *ngTemplateOutlet=\"customRow.templateRef\"></ng-container>\n\t\t\t</p-table-row>\n\t\t</ng-container>\n\t</div>\n</ng-template>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n\t<p-modal\n\t\t[header]=\"filterModalHeaderText\"\n\t\t[show]=\"filterModalShow$ | async\"\n\t\t(closed)=\"filterModalShow$.next(false)\"\n\t>\n\t\t<div\n\t\t\tslot=\"content\"\n\t\t\tclass=\"flex flex-col gap-6\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"filterModalTemplate\"></ng-container>\n\t\t</div>\n\t\t<div\n\t\t\tslot=\"footer\"\n\t\t\tclass=\"flex w-full justify-between gap-4\"\n\t\t>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowResetMobile\"\n\t\t\t\tclass=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset(true)\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\t*ngIf=\"filterModalShowReset\"\n\t\t\t\tclass=\"hidden w-full tablet:w-auto desktop-xs:flex\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t(onClick)=\"onFilterModalReset()\"\n\t\t\t>\n\t\t\t\t{{ filterModalResetText }}\n\t\t\t</p-button>\n\t\t\t<p-button\n\t\t\t\tclass=\"ml-auto w-full tablet:w-auto\"\n\t\t\t\ticon=\"checkmark\"\n\t\t\t\t(onClick)=\"onFilterModalSave()\"\n\t\t\t>\n\t\t\t\t{{ filterModalSaveText }}\n\t\t\t</p-button>\n\t\t</div>\n\t</p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n\t<p-empty-state\n\t\t*ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateFilteredIllustration\"\n\t\t[header]=\"emptyStateFilteredHeader\"\n\t\t[content]=\"emptyStateFilteredContent\"\n\t\t[enableAction]=\"false\"\n\t></p-empty-state>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n\t<p-empty-state\n\t\tclass=\"my-16 self-center\"\n\t\t[illustration]=\"emptyStateIllustration\"\n\t\t[header]=\"emptyStateHeader\"\n\t\t[content]=\"emptyStateContent\"\n\t\t[enableAction]=\"enableEmptyStateAction\"\n\t\t[actionText]=\"emptyStateAction\"\n\t\t[actionIcon]=\"emptyStateActionIcon\"\n\t\t(action)=\"emptyStateClicked()\"\n\t></p-empty-state>\n</ng-template>\n" }]
878
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { className: [{
879
- type: HostBinding,
880
- args: ['class']
881
- }], theme: [{
882
- type: HostBinding,
883
- args: ['attr.data-theme']
884
- }], items: [{
885
- type: Input
886
- }], loading: [{
887
- type: Input
888
- }], headerLoading: [{
889
- type: Input
890
- }], footerLoading: [{
891
- type: Input
892
- }], amountOfLoadingRows: [{
893
- type: Input
894
- }], enableRowSelection: [{
895
- type: Input
896
- }], rowSelectionLimit: [{
897
- type: Input
898
- }], enableRowClick: [{
899
- type: Input
900
- }], selectedRows: [{
901
- type: Input
902
- }], selectedRowsChange: [{
903
- type: Output
904
- }], selectionKey: [{
905
- type: Input
906
- }], canSelectKey: [{
907
- type: Input
908
- }], enableFloatingMenu: [{
909
- type: Input
910
- }], floatingMenuAmountSelectedText: [{
911
- type: Input
912
- }], floatingMenuAmountSelectedTemplate: [{
913
- type: Input
914
- }], rowClick: [{
915
- type: Output
916
- }], rowSelected: [{
917
- type: Output
918
- }], rowDeselected: [{
919
- type: Output
920
- }], enableHeader: [{
921
- type: Input
922
- }], quickFilters: [{
923
- type: Input
924
- }], activeQuickFilterIdentifier: [{
925
- type: Input
926
- }], enableSearch: [{
927
- type: Input
928
- }], query: [{
929
- type: Input
930
- }], enableFilter: [{
931
- type: Input
932
- }], enableFilterDesktop: [{
933
- type: Input
934
- }], selectedFiltersAmount: [{
935
- type: Input
936
- }], filterButtonTemplate: [{
937
- type: Input
938
- }], enableAction: [{
939
- type: Input
940
- }], actionButtonLoading: [{
941
- type: Input
942
- }], actionButtonIcon: [{
943
- type: Input
944
- }], actionButtonEnabled: [{
945
- type: Input
946
- }], actionButtonText: [{
947
- type: Input
948
- }], actionButtonTemplate: [{
949
- type: Input
950
- }], quickFilter: [{
951
- type: Output
952
- }], queryChange: [{
953
- type: Output
954
- }], filter: [{
955
- type: Output
956
- }], action: [{
957
- type: Output
958
- }], enableFooter: [{
959
- type: Input
960
- }], enablePaginationSize: [{
961
- type: Input
962
- }], enablePaginationPages: [{
963
- type: Input
964
- }], enableExport: [{
965
- type: Input
966
- }], page: [{
967
- type: Input
968
- }], total: [{
969
- type: Input
970
- }], pageChange: [{
971
- type: Output
972
- }], pageSize: [{
973
- type: Input
974
- }], pageSizeOptions: [{
975
- type: Input
976
- }], pageSizeChange: [{
977
- type: Output
978
- }], export: [{
979
- type: Output
980
- }], hideOnSinglePage: [{
981
- type: Input
982
- }], emptyStateType: [{
983
- type: Input
984
- }], emptyStateIllustration: [{
985
- type: Input
986
- }], emptyStateHeader: [{
987
- type: Input
988
- }], emptyStateContent: [{
989
- type: Input
990
- }], emptyStateAction: [{
991
- type: Input
992
- }], emptyStateActionIcon: [{
993
- type: Input
994
- }], enableEmptyStateAction: [{
995
- type: Input
996
- }], emptyStateFilteredIllustration: [{
997
- type: Input
998
- }], emptyStateFilteredHeader: [{
999
- type: Input
1000
- }], emptyStateFilteredContent: [{
1001
- type: Input
1002
- }], enableScroll: [{
1003
- type: Input
1004
- }], tableRows: [{
1005
- type: ViewChildren,
1006
- args: [PTableRow, { read: ElementRef }]
1007
- }], tableCells: [{
1008
- type: ViewChildren,
1009
- args: [TableCell, { read: ElementRef }]
1010
- }], scrollContainer: [{
1011
- type: ViewChild,
1012
- args: ['scrollContainer']
1013
- }], emptyStateActionClick: [{
1014
- type: Output
1015
- }], shadow: [{
1016
- type: Input
1017
- }], headerCustomFilterTemplate: [{
1018
- type: ContentChild,
1019
- args: [TableCustomFilterDirective, {
1020
- read: TemplateRef,
1021
- static: true,
1022
- }]
1023
- }], headerCustomActionsTemplate: [{
1024
- type: ContentChild,
1025
- args: [TableCustomActionsDirective, {
1026
- read: TemplateRef,
1027
- static: true,
1028
- }]
1029
- }], columnDefinitions: [{
1030
- type: ContentChildren,
1031
- args: [TableColumn]
1032
- }], extraHeaderDefinitions: [{
1033
- type: ContentChildren,
1034
- args: [TableExtraHeader]
1035
- }], filterModalTemplate: [{
1036
- type: ContentChild,
1037
- args: [TableFilterModalDirective, {
1038
- read: TemplateRef,
1039
- static: true,
1040
- }]
1041
- }], rowActions: [{
1042
- type: ContentChildren,
1043
- args: [TableRowAction]
1044
- }], customRows: [{
1045
- type: ContentChildren,
1046
- args: [TableCustomRowDirective]
1047
- }], filterModalHeaderText: [{
1048
- type: Input
1049
- }], filterModalSaveText: [{
1050
- type: Input
1051
- }], filterModalCancelText: [{
1052
- type: Input
1053
- }], filterModalResetText: [{
1054
- type: Input
1055
- }], filterModalShowReset: [{
1056
- type: Input
1057
- }], filterModalShowResetMobile: [{
1058
- type: Input
1059
- }], filterModalShow: [{
1060
- type: Output
1061
- }], filterModalSave: [{
1062
- type: Output
1063
- }], filterModalReset: [{
1064
- type: Output
1065
- }], onResize: [{
1066
- type: HostListener,
1067
- args: ['window:resize', ['$event']]
1068
- }], keyDown: [{
1069
- type: HostListener,
1070
- args: ['document:keydown', ['$event']]
1071
- }], keyUp: [{
1072
- type: HostListener,
1073
- args: ['document:keyup', ['$event']]
1074
- }], visibilityChange: [{
1075
- type: HostListener,
1076
- args: ['document:visibilitychange', ['$event']]
1077
- }] } });
1078
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhcGVybGVzcy9zcmMvbGliL21vZHVsZXMvdGFibGUvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksR0FDWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFDTixFQUFFLEVBQ0YsMEJBQTBCLEVBQzFCLFFBQVEsRUFDUixhQUFhLEVBR2IsS0FBSyxFQUNMLHNCQUFzQixHQUN0QixNQUFNLGlCQUFpQixDQUFDO0FBTXpCLE9BQU8sRUFDTixlQUFlLEVBQ2YsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBRU4sSUFBSSxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFDTiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLHlCQUF5QixHQUN6QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDdEYsT0FBTyxFQUVOLGNBQWMsR0FHZCxNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7Ozs7O0FBUXZELElBQU0sS0FBSyxHQUFYLE1BQU0sS0FBSztJQTRZRztJQTNZRSxTQUFTLEdBQUcsbUJBQW1CLENBQUM7SUFDdEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFFcEQ7O09BRUc7SUFDTSxLQUFLLENBQWtCO0lBRWhDOztPQUVHO0lBQ00sT0FBTyxHQUFZLEtBQUssQ0FBQztJQUVsQzs7T0FFRztJQUNNLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFFeEM7O09BRUc7SUFDTSxhQUFhLEdBQVksS0FBSyxDQUFDO0lBRXhDOztPQUVHO0lBQ00sbUJBQW1CLEdBQVcsQ0FBQyxDQUFDO0lBRXpDOztPQUVHO0lBQ00sa0JBQWtCLEdBQVksSUFBSSxDQUFDO0lBRTVDOztPQUVHO0lBQ00saUJBQWlCLEdBQXVCLFNBQVMsQ0FBQztJQUUzRDs7T0FFRztJQUNNLGNBQWMsR0FBWSxJQUFJLENBQUM7SUFFeEM7O09BRUc7SUFDTSxZQUFZLEdBQVUsRUFBRSxDQUFDO0lBRWxDOztPQUVHO0lBQ08sa0JBQWtCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFFckU7O09BRUc7SUFDTSxZQUFZLENBQXFCO0lBRTFDOztPQUVHO0lBQ00sWUFBWSxDQUFxQjtJQUUxQzs7T0FFRztJQUNNLGtCQUFrQixHQUFZLElBQUksQ0FBQztJQUU1Qzs7T0FFRztJQUNNLDhCQUE4QixHQUFXLGtCQUFrQixDQUFDO0lBRXJFOztPQUVHO0lBQ00sa0NBQWtDLENBQU07SUFFakQ7O09BRUc7SUFDSSxrQkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2RDs7T0FFRztJQUNPLFFBQVEsR0FBZ0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVyRTs7T0FFRztJQUNPLFdBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUU5RDs7T0FFRztJQUNPLGFBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVoRSxtQkFBbUI7SUFFbkI7O09BRUc7SUFDTSxZQUFZLEdBQVksSUFBSSxDQUFDO0lBRXRDOztPQUVHO0lBQ00sWUFBWSxHQUFrQixFQUFFLENBQUM7SUFFMUM7O09BRUc7SUFDTSwyQkFBMkIsQ0FBcUI7SUFFekQ7O09BRUc7SUFDTSxZQUFZLEdBQVksSUFBSSxDQUFDO0lBRXRDOztPQUVHO0lBQ00sS0FBSyxDQUFxQjtJQUVuQzs7T0FFRztJQUNNLFlBQVksR0FBWSxJQUFJLENBQUM7SUFFdEM7O09BRUc7SUFDTSxtQkFBbUIsR0FBWSxJQUFJLENBQUM7SUFFN0M7O09BRUc7SUFDTSxxQkFBcUIsQ0FBcUI7SUFFbkQ7O09BRUc7SUFDTSxvQkFBb0IsQ0FBTTtJQUVuQzs7T0FFRztJQUNNLFlBQVksR0FBWSxLQUFLLENBQUM7SUFFdkM7O09BRUc7SUFDTSxtQkFBbUIsR0FBWSxLQUFLLENBQUM7SUFFOUM7O09BRUc7SUFDTSxnQkFBZ0IsR0FBZ0IsUUFBUSxDQUFDO0lBRWxEOztPQUVHO0lBQ00sbUJBQW1CLEdBQVksSUFBSSxDQUFDO0lBRTdDOztPQUVHO0lBQ00sZ0JBQWdCLENBQVU7SUFFbkM7O09BRUc7SUFDTSxvQkFBb0IsQ0FBTTtJQUVuQzs7T0FFRztJQUNPLFdBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUV0RTs7T0FFRztJQUNPLFdBQVcsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVqRTs7T0FFRztJQUNPLE1BQU0sR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUxRDs7T0FFRztJQUNPLE1BQU0sR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUxRCxtQkFBbUI7SUFFbkI7O09BRUc7SUFDTSxZQUFZLEdBQVksSUFBSSxDQUFDO0lBRXRDOztPQUVHO0lBQ00sb0JBQW9CLEdBQVksSUFBSSxDQUFDO0lBRTlDOztPQUVHO0lBQ00scUJBQXFCLEdBQVksSUFBSSxDQUFDO0lBRS9DOztPQUVHO0lBQ00sWUFBWSxHQUFZLElBQUksQ0FBQztJQUV0Qzs7T0FFRztJQUNNLElBQUksR0FBVyxDQUFDLENBQUM7SUFFMUI7O09BRUc7SUFDTSxLQUFLLENBQVU7SUFFeEI7O09BRUc7SUFDTyxVQUFVLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7SUFFaEU7O09BRUc7SUFDTSxRQUFRLEdBQVcsV0FBVyxDQUFDO0lBRXhDOztPQUVHO0lBQ00sZUFBZSxHQUFhLGtCQUFrQixDQUFDO0lBRXhEOztPQUVHO0lBQ08sY0FBYyxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRXBFOztPQUVHO0lBQ08sTUFBTSxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRTVEOztPQUVHO0lBQ00sZ0JBQWdCLEdBQVksSUFBSSxDQUFDO0lBRTFDLHVCQUF1QjtJQUNkLGNBQWMsR0FBNkIsV0FBVyxDQUFDO0lBRXZELHNCQUFzQixHQUF3QixPQUFPLENBQUM7SUFDdEQsZ0JBQWdCLENBQVU7SUFDMUIsaUJBQWlCLENBQVU7SUFDM0IsZ0JBQWdCLENBQVU7SUFDMUIsb0JBQW9CLEdBQWdCLE1BQU0sQ0FBQztJQUUzQyxzQkFBc0IsR0FBWSxJQUFJLENBQUM7SUFFdkMsOEJBQThCLEdBQXdCLFFBQVEsQ0FBQztJQUMvRCx3QkFBd0IsQ0FBVTtJQUNsQyx5QkFBeUIsQ0FBVTtJQUU1Qzs7T0FFRztJQUNNLFlBQVksR0FBWSxLQUFLLENBQUM7SUFDUSxTQUFTLENBRXREO0lBQzZDLFVBQVUsQ0FFdkQ7SUFDNEIsZUFBZSxDQUE4QjtJQUVwRSxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxpQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLDZCQUE2QixDQUFVO0lBRXZDLHVCQUF1QixDQUFnQjtJQUN2Qyx3QkFBd0IsQ0FBZ0I7SUFFaEQ7O09BRUc7SUFDTyxxQkFBcUIsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUV6RSxxQkFBcUI7SUFFckI7O09BRUc7SUFDTSxNQUFNLEdBQVksSUFBSSxDQUFDO0lBRXpCLGFBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztJQUMvQyxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUMsV0FBVyxHQUFVLEVBQUUsQ0FBQztJQUN4QixXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtLQUNoQyxDQUFDLENBQUM7SUFDSyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRTFCLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFLbEIsMEJBQTBCLENBQStCO0lBRWhFLDBCQUEwQjtJQUtuQiwyQkFBMkIsQ0FBK0I7SUFFakUsbUJBQW1CO0lBQ1csaUJBQWlCLENBQTBCO0lBRXpFLHNCQUFzQixDQUErQjtJQUVyRCxlQUFlO0lBS1IsbUJBQW1CLENBQStCO0lBRWxELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXJELHdCQUF3QjtJQUNoQixXQUFXLENBQTZCO0lBQ3hDLHdCQUF3QixHQUFtQixFQUFFLENBQUM7SUFFdEQsSUFDSSxVQUFVLENBQUMsQ0FBNEI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUNELElBQUksVUFBVTtRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQsd0JBQXdCO0lBRXhCLFVBQVUsQ0FBc0M7SUFFdkMscUJBQXFCLEdBQVcsU0FBUyxDQUFDO0lBQzFDLG1CQUFtQixHQUFXLE1BQU0sQ0FBQztJQUNyQyxxQkFBcUIsR0FBVyxRQUFRLENBQUM7SUFDekMsb0JBQW9CLEdBQVcsZUFBZSxDQUFDO0lBRS9DLG9CQUFvQixHQUFZLEtBQUssQ0FBQztJQUN0QywwQkFBMEIsR0FBWSxLQUFLLENBQUM7SUFFM0MsZUFBZSxHQUEwQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzVELGVBQWUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUN6RCxnQkFBZ0IsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVoRSxjQUFjLEdBQUcsSUFBSSxlQUFlLENBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQzNELHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFtQixFQUFFLENBQUMsQ0FBQztJQUNuRSxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFFaEUsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFFbkQscUJBQXFCO0lBQ3JCLDZCQUE2QjtJQUM3QixnQkFBZ0I7SUFDaEIsMERBQTBEO0lBQzFELHFDQUFxQztJQUNyQyxTQUFTO0lBQ1QsZUFBZTtJQUNSLDBCQUEwQixHQUFHLDBCQUEwQixDQUFDO0lBRXZELGNBQWMsQ0FBVTtJQUN4Qix3QkFBd0IsR0FBWSxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDNUQsdUJBQXVCLEdBQXVCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUVyRSxjQUFjLENBQWlDO0lBRWhELGFBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUzQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRWYsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBRyxDQUFDO0lBRTlDLFFBQVE7UUFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QixhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtTQUNoQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCO2FBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQzthQUNsRCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDakMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDaEQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDN0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFlBQVk7YUFDbkQsQ0FBQyxDQUFDO1NBQ0g7UUFFRCxJQUFJLHlCQUF5QixHQUFHLEtBQUssQ0FBQztRQUN0QyxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzVCLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUM1Qyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7U0FDakM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDekUseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1NBQ2pDO1FBRUQsSUFBSSx5QkFBeUIsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDekQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDNUI7UUFFRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxZQUFZLEVBQUU7WUFDMUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7U0FDbEM7SUFDRixDQUFDO0lBRUQsZUFBZTtRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUNsQztRQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPO2lCQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDN0MsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDeEI7UUFFRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUNoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTztpQkFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzdDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzdCO0lBQ0YsQ0FBQztJQUdELFFBQVE7UUFDUCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBR0QsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFtQjtRQUMvQixJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFDakQsT0FBTztTQUNQO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUdELEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBbUI7UUFDN0IsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQ2xELE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFHRCxnQkFBZ0I7UUFDZixJQUFJLFFBQVEsQ0FBQyxlQUFlLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQ3RFLE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQU87UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBTztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQU87UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFlBQVksQ0FBQyxFQUFFLE1BQU0sRUFBTztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsaUJBQWlCO1FBQ2hCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsZ0JBQWdCLEdBQUcsS0FBSztRQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2hCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDakMsT0FBTztTQUNQO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxPQUFnQyxFQUFFLFFBQWdCO1FBQ3BFLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1NBQ1Y7UUFFRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQ3BCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQU87UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdkIsT0FBTztTQUNQO1FBRUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBcUI7UUFDeEMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNYLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLE9BQU87U0FDUDtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixPQUFPO1NBQ1A7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLGdCQUFnQjtRQUN2QixJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFMUQsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUN4QyxnQkFBZ0IsQ0FDWSxDQUFDO1FBRTlCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLHFCQUFxQjtRQUM1QixJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFL0QsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUN4QyxnQkFBZ0IsQ0FDaUIsQ0FBQztRQUVuQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixFQUFFO1lBQ25DLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0saUJBQWlCLENBQUMsSUFBUyxFQUFFLFFBQWdCO1FBQ25ELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRSxPQUFPLENBQ04sQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMvQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxTQUFTO2dCQUNwQyxDQUFDLGlCQUFpQjtnQkFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQ3JELENBQUM7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsTUFBVyxFQUFFLFVBQW9CO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDN0IsT0FBTztTQUNQO1FBRUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBRXBFLElBQUksS0FBSyxFQUFFO1lBQ1YsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFDakQsU0FBUztpQkFDVDtnQkFFRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7b0JBQ3BDLFNBQVM7aUJBQ1Q7Z0JBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRTNCLElBQ0MsSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVM7b0JBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUNqRTtvQkFDRCxNQUFNO2lCQUNOO2FBQ0Q7WUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFaEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ3pCO1lBRUQsT0FBTztTQUNQO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ2hDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUN4RSxDQUFDO1lBRUYsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDVCxTQUFTO2FBQ1Q7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3QjtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTSxlQUFlLENBQUMsTUFBVyxFQUFFLEtBQWE7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUM3QixPQUFPO1NBQ1A7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFDQyxLQUFLO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVM7WUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUNqRDtZQUNELE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE9BQU87U0FDUDtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEMsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNqRCxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixPQUFPO1NBQ1A7UUFFRCxJQUFJLEtBQUssRUFBRTtZQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFM0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ3pCO1lBQ0QsT0FBTztTQUNQO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbEUsNEVBQTRFO1FBQzVFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQVc7UUFDbkMsT0FBTyxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxHQUFRLEVBQUUsS0FBYTtRQUNqRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN0RSxDQUFDO0lBRU0sa0JBQWtCLENBQUMsR0FBUSxFQUFFLEtBQWEsRUFBRSxXQUFXLEdBQUcsS0FBSztRQUNyRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FDOUMsSUFBSSxDQUFDLEVBQUUsQ0FDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQztZQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUNyQyxDQUFDO1FBQ0YsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ3RELENBQUM7SUFFTSxxQkFBcUI7UUFDM0IsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRTtZQUM5QixPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsSUFDQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQ2xEO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbEQsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDZCxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixNQUFNO2FBQ047U0FDRDtRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3BCLENBQUM7SUFFTSx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUU7WUFDNUQsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUVELElBQ0MsSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVM7WUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUNsRDtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFFRCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVsRCxJQUFJLFFBQVEsRUFBRTtnQkFDYixhQUFhLEVBQUUsQ0FBQzthQUNoQjtTQUNEO1FBRUQsT0FBTyxhQUFhLEdBQUcsQ0FBQyxJQUFJLGFBQWEsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUN2RSxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWtCLEVBQUUsS0FBYTtRQUNqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBcUIsQ0FBQztRQUU1QyxJQUNDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTztZQUN2QyxNQUEyQixDQUFDLElBQUksS0FBSyxVQUFVLEVBQy9DO1lBQ0QsT0FBTztTQUNQO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLElBQUksTUFBTSxFQUFFO1lBQ1gsT0FBTztTQUNQO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLElBQUk7Z0JBQ0osUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQ3hCLENBQUMsQ0FBQztZQUNILE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDN0IsT0FBTztTQUNQO1FBRUQsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRTlELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZCxPQUFPO1NBQ1A7UUFFRCxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0sb0JBQW9CLENBQzFCLFVBQW9DLEVBQ3BDLFFBQWdCO1FBRWhCLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNoRSxPQUFPLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDbkIsQ0FBQztJQUVNLHFCQUFxQixDQUMzQixXQUFzQyxFQUN0QyxRQUFnQjtRQUVoQixJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRTtZQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMvRDtRQUVELElBQUksV0FBVyxZQUFZLE1BQU0sSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLE1BQU0sRUFBRTtZQUN4RSxPQUFPLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsT0FBTyxXQUFnQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxlQUFlLENBQUMsTUFBc0IsRUFBRSxRQUFpQjtRQUMvRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDcEIsT0FBTztTQUNQO1FBRUQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ25CLE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ25CLE9BQU87U0FDUDtRQUVELElBQ0MsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPO1lBQ3ZCLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyxFQUNqRDtZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNsQixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQ3hCLEtBQUssRUFBRSxJQUFJO2dCQUNYLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUzthQUN4QixDQUFDLENBQUM7WUFDSCxPQUFPO1NBQ1A7UUFFRCxJQUNDLE1BQU0sQ0FBQyxVQUFVO1lBQ2pCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFDN0Q7WUFDRCxPQUFPO1NBQ1A7UUFFRCxNQUFNLElBQUksR0FDVCxRQUFRLEtBQUssU0FBUztZQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbEIsSUFBSTtZQUNKLEtBQUssRUFBRSxLQUFLO1lBQ1osUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3hCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxRQUFRLENBQUMsRUFBc0I7UUFDdEMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNSLE9BQU8sRUFBRSxDQUFDO1NBQ1Y7UUFFRCxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssYUFBYSxFQUFFO1lBQ2pELE9BQU8sRUFBRSxDQUFDO1NBQ1Y7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxjQUFjLENBQUMsRUFBc0I7UUFDNUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNSLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFFRCxJQUNDLEVBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJO1lBQzFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxPQUFPLEVBQzVDO1lBQ0QsT0FBTyxFQUFFLENBQUM7U0FDVjtRQUVELElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxhQUFhLEVBQUU7WUFDakQsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLG9CQUFvQjtRQUMzQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUF3QixDQUFDLENBQUM7U0FDNUM7UUFFRCxrR0FBa0c7UUFDbEcsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU1QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQXFCLENBQUM7WUFFakUsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFO2dCQUN6QyxLQUFLLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtvQkFDdkQsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUMzQjthQUNEO1lBRUQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDcEQsTUFBTSxDQUFDLGVBQWU7aUJBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQzNDLENBQUM7WUFFRiwwQ0FBMEM7WUFDMUMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDbkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FDN0MsQ0FBQztZQUNGLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FDSCxDQUFDLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzdCLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDM0MsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQ2pELENBQUM7WUFFRixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztZQUNyRCxJQUNDLE1BQU0sSUFBSSxlQUFlO2dCQUN6QixrQkFBa0IsRUFBRSxNQUFNLElBQUksZ0RBQWdEO2dCQUM5RSxDQUFDLENBQUMsaUJBQWlCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDNUQsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFDekI7Z0JBQ0QsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO2FBQ3RCO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1lBRTNDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ3ZELElBQ0MsTUFBTSxJQUFJLGVBQWU7Z0JBQ3pCLGtCQUFrQixFQUFFLE1BQU0sSUFBSSxnREFBZ0Q7Z0JBQzlFLENBQUMsa0JBQWtCLEVBQ2xCO2dCQUNELGtCQUFrQixHQUFHLElBQUksQ0FBQzthQUMxQjtZQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztZQUU3QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFckQsSUFBSSxDQUFDLGtCQUFrQjtpQkFDckIsSUFBSSxDQUNKLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2hCO2lCQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNULENBQUM7SUFFTyxpQkFBaUI7UUFDeEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDN0QsSUFDQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQztnQkFDNUIsT0FBTyxDQUFDLFNBQVMsQ0FDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FDakUsSUFBSSxDQUFDLEVBQ0w7Z0JBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQ0gsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPO29CQUNsQixDQUFDLENBQUMsQ0FBQyxZQUFZO29CQUNmLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyQyxDQUFDO2FBQ0Y7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8saUJBQWlCLENBQ3hCLGdCQUFvRDtRQUVwRCxPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUN4QyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsVUFBMEM7UUFDdkUsTUFBTSxhQUFhLEdBQUcsVUFBaUIsQ0FBQztRQUN4QyxJQUFJLFdBQVcsR0FBcUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFFeEQsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdELElBQ0MsYUFBYSxDQUFDLEtBQUssS0FBSyxNQUFNO2dCQUM5QixhQUFhLENBQUMsS0FBSyxLQUFLLFFBQVE7Z0JBQ2hDLGFBQWEsQ0FBQyxLQUFLLEtBQUssTUFBTTtnQkFDOUIsT0FBTyxhQUFhLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFDdEM7Z0JBQ0QsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDaEIsYUFBYSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztnQkFDL0QsU0FBUzthQUNUO1lBRUQsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDaEIsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7b0JBQ3pCLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRDtRQUVELFVBQVUsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ3JDLE9BQU8sVUFBVSxDQUFDO0lBQ25CLENBQUM7SUFFTywwQkFBMEI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3BELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87aUJBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUM3QyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztTQUNqRDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN0RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPO2lCQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDN0MsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7U0FDakQ7SUFDRixDQUFDO0lBRU8sc0JBQXNCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3ZCLE9BQU87U0FDUDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN4QyxPQUFPO1NBQ1A7UUFFRCxJQUFJLElBQUksQ0FBQyw2QkFBNkIsRUFBRTtZQUN2QyxZQUFZLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLENBQUMsQ0FBQztTQUN2QztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUM5QixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUF1QyxDQUM5QyxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDekIsR0FBRyxDQUFDLEVBQUUsQ0FDTCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFrQixDQUN0RSxDQUFDO1FBRUYsSUFBSSxDQUFDLDZCQUE2QixHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXpCLE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7WUFDckMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO29CQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDL0I7Z0JBRUQsUUFBUSxDQUFDLElBQUksQ0FDWixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNyQixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQyxLQUFLLGVBQWUsQ0FBQyxDQUFDO29CQUNoRSxPQUFPLEVBQUUsQ0FBQztnQkFDWCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQ1AsQ0FDRCxDQUFDO2FBQ0Y7WUFFRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFeEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDN0IsQ0FBQyxFQUFFLEdBQUcsQ0FBc0IsQ0FBQztJQUM5QixDQUFDO0lBRU8sYUFBYSxDQUNwQixJQUFtQixFQUNuQixRQUE4QixJQUFJO1FBRWxDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1osU0FBUzthQUNUO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2QsU0FBUzthQUNUO1lBRUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2YsU0FBUzthQUNUO1lBRUQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNuQixRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLFNBQVM7YUFDVDtZQUVELFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFDdEQsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUV2RCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDMUQ7U0FDRDtJQUNGLENBQUM7SUFFTyxvQkFBb0I7UUFDM0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWE7U0FDMUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLHdCQUF3QixDQUFDLEVBQUUsTUFBTSxFQUE4QjtRQUN0RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFdEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQXVCO1FBQzFDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsQ0FBQzt3R0FycENXLEtBQUs7NEZBQUwsS0FBSyx5K0ZBMlRILDBCQUEwQiwyQkFDakMsV0FBVyx5RkFNSiwyQkFBMkIsMkJBQ2xDLFdBQVcsaUZBV0oseUJBQXlCLDJCQUNoQyxXQUFXLGtFQU5ELFdBQVcseURBQ1gsZ0JBQWdCLDZDQWdCaEIsY0FBYyw2Q0FVZCx1QkFBdUIsZ0tBL0UxQixTQUFTLDJCQUFVLFVBQVUsNkNBRzdCLFNBQVMsMkJBQVUsVUFBVSxrREM3VjVDLHN5WkE2V0E7O0FEeFNhLEtBQUs7SUFOakIsWUFBWSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO0dBTTNCLEtBQUssQ0FzcENqQjtTQXRwQ1ksS0FBSzs0RkFBTCxLQUFLO2tCQUxqQixTQUFTOytCQUNDLGFBQWEsbUJBRU4sdUJBQXVCLENBQUMsTUFBTTt3R0FHekIsU0FBUztzQkFBOUIsV0FBVzt1QkFBQyxPQUFPO2dCQUNZLEtBQUs7c0JBQXBDLFdBQVc7dUJBQUMsaUJBQWlCO2dCQUtyQixLQUFLO3NCQUFiLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFLRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBS0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUtHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0ksa0JBQWtCO3NCQUEzQixNQUFNO2dCQUtFLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFLRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBS0csOEJBQThCO3NCQUF0QyxLQUFLO2dCQUtHLGtDQUFrQztzQkFBMUMsS0FBSztnQkFVSSxRQUFRO3NCQUFqQixNQUFNO2dCQUtHLFdBQVc7c0JBQXBCLE1BQU07Z0JBS0csYUFBYTtzQkFBdEIsTUFBTTtnQkFPRSxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUtHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFLRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFLRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBS0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUtHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFLRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUtJLFdBQVc7c0JBQXBCLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBS0csTUFBTTtzQkFBZixNQUFNO2dCQU9FLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUtHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFLRSxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBS0ksY0FBYztzQkFBdkIsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBS0UsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBRUcsOEJBQThCO3NCQUF0QyxLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFDeUMsU0FBUztzQkFBdkQsWUFBWTt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUdFLFVBQVU7c0JBQXhELFlBQVk7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHZixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFhbEIscUJBQXFCO3NCQUE5QixNQUFNO2dCQU9FLE1BQU07c0JBQWQsS0FBSztnQkFnQkMsMEJBQTBCO3NCQUpoQyxZQUFZO3VCQUFDLDBCQUEwQixFQUFFO3dCQUN6QyxJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLElBQUk7cUJBQ1o7Z0JBUU0sMkJBQTJCO3NCQUpqQyxZQUFZO3VCQUFDLDJCQUEyQixFQUFFO3dCQUMxQyxJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLElBQUk7cUJBQ1o7Z0JBSTZCLGlCQUFpQjtzQkFBOUMsZUFBZTt1QkFBQyxXQUFXO2dCQUU1QixzQkFBc0I7c0JBRHJCLGVBQWU7dUJBQUMsZ0JBQWdCO2dCQVExQixtQkFBbUI7c0JBSnpCLFlBQVk7dUJBQUMseUJBQXlCLEVBQUU7d0JBQ3hDLElBQUksRUFBRSxXQUFXO3dCQUNqQixNQUFNLEVBQUUsSUFBSTtxQkFDWjtnQkFVRyxVQUFVO3NCQURiLGVBQWU7dUJBQUMsY0FBYztnQkFXL0IsVUFBVTtzQkFEVCxlQUFlO3VCQUFDLHVCQUF1QjtnQkFHL0IscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFnR1AsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFPekMsT0FBTztzQkFETixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVU1QyxLQUFLO3NCQURKLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENoYW5nZURldGVjdG9yUmVmLFxuXHRDb21wb25lbnQsXG5cdENvbnRlbnRDaGlsZCxcblx0Q29udGVudENoaWxkcmVuLFxuXHRFbGVtZW50UmVmLFxuXHRFdmVudEVtaXR0ZXIsXG5cdEhvc3RCaW5kaW5nLFxuXHRIb3N0TGlzdGVuZXIsXG5cdElucHV0LFxuXHRPbkNoYW5nZXMsXG5cdE9uSW5pdCxcblx0T3V0cHV0LFxuXHRRdWVyeUxpc3QsXG5cdFNpbXBsZUNoYW5nZXMsXG5cdFRlbXBsYXRlUmVmLFxuXHRWaWV3Q2hpbGQsXG5cdFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVW50aWxEZXN0cm95LCB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ0BuZ25lYXQvdW50aWwtZGVzdHJveSc7XG5pbXBvcnQge1xuXHRjbixcblx0ZmxvYXRpbmdNZW51Q29udGFpbmVyQ2xhc3MsXG5cdGlzTW9iaWxlLFxuXHRvblN0YXRlQ2hhbmdlLFxuXHRRdWlja0ZpbHRlcixcblx0Um93Q2xpY2tFdmVudCxcblx0c3RhdGUsXG5cdHRhYmxlQ29sdW1TaXplc09wdGlvbnMsXG59IGZyb20gJ0BwYXBlcmxlc3MvY29yZSc7XG5pbXBvcnQge1xuXHRJY29uVmFyaWFudCxcblx0SWxsdXN0cmF0aW9uVmFyaWFudCxcblx0VGFibGVDb2x1bW5TaXplcyxcbn0gZnJvbSAnQHBhcGVybGVzcy9jb3JlL2Rpc3QvdHlwZXMvY29tcG9uZW50cyc7XG5pbXBvcnQge1xuXHRCZWhhdmlvclN1YmplY3QsXG5cdGRlYm91bmNlVGltZSxcblx0ZGlzdGluY3RVbnRpbENoYW5nZWQsXG5cdGZpbHRlcixcblx0U3Vic2NyaXB0aW9uLFxuXHR0YWtlLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBUYWJsZVJvdyB9IGZyb20gJy4uLy4uLy4uLy4uL3N0ZW5jaWwvY29tcG9uZW50cyc7XG5pbXBvcnQge1xuXHRUYWJsZUN1c3RvbUFjdGlvbnNEaXJlY3RpdmUsXG5cdFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlLFxuXHRUYWJsZUZpbHRlck1vZGFsRGlyZWN0aXZlLFxufSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7IFRhYmxlQ3VzdG9tUm93RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9wLXRhYmxlLWN1c3RvbS1yb3cuZGlyZWN0aXZlJztcbmltcG9ydCB7IFRhYmxlQ2VsbCB9IGZyb20gJy4uL3RhYmxlLWNlbGwvdGFibGUtY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi90YWJsZS1jb2x1bW4vdGFibGUtY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUV4dHJhSGVhZGVyIH0gZnJvbSAnLi4vdGFibGUtZXh0cmEtaGVhZGVyL3RhYmxlLWV4dHJhLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHtcblx0QXN5bmNJdGVtLFxuXHRUYWJsZVJvd0FjdGlvbixcblx0VGFibGVSb3dBY3Rpb25RdWVyeVBhcmFtcyxcblx0VGFibGVSb3dBY3Rpb25Sb3V0ZXJMaW5rLFxufSBmcm9tICcuLi90YWJsZS1yb3ctYWN0aW9uL3RhYmxlLXJvdy1hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IGRlZmF1bHRTaXplLCBkZWZhdWx0U2l6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbkBVbnRpbERlc3Ryb3koeyBjaGVja1Byb3BlcnRpZXM6IHRydWUgfSlcbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ3AtdGFibGUtbmd4Jyxcblx0dGVtcGxhdGVVcmw6ICd0YWJsZS5jb21wb25lbnQuaHRtbCcsXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblx0QEhvc3RCaW5kaW5nKCdjbGFzcycpIGNsYXNzTmFtZSA9ICdmbGV4IGZsZXgtY29sIHotMCc7XG5cdEBIb3N0QmluZGluZygnYXR0ci5kYXRhLXRoZW1lJykgdGhlbWUgPSBzdGF0ZS50aGVtZTtcblxuXHQvKipcblx0ICogVGhlIGl0ZW1zIHRvIGJlIGZlZCB0byB0aGUgdGFibGVcblx0ICovXG5cdEBJbnB1dCgpIGl0ZW1zITogc3RyaW5nIHwgYW55W107XG5cblx0LyoqXG5cdCAqIFdldGhlciBkYXRhIGlzIGxvYWRpbmdcblx0ICovXG5cdEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRoZSBoZWFkZXIgc2hvdWxkIHNob3cgbG9hZGluZyBzdGF0ZVxuXHQgKi9cblx0QElucHV0KCkgaGVhZGVyTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdGhlIGZvb3RlciBzaG91bGQgc2hvdyBsb2FkaW5nIHN0YXRlXG5cdCAqL1xuXHRASW5wdXQoKSBmb290ZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFRoZSBhbW91bnQgb2YgbG9hZGluZyByb3dzIHRvIHNob3dcblx0ICovXG5cdEBJbnB1dCgpIGFtb3VudE9mTG9hZGluZ1Jvd3M6IG51bWJlciA9IDY7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBlbmFibGUgc2VsZWN0aW9uXG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVSb3dTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBBIGxpbWl0IHRvIHRoZSBhbW91bnQgb2Ygcm93cyB0aGF0IGNhbiBiZSBzZWxlY3RlZFxuXHQgKi9cblx0QElucHV0KCkgcm93U2VsZWN0aW9uTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGVuYWJsZSByb3cgY2xpY2tpbmdcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVJvd0NsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIGl0ZW1zXG5cdCAqL1xuXHRASW5wdXQoKSBzZWxlY3RlZFJvd3M6IGFueVtdID0gW107XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW5ldmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBjaGFuZ2VzXG5cdCAqL1xuXHRAT3V0cHV0KCkgc2VsZWN0ZWRSb3dzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogVGhlIGtleSB0byBkZXRlcm1pbmUgaWYgYSByb3cgaXMgc2VsZWN0ZWRcblx0ICovXG5cdEBJbnB1dCgpIHNlbGVjdGlvbktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBBIGtleSB0byBkZXRlcm1pbmUgaWYgYSByb3cgY2FuIGJlIHNlbGVjdGVkXG5cdCAqL1xuXHRASW5wdXQoKSBjYW5TZWxlY3RLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGVuYWJsZSB0aGUgZmxvYXRpbmcgbWVudVxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlRmxvYXRpbmdNZW51OiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogVGhlIGZsb2F0aW5nIG1lbnUgYW1vdW50IGl0ZW0gdGV4dFxuXHQgKi9cblx0QElucHV0KCkgZmxvYXRpbmdNZW51QW1vdW50U2VsZWN0ZWRUZXh0OiBzdHJpbmcgPSAnMCBpdGVtcyBzZWxlY3RlZCc7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW1wbGF0ZSBmb3IgYW1vdW50IHNlbGVjdGVkIGl0ZW0gaW4gdGhlIGZsb2F0aW5nIG1lbnVcblx0ICovXG5cdEBJbnB1dCgpIGZsb2F0aW5nTWVudUFtb3VudFNlbGVjdGVkVGVtcGxhdGU6IGFueTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRoZSBmbG9hdGluZyBtZW51IGhhcyBiZWVuIHNob3duIGF0bGVhc3Qgb25jZVxuXHQgKi9cblx0cHVibGljIGZsb2F0aW5nTWVudVNob3duJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciBhIHJvdyBpcyBjbGlja2VkXG5cdCAqL1xuXHRAT3V0cHV0KCkgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxSb3dDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgc2VsZWN0ZWRcblx0ICovXG5cdEBPdXRwdXQoKSByb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW5ldmVyIGEgcm93IGlzIGRlc2VsZWN0ZWRcblx0ICovXG5cdEBPdXRwdXQoKSByb3dEZXNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogU1RBUlQgSEVBREVSICovXG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBoZWFkZXJcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZUhlYWRlcjogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFF1aWNrIGZpbHRlcnMgdG8gc2hvd1xuXHQgKi9cblx0QElucHV0KCkgcXVpY2tGaWx0ZXJzOiBRdWlja0ZpbHRlcltdID0gW107XG5cblx0LyoqXG5cdCAqIEFjdGl2ZSBxdWljayBmaWx0ZXIgaWRlbnRpZmllclxuXHQgKi9cblx0QElucHV0KCkgYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBzZWFyY2ggaW5wdXRcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVNlYXJjaDogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFRoZSBxdWVyeSB0byBzaG93IGluIHRoZSBzZWFyY2ggYmFyXG5cdCAqL1xuXHRASW5wdXQoKSBxdWVyeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gc2hvdyB0aGUgZmlsdGVyIGJ1dHRvblxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIHNob3cgdGhlIGZpbHRlciBidXR0b24gb24gZGVza3RvcFxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlRmlsdGVyRGVza3RvcDogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFRoZSBhbW91bnQgb2YgZmlsdGVycyBiZWluZyBzZWxlY3RlZFxuXHQgKi9cblx0QElucHV0KCkgc2VsZWN0ZWRGaWx0ZXJzQW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGZpbHRlciBidXR0b24gdGV4dFxuXHQgKi9cblx0QElucHV0KCkgZmlsdGVyQnV0dG9uVGVtcGxhdGU6IGFueTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIHNob3cgdGhlIGFjdGlvbiBidXR0b25cblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZUFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdGhlIGFjdGlvbiBidXR0b24gaXMgbG9hZGluZ1xuXHQgKi9cblx0QElucHV0KCkgYWN0aW9uQnV0dG9uTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBUaGUgYWN0aW9uIGJ1dHRvbiBpY29uXG5cdCAqL1xuXHRASW5wdXQoKSBhY3Rpb25CdXR0b25JY29uOiBJY29uVmFyaWFudCA9ICdwZW5jaWwnO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdGhlIGFjdGlvbiBidXR0b24gaXMgZW5hYmxlZFxuXHQgKi9cblx0QElucHV0KCkgYWN0aW9uQnV0dG9uRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFRoZSBhY3Rpb24gYnV0dG9uIHRleHQgaWYgY2hhbmdlZFxuXHQgKi9cblx0QElucHV0KCkgYWN0aW9uQnV0dG9uVGV4dD86IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHRlbXBsYXRlIGZvciB0aGUgYWN0aW9uIGJ1dHRvbiB0ZXh0XG5cdCAqL1xuXHRASW5wdXQoKSBhY3Rpb25CdXR0b25UZW1wbGF0ZTogYW55O1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuIG9uZSBvZiB0aGUgcXVpY2sgZmlsdGVycyBpcyBjbGlja2VkXG5cdCAqL1xuXHRAT3V0cHV0KCkgcXVpY2tGaWx0ZXI6IEV2ZW50RW1pdHRlcjxRdWlja0ZpbHRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW4gdGhlIHF1ZXJ5IGNoYW5nZXNcblx0ICovXG5cdEBPdXRwdXQoKSBxdWVyeUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIEV2ZW50IHdoZW4gdGhlIGZpbHRlciBidXR0b24gaXMgY2xpY2tlZFxuXHQgKi9cblx0QE91dHB1dCgpIGZpbHRlcjogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuIHRoZSBhY3Rpb24gYnV0dG9uIGlzIGNsaWNrZWRcblx0ICovXG5cdEBPdXRwdXQoKSBhY3Rpb246IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogU1RBUlQgRk9PVEVSICovXG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBmb290ZXJcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZUZvb3RlcjogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBlbmFibGUgcGFnaW5hdGlvbiBzaXplIHNlbGVjdFxuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlUGFnaW5hdGlvblNpemU6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gZW5hYmxlIHBhZ2luYXRpb24gcGFnZXNcblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVBhZ2luYXRpb25QYWdlczogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFdldGhlciB0byBlbmFibGUgZXhwb3J0XG5cdCAqL1xuXHRASW5wdXQoKSBlbmFibGVFeHBvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBwYWdlXG5cdCAqL1xuXHRASW5wdXQoKSBwYWdlOiBudW1iZXIgPSAxO1xuXG5cdC8qKlxuXHQgKiBUaGUgdG90YWwgYW1vdW50IG9mIGl0ZW1zXG5cdCAqL1xuXHRASW5wdXQoKSB0b3RhbCE6IG51bWJlcjtcblxuXHQvKipcblx0ICogRXZlbnQgd2hlbmV2ZXIgdGhlIHBhZ2UgY2hhbmdlc1xuXHQgKi9cblx0QE91dHB1dCgpIHBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBUaGUgYW1vdW50IG9mIGl0ZW1zIHBlciBwYWdlXG5cdCAqL1xuXHRASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gZGVmYXVsdFNpemU7XG5cblx0LyoqXG5cdCAqIFRoZSBvcHRpb25zIGZvciB0aGUgcGFnZSBzaXplXG5cdCAqL1xuXHRASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gZGVmYXVsdFNpemVPcHRpb25zO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG5cdCAqL1xuXHRAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG5cdCAqL1xuXHRAT3V0cHV0KCkgZXhwb3J0OiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogV2V0aGVyIHRvIGhpZGUgd2hlbiB0aGVyZSBpcyBvbmx5IDEgcGFnZSBhdmFpbGFibGVcblx0ICovXG5cdEBJbnB1dCgpIGhpZGVPblNpbmdsZVBhZ2U6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qIEVtcHR5IHN0YXRlIHN0YXJ0ICovXG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVUeXBlOiAnbm9fZmlsdGVyJyB8ICdmaWx0ZXJlZCcgPSAnbm9fZmlsdGVyJztcblxuXHRASW5wdXQoKSBlbXB0eVN0YXRlSWxsdXN0cmF0aW9uOiBJbGx1c3RyYXRpb25WYXJpYW50ID0gJ3RhYmxlJztcblx0QElucHV0KCkgZW1wdHlTdGF0ZUhlYWRlciE6IHN0cmluZztcblx0QElucHV0KCkgZW1wdHlTdGF0ZUNvbnRlbnQhOiBzdHJpbmc7XG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVBY3Rpb24hOiBzdHJpbmc7XG5cdEBJbnB1dCgpIGVtcHR5U3RhdGVBY3Rpb25JY29uOiBJY29uVmFyaWFudCA9ICdwbHVzJztcblxuXHRASW5wdXQoKSBlbmFibGVFbXB0eVN0YXRlQWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuXHRASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRJbGx1c3RyYXRpb246IElsbHVzdHJhdGlvblZhcmlhbnQgPSAnc2VhcmNoJztcblx0QElucHV0KCkgZW1wdHlTdGF0ZUZpbHRlcmVkSGVhZGVyITogc3RyaW5nO1xuXHRASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRDb250ZW50ITogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBXZXRoZXIgdG8gZW5hYmxlIHNjcm9sbGluZ1xuXHQgKi9cblx0QElucHV0KCkgZW5hYmxlU2Nyb2xsOiBib29sZWFuID0gZmFsc2U7XG5cdEBWaWV3Q2hpbGRyZW4oUFRhYmxlUm93LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdGFibGVSb3dzITogUXVlcnlMaXN0PFxuXHRcdEVsZW1lbnRSZWY8UFRhYmxlUm93PlxuXHQ+O1xuXHRAVmlld0NoaWxkcmVuKFRhYmxlQ2VsbCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHRhYmxlQ2VsbHMhOiBRdWVyeUxpc3Q8XG5cdFx0RWxlbWVudFJlZjxUYWJsZUNlbGw+XG5cdD47XG5cdEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicpIHNjcm9sbENvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG5cdHB1YmxpYyByZWFjaGVkU2Nyb2xsU3RhcnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcblx0cHVibGljIHJlYWNoZWRTY3JvbGxFbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cdHByaXZhdGUgX3RvdGFsV2lkdGggPSAwO1xuXHRwcml2YXRlIF9jYWxjdWxhdGVDb2x1bW5XaWR0aHNUaW1lb3V0PzogbnVtYmVyO1xuXG5cdHByaXZhdGUgX3Jvd0NoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cdHByaXZhdGUgX2NlbGxDaGFuZ2VzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG5cdC8qKlxuXHQgKiBFdmVudCB3aGVuZXZlciB0aGUgZW1wdHkgc3RhdGUgaXMgY2xpY2tlZFxuXHQgKi9cblx0QE91dHB1dCgpIGVtcHR5U3RhdGVBY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qIEVtcHR5IHN0YXRlIGVuZCAqL1xuXG5cdC8qXG5cdCAqIFdldGhlciB0byBzaG93IHRoZSBzaGFkb3cgb3Igbm90XG5cdCAqL1xuXHRASW5wdXQoKSBzaGFkb3c6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdHB1YmxpYyBleHRyYUhlYWRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuXHRwdWJsaWMgY29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG5cdHB1YmxpYyBwYXJzZWRJdGVtczogYW55W10gPSBbXTtcblx0cHVibGljIGxvYWRpbmdSb3dzID0gQXJyYXkuZnJvbSh7XG5cdFx0bGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG5cdH0pO1xuXHRwcml2YXRlIF9jdHJsRG93biA9IGZhbHNlO1xuXG5cdC8vIEFuZ3VsYXIgc3R1ZmZcblx0Ly8gY3VzdG9tIGZpbHRlciB0ZW1wbGF0ZVxuXHRAQ29udGVudENoaWxkKFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlLCB7XG5cdFx0cmVhZDogVGVtcGxhdGVSZWYsXG5cdFx0c3RhdGljOiB0cnVlLFxuXHR9KVxuXHRwdWJsaWMgaGVhZGVyQ3VzdG9tRmlsdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cblx0Ly8gY3VzdG9tIGFjdGlvbnMgdGVtcGxhdGVcblx0QENvbnRlbnRDaGlsZChUYWJsZUN1c3RvbUFjdGlvbnNEaXJlY3RpdmUsIHtcblx0XHRyZWFkOiBUZW1wbGF0ZVJlZixcblx0XHRzdGF0aWM6IHRydWUsXG5cdH0pXG5cdHB1YmxpYyBoZWFkZXJDdXN0b21BY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cblx0Ly8gY29sdW1uIHRlbXBsYXRlc1xuXHRAQ29udGVudENoaWxkcmVuKFRhYmxlQ29sdW1uKSBjb2x1bW5EZWZpbml0aW9ucyE6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj47XG5cdEBDb250ZW50Q2hpbGRyZW4oVGFibGVFeHRyYUhlYWRlcilcblx0ZXh0cmFIZWFkZXJEZWZpbml0aW9ucyE6IFF1ZXJ5TGlzdDxUYWJsZUV4dHJhSGVhZGVyPjtcblxuXHQvLyBmaWx0ZXIgbW9kYWxcblx0QENvbnRlbnRDaGlsZChUYWJsZUZpbHRlck1vZGFsRGlyZWN0aXZlLCB7XG5cdFx0cmVhZDogVGVtcGxhdGVSZWYsXG5cdFx0c3RhdGljOiB0cnVlLFxuXHR9KVxuXHRwdWJsaWMgZmlsdGVyTW9kYWxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuXHRwdWJsaWMgZmlsdGVyTW9kYWxTaG93JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG5cdC8vIHJvdyBhY3Rpb25zIHRlbXBsYXRlc1xuXHRwcml2YXRlIF9yb3dBY3Rpb25zITogUXVlcnlMaXN0PFRhYmxlUm93QWN0aW9uPjtcblx0cHJpdmF0ZSBfcm93QWN0aW9uc1N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cblx0QENvbnRlbnRDaGlsZHJlbihUYWJsZVJvd0FjdGlvbilcblx0c2V0IHJvd0FjdGlvbnModjogUXVlcnlMaXN0PFRhYmxlUm93QWN0aW9uPikge1xuXHRcdHRoaXMuX3Jvd0FjdGlvbnMgPSB2O1xuXHRcdHRoaXMuX3NldFJvd1NlbGVjdGlvbkRhdGEoKTtcblx0fVxuXHRnZXQgcm93QWN0aW9ucygpOiBRdWVyeUxpc3Q8VGFibGVSb3dBY3Rpb24+IHtcblx0XHRyZXR1cm4gdGhpcy5fcm93QWN0aW9ucztcblx0fVxuXG5cdC8vIGN1c3RvbSByb3dzIHRlbXBsYXRlc1xuXHRAQ29udGVudENoaWxkcmVuKFRhYmxlQ3VzdG9tUm93RGlyZWN0aXZlKVxuXHRjdXN0b21Sb3dzITogUXVlcnlMaXN0PFRhYmxlQ3VzdG9tUm93RGlyZWN0aXZlPjtcblxuXHRASW5wdXQoKSBmaWx0ZXJNb2RhbEhlYWRlclRleHQ6IHN0cmluZyA9ICdGaWx0ZXJzJztcblx0QElucHV0KCkgZmlsdGVyTW9kYWxTYXZlVGV4dDogc3RyaW5nID0gJ1NhdmUnO1xuXHRASW5wdXQoKSBmaWx0ZXJNb2RhbENhbmNlbFRleHQ6IHN0cmluZyA9ICdDYW5jZWwnO1xuXHRASW5wdXQoKSBmaWx0ZXJNb2RhbFJlc2V0VGV4dDogc3RyaW5nID0gJ1Jlc2V0IGZpbHRlcnMnO1xuXG5cdEBJbnB1dCgpIGZpbHRlck1vZGFsU2hvd1Jlc2V0OiBib29sZWFuID0gZmFsc2U7XG5cdEBJbnB1dCgpIGZpbHRlck1vZGFsU2hvd1Jlc2V0TW9iaWxlOiBib29sZWFuID0gZmFsc2U7XG5cblx0QE91dHB1dCgpIGZpbHRlck1vZGFsU2hvdzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgZmlsdGVyTW9kYWxTYXZlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBmaWx0ZXJNb2RhbFJlc2V0OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0cHVibGljIHJvd0FjdGlvbnNSb3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVJvd0FjdGlvbltdPihbXSk7XG5cdHB1YmxpYyByb3dBY3Rpb25zRmxvYXRpbmdBbGwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVJvd0FjdGlvbltdPihbXSk7XG5cdHB1YmxpYyByb3dBY3Rpb25zRmxvYXRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZVJvd0FjdGlvbltdPihbXSk7XG5cblx0cHVibGljIGlzTW9iaWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoaXNNb2JpbGUoKSk7XG5cblx0Ly8gc3RpY2t5IHNlbGYtY2VudGVyXG5cdC8vIG10LTQgLW1iLTUgYm90dG9tLTExIHotWzNdXG5cdC8vIG15LTQgYm90dG9tLTBcblx0Ly8gcG9pbnRlci1ldmVudHMtbm9uZSBhbmltYXRlLWZsb2F0aW5nLW1lbnUtY29udGFpbmVyLW91dFxuXHQvLyBhbmltYXRlLWZsb2F0aW5nLW1lbnUtY29udGFpbmVyLWluXG5cdC8vIGhpZGRlblxuXHQvLyBpbmxpbmUtYmxvY2tcblx0cHVibGljIGZsb2F0aW5nTWVudUNvbnRhaW5lckNsYXNzID0gZmxvYXRpbmdNZW51Q29udGFpbmVyQ2xhc3M7XG5cblx0cHJpdmF0ZSBfcmVzaXplVGltZW91dDogdW5rbm93bjtcblx0cHJpdmF0ZSBfaW5wdXRFbmFibGVSb3dTZWxlY3Rpb246IGJvb2xlYW4gPSB0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbjtcblx0cHJpdmF0ZSBfaW5wdXRSb3dTZWxlY3Rpb25MaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdGhpcy5yb3dTZWxlY3Rpb25MaW1pdDtcblxuXHRwcml2YXRlIF90aGVtZURlYm91bmNlPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cblx0cHVibGljIGZvb3RlckhpZGRlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuXHRwdWJsaWMgY24gPSBjbjtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0dGhpcy5fcGFyc2VJdGVtcyh0aGlzLml0ZW1zKTtcblxuXHRcdG9uU3RhdGVDaGFuZ2UoJ3RoZW1lJywgdmFsdWUgPT4gdGhpcy5fY2hlY2tUaGVtZSh2YWx1ZSkpO1xuXG5cdFx0dGhpcy5sb2FkaW5nUm93cyA9IEFycmF5LmZyb20oe1xuXHRcdFx0bGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmZpbHRlck1vZGFsU2hvdyRcblx0XHRcdC5waXBlKHVudGlsRGVzdHJveWVkKHRoaXMpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuXHRcdFx0LnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLmZpbHRlck1vZGFsU2hvdy5uZXh0KHZhbHVlKSk7XG5cdH1cblxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG5cdFx0aWYgKGNoYW5nZXNbJ2l0ZW1zJ10pIHtcblx0XHRcdHRoaXMuX3BhcnNlSXRlbXMoY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWUpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzWydhbW91bnRPZkxvYWRpbmdSb3dzJ10pIHtcblx0XHRcdHRoaXMubG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcblx0XHRcdFx0bGVuZ3RoOiBjaGFuZ2VzWydhbW91bnRPZkxvYWRpbmdSb3dzJ10uY3VycmVudFZhbHVlLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0bGV0IGNhbGN1bGF0ZVJvd1NlbGVjdGlvbkRhdGEgPSBmYWxzZTtcblx0XHRpZiAoY2hhbmdlc1snZW5hYmxlUm93U2VsZWN0aW9uJ10pIHtcblx0XHRcdHRoaXMuX2lucHV0RW5hYmxlUm93U2VsZWN0aW9uID1cblx0XHRcdFx0Y2hhbmdlc1snZW5hYmxlUm93U2VsZWN0aW9uJ10uY3VycmVudFZhbHVlO1xuXHRcdFx0Y2FsY3VsYXRlUm93U2VsZWN0aW9uRGF0YSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXNbJ3Jvd1NlbGVjdGlvbkxpbWl0J10pIHtcblx0XHRcdHRoaXMuX2lucHV0Um93U2VsZWN0aW9uTGltaXQgPSBjaGFuZ2VzWydyb3dTZWxlY3Rpb25MaW1pdCddLmN1cnJlbnRWYWx1ZTtcblx0XHRcdGNhbGN1bGF0ZVJvd1NlbGVjdGlvbkRhdGEgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChjYWxjdWxhdGVSb3dTZWxlY3Rpb25EYXRhIHx8IGNoYW5nZXNbJ3NlbGVjdGVkUm93cyddKSB7XG5cdFx0XHR0aGlzLl9zZXRSb3dTZWxlY3Rpb25EYXRhKCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXNbJ2VuYWJsZVNjcm9sbCddPy5jdXJyZW50VmFsdWUpIHtcblx0XHRcdHRoaXMuX2NoZWNrQ2hhbmdlc1N1YnNjcmlwdGlvbnMoKTtcblx0XHR9XG5cdH1cblxuXHRuZ0FmdGVyVmlld0luaXQoKSB7XG5cdFx0aWYgKHRoaXMuZW5hYmxlU2Nyb2xsKSB7XG5cdFx0XHR0aGlzLl9jaGVja0NoYW5nZXNTdWJzY3JpcHRpb25zKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpIHtcblx0XHRcdHRoaXMuY29sdW1uRGVmaW5pdGlvbnMuY2hhbmdlc1xuXHRcdFx0XHQucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSwgZGVib3VuY2VUaW1lKDEwMCkpXG5cdFx0XHRcdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZ2VuZXJhdGVDb2x1bW5zKCkpO1xuXHRcdFx0dGhpcy5fZ2VuZXJhdGVDb2x1bW5zKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZXh0cmFIZWFkZXJEZWZpbml0aW9ucykge1xuXHRcdFx0dGhpcy5leHRyYUhlYWRlckRlZmluaXRpb25zLmNoYW5nZXNcblx0XHRcdFx0LnBpcGUodW50aWxEZXN0cm95ZWQodGhpcyksIGRlYm91bmNlVGltZSgxMDApKVxuXHRcdFx0XHQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2dlbmVyYXRlRXh0cmFIZWFkZXJzKCkpO1xuXHRcdFx0dGhpcy5fZ2VuZXJhdGVFeHRyYUhlYWRlcnMoKTtcblx0XHR9XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcblx0b25SZXNpemUoKSB7XG5cdFx0dGhpcy5fc2V0Um93U2VsZWN0aW9uRGF0YSgpO1xuXHRcdHRoaXMuX2NhbGN1bGF0ZUNvbHVtbldpZHRocygpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG5cdGtleURvd24oeyBrZXkgfTogeyBrZXk6IHN0cmluZyB9KSB7XG5cdFx0aWYgKGtleSAhPT0gJ0NvbnRyb2wnIHx8IHRoaXMuX2N0cmxEb3duID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fY3RybERvd24gPSB0cnVlO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5dXAnLCBbJyRldmVudCddKVxuXHRrZXlVcCh7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcblx0XHRpZiAoa2V5ICE9PSAnQ29udHJvbCcgfHwgdGhpcy5fY3RybERvd24gPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fY3RybERvd24gPSBmYWxzZTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnZpc2liaWxpdHljaGFuZ2UnLCBbJyRldmVudCddKVxuXHR2aXNpYmlsaXR5Q2hhbmdlKCkge1xuXHRcdGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICdoaWRkZW4nIHx8IHRoaXMuX2N0cmxEb3duID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX2N0cmxEb3duID0gZmFsc2U7XG5cdH1cblxuXHRvblF1ZXJ5Q2hhbmdlKHsgZGV0YWlsIH06IGFueSkge1xuXHRcdHRoaXMucXVlcnlDaGFuZ2UuZW1pdChkZXRhaWwpO1xuXHR9XG5cblx0b25RdWlja0ZpbHRlcih7IGRldGFpbCB9OiBhbnkpIHtcblx0XHR0aGlzLnF1aWNrRmlsdGVyLmVtaXQoZGV0YWlsKTtcblx0fVxuXG5cdG9uUGFnZVNpemVDaGFuZ2UoeyBkZXRhaWwgfTogYW55KSB7XG5cdFx0dGhpcy5wYWdlU2l6ZSA9IGRldGFpbDtcblx0XHR0aGlzLnBhZ2VTaXplQ2hhbmdlLmVtaXQoZGV0YWlsKTtcblx0fVxuXG5cdG9uUGFnZUNoYW5nZSh7IGRldGFpbCB9OiBhbnkpIHtcblx0XHR0aGlzLnBhZ2UgPSBkZXRhaWw7XG5cdFx0dGhpcy5wYWdlQ2hhbmdlLmVtaXQoZGV0YWlsKTtcblx0fVxuXG5cdG9uRmlsdGVyTW9kYWxTYXZlKCkge1xuXHRcdHRoaXMuZmlsdGVyTW9kYWxTYXZlLm5leHQoKTtcblx0XHR0aGlzLmZpbHRlck1vZGFsU2hvdyQubmV4dChmYWxzZSk7XG5cdH1cblxuXHRvbkZpbHRlck1vZGFsUmVzZXQocmVzZXRRdWlja0ZpbHRlciA9IGZhbHNlKSB7XG5cdFx0dGhpcy5maWx0ZXJNb2RhbFJlc2V0Lm5leHQocmVzZXRRdWlja0ZpbHRlcik7XG5cdFx0dGhpcy5maWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpO1xuXHR9XG5cblx0ZW1wdHlTdGF0ZUNsaWNrZWQoKSB7XG5cdFx0aWYgKHRoaXMuZW5hYmxlQWN0aW9uKSB7XG5cdFx0XHR0aGlzLmFjdGlvbi5lbWl0KCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmVuYWJsZUVtcHR5U3RhdGVBY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmVtcHR5U3RhdGVBY3Rpb25DbGljay5lbWl0KCk7XG5cdH1cblxuXHRwYXJzZVJvd0FjdGlvbnNSb3coYWN0aW9uczogVGFibGVSb3dBY3Rpb25bXSB8IG51bGwsIHJvd0luZGV4OiBudW1iZXIpIHtcblx0XHRpZiAoIWFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY3Rpb25zLmZpbHRlcihcblx0XHRcdGEgPT4gIWEuc2hvd0Z1bmN0aW9uIHx8IGEuc2hvd0Z1bmN0aW9uKHRoaXMucGFyc2VkSXRlbXNbcm93SW5kZXhdKVxuXHRcdCk7XG5cdH1cblxuXHRvbkNvbnRhaW5lclhTY3JvbGwoZXY6IGFueSkge1xuXHRcdGlmICghdGhpcy5lbmFibGVTY3JvbGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9jYWxjdWxhdGVTY3JvbGxQb3NpdGlvbihldik7XG5cdH1cblxuXHRwcml2YXRlIF9wYXJzZUl0ZW1zKGl0ZW1zOiBzdHJpbmcgfCBhbnlbXSkge1xuXHRcdGlmICghaXRlbXMpIHtcblx0XHRcdHRoaXMucGFyc2VkSXRlbXMgPSBbXTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcblx0XHRcdHRoaXMucGFyc2VkSXRlbXMgPSBpdGVtcztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnBhcnNlZEl0ZW1zID0gSlNPTi5wYXJzZShpdGVtcyk7XG5cdH1cblxuXHRwcml2YXRlIF9nZW5lcmF0ZUNvbHVtbnMoKSB7XG5cdFx0bGV0IGRlZmluaXRpb25zQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMuY29sdW1uRGVmaW5pdGlvbnMpO1xuXG5cdFx0ZGVmaW5pdGlvbnNBcnJheSA9IHRoaXMuX3BhcnNlRGVmaW5pdGlvbnMoXG5cdFx0XHRkZWZpbml0aW9uc0FycmF5XG5cdFx0KSBhcyB1bmtub3duIGFzIFRhYmxlQ29sdW1uW107XG5cblx0XHR0aGlzLmNvbHVtbnMkLm5leHQoZGVmaW5pdGlvbnNBcnJheSk7XG5cdH1cblxuXHRwcml2YXRlIF9nZW5lcmF0ZUV4dHJhSGVhZGVycygpIHtcblx0XHRsZXQgZGVmaW5pdGlvbnNBcnJheSA9IEFycmF5LmZyb20odGhpcy5leHRyYUhlYWRlckRlZmluaXRpb25zKTtcblxuXHRcdGRlZmluaXRpb25zQXJyYXkgPSB0aGlzLl9wYXJzZURlZmluaXRpb25zKFxuXHRcdFx0ZGVmaW5pdGlvbnNBcnJheVxuXHRcdCkgYXMgdW5rbm93biBhcyBUYWJsZUV4dHJhSGVhZGVyW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbCBvZiBkZWZpbml0aW9uc0FycmF5KSB7XG5cdFx0XHRjb2wuc3RpY2t5ID0gY29sLnN0aWNreSA9PT0gdHJ1ZSA/ICdzZWNvbmRhcnknIDogZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5leHRyYUhlYWRlcnMkLm5leHQoZGVmaW5pdGlvbnNBcnJheSk7XG5cdH1cblxuXHRwdWJsaWMgX2NoZWNrYm94RGlzYWJsZWQoaXRlbTogYW55LCByb3dJbmRleDogbnVtYmVyKSB7XG5cdFx0Y29uc3Qgc2VsZWN0aW9uQ29udGFpbnMgPSB0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCByb3dJbmRleCk7XG5cdFx0cmV0dXJuIChcblx0XHRcdCh0aGlzLmNhblNlbGVjdEtleSAmJiAhaXRlbVt0aGlzLmNhblNlbGVjdEtleV0pIHx8XG5cdFx0XHQodGhpcy5yb3dTZWxlY3Rpb25MaW1pdCAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdCFzZWxlY3Rpb25Db250YWlucyAmJlxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT09IHRoaXMucm93U2VsZWN0aW9uTGltaXQpXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBfc2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55LCBmb3JjZVZhbHVlPzogYm9vbGVhbikge1xuXHRcdGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZSA9IGZvcmNlVmFsdWUgPT09IHVuZGVmaW5lZCA/ICRldmVudC5kZXRhaWwgOiBmb3JjZVZhbHVlO1xuXG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRjb25zdCB0b0FkZCA9IFtdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHJvdyA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG5cdFx0XHRcdGlmICh0aGlzLmNhblNlbGVjdEtleSAmJiAhcm93W3RoaXMuY2FuU2VsZWN0S2V5XSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRvQWRkLnB1c2gocm93KTtcblx0XHRcdFx0dGhpcy5yb3dTZWxlY3RlZC5lbWl0KHJvdyk7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRoaXMucm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCArIHRvQWRkLmxlbmd0aCA9PT0gdGhpcy5yb3dTZWxlY3Rpb25MaW1pdFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNlbGVjdGVkUm93cyA9IFsuLi50aGlzLnNlbGVjdGVkUm93cywgLi4udG9BZGRdO1xuXHRcdFx0dGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG5cblx0XHRcdGlmICh0aGlzLmVuYWJsZUZsb2F0aW5nTWVudSkge1xuXHRcdFx0XHR0aGlzLl9zaG93RmxvYXRpbmdNZW51KCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRSb3dzW2ldO1xuXHRcdFx0Y29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtcy5maW5kKFxuXHRcdFx0XHRkID0+IHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKGQsIGkpID09PSB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZSh2YWx1ZSwgaSlcblx0XHRcdCk7XG5cblx0XHRcdGlmICghcm93KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJvd0Rlc2VsZWN0ZWQuZW1pdChyb3cpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2VsZWN0ZWRSb3dzID0gW107XG5cdFx0dGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG5cdH1cblxuXHRwdWJsaWMgX2NoZWNrYm94Q2hhbmdlKHRhcmdldDogYW55LCBpbmRleDogbnVtYmVyKSB7XG5cdFx0aWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0Q2hlY2tlZFZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKFxuXHRcdFx0dmFsdWUgJiZcblx0XHRcdHRoaXMucm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0dGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID49IHRoaXMucm93U2VsZWN0aW9uTGltaXRcblx0XHQpIHtcblx0XHRcdHRhcmdldC5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtc1tpbmRleF07XG5cblx0XHRpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcblx0XHRcdHRhcmdldC5jaGVja2VkID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHR0aGlzLnNlbGVjdGVkUm93cyA9IFsuLi50aGlzLnNlbGVjdGVkUm93cywgcm93XTtcblx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuXHRcdFx0dGhpcy5yb3dTZWxlY3RlZC5lbWl0KHJvdyk7XG5cblx0XHRcdGlmICh0aGlzLmVuYWJsZUZsb2F0aW5nTWVudSkge1xuXHRcdFx0XHR0aGlzLl9zaG93RmxvYXRpbmdNZW51KCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5kZXhPZlRvUmVtb3ZlID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMocm93LCBpbmRleCwgdHJ1ZSk7XG5cblx0XHQvLyB3ZSBuZWVkIHRvIGRvIHRoaXMsIGJlY2F1c2Ugc3BsaWNlIGRvZXMgbm90IHRyaWdnZXIgdGhlIHNlbGVjdGlvbiBzZXR0ZXIuXG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzXTtcblx0XHRzZWxlY3Rpb24uc3BsaWNlKGluZGV4T2ZUb1JlbW92ZSwgMSk7XG5cdFx0dGhpcy5zZWxlY3RlZFJvd3MgPSBzZWxlY3Rpb247XG5cdFx0dGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG5cdFx0dGhpcy5yb3dEZXNlbGVjdGVkLmVtaXQocm93KTtcblx0fVxuXG5cdHByaXZhdGUgX2dldENoZWNrZWRWYWx1ZSh0YXJnZXQ6IGFueSkge1xuXHRcdHJldHVybiB0YXJnZXQ/LmNoZWNrZWQ7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRTZWxlY3Rpb25WYWx1ZShyb3c6IGFueSwgaW5kZXg6IG51bWJlcikge1xuXHRcdHJldHVybiB0aGlzLnNlbGVjdGlvbktleSA/IHJvdz8uW3RoaXMuc2VsZWN0aW9uS2V5XSB8fCBpbmRleCA6IGluZGV4O1xuXHR9XG5cblx0cHVibGljIF9zZWxlY3Rpb25Db250YWlucyhyb3c6IGFueSwgaW5kZXg6IG51bWJlciwgcmV0dXJuSW5kZXggPSBmYWxzZSk6IGFueSB7XG5cdFx0Y29uc3QgcmV0dXJuVmFsdWUgPSB0aGlzLnNlbGVjdGVkUm93cy5maW5kSW5kZXgoXG5cdFx0XHRpdGVtID0+XG5cdFx0XHRcdHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKHJvdywgaW5kZXgpID09PVxuXHRcdFx0XHR0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShpdGVtLCBpbmRleClcblx0XHQpO1xuXHRcdHJldHVybiAhcmV0dXJuSW5kZXggPyByZXR1cm5WYWx1ZSA+PSAwIDogcmV0dXJuVmFsdWU7XG5cdH1cblxuXHRwdWJsaWMgX3NlbGVjdGlvbkNvbnRhaW5zQWxsKCkge1xuXHRcdGxldCByZXR1cm5WYWx1ZSA9IHRydWU7XG5cdFx0aWYgKCF0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLnJvd1NlbGVjdGlvbkxpbWl0ICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5yb3dTZWxlY3Rpb25MaW1pdFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG5cdFx0XHRjb25zdCBjb250YWlucyA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIGkpO1xuXG5cdFx0XHRpZiAoIWNvbnRhaW5zKSB7XG5cdFx0XHRcdHJldHVyblZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpIHtcblx0XHRpZiAoIXRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aCB8fCAhdGhpcy5zZWxlY3RlZFJvd3M/Lmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHRoaXMucm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0dGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSB0aGlzLnJvd1NlbGVjdGlvbkxpbWl0XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0bGV0IGNvbnRhaW5zQ291bnQgPSAwO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2ldO1xuXHRcdFx0Y29uc3QgY29udGFpbnMgPSB0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCBpKTtcblxuXHRcdFx0aWYgKGNvbnRhaW5zKSB7XG5cdFx0XHRcdGNvbnRhaW5zQ291bnQrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGFpbnNDb3VudCA+IDAgJiYgY29udGFpbnNDb3VudCAhPT0gdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XG5cdH1cblxuXHRwdWJsaWMgX3Jvd0NsaWNrKCRldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuXHRcdGNvbnN0IHRhcmdldCA9ICRldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cblx0XHRpZiAoXG5cdFx0XHR0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnIHx8XG5cdFx0XHQodGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnR5cGUgPT09ICdjaGVja2JveCdcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByb3cgPSB0aGlzLl9maW5kUm93KHRhcmdldCk7XG5cdFx0Y29uc3QgYWN0aW9uID0gdGhpcy5fZmluZFJvd0FjdGlvbih0YXJnZXQpO1xuXG5cdFx0aWYgKGFjdGlvbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmVuYWJsZVJvd0NsaWNrKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpbmRleF07XG5cdFx0XHR0aGlzLnJvd0NsaWNrLmVtaXQoe1xuXHRcdFx0XHRpdGVtLFxuXHRcdFx0XHRjdHJsRG93bjogdGhpcy5fY3RybERvd24sXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hlY2tib3ggPSByb3c/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuXG5cdFx0aWYgKCFjaGVja2JveCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNoZWNrYm94LmNoZWNrZWQgPSAhY2hlY2tib3guY2hlY2tlZDtcblx0XHR0aGlzLl9jaGVja2JveENoYW5nZShjaGVja2JveCwgaW5kZXgpO1xuXHR9XG5cblx0cHVibGljIF9nZXRBY3Rpb25Sb3V0ZXJMaW5rKFxuXHRcdHJvdXRlckxpbms6IFRhYmxlUm93QWN0aW9uUm91dGVyTGluayxcblx0XHRyb3dJbmRleDogbnVtYmVyXG5cdCk6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBhbnlbXT4gfCBBc3luY0l0ZW08c3RyaW5nIHwgYW55W10+IHtcblx0XHRpZiAodHlwZW9mIHJvdXRlckxpbmsgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW3Jvd0luZGV4XTtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRBY3Rpb25Sb3V0ZXJMaW5rKHJvdXRlckxpbmsoaXRlbSksIHJvd0luZGV4KTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHJvdXRlckxpbmsgPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkocm91dGVyTGluaykpIHtcblx0XHRcdHJldHVybiBuZXcgQmVoYXZpb3JTdWJqZWN0KHJvdXRlckxpbmspO1xuXHRcdH1cblxuXHRcdHJldHVybiByb3V0ZXJMaW5rO1xuXHR9XG5cblx0cHVibGljIF9nZXRBY3Rpb25RdWVyeVBhcmFtcyhcblx0XHRxdWVyeVBhcmFtczogVGFibGVSb3dBY3Rpb25RdWVyeVBhcmFtcyxcblx0XHRyb3dJbmRleDogbnVtYmVyXG5cdCk6IEJlaGF2aW9yU3ViamVjdDxQYXJhbXM+IHwgQXN5bmNJdGVtPFBhcmFtcz4ge1xuXHRcdGlmICh0eXBlb2YgcXVlcnlQYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW3Jvd0luZGV4XTtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRBY3Rpb25RdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyhpdGVtKSwgcm93SW5kZXgpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeVBhcmFtcyBpbnN0YW5jZW9mIE9iamVjdCAmJiBxdWVyeVBhcmFtcy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdFx0XHRyZXR1cm4gbmV3IEJlaGF2aW9yU3ViamVjdChxdWVyeVBhcmFtcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5UGFyYW1zIGFzIEFzeW5jSXRlbTxQYXJhbXM+O1xuXHR9XG5cblx0cHVibGljIF9yb3dBY3Rpb25DbGljayhhY3Rpb246IFRhYmxlUm93QWN0aW9uLCByb3dJbmRleD86IG51bWJlcikge1xuXHRcdGlmIChhY3Rpb24uZGlzYWJsZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoYWN0aW9uLmxvYWRpbmcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIWFjdGlvbi5hY3Rpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRhY3Rpb24udHlwZSA9PT0gJ211bHRpJyB8fFxuXHRcdFx0KGFjdGlvbi50eXBlID09PSAnYm90aCcgJiYgcm93SW5kZXggPT09IHVuZGVmaW5lZClcblx0XHQpIHtcblx0XHRcdGFjdGlvbi5hY3Rpb24uZW1pdCh7XG5cdFx0XHRcdGl0ZW1zOiB0aGlzLnNlbGVjdGVkUm93cyxcblx0XHRcdFx0bXVsdGk6IHRydWUsXG5cdFx0XHRcdGN0cmxEb3duOiB0aGlzLl9jdHJsRG93bixcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdGFjdGlvbi5yb3V0ZXJMaW5rIHx8XG5cdFx0XHQoQXJyYXkuaXNBcnJheShhY3Rpb24ucm91dGVyTGluaykgJiYgYWN0aW9uLnJvdXRlckxpbmsubGVuZ3RoKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW0gPVxuXHRcdFx0cm93SW5kZXggIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRoaXMucGFyc2VkSXRlbXNbcm93SW5kZXhdXG5cdFx0XHRcdDogdGhpcy5zZWxlY3RlZFJvd3NbMF07XG5cdFx0YWN0aW9uLmFjdGlvbi5lbWl0KHtcblx0XHRcdGl0ZW0sXG5cdFx0XHRtdWx0aTogZmFsc2UsXG5cdFx0XHRjdHJsRG93bjogdGhpcy5fY3RybERvd24sXG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9maW5kUm93KGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuXHRcdGlmICghZWwpIHtcblx0XHRcdHJldHVybiBlbDtcblx0XHR9XG5cblx0XHRpZiAoZWw/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdwLXRhYmxlLXJvdycpIHtcblx0XHRcdHJldHVybiBlbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fZmluZFJvdyhlbD8ucGFyZW50RWxlbWVudCk7XG5cdH1cblxuXHRwcml2YXRlIF9maW5kUm93QWN0aW9uKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuXHRcdGlmICghZWwpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pcy1hY3Rpb24nKSAhPT0gbnVsbCAmJlxuXHRcdFx0ZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWlzLWFjdGlvbicpICE9PSAnZmFsc2UnXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZWw7XG5cdFx0fVxuXG5cdFx0aWYgKGVsPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAncC10YWJsZS1yb3cnKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fZmluZFJvd0FjdGlvbihlbD8ucGFyZW50RWxlbWVudCk7XG5cdH1cblxuXHRwcml2YXRlIF9zZXRSb3dTZWxlY3Rpb25EYXRhKCkge1xuXHRcdGlmICh0aGlzLl9yZXNpemVUaW1lb3V0KSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fcmVzaXplVGltZW91dCBhcyBudW1iZXIpO1xuXHRcdH1cblxuXHRcdC8vIFdlIGFkZCBhIHRpbWVvdXQgaGVyZSBiZWNhdXNlIGl0J3MgYSBsb3QgZWFzaWVyIG9uIHRoZSBtYWNoaW5lIHRvIGRvIHRoZXNlIHdoZW4gc29tZW9uZSBpcyBkb25lXG5cdFx0Ly8gcmVzaXppbmcgYW5kIHBsYXlpbmcgYXJvdW5kIHdpdGggdGhlaXIgYnJvd3NlclxuXHRcdHRoaXMuX3Jlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IG1vYmlsZSA9IGlzTW9iaWxlKCk7XG5cdFx0XHR0aGlzLmlzTW9iaWxlJC5uZXh0KG1vYmlsZSk7XG5cblx0XHRcdGNvbnN0IGFjdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMuX3Jvd0FjdGlvbnMpIGFzIFRhYmxlUm93QWN0aW9uW107XG5cblx0XHRcdGlmICh0aGlzLl9yb3dBY3Rpb25zU3Vic2NyaXB0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0Zm9yIChsZXQgc3Vic2NyaXB0aW9uIG9mIHRoaXMuX3Jvd0FjdGlvbnNTdWJzY3JpcHRpb25zKSB7XG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcm93QWN0aW9uc1N1YnNjcmlwdGlvbnMgPSBhY3Rpb25zLm1hcChhY3Rpb24gPT5cblx0XHRcdFx0YWN0aW9uLl9sb2FkaW5nQ2hhbmdlZFxuXHRcdFx0XHRcdC5waXBlKHVudGlsRGVzdHJveWVkKHRoaXMpKVxuXHRcdFx0XHRcdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpKVxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gd2UgaGFjayB0aGlzIHRvIGFueVtdIHRvIG1ha2UgaXQgd29yay4uXG5cdFx0XHRjb25zdCByb3dBY3Rpb25zUm93ID0gYWN0aW9ucy5maWx0ZXIoXG5cdFx0XHRcdGEgPT4gYS50eXBlID09PSAnYm90aCcgfHwgYS50eXBlID09PSAnc2luZ2xlJ1xuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJvd0FjdGlvbnNGbG9hdGluZyA9IGFjdGlvbnMuZmlsdGVyKFxuXHRcdFx0XHRhID0+XG5cdFx0XHRcdFx0KHRoaXMuX2lucHV0RW5hYmxlUm93U2VsZWN0aW9uICYmXG5cdFx0XHRcdFx0XHQoYS50eXBlID09PSAnYm90aCcgfHwgYS50eXBlID09PSAnbXVsdGknKSkgfHxcblx0XHRcdFx0XHQobW9iaWxlICYmIGEudHlwZSA9PT0gJ3NpbmdsZScgJiYgIWEucm91dGVyTGluaylcblx0XHRcdCk7XG5cblx0XHRcdGxldCByb3dTZWxlY3Rpb25MaW1pdCA9IHRoaXMuX2lucHV0Um93U2VsZWN0aW9uTGltaXQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG1vYmlsZSAmJiAvLyB3ZSdyZSBtb2JpbGVcblx0XHRcdFx0cm93QWN0aW9uc0Zsb2F0aW5nPy5sZW5ndGggJiYgLy8gd2UgaGF2ZSBhdGxlYXN0IDEgaXRlbSBpbiBfcm93QWN0aW9uc0Zsb2F0aW5nXG5cdFx0XHRcdCgocm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikgfHxcblx0XHRcdFx0XHQhdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24pXG5cdFx0XHQpIHtcblx0XHRcdFx0cm93U2VsZWN0aW9uTGltaXQgPSAxO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJvd1NlbGVjdGlvbkxpbWl0ID0gcm93U2VsZWN0aW9uTGltaXQ7XG5cblx0XHRcdGxldCBlbmFibGVSb3dTZWxlY3Rpb24gPSB0aGlzLl9pbnB1dEVuYWJsZVJvd1NlbGVjdGlvbjtcblx0XHRcdGlmIChcblx0XHRcdFx0bW9iaWxlICYmIC8vIHdlJ3JlIG1vYmlsZVxuXHRcdFx0XHRyb3dBY3Rpb25zRmxvYXRpbmc/Lmxlbmd0aCAmJiAvLyB3ZSBoYXZlIGF0bGVhc3QgMSBpdGVtIGluIF9yb3dBY3Rpb25zRmxvYXRpbmdcblx0XHRcdFx0IWVuYWJsZVJvd1NlbGVjdGlvblxuXHRcdFx0KSB7XG5cdFx0XHRcdGVuYWJsZVJvd1NlbGVjdGlvbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbiA9IGVuYWJsZVJvd1NlbGVjdGlvbjtcblxuXHRcdFx0dGhpcy5yb3dBY3Rpb25zUm93JC5uZXh0KHJvd0FjdGlvbnNSb3cpO1xuXHRcdFx0dGhpcy5yb3dBY3Rpb25zRmxvYXRpbmdBbGwkLm5leHQocm93QWN0aW9uc0Zsb2F0aW5nKTtcblxuXHRcdFx0dGhpcy5mbG9hdGluZ01lbnVTaG93biRcblx0XHRcdFx0LnBpcGUoXG5cdFx0XHRcdFx0dGFrZSgxKSxcblx0XHRcdFx0XHRmaWx0ZXIodiA9PiAhIXYpXG5cdFx0XHRcdClcblx0XHRcdFx0LnN1YnNjcmliZSgoKSA9PiB0aGlzLl9zaG93RmxvYXRpbmdNZW51KCkpO1xuXHRcdH0sIDIwMCk7XG5cdH1cblxuXHRwcml2YXRlIF9zaG93RmxvYXRpbmdNZW51KCkge1xuXHRcdHRoaXMucm93QWN0aW9uc0Zsb2F0aW5nQWxsJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShhY3Rpb25zID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5yb3dTZWxlY3Rpb25MaW1pdCA9PT0gMSAmJlxuXHRcdFx0XHRhY3Rpb25zLmZpbmRJbmRleChcblx0XHRcdFx0XHRhID0+IChhLnR5cGUgPT09ICdzaW5nbGUnIHx8IGEudHlwZSA9PT0gJ2JvdGgnKSAmJiBhLnNob3dGdW5jdGlvblxuXHRcdFx0XHQpID49IDBcblx0XHRcdCkge1xuXHRcdFx0XHRhY3Rpb25zID0gYWN0aW9ucy5maWx0ZXIoXG5cdFx0XHRcdFx0YSA9PlxuXHRcdFx0XHRcdFx0YS50eXBlID09PSAnbXVsdGknIHx8XG5cdFx0XHRcdFx0XHQhYS5zaG93RnVuY3Rpb24gfHxcblx0XHRcdFx0XHRcdGEuc2hvd0Z1bmN0aW9uKHRoaXMuc2VsZWN0ZWRSb3dzWzBdKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJvd0FjdGlvbnNGbG9hdGluZyQubmV4dChhY3Rpb25zKTtcblx0XHRcdHRoaXMuZmxvYXRpbmdNZW51U2hvd24kLm5leHQodHJ1ZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9wYXJzZURlZmluaXRpb25zKFxuXHRcdGRlZmluaXRpb25zQXJyYXk6IFRhYmxlQ29sdW1uW10gfCBUYWJsZUV4dHJhSGVhZGVyW11cblx0KSB7XG5cdFx0cmV0dXJuIGRlZmluaXRpb25zQXJyYXkubWFwKGRlZmluaXRpb24gPT5cblx0XHRcdHRoaXMuX3BhcnNlRGVmaW5pdGlvblNpemVzKGRlZmluaXRpb24pXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgX3BhcnNlRGVmaW5pdGlvblNpemVzKGRlZmluaXRpb246IFRhYmxlQ29sdW1uIHwgVGFibGVFeHRyYUhlYWRlcikge1xuXHRcdGNvbnN0IGRlZmluaXRpb25BbnkgPSBkZWZpbml0aW9uIGFzIGFueTtcblx0XHRsZXQgcGFyc2VkU2l6ZXM6IFRhYmxlQ29sdW1uU2l6ZXMgPSB7IGRlZmF1bHQ6ICdmdWxsJyB9O1xuXG5cdFx0Zm9yIChjb25zdCBbaW5kZXgsIHNpemVdIG9mIHRhYmxlQ29sdW1TaXplc09wdGlvbnMuZW50cmllcygpKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGRlZmluaXRpb25Bbnkuc2l6ZXMgPT09ICdhdXRvJyB8fFxuXHRcdFx0XHRkZWZpbml0aW9uQW55LnNpemVzID09PSAnaGlkZGVuJyB8fFxuXHRcdFx0XHRkZWZpbml0aW9uQW55LnNpemVzID09PSAnZnVsbCcgfHxcblx0XHRcdFx0dHlwZW9mIGRlZmluaXRpb25Bbnkuc2l6ZXMgPT09ICdudW1iZXInXG5cdFx0XHQpIHtcblx0XHRcdFx0cGFyc2VkU2l6ZXNbc2l6ZV0gPVxuXHRcdFx0XHRcdGRlZmluaXRpb25Bbnkuc2l6ZXMgPT09ICdhdXRvJyA/ICdmdWxsJyA6IGRlZmluaXRpb25Bbnkuc2l6ZXM7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRwYXJzZWRTaXplc1tzaXplXSA9XG5cdFx0XHRcdGRlZmluaXRpb25Bbnkuc2l6ZXNbc2l6ZV0gPz9cblx0XHRcdFx0cGFyc2VkU2l6ZXNbdGFibGVDb2x1bVNpemVzT3B0aW9uc1tpbmRleCAtIDFdXTtcblx0XHR9XG5cblx0XHRkZWZpbml0aW9uLnBhcnNlZFNpemVzID0gcGFyc2VkU2l6ZXM7XG5cdFx0cmV0dXJuIGRlZmluaXRpb247XG5cdH1cblxuXHRwcml2YXRlIF9jaGVja0NoYW5nZXNTdWJzY3JpcHRpb25zKCkge1xuXHRcdGlmICghdGhpcy5fcm93Q2hhbmdlc1N1YnNjcmlwdGlvbiAmJiB0aGlzLnRhYmxlUm93cykge1xuXHRcdFx0dGhpcy5fcm93Q2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMudGFibGVSb3dzLmNoYW5nZXNcblx0XHRcdFx0LnBpcGUodW50aWxEZXN0cm95ZWQodGhpcyksIGRlYm91bmNlVGltZSgxMDApKVxuXHRcdFx0XHQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NhbGN1bGF0ZUNvbHVtbldpZHRocygpKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuX2NlbGxDaGFuZ2VzU3Vic2NyaXB0aW9uICYmIHRoaXMudGFibGVDZWxscykge1xuXHRcdFx0dGhpcy5fY2VsbENoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlQ2VsbHMuY2hhbmdlc1xuXHRcdFx0XHQucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSwgZGVib3VuY2VUaW1lKDEwMCkpXG5cdFx0XHRcdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCkpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX2NhbGN1bGF0ZUNvbHVtbldpZHRocygpIHtcblx0XHRpZiAoIXRoaXMuZW5hYmxlU2Nyb2xsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnRhYmxlQ2VsbHMgfHwgIXRoaXMudGFibGVSb3dzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2NhbGN1bGF0ZUNvbHVtbldpZHRoc1RpbWVvdXQpIHtcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLl9jYWxjdWxhdGVDb2x1bW5XaWR0aHNUaW1lb3V0KTtcblx0XHRcdHRoaXMuX2NhbGN1bGF0ZUNvbHVtbldpZHRoc1RpbWVvdXQgPSAwO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJvd3MgPSB0aGlzLnRhYmxlUm93cy5tYXAoXG5cdFx0XHRjID0+IGMubmF0aXZlRWxlbWVudCBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50XG5cdFx0KTtcblx0XHRjb25zdCBjZWxscyA9IHJvd3MuZmxhdE1hcChcblx0XHRcdHJvdyA9PlxuXHRcdFx0XHRBcnJheS5mcm9tKHJvdy5xdWVyeVNlbGVjdG9yQWxsKCdwLXRhYmxlLWNlbGwtbmd4JykpIGFzIEhUTUxFbGVtZW50W11cblx0XHQpO1xuXG5cdFx0dGhpcy5fY2FsY3VsYXRlQ29sdW1uV2lkdGhzVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dGhpcy5fc2V0Um93c1dpZHRoKHJvd3MpO1xuXG5cdFx0XHRjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcblx0XHRcdFx0aWYgKGNlbGwuc3R5bGUud2lkdGg/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdGNlbGwuc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0bmV3IFByb21pc2UocmVzb2x2ZSA9PlxuXHRcdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHJlY3QgPSBjZWxsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjZWxsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgd2lkdGg6ICR7cmVjdC53aWR0aH1weCAhaW1wb3J0YW50YCk7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0sIDEwMClcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuXHRcdFx0dGhpcy5fc2V0Um93c1dpZHRoKHJvd3MsICdtaW4tY29udGVudCcpO1xuXG5cdFx0XHR0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKCk7XG5cdFx0fSwgMjAwKSBhcyB1bmtub3duIGFzIG51bWJlcjtcblx0fVxuXG5cdHByaXZhdGUgX3NldFJvd3NXaWR0aChcblx0XHRyb3dzOiBIVE1MRWxlbWVudFtdLFxuXHRcdHZhbHVlOiAnbWluLWNvbnRlbnQnIHwgbnVsbCA9IG51bGxcblx0KSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCByb3cgPSByb3dzW2ldO1xuXG5cdFx0XHRjb25zdCBzaGFkb3cgPSByb3cuc2hhZG93Um9vdDtcblx0XHRcdGlmICghc2hhZG93KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmaXJzdERpdiA9IHNoYWRvdy5xdWVyeVNlbGVjdG9yKCcqOm50aC1jaGlsZCgxKScpO1xuXHRcdFx0aWYgKCFmaXJzdERpdikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2Vjb25kRGl2ID0gZmlyc3REaXYucXVlcnlTZWxlY3RvcignKjpudGgtY2hpbGQoMSknKTtcblx0XHRcdGlmICghc2Vjb25kRGl2KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0Zmlyc3REaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKTtcblx0XHRcdFx0c2Vjb25kRGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnJyk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJzdERpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiBtaW4tY29udGVudDsnKTtcblx0XHRcdHNlY29uZERpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiBtaW4tY29udGVudDsnKTtcblxuXHRcdFx0aWYgKGkgPT09IDApIHtcblx0XHRcdFx0dGhpcy5fdG90YWxXaWR0aCA9IGZpcnN0RGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX3Jlc2V0U2Nyb2xsUG9zaXRpb24oKSB7XG5cdFx0aWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyKSB7XG5cdFx0XHR0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xuXHRcdH1cblxuXHRcdHRoaXMucmVhY2hlZFNjcm9sbFN0YXJ0JC5uZXh0KHRydWUpO1xuXHRcdHRoaXMucmVhY2hlZFNjcm9sbEVuZCQubmV4dChmYWxzZSk7XG5cblx0XHR0aGlzLl9jYWxjdWxhdGVTY3JvbGxQb3NpdGlvbih7XG5cdFx0XHR0YXJnZXQ6IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsXG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9jYWxjdWxhdGVTY3JvbGxQb3NpdGlvbih7IHRhcmdldCB9OiB7IHRhcmdldDogSFRNTERpdkVsZW1lbnQgfSkge1xuXHRcdHRoaXMucmVhY2hlZFNjcm9sbFN0YXJ0JC5uZXh0KHRhcmdldC5zY3JvbGxMZWZ0IDwgMTApO1xuXG5cdFx0Y29uc3QgcmlnaHQgPSB0YXJnZXQuc2Nyb2xsTGVmdCArIHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblx0XHR0aGlzLnJlYWNoZWRTY3JvbGxFbmQkLm5leHQocmlnaHQgPiB0aGlzLl90b3RhbFdpZHRoIC0gMTApO1xuXHR9XG5cblx0cHJpdmF0ZSBfY2hlY2tUaGVtZSh2YWx1ZTogJ2RhcmsnIHwgJ2xpZ2h0Jykge1xuXHRcdGlmICh0aGlzLl90aGVtZURlYm91bmNlKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fdGhlbWVEZWJvdW5jZSk7XG5cdFx0XHR0aGlzLl90aGVtZURlYm91bmNlID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHRoaXMuX3RoZW1lRGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMudGhlbWUgPSB2YWx1ZTtcblx0XHRcdHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcblx0XHR9LCAxMDApO1xuXHR9XG59XG4iLCI8cC10YWJsZS1jb250YWluZXI+XG5cdDxwLXRhYmxlLWhlYWRlclxuXHRcdCpuZ0lmPVwiZW5hYmxlSGVhZGVyXCJcblx0XHRjbGFzcz1cIm1iLThcIlxuXHRcdFtxdWlja0ZpbHRlcnNdPVwicXVpY2tGaWx0ZXJzXCJcblx0XHRbYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyXT1cImFjdGl2ZVF1aWNrRmlsdGVySWRlbnRpZmllclwiXG5cdFx0KHF1aWNrRmlsdGVyKT1cIm9uUXVpY2tGaWx0ZXIoJGV2ZW50KVwiXG5cdFx0W2VuYWJsZVNlYXJjaF09XCJlbmFibGVTZWFyY2hcIlxuXHRcdFtxdWVyeV09XCJxdWVyeVwiXG5cdFx0KHF1ZXJ5Q2hhbmdlKT1cIm9uUXVlcnlDaGFuZ2UoJGV2ZW50KVwiXG5cdFx0W2VuYWJsZUZpbHRlcl09XCJlbmFibGVGaWx0ZXJcIlxuXHRcdFtlbmFibGVGaWx0ZXJEZXNrdG9wXT1cImVuYWJsZUZpbHRlckRlc2t0b3BcIlxuXHRcdFtzZWxlY3RlZEZpbHRlcnNBbW91bnRdPVwic2VsZWN0ZWRGaWx0ZXJzQW1vdW50XCJcblx0XHRbZmlsdGVyQnV0dG9uVGVtcGxhdGVdPVwiZmlsdGVyQnV0dG9uVGVtcGxhdGVcIlxuXHRcdChmaWx0ZXIpPVwiZmlsdGVyTW9kYWxTaG93JC5uZXh0KHRydWUpXCJcblx0XHRbZW5hYmxlQWN0aW9uXT1cImVuYWJsZUFjdGlvblwiXG5cdFx0W2NhblVzZUFjdGlvbl09XCJhY3Rpb25CdXR0b25FbmFibGVkXCJcblx0XHRbYWN0aW9uQnV0dG9uVGVtcGxhdGVdPVwiYWN0aW9uQnV0dG9uVGVtcGxhdGVcIlxuXHRcdFthY3Rpb25Mb2FkaW5nXT1cImFjdGlvbkJ1dHRvbkxvYWRpbmdcIlxuXHRcdFthY3Rpb25UZXh0XT1cImFjdGlvbkJ1dHRvblRleHRcIlxuXHRcdFthY3Rpb25JY29uXT1cImFjdGlvbkJ1dHRvbkljb25cIlxuXHRcdChhY3Rpb24pPVwiYWN0aW9uLmVtaXQoKVwiXG5cdFx0W2l0ZW1zU2VsZWN0ZWRBbW91bnRdPVwic2VsZWN0ZWRSb3dzLmxlbmd0aFwiXG5cdFx0W2VuYWJsZUV4cG9ydF09XCJlbmFibGVFeHBvcnRcIlxuXHRcdChleHBvcnQpPVwiZXhwb3J0LmVtaXQoKVwiXG5cdFx0W2xvYWRpbmddPVwiaGVhZGVyTG9hZGluZ1wiXG5cdD5cblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyQ3VzdG9tRmlsdGVyVGVtcGxhdGVcIj5cblx0XHRcdDxuZy1jb250YWluZXJcblx0XHRcdFx0Km5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJDdXN0b21GaWx0ZXJUZW1wbGF0ZVwiXG5cdFx0XHQ+PC9uZy1jb250YWluZXI+XG5cdFx0PC9uZy1jb250YWluZXI+XG5cblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyQ3VzdG9tQWN0aW9uc1RlbXBsYXRlXCI+XG5cdFx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRcdCpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQ3VzdG9tQWN0aW9uc1RlbXBsYXRlXCJcblx0XHRcdD48L25nLWNvbnRhaW5lcj5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0PC9wLXRhYmxlLWhlYWRlcj5cblxuXHQ8ZGl2XG5cdFx0Y2xhc3M9XCJyZWxhdGl2ZSBmbGV4LTFcIlxuXHRcdCpuZ0lmPVwiZW5hYmxlU2Nyb2xsOyBlbHNlIHJvd3NUZW1wbGF0ZVwiXG5cdD5cblx0XHQ8ZGl2XG5cdFx0XHRjbGFzcz1cImZsZXggZmxleC1jb2wgb3ZlcmZsb3cteC1hdXRvXCJcblx0XHRcdCNzY3JvbGxDb250YWluZXJcblx0XHRcdFtjbGFzc109XCJcblx0XHRcdFx0Y24oXG5cdFx0XHRcdFx0J2JlZm9yZTphYnNvbHV0ZSBiZWZvcmU6dG9wLTAgYmVmb3JlOmxlZnQtMCBiZWZvcmU6ei1bMV0gYmVmb3JlOnBvaW50ZXItZXZlbnRzLW5vbmUnLFxuXHRcdFx0XHRcdCdiZWZvcmU6dy0yNCBiZWZvcmU6aC1mdWxsIGJlZm9yZTp0cmFuc2l0aW9uLW9wYWNpdHknLFxuXHRcdFx0XHRcdCdiZWZvcmU6YmctZ3JhZGllbnQtdG8tciBiZWZvcmU6ZnJvbS13aGl0ZSBkYXJrOmJlZm9yZTpmcm9tLWh1cnJpY2FuZS03MDAgYmVmb3JlOnZpYS13aGl0ZS84MCBkYXJrOmJlZm9yZTp2aWEtaHVycmljYW5lLTcwMC85MCBiZWZvcmU6dG8tdHJhbnNwYXJlbnQnLFxuXHRcdFx0XHRcdCdhZnRlcjphYnNvbHV0ZSBhZnRlcjp0b3AtMCBhZnRlcjpyaWdodC0wIGFmdGVyOnotWzBdIGJlZm9yZTpwb2ludGVyLWV2ZW50cy1ub25lJyxcblx0XHRcdFx0XHQnYWZ0ZXI6dy0yNCBhZnRlcjpoLWZ1bGwgYWZ0ZXI6dHJhbnNpdGlvbi1vcGFjaXR5Jyxcblx0XHRcdFx0XHQnYWZ0ZXI6YmctZ3JhZGllbnQtdG8tbCBhZnRlcjpmcm9tLXdoaXRlIGFmdGVyOmRhcms6ZnJvbS1odXJyaWNhbmUtNzAwIGFmdGVyOnZpYS13aGl0ZS84MCBkYXJrOmFmdGVyOnZpYS1odXJyaWNhbmUtNzAwLzkwIGFmdGVyOnRvLXRyYW5zcGFyZW50Jyxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQnYmVmb3JlOm9wYWNpdHktMCc6IHJlYWNoZWRTY3JvbGxTdGFydCQgfCBhc3luYyxcblx0XHRcdFx0XHRcdCdhZnRlcjpvcGFjaXR5LTAnOiByZWFjaGVkU2Nyb2xsRW5kJCB8IGFzeW5jLFxuXHRcdFx0XHRcdFx0J2JlZm9yZTpvcGFjaXR5LTEwMCc6IChyZWFjaGVkU2Nyb2xsU3RhcnQkIHwgYXN5bmMpID09PSBmYWxzZSxcblx0XHRcdFx0XHRcdCdhZnRlcjpvcGFjaXR5LTEwMCc6IChyZWFjaGVkU2Nyb2xsRW5kJCB8IGFzeW5jKSA9PT0gZmFsc2Vcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFwiXG5cdFx0XHQoc2Nyb2xsKT1cIm9uQ29udGFpbmVyWFNjcm9sbCgkZXZlbnQpXCJcblx0XHQ+XG5cdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93c1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXG5cdDxuZy1jb250YWluZXIgKm5nSWY9XCJlbmFibGVGbG9hdGluZ01lbnUgJiYgZW5hYmxlUm93U2VsZWN0aW9uXCI+XG5cdFx0PHAtZmxvYXRpbmctbWVudS1jb250YWluZXJcblx0XHRcdFt1c2VkSW5UYWJsZV09XCJ0cnVlXCJcblx0XHRcdFtjbGFzc109XCJcblx0XHRcdFx0ZmxvYXRpbmdNZW51Q29udGFpbmVyQ2xhc3Moe1xuXHRcdFx0XHRcdGhhc0Zvb3RlcjogZW5hYmxlRm9vdGVyICYmIChmb290ZXJIaWRkZW4kIHwgYXN5bmMpID09PSBmYWxzZSxcblx0XHRcdFx0XHRhY3RpdmU6IHNlbGVjdGVkUm93cy5sZW5ndGggPiAwLFxuXHRcdFx0XHRcdHNob3duOiAkYW55KGZsb2F0aW5nTWVudVNob3duJCB8IGFzeW5jKVxuXHRcdFx0XHR9KVxuXHRcdFx0XCJcblx0XHRcdFthbW91bnRdPVwiZmxvYXRpbmdNZW51QW1vdW50U2VsZWN0ZWRUZXh0XCJcblx0XHRcdFtlbmFibGVBbW91bnRTZWxlY3RlZF09XCIhIShyb3dBY3Rpb25zRmxvYXRpbmckIHwgYXN5bmMpPy5sZW5ndGhcIlxuXHRcdFx0KGNsb3NlKT1cIl9zZWxlY3RBbGxDaGFuZ2UobnVsbCwgZmFsc2UpXCJcblx0XHQ+XG5cdFx0XHQ8cC1mbG9hdGluZy1tZW51LWl0ZW1cblx0XHRcdFx0Km5nRm9yPVwibGV0IGFjdGlvbiBvZiByb3dBY3Rpb25zRmxvYXRpbmckIHwgYXN5bmNcIlxuXHRcdFx0XHRzbG90PVwiZmxvYXRpbmctbWVudS1pdGVtXCJcblx0XHRcdFx0W2Rpc2FibGVkXT1cIlxuXHRcdFx0XHRcdChhY3Rpb25bJ3R5cGUnXSA9PT0gJ3NpbmdsZScgJiYgc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDEpIHx8XG5cdFx0XHRcdFx0YWN0aW9uWydkaXNhYmxlZCddXG5cdFx0XHRcdFwiXG5cdFx0XHRcdFtsb2FkaW5nXT1cImFjdGlvblsnbG9hZGluZyddXCJcblx0XHRcdFx0W2ljb25dPVwiYWN0aW9uWydpY29uJ11cIlxuXHRcdFx0XHRbaWNvblJvdGF0ZV09XCJhY3Rpb25bJ2ljb25Sb3RhdGUnXVwiXG5cdFx0XHRcdFtpY29uRmxpcF09XCJhY3Rpb25bJ2ljb25GbGlwJ11cIlxuXHRcdFx0XHQoY2xpY2spPVwiX3Jvd0FjdGlvbkNsaWNrKGFjdGlvbilcIlxuXHRcdFx0PlxuXHRcdFx0XHR7eyBhY3Rpb25bJ2xhYmVsJ10gfX1cblx0XHRcdDwvcC1mbG9hdGluZy1tZW51LWl0ZW0+XG5cdFx0PC9wLWZsb2F0aW5nLW1lbnUtY29udGFpbmVyPlxuXHQ8L25nLWNvbnRhaW5lcj5cblxuXHQ8cC10YWJsZS1mb290ZXJcblx0XHQqbmdJZj1cImVuYWJsZUZvb3RlclwiXG5cdFx0W2hpZGVPblNpbmdsZVBhZ2VdPVwiaGlkZU9uU2luZ2xlUGFnZVwiXG5cdFx0W2VuYWJsZVBhZ2luYXRpb25TaXplXT1cImVuYWJsZVBhZ2luYXRpb25TaXplXCJcblx0XHRbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuXHRcdFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcblx0XHQocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcblx0XHRbZW5hYmxlUGFnaW5hdGlvblBhZ2VzXT1cImVuYWJsZVBhZ2luYXRpb25QYWdlc1wiXG5cdFx0W3BhZ2VdPVwicGFnZVwiXG5cdFx0W3RvdGFsXT1cInRvdGFsXCJcblx0XHQocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG5cdFx0W2xvYWRpbmddPVwiZm9vdGVyTG9hZGluZ1wiXG5cdFx0KGhpZGRlbkNoYW5nZSk9XCJmb290ZXJIaWRkZW4kLm5leHQoJGV2ZW50LmRldGFpbClcIlxuXHRcdFt0YWJsZUhlYWRlckhhc0FjdGlvbl09XCJlbmFibGVIZWFkZXIgJiYgZW5hYmxlQWN0aW9uICYmIGFjdGlvbkJ1dHRvbkVuYWJsZWRcIlxuXHQ+PC9wLXRhYmxlLWZvb3Rlcj5cbjwvcC10YWJsZS1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjcm93c1RlbXBsYXRlPlxuXHQ8cC10YWJsZS1yb3dcblx0XHQqbmdJZj1cIihleHRyYUhlYWRlcnMkIHwgYXN5bmMpPy5sZW5ndGhcIlxuXHRcdHZhcmlhbnQ9XCJoZWFkZXItc2Vjb25kYXJ5XCJcblx0XHRjbGFzcz1cInotWzJdXCJcblx0XHRbaXNMYXN0XT1cInRydWVcIlxuXHQ+XG5cdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGV4dHJhSGVhZGVycyQgfCBhc3luYzsgbGV0IGluZGV4ID0gaW5kZXhcIj5cblx0XHRcdDxwLXRhYmxlLWNlbGwtbmd4XG5cdFx0XHRcdFtkZWZpbml0aW9uXT1cImNvbFwiXG5cdFx0XHRcdHZhcmlhbnQ9XCJoZWFkZXItc2Vjb25kYXJ5XCJcblx0XHRcdFx0W2luZGV4XT1cImluZGV4XCJcblx0XHRcdFx0W2NoZWNrYm94T2Zmc2V0XT1cImluZGV4ID09PSAwICYmIGVuYWJsZVJvd1NlbGVjdGlvblwiXG5cdFx0XHRcdFtzY3JvbGxhYmxlXT1cInRoaXMuZW5hYmxlU2Nyb2xsXCJcblx0XHRcdD5cblx0XHRcdFx0PGI+e3sgY29sLm5hbWUgfX08L2I+XG5cdFx0XHQ8L3AtdGFibGUtY2VsbC1uZ3g+XG5cdFx0PC9uZy1jb250YWluZXI+XG5cdDwvcC10YWJsZS1yb3c+XG5cblx0PHAtdGFibGUtcm93IHZhcmlhbnQ9XCJoZWFkZXJcIj5cblx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gaW5kZXhcIj5cblx0XHRcdDxwLXRhYmxlLWNlbGwtbmd4XG5cdFx0XHRcdFtkZWZpbml0aW9uXT1cImNvbFwiXG5cdFx0XHRcdFt2YWx1ZV09XCJjb2wubmFtZVwiXG5cdFx0XHRcdHZhcmlhbnQ9XCJoZWFkZXJcIlxuXHRcdFx0XHRbaW5kZXhdPVwiaW5kZXhcIlxuXHRcdFx0XHRbY2hlY2tib3hdPVwiXG5cdFx0XHRcdFx0KGluZGV4ID09PSAwIHx8IGNvbC5oYXNDaGVja2JveCkgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG5cdFx0XHRcdFx0XHQ/IGNoZWNrYm94VGVtcGxhdGVcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0XHRcdFwiXG5cdFx0XHRcdFtzY3JvbGxhYmxlXT1cInRoaXMuZW5hYmxlU2Nyb2xsXCJcblx0XHRcdD48L3AtdGFibGUtY2VsbC1uZ3g+XG5cdFx0XHQ8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG5cdFx0XHRcdDxwLWNoZWNrYm94XG5cdFx0XHRcdFx0KGNoZWNrZWRDaGFuZ2UpPVwiX3NlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCJcblx0XHRcdFx0XHRbY2hlY2tlZF09XCJfc2VsZWN0aW9uQ29udGFpbnNBbGwoKVwiXG5cdFx0XHRcdFx0W2luZGV0ZXJtaW5hdGVdPVwiX3NlbGVjdGlvbkluZGV0ZXJtaW5hdGUoKVwiXG5cdFx0XHRcdFx0W2NsYXNzLm9wYWNpdHktMF09XCJyb3dTZWxlY3Rpb25MaW1pdCAhPT0gdW5kZWZpbmVkXCJcblx0XHRcdFx0XHRbZGlzYWJsZWRdPVwicm93U2VsZWN0aW9uTGltaXQgIT09IHVuZGVmaW5lZFwiXG5cdFx0XHRcdD48L3AtY2hlY2tib3g+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHQ8L3AtdGFibGUtcm93PlxuXG5cdDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBmbGV4LWNvbFwiPlxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nOyBlbHNlIGNvbnRlbnRUZW1wbGF0ZVwiPlxuXHRcdFx0PHAtdGFibGUtcm93XG5cdFx0XHRcdCpuZ0Zvcj1cImxldCByIG9mIGxvYWRpbmdSb3dzOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG5cdFx0XHRcdGNsYXNzPVwiZ3JvdXBcIlxuXHRcdFx0XHRbZW5hYmxlSG92ZXJdPVwiZW5hYmxlUm93U2VsZWN0aW9uIHx8IGVuYWJsZVJvd0NsaWNrXCJcblx0XHRcdFx0W2lzTGFzdF09XCJyb3dJbmRleCA9PT0gbG9hZGluZ1Jvd3MubGVuZ3RoIC0gMVwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zJCB8IGFzeW5jOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuXHRcdFx0XHRcdDxwLXRhYmxlLWNlbGwtbmd4XG5cdFx0XHRcdFx0XHRbZGVmaW5pdGlvbl09XCJjb2xcIlxuXHRcdFx0XHRcdFx0dmFyaWFudD1cImxvYWRpbmdcIlxuXHRcdFx0XHRcdFx0W2NoZWNrYm94XT1cIlxuXHRcdFx0XHRcdFx0XHQoaW5kZXggPT09IDAgfHwgY29sLmhhc0NoZWNrYm94KSAmJiBlbmFibGVSb3dTZWxlY3Rpb25cblx0XHRcdFx0XHRcdFx0XHQ/IGNoZWNrYm94VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XCJcblx0XHRcdFx0XHRcdFtpbmRleF09XCJpbmRleFwiXG5cdFx0XHRcdFx0XHRbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuXHRcdFx0XHRcdFx0W3Njcm9sbGFibGVdPVwidGhpcy5lbmFibGVTY3JvbGxcIlxuXHRcdFx0XHRcdD48L3AtdGFibGUtY2VsbC1uZ3g+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuXHRcdFx0XHRcdFx0PHAtbG9hZGVyXG5cdFx0XHRcdFx0XHRcdHZhcmlhbnQ9XCJnaG9zdFwiXG5cdFx0XHRcdFx0XHRcdGNsYXNzPVwiaC02IHctNiByb3VuZGVkXCJcblx0XHRcdFx0XHRcdD48L3AtbG9hZGVyPlxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0PC9wLXRhYmxlLXJvdz5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblxuXHRcdDxuZy10ZW1wbGF0ZSAjY29udGVudFRlbXBsYXRlPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcnNlZEl0ZW1zPy5sZW5ndGg7IGVsc2UgZW1wdHlTdGF0ZVRlbXBsYXRlXCI+XG5cdFx0XHRcdDxwLXRhYmxlLXJvd1xuXHRcdFx0XHRcdCpuZ0Zvcj1cImxldCBpdGVtIG9mIHBhcnNlZEl0ZW1zOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG5cdFx0XHRcdFx0Y2xhc3M9XCJncm91cFwiXG5cdFx0XHRcdFx0W2VuYWJsZUhvdmVyXT1cImVuYWJsZVJvd1NlbGVjdGlvbiB8fCBlbmFibGVSb3dDbGlja1wiXG5cdFx0XHRcdFx0W2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIHJvd0luZGV4KVwiXG5cdFx0XHRcdFx0W2lzTGFzdF09XCJyb3dJbmRleCA9PT0gcGFyc2VkSXRlbXMubGVuZ3RoIC0gMVwiXG5cdFx0XHRcdFx0KGNsaWNrKT1cIl9yb3dDbGljaygkZXZlbnQsIHJvd0luZGV4KVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRcdFx0XHQqbmdJZj1cIlxuXHRcdFx0XHRcdFx0XHRwYXJzZVJvd0FjdGlvbnNSb3coXG5cdFx0XHRcdFx0XHRcdFx0cm93QWN0aW9uc1JvdyQgfCBhc3luYyxcblx0XHRcdFx0XHRcdFx0XHRyb3dJbmRleFxuXHRcdFx0XHRcdFx0XHQpIGFzIHJvd0FjdGlvbnNSb3dcblx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lclxuXHRcdFx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnMkIHwgYXN5bmM7IGxldCBpbmRleCA9IGluZGV4XCJcblx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0PHAtdGFibGUtY2VsbC1uZ3hcblx0XHRcdFx0XHRcdFx0XHRbZGVmaW5pdGlvbl09XCJjb2xcIlxuXHRcdFx0XHRcdFx0XHRcdFtpdGVtXT1cIml0ZW1cIlxuXHRcdFx0XHRcdFx0XHRcdFtjaGVja2JveF09XCJcblx0XHRcdFx0XHRcdFx0XHRcdChpbmRleCA9PT0gMCB8fCBjb2wuaGFzQ2hlY2tib3gpICYmIGVuYWJsZVJvd1NlbGVjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ/IGNoZWNrYm94VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFtpbmRleF09XCJpbmRleFwiXG5cdFx0XHRcdFx0XHRcdFx0W3Jvd0luZGV4XT1cInJvd0luZGV4XCJcblx0XHRcdFx0XHRcdFx0XHRbdGVtcGxhdGVdPVwiY29sLnRlbXBsYXRlXCJcblx0XHRcdFx0XHRcdFx0XHRbc2Nyb2xsYWJsZV09XCJ0aGlzLmVuYWJsZVNjcm9sbFwiXG5cdFx0XHRcdFx0XHRcdD48L3AtdGFibGUtY2VsbC1uZ3g+XG5cblx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuXHRcdFx0XHRcdFx0XHRcdDxwLWNoZWNrYm94XG5cdFx0XHRcdFx0XHRcdFx0XHQoY2hlY2tlZENoYW5nZSk9XCJfY2hlY2tib3hDaGFuZ2UoJGV2ZW50LnRhcmdldCwgcm93SW5kZXgpXCJcblx0XHRcdFx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJfY2hlY2tib3hEaXNhYmxlZChpdGVtLCByb3dJbmRleClcIlxuXHRcdFx0XHRcdFx0XHRcdFx0W2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIHJvd0luZGV4KVwiXG5cdFx0XHRcdFx0XHRcdFx0PjwvcC1jaGVja2JveD5cblx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXG5cdFx0XHRcdFx0XHQ8cC10YWJsZS1yb3ctYWN0aW9ucy1jb250YWluZXJcblx0XHRcdFx0XHRcdFx0Km5nSWY9XCIhIXJvd0FjdGlvbnNSb3c/Lmxlbmd0aCAmJiAhKGlzTW9iaWxlJCB8IGFzeW5jKVwiXG5cdFx0XHRcdFx0XHRcdFtjaGVja2VkXT1cIl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCByb3dJbmRleClcIlxuXHRcdFx0XHRcdFx0XHRzbG90PVwiYWN0aW9uc1wiXG5cdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiByb3dBY3Rpb25zUm93XCI+XG5cdFx0XHRcdFx0XHRcdFx0PHAtdG9vbHRpcFxuXHRcdFx0XHRcdFx0XHRcdFx0Km5nSWY9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aW9uLnNob3dGdW5jdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gYWN0aW9uLnNob3dGdW5jdGlvbihwYXJzZWRJdGVtc1tyb3dJbmRleF0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0W2NvbnRlbnRdPVwiYWN0aW9uWydsYWJlbCddXCJcblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8cC1idXR0b25cblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YS1pcy1hY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyaWFudD1cInNlY29uZGFyeVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNsb3Q9XCJ0cmlnZ2VyXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W2ljb25dPVwiYWN0aW9uWydpY29uJ11cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbaWNvblJvdGF0ZV09XCJhY3Rpb25bJ2ljb25Sb3RhdGUnXVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGljb25GbGlwPVwiYWN0aW9uLmljb25GbGlwXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWNvbk9ubHk9XCJ0cnVlXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2l6ZT1cInNtXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W2xvYWRpbmddPVwiYWN0aW9uWydsb2FkaW5nJ11cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbZGlzYWJsZWRdPVwiYWN0aW9uWydkaXNhYmxlZCddXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W3JvdXRlckxpbmtdPVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aW9uLnJvdXRlckxpbmtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gKF9nZXRBY3Rpb25Sb3V0ZXJMaW5rKGFjdGlvbi5yb3V0ZXJMaW5rLCByb3dJbmRleClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfCBhc3luYylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogbnVsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbcXVlcnlQYXJhbXNdPVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aW9uLnF1ZXJ5UGFyYW1zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChfZ2V0QWN0aW9uUXVlcnlQYXJhbXMoYWN0aW9uLnF1ZXJ5UGFyYW1zLCByb3dJbmRleClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfCBhc3luYylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogbnVsbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQob25DbGljayk9XCJfcm93QWN0aW9uQ2xpY2soYWN0aW9uLCByb3dJbmRleClcIlxuXHRcdFx0XHRcdFx0XHRcdFx0PjwvcC1idXR0b24+XG5cdFx0XHRcdFx0XHRcdFx0PC9wLXRvb2x0aXA+XG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdFx0XHRcdFx0PC9wLXRhYmxlLXJvdy1hY3Rpb25zLWNvbnRhaW5lcj5cblx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PC9wLXRhYmxlLXJvdz5cblx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cblx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjdXN0b21Sb3cgb2YgY3VzdG9tUm93c1wiPlxuXHRcdFx0PHAtdGFibGUtcm93XG5cdFx0XHRcdFt2YXJpYW50XT1cImN1c3RvbVJvdy52YXJpYW50XCJcblx0XHRcdFx0W2NsYXNzXT1cIntcblx0XHRcdFx0XHQnei1bMl0nOiBjdXN0b21Sb3cudmFyaWFudCA9PT0gJ3NlY29uZGFyeSdcblx0XHRcdFx0fVwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Sb3cudGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cblx0XHRcdDwvcC10YWJsZS1yb3c+XG5cdFx0PC9uZy1jb250YWluZXI+XG5cdDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlck1vZGFsVGVtcGxhdGVcIj5cblx0PHAtbW9kYWxcblx0XHRbaGVhZGVyXT1cImZpbHRlck1vZGFsSGVhZGVyVGV4dFwiXG5cdFx0W3Nob3ddPVwiZmlsdGVyTW9kYWxTaG93JCB8IGFzeW5jXCJcblx0XHQoY2xvc2VkKT1cImZpbHRlck1vZGFsU2hvdyQubmV4dChmYWxzZSlcIlxuXHQ+XG5cdFx0PGRpdlxuXHRcdFx0c2xvdD1cImNvbnRlbnRcIlxuXHRcdFx0Y2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02XCJcblx0XHQ+XG5cdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyTW9kYWxUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuXHRcdDwvZGl2PlxuXHRcdDxkaXZcblx0XHRcdHNsb3Q9XCJmb290ZXJcIlxuXHRcdFx0Y2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIlxuXHRcdD5cblx0XHRcdDxwLWJ1dHRvblxuXHRcdFx0XHQqbmdJZj1cImZpbHRlck1vZGFsU2hvd1Jlc2V0TW9iaWxlXCJcblx0XHRcdFx0Y2xhc3M9XCJmbGV4IHctZnVsbCB0YWJsZXQ6dy1hdXRvIGRlc2t0b3AteHM6aGlkZGVuXCJcblx0XHRcdFx0dmFyaWFudD1cInNlY29uZGFyeVwiXG5cdFx0XHRcdChvbkNsaWNrKT1cIm9uRmlsdGVyTW9kYWxSZXNldCh0cnVlKVwiXG5cdFx0XHQ+XG5cdFx0XHRcdHt7IGZpbHRlck1vZGFsUmVzZXRUZXh0IH19XG5cdFx0XHQ8L3AtYnV0dG9uPlxuXHRcdFx0PHAtYnV0dG9uXG5cdFx0XHRcdCpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXRcIlxuXHRcdFx0XHRjbGFzcz1cImhpZGRlbiB3LWZ1bGwgdGFibGV0OnctYXV0byBkZXNrdG9wLXhzOmZsZXhcIlxuXHRcdFx0XHR2YXJpYW50PVwic2Vjb25kYXJ5XCJcblx0XHRcdFx0KG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFJlc2V0KClcIlxuXHRcdFx0PlxuXHRcdFx0XHR7eyBmaWx0ZXJNb2RhbFJlc2V0VGV4dCB9fVxuXHRcdFx0PC9wLWJ1dHRvbj5cblx0XHRcdDxwLWJ1dHRvblxuXHRcdFx0XHRjbGFzcz1cIm1sLWF1dG8gdy1mdWxsIHRhYmxldDp3LWF1dG9cIlxuXHRcdFx0XHRpY29uPVwiY2hlY2ttYXJrXCJcblx0XHRcdFx0KG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFNhdmUoKVwiXG5cdFx0XHQ+XG5cdFx0XHRcdHt7IGZpbHRlck1vZGFsU2F2ZVRleHQgfX1cblx0XHRcdDwvcC1idXR0b24+XG5cdFx0PC9kaXY+XG5cdDwvcC1tb2RhbD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5U3RhdGVUZW1wbGF0ZT5cblx0PHAtZW1wdHktc3RhdGVcblx0XHQqbmdJZj1cImVtcHR5U3RhdGVUeXBlID09PSAnZmlsdGVyZWQnOyBlbHNlIGVtcHR5U3RhdGVOb25GaWx0ZXJUZW1wbGF0ZVwiXG5cdFx0Y2xhc3M9XCJteS0xNiBzZWxmLWNlbnRlclwiXG5cdFx0W2lsbHVzdHJhdGlvbl09XCJlbXB0eVN0YXRlRmlsdGVyZWRJbGx1c3RyYXRpb25cIlxuXHRcdFtoZWFkZXJdPVwiZW1wdHlTdGF0ZUZpbHRlcmVkSGVhZGVyXCJcblx0XHRbY29udGVudF09XCJlbXB0eVN0YXRlRmlsdGVyZWRDb250ZW50XCJcblx0XHRbZW5hYmxlQWN0aW9uXT1cImZhbHNlXCJcblx0PjwvcC1lbXB0eS1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTdGF0ZU5vbkZpbHRlclRlbXBsYXRlPlxuXHQ8cC1lbXB0eS1zdGF0ZVxuXHRcdGNsYXNzPVwibXktMTYgc2VsZi1jZW50ZXJcIlxuXHRcdFtpbGx1c3RyYXRpb25dPVwiZW1wdHlTdGF0ZUlsbHVzdHJhdGlvblwiXG5cdFx0W2hlYWRlcl09XCJlbXB0eVN0YXRlSGVhZGVyXCJcblx0XHRbY29udGVudF09XCJlbXB0eVN0YXRlQ29udGVudFwiXG5cdFx0W2VuYWJsZUFjdGlvbl09XCJlbmFibGVFbXB0eVN0YXRlQWN0aW9uXCJcblx0XHRbYWN0aW9uVGV4dF09XCJlbXB0eVN0YXRlQWN0aW9uXCJcblx0XHRbYWN0aW9uSWNvbl09XCJlbXB0eVN0YXRlQWN0aW9uSWNvblwiXG5cdFx0KGFjdGlvbik9XCJlbXB0eVN0YXRlQ2xpY2tlZCgpXCJcblx0PjwvcC1lbXB0eS1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=