@yoozsoft/yoozsoft-ng 5.3.5 → 7.1.1

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 (113) hide show
  1. package/README.md +143 -24
  2. package/assets/js/UTIF.js-master/LICENSE +21 -21
  3. package/assets/js/UTIF.js-master/README.md +72 -72
  4. package/assets/js/UTIF.js-master/UTIF.js +1762 -1762
  5. package/assets/js/UTIF.js-master/package-lock.json +13 -13
  6. package/assets/js/UTIF.js-master/package.json +24 -0
  7. package/assets/styles/components/_ys-navbar.scss +22 -0
  8. package/assets/styles/components/_ys-pagination.scss +10 -0
  9. package/assets/styles/{ys-layout.scss → utilities/ys-layout.scss} +1 -1
  10. package/assets/styles/ys-styles.scss +2 -0
  11. package/autocomplete/package.json +4 -0
  12. package/date/package.json +4 -0
  13. package/datepicker/package.json +4 -0
  14. package/dropdown/package.json +4 -0
  15. package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs +257 -197
  16. package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs.map +1 -1
  17. package/fesm2022/yoozsoft-yoozsoft-ng-date.mjs +562 -0
  18. package/fesm2022/yoozsoft-yoozsoft-ng-date.mjs.map +1 -0
  19. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs +600 -837
  20. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs.map +1 -1
  21. package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs +161 -151
  22. package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs.map +1 -1
  23. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs +93 -103
  24. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs.map +1 -1
  25. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs +16 -21
  26. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs.map +1 -1
  27. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs +20 -24
  28. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs.map +1 -1
  29. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs +60 -76
  30. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs.map +1 -1
  31. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs +11 -15
  32. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs.map +1 -1
  33. package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs +61 -55
  34. package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs.map +1 -1
  35. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs +142 -130
  36. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs.map +1 -1
  37. package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs +44 -0
  38. package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs.map +1 -0
  39. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs +51 -34
  40. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs.map +1 -1
  41. package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs +155 -0
  42. package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs.map +1 -0
  43. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs +78 -80
  44. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs.map +1 -1
  45. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs +99 -99
  46. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs.map +1 -1
  47. package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs +316 -0
  48. package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs.map +1 -0
  49. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs +128 -114
  50. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs.map +1 -1
  51. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs +112 -62
  52. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs.map +1 -1
  53. package/fesm2022/yoozsoft-yoozsoft-ng-validators.mjs +37 -0
  54. package/fesm2022/yoozsoft-yoozsoft-ng-validators.mjs.map +1 -0
  55. package/fesm2022/yoozsoft-yoozsoft-ng.mjs.map +1 -1
  56. package/file-upload/package.json +4 -0
  57. package/footer/package.json +4 -0
  58. package/loading/package.json +4 -0
  59. package/navbar/package.json +4 -0
  60. package/overlay/package.json +4 -0
  61. package/package.json +61 -38
  62. package/pagination/package.json +4 -0
  63. package/password-strength/package.json +4 -0
  64. package/pipes/package.json +4 -0
  65. package/progress/package.json +4 -0
  66. package/rating/package.json +4 -0
  67. package/select/package.json +4 -0
  68. package/sidebar/package.json +4 -0
  69. package/table/package.json +4 -0
  70. package/tiff-viewer/package.json +4 -0
  71. package/toast/package.json +4 -0
  72. package/types/yoozsoft-yoozsoft-ng-autocomplete.d.ts +79 -0
  73. package/types/yoozsoft-yoozsoft-ng-date.d.ts +118 -0
  74. package/types/yoozsoft-yoozsoft-ng-datepicker.d.ts +120 -0
  75. package/types/yoozsoft-yoozsoft-ng-dropdown.d.ts +76 -0
  76. package/types/yoozsoft-yoozsoft-ng-file-upload.d.ts +75 -0
  77. package/types/yoozsoft-yoozsoft-ng-footer.d.ts +26 -0
  78. package/types/yoozsoft-yoozsoft-ng-loading.d.ts +14 -0
  79. package/types/yoozsoft-yoozsoft-ng-navbar.d.ts +60 -0
  80. package/types/yoozsoft-yoozsoft-ng-overlay.d.ts +10 -0
  81. package/types/yoozsoft-yoozsoft-ng-pagination.d.ts +31 -0
  82. package/types/yoozsoft-yoozsoft-ng-password-strength.d.ts +73 -0
  83. package/types/yoozsoft-yoozsoft-ng-pipes.d.ts +11 -0
  84. package/types/yoozsoft-yoozsoft-ng-progress.d.ts +31 -0
  85. package/types/yoozsoft-yoozsoft-ng-rating.d.ts +56 -0
  86. package/types/yoozsoft-yoozsoft-ng-select.d.ts +43 -0
  87. package/types/yoozsoft-yoozsoft-ng-sidebar.d.ts +69 -0
  88. package/types/yoozsoft-yoozsoft-ng-table.d.ts +137 -0
  89. package/types/yoozsoft-yoozsoft-ng-tiff-viewer.d.ts +53 -0
  90. package/types/yoozsoft-yoozsoft-ng-toast.d.ts +66 -0
  91. package/types/yoozsoft-yoozsoft-ng-validators.d.ts +5 -0
  92. package/validators/package.json +4 -0
  93. package/autocomplete/index.d.ts +0 -71
  94. package/datepicker/index.d.ts +0 -291
  95. package/directives/index.d.ts +0 -17
  96. package/dropdown/index.d.ts +0 -62
  97. package/fesm2022/yoozsoft-yoozsoft-ng-directives.mjs +0 -57
  98. package/fesm2022/yoozsoft-yoozsoft-ng-directives.mjs.map +0 -1
  99. package/file-upload/index.d.ts +0 -72
  100. package/footer/index.d.ts +0 -25
  101. package/loading/index.d.ts +0 -13
  102. package/navbar/index.d.ts +0 -56
  103. package/overlay/index.d.ts +0 -11
  104. package/pagination/index.d.ts +0 -29
  105. package/password-strength/index.d.ts +0 -84
  106. package/progress/index.d.ts +0 -28
  107. package/select/index.d.ts +0 -39
  108. package/sidebar/index.d.ts +0 -94
  109. package/tiff-viewer/index.d.ts +0 -52
  110. package/toast/index.d.ts +0 -53
  111. /package/assets/styles/{ys-preloader-9.scss → preloaders/ys-preloader-9.scss} +0 -0
  112. /package/assets/styles/{ys-preloader.scss → preloaders/ys-preloader.scss} +0 -0
  113. /package/{index.d.ts → types/yoozsoft-yoozsoft-ng.d.ts} +0 -0
@@ -0,0 +1,316 @@
1
+ import { NgClass, NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { input, model, output, signal, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import * as i1 from '@angular/forms';
5
+ import { FormsModule } from '@angular/forms';
6
+ import { NgbDropdownModule, NgbPagination, NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
7
+
8
+ class YsTable {
9
+ items = input([], /* @ts-ignore */
10
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
11
+ columns = input([], /* @ts-ignore */
12
+ ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
13
+ actionButtons = input([], /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "actionButtons" }] : /* istanbul ignore next */ []));
15
+ toolbarButtons = input([], /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "toolbarButtons" }] : /* istanbul ignore next */ []));
17
+ rowStyleClass = input(/* @ts-ignore */
18
+ ...(ngDevMode ? [undefined, { debugName: "rowStyleClass" }] : /* istanbul ignore next */ []));
19
+ rowIndicators = input([], /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "rowIndicators" }] : /* istanbul ignore next */ []));
21
+ serverSide = input(false, /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "serverSide" }] : /* istanbul ignore next */ [])); // <--- حالت سروری
23
+ isPagination = input(true, /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "isPagination" }] : /* istanbul ignore next */ []));
25
+ rowsPerPage = input([10, 25, 50], /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "rowsPerPage" }] : /* istanbul ignore next */ []));
27
+ pageReportTemplate = input('Showing {first} to {last} of {totalRecords} items', /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "pageReportTemplate" }] : /* istanbul ignore next */ []));
29
+ page = model(1, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []));
31
+ pageSize = model(this.rowsPerPage()[0] || 10, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
33
+ collectionSize = model(0, /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "collectionSize" }] : /* istanbul ignore next */ [])); // <--- از سرور می‌گیریم
35
+ hasSearch = input(false, /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "hasSearch" }] : /* istanbul ignore next */ []));
37
+ searchPlaceholder = input('search...', /* @ts-ignore */
38
+ ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
39
+ searchStyleClass = input(/* @ts-ignore */
40
+ ...(ngDevMode ? [undefined, { debugName: "searchStyleClass" }] : /* istanbul ignore next */ []));
41
+ styleClass = input(/* @ts-ignore */
42
+ ...(ngDevMode ? [undefined, { debugName: "styleClass" }] : /* istanbul ignore next */ []));
43
+ toolbarStyleClass = input(/* @ts-ignore */
44
+ ...(ngDevMode ? [undefined, { debugName: "toolbarStyleClass" }] : /* istanbul ignore next */ []));
45
+ tableStyleClass = input(/* @ts-ignore */
46
+ ...(ngDevMode ? [undefined, { debugName: "tableStyleClass" }] : /* istanbul ignore next */ []));
47
+ /** Selectable rows checkbox */
48
+ selectableRows = input(false, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "selectableRows" }] : /* istanbul ignore next */ []));
50
+ /** Condition for each row's checkbox to be active */
51
+ isRowSelectable = input(/* @ts-ignore */
52
+ ...(ngDevMode ? [undefined, { debugName: "isRowSelectable" }] : /* istanbul ignore next */ []));
53
+ rowKey = input('id', /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "rowKey" }] : /* istanbul ignore next */ []));
55
+ pageChanged = output();
56
+ search = output();
57
+ /** checkbox */
58
+ selectedItemsChange = output();
59
+ searchTerm = signal('', /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []));
61
+ sortedColumn = signal(null, /* @ts-ignore */
62
+ ...(ngDevMode ? [{ debugName: "sortedColumn" }] : /* istanbul ignore next */ []));
63
+ sortDirection = signal('asc', /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "sortDirection" }] : /* istanbul ignore next */ []));
65
+ filteredItems = computed(() => {
66
+ let items = [...this.items()];
67
+ const search = this.searchTerm().trim().toLowerCase();
68
+ if (search) {
69
+ items = items.filter((item) => this.columns().some((col) => {
70
+ let value = '';
71
+ if (col.template) {
72
+ value = this.applyTemplate(col.template, item);
73
+ }
74
+ else if (col.field) {
75
+ value = this.resolveFieldPath(item, col.field);
76
+ }
77
+ return value?.toString().toLowerCase().includes(search);
78
+ }));
79
+ }
80
+ const sortField = this.sortedColumn();
81
+ if (sortField) {
82
+ items.sort((a, b) => {
83
+ const aVal = this.resolveFieldPath(a, sortField);
84
+ const bVal = this.resolveFieldPath(b, sortField);
85
+ if (aVal == null)
86
+ return this.sortDirection() === 'asc' ? -1 : 1;
87
+ if (bVal == null)
88
+ return this.sortDirection() === 'asc' ? 1 : -1;
89
+ return this.sortDirection() === 'asc'
90
+ ? String(aVal).localeCompare(String(bVal))
91
+ : String(bVal).localeCompare(String(aVal));
92
+ });
93
+ }
94
+ return items;
95
+ }, /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "filteredItems" }] : /* istanbul ignore next */ []));
97
+ paginatedItems = computed(() => {
98
+ if (this.serverSide()) {
99
+ return this.items();
100
+ }
101
+ if (!this.isPagination()) {
102
+ return this.filteredItems();
103
+ }
104
+ const start = (this.page() - 1) * this.pageSize();
105
+ return this.filteredItems().slice(start, start + this.pageSize());
106
+ }, /* @ts-ignore */
107
+ ...(ngDevMode ? [{ debugName: "paginatedItems" }] : /* istanbul ignore next */ []));
108
+ selectedItems = signal([], /* @ts-ignore */
109
+ ...(ngDevMode ? [{ debugName: "selectedItems" }] : /* istanbul ignore next */ []));
110
+ totalPages = computed(() => {
111
+ return Math.ceil(this.collectionSize() / this.pageSize()) || 1;
112
+ }, /* @ts-ignore */
113
+ ...(ngDevMode ? [{ debugName: "totalPages" }] : /* istanbul ignore next */ []));
114
+ firstIndex = computed(() => {
115
+ return (this.page() - 1) * this.pageSize();
116
+ }, /* @ts-ignore */
117
+ ...(ngDevMode ? [{ debugName: "firstIndex" }] : /* istanbul ignore next */ []));
118
+ lastIndex = computed(() => {
119
+ return Math.min(this.firstIndex() + this.pageSize(), this.collectionSize());
120
+ }, /* @ts-ignore */
121
+ ...(ngDevMode ? [{ debugName: "lastIndex" }] : /* istanbul ignore next */ []));
122
+ constructor() {
123
+ effect(() => {
124
+ this.columns();
125
+ this.checkUniqueColumnKeys();
126
+ });
127
+ effect(() => {
128
+ if (!this.serverSide()) {
129
+ this.collectionSize.set(this.filteredItems().length);
130
+ }
131
+ });
132
+ }
133
+ onSort(field) {
134
+ if (this.sortedColumn() === field) {
135
+ this.sortDirection.update((v) => (v === 'asc' ? 'desc' : 'asc'));
136
+ }
137
+ else {
138
+ this.sortedColumn.set(field);
139
+ this.sortDirection.set('asc');
140
+ }
141
+ }
142
+ changePage(page) {
143
+ if (page < 1 || page > this.totalPages()) {
144
+ return;
145
+ }
146
+ this.page.set(page);
147
+ if (this.serverSide()) {
148
+ this.pageChanged.emit({
149
+ page,
150
+ pageSize: this.pageSize(),
151
+ });
152
+ }
153
+ }
154
+ changePageSize(size) {
155
+ this.pageSize.set(+size);
156
+ this.page.set(1);
157
+ if (this.serverSide()) {
158
+ this.pageChanged.emit({
159
+ page: 1,
160
+ pageSize: +size,
161
+ });
162
+ }
163
+ }
164
+ onSearch(target) {
165
+ this.searchTerm.set(target.value);
166
+ this.page.set(1);
167
+ if (this.serverSide()) {
168
+ this.search.emit(this.searchTerm());
169
+ }
170
+ }
171
+ applyPipe(pipe, value, args = []) {
172
+ return pipe?.transform(value, ...args);
173
+ }
174
+ resolveFieldPath(obj, path) {
175
+ return path.split('.').reduce((acc, part) => acc?.[part], obj);
176
+ }
177
+ applyTemplate(template, item) {
178
+ return template.replace(/\{([^}]+)\}/g, (_, path) => {
179
+ const val = this.resolveFieldPath(item, path.trim());
180
+ return val !== undefined && val !== null ? val : '';
181
+ });
182
+ }
183
+ checkUniqueColumnKeys() {
184
+ const seen = new Set();
185
+ const duplicates = [];
186
+ this.columns().forEach((col) => {
187
+ if (!col.key) {
188
+ throw new Error(`Column with header "${col.header}" is missing a unique "key"`);
189
+ }
190
+ if (seen.has(col.key)) {
191
+ duplicates.push(col.key);
192
+ }
193
+ else {
194
+ seen.add(col.key);
195
+ }
196
+ });
197
+ if (duplicates.length > 0) {
198
+ throw new Error(`Duplicate column keys found: ${duplicates.join(', ')}`);
199
+ }
200
+ }
201
+ getLabel(action, item) {
202
+ return typeof action.label === 'function' ? action.label(item) : (action.label ?? 'Label');
203
+ }
204
+ getIconClass(action, item) {
205
+ return typeof action.iconClass === 'function'
206
+ ? action.iconClass(item)
207
+ : (action.iconClass ?? '');
208
+ }
209
+ getTooltipText(tooltip) {
210
+ if (!tooltip)
211
+ return '';
212
+ return typeof tooltip === 'function' ? tooltip() : tooltip;
213
+ }
214
+ getLabelText(label) {
215
+ if (!label)
216
+ return '';
217
+ return typeof label === 'function' ? label() : label;
218
+ }
219
+ itemKey(item) {
220
+ return String(item[this.rowKey()]);
221
+ }
222
+ onSelectionChange(item, checked) {
223
+ if (checked) {
224
+ this.selectedItems.update((items) => [...items, item]);
225
+ }
226
+ else {
227
+ this.selectedItems.update((items) => items.filter((x) => this.itemKey(x) !== this.itemKey(item)));
228
+ }
229
+ this.selectedItemsChange.emit(this.selectedItems());
230
+ }
231
+ isSelected(item) {
232
+ return this.selectedItems().some((x) => this.itemKey(x) === this.itemKey(item));
233
+ }
234
+ toggleSelection(item, event) {
235
+ const checked = event.target.checked;
236
+ if (checked) {
237
+ this.selectedItems.update((items) => [...items, item]);
238
+ }
239
+ else {
240
+ this.selectedItems.update((items) => items.filter((x) => this.itemKey(x) !== this.itemKey(item)));
241
+ }
242
+ this.selectedItemsChange.emit(this.selectedItems());
243
+ }
244
+ allSelected() {
245
+ const selectable = this.paginatedItems().filter((i) => this.isSelectable(i));
246
+ return selectable.length > 0 && selectable.every((i) => this.isSelected(i));
247
+ }
248
+ toggleSelectAll(event) {
249
+ const checked = event.target.checked;
250
+ if (checked) {
251
+ const itemsToAdd = this.paginatedItems().filter((item) => this.isSelectable(item) &&
252
+ !this.selectedItems().some((x) => this.itemKey(x) === this.itemKey(item)));
253
+ this.selectedItems.update((items) => [...items, ...itemsToAdd]);
254
+ }
255
+ else {
256
+ this.selectedItems.update((items) => items.filter((item) => !this.paginatedItems().some((p) => this.itemKey(p) === this.itemKey(item))));
257
+ }
258
+ this.selectedItemsChange.emit(this.selectedItems());
259
+ }
260
+ getRowClass(row) {
261
+ const styleClass = this.rowStyleClass();
262
+ if (!styleClass) {
263
+ return '';
264
+ }
265
+ return typeof styleClass === 'function' ? styleClass(row) : styleClass;
266
+ }
267
+ getColumnClass(col, row) {
268
+ if (!col.styleClass)
269
+ return '';
270
+ return typeof col.styleClass === 'function' ? col.styleClass(row) : col.styleClass;
271
+ }
272
+ isSortable(col) {
273
+ return !!col.sortable && !!col.field;
274
+ }
275
+ isSelectable(row) {
276
+ if (!this.selectableRows()) {
277
+ return false;
278
+ }
279
+ const predicate = this.isRowSelectable();
280
+ return predicate ? predicate(row) : true;
281
+ }
282
+ resolveValue(value, row) {
283
+ return typeof value === 'function' ? value(row) : value;
284
+ }
285
+ getVisibleIndicators(row) {
286
+ return this.rowIndicators().filter((ind) => {
287
+ if (ind.visible === undefined)
288
+ return true;
289
+ return this.resolveValue(ind.visible, row);
290
+ });
291
+ }
292
+ firstRecord = computed(() => (this.collectionSize() === 0 ? 0 : this.firstIndex() + 1), /* @ts-ignore */
293
+ ...(ngDevMode ? [{ debugName: "firstRecord" }] : /* istanbul ignore next */ []));
294
+ pageReportText = computed(() => this.pageReportTemplate()
295
+ .replace('{first}', this.firstRecord() + '')
296
+ .replace('{last}', this.lastIndex() + '')
297
+ .replace('{totalRecords}', this.collectionSize() + ''), /* @ts-ignore */
298
+ ...(ngDevMode ? [{ debugName: "pageReportText" }] : /* istanbul ignore next */ []));
299
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
300
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsTable, isStandalone: true, selector: "ys-table", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, actionButtons: { classPropertyName: "actionButtons", publicName: "actionButtons", isSignal: true, isRequired: false, transformFunction: null }, toolbarButtons: { classPropertyName: "toolbarButtons", publicName: "toolbarButtons", isSignal: true, isRequired: false, transformFunction: null }, rowStyleClass: { classPropertyName: "rowStyleClass", publicName: "rowStyleClass", isSignal: true, isRequired: false, transformFunction: null }, rowIndicators: { classPropertyName: "rowIndicators", publicName: "rowIndicators", isSignal: true, isRequired: false, transformFunction: null }, serverSide: { classPropertyName: "serverSide", publicName: "serverSide", isSignal: true, isRequired: false, transformFunction: null }, isPagination: { classPropertyName: "isPagination", publicName: "isPagination", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPage: { classPropertyName: "rowsPerPage", publicName: "rowsPerPage", isSignal: true, isRequired: false, transformFunction: null }, pageReportTemplate: { classPropertyName: "pageReportTemplate", publicName: "pageReportTemplate", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, collectionSize: { classPropertyName: "collectionSize", publicName: "collectionSize", isSignal: true, isRequired: false, transformFunction: null }, hasSearch: { classPropertyName: "hasSearch", publicName: "hasSearch", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, searchStyleClass: { classPropertyName: "searchStyleClass", publicName: "searchStyleClass", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, toolbarStyleClass: { classPropertyName: "toolbarStyleClass", publicName: "toolbarStyleClass", isSignal: true, isRequired: false, transformFunction: null }, tableStyleClass: { classPropertyName: "tableStyleClass", publicName: "tableStyleClass", isSignal: true, isRequired: false, transformFunction: null }, selectableRows: { classPropertyName: "selectableRows", publicName: "selectableRows", isSignal: true, isRequired: false, transformFunction: null }, isRowSelectable: { classPropertyName: "isRowSelectable", publicName: "isRowSelectable", isSignal: true, isRequired: false, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { page: "pageChange", pageSize: "pageSizeChange", collectionSize: "collectionSizeChange", pageChanged: "pageChanged", search: "search", selectedItemsChange: "selectedItemsChange" }, ngImport: i0, template: "<div class=\"ys-table-container card shadow-sm\" [class]=\"styleClass()\">\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\">\r\n <div class=\"ys-table-toolbar d-flex justify-content-between\" [class]=\"toolbarStyleClass()\">\r\n @if (toolbarButtons() && toolbarButtons().length) {\r\n <div class=\"mb-2 d-flex gap-2 w-100\">\r\n @for (btn of toolbarButtons(); track $index) {\r\n @if (!btn.visible || btn.visible()) {\r\n <button class=\"btn btn-primary btn-sm\" [class]=\"btn.styleClass\" (click)=\"btn.onClick?.()\"\r\n [disabled]=\"btn.disabled?.()\" [ngbTooltip]=\"getTooltipText(btn.tooltip)\">\r\n @if (btn.iconClass) {\r\n <i [class]=\"btn.iconClass\"></i>\r\n }\r\n\r\n {{ getLabelText(btn.label) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasSearch()) {\r\n <input type=\"text\" class=\"form-control w-auto mb-2 ms-auto\" [class]=\"searchStyleClass()\"\r\n [placeholder]=\"searchPlaceholder()\" (input)=\"onSearch($event.target)\" />\r\n }\r\n </div>\r\n\r\n <table class=\"ys-table table table-striped table-hover align-middle\" [class]=\"tableStyleClass()\">\r\n <thead class=\"table-light\">\r\n <tr>\r\n <th class=\"number-col\">#</th>\r\n\r\n @if (selectableRows()) {\r\n <th class=\"select-col\">\r\n <input type=\"checkbox\" [checked]=\"allSelected()\" (change)=\"toggleSelectAll($event)\" id=\"allSelect\" />\r\n </th>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <th class=\"indicator-col\"></th>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <th></th>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <th [class.cursor-pointer]=\"isSortable(col)\" (click)=\"isSortable(col) && onSort(col.field)\"\r\n [class]=\"col.headerStyleClass\">\r\n {{ col.header }}\r\n\r\n @if (isSortable(col)) {\r\n <i class=\"fa\" [ngClass]=\"{\r\n 'fa-sort': sortedColumn() !== col.field,\r\n 'fa-sort-up': sortedColumn() === col.field && sortDirection() === 'asc',\r\n 'fa-sort-down': sortedColumn() === col.field && sortDirection() === 'desc',\r\n }\"></i>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n @for (item of paginatedItems(); track $index; let i = $index) {\r\n <tr [class]=\"getRowClass(item)\">\r\n <td class=\"number-col\">{{ (page() - 1) * pageSize() + i + 1 }}</td>\r\n\r\n @if (selectableRows()) {\r\n <td class=\"select-col\">\r\n <input #checkbox type=\"checkbox\" [checked]=\"isSelected(item)\" (change)=\"toggleSelection(item, $event)\"\r\n [disabled]=\"!isSelectable(item)\" [class.opacity-50]=\"!isSelectable(item)\"\r\n id=\"{{ 'select' + $index }}\" />\r\n </td>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <td class=\"indicator-col text-center\">\r\n <div class=\"d-flex justify-content-center align-items-center gap-1\">\r\n @for (ind of getVisibleIndicators(item); track $index) {\r\n @if ((ind.type || 'icon') === 'icon') {\r\n <i [class.cursor-pointer]=\"ind.onClick\" [class]=\"\r\n resolveValue(ind.iconClass, item) +\r\n ' ' +\r\n (resolveValue(ind.styleClass, item) || '')\r\n \" [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n </i>\r\n } @else if (ind.type === 'badge') {\r\n <span class=\"badge rounded-pill position-relative\" [class]=\"resolveValue(ind.styleClass, item)\"\r\n [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n @if (resolveValue(ind.iconClass, item)) {\r\n <i [class]=\"resolveValue(ind.iconClass, item)\"></i>\r\n }\r\n\r\n @if (resolveValue(ind.badgeLabel, item)) {\r\n {{ resolveValue(ind.badgeLabel, item) }}\r\n }\r\n\r\n @if (resolveValue(ind.badgeValue, item)) {\r\n <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill\"\r\n [class]=\"resolveValue(ind.badgeValueClass, item)\">\r\n {{ resolveValue(ind.badgeValue, item) }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <td>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm btn-menu\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <i class=\"fa fa-bars\"></i>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n @for (action of actionButtons(); track $index) {\r\n @if (!action.visible || action.visible(item)) {\r\n @if (action.isDivider) {\r\n <li>\r\n <hr class=\"dropdown-divider\" />\r\n </li>\r\n } @else {\r\n <li>\r\n <button class=\"dropdown-item d-flex align-items-center gap-2\" type=\"button\"\r\n [class]=\"action.styleClass\" (click)=\"action.onClick?.(item)\" [disabled]=\"action.disabled?.(item)\">\r\n @if (action.iconClass) {\r\n <i [class]=\"getIconClass(action, item)\"></i>\r\n }\r\n {{ getLabel(action, item) }}\r\n </button>\r\n </li>\r\n }\r\n }\r\n }\r\n </ul>\r\n </div>\r\n </td>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <td [class]=\"getColumnClass(col, item)\">\r\n @if (!col.visible || col.visible(item)) {\r\n @if (col.cellTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.cellTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n } @else if (col.template) {\r\n {{ applyTemplate(col.template, item) }}\r\n } @else if (col.field && col.pipe) {\r\n {{\r\n applyPipe(col.pipe, resolveFieldPath(item, col.field), col.pipeArgs || [])\r\n }}\r\n } @else if (col.field) {\r\n {{ resolveFieldPath(item, col.field) }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n\r\n <caption>\r\n @if (isPagination()) {\r\n <div class=\"ys-table-pagination d-flex flex-wrap justify-content-between align-items-center gap-2\">\r\n <!-- \u0635\u0641\u062D\u0647\u200C\u0628\u0646\u062F\u06CC -->\r\n <ngb-pagination [collectionSize]=\"collectionSize()\" [page]=\"page()\" [pageSize]=\"pageSize()\" [maxSize]=\"5\"\r\n [rotate]=\"true\" [ellipses]=\"false\" [boundaryLinks]=\"true\" (pageChange)=\"changePage($event)\" />\r\n\r\n <!-- \u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0639\u062F\u0627\u062F \u062F\u0631 \u0647\u0631 \u0635\u0641\u062D\u0647 -->\r\n <select class=\"pagination-select form-select form-select-sm w-auto\" [(ngModel)]=\"pageSize\"\r\n (change)=\"changePageSize(pageSize())\" id=\"pagination\">\r\n @for (opt of rowsPerPage(); track opt) {\r\n <option [value]=\"opt\">{{ opt }}</option>\r\n }\r\n </select>\r\n\r\n <!-- \u06AF\u0632\u0627\u0631\u0634 -->\r\n <small class=\"pagination-report text-muted ms-auto\">\r\n {{ pageReportText() }}\r\n </small>\r\n </div>\r\n }\r\n </caption>\r\n </table>\r\n </div>\r\n </div>\r\n</div>", styles: [".ys-table .number-col,.ys-table .select-col{width:3em;min-width:3em;max-width:3em;word-break:break-all;text-align:center}.ys-table .indicator-col{width:32px;white-space:nowrap}.ys-table .indicator-col i{font-size:.9rem;cursor:default}.btn-menu{width:32px}.cursor-pointer{cursor:pointer!important}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NgbDropdownModule }, { kind: "component", type: NgbPagination, selector: "ngb-pagination", inputs: ["disabled", "boundaryLinks", "directionLinks", "ellipses", "rotate", "collectionSize", "maxSize", "page", "pageSize", "size"], outputs: ["pageChange"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
301
+ }
302
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsTable, decorators: [{
303
+ type: Component,
304
+ args: [{ selector: 'ys-table', imports: [NgClass, FormsModule, NgTemplateOutlet, NgbDropdownModule, NgbPagination, NgbTooltip], changeDetection: ChangeDetectionStrategy.Eager, template: "<div class=\"ys-table-container card shadow-sm\" [class]=\"styleClass()\">\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\">\r\n <div class=\"ys-table-toolbar d-flex justify-content-between\" [class]=\"toolbarStyleClass()\">\r\n @if (toolbarButtons() && toolbarButtons().length) {\r\n <div class=\"mb-2 d-flex gap-2 w-100\">\r\n @for (btn of toolbarButtons(); track $index) {\r\n @if (!btn.visible || btn.visible()) {\r\n <button class=\"btn btn-primary btn-sm\" [class]=\"btn.styleClass\" (click)=\"btn.onClick?.()\"\r\n [disabled]=\"btn.disabled?.()\" [ngbTooltip]=\"getTooltipText(btn.tooltip)\">\r\n @if (btn.iconClass) {\r\n <i [class]=\"btn.iconClass\"></i>\r\n }\r\n\r\n {{ getLabelText(btn.label) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasSearch()) {\r\n <input type=\"text\" class=\"form-control w-auto mb-2 ms-auto\" [class]=\"searchStyleClass()\"\r\n [placeholder]=\"searchPlaceholder()\" (input)=\"onSearch($event.target)\" />\r\n }\r\n </div>\r\n\r\n <table class=\"ys-table table table-striped table-hover align-middle\" [class]=\"tableStyleClass()\">\r\n <thead class=\"table-light\">\r\n <tr>\r\n <th class=\"number-col\">#</th>\r\n\r\n @if (selectableRows()) {\r\n <th class=\"select-col\">\r\n <input type=\"checkbox\" [checked]=\"allSelected()\" (change)=\"toggleSelectAll($event)\" id=\"allSelect\" />\r\n </th>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <th class=\"indicator-col\"></th>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <th></th>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <th [class.cursor-pointer]=\"isSortable(col)\" (click)=\"isSortable(col) && onSort(col.field)\"\r\n [class]=\"col.headerStyleClass\">\r\n {{ col.header }}\r\n\r\n @if (isSortable(col)) {\r\n <i class=\"fa\" [ngClass]=\"{\r\n 'fa-sort': sortedColumn() !== col.field,\r\n 'fa-sort-up': sortedColumn() === col.field && sortDirection() === 'asc',\r\n 'fa-sort-down': sortedColumn() === col.field && sortDirection() === 'desc',\r\n }\"></i>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n @for (item of paginatedItems(); track $index; let i = $index) {\r\n <tr [class]=\"getRowClass(item)\">\r\n <td class=\"number-col\">{{ (page() - 1) * pageSize() + i + 1 }}</td>\r\n\r\n @if (selectableRows()) {\r\n <td class=\"select-col\">\r\n <input #checkbox type=\"checkbox\" [checked]=\"isSelected(item)\" (change)=\"toggleSelection(item, $event)\"\r\n [disabled]=\"!isSelectable(item)\" [class.opacity-50]=\"!isSelectable(item)\"\r\n id=\"{{ 'select' + $index }}\" />\r\n </td>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <td class=\"indicator-col text-center\">\r\n <div class=\"d-flex justify-content-center align-items-center gap-1\">\r\n @for (ind of getVisibleIndicators(item); track $index) {\r\n @if ((ind.type || 'icon') === 'icon') {\r\n <i [class.cursor-pointer]=\"ind.onClick\" [class]=\"\r\n resolveValue(ind.iconClass, item) +\r\n ' ' +\r\n (resolveValue(ind.styleClass, item) || '')\r\n \" [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n </i>\r\n } @else if (ind.type === 'badge') {\r\n <span class=\"badge rounded-pill position-relative\" [class]=\"resolveValue(ind.styleClass, item)\"\r\n [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n @if (resolveValue(ind.iconClass, item)) {\r\n <i [class]=\"resolveValue(ind.iconClass, item)\"></i>\r\n }\r\n\r\n @if (resolveValue(ind.badgeLabel, item)) {\r\n {{ resolveValue(ind.badgeLabel, item) }}\r\n }\r\n\r\n @if (resolveValue(ind.badgeValue, item)) {\r\n <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill\"\r\n [class]=\"resolveValue(ind.badgeValueClass, item)\">\r\n {{ resolveValue(ind.badgeValue, item) }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <td>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm btn-menu\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <i class=\"fa fa-bars\"></i>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n @for (action of actionButtons(); track $index) {\r\n @if (!action.visible || action.visible(item)) {\r\n @if (action.isDivider) {\r\n <li>\r\n <hr class=\"dropdown-divider\" />\r\n </li>\r\n } @else {\r\n <li>\r\n <button class=\"dropdown-item d-flex align-items-center gap-2\" type=\"button\"\r\n [class]=\"action.styleClass\" (click)=\"action.onClick?.(item)\" [disabled]=\"action.disabled?.(item)\">\r\n @if (action.iconClass) {\r\n <i [class]=\"getIconClass(action, item)\"></i>\r\n }\r\n {{ getLabel(action, item) }}\r\n </button>\r\n </li>\r\n }\r\n }\r\n }\r\n </ul>\r\n </div>\r\n </td>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <td [class]=\"getColumnClass(col, item)\">\r\n @if (!col.visible || col.visible(item)) {\r\n @if (col.cellTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.cellTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n } @else if (col.template) {\r\n {{ applyTemplate(col.template, item) }}\r\n } @else if (col.field && col.pipe) {\r\n {{\r\n applyPipe(col.pipe, resolveFieldPath(item, col.field), col.pipeArgs || [])\r\n }}\r\n } @else if (col.field) {\r\n {{ resolveFieldPath(item, col.field) }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n\r\n <caption>\r\n @if (isPagination()) {\r\n <div class=\"ys-table-pagination d-flex flex-wrap justify-content-between align-items-center gap-2\">\r\n <!-- \u0635\u0641\u062D\u0647\u200C\u0628\u0646\u062F\u06CC -->\r\n <ngb-pagination [collectionSize]=\"collectionSize()\" [page]=\"page()\" [pageSize]=\"pageSize()\" [maxSize]=\"5\"\r\n [rotate]=\"true\" [ellipses]=\"false\" [boundaryLinks]=\"true\" (pageChange)=\"changePage($event)\" />\r\n\r\n <!-- \u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0639\u062F\u0627\u062F \u062F\u0631 \u0647\u0631 \u0635\u0641\u062D\u0647 -->\r\n <select class=\"pagination-select form-select form-select-sm w-auto\" [(ngModel)]=\"pageSize\"\r\n (change)=\"changePageSize(pageSize())\" id=\"pagination\">\r\n @for (opt of rowsPerPage(); track opt) {\r\n <option [value]=\"opt\">{{ opt }}</option>\r\n }\r\n </select>\r\n\r\n <!-- \u06AF\u0632\u0627\u0631\u0634 -->\r\n <small class=\"pagination-report text-muted ms-auto\">\r\n {{ pageReportText() }}\r\n </small>\r\n </div>\r\n }\r\n </caption>\r\n </table>\r\n </div>\r\n </div>\r\n</div>", styles: [".ys-table .number-col,.ys-table .select-col{width:3em;min-width:3em;max-width:3em;word-break:break-all;text-align:center}.ys-table .indicator-col{width:32px;white-space:nowrap}.ys-table .indicator-col i{font-size:.9rem;cursor:default}.btn-menu{width:32px}.cursor-pointer{cursor:pointer!important}\n"] }]
305
+ }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], actionButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionButtons", required: false }] }], toolbarButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarButtons", required: false }] }], rowStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowStyleClass", required: false }] }], rowIndicators: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowIndicators", required: false }] }], serverSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "serverSide", required: false }] }], isPagination: [{ type: i0.Input, args: [{ isSignal: true, alias: "isPagination", required: false }] }], rowsPerPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsPerPage", required: false }] }], pageReportTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageReportTemplate", required: false }] }], page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }, { type: i0.Output, args: ["pageChange"] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }, { type: i0.Output, args: ["pageSizeChange"] }], collectionSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "collectionSize", required: false }] }, { type: i0.Output, args: ["collectionSizeChange"] }], hasSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasSearch", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], searchStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchStyleClass", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], toolbarStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarStyleClass", required: false }] }], tableStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableStyleClass", required: false }] }], selectableRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectableRows", required: false }] }], isRowSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isRowSelectable", required: false }] }], rowKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowKey", required: false }] }], pageChanged: [{ type: i0.Output, args: ["pageChanged"] }], search: [{ type: i0.Output, args: ["search"] }], selectedItemsChange: [{ type: i0.Output, args: ["selectedItemsChange"] }] } });
306
+
307
+ /*
308
+ * Public API Surface of ys-tiff-viewer
309
+ */
310
+
311
+ /**
312
+ * Generated bundle index. Do not edit.
313
+ */
314
+
315
+ export { YsTable };
316
+ //# sourceMappingURL=yoozsoft-yoozsoft-ng-table.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-table.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/table/src/ys-table/ys-table.ts","../../../../projects/yoozsoft/yoozsoft-ng/table/src/ys-table/ys-table.html","../../../../projects/yoozsoft/yoozsoft-ng/table/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/table/yoozsoft-yoozsoft-ng-table.ts"],"sourcesContent":["import { NgClass, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n PipeTransform,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgbDropdownModule, NgbPagination, NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ActionButton, RowIndicator, TableColumn, ToolbarButton, ValueOrFn } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-table',\r\n imports: [NgClass, FormsModule, NgTemplateOutlet, NgbDropdownModule, NgbPagination, NgbTooltip],\r\n templateUrl: './ys-table.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './ys-table.scss',\r\n})\r\nexport class YsTable {\r\n items = input<any[]>([]);\r\n columns = input<TableColumn[]>([]);\r\n actionButtons = input<ActionButton[]>([]);\r\n\r\n toolbarButtons = input<ToolbarButton[]>([]);\r\n\r\n rowStyleClass = input<string | ((row: any) => string)>();\r\n\r\n rowIndicators = input<RowIndicator[]>([]);\r\n\r\n serverSide = input<boolean>(false); // <--- حالت سروری\r\n isPagination = input<boolean>(true);\r\n rowsPerPage = input<number[]>([10, 25, 50]);\r\n pageReportTemplate = input<string>('Showing {first} to {last} of {totalRecords} items');\r\n\r\n page = model<number>(1);\r\n pageSize = model<number>(this.rowsPerPage()[0] || 10);\r\n collectionSize = model<number>(0); // <--- از سرور می‌گیریم\r\n\r\n hasSearch = input<boolean>(false);\r\n searchPlaceholder = input<string>('search...');\r\n searchStyleClass = input<string>();\r\n\r\n styleClass = input<string>();\r\n toolbarStyleClass = input<string>();\r\n tableStyleClass = input<string>();\r\n\r\n /** Selectable rows checkbox */\r\n selectableRows = input<boolean>(false);\r\n /** Condition for each row's checkbox to be active */\r\n isRowSelectable = input<(row: any) => boolean>();\r\n\r\n rowKey = input<string>('id');\r\n\r\n pageChanged = output<{ page: number; pageSize: number }>();\r\n search = output<string>();\r\n\r\n /** checkbox */\r\n selectedItemsChange = output<any[]>();\r\n\r\n searchTerm = signal<string>('');\r\n sortedColumn = signal<string | null>(null);\r\n sortDirection = signal<'asc' | 'desc'>('asc');\r\n\r\n readonly filteredItems = computed(() => {\r\n let items = [...this.items()];\r\n\r\n const search = this.searchTerm().trim().toLowerCase();\r\n\r\n if (search) {\r\n items = items.filter((item) =>\r\n this.columns().some((col) => {\r\n let value = '';\r\n\r\n if (col.template) {\r\n value = this.applyTemplate(col.template, item);\r\n } else if (col.field) {\r\n value = this.resolveFieldPath(item, col.field);\r\n }\r\n\r\n return value?.toString().toLowerCase().includes(search);\r\n }),\r\n );\r\n }\r\n\r\n const sortField = this.sortedColumn();\r\n\r\n if (sortField) {\r\n items.sort((a, b) => {\r\n const aVal = this.resolveFieldPath(a, sortField);\r\n const bVal = this.resolveFieldPath(b, sortField);\r\n\r\n if (aVal == null) return this.sortDirection() === 'asc' ? -1 : 1;\r\n if (bVal == null) return this.sortDirection() === 'asc' ? 1 : -1;\r\n\r\n return this.sortDirection() === 'asc'\r\n ? String(aVal).localeCompare(String(bVal))\r\n : String(bVal).localeCompare(String(aVal));\r\n });\r\n }\r\n\r\n return items;\r\n });\r\n\r\n readonly paginatedItems = computed(() => {\r\n if (this.serverSide()) {\r\n return this.items();\r\n }\r\n\r\n if (!this.isPagination()) {\r\n return this.filteredItems();\r\n }\r\n\r\n const start = (this.page() - 1) * this.pageSize();\r\n\r\n return this.filteredItems().slice(start, start + this.pageSize());\r\n });\r\n\r\n selectedItems = signal<any[]>([]);\r\n\r\n totalPages = computed<number>(() => {\r\n return Math.ceil(this.collectionSize() / this.pageSize()) || 1;\r\n });\r\n\r\n firstIndex = computed<number>(() => {\r\n return (this.page() - 1) * this.pageSize();\r\n });\r\n\r\n lastIndex = computed<number>(() => {\r\n return Math.min(this.firstIndex() + this.pageSize(), this.collectionSize());\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n this.columns();\r\n this.checkUniqueColumnKeys();\r\n });\r\n\r\n effect(() => {\r\n if (!this.serverSide()) {\r\n this.collectionSize.set(this.filteredItems().length);\r\n }\r\n });\r\n }\r\n\r\n onSort(field: string): void {\r\n if (this.sortedColumn() === field) {\r\n this.sortDirection.update((v) => (v === 'asc' ? 'desc' : 'asc'));\r\n } else {\r\n this.sortedColumn.set(field);\r\n this.sortDirection.set('asc');\r\n }\r\n }\r\n\r\n changePage(page: number): void {\r\n if (page < 1 || page > this.totalPages()) {\r\n return;\r\n }\r\n\r\n this.page.set(page);\r\n\r\n if (this.serverSide()) {\r\n this.pageChanged.emit({\r\n page,\r\n pageSize: this.pageSize(),\r\n });\r\n }\r\n }\r\n\r\n changePageSize(size: number): void {\r\n this.pageSize.set(+size);\r\n this.page.set(1);\r\n\r\n if (this.serverSide()) {\r\n this.pageChanged.emit({\r\n page: 1,\r\n pageSize: +size,\r\n });\r\n }\r\n }\r\n\r\n onSearch(target: EventTarget | null): void {\r\n this.searchTerm.set((target as HTMLInputElement).value);\r\n\r\n this.page.set(1);\r\n\r\n if (this.serverSide()) {\r\n this.search.emit(this.searchTerm());\r\n }\r\n }\r\n\r\n applyPipe(pipe: PipeTransform, value: unknown, args: unknown[] = []): any {\r\n return pipe?.transform(value, ...args);\r\n }\r\n\r\n resolveFieldPath(obj: any, path: string): any {\r\n return path.split('.').reduce((acc, part) => acc?.[part], obj);\r\n }\r\n\r\n applyTemplate(template: string, item: any): string {\r\n return template.replace(/\\{([^}]+)\\}/g, (_, path) => {\r\n const val = this.resolveFieldPath(item, path.trim());\r\n return val !== undefined && val !== null ? val : '';\r\n });\r\n }\r\n\r\n private checkUniqueColumnKeys(): void {\r\n const seen = new Set<number>();\r\n const duplicates: number[] = [];\r\n\r\n this.columns().forEach((col) => {\r\n if (!col.key) {\r\n throw new Error(`Column with header \"${col.header}\" is missing a unique \"key\"`);\r\n }\r\n if (seen.has(col.key)) {\r\n duplicates.push(col.key);\r\n } else {\r\n seen.add(col.key);\r\n }\r\n });\r\n\r\n if (duplicates.length > 0) {\r\n throw new Error(`Duplicate column keys found: ${duplicates.join(', ')}`);\r\n }\r\n }\r\n\r\n getLabel(action: ActionButton, item: any): string {\r\n return typeof action.label === 'function' ? action.label(item) : (action.label ?? 'Label');\r\n }\r\n\r\n getIconClass(action: ActionButton, item: any): string {\r\n return typeof action.iconClass === 'function'\r\n ? action.iconClass(item)\r\n : (action.iconClass ?? '');\r\n }\r\n\r\n getTooltipText(tooltip?: string | (() => string)): string {\r\n if (!tooltip) return '';\r\n\r\n return typeof tooltip === 'function' ? tooltip() : tooltip;\r\n }\r\n\r\n getLabelText(label?: string | (() => string)): string {\r\n if (!label) return '';\r\n\r\n return typeof label === 'function' ? label() : label;\r\n }\r\n\r\n itemKey(item: any): string {\r\n return String(item[this.rowKey()]);\r\n }\r\n\r\n onSelectionChange(item: any, checked: boolean) {\r\n if (checked) {\r\n this.selectedItems.update((items) => [...items, item]);\r\n } else {\r\n this.selectedItems.update((items) =>\r\n items.filter((x) => this.itemKey(x) !== this.itemKey(item)),\r\n );\r\n }\r\n\r\n this.selectedItemsChange.emit(this.selectedItems());\r\n }\r\n\r\n isSelected(item: any): boolean {\r\n return this.selectedItems().some((x) => this.itemKey(x) === this.itemKey(item));\r\n }\r\n\r\n toggleSelection(item: any, event: Event): void {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n\r\n if (checked) {\r\n this.selectedItems.update((items) => [...items, item]);\r\n } else {\r\n this.selectedItems.update((items) =>\r\n items.filter((x) => this.itemKey(x) !== this.itemKey(item)),\r\n );\r\n }\r\n\r\n this.selectedItemsChange.emit(this.selectedItems());\r\n }\r\n\r\n allSelected(): boolean {\r\n const selectable = this.paginatedItems().filter((i) => this.isSelectable(i));\r\n\r\n return selectable.length > 0 && selectable.every((i) => this.isSelected(i));\r\n }\r\n\r\n toggleSelectAll(event: Event): void {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n\r\n if (checked) {\r\n const itemsToAdd = this.paginatedItems().filter(\r\n (item) =>\r\n this.isSelectable(item) &&\r\n !this.selectedItems().some((x) => this.itemKey(x) === this.itemKey(item)),\r\n );\r\n\r\n this.selectedItems.update((items) => [...items, ...itemsToAdd]);\r\n } else {\r\n this.selectedItems.update((items) =>\r\n items.filter(\r\n (item) => !this.paginatedItems().some((p) => this.itemKey(p) === this.itemKey(item)),\r\n ),\r\n );\r\n }\r\n\r\n this.selectedItemsChange.emit(this.selectedItems());\r\n }\r\n\r\n getRowClass(row: any): string {\r\n const styleClass = this.rowStyleClass();\r\n\r\n if (!styleClass) {\r\n return '';\r\n }\r\n\r\n return typeof styleClass === 'function' ? styleClass(row) : styleClass;\r\n }\r\n\r\n getColumnClass(col: TableColumn, row: any): string {\r\n if (!col.styleClass) return '';\r\n return typeof col.styleClass === 'function' ? col.styleClass(row) : col.styleClass;\r\n }\r\n\r\n isSortable(col: TableColumn): col is TableColumn & { field: string } {\r\n return !!col.sortable && !!col.field;\r\n }\r\n\r\n isSelectable(row: any): boolean {\r\n if (!this.selectableRows()) {\r\n return false;\r\n }\r\n\r\n const predicate = this.isRowSelectable();\r\n\r\n return predicate ? predicate(row) : true;\r\n }\r\n\r\n resolveValue<T>(value: ValueOrFn<T> | undefined, row: any): T | undefined {\r\n return typeof value === 'function' ? (value as (row: any) => T)(row) : value;\r\n }\r\n\r\n getVisibleIndicators(row: any): RowIndicator[] {\r\n return this.rowIndicators().filter((ind) => {\r\n if (ind.visible === undefined) return true;\r\n return this.resolveValue(ind.visible, row);\r\n });\r\n }\r\n\r\n readonly firstRecord = computed(() => (this.collectionSize() === 0 ? 0 : this.firstIndex() + 1));\r\n\r\n readonly pageReportText = computed(() =>\r\n this.pageReportTemplate()\r\n .replace('{first}', this.firstRecord() + '')\r\n .replace('{last}', this.lastIndex() + '')\r\n .replace('{totalRecords}', this.collectionSize() + ''),\r\n );\r\n}\r\n","<div class=\"ys-table-container card shadow-sm\" [class]=\"styleClass()\">\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\">\r\n <div class=\"ys-table-toolbar d-flex justify-content-between\" [class]=\"toolbarStyleClass()\">\r\n @if (toolbarButtons() && toolbarButtons().length) {\r\n <div class=\"mb-2 d-flex gap-2 w-100\">\r\n @for (btn of toolbarButtons(); track $index) {\r\n @if (!btn.visible || btn.visible()) {\r\n <button class=\"btn btn-primary btn-sm\" [class]=\"btn.styleClass\" (click)=\"btn.onClick?.()\"\r\n [disabled]=\"btn.disabled?.()\" [ngbTooltip]=\"getTooltipText(btn.tooltip)\">\r\n @if (btn.iconClass) {\r\n <i [class]=\"btn.iconClass\"></i>\r\n }\r\n\r\n {{ getLabelText(btn.label) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasSearch()) {\r\n <input type=\"text\" class=\"form-control w-auto mb-2 ms-auto\" [class]=\"searchStyleClass()\"\r\n [placeholder]=\"searchPlaceholder()\" (input)=\"onSearch($event.target)\" />\r\n }\r\n </div>\r\n\r\n <table class=\"ys-table table table-striped table-hover align-middle\" [class]=\"tableStyleClass()\">\r\n <thead class=\"table-light\">\r\n <tr>\r\n <th class=\"number-col\">#</th>\r\n\r\n @if (selectableRows()) {\r\n <th class=\"select-col\">\r\n <input type=\"checkbox\" [checked]=\"allSelected()\" (change)=\"toggleSelectAll($event)\" id=\"allSelect\" />\r\n </th>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <th class=\"indicator-col\"></th>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <th></th>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <th [class.cursor-pointer]=\"isSortable(col)\" (click)=\"isSortable(col) && onSort(col.field)\"\r\n [class]=\"col.headerStyleClass\">\r\n {{ col.header }}\r\n\r\n @if (isSortable(col)) {\r\n <i class=\"fa\" [ngClass]=\"{\r\n 'fa-sort': sortedColumn() !== col.field,\r\n 'fa-sort-up': sortedColumn() === col.field && sortDirection() === 'asc',\r\n 'fa-sort-down': sortedColumn() === col.field && sortDirection() === 'desc',\r\n }\"></i>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n @for (item of paginatedItems(); track $index; let i = $index) {\r\n <tr [class]=\"getRowClass(item)\">\r\n <td class=\"number-col\">{{ (page() - 1) * pageSize() + i + 1 }}</td>\r\n\r\n @if (selectableRows()) {\r\n <td class=\"select-col\">\r\n <input #checkbox type=\"checkbox\" [checked]=\"isSelected(item)\" (change)=\"toggleSelection(item, $event)\"\r\n [disabled]=\"!isSelectable(item)\" [class.opacity-50]=\"!isSelectable(item)\"\r\n id=\"{{ 'select' + $index }}\" />\r\n </td>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <td class=\"indicator-col text-center\">\r\n <div class=\"d-flex justify-content-center align-items-center gap-1\">\r\n @for (ind of getVisibleIndicators(item); track $index) {\r\n @if ((ind.type || 'icon') === 'icon') {\r\n <i [class.cursor-pointer]=\"ind.onClick\" [class]=\"\r\n resolveValue(ind.iconClass, item) +\r\n ' ' +\r\n (resolveValue(ind.styleClass, item) || '')\r\n \" [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n </i>\r\n } @else if (ind.type === 'badge') {\r\n <span class=\"badge rounded-pill position-relative\" [class]=\"resolveValue(ind.styleClass, item)\"\r\n [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n @if (resolveValue(ind.iconClass, item)) {\r\n <i [class]=\"resolveValue(ind.iconClass, item)\"></i>\r\n }\r\n\r\n @if (resolveValue(ind.badgeLabel, item)) {\r\n {{ resolveValue(ind.badgeLabel, item) }}\r\n }\r\n\r\n @if (resolveValue(ind.badgeValue, item)) {\r\n <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill\"\r\n [class]=\"resolveValue(ind.badgeValueClass, item)\">\r\n {{ resolveValue(ind.badgeValue, item) }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <td>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm btn-menu\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <i class=\"fa fa-bars\"></i>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n @for (action of actionButtons(); track $index) {\r\n @if (!action.visible || action.visible(item)) {\r\n @if (action.isDivider) {\r\n <li>\r\n <hr class=\"dropdown-divider\" />\r\n </li>\r\n } @else {\r\n <li>\r\n <button class=\"dropdown-item d-flex align-items-center gap-2\" type=\"button\"\r\n [class]=\"action.styleClass\" (click)=\"action.onClick?.(item)\" [disabled]=\"action.disabled?.(item)\">\r\n @if (action.iconClass) {\r\n <i [class]=\"getIconClass(action, item)\"></i>\r\n }\r\n {{ getLabel(action, item) }}\r\n </button>\r\n </li>\r\n }\r\n }\r\n }\r\n </ul>\r\n </div>\r\n </td>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <td [class]=\"getColumnClass(col, item)\">\r\n @if (!col.visible || col.visible(item)) {\r\n @if (col.cellTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.cellTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n } @else if (col.template) {\r\n {{ applyTemplate(col.template, item) }}\r\n } @else if (col.field && col.pipe) {\r\n {{\r\n applyPipe(col.pipe, resolveFieldPath(item, col.field), col.pipeArgs || [])\r\n }}\r\n } @else if (col.field) {\r\n {{ resolveFieldPath(item, col.field) }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n\r\n <caption>\r\n @if (isPagination()) {\r\n <div class=\"ys-table-pagination d-flex flex-wrap justify-content-between align-items-center gap-2\">\r\n <!-- صفحه‌بندی -->\r\n <ngb-pagination [collectionSize]=\"collectionSize()\" [page]=\"page()\" [pageSize]=\"pageSize()\" [maxSize]=\"5\"\r\n [rotate]=\"true\" [ellipses]=\"false\" [boundaryLinks]=\"true\" (pageChange)=\"changePage($event)\" />\r\n\r\n <!-- انتخاب تعداد در هر صفحه -->\r\n <select class=\"pagination-select form-select form-select-sm w-auto\" [(ngModel)]=\"pageSize\"\r\n (change)=\"changePageSize(pageSize())\" id=\"pagination\">\r\n @for (opt of rowsPerPage(); track opt) {\r\n <option [value]=\"opt\">{{ opt }}</option>\r\n }\r\n </select>\r\n\r\n <!-- گزارش -->\r\n <small class=\"pagination-report text-muted ms-auto\">\r\n {{ pageReportText() }}\r\n </small>\r\n </div>\r\n }\r\n </caption>\r\n </table>\r\n </div>\r\n </div>\r\n</div>","/*\r\n * Public API Surface of ys-tiff-viewer\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-table/ys-table';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;MAuBa,OAAO,CAAA;IAClB,KAAK,GAAG,KAAK,CAAQ,EAAE;8EAAC;IACxB,OAAO,GAAG,KAAK,CAAgB,EAAE;gFAAC;IAClC,aAAa,GAAG,KAAK,CAAiB,EAAE;sFAAC;IAEzC,cAAc,GAAG,KAAK,CAAkB,EAAE;uFAAC;AAE3C,IAAA,aAAa,GAAG,KAAK;iGAAmC;IAExD,aAAa,GAAG,KAAK,CAAiB,EAAE;sFAAC;IAEzC,UAAU,GAAG,KAAK,CAAU,KAAK;AAAC,IAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAA,CAAC;IACnC,YAAY,GAAG,KAAK,CAAU,IAAI;qFAAC;IACnC,WAAW,GAAG,KAAK,CAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;oFAAC;IAC3C,kBAAkB,GAAG,KAAK,CAAS,mDAAmD;2FAAC;IAEvF,IAAI,GAAG,KAAK,CAAS,CAAC;6EAAC;IACvB,QAAQ,GAAG,KAAK,CAAS,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;iFAAC;IACrD,cAAc,GAAG,KAAK,CAAS,CAAC;AAAC,IAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAA,CAAC;IAElC,SAAS,GAAG,KAAK,CAAU,KAAK;kFAAC;IACjC,iBAAiB,GAAG,KAAK,CAAS,WAAW;0FAAC;AAC9C,IAAA,gBAAgB,GAAG,KAAK;oGAAU;AAElC,IAAA,UAAU,GAAG,KAAK;8FAAU;AAC5B,IAAA,iBAAiB,GAAG,KAAK;qGAAU;AACnC,IAAA,eAAe,GAAG,KAAK;mGAAU;;IAGjC,cAAc,GAAG,KAAK,CAAU,KAAK;uFAAC;;AAEtC,IAAA,eAAe,GAAG,KAAK;mGAAyB;IAEhD,MAAM,GAAG,KAAK,CAAS,IAAI;+EAAC;IAE5B,WAAW,GAAG,MAAM,EAAsC;IAC1D,MAAM,GAAG,MAAM,EAAU;;IAGzB,mBAAmB,GAAG,MAAM,EAAS;IAErC,UAAU,GAAG,MAAM,CAAS,EAAE;mFAAC;IAC/B,YAAY,GAAG,MAAM,CAAgB,IAAI;qFAAC;IAC1C,aAAa,GAAG,MAAM,CAAiB,KAAK;sFAAC;AAEpC,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AAE7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;QAErD,IAAI,MAAM,EAAE;YACV,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBAC1B,IAAI,KAAK,GAAG,EAAE;AAEd,gBAAA,IAAI,GAAG,CAAC,QAAQ,EAAE;oBAChB,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC;gBAChD;AAAO,qBAAA,IAAI,GAAG,CAAC,KAAK,EAAE;oBACpB,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC;gBAChD;AAEA,gBAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzD,CAAC,CAAC,CACH;QACH;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;QAErC,IAAI,SAAS,EAAE;YACb,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;gBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,SAAS,CAAC;gBAChD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,SAAS,CAAC;gBAEhD,IAAI,IAAI,IAAI,IAAI;AAAE,oBAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;gBAChE,IAAI,IAAI,IAAI,IAAI;AAAE,oBAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAEhE,gBAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK;AAC9B,sBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;AACzC,sBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9C,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,OAAO,KAAK;IACd,CAAC;sFAAC;AAEO,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE;QACrB;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxB,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE;QAC7B;AAEA,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAEjD,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IACnE,CAAC;uFAAC;IAEF,aAAa,GAAG,MAAM,CAAQ,EAAE;sFAAC;AAEjC,IAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;AACjC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChE,CAAC;mFAAC;AAEF,IAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;AACjC,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;IAC5C,CAAC;mFAAC;AAEF,IAAA,SAAS,GAAG,QAAQ,CAAS,MAAK;AAChC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7E,CAAC;kFAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,CAAC,qBAAqB,EAAE;AAC9B,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AACtB,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC;YACtD;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,KAAK,EAAE;YACjC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;QAClE;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;QACrB,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE;YACxC;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACpB,IAAI;AACJ,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,cAAc,CAAC,IAAY,EAAA;QACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,gBAAA,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,CAAC,IAAI;AAChB,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,QAAQ,CAAC,MAA0B,EAAA;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAE,MAA2B,CAAC,KAAK,CAAC;AAEvD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC;IACF;AAEA,IAAA,SAAS,CAAC,IAAmB,EAAE,KAAc,EAAE,OAAkB,EAAE,EAAA;QACjE,OAAO,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;IACxC;IAEA,gBAAgB,CAAC,GAAQ,EAAE,IAAY,EAAA;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;IAChE;IAEA,aAAa,CAAC,QAAgB,EAAE,IAAS,EAAA;QACvC,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAI,KAAI;AAClD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACpD,YAAA,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE;AACrD,QAAA,CAAC,CAAC;IACJ;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;QAC9B,MAAM,UAAU,GAAa,EAAE;QAE/B,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC7B,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAC,MAAM,CAAA,2BAAA,CAA6B,CAAC;YACjF;YACA,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACrB,gBAAA,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAC1B;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YACnB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,6BAAA,EAAgC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;QAC1E;IACF;IAEA,QAAQ,CAAC,MAAoB,EAAE,IAAS,EAAA;QACtC,OAAO,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;IAC5F;IAEA,YAAY,CAAC,MAAoB,EAAE,IAAS,EAAA;AAC1C,QAAA,OAAO,OAAO,MAAM,CAAC,SAAS,KAAK;AACjC,cAAE,MAAM,CAAC,SAAS,CAAC,IAAI;eACpB,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAC9B;AAEA,IAAA,cAAc,CAAC,OAAiC,EAAA;AAC9C,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE;AAEvB,QAAA,OAAO,OAAO,OAAO,KAAK,UAAU,GAAG,OAAO,EAAE,GAAG,OAAO;IAC5D;AAEA,IAAA,YAAY,CAAC,KAA+B,EAAA;AAC1C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AAErB,QAAA,OAAO,OAAO,KAAK,KAAK,UAAU,GAAG,KAAK,EAAE,GAAG,KAAK;IACtD;AAEA,IAAA,OAAO,CAAC,IAAS,EAAA;QACf,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC;IAEA,iBAAiB,CAAC,IAAS,EAAE,OAAgB,EAAA;QAC3C,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;QACxD;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,KAC9B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAC5D;QACH;QAEA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACrD;AAEA,IAAA,UAAU,CAAC,IAAS,EAAA;QAClB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF;IAEA,eAAe,CAAC,IAAS,EAAE,KAAY,EAAA;AACrC,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAE1D,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;QACxD;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,KAC9B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAC5D;QACH;QAEA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACrD;IAEA,WAAW,GAAA;QACT,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE5E,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7E;AAEA,IAAA,eAAe,CAAC,KAAY,EAAA;AAC1B,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAE1D,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAC7C,CAAC,IAAI,KACH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACvB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAC5E;AAED,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC;QACjE;aAAO;YACL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,KAC9B,KAAK,CAAC,MAAM,CACV,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACrF,CACF;QACH;QAEA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACrD;AAEA,IAAA,WAAW,CAAC,GAAQ,EAAA;AAClB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;QAEvC,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,OAAO,UAAU,KAAK,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,UAAU;IACxE;IAEA,cAAc,CAAC,GAAgB,EAAE,GAAQ,EAAA;QACvC,IAAI,CAAC,GAAG,CAAC,UAAU;AAAE,YAAA,OAAO,EAAE;QAC9B,OAAO,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,UAAU;IACpF;AAEA,IAAA,UAAU,CAAC,GAAgB,EAAA;QACzB,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK;IACtC;AAEA,IAAA,YAAY,CAAC,GAAQ,EAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE;AAExC,QAAA,OAAO,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI;IAC1C;IAEA,YAAY,CAAI,KAA+B,EAAE,GAAQ,EAAA;AACvD,QAAA,OAAO,OAAO,KAAK,KAAK,UAAU,GAAI,KAAyB,CAAC,GAAG,CAAC,GAAG,KAAK;IAC9E;AAEA,IAAA,oBAAoB,CAAC,GAAQ,EAAA;QAC3B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACzC,YAAA,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS;AAAE,gBAAA,OAAO,IAAI;YAC1C,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;AAC5C,QAAA,CAAC,CAAC;IACJ;IAES,WAAW,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;oFAAC;IAEvF,cAAc,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,kBAAkB;SACpB,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;SAC1C,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;SACvC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;uFACzD;uGAlVU,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBpB,s4QA6LM,EAAA,MAAA,EAAA,CAAA,4SAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3KM,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,0JAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,4NAAE,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA;;2FAKnF,OAAO,EAAA,UAAA,EAAA,CAAA;kBAPnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,WACX,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,CAAC,EAAA,eAAA,EAE9E,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,s4QAAA,EAAA,MAAA,EAAA,CAAA,4SAAA,CAAA,EAAA;;;AEpBhD;;AAEG;;ACFH;;AAEG;;;;"}