@sdcorejs/angular 21.1.5 → 21.2.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 (208) hide show
  1. package/README.md +12 -4
  2. package/assets/scss/core/menu.scss +18 -0
  3. package/assets/scss/core/utilities/_misc.scss +15 -0
  4. package/assets/scss/sd-core.scss +1 -0
  5. package/fesm2022/sdcorejs-angular-components-anchor.mjs +37 -13
  6. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  7. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  8. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  9. package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
  10. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  11. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  12. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  13. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  14. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  15. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  16. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  17. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  18. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  19. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  20. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  21. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  22. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  23. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  24. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  25. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  26. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  27. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  28. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  29. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  30. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  31. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  32. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  33. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  34. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  35. package/fesm2022/sdcorejs-angular-components-preview.mjs +58 -19
  36. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  37. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  38. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  39. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  40. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  41. package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
  42. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  43. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  44. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  45. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  46. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  47. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  48. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  49. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  50. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  51. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  52. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  53. package/fesm2022/sdcorejs-angular-components-table.mjs +557 -255
  54. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  55. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  56. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  57. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  58. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  59. package/fesm2022/sdcorejs-angular-components.mjs +6 -1
  60. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  61. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  63. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  65. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  67. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  69. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  71. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +234 -64
  73. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-date.mjs +209 -42
  75. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +131 -27
  77. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +40 -16
  79. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  81. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  82. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  83. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  85. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-forms-models.mjs +279 -6
  87. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  89. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-forms-select.mjs +136 -38
  91. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  93. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  95. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  97. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  99. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  101. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  103. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  105. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-i18n.mjs +510 -68
  107. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  109. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  111. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  113. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  115. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-modules-layout.mjs +441 -135
  117. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  119. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  121. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  123. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  125. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  127. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  129. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  131. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  132. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  133. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  135. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  137. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  138. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  139. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  140. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  141. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  142. package/fesm2022/sdcorejs-angular.mjs +17 -10
  143. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  144. package/package.json +40 -25
  145. package/types/sdcorejs-angular-components-anchor.d.ts +3 -1
  146. package/types/sdcorejs-angular-components-badge.d.ts +1 -0
  147. package/types/sdcorejs-angular-components-ckeditor-styles.d.ts +1 -1
  148. package/types/sdcorejs-angular-components-form-generic.d.ts +44 -33
  149. package/types/sdcorejs-angular-components-import-excel.d.ts +1 -0
  150. package/types/sdcorejs-angular-components-mini-editor.d.ts +1 -1
  151. package/types/sdcorejs-angular-components-modal-resizable.d.ts +92 -0
  152. package/types/sdcorejs-angular-components-modal.d.ts +3 -2
  153. package/types/sdcorejs-angular-components-org-chart.d.ts +6 -0
  154. package/types/sdcorejs-angular-components-preview.d.ts +1 -0
  155. package/types/sdcorejs-angular-components-query-bar.d.ts +55 -17
  156. package/types/sdcorejs-angular-components-query-builder.d.ts +150 -98
  157. package/types/sdcorejs-angular-components-section.d.ts +3 -0
  158. package/types/sdcorejs-angular-components-tab-router.d.ts +19 -19
  159. package/types/sdcorejs-angular-components-table.d.ts +252 -110
  160. package/types/sdcorejs-angular-components-tree.d.ts +48 -30
  161. package/types/sdcorejs-angular-components-upload-file.d.ts +6 -3
  162. package/types/sdcorejs-angular-components.d.ts +6 -1
  163. package/types/sdcorejs-angular-configurations.d.ts +1 -2
  164. package/types/sdcorejs-angular-forms-autocomplete.d.ts +5 -2
  165. package/types/sdcorejs-angular-forms-chip-calendar.d.ts +10 -0
  166. package/types/sdcorejs-angular-forms-date-range.d.ts +14 -2
  167. package/types/sdcorejs-angular-forms-date.d.ts +21 -3
  168. package/types/sdcorejs-angular-forms-datetime.d.ts +13 -2
  169. package/types/sdcorejs-angular-forms-entity-picker.d.ts +9 -3
  170. package/types/sdcorejs-angular-forms-input-color.d.ts +4 -0
  171. package/types/sdcorejs-angular-forms-input-number.d.ts +3 -0
  172. package/types/sdcorejs-angular-forms-input.d.ts +3 -0
  173. package/types/sdcorejs-angular-forms-models.d.ts +146 -5
  174. package/types/sdcorejs-angular-forms-select.d.ts +27 -4
  175. package/types/sdcorejs-angular-forms-switch.d.ts +7 -1
  176. package/types/sdcorejs-angular-forms-textarea.d.ts +5 -3
  177. package/types/sdcorejs-angular-forms-time-range.d.ts +22 -1
  178. package/types/sdcorejs-angular-forms-tree-select.d.ts +36 -5
  179. package/types/sdcorejs-angular-forms.d.ts +22 -13
  180. package/types/sdcorejs-angular-i18n.d.ts +99 -16
  181. package/types/sdcorejs-angular-interceptors.d.ts +13 -3
  182. package/types/sdcorejs-angular-modules-auth.d.ts +1 -1
  183. package/types/sdcorejs-angular-modules-keycloak.d.ts +1 -0
  184. package/types/sdcorejs-angular-modules-layout.d.ts +103 -28
  185. package/types/sdcorejs-angular-modules-permission.d.ts +66 -4
  186. package/types/sdcorejs-angular-pipes.d.ts +27 -5
  187. package/types/sdcorejs-angular-services-api.d.ts +21 -1
  188. package/types/sdcorejs-angular-services-cache.d.ts +11 -1
  189. package/types/sdcorejs-angular-services-notify.d.ts +1 -1
  190. package/types/sdcorejs-angular-services.d.ts +0 -1
  191. package/types/sdcorejs-angular-utilities-extensions.d.ts +83 -61
  192. package/types/sdcorejs-angular-utilities-models.d.ts +2 -76
  193. package/types/sdcorejs-angular.d.ts +11 -2
  194. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  195. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  196. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  197. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  198. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  199. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  200. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  201. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  202. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  203. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  204. package/types/sdcorejs-angular-components-base.d.ts +0 -11
  205. package/types/sdcorejs-angular-components-document-builder.d.ts +0 -252
  206. package/types/sdcorejs-angular-models.d.ts +0 -2
  207. package/types/sdcorejs-angular-services-docx.d.ts +0 -27
  208. package/types/sdcorejs-angular-services-license.d.ts +0 -12
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-query-bar.mjs","sources":["../../../projects/sdcorejs-angular/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/actions-bar/actions-bar.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/actions-bar/actions-bar.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/query-bar.model.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/build-chip/build-chip.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/build-chip/build-chip.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/chip-popover/chip-popover.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/chip-popover/chip-popover.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/field-picker/field-picker.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/field-picker/field-picker.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/inline-chip/inline-chip.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/inline-chip/inline-chip.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/popover-chip/popover-chip.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/popover-chip/popover-chip.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/query-bar.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/query-bar.component.html","../../../projects/sdcorejs-angular/components/query-bar/sdcorejs-angular-components-query-bar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, input, output, signal } from '@angular/core';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { SdQuery, SdSavedFilter } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/**\n * Saved-filters dropdown for `sd-query-bar`.\n *\n * Self-contained: persists the list to `localStorage` under\n * `sd-query-bar:savedFilters:<key>` whenever the host passes a `[key]`. Without a\n * key the dropdown still renders (host can still preview the menu) but the\n * trigger stays disabled.\n *\n * The host owns the live `[query]`: each save snapshots it into a new entry,\n * each apply emits the chosen filter back via `(apply)` for the host to install\n * into its own `filters` / `logic` / `search` model.\n *\n * The save action (`promptSave`) is public so the parent toolbar can place its\n * own \"Lưu bộ lọc\" button anywhere — typically next to the Search trigger.\n */\n@Component({\n selector: 'sd-query-saved-filters-menu',\n templateUrl: './saved-filters-menu.component.html',\n styleUrl: './saved-filters-menu.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatMenuModule, MatTooltipModule],\n})\nexport class SdQuerySavedFiltersMenu {\n /** Namespace key used to scope localStorage. `undefined` → menu disabled. */\n readonly key = input<string | undefined>(undefined);\n\n /** Current query the host wants to snapshot when the user clicks \"Save current\". */\n readonly query = input<SdQuery>({ filters: [], logic: 'AND' });\n\n /** Fired when the user picks a saved filter from the list. */\n readonly apply = output<SdSavedFilter>();\n\n readonly savedFilters = signal<SdSavedFilter[]>([]);\n\n readonly #storageKey = computed<string | undefined>(() => {\n const k = this.key();\n return k ? `sd-query-bar:savedFilters:${k}` : undefined;\n });\n\n // why: reload whenever the namespace key changes (e.g. host switches user/context).\n readonly #loadFilters = effect(() => {\n const storage = this.#storageKey();\n if (!storage) {\n this.savedFilters.set([]);\n return;\n }\n try {\n const raw = localStorage.getItem(storage);\n this.savedFilters.set(raw ? JSON.parse(raw) : []);\n } catch {\n this.savedFilters.set([]);\n }\n });\n\n #persist(filters: SdSavedFilter[]): void {\n const storage = this.#storageKey();\n if (!storage) return;\n try {\n localStorage.setItem(storage, JSON.stringify(filters));\n } catch {\n /* quota / disabled storage — silent */\n }\n }\n\n /**\n * Prompt for a name and append a snapshot of the current query as a new\n * saved filter. Public so the parent toolbar can wire its external \"save\"\n * button to this method without re-implementing persistence.\n */\n promptSave(): void {\n if (!this.#storageKey()) return;\n const name = window.prompt('Tên bộ lọc:');\n if (!name?.trim()) return;\n const filter: SdSavedFilter = {\n id: typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : String(Date.now()),\n name: name.trim(),\n query: this.query(),\n };\n const next = [...this.savedFilters(), filter];\n this.savedFilters.set(next);\n this.#persist(next);\n }\n\n /** Apply a saved filter — host re-installs filters/logic/search via `(apply)`. */\n pick(filter: SdSavedFilter): void {\n this.apply.emit(filter);\n }\n\n /** Delete a saved filter by id. Stops propagation so the parent button doesn't fire `pick`. */\n remove(id: string, ev?: Event): void {\n ev?.stopPropagation();\n const next = this.savedFilters().filter(f => f.id !== id);\n this.savedFilters.set(next);\n this.#persist(next);\n }\n}\n","<button\n type=\"button\"\n class=\"c-saved-filters\"\n [disabled]=\"!key()\"\n [matMenuTriggerFor]=\"menu\"\n [matTooltip]=\"key() ? 'Bộ lọc đã lưu' : 'Cần [savedFiltersKey] để bật'\">\n <sd-icon name=\"bookmark_border\"></sd-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\" class=\"c-saved-filters-menu\" xPosition=\"before\" yPosition=\"below\">\n @for (f of savedFilters(); track f.id) {\n <button type=\"button\" mat-menu-item class=\"c-sf-row\" (click)=\"pick(f)\">\n <sd-icon class=\"c-sf-lead\" name=\"filter_alt\"></sd-icon>\n <span class=\"c-sf-name\">{{ f.name }}</span>\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"c-sf-del\"\n aria-label=\"Xoá bộ lọc\"\n (click)=\"remove(f.id, $event)\"\n (keydown.enter)=\"remove(f.id, $event)\">\n <sd-icon name=\"close\"></sd-icon>\n </span>\n </button>\n } @empty {\n <div class=\"c-sf-empty\">Chưa có bộ lọc nào.</div>\n }\n <!-- why: footer save action sống trong mat-menu để dropdown gom 1 vùng (list +\n save) — user mở dropdown thấy ngay cả 2 hành động, không phải tìm nút lưu\n ở chỗ khác trên toolbar. -->\n <hr class=\"c-sf-divider\" aria-hidden=\"true\" />\n <button type=\"button\" mat-menu-item class=\"c-sf-save\" [disabled]=\"!key()\" (click)=\"promptSave()\">\n <sd-icon name=\"bookmark_add\"></sd-icon>\n <span>Lưu bộ lọc hiện tại</span>\n </button>\n</mat-menu>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { SdQuery, SdQueryLogic, SdSavedFilter } from '../../query-bar.model';\nimport { SdQuerySavedFiltersMenu } from '../saved-filters-menu/saved-filters-menu.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/**\n * Right-pinned toolbar for `sd-query-bar`: AND/OR connector toggle, clear-all,\n * saved-filters dropdown (with footer \"Lưu bộ lọc hiện tại\"), and the deferred\n * Search trigger. Owns no business logic — just routes user intent back via\n * outputs (`(logic)` model, `(clear)`, `(search)`, `(applyFilter)`).\n *\n * The \"save current query\" action lives INSIDE the saved-filters mat-menu\n * footer (one zone for both apply + save). The dropdown trigger sits\n * immediately before Search so the user sees one filter-cluster on the right.\n */\n@Component({\n selector: 'sd-query-actions-bar',\n templateUrl: './actions-bar.component.html',\n styleUrl: './actions-bar.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatTooltipModule, SdQuerySavedFiltersMenu],\n})\nexport class SdQueryActionsBar {\n // AND/OR toggle —\n readonly showLogicToggle = input(false, { transform: booleanAttribute });\n readonly logic = model<SdQueryLogic>('AND');\n readonly filtersCount = input(0);\n\n // Saved filters —\n readonly showSavedFilters = input(false, { transform: booleanAttribute });\n readonly savedFiltersKey = input<string | undefined>(undefined);\n readonly query = input<SdQuery>({ filters: [], logic: 'AND' });\n readonly applyFilter = output<SdSavedFilter>();\n\n // Clear-all —\n readonly showClearAll = input(true, { transform: booleanAttribute });\n readonly clear = output<void>();\n\n // Search trigger —\n readonly canSearch = input(false);\n readonly search = output<void>();\n\n setLogic(value: SdQueryLogic): void {\n if (this.logic() === value) return;\n this.logic.set(value);\n }\n}\n","<!-- Vertical separator between the wrapping filter area (left) and the pinned toolbar. -->\n<span class=\"c-bar-divider\" aria-hidden=\"true\"></span>\n\n<div class=\"c-query-bar__actions\">\n <!-- AND / OR toggle -->\n @if (showLogicToggle() && filtersCount() >= 2) {\n <div class=\"c-logic-toggle\" role=\"group\" aria-label=\"Logic operator\">\n <button\n type=\"button\"\n class=\"c-logic-segment\"\n [class.c-logic-active]=\"logic() === 'AND'\"\n (click)=\"setLogic('AND')\">\n AND\n </button>\n <button\n type=\"button\"\n class=\"c-logic-segment\"\n [class.c-logic-active]=\"logic() === 'OR'\"\n (click)=\"setLogic('OR')\">\n OR\n </button>\n </div>\n }\n\n @if (showClearAll() && filtersCount() > 0) {\n <button\n type=\"button\"\n class=\"c-clear-all\"\n [matTooltip]=\"'Xóa tất cả (' + filtersCount() + ')'\"\n (click)=\"clear.emit()\">\n <sd-icon name=\"delete_sweep\"></sd-icon>\n </button>\n }\n\n <!-- why: saved-filters dropdown đặt sát ngay trước Search — gom toàn bộ\n hành động về bộ lọc (apply view cũ / lưu view hiện tại) cạnh nút submit,\n user thấy 1 cụm. Footer \"Lưu bộ lọc hiện tại\" sống trong mat-menu của\n saved-filters-menu, không tách ra nút riêng nữa. -->\n @if (showSavedFilters()) {\n <sd-query-saved-filters-menu\n [key]=\"savedFiltersKey()\"\n [query]=\"query()\"\n (apply)=\"applyFilter.emit($event)\" />\n }\n\n <!-- why: far-right \"submit at the end of the toolbar\" position; sole query trigger. -->\n <button\n type=\"button\"\n class=\"c-search-trigger\"\n [disabled]=\"!canSearch()\"\n matTooltip=\"Tìm kiếm\"\n (click)=\"search.emit()\">\n <sd-icon name=\"search\"></sd-icon>\n </button>\n</div>\n","import { Signal } from '@angular/core';\nimport { SdSearch } from '@sdcorejs/angular/forms/models';\nimport { Filter, NestedKeyOf, Operator } from '@sdcorejs/utils/models';\n\n// ---------------------------------------------------------------------------\n// Field definitions — discriminated union by `type`, mirroring sd-table column\n// vocabulary. Each consumer declares its searchable fields via `SdQueryField`.\n// ---------------------------------------------------------------------------\n\nexport type SdQueryFieldType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'values' | 'lazy-values';\n\ninterface SdQueryFieldBase<T = any> {\n /** Dot-notation field path (matches `Filter.field`). */\n key: NestedKeyOf<T>;\n /** Human-readable label shown on chip + field picker. */\n label: string;\n /** Material icon name; falls back to `SD_QUERY_TYPE_ICON[type]` then `'tune'`. */\n icon?: string;\n /**\n * Controls the operator selector in the chip popover:\n * - omitted / `false` → **simple mode**: no operator dropdown; the chip always uses\n * `defaultOperator` (or the per-type default). Use this for screens that don't need\n * operator choice.\n * - `true` → show the full operator set for the field's `type`\n * (`SD_QUERY_OPERATORS_BY_TYPE[type]`).\n * - `Operator[]` → show exactly these operators.\n */\n operators?: boolean | Operator[];\n /**\n * Operator the chip starts with. Falls back to `SD_QUERY_DEFAULT_OPERATOR_BY_TYPE[type]`:\n * string→CONTAIN, number→EQUAL, values/lazy-values→IN, boolean→EQUAL, date/datetime→BETWEEN.\n */\n defaultOperator?: Operator;\n /** Field is offered in picker but not interactive (read-only badge in chip). */\n disabled?: boolean;\n}\n\nexport interface SdQueryFieldString<T = any> extends SdQueryFieldBase<T> {\n type: 'string';\n}\n\nexport interface SdQueryFieldNumber<T = any> extends SdQueryFieldBase<T> {\n type: 'number';\n /** Bounds for the input control inside the chip popover. */\n min?: number;\n max?: number;\n /** Step for the number input. */\n step?: number;\n}\n\nexport interface SdQueryFieldBoolean<T = any> extends SdQueryFieldBase<T> {\n type: 'boolean';\n /** Labels rendered for the true/false buttons. Default: \"Có\" / \"Không\". */\n trueLabel?: string;\n falseLabel?: string;\n}\n\nexport interface SdQueryFieldDate<T = any> extends SdQueryFieldBase<T> {\n type: 'date' | 'datetime';\n /** Restrict the picker calendar to this range. */\n min?: Date | string;\n max?: Date | string;\n}\n\n/**\n * Statically-known options (sync array, signal, or one-shot promise).\n * Mirrors `SdTableColumnValues.option`.\n */\nexport interface SdQueryFieldValues<T = any, K = Record<string, any>> extends SdQueryFieldBase<T> {\n type: 'values';\n option: {\n items: K[] | Signal<K[]> | (() => Promise<K[]>);\n valueField: NestedKeyOf<K>;\n displayField: NestedKeyOf<K>;\n };\n}\n\n/**\n * Server-backed options — searchable, paginated. Mirrors `SdTableColumnLazyValues.option`.\n * `search` is the unified `SdSearch<K>` callback used by `sd-select`: it handles\n * `{ type: 'SEARCH', searchText }` for live queries and `{ type: 'VALUE', value }` for\n * resolving chip-display labels of already-selected IDs.\n */\nexport interface SdQueryFieldLazyValues<T = any, K = Record<string, any>> extends SdQueryFieldBase<T> {\n type: 'lazy-values';\n option: {\n search: SdSearch<K>;\n valueField: NestedKeyOf<K>;\n displayField: NestedKeyOf<K>;\n };\n}\n\nexport type SdQueryField<T = any> =\n | SdQueryFieldString<T>\n | SdQueryFieldNumber<T>\n | SdQueryFieldBoolean<T>\n | SdQueryFieldDate<T>\n | SdQueryFieldValues<T>\n | SdQueryFieldLazyValues<T>;\n\n// ---------------------------------------------------------------------------\n// Output model — `SdQuery` is the canonical payload emitted via `[(query)]`.\n// It composes the reusable `Filter[]` from utils plus query-bar-only metadata\n// (global logic, free-text search). Callers can also bind `[(filters)]` alone\n// when they don't need logic/search.\n// ---------------------------------------------------------------------------\n\nexport type SdQueryLogic = 'AND' | 'OR';\n\nexport interface SdQuery<T = any> {\n filters: Filter<T>[];\n /** Global connector between filters. Defaults to `'AND'`. */\n logic?: SdQueryLogic;\n /** Free-text search box (only present when `showSearch=true`). */\n search?: string;\n}\n\nexport interface SdQueryBarOption<T = any> {\n /** Prefix for auto-generated `data-autoid` on inner controls. */\n autoId?: string;\n /** Available fields the user can filter by. */\n fields: SdQueryField<T>[];\n /** Initial active filter chips. */\n filters?: Filter<T>[];\n /** Initial global connector between filters. */\n logic?: SdQueryLogic;\n /** Initial free-text search string. */\n search?: string;\n mode?: 'popover' | 'inline';\n density?: 'compact' | 'comfortable';\n showSearch?: boolean;\n showSavedFilters?: boolean;\n savedFiltersKey?: string;\n showLogicToggle?: boolean;\n showClearAll?: boolean;\n showOperatorOnChip?: boolean;\n onQueryChange?: (query: SdQuery<T>) => void;\n onApply?: (query: SdQuery<T>) => void;\n}\n\n/** Persisted bookmark of a query (filters + logic + search) — managed by `[savedFiltersKey]`. */\nexport interface SdSavedFilter<T = any> {\n id: string;\n name: string;\n query: SdQuery<T>;\n}\n\n/**\n * Transient state of the in-progress chip during inline-mode token build (field →\n * operator → value). Lives at the parent (`SdQueryBar.building()`) and is rendered\n * by `<sd-query-build-chip>`. Step transitions:\n * - 'operator' — operator menu open, waiting for the user to pick a condition\n * - 'value' — operator locked, value picker / seamless input is the focus\n */\nexport interface BuildingChip<T = any> {\n field: SdQueryField<T>;\n operator?: Operator;\n step: 'operator' | 'value';\n value?: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Full operator set per field type — used when `operators: true`. */\nexport const SD_QUERY_OPERATORS_BY_TYPE: Record<SdQueryFieldType, Operator[]> = {\n string: ['CONTAIN', 'EQUAL', 'NOT_EQUAL', 'START_WITH', 'END_WITH', 'NULL', 'NOT_NULL'],\n number: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'GREATER_OR_EQUAL', 'LESS_THAN', 'LESS_OR_EQUAL', 'BETWEEN'],\n boolean: ['EQUAL'],\n date: ['EQUAL', 'BETWEEN', 'GREATER_THAN', 'LESS_THAN'],\n datetime: ['EQUAL', 'BETWEEN', 'GREATER_THAN', 'LESS_THAN'],\n values: ['IN', 'NOT_IN', 'NULL', 'NOT_NULL'],\n 'lazy-values': ['IN', 'NOT_IN', 'NULL', 'NOT_NULL'],\n};\n\n/** Default operator when a chip is created and `field.defaultOperator` is not set. */\nexport const SD_QUERY_DEFAULT_OPERATOR_BY_TYPE: Record<SdQueryFieldType, Operator> = {\n string: 'CONTAIN',\n number: 'EQUAL',\n boolean: 'EQUAL',\n date: 'BETWEEN',\n datetime: 'BETWEEN',\n values: 'IN',\n 'lazy-values': 'IN',\n};\n\n/** Icon fallback per field type when `SdQueryField.icon` is not set. */\nexport const SD_QUERY_TYPE_ICON: Record<SdQueryFieldType, string> = {\n string: 'text_fields',\n number: 'tag',\n boolean: 'toggle_on',\n date: 'event',\n datetime: 'schedule',\n values: 'list',\n 'lazy-values': 'list',\n};\n\n/**\n * Resolves the icon shown on chips and in the field picker.\n * Priority: `field.icon` → `SD_QUERY_TYPE_ICON[field.type]` → `'tune'`.\n */\nexport function sdQueryFieldIcon(field: SdQueryField): string {\n return field.icon ?? SD_QUERY_TYPE_ICON[field.type] ?? 'tune';\n}\n\n/** Operators that carry no data — value section is hidden in chip popover. */\nexport const SD_QUERY_NO_DATA_OPERATORS: Operator[] = ['NULL', 'NOT_NULL'];\n\n/** Operators that carry an array payload — UI offers multi-select. */\nexport const SD_QUERY_MULTI_OPERATORS: Operator[] = ['IN', 'NOT_IN'];\n\n/** Picks the initial operator when a new chip is created for `field`. */\nexport function sdQueryDefaultOperator(field: SdQueryField): Operator {\n if (field.defaultOperator) return field.defaultOperator;\n return SD_QUERY_DEFAULT_OPERATOR_BY_TYPE[field.type];\n}\n\n/**\n * Operators offered in the chip popover for `field`:\n * - `operators === true` → full set for the type\n * - `operators` is an array → that array (deduped against the type set is the caller's job)\n * - otherwise (simple mode) → just the single default operator (no real choice)\n */\nexport function sdQueryAllowedOperators(field: SdQueryField): Operator[] {\n if (field.operators === true) return SD_QUERY_OPERATORS_BY_TYPE[field.type];\n if (Array.isArray(field.operators) && field.operators.length > 0) return field.operators;\n return [sdQueryDefaultOperator(field)];\n}\n\n/**\n * Whether the operator selector should be visible. Simple mode (operators omitted/false,\n * or an array with a single entry) hides the dropdown — the chip uses one fixed operator.\n */\nexport function sdQueryShowOperatorSelector(field: SdQueryField): boolean {\n return sdQueryAllowedOperators(field).length > 1;\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, input, output, signal, viewChild } from '@angular/core';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdInlineText } from '@sdcorejs/angular/forms/inline-text';\nimport { Operator } from '@sdcorejs/utils/models';\n\nimport { SD_QUERY_NO_DATA_OPERATORS, SdQueryField, sdQueryFieldIcon } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ninterface Range {\n from?: any;\n to?: any;\n}\ntype ChipState = 'pending' | 'active' | 'focus' | 'error';\n\n/**\n * Seamless inline value chip for `string` / `number` fields (inline mode only).\n *\n * why: the pill itself IS the input — one border, no nested rectangle control. The\n * label + value + remove live in three flush segments inside a single pill envelope.\n * Mirrors refs/design_handoff_sd_query_bar \"Seamless string/number chip\" handoff.\n *\n * Commit model matches inline mode: edits write back via `(valueChange)` immediately\n * (host folds into `filters` without emitting); the bar's Search button stays the only\n * query trigger. Enter commits + blurs, Esc reverts + blurs, blur commits.\n */\n@Component({\n selector: 'sd-query-inline-value-chip',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, SdOperator, SdInlineText],\n templateUrl: './inline-value-chip.component.html',\n styleUrl: './inline-value-chip.component.scss',\n})\nexport class SdQueryInlineValueChip {\n /** Field this chip filters by — must be kind `string` or `number`. */\n readonly field = input.required<SdQueryField>();\n /** Active operator (drives BETWEEN dual-input + no-data hiding). */\n readonly operator = input<Operator>('CONTAIN');\n /** Current value: scalar for most operators, `{ from, to }` for BETWEEN. */\n readonly value = input<unknown>(null);\n readonly density = input<'compact' | 'comfortable'>('compact');\n /** Show the operator label as a small pill inside the label segment. */\n readonly showOperator = input(false);\n /** Prefix for the inner input's `data-autoid`. */\n readonly autoId = input<string | undefined>(undefined);\n /** Focus the first input on creation — used for the in-progress build chip. */\n readonly autofocus = input(false);\n\n /** Emitted on commit (Enter / blur) with the parsed next value. */\n readonly valueChange = output<unknown>();\n /** Emitted when the user clicks the × segment. */\n readonly remove = output<void>();\n\n private readonly firstInput = viewChild<SdInlineText>('firstInput');\n\n readonly focused = signal(false);\n readonly hasError = signal(false);\n\n /** Editable drafts — single value, plus from/to for BETWEEN. Seeded from `value`. */\n readonly draft = signal('');\n readonly draftFrom = signal('');\n readonly draftTo = signal('');\n\n readonly isNumber = computed(() => this.field().type === 'number');\n readonly isBetween = computed(() => this.operator() === 'BETWEEN');\n readonly isNoData = computed(() => SD_QUERY_NO_DATA_OPERATORS.includes(this.operator()));\n\n readonly icon = computed(() => sdQueryFieldIcon(this.field()));\n\n readonly ph = computed(() => (this.isNumber() ? 'giá trị' : 'nhập…'));\n readonly phFrom = computed(() => (this.isNumber() ? 'Từ' : 'từ…'));\n readonly phTo = computed(() => (this.isNumber() ? 'Đến' : 'đến…'));\n\n readonly hasValue = computed(() => {\n if (this.isNoData()) return true;\n const v = this.value();\n if (this.isBetween()) {\n const r = (v ?? {}) as Range;\n return (r.from != null && r.from !== '') || (r.to != null && r.to !== '');\n }\n return v != null && v !== '';\n });\n\n readonly state = computed<ChipState>(() => {\n if (this.hasError()) return 'error';\n if (this.focused()) return 'focus';\n return this.hasValue() ? 'active' : 'pending';\n });\n\n constructor() {\n // Reseed drafts whenever the bound value / operator / kind changes. While the user\n // types, none of those change (commit is on blur), so this never clobbers an edit.\n effect(() => {\n const v = this.value();\n if (this.isBetween()) {\n const r = (v ?? {}) as Range;\n this.draftFrom.set(this.#format(r.from));\n this.draftTo.set(this.#format(r.to));\n } else {\n this.draft.set(this.#format(v));\n }\n });\n\n // why: the build chip lands focused (autofocus) so the user types straight away —\n // <sd-inline-text> owns that via its own [autofocus] input, so no afterNextRender here.\n }\n\n /** Click anywhere in the pill (except × or an input) focuses the first input. */\n focusFromShell(ev: Event): void {\n const target = ev.target as HTMLElement;\n if (target.closest('.c-seamless__x') || target.closest('input')) return;\n this.firstInput()?.focus();\n }\n\n onFocus(): void {\n this.focused.set(true);\n }\n\n /** Commit a single-value field (string / number, non-BETWEEN). */\n commitSingle(): void {\n this.focused.set(false);\n const parsed = this.#parse(this.draft());\n if (!parsed.ok) {\n this.hasError.set(true);\n return;\n }\n this.hasError.set(false);\n this.valueChange.emit(parsed.value);\n }\n\n /** Commit a BETWEEN range — both ends parsed, emitted as `{ from, to }`. */\n commitRange(): void {\n this.focused.set(false);\n const from = this.#parse(this.draftFrom());\n const to = this.#parse(this.draftTo());\n if (!from.ok || !to.ok) {\n this.hasError.set(true);\n return;\n }\n this.hasError.set(false);\n this.valueChange.emit({ from: from.value, to: to.value });\n }\n\n /** Esc — revert drafts to the committed value and blur without emitting. */\n revertAndBlur(ref?: { blur: () => void }): void {\n const v = this.value();\n if (this.isBetween()) {\n const r = (v ?? {}) as Range;\n this.draftFrom.set(this.#format(r.from));\n this.draftTo.set(this.#format(r.to));\n } else {\n this.draft.set(this.#format(v));\n }\n this.hasError.set(false);\n this.focused.set(false);\n ref?.blur();\n }\n\n onRemove(ev: Event): void {\n ev.stopPropagation();\n this.remove.emit();\n }\n\n /** Format a stored value for display — number → vi-VN grouped digits. */\n #format(v: any): string {\n if (v == null || v === '') return '';\n if (this.isNumber()) {\n const n = typeof v === 'number' ? v : Number(String(v).replace(/\\./g, ''));\n return Number.isFinite(n) ? n.toLocaleString('vi-VN') : String(v);\n }\n return String(v);\n }\n\n /** Parse a draft back to a stored value. Number kind rejects non-numeric input. */\n #parse(s: string): { ok: boolean; value: any } {\n const t = (s ?? '').trim();\n if (t === '') return { ok: true, value: this.isNumber() ? null : '' };\n if (this.isNumber()) {\n // vi-VN groups thousands with '.', so strip dots + spaces, then require a plain\n // (optionally negative) integer — anything else (letters, stray symbols) is an error.\n const cleaned = t.replace(/[.\\s]/g, '');\n if (!/^-?\\d+$/.test(cleaned)) return { ok: false, value: t };\n const n = Number(cleaned);\n return Number.isFinite(n) ? { ok: true, value: n } : { ok: false, value: t };\n }\n return { ok: true, value: t };\n }\n}\n","<!--\n Seamless string/number chip — the pill IS the input. One border, three flush\n segments: label · input(s) · ×. State styling driven by [data-state]. The value\n field is the shared <sd-inline-text> primitive (chrome=\"seamless\") so width hugs\n content; the chip keeps the envelope + parse/commit logic.\n-->\n@let _state = state();\n@let _autoId = autoId();\n@let _isNoData = isNoData();\n@let _density = density();\n@let _operator = operator();\n\n<span\n class=\"c-seamless\"\n [attr.data-state]=\"_state\"\n [class.c-seamless--compact]=\"_density === 'compact'\"\n [class.c-seamless--comfortable]=\"_density === 'comfortable'\"\n (click)=\"focusFromShell($event)\">\n\n <!-- Label segment: icon + field name (+ optional operator pill) -->\n <span class=\"c-seamless__label\">\n <sd-icon class=\"c-seamless__icon\" [name]=\"icon()\"></sd-icon>\n <span class=\"c-seamless__field\">{{ field().label }}</span>\n @if (showOperator() && !_isNoData) {\n <sd-operator class=\"c-seamless__op\" [operators]=\"[_operator]\" [model]=\"_operator\" [disabled]=\"true\" />\n } @else if (!_isNoData) {\n <span class=\"c-seamless__sep\">:</span>\n }\n </span>\n\n <!-- Input segment — seamless borderless primitive; hidden for NULL / NOT_NULL -->\n @if (!_isNoData) {\n <span class=\"c-seamless__input\">\n @if (isBetween()) {\n <sd-inline-text\n #firstInput\n chrome=\"seamless\"\n [clearable]=\"false\"\n [autofocus]=\"autofocus()\"\n [state]=\"_state\"\n [value]=\"draftFrom()\"\n (valueChange)=\"draftFrom.set($event)\"\n [placeholder]=\"phFrom()\"\n [autoId]=\"_autoId ? _autoId + '-from' : undefined\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"commitRange()\"\n (keyupEnter)=\"firstInput.blur()\"\n (keydownEscape)=\"revertAndBlur(firstInput)\" />\n <span class=\"c-seamless__dash\" aria-hidden=\"true\">—</span>\n <sd-inline-text\n #secondInput\n chrome=\"seamless\"\n [clearable]=\"false\"\n [state]=\"_state\"\n [value]=\"draftTo()\"\n (valueChange)=\"draftTo.set($event)\"\n [placeholder]=\"phTo()\"\n [autoId]=\"_autoId ? _autoId + '-to' : undefined\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"commitRange()\"\n (keyupEnter)=\"secondInput.blur()\"\n (keydownEscape)=\"revertAndBlur(secondInput)\" />\n } @else {\n <sd-inline-text\n #firstInput\n chrome=\"seamless\"\n [clearable]=\"false\"\n [autofocus]=\"autofocus()\"\n [state]=\"_state\"\n [value]=\"draft()\"\n (valueChange)=\"draft.set($event)\"\n [placeholder]=\"ph()\"\n [autoId]=\"_autoId ?? undefined\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"commitSingle()\"\n (keyupEnter)=\"firstInput.blur()\"\n (keydownEscape)=\"revertAndBlur(firstInput)\" />\n }\n </span>\n }\n\n <!-- × segment -->\n <button type=\"button\" class=\"c-seamless__x\" aria-label=\"Remove filter\" (click)=\"onRemove($event)\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n</span>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, output, viewChild } from '@angular/core';\n\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { Operator } from '@sdcorejs/utils/models';\n\nimport { SdQueryInlineValueChip } from '../inline-value-chip/inline-value-chip.component';\nimport { BuildingChip } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ntype Density = 'compact' | 'comfortable';\n\n/**\n * Visual block for the in-progress build chip (inline mode token builder).\n *\n * why: tách khỏi `<sd-query-bar>` để parent chỉ giữ state (`building()` signal +\n * step transitions) — tất cả render logic của 2 step (operator picker / value\n * picker) cộng với 7 nhánh field type sống tại đây.\n *\n * The chip has two visually distinct branches:\n * - **Seamless** (`string` / `number`) — the entire pill IS an `<sd-query-inline-value-chip>`\n * (its own border, autofocused input). The host's `.c-token-building` shell is skipped.\n * - **Token** (`values` / `lazy-values` / `date` / `datetime` / `boolean` / other) —\n * `.c-token.c-token-building` dashed pill with field label + operator (menu in\n * operator step, disabled badge in value step) + the per-type picker + × cancel.\n */\n@Component({\n selector: 'sd-query-build-chip',\n templateUrl: './build-chip.component.html',\n styleUrl: './build-chip.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, CommonModule, SdOperator, SdDate, SdDateRange, SdDatetime, SdInput, SdInputNumber, SdSelect, SdQueryInlineValueChip],\n})\nexport class SdQueryBuildChip {\n /** Current build state — drives every visual branch. */\n readonly building = input.required<BuildingChip>();\n\n /** Density preset — forwarded to the seamless chip + sizes the .c-token row. */\n readonly density = input<Density>('compact');\n\n /** Operator set offered in the operator-step menu (parent's `allowedOperatorsFor(field)`). */\n readonly allowedOperators = input<Operator[]>([]);\n\n /** Whether the active operator is a multi-select (`IN`/`NOT_IN`) — drives sd-select [multiple]. */\n readonly multiple = input(false);\n\n /** Show the operator label on the seamless chip's pill (forwarded to inline-value-chip). */\n readonly showOperator = input(false);\n\n /**\n * Prefix for `data-autoid` on the inner picker / seamless input.\n * why: parent originally hard-coded `'qb-build-value'` everywhere; default preserves that\n * for backward compatibility with existing e2e selectors.\n */\n readonly autoId = input<string>('qb-build-value');\n\n // ---------------------------------------------------------------------------\n // Outputs\n // ---------------------------------------------------------------------------\n\n /** Operator chosen from the operator-step menu — parent advances to value step. */\n readonly pickOperator = output<Operator>();\n\n /**\n * Value committed from a non-seamless picker (sd-select / sd-date / sd-date-range /\n * sd-datetime) or a boolean toggle. Parent pushes the completed chip and clears building.\n */\n readonly commitValue = output<unknown>();\n\n /** × button — abandon the build (parent clears `building` signal). */\n readonly cancel = output<void>();\n\n /**\n * Commit from the seamless (string / number) branch. Parent decides empty → cancel\n * vs push complete (see `onBuildSeamlessCommit`); this just forwards the raw value.\n */\n readonly seamlessCommit = output<unknown>();\n\n /** Fallback editor (boolean ng-template / other) — staged draft on every change. */\n readonly draftChange = output<unknown>();\n\n /** Fallback editor — Enter / click commits the staged draft. */\n readonly draftCommit = output<void>();\n\n // ---------------------------------------------------------------------------\n // Internal refs — used by parent via public open*() methods\n // ---------------------------------------------------------------------------\n\n /** Operator-step menu — auto-opened by parent right after `building` enters operator step. */\n private readonly opMenu = viewChild<SdOperator>('buildOperator');\n\n /** Value-step picker (the active bare control) — auto-opened by parent at value step. */\n private readonly picker = viewChild<SdSelect | SdDate | SdDatetime | SdDateRange>('bPicker');\n\n /** Open the operator menu — parent calls after rendering the operator step. */\n openOperator(): void {\n this.opMenu()?.open();\n }\n\n /** Open the value-step picker's native panel — parent calls after rendering the value step. */\n openPicker(): void {\n (this.picker() as any)?.open?.();\n }\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n /** True when the seamless branch (string/number value step) should be rendered. */\n readonly isSeamless = computed<boolean>(() => {\n const b = this.building();\n if (b.step !== 'value') return false;\n const t = b.field.type;\n return t === 'string' || t === 'number';\n });\n}\n","<!--\n In-progress chip (inline-mode token build flow).\n Seamless string/number branch keeps its own pill; everything else renders inside\n the dashed .c-token.c-token-building shell.\n-->\n@let _building = building();\n@let _autoId = autoId();\n\n@if (isSeamless()) {\n <sd-query-inline-value-chip\n [field]=\"_building.field\"\n [operator]=\"$any(_building.operator)\"\n [value]=\"_building.value ?? null\"\n [density]=\"density()\"\n [showOperator]=\"showOperator()\"\n [autoId]=\"_autoId\"\n [autofocus]=\"true\"\n (valueChange)=\"seamlessCommit.emit($event)\"\n (remove)=\"cancel.emit()\" />\n} @else {\n <div class=\"c-token c-token-building\">\n <span class=\"c-token-field\">{{ _building.field.label }}</span>\n\n @if (_building.step === 'operator') {\n <sd-operator\n #buildOperator\n class=\"c-token-op\"\n [operators]=\"allowedOperators()\"\n [model]=\"_building.operator\"\n (modelChange)=\"pickOperator.emit($any($event))\" />\n } @else {\n <!-- why: badge readonly cho operator đã chọn — vẫn render <sd-operator>\n để giữ thị giác giống chip hoàn thành (icon + tooltip). -->\n <sd-operator\n class=\"c-token-op\"\n [operators]=\"[$any(_building.operator)]\"\n [model]=\"$any(_building.operator)\"\n [disabled]=\"true\" />\n\n @if (_building.field.type === 'values' || _building.field.type === 'lazy-values') {\n @let _bopt = $any(_building.field).option;\n <span class=\"c-token-value c-token-value-edit\">\n <sd-select #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\" minWidthPanel=\"300px\"\n [autoId]=\"_autoId\"\n [items]=\"_building.field.type === 'lazy-values' ? $any(_bopt).search : $any(_bopt.items)\"\n [valueField]=\"_bopt.valueField\"\n [displayField]=\"_bopt.displayField\"\n [multiple]=\"multiple()\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\">\n <!-- why: build chip multi-select cũng cần \"head +N\" để gọn (giống completed chip). -->\n <ng-template #sdValue let-selectedItems=\"selectedItems\">\n @if ((selectedItems?.length ?? 0) > 1) {\n <span class=\"c-token-multi-head\">{{ $any(selectedItems)[0][_bopt.displayField] }}</span> +{{ selectedItems.length - 1 }}\n } @else if ((selectedItems?.length ?? 0) === 1) {\n <span class=\"c-token-multi-head\">{{ $any(selectedItems)[0][_bopt.displayField] }}</span>\n }\n </ng-template>\n </sd-select>\n </span>\n } @else if (_building.field.type === 'date') {\n <span class=\"c-token-value c-token-value-edit\">\n @if (_building.operator === 'BETWEEN') {\n <!-- why: 1 sd-date-range thay 2 sd-date — gọn hơn, hành vi thống nhất với completed chip. -->\n <sd-date-range #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\"></sd-date-range>\n } @else {\n <sd-date #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\"></sd-date>\n }\n </span>\n } @else if (_building.field.type === 'datetime') {\n <span class=\"c-token-value c-token-value-edit\">\n @if (_building.operator === 'BETWEEN') {\n <!-- why: datetime BETWEEN downgrade về date-range (mất time precision; đã thống nhất). -->\n <sd-date-range #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\"></sd-date-range>\n } @else {\n <sd-datetime #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\"></sd-datetime>\n }\n </span>\n } @else if (_building.field.type === 'boolean') {\n <!-- why: native button thay sd-button (tránh mat-button baseline 36px gây tràn).\n Pill nhỏ vẽ bằng CSS scoped trong chip — giữ semantic colour qua class\n .c-bool-true / .c-bool-false. -->\n <span class=\"c-token-value c-token-value-edit c-bool-toggle\">\n <button\n type=\"button\"\n class=\"c-bool-btn c-bool-true\"\n [class.c-bool-active]=\"_building.value === true\"\n [attr.data-autoId]=\"_autoId + '-true'\"\n (click)=\"commitValue.emit(true)\">\n {{ $any(_building.field).trueLabel || 'Có' }}\n </button>\n <button\n type=\"button\"\n class=\"c-bool-btn c-bool-false\"\n [class.c-bool-active]=\"_building.value === false\"\n [attr.data-autoId]=\"_autoId + '-false'\"\n (click)=\"commitValue.emit(false)\">\n {{ $any(_building.field).falseLabel || 'Không' }}\n </button>\n </span>\n } @else {\n <!-- Fallback (e.g. unforeseen type) — generic sd-input wired via draft outputs. -->\n <span class=\"c-token-value c-token-value-edit\">\n <sd-input size=\"sm\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"draftChange.emit($event)\"\n (keyupEnter)=\"draftCommit.emit()\"></sd-input>\n </span>\n }\n }\n\n <button type=\"button\" class=\"c-token-remove\" aria-label=\"Cancel\" (click)=\"cancel.emit()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, isSignal, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatMenu, MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { isObservable } from 'rxjs';\n\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { Filter, Operator } from '@sdcorejs/utils/models';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\nimport {\n SD_QUERY_MULTI_OPERATORS,\n SD_QUERY_NO_DATA_OPERATORS,\n SdQueryField,\n sdQueryAllowedOperators,\n sdQueryFieldIcon,\n sdQueryShowOperatorSelector,\n} from '../../query-bar.model';\n\ninterface Range {\n from?: string | number | null;\n to?: string | number | null;\n}\n\n/**\n * Popover-mode chip editor — the entire `<mat-menu>` that opens when a popover-mode\n * chip is clicked. Owns ALL operator+value staging signals and async option loading.\n *\n * why: tách khỏi `<sd-query-bar>` để parent chỉ giữ `editingIndex` (chip nào đang\n * mở) + nhận `(commit)` khi popover đóng. Mỗi lần parent gọi `seed(filter, field)`\n * trước khi mở chip popover, child reset staging signals + kích option loading.\n *\n * Public surface (template ref `#cp`):\n * - `cp.menu()` — the `<mat-menu>` to feed `[menu]` of `<sd-query-popover-chip>`\n * - `cp.seed(filter, field)` — parent reseeds staging before opening\n * - `(commit)` output — emitted on mat-menu close with staged Filter\n * - `(swapField)` output — emitted when the nested field switcher picks a new field\n */\n@Component({\n selector: 'sd-query-chip-popover',\n templateUrl: './chip-popover.component.html',\n styleUrl: './chip-popover.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n MatMenuModule,\n MatTooltipModule,\n SdButton,\n SdOperator,\n SdSelect,\n SdInput,\n SdInputNumber,\n SdDate,\n SdDatetime,\n ],\n})\nexport class SdQueryChipPopover {\n // ---------------------------------------------------------------------------\n // Inputs\n // ---------------------------------------------------------------------------\n\n /** Resolved field of the currently editing chip — parent passes from `fieldByKey()`. */\n readonly field = input<SdQueryField | undefined>(undefined);\n\n /** The chip's current Filter — used by `seed()` for initial staging values. */\n readonly filter = input<Filter | undefined>(undefined);\n\n /** Optional chip index — embedded in the composed autoIds. */\n readonly chipIndex = input<number | null>(null);\n\n /** Prefix for `data-autoId` on inner controls. */\n readonly autoIdBase = input<string>('qb');\n\n /** MatMenu for the field switcher — parent passes its `<sd-query-field-picker>` menu. */\n readonly switchPickerMenu = input<MatMenu | undefined>(undefined);\n\n // ---------------------------------------------------------------------------\n // Outputs\n // ---------------------------------------------------------------------------\n\n /** Emitted when mat-menu closes — parent splices `next` into filters[idx]. */\n readonly commit = output<Filter>();\n\n /** Emitted when nested field-switcher picks a new field — parent calls changeFilterField. */\n readonly swapField = output<SdQueryField>();\n\n // ---------------------------------------------------------------------------\n // Staging signals — uncommitted edits, committed on menu close.\n // ---------------------------------------------------------------------------\n\n /** Staged operator. */\n readonly editingOperator = signal<Operator>('EQUAL');\n /** Staged value (shape depends on field type + operator). */\n readonly editingValue = signal<unknown>(null);\n /** Resolved option list for values / lazy-values. */\n readonly editingOptions = signal<any[]>([]);\n /** Loading flag for async option fetch. */\n readonly editingOptionsLoading = signal(false);\n\n // ---------------------------------------------------------------------------\n // Derived state\n // ---------------------------------------------------------------------------\n\n readonly allowedOperators = computed<Operator[]>(() => {\n const f = this.field();\n return f ? sdQueryAllowedOperators(f) : [];\n });\n\n readonly showOperatorSelector = computed<boolean>(() => {\n const f = this.field();\n return f ? sdQueryShowOperatorSelector(f) : false;\n });\n\n /** Whether the staged operator is multi-select (IN/NOT_IN). */\n multiple(op?: Operator): boolean {\n return SD_QUERY_MULTI_OPERATORS.includes(op ?? this.editingOperator());\n }\n\n /** Whether the staged operator carries no data (NULL/NOT_NULL). */\n isNoDataOperator(op: Operator | string): boolean {\n return SD_QUERY_NO_DATA_OPERATORS.includes(op as Operator);\n }\n\n /** Compose an autoId for an inner control (`<base>-chip<idx>-<role>`). */\n chipAutoId(role: string): string {\n const base = this.autoIdBase() ?? 'qb';\n const idx = this.chipIndex();\n return `${base}-chip${idx ?? 'x'}-${role}`;\n }\n\n readonly iconFor = sdQueryFieldIcon;\n\n // ---------------------------------------------------------------------------\n // mat-menu instance — parent reads via `cp.menu()`\n // ---------------------------------------------------------------------------\n\n readonly menu = viewChild<MatMenu>('menu');\n\n // ---------------------------------------------------------------------------\n // Seed — parent calls before opening the popover so staging signals are\n // primed from the current filter + the option list is loaded.\n // ---------------------------------------------------------------------------\n\n /** Reseed staging from a new filter/field pair — call before opening the menu. */\n seed(filter: Filter | undefined, field: SdQueryField | undefined): void {\n if (!filter || !field) {\n this.editingOperator.set('EQUAL');\n this.editingValue.set(null);\n this.editingOptions.set([]);\n this.editingOptionsLoading.set(false);\n return;\n }\n this.editingOperator.set((filter as any).operator as Operator);\n this.editingValue.set((filter as any).data ?? null);\n\n if (field.type === 'values') {\n this.#loadValuesOptions(field);\n } else if (field.type === 'lazy-values') {\n this.#loadLazyOptions(field);\n } else {\n this.editingOptions.set([]);\n this.editingOptionsLoading.set(false);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Operator + value mutators\n // ---------------------------------------------------------------------------\n\n /** Called on operator change in the popover header — reshapes value when family changes. */\n onEditingOperatorChange(next: Operator): void {\n const prev = this.editingOperator();\n this.editingOperator.set(next);\n\n if (SD_QUERY_NO_DATA_OPERATORS.includes(next)) {\n this.editingValue.set(null);\n return;\n }\n if (next === 'BETWEEN') {\n const v = this.editingValue();\n if (v && typeof v === 'object' && 'from' in (v as any)) return;\n this.editingValue.set({ from: null, to: null } as Range);\n return;\n }\n const goingToMulti = SD_QUERY_MULTI_OPERATORS.includes(next);\n const wasMulti = SD_QUERY_MULTI_OPERATORS.includes(prev as Operator);\n if (goingToMulti && !wasMulti) {\n const v = this.editingValue();\n this.editingValue.set(v == null ? [] : [v]);\n } else if (!goingToMulti && wasMulti) {\n const v = this.editingValue();\n this.editingValue.set(Array.isArray(v) && v.length > 0 ? v[0] : null);\n }\n }\n\n /** Single-value input change. */\n onEditingValueInput(value: unknown): void {\n this.editingValue.set(value);\n }\n\n /** BETWEEN range — mutate only `.from`. */\n onEditingRangeFrom(value: string | number | null): void {\n const v = (this.editingValue() as Range) ?? {};\n this.editingValue.set({ ...v, from: value });\n }\n\n /** BETWEEN range — mutate only `.to`. */\n onEditingRangeTo(value: string | number | null): void {\n const v = (this.editingValue() as Range) ?? {};\n this.editingValue.set({ ...v, to: value });\n }\n\n /** Toggle a value in the staged multi-select array. */\n toggleEditingMultiValue(value: unknown): void {\n const arr = Array.isArray(this.editingValue()) ? [...(this.editingValue() as unknown[])] : [];\n const idx = arr.indexOf(value);\n if (idx >= 0) arr.splice(idx, 1);\n else arr.push(value);\n this.editingValue.set(arr);\n }\n\n isEditingMultiSelected(value: unknown): boolean {\n const v = this.editingValue();\n return Array.isArray(v) && v.includes(value);\n }\n\n // ---------------------------------------------------------------------------\n // Menu lifecycle — close = commit\n // ---------------------------------------------------------------------------\n\n /**\n * mat-menu's (closed) handler — compose the next Filter from staging signals and\n * emit (commit). Parent splices into its filters[] and nulls editingIndex.\n */\n onMenuClosed(): void {\n const f = this.filter();\n if (!f) return;\n const next: Filter = {\n field: (f as any).field,\n operator: this.editingOperator(),\n data: this.editingValue(),\n } as Filter;\n this.commit.emit(next);\n }\n\n // ---------------------------------------------------------------------------\n // Async option loaders — same logic as the parent's private methods.\n // ---------------------------------------------------------------------------\n\n #loadValuesOptions(field: SdQueryField): void {\n const opt = (field as any).option;\n const items = opt?.items;\n if (Array.isArray(items)) {\n this.editingOptions.set(items);\n this.editingOptionsLoading.set(false);\n return;\n }\n if (isSignal(items)) {\n this.editingOptions.set((items as any)());\n this.editingOptionsLoading.set(false);\n return;\n }\n if (typeof items === 'function') {\n this.editingOptionsLoading.set(true);\n Promise.resolve(items())\n .then((arr: any[]) => this.editingOptions.set(arr ?? []))\n .finally(() => this.editingOptionsLoading.set(false));\n }\n }\n\n #loadLazyOptions(field: SdQueryField, search = ''): void {\n const opt = (field as any).option;\n if (!opt?.search) return;\n this.editingOptionsLoading.set(true);\n const result = opt.search({ type: 'SEARCH', searchText: search });\n if (isObservable(result)) {\n (result as any).subscribe({\n next: (arr: any[]) => this.editingOptions.set(arr ?? []),\n complete: () => this.editingOptionsLoading.set(false),\n error: () => this.editingOptionsLoading.set(false),\n });\n } else {\n Promise.resolve(result)\n .then((arr: any[]) => this.editingOptions.set(arr ?? []))\n .finally(() => this.editingOptionsLoading.set(false));\n }\n }\n}\n","<!--\n Chip popover — operator + value editor for the popover-mode chip.\n Visual layout mirrors the previous inline `<mat-menu #chipPopover>` in query-bar.\n Body branches on operator + field.type — 8 paths preserved exactly.\n-->\n<mat-menu #menu=\"matMenu\" class=\"c-chip-popover\" xPosition=\"after\" yPosition=\"below\" (closed)=\"onMenuClosed()\">\n <ng-template matMenuContent>\n @let _field = field();\n @let _editingOperator = editingOperator();\n @let _editingValue = editingValue();\n @let _editingOptions = editingOptions();\n @let _editingOptionsLoading = editingOptionsLoading();\n @let _switchPickerMenu = switchPickerMenu();\n\n @if (_field) {\n <div class=\"c-pop-header\" (click)=\"$event.stopPropagation()\">\n <sd-icon [name]=\"iconFor(_field)\"></sd-icon>\n <!-- why: nested mat-menu trigger to swap the chip's field — parent provides\n the field-picker MatMenu via [switchPickerMenu]. -->\n @if (_switchPickerMenu) {\n <button\n type=\"button\"\n class=\"c-pop-header-field\"\n [matMenuTriggerFor]=\"_switchPickerMenu\"\n matTooltip=\"Đổi field\">\n <span>{{ _field.label }}</span>\n <sd-icon name=\"unfold_more\"></sd-icon>\n </button>\n } @else {\n <span class=\"c-pop-header-field\">{{ _field.label }}</span>\n }\n <!-- Operator selector (right-aligned). Disabled when field has ≤1 operator. -->\n <sd-operator\n class=\"c-pop-header-operator\"\n [autoId]=\"chipAutoId('operator')\"\n [operators]=\"allowedOperators()\"\n [model]=\"_editingOperator\"\n [disabled]=\"!showOperatorSelector()\"\n (modelChange)=\"onEditingOperatorChange($any($event))\" />\n </div>\n\n <div class=\"c-pop-body\" (click)=\"$event.stopPropagation()\">\n @if (!isNoDataOperator(_editingOperator)) {\n @if (_editingOperator === 'BETWEEN') {\n @if (_field.type === 'date') {\n <div class=\"c-pop-between\">\n <sd-date size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-from')\"\n placeholder=\"Từ\"\n [model]=\"$any(_editingValue)?.from\"\n (sdChange)=\"onEditingRangeFrom($event)\">\n </sd-date>\n <sd-date size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-to')\"\n placeholder=\"Đến\"\n [model]=\"$any(_editingValue)?.to\"\n (sdChange)=\"onEditingRangeTo($event)\">\n </sd-date>\n </div>\n } @else if (_field.type === 'datetime') {\n <div class=\"c-pop-between\">\n <sd-datetime size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-from')\"\n placeholder=\"Từ\"\n [model]=\"$any(_editingValue)?.from\"\n (sdChange)=\"onEditingRangeFrom($event)\">\n </sd-datetime>\n <sd-datetime size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-to')\"\n placeholder=\"Đến\"\n [model]=\"$any(_editingValue)?.to\"\n (sdChange)=\"onEditingRangeTo($event)\">\n </sd-datetime>\n </div>\n } @else {\n <div class=\"c-pop-between\">\n <sd-input-number size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-from')\"\n placeholder=\"Từ\"\n [model]=\"$any(_editingValue)?.from\"\n (sdChange)=\"onEditingRangeFrom($event)\">\n </sd-input-number>\n <sd-input-number size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-to')\"\n placeholder=\"Đến\"\n [model]=\"$any(_editingValue)?.to\"\n (sdChange)=\"onEditingRangeTo($event)\">\n </sd-input-number>\n </div>\n }\n } @else if (_field.type === 'boolean') {\n <div class=\"c-pop-boolean c-bool-toggle\">\n <sd-button\n [autoId]=\"chipAutoId('value-true')\"\n [type]=\"_editingValue === true ? 'fill' : 'outline'\"\n color=\"success\"\n [title]=\"$any(_field).trueLabel || 'Có'\"\n (click)=\"onEditingValueInput(true)\">\n </sd-button>\n <sd-button\n [autoId]=\"chipAutoId('value-false')\"\n [type]=\"_editingValue === false ? 'fill' : 'outline'\"\n color=\"warning\"\n [title]=\"$any(_field).falseLabel || 'Không'\"\n (click)=\"onEditingValueInput(false)\">\n </sd-button>\n </div>\n } @else if (_field.type === 'values' || _field.type === 'lazy-values') {\n @let _opt = $any(_field).option;\n <sd-select size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n placeholder=\"Chọn giá trị\"\n [items]=\"_editingOptions\"\n [valueField]=\"_opt.valueField\"\n [displayField]=\"_opt.displayField\"\n [multiple]=\"multiple()\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-select>\n @if (_editingOptionsLoading) {\n <div class=\"c-pop-values-loading\">Đang tải...</div>\n }\n } @else if (_field.type === 'date') {\n <sd-date size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n placeholder=\"Chọn giá trị\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-date>\n } @else if (_field.type === 'datetime') {\n <sd-datetime size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n placeholder=\"Chọn giá trị\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-datetime>\n } @else if (_field.type === 'number') {\n <sd-input-number size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n placeholder=\"Nhập giá trị\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-input-number>\n } @else {\n <sd-input size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n placeholder=\"Nhập giá trị\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-input>\n }\n }\n </div>\n }\n </ng-template>\n</mat-menu>\n","import { ChangeDetectionStrategy, Component, computed, input, output, viewChild } from '@angular/core';\nimport { MatMenu, MatMenuModule } from '@angular/material/menu';\n\nimport { SdQueryField, sdQueryFieldIcon } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/**\n * Field picker mat-menu for `sd-query-bar`.\n *\n * Shared between two flows in the bar:\n * - \"Add filter\" — pass `[usedKeys]` (a Set of field keys already on the bar) so\n * those entries render disabled with a check.\n * - \"Đổi field\" inside the chip popover — pass `[currentKey]` to disable the\n * currently-bound field.\n *\n * Parent triggers via `[matMenuTriggerFor]=\"picker.menu()\"` and receives the\n * chosen field through `(pick)`.\n */\n@Component({\n selector: 'sd-query-field-picker',\n templateUrl: './field-picker.component.html',\n styleUrl: './field-picker.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatMenuModule],\n})\nexport class SdQueryFieldPicker {\n /** Field list shown in the menu (caller-supplied; rendered in input order). */\n readonly fields = input<SdQueryField[]>([]);\n\n /** Single key disabled with a trailing check — used in the chip-popover \"Đổi field\" flow. */\n readonly currentKey = input<string | undefined>(undefined);\n\n /** Set of keys already in use — used in the \"Add filter\" flow to grey out duplicates. */\n readonly usedKeys = input<Set<string>>(new Set<string>());\n\n /** Emits when the user picks an enabled field. */\n readonly pick = output<SdQueryField>();\n\n /** MatMenu instance — parent binds `[matMenuTriggerFor]=\"picker.menu()\"`. */\n readonly menu = viewChild.required(MatMenu);\n\n readonly iconFor = sdQueryFieldIcon;\n\n /** Per-field disabled state — current key OR used key OR field's own disabled flag. */\n readonly disabledMap = computed<Set<string>>(() => {\n const set = new Set(this.usedKeys());\n const cur = this.currentKey();\n if (cur) set.add(cur);\n return set;\n });\n\n isDisabled(field: SdQueryField): boolean {\n return field.disabled === true || this.disabledMap().has(field.key as string);\n }\n\n /** \"Current\" check icon — only when the field matches `currentKey`. */\n isCurrent(field: SdQueryField): boolean {\n return field.key === this.currentKey();\n }\n\n /** \"Used\" check icon — when the field is in `usedKeys` (not the same as current). */\n isUsed(field: SdQueryField): boolean {\n return this.usedKeys().has(field.key as string);\n }\n}\n","<mat-menu #m=\"matMenu\" xPosition=\"after\" yPosition=\"below\" class=\"c-field-picker-menu\">\n @for (field of fields(); track $index) {\n <button\n type=\"button\"\n mat-menu-item\n [disabled]=\"isDisabled(field)\"\n (click)=\"pick.emit(field)\">\n <sd-icon class=\"c-field-item-icon\" [name]=\"iconFor(field)\"></sd-icon>\n <span class=\"c-field-item-label\">{{ field.label }}</span>\n <span class=\"c-field-item-type\">{{ field.type }}</span>\n @if (isCurrent(field) || isUsed(field)) {\n <sd-icon class=\"c-field-item-check\" name=\"check\"></sd-icon>\n }\n </button>\n } @empty {\n <div class=\"c-field-empty\">Chưa có field nào được cấu hình.</div>\n }\n</mat-menu>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\n\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { Filter, Operator } from '@sdcorejs/utils/models';\n\nimport { SdQueryField, sdQueryFieldIcon } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ntype Density = 'compact' | 'comfortable';\n\n/**\n * Completed inline chip (non-string/number — those use `<sd-query-inline-value-chip>`).\n *\n * why: tách edit lifecycle ra khỏi parent `<sd-query-bar>` — child tự quản lý\n * `isEditing` signal, auto-open picker, focusout exit. Parent chỉ pass field/filter\n * và nhận commit/remove outputs.\n *\n * Covers types: boolean, date, datetime, values, lazy-values, plus a fallback else\n * branch. BETWEEN (date / datetime) uses a single `<sd-date-range>` (datetime\n * downgrades to date precision).\n *\n * why: `values` / `lazy-values` đã chuyển sang `<sd-select [viewed]=\"'inline'\">` — sd-select\n * tự quản click→edit + focusout→thoát + bare editor, nên các nhánh đó KHÔNG dùng\n * `enterEdit` / `onFocusOut` / `#editing` nữa. Các nhánh còn lại (boolean / date / datetime /\n * BETWEEN) vẫn dùng lifecycle thủ công cho tới khi control tương ứng có inline mode (rollout).\n */\n@Component({\n selector: 'sd-query-inline-chip',\n templateUrl: './inline-chip.component.html',\n styleUrl: './inline-chip.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, CommonModule, SdOperator, SdDate, SdDateRange, SdDatetime, SdSelect],\n})\nexport class SdQueryInlineChip {\n // ---------------------------------------------------------------------------\n // Inputs\n // ---------------------------------------------------------------------------\n\n /** Resolved field — parent passes it (no lookup needed inside). */\n readonly field = input.required<SdQueryField>();\n\n /** The chip's Filter — used for `data` + `operator`. */\n readonly filter = input.required<Filter>();\n\n /** Density preset — sizes the `.c-token` row. */\n readonly density = input<Density>('compact');\n\n /** Whether the active operator is a multi-select (IN/NOT_IN). */\n readonly multiple = input(false);\n\n /** Show `<sd-operator>` (disabled badge) on the chip; otherwise show `':'` separator. */\n readonly showOperator = input(false);\n\n /** autoId prefix for inner controls (parent passes `inlineAutoId(i, 'value')`). */\n readonly autoId = input<string>('');\n\n /** Pre-computed display text — parent owns `chipValueText(filter)` so we don't recompute. */\n readonly valueText = input<string>('');\n\n /** No-data operator (NULL/NOT_NULL) — hide entire value slot when true. */\n readonly isNoData = input(false);\n\n // ---------------------------------------------------------------------------\n // Outputs\n // ---------------------------------------------------------------------------\n\n /** Single-value commit — parent runs `updateFilter(i, { data })`. */\n readonly commit = output<unknown>();\n\n /** BETWEEN commit (date/datetime) — parent runs `setFilterRange(i, ev)`. */\n readonly commitRange = output<{ from: unknown; to: unknown } | null>();\n\n /** Live edit during multi-select — parent runs `editValueFn(i)(v)`. */\n readonly liveChange = output<unknown>();\n\n /** × removal. */\n readonly remove = output<void>();\n\n // ---------------------------------------------------------------------------\n // Internal state\n // ---------------------------------------------------------------------------\n\n /**\n * Edit toggle for the BOOLEAN branch only — viewed (false) ↔ toggle buttons (true).\n * why: boolean isn't a `viewed`-aware form control (no inline mode); it keeps the chip's own\n * click-to-edit. values/date/datetime/BETWEEN delegate to their control's `viewed='inline'`.\n */\n readonly #editing = signal(false);\n readonly editing = this.#editing.asReadonly();\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n readonly iconName = computed<string>(() => sdQueryFieldIcon(this.field()));\n\n /** Operator code — convenience accessor for template. */\n readonly operator = computed<Operator>(() => (this.filter() as any).operator as Operator);\n\n /** Data payload — convenience accessor for template. */\n readonly data = computed<unknown>(() => (this.filter() as any).data);\n\n // ---------------------------------------------------------------------------\n // Edit lifecycle\n // ---------------------------------------------------------------------------\n\n /** Enter edit mode (BOOLEAN branch — shows the toggle buttons; exits on toggle commit). */\n enterEdit(): void {\n if (this.#editing()) return;\n this.#editing.set(true);\n }\n\n // ---------------------------------------------------------------------------\n // Commit handlers — single emit per category\n // ---------------------------------------------------------------------------\n\n /**\n * Single-value commit (sd-date, sd-datetime, single sd-select).\n * why: date/datetime/values render via `viewed='inline'` (self-managed) — the chip only\n * forwards the value; it no longer toggles `#editing` (that's boolean-only now).\n */\n emitSingleCommit(v: unknown): void {\n this.commit.emit(v);\n }\n\n /** BETWEEN commit — sd-date-range (viewed='inline') emits `{from, to}`; chip just forwards it. */\n emitRangeCommit(ev: { from: unknown; to: unknown } | null): void {\n this.commitRange.emit(ev ?? null);\n }\n\n /** Multi-select live emit (sd-select inline). */\n emitLive(v: unknown): void {\n this.liveChange.emit(v);\n }\n\n /** Boolean toggle commit — exits edit. */\n emitBoolean(v: boolean): void {\n this.commit.emit(v);\n this.#editing.set(false);\n }\n}\n","<!--\n Completed inline chip — non-string/number/seamless branches.\n Edit lifecycle is self-managed: click enters edit + auto-opens picker,\n focusout outside the wrapper exits edit, picker emits commit single OR\n liveChange (multi) OR commitRange (BETWEEN).\n-->\n@let _field = field();\n@let _operator = operator();\n@let _data = data();\n@let _multiple = multiple();\n@let _editing = editing();\n@let _isNoData = isNoData();\n@let _autoId = autoId();\n\n<div class=\"c-token\" [class.c-token-editing]=\"_editing\">\n <sd-icon class=\"c-token-icon\" [name]=\"iconName()\"></sd-icon>\n <span class=\"c-token-field\">{{ _field.label }}</span>\n\n @if (!_isNoData && showOperator()) {\n <sd-operator class=\"c-token-op\" [operators]=\"[_operator]\" [model]=\"_operator\" [disabled]=\"true\" />\n } @else if (!_isNoData) {\n <span class=\"c-token-sep\">:</span>\n }\n\n @if (!_isNoData) {\n @if (_field.type === 'boolean') {\n @if (_editing) {\n <!-- why: native button thay sd-button — mat-button MDC baseline 36px buộc\n phải hack height/padding overrides; chip 28/32px nhỏ hơn nhiều. Tự vẽ\n pill nhỏ với CSS scoped trong chip, không qua MDC, gọn + chuẩn baseline. -->\n <span class=\"c-token-value c-token-value-edit c-bool-toggle\">\n <button\n type=\"button\"\n class=\"c-bool-btn c-bool-true\"\n [class.c-bool-active]=\"_data === true\"\n [attr.data-autoId]=\"_autoId + '-true'\"\n (click)=\"emitBoolean(true)\">\n {{ $any(_field).trueLabel || 'Có' }}\n </button>\n <button\n type=\"button\"\n class=\"c-bool-btn c-bool-false\"\n [class.c-bool-active]=\"_data === false\"\n [attr.data-autoId]=\"_autoId + '-false'\"\n (click)=\"emitBoolean(false)\">\n {{ $any(_field).falseLabel || 'Không' }}\n </button>\n </span>\n } @else {\n <button type=\"button\" class=\"c-token-value\" (click)=\"enterEdit()\">{{ valueText() }}</button>\n }\n } @else if ((_field.type === 'date' || _field.type === 'datetime') && _operator === 'BETWEEN') {\n <!-- why: sd-date-range [viewed]=\"'inline'\" tự quản click→edit + focusout (datetime downgrade về date).\n Chip không wiring lifecycle nữa; [clearable]=false vì chip có × riêng. -->\n <span class=\"c-token-value c-token-value-edit\">\n <sd-date-range size=\"sm\"\n [autoId]=\"_autoId\"\n [viewed]=\"'inline'\"\n [clearable]=\"false\"\n [model]=\"$any(_data)\"\n (sdChange)=\"emitRangeCommit($any($event))\"></sd-date-range>\n </span>\n } @else if (_field.type === 'values' || _field.type === 'lazy-values') {\n @let _opt = $any(_field).option;\n <!-- why: sd-select [viewed]=\"'inline'\" tự quản click→edit + focusout→thoát + bare editor.\n Chip không wiring lifecycle cho nhánh này nữa (bỏ enterEdit/onFocusOut/bare). -->\n <span class=\"c-token-value c-token-value-edit\">\n <sd-select #chipPicker size=\"sm\" minWidthPanel=\"300px\"\n [autoId]=\"_autoId\"\n [items]=\"_field.type === 'lazy-values' ? $any(_opt).search : $any(_opt.items)\"\n [valueField]=\"_opt.valueField\"\n [displayField]=\"_opt.displayField\"\n [multiple]=\"_multiple\"\n [viewed]=\"'inline'\"\n [clearable]=\"false\"\n [model]=\"$any(_data)\"\n (sdChange)=\"_multiple ? emitLive($event) : emitSingleCommit($event)\">\n <!-- why: viewed mode mặc định dùng comma-joined cho multi — quá dài cho chip.\n Override bằng template \"head +N\" giống popover chipValueText. -->\n <ng-template #sdValue let-selectedItems=\"selectedItems\">\n @if ((selectedItems?.length ?? 0) > 1) {\n <span class=\"c-token-multi-head\">{{ $any(selectedItems)[0][_opt.displayField] }}</span> +{{ selectedItems.length - 1 }}\n } @else if ((selectedItems?.length ?? 0) === 1) {\n <span class=\"c-token-multi-head\">{{ $any(selectedItems)[0][_opt.displayField] }}</span>\n }\n </ng-template>\n </sd-select>\n </span>\n } @else if (_field.type === 'date') {\n <span class=\"c-token-value c-token-value-edit\">\n <sd-date size=\"sm\"\n [autoId]=\"_autoId\"\n [viewed]=\"'inline'\"\n [clearable]=\"false\"\n [model]=\"$any(_data)\"\n (sdChange)=\"emitSingleCommit($any($event))\"></sd-date>\n </span>\n } @else if (_field.type === 'datetime') {\n <span class=\"c-token-value c-token-value-edit\">\n <sd-datetime size=\"sm\"\n [autoId]=\"_autoId\"\n [viewed]=\"'inline'\"\n [clearable]=\"false\"\n [model]=\"$any(_data)\"\n (sdChange)=\"emitSingleCommit($any($event))\"></sd-datetime>\n </span>\n } @else {\n <!-- Fallback (unforeseen type) — read-only display via valueText. -->\n <span class=\"c-token-value\">{{ valueText() }}</span>\n }\n }\n\n <button type=\"button\" class=\"c-token-remove\" aria-label=\"Remove filter\" (click)=\"remove.emit()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n</div>\n","import { ChangeDetectionStrategy, Component, input, output, viewChild } from '@angular/core';\nimport { MatMenu, MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { Filter, Operator } from '@sdcorejs/utils/models';\n\nimport { SdQueryField, sdQueryFieldIcon } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/**\n * Compact popover-mode chip face. Click → opens the parent-supplied [menu] (mat-menu\n * containing the chip editor). Inert div[role=button] so the nested <sd-operator>\n * doesn't end up as a button-in-button (invalid HTML).\n */\n@Component({\n selector: 'sd-query-popover-chip',\n templateUrl: './popover-chip.component.html',\n styleUrl: './popover-chip.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatMenuModule, MatTooltipModule, SdOperator],\n})\nexport class SdQueryPopoverChip {\n /** Resolved field (from the bar's `fieldByKey()` map). `undefined` → render raw key. */\n readonly field = input<SdQueryField | undefined>(undefined);\n\n /** The chip's filter — used to read `field` / `operator` / `data` for display text. */\n readonly filter = input.required<Filter>();\n\n /** \"Active\" = chip has a real value or is no-data op. Drives layout + colour. */\n readonly active = input.required<boolean>();\n\n /** Operator visible on the chip face (else hidden, \":\" separator). */\n readonly showOperator = input(false);\n\n /** Rendered value text for the value slot. */\n readonly valueText = input<string>('');\n\n /** Chip popover mat-menu instance supplied by the parent. */\n readonly menu = input.required<MatMenu>();\n\n /** Fired when the chip popover opens (parent seeds its editing state). */\n readonly open = output<void>();\n /** Fired when the user clicks the × removal icon. */\n readonly remove = output<void>();\n\n readonly iconFor = sdQueryFieldIcon;\n\n filterField(): string {\n return (this.filter() as any).field as string;\n }\n filterOperator(): Operator {\n return (this.filter() as any).operator as Operator;\n }\n\n // why: parent's add/swap flow auto-opens the chip popover after render, and removeFilter\n // closes the open one — expose open/close so the parent doesn't need a ViewChild on the\n // internal MatMenuTrigger directive.\n private readonly trigger = viewChild('chipTrigger', { read: MatMenuTrigger });\n openMenu(): void {\n this.trigger()?.openMenu();\n }\n closeMenu(): void {\n this.trigger()?.closeMenu();\n }\n}\n","<!-- why: div[role=button] (not <button>) so the nested <sd-operator> isn't button-in-button (invalid HTML). -->\n@let _active = active();\n@let _field = field();\n@let _filterField = filterField();\n@let _filterOperator = filterOperator();\n\n<div\n #chipTrigger=\"matMenuTrigger\"\n role=\"button\"\n tabindex=\"0\"\n class=\"c-chip\"\n [class.c-chip-active]=\"_active\"\n [class.c-chip-inactive]=\"!_active\"\n [attr.data-field]=\"_filterField\"\n [matTooltip]=\"_field?.label || _filterField\"\n [matMenuTriggerFor]=\"menu()\"\n (menuOpened)=\"open.emit()\"\n (keydown.enter)=\"chipTrigger.openMenu()\"\n (keydown.space)=\"$event.preventDefault(); chipTrigger.openMenu()\">\n <sd-icon class=\"c-chip-icon\" [name]=\"_field ? iconFor(_field) : 'tune'\"></sd-icon>\n <span class=\"c-chip-label\">{{ _field?.label || _filterField }}</span>\n\n @if (showOperator() && _active) {\n <sd-operator class=\"c-chip-operator\" [operators]=\"[_filterOperator]\" [model]=\"_filterOperator\" [disabled]=\"true\" />\n } @else if (_active) {\n <span class=\"c-chip-sep\">:</span>\n }\n\n @if (_active) {\n <span class=\"c-chip-value\">{{ valueText() }}</span>\n }\n\n <sd-icon class=\"c-chip-chevron\" name=\"arrow_drop_down\"></sd-icon>\n\n @if (_active) {\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"c-chip-remove\"\n aria-label=\"Remove filter\"\n (click)=\"$event.stopPropagation(); remove.emit()\"\n (keydown.enter)=\"$event.stopPropagation(); remove.emit()\">\n <sd-icon name=\"close\"></sd-icon>\n </span>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n Injector,\n input,\n isSignal,\n model,\n output,\n signal,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { Filter, Operator } from '@sdcorejs/utils/models';\n\nimport { SdQueryActionsBar } from './components/actions-bar/actions-bar.component';\nimport { SdQueryBuildChip } from './components/build-chip/build-chip.component';\nimport { SdQueryChipPopover } from './components/chip-popover/chip-popover.component';\nimport { SdQueryFieldPicker } from './components/field-picker/field-picker.component';\nimport { SdQueryInlineChip } from './components/inline-chip/inline-chip.component';\nimport { SdQueryInlineValueChip } from './components/inline-value-chip/inline-value-chip.component';\nimport { SdQueryPopoverChip } from './components/popover-chip/popover-chip.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport {\n BuildingChip,\n SD_QUERY_MULTI_OPERATORS,\n SD_QUERY_NO_DATA_OPERATORS,\n SdQuery,\n SdQueryBarOption,\n SdQueryField,\n SdQueryLogic,\n SdSavedFilter,\n sdQueryAllowedOperators,\n sdQueryDefaultOperator,\n sdQueryFieldIcon,\n} from './query-bar.model';\n\ntype Density = 'compact' | 'comfortable';\ninterface Range {\n from?: string | number | null;\n to?: string | number | null;\n}\n\n/** Shared empty array — stable reference so template bindings don't churn change detection. */\nconst EMPTY_ARRAY: any[] = [];\n\n@Component({\n selector: 'sd-query-bar',\n templateUrl: './query-bar.component.html',\n styleUrls: ['./query-bar.component.scss', './query-bar.controls.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n MatMenuModule,\n MatTooltipModule,\n SdQueryActionsBar,\n SdQueryBuildChip,\n SdQueryChipPopover,\n SdQueryFieldPicker,\n SdQueryInlineChip,\n SdQueryInlineValueChip,\n SdQueryPopoverChip,\n ],\n})\nexport class SdQueryBar {\n readonly #i18n = inject(I18nService);\n readonly #injector = inject(Injector);\n\n /** All popover-mode chips in order — used to auto-open after addFilter / close before removeFilter. */\n readonly popoverChips = viewChildren(SdQueryPopoverChip);\n\n /** The extracted in-progress chip — owns operator menu + value picker view refs. */\n private readonly buildChip = viewChild(SdQueryBuildChip);\n\n /** The extracted chip popover — owns operator+value staging + commit-on-close. */\n readonly chipPopover = viewChild(SdQueryChipPopover);\n\n /**\n * Land the user in the value editor after the build chip reaches the value step:\n * popover-kind controls auto-open their native picker via the child; string/number\n * branches use the seamless chip whose `[autofocus]` handles focus internally.\n */\n #enterValueStep(field: SdQueryField): void {\n const k = field.type;\n if (k === 'values' || k === 'lazy-values' || k === 'date' || k === 'datetime') {\n afterNextRender(() => this.buildChip()?.openPicker(), { injector: this.#injector });\n }\n // why: string/number branch — <sd-query-inline-value-chip [autofocus]> tự focus,\n // không cần parent gọi thêm.\n }\n\n // ---------------------------------------------------------------------------\n // Inputs — all accept null|undefined at boundary, transform to canonical shape\n // ---------------------------------------------------------------------------\n\n /** Main option object. Prefer this API for new usage; individual inputs stay as a migration bridge. */\n readonly option = input<SdQueryBarOption | undefined>(undefined);\n\n /** Prefix for auto-generated `data-autoid` on inner controls (chips, operator/value editors, buttons). */\n readonly autoIdInput = input<string | undefined, string | null | undefined>(undefined, {\n alias: 'autoId',\n transform: (v): string | undefined => v ?? undefined,\n });\n\n /** Available fields the user can filter by. Required for the field picker. */\n readonly fields = input<SdQueryField[], SdQueryField[] | null | undefined>([], {\n transform: (v): SdQueryField[] => (Array.isArray(v) ? v : []),\n });\n\n /**\n * Active filter chips. Two-way bindable via `[(filters)]`.\n * Use this when you only need a flat `Filter[]` (no global logic / search box).\n */\n readonly filters = model<Filter[]>([]);\n\n /**\n * Global connector between filters. Two-way bindable via `[(logic)]`.\n * Only meaningful when `showLogicToggle=true` and there are ≥2 filters.\n */\n readonly logic = model<SdQueryLogic>('AND');\n\n /** Free-text search string. Two-way bindable via `[(search)]`. Only shown when `showSearch=true`. */\n readonly search = model<string>('');\n\n /**\n * Editing mode:\n * - `'popover'` (default) → compact chips; click a chip to edit operator + value in a\n * mat-menu popover, commit with \"Áp dụng\".\n * - `'inline'` → GitLab-style. Each filter's operator + value controls render directly\n * on the bar (no popup, no per-filter apply). Edits update `filters` live; the user\n * presses the search button (or Enter) once to fire `(apply)`.\n */\n readonly mode = input<'popover' | 'inline', 'popover' | 'inline' | null | undefined>('popover', {\n transform: (v): 'popover' | 'inline' => v || 'popover',\n });\n\n /** Density preset — chip / control height. */\n readonly density = input<Density, Density | null | undefined>('compact', {\n transform: (v): Density => v || 'compact',\n });\n\n /** Show free-text search input on the left. */\n readonly showSearch = input(false, { transform: booleanAttribute });\n\n /** Show saved-filters dropdown on the right. Requires `[savedFiltersKey]` to actually persist. */\n readonly showSavedFilters = input(false, { transform: booleanAttribute });\n\n /**\n * Namespace key for persisting saved filters to `localStorage`. When set, the saved-filters\n * dropdown loads/saves under `sd-query-bar:savedFilters:<key>`. Leave undefined to disable.\n */\n readonly savedFiltersKey = input<string | undefined>(undefined);\n\n /**\n * Snapshot of the current query — fed into `<sd-query-saved-filters-menu [query]>` so\n * saving a filter captures live filters/logic/search.\n */\n readonly currentQuery = computed<SdQuery>(() => this.#buildQuery());\n\n /** Receive an applied filter from the saved-filters menu — re-install bar state + trigger apply. */\n onApplyFilter(saved: SdSavedFilter): void {\n this.filters.set(saved.query.filters ?? []);\n this.logic.set(saved.query.logic ?? 'AND');\n if (saved.query.search !== undefined) this.search.set(saved.query.search);\n this.triggerApply();\n }\n\n /** Show AND/OR segmented toggle (renders only when there are ≥2 filters). */\n readonly showLogicToggle = input(false, { transform: booleanAttribute });\n\n /** Show \"Clear all\" button when at least one filter is active. */\n readonly showClearAll = input(true, { transform: booleanAttribute });\n\n /** Render the operator label on the chip face (default: hidden — operator only visible in popover). */\n readonly showOperatorOnChip = input(false, { transform: booleanAttribute });\n\n // ---------------------------------------------------------------------------\n // Outputs\n // ---------------------------------------------------------------------------\n\n /** Composite payload — emitted whenever filters / logic / search change. */\n readonly queryChange = output<SdQuery>();\n\n /** Fires when the user presses \"Áp dụng\" inside a chip popover — host should reload data. */\n readonly apply = output<SdQuery>();\n\n // ---------------------------------------------------------------------------\n // Derived state\n // ---------------------------------------------------------------------------\n\n /** Map of `field.key` → `SdQueryField` for fast lookup from filters[]. */\n readonly resolvedAutoId = computed(() => this.option()?.autoId ?? this.autoIdInput() ?? undefined);\n readonly resolvedFields = computed(() => this.option()?.fields ?? this.fields());\n readonly resolvedMode = computed(() => this.option()?.mode ?? this.mode());\n readonly resolvedDensity = computed(() => this.option()?.density ?? this.density());\n readonly resolvedShowSearch = computed(() => this.option()?.showSearch ?? this.showSearch());\n readonly resolvedShowSavedFilters = computed(() => this.option()?.showSavedFilters ?? this.showSavedFilters());\n readonly resolvedSavedFiltersKey = computed(() => this.option()?.savedFiltersKey ?? this.savedFiltersKey());\n readonly resolvedShowLogicToggle = computed(() => this.option()?.showLogicToggle ?? this.showLogicToggle());\n readonly resolvedShowClearAll = computed(() => this.option()?.showClearAll ?? this.showClearAll());\n readonly resolvedShowOperatorOnChip = computed(() => this.option()?.showOperatorOnChip ?? this.showOperatorOnChip());\n\n constructor() {\n effect(() => {\n const option = this.option();\n if (!option) return;\n untracked(() => {\n if (option.filters && this.filters() !== option.filters) this.filters.set(option.filters);\n if (option.logic && this.logic() !== option.logic) this.logic.set(option.logic);\n if (option.search !== undefined && this.search() !== option.search) this.search.set(option.search);\n });\n });\n }\n\n readonly fieldByKey = computed<Record<string, SdQueryField>>(() => {\n const map: Record<string, SdQueryField> = {};\n for (const f of this.resolvedFields()) map[f.key as string] = f;\n return map;\n });\n\n /** Field keys already chained on a chip — the picker greys these out. */\n readonly usedFieldKeys = computed<Set<string>>(() => {\n const set = new Set<string>();\n for (const f of this.filters()) {\n if ('field' in f && typeof f.field === 'string') set.add(f.field);\n }\n return set;\n });\n\n /** Render the global AND/OR connector text between chips when `logic === 'OR'`. */\n readonly showOrConnector = computed(() => this.resolvedShowLogicToggle() && this.logic() === 'OR' && this.filters().length >= 2);\n\n /** Search button is actionable only when there is something to apply. */\n readonly canSearch = computed(() => this.filters().length > 0 || this.search().trim().length > 0);\n\n // ---------------------------------------------------------------------------\n // Chip popover state — only `editingIndex` lives on the parent; the\n // `<sd-query-chip-popover>` child owns ALL staging (operator + value + options).\n // ---------------------------------------------------------------------------\n\n /** Index of the chip whose popover is open. Reset to null after commit / close. */\n readonly editingIndex = signal<number | null>(null);\n\n /** Resolved field of the chip whose popover is currently open (or null). */\n readonly editingField = computed<SdQueryField | null>(() => {\n const idx = this.editingIndex();\n if (idx === null) return null;\n const f = this.filters()[idx];\n if (!f || !('field' in f)) return null;\n return this.fieldByKey()[f.field as string] ?? null;\n });\n\n /**\n * Multi-select is derived from the operator (IN / NOT_IN) — not a field flag.\n * Only called by inline-mode + build-mode templates with a known operator;\n * popover-mode chips read `multiple()` from the child popover directly.\n */\n multiple(op: Operator): boolean {\n return SD_QUERY_MULTI_OPERATORS.includes(op);\n }\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n readonly iconFor = sdQueryFieldIcon;\n\n /** Chip is \"active\" when it has a non-empty value OR a no-data operator (NULL/NOT_NULL). */\n isFilterActive(filter: Filter): boolean {\n if (SD_QUERY_NO_DATA_OPERATORS.includes(filter.operator as Operator)) return true;\n const data = (filter as any).data;\n if (data === null || data === undefined || data === '') return false;\n if (Array.isArray(data) && data.length === 0) return false;\n return true;\n }\n\n /** Rendered value text on a chip. */\n chipValueText(filter: Filter): string {\n if (SD_QUERY_NO_DATA_OPERATORS.includes(filter.operator as Operator)) return '';\n const data = (filter as any).data;\n if (data === null || data === undefined) return '';\n if (filter.operator === 'BETWEEN' && data && typeof data === 'object') {\n return `${data.from ?? ''} — ${data.to ?? ''}`;\n }\n if (Array.isArray(data)) {\n if (data.length === 0) return '';\n const head = this.#displayOne(filter, data[0]);\n return data.length > 1 ? `${head} +${data.length - 1}` : head;\n }\n return this.#displayOne(filter, data);\n }\n\n isNoDataOperator(op: Operator | string): boolean {\n return SD_QUERY_NO_DATA_OPERATORS.includes(op as Operator);\n }\n\n // ---------------------------------------------------------------------------\n // Inline mode — per-field helpers + live mutators (no popover / no Apply gate)\n // ---------------------------------------------------------------------------\n\n /** The single in-progress inline chip (not yet in `filters`). */\n readonly #building = signal<BuildingChip | null>(null);\n readonly building = this.#building.asReadonly();\n\n allowedOperatorsFor(field: SdQueryField): Operator[] {\n return sdQueryAllowedOperators(field);\n }\n\n inlineAutoId(index: number, role: string): string {\n const base = this.resolvedAutoId() ?? 'qb';\n return `${base}-inline${index}-${role}`;\n }\n\n // ---------------------------------------------------------------------------\n // Inline mode — progressive token build flow (field → operator → value)\n // ---------------------------------------------------------------------------\n\n /** Append a completed chip to `filters` WITHOUT emitting (inline mode commits on Search). */\n #pushComplete(field: SdQueryField, operator: Operator, value: unknown): void {\n let data: unknown = value;\n if (SD_QUERY_NO_DATA_OPERATORS.includes(operator)) data = null;\n else if (operator === 'BETWEEN') {\n if (!data || typeof data !== 'object') data = { from: null, to: null };\n } else if (SD_QUERY_MULTI_OPERATORS.includes(operator)) {\n data = Array.isArray(data) ? data : value == null ? [] : [value];\n }\n const next = { field: field.key as any, operator, data } as Filter;\n this.filters.set([...this.filters(), next]);\n }\n\n /** Entry point from the field picker — start building a chip for `field`. */\n beginBuild(field: SdQueryField): void {\n const allowed = sdQueryAllowedOperators(field);\n const def = sdQueryDefaultOperator(field);\n // why: date/datetime mặc định là BETWEEN — skip operator step để user vào value\n // step ngay (95% case dùng BETWEEN cho date/datetime; cắt 1 click cho luồng phổ\n // biến nhất). Field type khác giữ flow chọn operator để user thấy đầy đủ lựa chọn.\n const skipOperatorStep = (field.type === 'date' || field.type === 'datetime') && allowed.includes(def);\n if (allowed.length > 1 && !skipOperatorStep) {\n this.#building.set({ field, step: 'operator' });\n // why: auto-open the operator menu so the user can pick the condition without a\n // second click — the viewChild only resolves after the building chip renders.\n afterNextRender(() => this.buildChip()?.openOperator(), { injector: this.#injector });\n return;\n }\n const operator = skipOperatorStep ? def : (allowed[0] ?? def);\n if (SD_QUERY_NO_DATA_OPERATORS.includes(operator)) {\n this.#pushComplete(field, operator, null);\n this.#building.set(null);\n return;\n }\n this.#building.set({ field, operator, step: 'value' });\n this.#enterValueStep(field);\n }\n\n /** Operator chosen during build — finish (no-data) or advance to the value step. */\n pickBuildOperator(op: Operator): void {\n const b = this.#building();\n if (!b) return;\n if (SD_QUERY_NO_DATA_OPERATORS.includes(op)) {\n this.#pushComplete(b.field, op, null);\n this.#building.set(null);\n return;\n }\n this.#building.set({ ...b, operator: op, step: 'value' });\n this.#enterValueStep(b.field);\n }\n\n /** Value committed during build — push the completed chip, clear building. No emit. */\n commitBuildValue(value: unknown): void {\n const b = this.#building();\n if (!b || !b.operator) return;\n this.#pushComplete(b.field, b.operator, value);\n this.#building.set(null);\n }\n\n /**\n * Commit from the seamless build chip (string / number). An empty value (blur with no\n * input) cancels the build instead of pushing a blank chip.\n */\n onBuildSeamlessCommit(value: unknown): void {\n const empty =\n value == null || value === '' || (typeof value === 'object' && (value as Range).from == null && (value as Range).to == null);\n if (empty) {\n this.cancelBuild();\n return;\n }\n this.commitBuildValue(value);\n }\n\n /** Abandon the in-progress chip. */\n cancelBuild(): void {\n this.#building.set(null);\n }\n\n /**\n * Commit both ends of a BETWEEN range at once — called from `<sd-query-inline-chip>`'s\n * `(commitRange)` output when the user picks a date range.\n * why: sd-date-range emits {from,to} via (sdChange) — single call thay cho cặp\n * setFilterRangeFrom / setFilterRangeTo cũ (đã bỏ).\n */\n setFilterRange(i: number, ev: { from: unknown; to: unknown } | null): void {\n this.updateFilter(i, { data: ev ?? { from: null, to: null } } as Partial<Filter>);\n }\n\n // ---------------------------------------------------------------------------\n // Mutations\n // ---------------------------------------------------------------------------\n\n addFilter(field: SdQueryField): void {\n const operator = sdQueryDefaultOperator(field);\n const data = SD_QUERY_MULTI_OPERATORS.includes(operator) ? [] : null;\n const next: Filter = { field: field.key as any, operator, data } as Filter;\n const newIndex = this.filters().length;\n this.filters.set([...this.filters(), next]);\n // why: user added a field — open its edit popover immediately so they can pick\n // operator + value in one continuous flow (no second click required).\n afterNextRender(() => this.popoverChips()[newIndex]?.openMenu(), { injector: this.#injector });\n }\n\n /** Swap the field of an existing chip — reset operator + value to the new field's defaults. */\n changeFilterField(index: number, field: SdQueryField): void {\n const list = [...this.filters()];\n if (index < 0 || index >= list.length) return;\n const operator = sdQueryDefaultOperator(field);\n const data = SD_QUERY_MULTI_OPERATORS.includes(operator) ? [] : null;\n list[index] = { field: field.key as any, operator, data } as Filter;\n this.filters.set(list);\n // why: clicking an item in the nested fieldSwitchPicker closes both the picker AND\n // the parent chipPopover. Re-open the chip's popover on the next render so user can\n // continue picking operator + value without a second manual click.\n afterNextRender(() => this.popoverChips()[index]?.openMenu(), { injector: this.#injector });\n }\n\n updateFilter(index: number, patch: Partial<Filter>): void {\n const list = [...this.filters()];\n if (index < 0 || index >= list.length) return;\n list[index] = { ...list[index], ...patch } as Filter;\n this.filters.set(list);\n }\n\n updateFilterData(index: number, data: unknown): void {\n this.updateFilter(index, { data } as Partial<Filter>);\n }\n\n removeFilter(index: number): void {\n const list = [...this.filters()];\n if (index < 0 || index >= list.length) return;\n // close the open popover (if it's this chip's) before the chip + its trigger vanish\n if (this.editingIndex() === index) {\n this.popoverChips()[index]?.closeMenu();\n this.editingIndex.set(null);\n }\n list.splice(index, 1);\n this.filters.set(list);\n }\n\n clearAll(): void {\n if (this.filters().length === 0) return;\n this.filters.set([]);\n this.editingIndex.set(null);\n }\n\n setLogic(value: SdQueryLogic): void {\n if (this.logic() === value) return;\n this.logic.set(value);\n }\n\n setSearch(value: string): void {\n if (this.search() === value) return;\n this.search.set(value);\n }\n\n triggerApply(): void {\n // why: single deferred trigger — fire both the change notification and the reload\n // signal once, from here only (mutations no longer emit).\n const q = this.#buildQuery();\n this.option()?.onQueryChange?.(q);\n this.queryChange.emit(q);\n this.option()?.onApply?.(q);\n this.apply.emit(q);\n }\n\n // ---------------------------------------------------------------------------\n // Chip popover — delegate staging to `<sd-query-chip-popover>` child.\n // ---------------------------------------------------------------------------\n\n /**\n * Called when a popover-mode chip is clicked — set editingIndex and seed the\n * child popover's staging signals from the chip's Filter.\n */\n openChipPopover(index: number): void {\n const filter = this.filters()[index];\n if (!filter || !('field' in filter)) return;\n this.editingIndex.set(index);\n const field = this.fieldByKey()[filter.field as string];\n this.chipPopover()?.seed(filter, field);\n }\n\n /** Receive `(commit)` from the child popover — splice into filters, null the index. */\n onChipPopoverCommit(next: Filter): void {\n const idx = this.editingIndex();\n if (idx === null) return;\n const list = [...this.filters()];\n list[idx] = next;\n this.filters.set(list);\n this.editingIndex.set(null);\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n #buildQuery(): SdQuery {\n return {\n filters: this.filters(),\n logic: this.logic(),\n ...(this.resolvedShowSearch() ? { search: this.search() } : {}),\n };\n }\n\n #displayOne(filter: Filter, raw: any): string {\n const fieldKey = 'field' in filter ? (filter.field as string) : '';\n const field = this.fieldByKey()[fieldKey];\n if (!field) return String(raw);\n if (field.type === 'boolean') {\n const trueLabel = (field as any).trueLabel ?? 'Có';\n const falseLabel = (field as any).falseLabel ?? 'Không';\n return raw ? trueLabel : falseLabel;\n }\n if (field.type === 'values' || field.type === 'lazy-values') {\n const opt = (field as any).option;\n const cachedOptions = this.chipPopover()?.editingOptions() ?? [];\n const items = this.#resolveSyncItems(opt?.items) ?? cachedOptions;\n const match = items.find((i: any) => i?.[opt.valueField] === raw);\n if (match) return String(match[opt.displayField]);\n const cached = cachedOptions.find((i: any) => i?.[opt.valueField] === raw);\n return cached ? String(cached[opt.displayField]) : String(raw);\n }\n return String(raw);\n }\n\n #resolveSyncItems(items: any): any[] | null {\n if (Array.isArray(items)) return items;\n if (isSignal(items)) return (items as any)();\n return null;\n }\n}\n","<!--\n sd-query-bar — unified filter chip row (Jira/Linear/Notion style).\n Visual spec: refs/design_handoff_sd_query_bar/README.md\n TODO(next-iter): replace inline placeholders for field-picker + chip-popover\n with extracted sub-components driven by CDK overlay.\n-->\n@let _filters = filters();\n@let _resolvedFields = resolvedFields();\n@let _resolvedDensity = resolvedDensity();\n@let _showOrConnector = showOrConnector();\n@let _usedFieldKeys = usedFieldKeys();\n@let _editingIndex = editingIndex();\n@let _resolvedMode = resolvedMode();\n@let _resolvedShowOperatorOnChip = resolvedShowOperatorOnChip();\n\n<div\n class=\"c-query-bar\"\n [class.c-density-compact]=\"_resolvedDensity === 'compact'\"\n [class.c-density-comfortable]=\"_resolvedDensity === 'comfortable'\">\n\n <!-- Main region — search + filters + add-filter. Wraps internally; the right\n action toolbar stays anchored and does NOT flow with this. -->\n <div class=\"c-query-bar__main\">\n\n <!-- Free-text search (left, optional) -->\n @if (resolvedShowSearch()) {\n <div class=\"c-search\">\n <sd-icon class=\"c-search-icon\" name=\"search\"></sd-icon>\n <input\n class=\"c-search-input\"\n type=\"text\"\n [ngModel]=\"search()\"\n (ngModelChange)=\"setSearch($event)\"\n (keydown.enter)=\"triggerApply()\"\n placeholder=\"Tìm kiếm...\" />\n </div>\n <span class=\"c-divider\" aria-hidden=\"true\"></span>\n }\n\n <!-- Chip popover — extracted into <sd-query-chip-popover>. Declared BEFORE chips\n so the popover-mode @for chips can bind their [menu] to `chipPopover.menu()`.\n why: mở popover để EDIT chỉ cho chỉnh operator + value — KHÔNG đổi field.\n Bỏ [switchPickerMenu] → header render nhãn field tĩnh (read-only). Muốn đổi\n field thì xoá chip rồi thêm lại. -->\n <sd-query-chip-popover\n #chipPopover\n [field]=\"editingField() ?? undefined\"\n [filter]=\"_editingIndex !== null ? $any(_filters[_editingIndex!]) : undefined\"\n [chipIndex]=\"_editingIndex\"\n [autoIdBase]=\"resolvedAutoId() ?? 'qb'\"\n (commit)=\"onChipPopoverCommit($event)\" />\n\n @if (_resolvedMode === 'inline') {\n <!-- ===== INLINE MODE (GitLab-style token builder) ===== -->\n\n <!-- Completed chips -->\n @for (filter of _filters; track $index; let i = $index) {\n @if (_showOrConnector && i > 0) {\n <span class=\"c-or-connector\" aria-hidden=\"true\">OR</span>\n }\n @let _field = fieldByKey()[$any(filter).field];\n @if (_field) {\n @let _op = $any(filter.operator);\n @let _data = $any(filter).data;\n @if (_field.type === 'string' || _field.type === 'number') {\n <!-- Seamless chip — the pill is the input (string / number). -->\n <sd-query-inline-value-chip\n [field]=\"_field\"\n [operator]=\"_op\"\n [value]=\"_data\"\n [density]=\"_resolvedDensity\"\n [showOperator]=\"_resolvedShowOperatorOnChip\"\n [autoId]=\"inlineAutoId(i, 'value')\"\n (valueChange)=\"updateFilterData(i, $event)\"\n (remove)=\"removeFilter(i)\" />\n } @else {\n <sd-query-inline-chip\n [field]=\"_field\"\n [filter]=\"filter\"\n [density]=\"_resolvedDensity\"\n [multiple]=\"multiple(_op)\"\n [showOperator]=\"_resolvedShowOperatorOnChip\"\n [autoId]=\"inlineAutoId(i, 'value')\"\n [valueText]=\"chipValueText(filter)\"\n [isNoData]=\"isNoDataOperator(_op)\"\n (commit)=\"updateFilterData(i, $event)\"\n (commitRange)=\"setFilterRange(i, $event)\"\n (liveChange)=\"updateFilterData(i, $event)\"\n (remove)=\"removeFilter(i)\" />\n }\n }\n }\n\n <!-- Building chip (in-progress) — extracted into <sd-query-build-chip>. -->\n @if (building(); as _b) {\n <sd-query-build-chip\n [building]=\"_b\"\n [density]=\"_resolvedDensity\"\n [allowedOperators]=\"allowedOperatorsFor(_b.field)\"\n [multiple]=\"multiple($any(_b.operator))\"\n [showOperator]=\"_resolvedShowOperatorOnChip\"\n (pickOperator)=\"pickBuildOperator($any($event))\"\n (commitValue)=\"commitBuildValue($event)\"\n (cancel)=\"cancelBuild()\"\n (seamlessCommit)=\"onBuildSeamlessCommit($event)\" />\n }\n\n <!-- Add filter -->\n <button\n type=\"button\"\n class=\"c-add-filter\"\n [matMenuTriggerFor]=\"addPicker.menu()\"\n [disabled]=\"_resolvedFields.length === 0 || _usedFieldKeys.size >= _resolvedFields.length\"\n [matTooltip]=\"_resolvedFields.length === 0 ? 'Chưa cấu hình fields' : 'Thêm filter'\">\n <sd-icon name=\"add\"></sd-icon>\n </button>\n } @else {\n <!-- ===== POPOVER MODE (default) — compact chips edited via mat-menu ===== -->\n @for (filter of _filters; track $index; let i = $index) {\n @if (_showOrConnector && i > 0) {\n <span class=\"c-or-connector\" aria-hidden=\"true\">OR</span>\n }\n @let _field = fieldByKey()[$any(filter).field];\n @let _active = isFilterActive(filter);\n <!-- why: menu close commit is handled by chipPopover's (commit) →\n onChipPopoverCommit; popover-chip only signals open + remove here. -->\n <sd-query-popover-chip\n [field]=\"_field\"\n [filter]=\"filter\"\n [active]=\"_active\"\n [showOperator]=\"_resolvedShowOperatorOnChip\"\n [valueText]=\"chipValueText(filter)\"\n [menu]=\"chipPopover.menu()!\"\n (open)=\"openChipPopover(i)\"\n (remove)=\"removeFilter(i)\" />\n }\n\n <!-- Add filter trigger -->\n <button\n type=\"button\"\n class=\"c-add-filter\"\n [matMenuTriggerFor]=\"addPicker.menu()\"\n [disabled]=\"_resolvedFields.length === 0 || _usedFieldKeys.size >= _resolvedFields.length\"\n [matTooltip]=\"_resolvedFields.length === 0 ? 'Chưa cấu hình fields' : 'Thêm filter'\">\n <sd-icon name=\"add\"></sd-icon>\n </button>\n }\n\n </div><!-- /.c-query-bar__main -->\n\n <!-- Field picker — list available fields, fade ones already in use. -->\n <sd-query-field-picker\n #addPicker\n [fields]=\"_resolvedFields\"\n [usedKeys]=\"_usedFieldKeys\"\n (pick)=\"_resolvedMode === 'inline' ? beginBuild($event) : addFilter($event)\" />\n\n <sd-query-actions-bar\n [showLogicToggle]=\"resolvedShowLogicToggle()\"\n [(logic)]=\"logic\"\n [filtersCount]=\"_filters.length\"\n [showSavedFilters]=\"resolvedShowSavedFilters()\"\n [savedFiltersKey]=\"resolvedSavedFiltersKey()\"\n [query]=\"currentQuery()\"\n (applyFilter)=\"onApplyFilter($event)\"\n [showClearAll]=\"resolvedShowClearAll()\"\n [canSearch]=\"canSearch()\"\n (clear)=\"clearAll()\"\n (search)=\"triggerApply()\" />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAOA;;;;;;;;;;;;;;AAcG;MASU,uBAAuB,CAAA;;AAEzB,IAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,0EAAC;;AAG1C,IAAA,KAAK,GAAG,KAAK,CAAU,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4EAAC;;IAGrD,KAAK,GAAG,MAAM,EAAiB;AAE/B,IAAA,YAAY,GAAG,MAAM,CAAkB,EAAE,mFAAC;AAE1C,IAAA,WAAW,GAAG,QAAQ,CAAqB,MAAK;AACvD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,OAAO,CAAC,GAAG,CAAA,0BAAA,EAA6B,CAAC,CAAA,CAAE,GAAG,SAAS;AACzD,IAAA,CAAC,kFAAC;;AAGO,IAAA,YAAY,GAAG,MAAM,CAAC,MAAK;AAClC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB;QACF;AACA,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnD;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B;AACF,IAAA,CAAC,mFAAC;AAEF,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxD;AAAE,QAAA,MAAM;;QAER;IACF;AAEA;;;;AAIG;IACH,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;AACzC,QAAA,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE;AACnB,QAAA,MAAM,MAAM,GAAkB;YAC5B,EAAE,EAAE,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACjG,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;SACpB;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrB;;AAGA,IAAA,IAAI,CAAC,MAAqB,EAAA;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IACzB;;IAGA,MAAM,CAAC,EAAU,EAAE,EAAU,EAAA;QAC3B,EAAE,EAAE,eAAe,EAAE;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrB;wGAxEW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,0WC9BpC,0nDAoCA,EAAA,MAAA,EAAA,CAAA,0mEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDRY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,6vBAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEtC,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBARnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAAA,UAAA,EAG3B,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,0nDAAA,EAAA,MAAA,EAAA,CAAA,0mEAAA,CAAA,EAAA;;;AErBpD;;;;;;;;;AASG;MASU,iBAAiB,CAAA;;IAEnB,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAC/D,IAAA,KAAK,GAAG,KAAK,CAAe,KAAK,4EAAC;AAClC,IAAA,YAAY,GAAG,KAAK,CAAC,CAAC,mFAAC;;IAGvB,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAChE,IAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,sFAAC;AACtD,IAAA,KAAK,GAAG,KAAK,CAAU,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4EAAC;IACrD,WAAW,GAAG,MAAM,EAAiB;;IAGrC,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC3D,KAAK,GAAG,MAAM,EAAQ;;AAGtB,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;IACxB,MAAM,GAAG,MAAM,EAAQ;AAEhC,IAAA,QAAQ,CAAC,KAAmB,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK;YAAE;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;wGAvBW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,gxCCzB9B,g/DAuDA,EAAA,MAAA,EAAA,CAAA,wjDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDhCY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,6TAAE,uBAAuB,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEhD,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EAGpB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,EAAA,QAAA,EAAA,g/DAAA,EAAA,MAAA,EAAA,CAAA,wjDAAA,CAAA,EAAA;;;AE0I9D;AACA;AACA;AAEA;AACO,MAAM,0BAA0B,GAAyC;AAC9E,IAAA,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC;AACvF,IAAA,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,CAAC;IAC3G,OAAO,EAAE,CAAC,OAAO,CAAC;IAClB,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC;IACvD,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC;IAC3D,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;IAC5C,aAAa,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;;AAGrD;AACO,MAAM,iCAAiC,GAAuC;AACnF,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,aAAa,EAAE,IAAI;;AAGrB;AACO,MAAM,kBAAkB,GAAqC;AAClE,IAAA,MAAM,EAAE,aAAa;AACrB,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,OAAO,EAAE,WAAW;AACpB,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,aAAa,EAAE,MAAM;;AAGvB;;;AAGG;AACG,SAAU,gBAAgB,CAAC,KAAmB,EAAA;AAClD,IAAA,OAAO,KAAK,CAAC,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM;AAC/D;AAEA;MACa,0BAA0B,GAAe,CAAC,MAAM,EAAE,UAAU;AAEzE;MACa,wBAAwB,GAAe,CAAC,IAAI,EAAE,QAAQ;AAEnE;AACM,SAAU,sBAAsB,CAAC,KAAmB,EAAA;IACxD,IAAI,KAAK,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC,eAAe;AACvD,IAAA,OAAO,iCAAiC,CAAC,KAAK,CAAC,IAAI,CAAC;AACtD;AAEA;;;;;AAKG;AACG,SAAU,uBAAuB,CAAC,KAAmB,EAAA;AACzD,IAAA,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;AAAE,QAAA,OAAO,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC;AAC3E,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,SAAS;AACxF,IAAA,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACxC;AAEA;;;AAGG;AACG,SAAU,2BAA2B,CAAC,KAAmB,EAAA;IAC7D,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;AAClD;;AC9NA;;;;;;;;;;AAUG;MASU,sBAAsB,CAAA;;AAExB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAgB;;AAEtC,IAAA,QAAQ,GAAG,KAAK,CAAW,SAAS,+EAAC;;AAErC,IAAA,KAAK,GAAG,KAAK,CAAU,IAAI,4EAAC;AAC5B,IAAA,OAAO,GAAG,KAAK,CAA4B,SAAS,8EAAC;;AAErD,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;;AAE3B,IAAA,MAAM,GAAG,KAAK,CAAqB,SAAS,6EAAC;;AAE7C,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;;IAGxB,WAAW,GAAG,MAAM,EAAW;;IAE/B,MAAM,GAAG,MAAM,EAAQ;AAEf,IAAA,UAAU,GAAG,SAAS,CAAe,YAAY,iFAAC;AAE1D,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;;AAGxB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,IAAA,OAAO,GAAG,MAAM,CAAC,EAAE,8EAAC;AAEpB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,QAAQ,+EAAC;AACzD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,SAAS,gFAAC;AACzD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,+EAAC;AAE/E,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,2EAAC;IAErD,EAAE,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAC5D,MAAM,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IACzD,IAAI,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,MAAM,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEzD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,IAAI;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAU;YAC5B,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAC3E;AACA,QAAA,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAC9B,IAAA,CAAC,+EAAC;AAEO,IAAA,KAAK,GAAG,QAAQ,CAAY,MAAK;QACxC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,OAAO;QACnC,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,OAAO;AAClC,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,GAAG,SAAS;AAC/C,IAAA,CAAC,4EAAC;AAEF,IAAA,WAAA,GAAA;;;QAGE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAU;AAC5B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC;iBAAO;AACL,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC;AACF,QAAA,CAAC,CAAC;;;IAIJ;;AAGA,IAAA,cAAc,CAAC,EAAS,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,MAAqB;AACvC,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE;AACjE,QAAA,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE;IAC5B;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;AACd,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACrC;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;IAC3D;;AAGA,IAAA,aAAa,CAAC,GAA0B,EAAA;AACtC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAU;AAC5B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,GAAG,EAAE,IAAI,EAAE;IACb;AAEA,IAAA,QAAQ,CAAC,EAAS,EAAA;QAChB,EAAE,CAAC,eAAe,EAAE;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;;AAGA,IAAA,OAAO,CAAC,CAAM,EAAA;AACZ,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,OAAO,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1E,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnE;AACA,QAAA,OAAO,MAAM,CAAC,CAAC,CAAC;IAClB;;AAGA,IAAA,MAAM,CAAC,CAAS,EAAA;QACd,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;QAC1B,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE;AACrE,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;;;YAGnB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE;AAC5D,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE;QAC9E;QACA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;IAC/B;wGAzJW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,ipCCjCnC,ytGAsFA,EAAA,MAAA,EAAA,CAAA,08DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDzDY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,wIAAE,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI/B,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBARlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,ytGAAA,EAAA,MAAA,EAAA,CAAA,08DAAA,CAAA,EAAA;q2BAwBW,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEnCpE;;;;;;;;;;;;;AAaG;MASU,gBAAgB,CAAA;;AAElB,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAgB;;AAGzC,IAAA,OAAO,GAAG,KAAK,CAAU,SAAS,8EAAC;;AAGnC,IAAA,gBAAgB,GAAG,KAAK,CAAa,EAAE,uFAAC;;AAGxC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;;AAGvB,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;AAEpC;;;;AAIG;AACM,IAAA,MAAM,GAAG,KAAK,CAAS,gBAAgB,6EAAC;;;;;IAOxC,YAAY,GAAG,MAAM,EAAY;AAE1C;;;AAGG;IACM,WAAW,GAAG,MAAM,EAAW;;IAG/B,MAAM,GAAG,MAAM,EAAQ;AAEhC;;;AAGG;IACM,cAAc,GAAG,MAAM,EAAW;;IAGlC,WAAW,GAAG,MAAM,EAAW;;IAG/B,WAAW,GAAG,MAAM,EAAQ;;;;;AAOpB,IAAA,MAAM,GAAG,SAAS,CAAa,eAAe,6EAAC;;AAG/C,IAAA,MAAM,GAAG,SAAS,CAA+C,SAAS,6EAAC;;IAG5F,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE;IACvB;;IAGA,UAAU,GAAA;AACP,QAAA,IAAI,CAAC,MAAM,EAAU,EAAE,IAAI,IAAI;IAClC;;;;;AAOS,IAAA,UAAU,GAAG,QAAQ,CAAU,MAAK;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;AACzB,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI;AACtB,QAAA,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ;AACzC,IAAA,CAAC,iFAAC;wGAjFS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,2wCCxC7B,8jMAiIA,EAAA,MAAA,EAAA,CAAA,04GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3FY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,+BAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,wRAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAiB,QAAQ,4bAAE,sBAAsB,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,QAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE1H,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;+BACE,qBAAqB,EAAA,UAAA,EAGnB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,8jMAAA,EAAA,MAAA,EAAA,CAAA,04GAAA,CAAA,EAAA;AA0DtF,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,eAAe,gEAGmB,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEpE7F;;;;;;;;;;;;;AAaG;MAsBU,kBAAkB,CAAA;;;;;AAMpB,IAAA,KAAK,GAAG,KAAK,CAA2B,SAAS,4EAAC;;AAGlD,IAAA,MAAM,GAAG,KAAK,CAAqB,SAAS,6EAAC;;AAG7C,IAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,gFAAC;;AAGtC,IAAA,UAAU,GAAG,KAAK,CAAS,IAAI,iFAAC;;AAGhC,IAAA,gBAAgB,GAAG,KAAK,CAAsB,SAAS,uFAAC;;;;;IAOxD,MAAM,GAAG,MAAM,EAAU;;IAGzB,SAAS,GAAG,MAAM,EAAgB;;;;;AAOlC,IAAA,eAAe,GAAG,MAAM,CAAW,OAAO,sFAAC;;AAE3C,IAAA,YAAY,GAAG,MAAM,CAAU,IAAI,mFAAC;;AAEpC,IAAA,cAAc,GAAG,MAAM,CAAQ,EAAE,qFAAC;;AAElC,IAAA,qBAAqB,GAAG,MAAM,CAAC,KAAK,4FAAC;;;;AAMrC,IAAA,gBAAgB,GAAG,QAAQ,CAAa,MAAK;AACpD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,GAAG,EAAE;AAC5C,IAAA,CAAC,uFAAC;AAEO,IAAA,oBAAoB,GAAG,QAAQ,CAAU,MAAK;AACrD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,CAAC,GAAG,2BAA2B,CAAC,CAAC,CAAC,GAAG,KAAK;AACnD,IAAA,CAAC,2FAAC;;AAGF,IAAA,QAAQ,CAAC,EAAa,EAAA;QACpB,OAAO,wBAAwB,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IACxE;;AAGA,IAAA,gBAAgB,CAAC,EAAqB,EAAA;AACpC,QAAA,OAAO,0BAA0B,CAAC,QAAQ,CAAC,EAAc,CAAC;IAC5D;;AAGA,IAAA,UAAU,CAAC,IAAY,EAAA;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;QAC5B,OAAO,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;IAC5C;IAES,OAAO,GAAG,gBAAgB;;;;AAM1B,IAAA,IAAI,GAAG,SAAS,CAAU,MAAM,2EAAC;;;;;;IAQ1C,IAAI,CAAC,MAA0B,EAAE,KAA+B,EAAA;AAC9D,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;AACrB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;AACjC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC;QACF;QACA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAE,MAAc,CAAC,QAAoB,CAAC;QAC9D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAE,MAAc,CAAC,IAAI,IAAI,IAAI,CAAC;AAEnD,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC3B,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAChC;AAAO,aAAA,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE;AACvC,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;QACvC;IACF;;;;;AAOA,IAAA,uBAAuB,CAAC,IAAc,EAAA;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;AACnC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAE9B,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B;QACF;AACA,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;YAC7B,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAK,CAAS;gBAAE;AACxD,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAW,CAAC;YACxD;QACF;QACA,MAAM,YAAY,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC5D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAgB,CAAC;AACpE,QAAA,IAAI,YAAY,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7C;AAAO,aAAA,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE;AACpC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACvE;IACF;;AAGA,IAAA,mBAAmB,CAAC,KAAc,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;;AAGA,IAAA,kBAAkB,CAAC,KAA6B,EAAA;QAC9C,MAAM,CAAC,GAAI,IAAI,CAAC,YAAY,EAAY,IAAI,EAAE;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9C;;AAGA,IAAA,gBAAgB,CAAC,KAA6B,EAAA;QAC5C,MAAM,CAAC,GAAI,IAAI,CAAC,YAAY,EAAY,IAAI,EAAE;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC5C;;AAGA,IAAA,uBAAuB,CAAC,KAAc,EAAA;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAI,IAAI,CAAC,YAAY,EAAgB,CAAC,GAAG,EAAE;QAC7F,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC;AAAE,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;;AAC3B,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B;AAEA,IAAA,sBAAsB,CAAC,KAAc,EAAA;AACnC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC9C;;;;AAMA;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,IAAI,CAAC,CAAC;YAAE;AACR,QAAA,MAAM,IAAI,GAAW;YACnB,KAAK,EAAG,CAAS,CAAC,KAAK;AACvB,YAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE;AAChC,YAAA,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE;SAChB;AACX,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB;;;;AAMA,IAAA,kBAAkB,CAAC,KAAmB,EAAA;AACpC,QAAA,MAAM,GAAG,GAAI,KAAa,CAAC,MAAM;AACjC,QAAA,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK;AACxB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC;QACF;AACA,QAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACnB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAE,KAAa,EAAE,CAAC;AACzC,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC;QACF;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;AACpC,YAAA,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,iBAAA,IAAI,CAAC,CAAC,GAAU,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AACvD,iBAAA,OAAO,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzD;IACF;AAEA,IAAA,gBAAgB,CAAC,KAAmB,EAAE,MAAM,GAAG,EAAE,EAAA;AAC/C,QAAA,MAAM,GAAG,GAAI,KAAa,CAAC,MAAM;QACjC,IAAI,CAAC,GAAG,EAAE,MAAM;YAAE;AAClB,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;AACpC,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AACjE,QAAA,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE;YACvB,MAAc,CAAC,SAAS,CAAC;AACxB,gBAAA,IAAI,EAAE,CAAC,GAAU,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;gBACxD,QAAQ,EAAE,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;gBACrD,KAAK,EAAE,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnD,aAAA,CAAC;QACJ;aAAO;AACL,YAAA,OAAO,CAAC,OAAO,CAAC,MAAM;AACnB,iBAAA,IAAI,CAAC,CAAC,GAAU,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AACvD,iBAAA,OAAO,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzD;IACF;wGAtOW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClE/B,yiOA4JA,EAAA,MAAA,EAAA,CAAA,wrEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxGI,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,6TAChB,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,eAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,KAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBArB9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cAGrB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,MAAM;wBACN,YAAY;wBACZ,WAAW;wBACX,aAAa;wBACb,gBAAgB;wBAChB,QAAQ;wBACR,UAAU;wBACV,QAAQ;wBACR,OAAO;wBACP,aAAa;wBACb,MAAM;wBACN,UAAU;AACX,qBAAA,EAAA,QAAA,EAAA,yiOAAA,EAAA,MAAA,EAAA,CAAA,wrEAAA,CAAA,EAAA;spBAkFkC,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE5I3C;;;;;;;;;;;AAWG;MASU,kBAAkB,CAAA;;AAEpB,IAAA,MAAM,GAAG,KAAK,CAAiB,EAAE,6EAAC;;AAGlC,IAAA,UAAU,GAAG,KAAK,CAAqB,SAAS,iFAAC;;AAGjD,IAAA,QAAQ,GAAG,KAAK,CAAc,IAAI,GAAG,EAAU,+EAAC;;IAGhD,IAAI,GAAG,MAAM,EAAgB;;AAG7B,IAAA,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;IAElC,OAAO,GAAG,gBAAgB;;AAG1B,IAAA,WAAW,GAAG,QAAQ,CAAc,MAAK;QAChD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,IAAI,GAAG;AAAE,YAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACrB,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,kFAAC;AAEF,IAAA,UAAU,CAAC,KAAmB,EAAA;AAC5B,QAAA,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;IAC/E;;AAGA,IAAA,SAAS,CAAC,KAAmB,EAAA;QAC3B,OAAO,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU,EAAE;IACxC;;AAGA,IAAA,MAAM,CAAC,KAAmB,EAAA;QACxB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;IACjD;wGAtCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,iiBAcM,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxC5C,6wBAkBA,EAAA,MAAA,EAAA,CAAA,ilCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDMY,MAAM,uKAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEpB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAR9B,SAAS;+BACE,uBAAuB,EAAA,UAAA,EAGrB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,6wBAAA,EAAA,MAAA,EAAA,CAAA,ilCAAA,CAAA,EAAA;maAgBG,OAAO,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEzB5C;;;;;;;;;;;;;;;AAeG;MASU,iBAAiB,CAAA;;;;;AAMnB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAgB;;AAGtC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAU;;AAGjC,IAAA,OAAO,GAAG,KAAK,CAAU,SAAS,8EAAC;;AAGnC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;;AAGvB,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;;AAG3B,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;;AAG1B,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;;AAG7B,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;;;;;IAOvB,MAAM,GAAG,MAAM,EAAW;;IAG1B,WAAW,GAAG,MAAM,EAAyC;;IAG7D,UAAU,GAAG,MAAM,EAAW;;IAG9B,MAAM,GAAG,MAAM,EAAQ;;;;AAMhC;;;;AAIG;AACM,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;;;AAMpC,IAAA,QAAQ,GAAG,QAAQ,CAAS,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,+EAAC;;AAGjE,IAAA,QAAQ,GAAG,QAAQ,CAAW,MAAO,IAAI,CAAC,MAAM,EAAU,CAAC,QAAoB,+EAAC;;AAGhF,IAAA,IAAI,GAAG,QAAQ,CAAU,MAAO,IAAI,CAAC,MAAM,EAAU,CAAC,IAAI,2EAAC;;;;;IAOpE,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;;;;AAMA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,CAAU,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACrB;;AAGA,IAAA,eAAe,CAAC,EAAyC,EAAA;QACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC;IACnC;;AAGA,IAAA,QAAQ,CAAC,CAAU,EAAA;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzB;;AAGA,IAAA,WAAW,CAAC,CAAU,EAAA;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;wGA1GW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvC9B,k6KAoHA,EAAA,MAAA,EAAA,CAAA,26GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/EY,MAAM,uKAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,iXAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,eAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE1E,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;+BACE,sBAAsB,EAAA,UAAA,EAGpB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAA,QAAA,EAAA,k6KAAA,EAAA,MAAA,EAAA,CAAA,26GAAA,CAAA,EAAA;;;AE3BxF;;;;AAIG;MASU,kBAAkB,CAAA;;AAEpB,IAAA,KAAK,GAAG,KAAK,CAA2B,SAAS,4EAAC;;AAGlD,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAU;;AAGjC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAW;;AAGlC,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;;AAG3B,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;;AAG7B,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAW;;IAGhC,IAAI,GAAG,MAAM,EAAQ;;IAErB,MAAM,GAAG,MAAM,EAAQ;IAEvB,OAAO,GAAG,gBAAgB;IAEnC,WAAW,GAAA;AACT,QAAA,OAAQ,IAAI,CAAC,MAAM,EAAU,CAAC,KAAe;IAC/C;IACA,cAAc,GAAA;AACZ,QAAA,OAAQ,IAAI,CAAC,MAAM,EAAU,CAAC,QAAoB;IACpD;;;;IAKiB,OAAO,GAAG,SAAS,CAAC,aAAa,+EAAI,IAAI,EAAE,cAAc,EAAA,CAAG;IAC7E,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE;IAC5B;IACA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE;IAC7B;wGA1CW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAoC+B,cAAc,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3D5E,6jDA8CA,EAAA,MAAA,EAAA,CAAA,0+CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDzBY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAElD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAR9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,UAAA,EAGrB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAA,QAAA,EAAA,6jDAAA,EAAA,MAAA,EAAA,CAAA,0+CAAA,CAAA,EAAA;AAsCzB,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,aAAa,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEN9E;AACA,MAAM,WAAW,GAAU,EAAE;MAuBhB,UAAU,CAAA;AACZ,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3B,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;;AAG5B,IAAA,YAAY,GAAG,YAAY,CAAC,kBAAkB,mFAAC;;AAGvC,IAAA,SAAS,GAAG,SAAS,CAAC,gBAAgB,gFAAC;;AAG/C,IAAA,WAAW,GAAG,SAAS,CAAC,kBAAkB,kFAAC;AAEpD;;;;AAIG;AACH,IAAA,eAAe,CAAC,KAAmB,EAAA;AACjC,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI;AACpB,QAAA,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,EAAE;YAC7E,eAAe,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACrF;;;IAGF;;;;;AAOS,IAAA,MAAM,GAAG,KAAK,CAA+B,SAAS,6EAAC;;AAGvD,IAAA,WAAW,GAAG,KAAK,CAAgD,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,aAAA,EAAA,8BAAA,EAAA,CAAA,EACnF,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE,CAAC,CAAC,KAAyB,CAAC,IAAI,SAAS,EAAA,CACpD;;AAGO,IAAA,MAAM,GAAG,KAAK,CAAoD,EAAE,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,CAAA,EAC3E,SAAS,EAAE,CAAC,CAAC,MAAsB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAC7D;AAEF;;;AAGG;AACM,IAAA,OAAO,GAAG,KAAK,CAAW,EAAE,8EAAC;AAEtC;;;AAGG;AACM,IAAA,KAAK,GAAG,KAAK,CAAe,KAAK,4EAAC;;AAGlC,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;AAEnC;;;;;;;AAOG;AACM,IAAA,IAAI,GAAG,KAAK,CAAgE,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,MAAA,EAAA,8BAAA,EAAA,CAAA,EAC5F,SAAS,EAAE,CAAC,CAAC,KAA2B,CAAC,IAAI,SAAS,GACtD;;AAGO,IAAA,OAAO,GAAG,KAAK,CAAsC,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,CAAA,EACrE,SAAS,EAAE,CAAC,CAAC,KAAc,CAAC,IAAI,SAAS,GACzC;;IAGO,UAAU,GAAG,KAAK,CAAC,KAAK,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG1D,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEzE;;;AAGG;AACM,IAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,sFAAC;AAE/D;;;AAGG;IACM,YAAY,GAAG,QAAQ,CAAU,MAAM,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGnE,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;AAC1C,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QACzE,IAAI,CAAC,YAAY,EAAE;IACrB;;IAGS,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG/D,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG3D,kBAAkB,GAAG,KAAK,CAAC,KAAK,0FAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;;;;IAOlE,WAAW,GAAG,MAAM,EAAW;;IAG/B,KAAK,GAAG,MAAM,EAAW;;;;;IAOzB,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,SAAS,qFAAC;AACzF,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,qFAAC;AACvE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,mFAAC;AACjE,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,sFAAC;AAC1E,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE,yFAAC;AACnF,IAAA,wBAAwB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,EAAE,+FAAC;AACrG,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE,8FAAC;AAClG,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE,8FAAC;AAClG,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,2FAAC;AACzF,IAAA,0BAA0B,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,EAAE,iGAAC;AAEpH,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,IAAI,CAAC,MAAM;gBAAE;YACb,SAAS,CAAC,MAAK;gBACb,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,OAAO;oBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBACzF,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,MAAM,CAAC,KAAK;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AAC/E,gBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;AACpG,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAES,IAAA,UAAU,GAAG,QAAQ,CAA+B,MAAK;QAChE,MAAM,GAAG,GAAiC,EAAE;AAC5C,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE;AAAE,YAAA,GAAG,CAAC,CAAC,CAAC,GAAa,CAAC,GAAG,CAAC;AAC/D,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,iFAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAAc,MAAK;AAClD,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YAC9B,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;AAAE,gBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QACnE;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,oFAAC;;IAGO,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;IAGvH,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;;;;;AAQxF,IAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,mFAAC;;AAG1C,IAAA,YAAY,GAAG,QAAQ,CAAsB,MAAK;AACzD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,IAAI,GAAG,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC;QAC7B,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;QACtC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAe,CAAC,IAAI,IAAI;AACrD,IAAA,CAAC,mFAAC;AAEF;;;;AAIG;AACH,IAAA,QAAQ,CAAC,EAAY,EAAA;AACnB,QAAA,OAAO,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC9C;;;;IAMS,OAAO,GAAG,gBAAgB;;AAGnC,IAAA,cAAc,CAAC,MAAc,EAAA;AAC3B,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAoB,CAAC;AAAE,YAAA,OAAO,IAAI;AACjF,QAAA,MAAM,IAAI,GAAI,MAAc,CAAC,IAAI;QACjC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;AAAE,YAAA,OAAO,KAAK;QACpE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAC1D,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAoB,CAAC;AAAE,YAAA,OAAO,EAAE;AAC/E,QAAA,MAAM,IAAI,GAAI,MAAc,CAAC,IAAI;AACjC,QAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;AAAE,YAAA,OAAO,EAAE;AAClD,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACrE,YAAA,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA,GAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;QAChD;AACA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,EAAE;AAChC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,EAAG,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI;QAC/D;QACA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;IACvC;AAEA,IAAA,gBAAgB,CAAC,EAAqB,EAAA;AACpC,QAAA,OAAO,0BAA0B,CAAC,QAAQ,CAAC,EAAc,CAAC;IAC5D;;;;;AAOS,IAAA,SAAS,GAAG,MAAM,CAAsB,IAAI,gFAAC;AAC7C,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE/C,IAAA,mBAAmB,CAAC,KAAmB,EAAA;AACrC,QAAA,OAAO,uBAAuB,CAAC,KAAK,CAAC;IACvC;IAEA,YAAY,CAAC,KAAa,EAAE,IAAY,EAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI;AAC1C,QAAA,OAAO,GAAG,IAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,IAAI,EAAE;IACzC;;;;;AAOA,IAAA,aAAa,CAAC,KAAmB,EAAE,QAAkB,EAAE,KAAc,EAAA;QACnE,IAAI,IAAI,GAAY,KAAK;AACzB,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,IAAI,GAAG,IAAI;AACzD,aAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC/B,YAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE;QACxE;AAAO,aAAA,IAAI,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACtD,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;QAClE;AACA,QAAA,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAU,EAAE,QAAQ,EAAE,IAAI,EAAY;AAClE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7C;;AAGA,IAAA,UAAU,CAAC,KAAmB,EAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC;AAC9C,QAAA,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,CAAC;;;;QAIzC,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC3C,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;;YAG/C,eAAe,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YACrF;QACF;AACA,QAAA,MAAM,QAAQ,GAAG,gBAAgB,GAAG,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAC7D,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACjD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;AACzC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YACxB;QACF;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACtD,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;IAC7B;;AAGA,IAAA,iBAAiB,CAAC,EAAY,EAAA;AAC5B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAA,IAAI,CAAC,CAAC;YAAE;AACR,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YAC3C,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YACxB;QACF;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/B;;AAGA,IAAA,gBAAgB,CAAC,KAAc,EAAA;AAC7B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC;AAC9C,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;AAEA;;;AAGG;AACH,IAAA,qBAAqB,CAAC,KAAc,EAAA;AAClC,QAAA,MAAM,KAAK,GACT,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAe,CAAC,IAAI,IAAI,IAAI,IAAK,KAAe,CAAC,EAAE,IAAI,IAAI,CAAC;QAC9H,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAC9B;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;AAEA;;;;;AAKG;IACH,cAAc,CAAC,CAAS,EAAE,EAAyC,EAAA;QACjE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAqB,CAAC;IACnF;;;;AAMA,IAAA,SAAS,CAAC,KAAmB,EAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC;AAC9C,QAAA,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI;AACpE,QAAA,MAAM,IAAI,GAAW,EAAE,KAAK,EAAE,KAAK,CAAC,GAAU,EAAE,QAAQ,EAAE,IAAI,EAAY;QAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM;AACtC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;;;QAG3C,eAAe,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAChG;;IAGA,iBAAiB,CAAC,KAAa,EAAE,KAAmB,EAAA;QAClD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE;AACvC,QAAA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC;AAC9C,QAAA,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI;AACpE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAU,EAAE,QAAQ,EAAE,IAAI,EAAY;AACnE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;;;;QAItB,eAAe,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC7F;IAEA,YAAY,CAAC,KAAa,EAAE,KAAsB,EAAA;QAChD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE;AACvC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAY;AACpD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEA,gBAAgB,CAAC,KAAa,EAAE,IAAa,EAAA;QAC3C,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,EAAqB,CAAC;IACvD;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE;;AAEvC,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,KAAK,EAAE;YACjC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE;AACvC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;AACjC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,QAAQ,CAAC,KAAmB,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK;YAAE;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK;YAAE;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;IAEA,YAAY,GAAA;;;AAGV,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;QAC5B,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,GAAG,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACpB;;;;AAMA;;;AAGG;AACH,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC;YAAE;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,KAAe,CAAC;QACvD,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;IACzC;;AAGA,IAAA,mBAAmB,CAAC,IAAY,EAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,IAAI,GAAG,KAAK,IAAI;YAAE;QAClB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;;;;IAMA,WAAW,GAAA;QACT,OAAO;AACL,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;YACnB,IAAI,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;SAChE;IACH;IAEA,WAAW,CAAC,MAAc,EAAE,GAAQ,EAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,OAAO,IAAI,MAAM,GAAI,MAAM,CAAC,KAAgB,GAAG,EAAE;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC;AACzC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;AAC5B,YAAA,MAAM,SAAS,GAAI,KAAa,CAAC,SAAS,IAAI,IAAI;AAClD,YAAA,MAAM,UAAU,GAAI,KAAa,CAAC,UAAU,IAAI,OAAO;YACvD,OAAO,GAAG,GAAG,SAAS,GAAG,UAAU;QACrC;AACA,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE;AAC3D,YAAA,MAAM,GAAG,GAAI,KAAa,CAAC,MAAM;YACjC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;AAChE,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,aAAa;YACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;AACjE,YAAA,IAAI,KAAK;gBAAE,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;YAC1E,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;QAChE;AACA,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC;IACpB;AAEA,IAAA,iBAAiB,CAAC,KAAU,EAAA;AAC1B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QACtC,IAAI,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAQ,KAAa,EAAE;AAC5C,QAAA,OAAO,IAAI;IACb;wGAleW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,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,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,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,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,KAAA,EAAA,aAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAKgB,kBAAkB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGhB,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGtB,kBAAkB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxFrD,s8NA0KA,EAAA,MAAA,EAAA,CAAA,ikPAAA,EAAA,8yJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3GI,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,YAAY,8BACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,UAAA,EAAA,IAAA,EACX,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,OAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,gBAAgB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,kBAAkB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,YAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,sBAAsB,qMACtB,kBAAkB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGT,UAAU,EAAA,UAAA,EAAA,CAAA;kBArBtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cAGZ,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,MAAM;wBACN,YAAY;wBACZ,WAAW;wBACX,aAAa;wBACb,gBAAgB;wBAChB,iBAAiB;wBACjB,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,iBAAiB;wBACjB,sBAAsB;wBACtB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,s8NAAA,EAAA,MAAA,EAAA,CAAA,ikPAAA,EAAA,8yJAAA,CAAA,EAAA;2HAOoC,kBAAkB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGhB,gBAAgB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGtB,kBAAkB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AExFrD;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-components-query-bar.mjs","sources":["../../../projects/sdcorejs-angular/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/actions-bar/actions-bar.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/actions-bar/actions-bar.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/query-bar.model.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/build-chip/build-chip.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/build-chip/build-chip.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/chip-popover/chip-popover.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/chip-popover/chip-popover.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/field-picker/field-picker.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/field-picker/field-picker.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/inline-chip/inline-chip.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/inline-chip/inline-chip.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/components/popover-chip/popover-chip.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/components/popover-chip/popover-chip.component.html","../../../projects/sdcorejs-angular/components/query-bar/src/query-bar.component.ts","../../../projects/sdcorejs-angular/components/query-bar/src/query-bar.component.html","../../../projects/sdcorejs-angular/components/query-bar/sdcorejs-angular-components-query-bar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal } from '@angular/core';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { SdQuery, SdSavedFilter } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdConfirmService } from '@sdcorejs/angular/services/confirm';\n\n/**\n * Saved-filters dropdown for `sd-query-bar`.\n *\n * Self-contained: persists the list to `localStorage` under\n * `sd-query-bar:savedFilters:<key>` whenever the host passes a `[key]`. Without a\n * key the dropdown still renders (host can still preview the menu) but the\n * trigger stays disabled.\n *\n * The host owns the live `[query]`: each save snapshots it into a new entry,\n * each apply emits the chosen filter back via `(apply)` for the host to install\n * into its own `filters` / `logic` / `search` model.\n *\n * The save action (`promptSave`) is public so the parent toolbar can place its\n * own \"Lưu bộ lọc\" button anywhere — typically next to the Search trigger.\n */\n@Component({\n selector: 'sd-query-saved-filters-menu',\n templateUrl: './saved-filters-menu.component.html',\n styleUrl: './saved-filters-menu.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatMenuModule, MatTooltipModule],\n})\nexport class SdQuerySavedFiltersMenu {\n readonly #i18n = inject(I18nService);\n readonly #confirm = inject(SdConfirmService);\n readonly tooltipLabel = computed(() => this.#i18n.t('core.component.query-bar.saved-filters.tooltip'));\n readonly tooltipDisabledLabel = computed(() => this.#i18n.t('core.component.query-bar.saved-filters.tooltip-disabled'));\n readonly deleteLabel = computed(() => this.#i18n.t('core.component.query-bar.saved-filters.delete'));\n readonly emptyLabel = computed(() => this.#i18n.t('core.component.query-bar.saved-filters.empty'));\n readonly saveLabel = computed(() => this.#i18n.t('core.component.query-bar.saved-filters.save'));\n\n /** Namespace key used to scope localStorage. `undefined` → menu disabled. */\n readonly key = input<string | undefined>(undefined);\n\n /** Current query the host wants to snapshot when the user clicks \"Save current\". */\n readonly query = input<SdQuery>({ filters: [], logic: 'AND' });\n\n /** Fired when the user picks a saved filter from the list. */\n readonly apply = output<SdSavedFilter>();\n\n readonly savedFilters = signal<SdSavedFilter[]>([]);\n\n readonly #storageKey = computed<string | undefined>(() => {\n const k = this.key();\n return k ? `sd-query-bar:savedFilters:${k}` : undefined;\n });\n\n // why: reload whenever the namespace key changes (e.g. host switches user/context).\n readonly #loadFilters = effect(() => {\n const storage = this.#storageKey();\n if (!storage) {\n this.savedFilters.set([]);\n return;\n }\n try {\n const raw = localStorage.getItem(storage);\n this.savedFilters.set(raw ? JSON.parse(raw) : []);\n } catch {\n this.savedFilters.set([]);\n }\n });\n\n #persist(filters: SdSavedFilter[]): void {\n const storage = this.#storageKey();\n if (!storage) return;\n try {\n localStorage.setItem(storage, JSON.stringify(filters));\n } catch {\n /* quota / disabled storage — silent */\n }\n }\n\n /**\n * Prompt for a name and append a snapshot of the current query as a new\n * saved filter. Public so the parent toolbar can wire its external \"save\"\n * button to this method without re-implementing persistence.\n */\n async promptSave(): Promise<void> {\n if (!this.#storageKey()) return;\n // why: window.prompt chặn UI thread, không style/i18n được và bị vô hiệu trong vài\n // môi trường (iframe sandbox) — dialog withInput dùng chung hạ tầng confirm của lib.\n let name: string | undefined;\n try {\n name = await this.#confirm.withInput(this.#i18n.t('core.component.query-bar.saved-filters.name-label'), {\n title: this.#i18n.t('core.component.query-bar.saved-filters.save'),\n required: true,\n });\n } catch {\n return; // user huỷ dialog\n }\n if (!name?.trim()) return;\n const filter: SdSavedFilter = {\n id: typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : String(Date.now()),\n name: name.trim(),\n query: this.query(),\n };\n const next = [...this.savedFilters(), filter];\n this.savedFilters.set(next);\n this.#persist(next);\n }\n\n /** Apply a saved filter — host re-installs filters/logic/search via `(apply)`. */\n pick(filter: SdSavedFilter): void {\n this.apply.emit(filter);\n }\n\n /** Delete a saved filter by id. Stops propagation so the parent button doesn't fire `pick`. */\n remove(id: string, ev?: Event): void {\n ev?.stopPropagation();\n const next = this.savedFilters().filter(f => f.id !== id);\n this.savedFilters.set(next);\n this.#persist(next);\n }\n}\n","<button\n type=\"button\"\n class=\"c-saved-filters\"\n [disabled]=\"!key()\"\n [matMenuTriggerFor]=\"menu\"\n [matTooltip]=\"key() ? tooltipLabel() : tooltipDisabledLabel()\">\n <sd-icon name=\"bookmark_border\"></sd-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\" class=\"c-saved-filters-menu\" xPosition=\"before\" yPosition=\"below\">\n @for (f of savedFilters(); track f.id) {\n <button type=\"button\" mat-menu-item class=\"c-sf-row\" (click)=\"pick(f)\">\n <sd-icon class=\"c-sf-lead\" name=\"filter_alt\"></sd-icon>\n <span class=\"c-sf-name\">{{ f.name }}</span>\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"c-sf-del\"\n [attr.aria-label]=\"deleteLabel()\"\n (click)=\"remove(f.id, $event)\"\n (keydown.enter)=\"remove(f.id, $event)\">\n <sd-icon name=\"close\"></sd-icon>\n </span>\n </button>\n } @empty {\n <div class=\"c-sf-empty\">{{ emptyLabel() }}</div>\n }\n <!-- why: footer save action sống trong mat-menu để dropdown gom 1 vùng (list +\n save) — user mở dropdown thấy ngay cả 2 hành động, không phải tìm nút lưu\n ở chỗ khác trên toolbar. -->\n <hr class=\"c-sf-divider\" aria-hidden=\"true\" />\n <button type=\"button\" mat-menu-item class=\"c-sf-save\" [disabled]=\"!key()\" (click)=\"promptSave()\">\n <sd-icon name=\"bookmark_add\"></sd-icon>\n <span>{{ saveLabel() }}</span>\n </button>\n</mat-menu>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, model, output } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\nimport { SdQuery, SdQueryLogic, SdSavedFilter } from '../../query-bar.model';\nimport { SdQuerySavedFiltersMenu } from '../saved-filters-menu/saved-filters-menu.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/**\n * Right-pinned toolbar for `sd-query-bar`: AND/OR connector toggle, clear-all,\n * saved-filters dropdown (with footer \"Lưu bộ lọc hiện tại\"), and the deferred\n * Search trigger. Owns no business logic — just routes user intent back via\n * outputs (`(logic)` model, `(clear)`, `(search)`, `(applyFilter)`).\n *\n * The \"save current query\" action lives INSIDE the saved-filters mat-menu\n * footer (one zone for both apply + save). The dropdown trigger sits\n * immediately before Search so the user sees one filter-cluster on the right.\n */\n@Component({\n selector: 'sd-query-actions-bar',\n templateUrl: './actions-bar.component.html',\n styleUrl: './actions-bar.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatTooltipModule, SdQuerySavedFiltersMenu],\n})\nexport class SdQueryActionsBar {\n readonly #i18n = inject(I18nService);\n\n // AND/OR toggle —\n readonly showLogicToggle = input(false, { transform: booleanAttribute });\n readonly logic = model<SdQueryLogic>('AND');\n readonly filtersCount = input(0);\n\n // Saved filters —\n readonly showSavedFilters = input(false, { transform: booleanAttribute });\n readonly savedFiltersKey = input<string | undefined>(undefined);\n readonly query = input<SdQuery>({ filters: [], logic: 'AND' });\n readonly applyFilter = output<SdSavedFilter>();\n\n // Clear-all —\n readonly showClearAll = input(true, { transform: booleanAttribute });\n readonly clear = output<void>();\n\n // Search trigger —\n readonly canSearch = input(false);\n readonly search = output<void>();\n\n // Nhãn i18n —\n // why: bọc trong `computed()` chứ không dùng pipe `translate` (pure pipe không chạy lại khi\n // `I18nService.setLanguage()` đổi catalog), và `clear-all` còn phải nội suy `{count}` nên\n // ghép chuỗi trong template sẽ khoá cứng trật tự từ của tiếng Việt.\n readonly logicGroupLabel = computed(() => this.#i18n.t('core.component.query-bar.logic-operator'));\n readonly clearAllLabel = computed(() => this.#i18n.t('core.component.query-bar.clear-all', { count: this.filtersCount() }));\n readonly searchLabel = computed(() => this.#i18n.t('core.component.query-bar.search'));\n\n setLogic(value: SdQueryLogic): void {\n if (this.logic() === value) return;\n this.logic.set(value);\n }\n}\n","<!-- Vertical separator between the wrapping filter area (left) and the pinned toolbar. -->\n<span class=\"c-bar-divider\" aria-hidden=\"true\"></span>\n\n<div class=\"c-query-bar__actions\">\n <!-- AND / OR toggle -->\n @if (showLogicToggle() && filtersCount() >= 2) {\n <div class=\"c-logic-toggle\" role=\"group\" [attr.aria-label]=\"logicGroupLabel()\">\n <button\n type=\"button\"\n class=\"c-logic-segment\"\n [class.c-logic-active]=\"logic() === 'AND'\"\n (click)=\"setLogic('AND')\">\n AND\n </button>\n <button\n type=\"button\"\n class=\"c-logic-segment\"\n [class.c-logic-active]=\"logic() === 'OR'\"\n (click)=\"setLogic('OR')\">\n OR\n </button>\n </div>\n }\n\n @if (showClearAll() && filtersCount() > 0) {\n <button\n type=\"button\"\n class=\"c-clear-all\"\n [matTooltip]=\"clearAllLabel()\"\n (click)=\"clear.emit()\">\n <sd-icon name=\"delete_sweep\"></sd-icon>\n </button>\n }\n\n <!-- why: saved-filters dropdown đặt sát ngay trước Search — gom toàn bộ\n hành động về bộ lọc (apply view cũ / lưu view hiện tại) cạnh nút submit,\n user thấy 1 cụm. Footer \"Lưu bộ lọc hiện tại\" sống trong mat-menu của\n saved-filters-menu, không tách ra nút riêng nữa. -->\n @if (showSavedFilters()) {\n <sd-query-saved-filters-menu\n [key]=\"savedFiltersKey()\"\n [query]=\"query()\"\n (apply)=\"applyFilter.emit($event)\" />\n }\n\n <!-- why: far-right \"submit at the end of the toolbar\" position; sole query trigger. -->\n <button\n type=\"button\"\n class=\"c-search-trigger\"\n [disabled]=\"!canSearch()\"\n [matTooltip]=\"searchLabel()\"\n (click)=\"search.emit()\">\n <sd-icon name=\"search\"></sd-icon>\n </button>\n</div>\n","import { Signal } from '@angular/core';\nimport { SdSearch } from '@sdcorejs/angular/forms/models';\nimport { Filter, NestedKeyOf, Operator } from '@sdcorejs/utils/models';\n\n// ---------------------------------------------------------------------------\n// Field definitions — discriminated union by `type`, mirroring sd-table column\n// vocabulary. Each consumer declares its searchable fields via `SdQueryField`.\n// ---------------------------------------------------------------------------\n\nexport type SdQueryFieldType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'values' | 'lazy-values';\n\ninterface SdQueryFieldBase<T = unknown> {\n /** Dot-notation field path (matches `Filter.field`). */\n key: NestedKeyOf<T>;\n /** Human-readable label shown on chip + field picker. */\n label: string;\n /** Material icon name; falls back to `SD_QUERY_TYPE_ICON[type]` then `'tune'`. */\n icon?: string;\n /**\n * Controls the operator selector in the chip popover:\n * - omitted / `false` → **simple mode**: no operator dropdown; the chip always uses\n * `defaultOperator` (or the per-type default). Use this for screens that don't need\n * operator choice.\n * - `true` → show the full operator set for the field's `type`\n * (`SD_QUERY_OPERATORS_BY_TYPE[type]`).\n * - `Operator[]` → show exactly these operators.\n */\n operators?: boolean | Operator[];\n /**\n * Operator the chip starts with. Falls back to `SD_QUERY_DEFAULT_OPERATOR_BY_TYPE[type]`:\n * string→CONTAIN, number→EQUAL, values/lazy-values→IN, boolean→EQUAL, date/datetime→BETWEEN.\n */\n defaultOperator?: Operator;\n /** Field is offered in picker but not interactive (read-only badge in chip). */\n disabled?: boolean;\n}\n\nexport interface SdQueryFieldString<T = unknown> extends SdQueryFieldBase<T> {\n type: 'string';\n}\n\nexport interface SdQueryFieldNumber<T = unknown> extends SdQueryFieldBase<T> {\n type: 'number';\n /** Bounds for the input control inside the chip popover. */\n min?: number;\n max?: number;\n /** Step for the number input. */\n step?: number;\n}\n\nexport interface SdQueryFieldBoolean<T = unknown> extends SdQueryFieldBase<T> {\n type: 'boolean';\n /** Labels rendered for the true/false buttons. Default: \"Có\" / \"Không\". */\n trueLabel?: string;\n falseLabel?: string;\n}\n\nexport interface SdQueryFieldDate<T = unknown> extends SdQueryFieldBase<T> {\n type: 'date' | 'datetime';\n /** Restrict the picker calendar to this range. */\n min?: Date | string;\n max?: Date | string;\n}\n\n/**\n * Statically-known options (sync array, signal, or one-shot promise).\n * Mirrors `SdTableColumnValues.option`.\n */\nexport interface SdQueryFieldValues<T = unknown, K = Record<string, any>> extends SdQueryFieldBase<T> {\n type: 'values';\n option: {\n items: K[] | Signal<K[]> | (() => Promise<K[]>);\n valueField: NestedKeyOf<K>;\n displayField: NestedKeyOf<K>;\n };\n}\n\n/**\n * Server-backed options — searchable, paginated. Mirrors `SdTableColumnLazyValues.option`.\n * `search` is the unified `SdSearch<K>` callback used by `sd-select`: it handles\n * `{ type: 'SEARCH', searchText }` for live queries and `{ type: 'VALUE', value }` for\n * resolving chip-display labels of already-selected IDs.\n */\nexport interface SdQueryFieldLazyValues<T = unknown, K = Record<string, any>> extends SdQueryFieldBase<T> {\n type: 'lazy-values';\n option: {\n search: SdSearch<K>;\n valueField: NestedKeyOf<K>;\n displayField: NestedKeyOf<K>;\n };\n}\n\nexport type SdQueryField<T = unknown> =\n | SdQueryFieldString<T>\n | SdQueryFieldNumber<T>\n | SdQueryFieldBoolean<T>\n | SdQueryFieldDate<T>\n | SdQueryFieldValues<T>\n | SdQueryFieldLazyValues<T>;\n\n// ---------------------------------------------------------------------------\n// Output model — `SdQuery` is the canonical payload emitted via `[(query)]`.\n// It composes the reusable `Filter[]` from utils plus query-bar-only metadata\n// (global logic, free-text search). Callers can also bind `[(filters)]` alone\n// when they don't need logic/search.\n// ---------------------------------------------------------------------------\n\nexport type SdQueryLogic = 'AND' | 'OR';\n\nexport interface SdQuery<T = unknown> {\n filters: Filter<T>[];\n /** Global connector between filters. Defaults to `'AND'`. */\n logic?: SdQueryLogic;\n /** Free-text search box (only present when `showSearch=true`). */\n search?: string;\n}\n\nexport interface SdQueryBarOption<T = unknown> {\n /** Prefix for auto-generated `data-autoid` on inner controls. */\n autoId?: string;\n /** Available fields the user can filter by. */\n fields: SdQueryField<T>[];\n /** Initial active filter chips. */\n filters?: Filter<T>[];\n /** Initial global connector between filters. */\n logic?: SdQueryLogic;\n /** Initial free-text search string. */\n search?: string;\n mode?: 'popover' | 'inline';\n density?: 'compact' | 'comfortable';\n showSearch?: boolean;\n showSavedFilters?: boolean;\n savedFiltersKey?: string;\n showLogicToggle?: boolean;\n showClearAll?: boolean;\n showOperatorOnChip?: boolean;\n onQueryChange?: (query: SdQuery<T>) => void;\n onApply?: (query: SdQuery<T>) => void;\n}\n\n/** Persisted bookmark of a query (filters + logic + search) — managed by `[savedFiltersKey]`. */\nexport interface SdSavedFilter<T = unknown> {\n id: string;\n name: string;\n query: SdQuery<T>;\n}\n\n/**\n * Transient state of the in-progress chip during inline-mode token build (field →\n * operator → value). Lives at the parent (`SdQueryBar.building()`) and is rendered\n * by `<sd-query-build-chip>`. Step transitions:\n * - 'operator' — operator menu open, waiting for the user to pick a condition\n * - 'value' — operator locked, value picker / seamless input is the focus\n */\nexport interface BuildingChip<T = unknown> {\n field: SdQueryField<T>;\n operator?: Operator;\n step: 'operator' | 'value';\n value?: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Full operator set per field type — used when `operators: true`. */\nexport const SD_QUERY_OPERATORS_BY_TYPE: Record<SdQueryFieldType, Operator[]> = {\n string: ['CONTAIN', 'EQUAL', 'NOT_EQUAL', 'START_WITH', 'END_WITH', 'NULL', 'NOT_NULL'],\n number: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'GREATER_OR_EQUAL', 'LESS_THAN', 'LESS_OR_EQUAL', 'BETWEEN'],\n boolean: ['EQUAL'],\n date: ['EQUAL', 'BETWEEN', 'GREATER_THAN', 'LESS_THAN'],\n datetime: ['EQUAL', 'BETWEEN', 'GREATER_THAN', 'LESS_THAN'],\n values: ['IN', 'NOT_IN', 'NULL', 'NOT_NULL'],\n 'lazy-values': ['IN', 'NOT_IN', 'NULL', 'NOT_NULL'],\n};\n\n/** Default operator when a chip is created and `field.defaultOperator` is not set. */\nexport const SD_QUERY_DEFAULT_OPERATOR_BY_TYPE: Record<SdQueryFieldType, Operator> = {\n string: 'CONTAIN',\n number: 'EQUAL',\n boolean: 'EQUAL',\n date: 'BETWEEN',\n datetime: 'BETWEEN',\n values: 'IN',\n 'lazy-values': 'IN',\n};\n\n/** Icon fallback per field type when `SdQueryField.icon` is not set. */\nexport const SD_QUERY_TYPE_ICON: Record<SdQueryFieldType, string> = {\n string: 'text_fields',\n number: 'tag',\n boolean: 'toggle_on',\n date: 'event',\n datetime: 'schedule',\n values: 'list',\n 'lazy-values': 'list',\n};\n\n/**\n * Resolves the icon shown on chips and in the field picker.\n * Priority: `field.icon` → `SD_QUERY_TYPE_ICON[field.type]` → `'tune'`.\n */\nexport function sdQueryFieldIcon(field: SdQueryField): string {\n return field.icon ?? SD_QUERY_TYPE_ICON[field.type] ?? 'tune';\n}\n\n/** Operators that carry no data — value section is hidden in chip popover. */\nexport const SD_QUERY_NO_DATA_OPERATORS: Operator[] = ['NULL', 'NOT_NULL'];\n\n/** Operators that carry an array payload — UI offers multi-select. */\nexport const SD_QUERY_MULTI_OPERATORS: Operator[] = ['IN', 'NOT_IN'];\n\n/** Picks the initial operator when a new chip is created for `field`. */\nexport function sdQueryDefaultOperator(field: SdQueryField): Operator {\n if (field.defaultOperator) return field.defaultOperator;\n return SD_QUERY_DEFAULT_OPERATOR_BY_TYPE[field.type];\n}\n\n/**\n * Cache của nhánh \"simple mode\" trong `sdQueryAllowedOperators`, keyed theo chính object field.\n *\n * why: nhánh mặc định (`field.operators` không khai báo) là case PHỔ BIẾN nhất và trước đây cấp\n * phát một mảng `[defaultOperator]` MỚI mỗi lần gọi. Template bind\n * `[allowedOperators]=\"allowedOperatorsFor(_b.field)\"` nên hàm này chạy lại mỗi chu kỳ change\n * detection → child OnPush nhận input ref mới → markForCheck → CD mới → mảng mới → vòng lặp vô\n * hạn, đúng bug class OOM đã ghi ở `query-builder` `#booleanOptionsByKey`. Dùng WeakMap để\n * không giữ field sống lâu hơn consumer.\n *\n * Chỉ memo hoá nhánh mặc định: hai nhánh còn lại trả về hằng số chung\n * (`SD_QUERY_OPERATORS_BY_TYPE`) hoặc chính mảng của consumer, vốn đã ổn định sẵn — và giữ\n * chúng ngoài cache để field đổi `operators` tại chỗ vẫn được đọc lại.\n */\nconst DEFAULT_OPERATOR_LIST_CACHE = new WeakMap<SdQueryField, Operator[]>();\n\n/**\n * Operators offered in the chip popover for `field`:\n * - `operators === true` → full set for the type\n * - `operators` is an array → that array (deduped against the type set is the caller's job)\n * - otherwise (simple mode) → just the single default operator (no real choice)\n *\n * The returned array is referentially stable for a given `field` object, so it is safe to call\n * straight from a template binding.\n */\nexport function sdQueryAllowedOperators(field: SdQueryField): Operator[] {\n if (field.operators === true) return SD_QUERY_OPERATORS_BY_TYPE[field.type];\n if (Array.isArray(field.operators) && field.operators.length > 0) return field.operators;\n\n const cached = DEFAULT_OPERATOR_LIST_CACHE.get(field);\n if (cached) return cached;\n\n const single: Operator[] = [sdQueryDefaultOperator(field)];\n DEFAULT_OPERATOR_LIST_CACHE.set(field, single);\n return single;\n}\n\n/**\n * Whether the operator selector should be visible. Simple mode (operators omitted/false,\n * or an array with a single entry) hides the dropdown — the chip uses one fixed operator.\n */\nexport function sdQueryShowOperatorSelector(field: SdQueryField): boolean {\n return sdQueryAllowedOperators(field).length > 1;\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, viewChild } from '@angular/core';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdInlineText } from '@sdcorejs/angular/forms/inline-text';\nimport { Operator } from '@sdcorejs/utils/models';\n\nimport { SD_QUERY_NO_DATA_OPERATORS, SdQueryField, sdQueryFieldIcon } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ninterface Range {\n from?: any;\n to?: any;\n}\ntype ChipState = 'pending' | 'active' | 'focus' | 'error';\n\n/**\n * Seamless inline value chip for `string` / `number` fields (inline mode only).\n *\n * why: the pill itself IS the input — one border, no nested rectangle control. The\n * label + value + remove live in three flush segments inside a single pill envelope.\n * Mirrors refs/design_handoff_sd_query_bar \"Seamless string/number chip\" handoff.\n *\n * Commit model matches inline mode: edits write back via `(valueChange)` immediately\n * (host folds into `filters` without emitting); the bar's Search button stays the only\n * query trigger. Enter commits + blurs, Esc reverts + blurs, blur commits.\n */\n@Component({\n selector: 'sd-query-inline-value-chip',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, SdOperator, SdInlineText],\n templateUrl: './inline-value-chip.component.html',\n styleUrl: './inline-value-chip.component.scss',\n})\nexport class SdQueryInlineValueChip {\n readonly #i18n = inject(I18nService);\n\n /** Field this chip filters by — must be kind `string` or `number`. */\n readonly field = input.required<SdQueryField>();\n /** Active operator (drives BETWEEN dual-input + no-data hiding). */\n readonly operator = input<Operator>('CONTAIN');\n /** Current value: scalar for most operators, `{ from, to }` for BETWEEN. */\n readonly value = input<unknown>(null);\n readonly density = input<'compact' | 'comfortable'>('compact');\n /** Show the operator label as a small pill inside the label segment. */\n readonly showOperator = input(false);\n /** Prefix for the inner input's `data-autoid`. */\n readonly autoId = input<string | undefined>(undefined);\n /** Focus the first input on creation — used for the in-progress build chip. */\n readonly autofocus = input(false);\n\n /** Emitted on commit (Enter / blur) with the parsed next value. */\n readonly valueChange = output<unknown>();\n /** Emitted when the user clicks the × segment. */\n readonly remove = output<void>();\n\n private readonly firstInput = viewChild<SdInlineText>('firstInput');\n\n readonly focused = signal(false);\n readonly hasError = signal(false);\n\n /** Editable drafts — single value, plus from/to for BETWEEN. Seeded from `value`. */\n readonly draft = signal('');\n readonly draftFrom = signal('');\n readonly draftTo = signal('');\n\n readonly isNumber = computed(() => this.field().type === 'number');\n readonly isBetween = computed(() => this.operator() === 'BETWEEN');\n readonly isNoData = computed(() => SD_QUERY_NO_DATA_OPERATORS.includes(this.operator()));\n\n readonly icon = computed(() => sdQueryFieldIcon(this.field()));\n\n // why: placeholder của field số và field chuỗi khác nhau về cách viết hoa/dấu ba chấm nên phải\n // là key riêng — không tự ghép được từ một chuỗi chung cho mọi ngôn ngữ.\n readonly ph = computed(() =>\n this.#i18n.t(this.isNumber() ? 'core.component.query-bar.placeholder.value' : 'core.component.query-bar.placeholder.text')\n );\n readonly phFrom = computed(() =>\n this.#i18n.t(this.isNumber() ? 'core.component.query-bar.placeholder.from-number' : 'core.component.query-bar.placeholder.from-text')\n );\n readonly phTo = computed(() =>\n this.#i18n.t(this.isNumber() ? 'core.component.query-bar.placeholder.to-number' : 'core.component.query-bar.placeholder.to-text')\n );\n\n readonly hasValue = computed(() => {\n if (this.isNoData()) return true;\n const v = this.value();\n if (this.isBetween()) {\n const r = (v ?? {}) as Range;\n return (r.from != null && r.from !== '') || (r.to != null && r.to !== '');\n }\n return v != null && v !== '';\n });\n\n readonly state = computed<ChipState>(() => {\n if (this.hasError()) return 'error';\n if (this.focused()) return 'focus';\n return this.hasValue() ? 'active' : 'pending';\n });\n\n constructor() {\n // Reseed drafts whenever the bound value / operator / kind changes. While the user\n // types, none of those change (commit is on blur), so this never clobbers an edit.\n effect(() => {\n const v = this.value();\n if (this.isBetween()) {\n const r = (v ?? {}) as Range;\n this.draftFrom.set(this.#format(r.from));\n this.draftTo.set(this.#format(r.to));\n } else {\n this.draft.set(this.#format(v));\n }\n });\n\n // why: the build chip lands focused (autofocus) so the user types straight away —\n // <sd-inline-text> owns that via its own [autofocus] input, so no afterNextRender here.\n }\n\n /** Click anywhere in the pill (except × or an input) focuses the first input. */\n focusFromShell(ev: Event): void {\n const target = ev.target as HTMLElement;\n if (target.closest('.c-seamless__x') || target.closest('input')) return;\n this.firstInput()?.focus();\n }\n\n onFocus(): void {\n this.focused.set(true);\n }\n\n /** Commit a single-value field (string / number, non-BETWEEN). */\n commitSingle(): void {\n this.focused.set(false);\n const parsed = this.#parse(this.draft());\n if (!parsed.ok) {\n this.hasError.set(true);\n return;\n }\n this.hasError.set(false);\n this.valueChange.emit(parsed.value);\n }\n\n /** Commit a BETWEEN range — both ends parsed, emitted as `{ from, to }`. */\n commitRange(): void {\n this.focused.set(false);\n const from = this.#parse(this.draftFrom());\n const to = this.#parse(this.draftTo());\n if (!from.ok || !to.ok) {\n this.hasError.set(true);\n return;\n }\n this.hasError.set(false);\n this.valueChange.emit({ from: from.value, to: to.value });\n }\n\n /** Esc — revert drafts to the committed value and blur without emitting. */\n revertAndBlur(ref?: { blur: () => void }): void {\n const v = this.value();\n if (this.isBetween()) {\n const r = (v ?? {}) as Range;\n this.draftFrom.set(this.#format(r.from));\n this.draftTo.set(this.#format(r.to));\n } else {\n this.draft.set(this.#format(v));\n }\n this.hasError.set(false);\n this.focused.set(false);\n ref?.blur();\n }\n\n onRemove(ev: Event): void {\n ev.stopPropagation();\n this.remove.emit();\n }\n\n /** Format a stored value for display — number → vi-VN grouped digits. */\n #format(v: any): string {\n if (v == null || v === '') return '';\n if (this.isNumber()) {\n const n = typeof v === 'number' ? v : Number(String(v).replace(/\\./g, ''));\n return Number.isFinite(n) ? n.toLocaleString('vi-VN') : String(v);\n }\n return String(v);\n }\n\n /** Parse a draft back to a stored value. Number kind rejects non-numeric input. */\n #parse(s: string): { ok: boolean; value: any } {\n const t = (s ?? '').trim();\n if (t === '') return { ok: true, value: this.isNumber() ? null : '' };\n if (this.isNumber()) {\n // vi-VN groups thousands with '.', so strip dots + spaces, then require a plain\n // (optionally negative) integer — anything else (letters, stray symbols) is an error.\n const cleaned = t.replace(/[.\\s]/g, '');\n if (!/^-?\\d+$/.test(cleaned)) return { ok: false, value: t };\n const n = Number(cleaned);\n return Number.isFinite(n) ? { ok: true, value: n } : { ok: false, value: t };\n }\n return { ok: true, value: t };\n }\n}\n","<!--\n Seamless string/number chip — the pill IS the input. One border, three flush\n segments: label · input(s) · ×. State styling driven by [data-state]. The value\n field is the shared <sd-inline-text> primitive (chrome=\"seamless\") so width hugs\n content; the chip keeps the envelope + parse/commit logic.\n-->\n@let _state = state();\n@let _autoId = autoId();\n@let _isNoData = isNoData();\n@let _density = density();\n@let _operator = operator();\n\n<!-- why: vỏ chip là một NHÓM control (nhãn + ô nhập + nút ×), không phải nút → role=\"group\" +\n aria-label mô tả đúng cấu trúc và cũng cho biết vì sao nó KHÔNG nhận tabindex (tab đi thẳng\n vào input bên trong). `focusFromShell` đã tự loại click trên input và trên nút × nên gắn thêm\n Enter dùng chung handler là an toàn và phản chiếu đúng hành vi click. -->\n<span\n class=\"c-seamless\"\n role=\"group\"\n [attr.aria-label]=\"field().label\"\n [attr.data-state]=\"_state\"\n [class.c-seamless--compact]=\"_density === 'compact'\"\n [class.c-seamless--comfortable]=\"_density === 'comfortable'\"\n (click)=\"focusFromShell($event)\"\n (keydown.enter)=\"focusFromShell($event)\">\n\n <!-- Label segment: icon + field name (+ optional operator pill) -->\n <span class=\"c-seamless__label\">\n <sd-icon class=\"c-seamless__icon\" [name]=\"icon()\"></sd-icon>\n <span class=\"c-seamless__field\">{{ field().label }}</span>\n @if (showOperator() && !_isNoData) {\n <sd-operator class=\"c-seamless__op\" [operators]=\"[_operator]\" [model]=\"_operator\" [disabled]=\"true\" />\n } @else if (!_isNoData) {\n <span class=\"c-seamless__sep\">:</span>\n }\n </span>\n\n <!-- Input segment — seamless borderless primitive; hidden for NULL / NOT_NULL -->\n @if (!_isNoData) {\n <span class=\"c-seamless__input\">\n @if (isBetween()) {\n <sd-inline-text\n #firstInput\n chrome=\"seamless\"\n [clearable]=\"false\"\n [autofocus]=\"autofocus()\"\n [state]=\"_state\"\n [value]=\"draftFrom()\"\n (valueChange)=\"draftFrom.set($event)\"\n [placeholder]=\"phFrom()\"\n [autoId]=\"_autoId ? _autoId + '-from' : undefined\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"commitRange()\"\n (keyupEnter)=\"firstInput.blur()\"\n (keydownEscape)=\"revertAndBlur(firstInput)\" />\n <span class=\"c-seamless__dash\" aria-hidden=\"true\">—</span>\n <sd-inline-text\n #secondInput\n chrome=\"seamless\"\n [clearable]=\"false\"\n [state]=\"_state\"\n [value]=\"draftTo()\"\n (valueChange)=\"draftTo.set($event)\"\n [placeholder]=\"phTo()\"\n [autoId]=\"_autoId ? _autoId + '-to' : undefined\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"commitRange()\"\n (keyupEnter)=\"secondInput.blur()\"\n (keydownEscape)=\"revertAndBlur(secondInput)\" />\n } @else {\n <sd-inline-text\n #firstInput\n chrome=\"seamless\"\n [clearable]=\"false\"\n [autofocus]=\"autofocus()\"\n [state]=\"_state\"\n [value]=\"draft()\"\n (valueChange)=\"draft.set($event)\"\n [placeholder]=\"ph()\"\n [autoId]=\"_autoId ?? undefined\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"commitSingle()\"\n (keyupEnter)=\"firstInput.blur()\"\n (keydownEscape)=\"revertAndBlur(firstInput)\" />\n }\n </span>\n }\n\n <!-- × segment -->\n <button type=\"button\" class=\"c-seamless__x\" aria-label=\"Remove filter\" (click)=\"onRemove($event)\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n</span>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, viewChild } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { Operator } from '@sdcorejs/utils/models';\n\nimport { SdQueryInlineValueChip } from '../inline-value-chip/inline-value-chip.component';\nimport { BuildingChip } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ntype Density = 'compact' | 'comfortable';\n\n/**\n * Visual block for the in-progress build chip (inline mode token builder).\n *\n * why: tách khỏi `<sd-query-bar>` để parent chỉ giữ state (`building()` signal +\n * step transitions) — tất cả render logic của 2 step (operator picker / value\n * picker) cộng với 7 nhánh field type sống tại đây.\n *\n * The chip has two visually distinct branches:\n * - **Seamless** (`string` / `number`) — the entire pill IS an `<sd-query-inline-value-chip>`\n * (its own border, autofocused input). The host's `.c-token-building` shell is skipped.\n * - **Token** (`values` / `lazy-values` / `date` / `datetime` / `boolean` / other) —\n * `.c-token.c-token-building` dashed pill with field label + operator (menu in\n * operator step, disabled badge in value step) + the per-type picker + × cancel.\n */\n@Component({\n selector: 'sd-query-build-chip',\n templateUrl: './build-chip.component.html',\n styleUrl: './build-chip.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, CommonModule, SdOperator, SdDate, SdDateRange, SdDatetime, SdInput, SdInputNumber, SdSelect, SdQueryInlineValueChip],\n})\nexport class SdQueryBuildChip {\n readonly #i18n = inject(I18nService);\n\n // why: nhãn mặc định của field boolean phải trùng với nhãn parent dựng cho chip đã hoàn thành\n // (`SdQueryBar.chipValueText`), nếu không cùng một field sẽ hiện hai ngôn ngữ giữa lúc đang tạo\n // chip và lúc chip xong.\n readonly booleanTrueLabel = computed(() => this.#i18n.t('core.component.query-bar.boolean.true'));\n readonly booleanFalseLabel = computed(() => this.#i18n.t('core.component.query-bar.boolean.false'));\n\n /** Current build state — drives every visual branch. */\n readonly building = input.required<BuildingChip>();\n\n /** Density preset — forwarded to the seamless chip + sizes the .c-token row. */\n readonly density = input<Density>('compact');\n\n /** Operator set offered in the operator-step menu (parent's `allowedOperatorsFor(field)`). */\n readonly allowedOperators = input<Operator[]>([]);\n\n /** Whether the active operator is a multi-select (`IN`/`NOT_IN`) — drives sd-select [multiple]. */\n readonly multiple = input(false);\n\n /** Show the operator label on the seamless chip's pill (forwarded to inline-value-chip). */\n readonly showOperator = input(false);\n\n /**\n * Prefix for `data-autoid` on the inner picker / seamless input.\n * why: parent originally hard-coded `'qb-build-value'` everywhere; default preserves that\n * for backward compatibility with existing e2e selectors.\n */\n readonly autoId = input<string>('qb-build-value');\n\n // ---------------------------------------------------------------------------\n // Outputs\n // ---------------------------------------------------------------------------\n\n /** Operator chosen from the operator-step menu — parent advances to value step. */\n readonly pickOperator = output<Operator>();\n\n /**\n * Value committed from a non-seamless picker (sd-select / sd-date / sd-date-range /\n * sd-datetime) or a boolean toggle. Parent pushes the completed chip and clears building.\n */\n readonly commitValue = output<unknown>();\n\n /** × button — abandon the build (parent clears `building` signal). */\n readonly cancel = output<void>();\n\n /**\n * Commit from the seamless (string / number) branch. Parent decides empty → cancel\n * vs push complete (see `onBuildSeamlessCommit`); this just forwards the raw value.\n */\n readonly seamlessCommit = output<unknown>();\n\n /** Fallback editor (boolean ng-template / other) — staged draft on every change. */\n readonly draftChange = output<unknown>();\n\n /** Fallback editor — Enter / click commits the staged draft. */\n readonly draftCommit = output<void>();\n\n // ---------------------------------------------------------------------------\n // Internal refs — used by parent via public open*() methods\n // ---------------------------------------------------------------------------\n\n /** Operator-step menu — auto-opened by parent right after `building` enters operator step. */\n private readonly opMenu = viewChild<SdOperator>('buildOperator');\n\n /** Value-step picker (the active bare control) — auto-opened by parent at value step. */\n private readonly picker = viewChild<SdSelect | SdDate | SdDatetime | SdDateRange>('bPicker');\n\n /** Open the operator menu — parent calls after rendering the operator step. */\n openOperator(): void {\n this.opMenu()?.open();\n }\n\n /** Open the value-step picker's native panel — parent calls after rendering the value step. */\n openPicker(): void {\n (this.picker() as any)?.open?.();\n }\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n /** True when the seamless branch (string/number value step) should be rendered. */\n readonly isSeamless = computed<boolean>(() => {\n const b = this.building();\n if (b.step !== 'value') return false;\n const t = b.field.type;\n return t === 'string' || t === 'number';\n });\n}\n","<!--\n In-progress chip (inline-mode token build flow).\n Seamless string/number branch keeps its own pill; everything else renders inside\n the dashed .c-token.c-token-building shell.\n-->\n@let _building = building();\n@let _autoId = autoId();\n\n@if (isSeamless()) {\n <sd-query-inline-value-chip\n [field]=\"_building.field\"\n [operator]=\"$any(_building.operator)\"\n [value]=\"_building.value ?? null\"\n [density]=\"density()\"\n [showOperator]=\"showOperator()\"\n [autoId]=\"_autoId\"\n [autofocus]=\"true\"\n (valueChange)=\"seamlessCommit.emit($event)\"\n (remove)=\"cancel.emit()\" />\n} @else {\n <div class=\"c-token c-token-building\">\n <span class=\"c-token-field\">{{ _building.field.label }}</span>\n\n @if (_building.step === 'operator') {\n <sd-operator\n #buildOperator\n class=\"c-token-op\"\n [operators]=\"allowedOperators()\"\n [model]=\"_building.operator\"\n (modelChange)=\"pickOperator.emit($any($event))\" />\n } @else {\n <!-- why: badge readonly cho operator đã chọn — vẫn render <sd-operator>\n để giữ thị giác giống chip hoàn thành (icon + tooltip). -->\n <sd-operator\n class=\"c-token-op\"\n [operators]=\"[$any(_building.operator)]\"\n [model]=\"$any(_building.operator)\"\n [disabled]=\"true\" />\n\n @if (_building.field.type === 'values' || _building.field.type === 'lazy-values') {\n @let _bopt = $any(_building.field).option;\n <span class=\"c-token-value c-token-value-edit\">\n <sd-select #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\" minWidthPanel=\"300px\"\n [autoId]=\"_autoId\"\n [items]=\"_building.field.type === 'lazy-values' ? $any(_bopt).search : $any(_bopt.items)\"\n [valueField]=\"_bopt.valueField\"\n [displayField]=\"_bopt.displayField\"\n [multiple]=\"multiple()\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\">\n <!-- why: build chip multi-select cũng cần \"head +N\" để gọn (giống completed chip). -->\n <ng-template #sdValue let-selectedItems=\"selectedItems\">\n @if ((selectedItems?.length ?? 0) > 1) {\n <span class=\"c-token-multi-head\">{{ $any(selectedItems)[0][_bopt.displayField] }}</span> +{{ selectedItems.length - 1 }}\n } @else if ((selectedItems?.length ?? 0) === 1) {\n <span class=\"c-token-multi-head\">{{ $any(selectedItems)[0][_bopt.displayField] }}</span>\n }\n </ng-template>\n </sd-select>\n </span>\n } @else if (_building.field.type === 'date') {\n <span class=\"c-token-value c-token-value-edit\">\n @if (_building.operator === 'BETWEEN') {\n <!-- why: 1 sd-date-range thay 2 sd-date — gọn hơn, hành vi thống nhất với completed chip. -->\n <sd-date-range #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\"></sd-date-range>\n } @else {\n <sd-date #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\"></sd-date>\n }\n </span>\n } @else if (_building.field.type === 'datetime') {\n <span class=\"c-token-value c-token-value-edit\">\n @if (_building.operator === 'BETWEEN') {\n <!-- why: datetime BETWEEN downgrade về date-range (mất time precision; đã thống nhất). -->\n <sd-date-range #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\"></sd-date-range>\n } @else {\n <sd-datetime #bPicker size=\"sm\" [viewed]=\"'inline'\" [clearable]=\"false\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"commitValue.emit($event)\"></sd-datetime>\n }\n </span>\n } @else if (_building.field.type === 'boolean') {\n <!-- why: native button thay sd-button (tránh mat-button baseline 36px gây tràn).\n Pill nhỏ vẽ bằng CSS scoped trong chip — giữ semantic colour qua class\n .c-bool-true / .c-bool-false. -->\n <span class=\"c-token-value c-token-value-edit c-bool-toggle\">\n <button\n type=\"button\"\n class=\"c-bool-btn c-bool-true\"\n [class.c-bool-active]=\"_building.value === true\"\n [attr.data-autoId]=\"_autoId + '-true'\"\n (click)=\"commitValue.emit(true)\">\n {{ $any(_building.field).trueLabel || booleanTrueLabel() }}\n </button>\n <button\n type=\"button\"\n class=\"c-bool-btn c-bool-false\"\n [class.c-bool-active]=\"_building.value === false\"\n [attr.data-autoId]=\"_autoId + '-false'\"\n (click)=\"commitValue.emit(false)\">\n {{ $any(_building.field).falseLabel || booleanFalseLabel() }}\n </button>\n </span>\n } @else {\n <!-- Fallback (e.g. unforeseen type) — generic sd-input wired via draft outputs. -->\n <span class=\"c-token-value c-token-value-edit\">\n <sd-input size=\"sm\"\n [autoId]=\"_autoId\"\n [model]=\"$any(_building.value)\"\n (sdChange)=\"draftChange.emit($event)\"\n (keyupEnter)=\"draftCommit.emit()\"></sd-input>\n </span>\n }\n }\n\n <button type=\"button\" class=\"c-token-remove\" aria-label=\"Cancel\" (click)=\"cancel.emit()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, isSignal, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatMenu, MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { isObservable } from 'rxjs';\n\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { Filter, Operator } from '@sdcorejs/utils/models';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\nimport {\n SD_QUERY_MULTI_OPERATORS,\n SD_QUERY_NO_DATA_OPERATORS,\n SdQueryField,\n sdQueryAllowedOperators,\n sdQueryFieldIcon,\n sdQueryShowOperatorSelector,\n} from '../../query-bar.model';\n\ninterface Range {\n from?: string | number | null;\n to?: string | number | null;\n}\n\n/**\n * Popover-mode chip editor — the entire `<mat-menu>` that opens when a popover-mode\n * chip is clicked. Owns ALL operator+value staging signals and async option loading.\n *\n * why: tách khỏi `<sd-query-bar>` để parent chỉ giữ `editingIndex` (chip nào đang\n * mở) + nhận `(commit)` khi popover đóng. Mỗi lần parent gọi `seed(filter, field)`\n * trước khi mở chip popover, child reset staging signals + kích option loading.\n *\n * Public surface (template ref `#cp`):\n * - `cp.menu()` — the `<mat-menu>` to feed `[menu]` of `<sd-query-popover-chip>`\n * - `cp.seed(filter, field)` — parent reseeds staging before opening\n * - `(commit)` output — emitted on mat-menu close with staged Filter\n * - `(swapField)` output — emitted when the nested field switcher picks a new field\n */\n@Component({\n selector: 'sd-query-chip-popover',\n templateUrl: './chip-popover.component.html',\n styleUrl: './chip-popover.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n MatMenuModule,\n MatTooltipModule,\n SdButton,\n SdOperator,\n SdSelect,\n SdInput,\n SdInputNumber,\n SdDate,\n SdDatetime,\n ],\n})\nexport class SdQueryChipPopover {\n readonly #i18n = inject(I18nService);\n readonly swapFieldTooltip = computed(() => this.#i18n.t('core.component.query-bar.swap-field'));\n readonly fromPlaceholder = computed(() => this.#i18n.t('core.component.query-bar.placeholder.from-number'));\n readonly toPlaceholder = computed(() => this.#i18n.t('core.component.query-bar.placeholder.to-number'));\n readonly booleanTrueLabel = computed(() => this.#i18n.t('core.component.query-bar.boolean.true'));\n readonly booleanFalseLabel = computed(() => this.#i18n.t('core.component.query-bar.boolean.false'));\n readonly selectValuePlaceholder = computed(() => this.#i18n.t('core.component.query-bar.placeholder.select-value'));\n readonly enterValuePlaceholder = computed(() => this.#i18n.t('core.component.query-bar.placeholder.enter-value'));\n readonly loadingValuesLabel = computed(() => this.#i18n.t('core.component.query-bar.loading-values'));\n\n // ---------------------------------------------------------------------------\n // Inputs\n // ---------------------------------------------------------------------------\n\n /** Resolved field of the currently editing chip — parent passes from `fieldByKey()`. */\n readonly field = input<SdQueryField | undefined>(undefined);\n\n /** The chip's current Filter — used by `seed()` for initial staging values. */\n readonly filter = input<Filter | undefined>(undefined);\n\n /** Optional chip index — embedded in the composed autoIds. */\n readonly chipIndex = input<number | null>(null);\n\n /** Prefix for `data-autoId` on inner controls. */\n readonly autoIdBase = input<string>('qb');\n\n /** MatMenu for the field switcher — parent passes its `<sd-query-field-picker>` menu. */\n readonly switchPickerMenu = input<MatMenu | undefined>(undefined);\n\n // ---------------------------------------------------------------------------\n // Outputs\n // ---------------------------------------------------------------------------\n\n /** Emitted when mat-menu closes — parent splices `next` into filters[idx]. */\n readonly commit = output<Filter>();\n\n /** Emitted when nested field-switcher picks a new field — parent calls changeFilterField. */\n readonly swapField = output<SdQueryField>();\n\n // ---------------------------------------------------------------------------\n // Staging signals — uncommitted edits, committed on menu close.\n // ---------------------------------------------------------------------------\n\n /** Staged operator. */\n readonly editingOperator = signal<Operator>('EQUAL');\n /** Staged value (shape depends on field type + operator). */\n readonly editingValue = signal<unknown>(null);\n /** Resolved option list for values / lazy-values. */\n readonly editingOptions = signal<any[]>([]);\n /** Loading flag for async option fetch. */\n readonly editingOptionsLoading = signal(false);\n\n // ---------------------------------------------------------------------------\n // Derived state\n // ---------------------------------------------------------------------------\n\n readonly allowedOperators = computed<Operator[]>(() => {\n const f = this.field();\n return f ? sdQueryAllowedOperators(f) : [];\n });\n\n readonly showOperatorSelector = computed<boolean>(() => {\n const f = this.field();\n return f ? sdQueryShowOperatorSelector(f) : false;\n });\n\n /** Whether the staged operator is multi-select (IN/NOT_IN). */\n multiple(op?: Operator): boolean {\n return SD_QUERY_MULTI_OPERATORS.includes(op ?? this.editingOperator());\n }\n\n /** Whether the staged operator carries no data (NULL/NOT_NULL). */\n isNoDataOperator(op: Operator | string): boolean {\n return SD_QUERY_NO_DATA_OPERATORS.includes(op as Operator);\n }\n\n /** Compose an autoId for an inner control (`<base>-chip<idx>-<role>`). */\n chipAutoId(role: string): string {\n const base = this.autoIdBase() ?? 'qb';\n const idx = this.chipIndex();\n return `${base}-chip${idx ?? 'x'}-${role}`;\n }\n\n readonly iconFor = sdQueryFieldIcon;\n\n // ---------------------------------------------------------------------------\n // mat-menu instance — parent reads via `cp.menu()`\n // ---------------------------------------------------------------------------\n\n readonly menu = viewChild<MatMenu>('menu');\n\n // ---------------------------------------------------------------------------\n // Seed — parent calls before opening the popover so staging signals are\n // primed from the current filter + the option list is loaded.\n // ---------------------------------------------------------------------------\n\n /** Reseed staging from a new filter/field pair — call before opening the menu. */\n seed(filter: Filter | undefined, field: SdQueryField | undefined): void {\n if (!filter || !field) {\n this.editingOperator.set('EQUAL');\n this.editingValue.set(null);\n this.editingOptions.set([]);\n this.editingOptionsLoading.set(false);\n return;\n }\n this.editingOperator.set((filter as any).operator as Operator);\n this.editingValue.set((filter as any).data ?? null);\n\n if (field.type === 'values') {\n this.#loadValuesOptions(field);\n } else if (field.type === 'lazy-values') {\n this.#loadLazyOptions(field);\n } else {\n this.editingOptions.set([]);\n this.editingOptionsLoading.set(false);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Operator + value mutators\n // ---------------------------------------------------------------------------\n\n /** Called on operator change in the popover header — reshapes value when family changes. */\n onEditingOperatorChange(next: Operator): void {\n const prev = this.editingOperator();\n this.editingOperator.set(next);\n\n if (SD_QUERY_NO_DATA_OPERATORS.includes(next)) {\n this.editingValue.set(null);\n return;\n }\n if (next === 'BETWEEN') {\n const v = this.editingValue();\n if (v && typeof v === 'object' && 'from' in (v as any)) return;\n this.editingValue.set({ from: null, to: null } as Range);\n return;\n }\n const goingToMulti = SD_QUERY_MULTI_OPERATORS.includes(next);\n const wasMulti = SD_QUERY_MULTI_OPERATORS.includes(prev as Operator);\n if (goingToMulti && !wasMulti) {\n const v = this.editingValue();\n this.editingValue.set(v == null ? [] : [v]);\n } else if (!goingToMulti && wasMulti) {\n const v = this.editingValue();\n this.editingValue.set(Array.isArray(v) && v.length > 0 ? v[0] : null);\n }\n }\n\n /** Single-value input change. */\n onEditingValueInput(value: unknown): void {\n this.editingValue.set(value);\n }\n\n /** BETWEEN range — mutate only `.from`. */\n onEditingRangeFrom(value: string | number | null): void {\n const v = (this.editingValue() as Range) ?? {};\n this.editingValue.set({ ...v, from: value });\n }\n\n /** BETWEEN range — mutate only `.to`. */\n onEditingRangeTo(value: string | number | null): void {\n const v = (this.editingValue() as Range) ?? {};\n this.editingValue.set({ ...v, to: value });\n }\n\n /** Toggle a value in the staged multi-select array. */\n toggleEditingMultiValue(value: unknown): void {\n const arr = Array.isArray(this.editingValue()) ? [...(this.editingValue() as unknown[])] : [];\n const idx = arr.indexOf(value);\n if (idx >= 0) arr.splice(idx, 1);\n else arr.push(value);\n this.editingValue.set(arr);\n }\n\n isEditingMultiSelected(value: unknown): boolean {\n const v = this.editingValue();\n return Array.isArray(v) && v.includes(value);\n }\n\n // ---------------------------------------------------------------------------\n // Menu lifecycle — close = commit\n // ---------------------------------------------------------------------------\n\n /**\n * mat-menu's (closed) handler — compose the next Filter from staging signals and\n * emit (commit). Parent splices into its filters[] and nulls editingIndex.\n */\n onMenuClosed(): void {\n const f = this.filter();\n if (!f) return;\n const next: Filter = {\n field: (f as any).field,\n operator: this.editingOperator(),\n data: this.editingValue(),\n } as Filter;\n this.commit.emit(next);\n }\n\n // ---------------------------------------------------------------------------\n // Async option loaders — same logic as the parent's private methods.\n // ---------------------------------------------------------------------------\n\n #loadValuesOptions(field: SdQueryField): void {\n const opt = (field as any).option;\n const items = opt?.items;\n if (Array.isArray(items)) {\n this.editingOptions.set(items);\n this.editingOptionsLoading.set(false);\n return;\n }\n if (isSignal(items)) {\n this.editingOptions.set((items as any)());\n this.editingOptionsLoading.set(false);\n return;\n }\n if (typeof items === 'function') {\n this.editingOptionsLoading.set(true);\n Promise.resolve(items())\n .then((arr: any[]) => this.editingOptions.set(arr ?? []))\n .finally(() => this.editingOptionsLoading.set(false));\n }\n }\n\n #loadLazyOptions(field: SdQueryField, search = ''): void {\n const opt = (field as any).option;\n if (!opt?.search) return;\n this.editingOptionsLoading.set(true);\n const result = opt.search({ type: 'SEARCH', searchText: search });\n if (isObservable(result)) {\n (result as any).subscribe({\n next: (arr: any[]) => this.editingOptions.set(arr ?? []),\n complete: () => this.editingOptionsLoading.set(false),\n error: () => this.editingOptionsLoading.set(false),\n });\n } else {\n Promise.resolve(result)\n .then((arr: any[]) => this.editingOptions.set(arr ?? []))\n .finally(() => this.editingOptionsLoading.set(false));\n }\n }\n}\n","<!--\n Chip popover — operator + value editor for the popover-mode chip.\n Visual layout mirrors the previous inline `<mat-menu #chipPopover>` in query-bar.\n Body branches on operator + field.type — 8 paths preserved exactly.\n-->\n<mat-menu #menu=\"matMenu\" class=\"c-chip-popover\" xPosition=\"after\" yPosition=\"below\" (closed)=\"onMenuClosed()\">\n <ng-template matMenuContent>\n @let _field = field();\n @let _editingOperator = editingOperator();\n @let _editingValue = editingValue();\n @let _editingOptions = editingOptions();\n @let _editingOptionsLoading = editingOptionsLoading();\n @let _switchPickerMenu = switchPickerMenu();\n\n @if (_field) {\n <!-- why: header/body của popover là NHÓM control (role=\"group\"), không phải nút — nên chúng\n KHÔNG được nhận tabindex; tab phải đi thẳng vào các control bên trong. Thêm chặn Enter\n bên cạnh chặn click: cả hai chỉ để mat-menu không tự đóng khi người dùng thao tác trong\n popover; Escape và phím mũi tên vẫn bọt lên để menu đóng/điều hướng bình thường. -->\n <div class=\"c-pop-header\" role=\"group\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n <sd-icon [name]=\"iconFor(_field)\"></sd-icon>\n <!-- why: nested mat-menu trigger to swap the chip's field — parent provides\n the field-picker MatMenu via [switchPickerMenu]. -->\n @if (_switchPickerMenu) {\n <button\n type=\"button\"\n class=\"c-pop-header-field\"\n [matMenuTriggerFor]=\"_switchPickerMenu\"\n [matTooltip]=\"swapFieldTooltip()\">\n <span>{{ _field.label }}</span>\n <sd-icon name=\"unfold_more\"></sd-icon>\n </button>\n } @else {\n <span class=\"c-pop-header-field\">{{ _field.label }}</span>\n }\n <!-- Operator selector (right-aligned). Disabled when field has ≤1 operator. -->\n <sd-operator\n class=\"c-pop-header-operator\"\n [autoId]=\"chipAutoId('operator')\"\n [operators]=\"allowedOperators()\"\n [model]=\"_editingOperator\"\n [disabled]=\"!showOperatorSelector()\"\n (modelChange)=\"onEditingOperatorChange($any($event))\" />\n </div>\n\n <div class=\"c-pop-body\" role=\"group\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n @if (!isNoDataOperator(_editingOperator)) {\n @if (_editingOperator === 'BETWEEN') {\n @if (_field.type === 'date') {\n <div class=\"c-pop-between\">\n <sd-date size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-from')\"\n [placeholder]=\"fromPlaceholder()\"\n [model]=\"$any(_editingValue)?.from\"\n (sdChange)=\"onEditingRangeFrom($event)\">\n </sd-date>\n <sd-date size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-to')\"\n [placeholder]=\"toPlaceholder()\"\n [model]=\"$any(_editingValue)?.to\"\n (sdChange)=\"onEditingRangeTo($event)\">\n </sd-date>\n </div>\n } @else if (_field.type === 'datetime') {\n <div class=\"c-pop-between\">\n <sd-datetime size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-from')\"\n [placeholder]=\"fromPlaceholder()\"\n [model]=\"$any(_editingValue)?.from\"\n (sdChange)=\"onEditingRangeFrom($event)\">\n </sd-datetime>\n <sd-datetime size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-to')\"\n [placeholder]=\"toPlaceholder()\"\n [model]=\"$any(_editingValue)?.to\"\n (sdChange)=\"onEditingRangeTo($event)\">\n </sd-datetime>\n </div>\n } @else {\n <div class=\"c-pop-between\">\n <sd-input-number size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-from')\"\n [placeholder]=\"fromPlaceholder()\"\n [model]=\"$any(_editingValue)?.from\"\n (sdChange)=\"onEditingRangeFrom($event)\">\n </sd-input-number>\n <sd-input-number size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value-to')\"\n [placeholder]=\"toPlaceholder()\"\n [model]=\"$any(_editingValue)?.to\"\n (sdChange)=\"onEditingRangeTo($event)\">\n </sd-input-number>\n </div>\n }\n } @else if (_field.type === 'boolean') {\n <div class=\"c-pop-boolean c-bool-toggle\">\n <sd-button\n [autoId]=\"chipAutoId('value-true')\"\n [type]=\"_editingValue === true ? 'fill' : 'outline'\"\n color=\"success\"\n [title]=\"$any(_field).trueLabel || booleanTrueLabel()\"\n (click)=\"onEditingValueInput(true)\">\n </sd-button>\n <sd-button\n [autoId]=\"chipAutoId('value-false')\"\n [type]=\"_editingValue === false ? 'fill' : 'outline'\"\n color=\"warning\"\n [title]=\"$any(_field).falseLabel || booleanFalseLabel()\"\n (click)=\"onEditingValueInput(false)\">\n </sd-button>\n </div>\n } @else if (_field.type === 'values' || _field.type === 'lazy-values') {\n @let _opt = $any(_field).option;\n <sd-select size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n [placeholder]=\"selectValuePlaceholder()\"\n [items]=\"_editingOptions\"\n [valueField]=\"_opt.valueField\"\n [displayField]=\"_opt.displayField\"\n [multiple]=\"multiple()\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-select>\n @if (_editingOptionsLoading) {\n <div class=\"c-pop-values-loading\">{{ loadingValuesLabel() }}</div>\n }\n } @else if (_field.type === 'date') {\n <sd-date size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n [placeholder]=\"selectValuePlaceholder()\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-date>\n } @else if (_field.type === 'datetime') {\n <sd-datetime size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n [placeholder]=\"selectValuePlaceholder()\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-datetime>\n } @else if (_field.type === 'number') {\n <sd-input-number size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n [placeholder]=\"enterValuePlaceholder()\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-input-number>\n } @else {\n <sd-input size=\"sm\" hideInlineError\n [autoId]=\"chipAutoId('value')\"\n [placeholder]=\"enterValuePlaceholder()\"\n [model]=\"$any(_editingValue)\"\n (sdChange)=\"onEditingValueInput($event)\">\n </sd-input>\n }\n }\n </div>\n }\n </ng-template>\n</mat-menu>\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output, viewChild } from '@angular/core';\nimport { MatMenu, MatMenuModule } from '@angular/material/menu';\n\nimport { SdQueryField, sdQueryFieldIcon } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\n/**\n * Field picker mat-menu for `sd-query-bar`.\n *\n * Shared between two flows in the bar:\n * - \"Add filter\" — pass `[usedKeys]` (a Set of field keys already on the bar) so\n * those entries render disabled with a check.\n * - \"Đổi field\" inside the chip popover — pass `[currentKey]` to disable the\n * currently-bound field.\n *\n * Parent triggers via `[matMenuTriggerFor]=\"picker.menu()\"` and receives the\n * chosen field through `(pick)`.\n */\n@Component({\n selector: 'sd-query-field-picker',\n templateUrl: './field-picker.component.html',\n styleUrl: './field-picker.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatMenuModule],\n})\nexport class SdQueryFieldPicker {\n readonly #i18n = inject(I18nService);\n readonly emptyLabel = computed(() => this.#i18n.t('core.component.query-bar.field-empty'));\n\n /** Field list shown in the menu (caller-supplied; rendered in input order). */\n readonly fields = input<SdQueryField[]>([]);\n\n /** Single key disabled with a trailing check — used in the chip-popover \"Đổi field\" flow. */\n readonly currentKey = input<string | undefined>(undefined);\n\n /** Set of keys already in use — used in the \"Add filter\" flow to grey out duplicates. */\n readonly usedKeys = input<Set<string>>(new Set<string>());\n\n /** Emits when the user picks an enabled field. */\n readonly pick = output<SdQueryField>();\n\n /** MatMenu instance — parent binds `[matMenuTriggerFor]=\"picker.menu()\"`. */\n readonly menu = viewChild.required(MatMenu);\n\n readonly iconFor = sdQueryFieldIcon;\n\n /** Per-field disabled state — current key OR used key OR field's own disabled flag. */\n readonly disabledMap = computed<Set<string>>(() => {\n const set = new Set(this.usedKeys());\n const cur = this.currentKey();\n if (cur) set.add(cur);\n return set;\n });\n\n isDisabled(field: SdQueryField): boolean {\n return field.disabled === true || this.disabledMap().has(field.key as string);\n }\n\n /** \"Current\" check icon — only when the field matches `currentKey`. */\n isCurrent(field: SdQueryField): boolean {\n return field.key === this.currentKey();\n }\n\n /** \"Used\" check icon — when the field is in `usedKeys` (not the same as current). */\n isUsed(field: SdQueryField): boolean {\n return this.usedKeys().has(field.key as string);\n }\n}\n","<mat-menu #m=\"matMenu\" xPosition=\"after\" yPosition=\"below\" class=\"c-field-picker-menu\">\n @for (field of fields(); track $index) {\n <button\n type=\"button\"\n mat-menu-item\n [disabled]=\"isDisabled(field)\"\n (click)=\"pick.emit(field)\">\n <sd-icon class=\"c-field-item-icon\" [name]=\"iconFor(field)\"></sd-icon>\n <span class=\"c-field-item-label\">{{ field.label }}</span>\n <span class=\"c-field-item-type\">{{ field.type }}</span>\n @if (isCurrent(field) || isUsed(field)) {\n <sd-icon class=\"c-field-item-check\" name=\"check\"></sd-icon>\n }\n </button>\n } @empty {\n <div class=\"c-field-empty\">{{ emptyLabel() }}</div>\n }\n</mat-menu>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { Filter, Operator } from '@sdcorejs/utils/models';\n\nimport { SdQueryField, sdQueryFieldIcon } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ntype Density = 'compact' | 'comfortable';\n\n/**\n * Completed inline chip (non-string/number — those use `<sd-query-inline-value-chip>`).\n *\n * why: tách edit lifecycle ra khỏi parent `<sd-query-bar>` — child tự quản lý\n * `isEditing` signal, auto-open picker, focusout exit. Parent chỉ pass field/filter\n * và nhận commit/remove outputs.\n *\n * Covers types: boolean, date, datetime, values, lazy-values, plus a fallback else\n * branch. BETWEEN (date / datetime) uses a single `<sd-date-range>` (datetime\n * downgrades to date precision).\n *\n * why: `values` / `lazy-values` đã chuyển sang `<sd-select [viewed]=\"'inline'\">` — sd-select\n * tự quản click→edit + focusout→thoát + bare editor, nên các nhánh đó KHÔNG dùng\n * `enterEdit` / `onFocusOut` / `#editing` nữa. Các nhánh còn lại (boolean / date / datetime /\n * BETWEEN) vẫn dùng lifecycle thủ công cho tới khi control tương ứng có inline mode (rollout).\n */\n@Component({\n selector: 'sd-query-inline-chip',\n templateUrl: './inline-chip.component.html',\n styleUrl: './inline-chip.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, CommonModule, SdOperator, SdDate, SdDateRange, SdDatetime, SdSelect],\n})\nexport class SdQueryInlineChip {\n readonly #i18n = inject(I18nService);\n\n // why: nhãn mặc định của field boolean phải trùng với nhãn parent dựng cho chip (`chipValueText`)\n // và với build chip, nếu không cùng một field sẽ hiện hai ngôn ngữ tuỳ chỗ.\n readonly booleanTrueLabel = computed(() => this.#i18n.t('core.component.query-bar.boolean.true'));\n readonly booleanFalseLabel = computed(() => this.#i18n.t('core.component.query-bar.boolean.false'));\n\n // ---------------------------------------------------------------------------\n // Inputs\n // ---------------------------------------------------------------------------\n\n /** Resolved field — parent passes it (no lookup needed inside). */\n readonly field = input.required<SdQueryField>();\n\n /** The chip's Filter — used for `data` + `operator`. */\n readonly filter = input.required<Filter>();\n\n /** Density preset — sizes the `.c-token` row. */\n readonly density = input<Density>('compact');\n\n /** Whether the active operator is a multi-select (IN/NOT_IN). */\n readonly multiple = input(false);\n\n /** Show `<sd-operator>` (disabled badge) on the chip; otherwise show `':'` separator. */\n readonly showOperator = input(false);\n\n /** autoId prefix for inner controls (parent passes `inlineAutoId(i, 'value')`). */\n readonly autoId = input<string>('');\n\n /** Pre-computed display text — parent owns `chipValueText(filter)` so we don't recompute. */\n readonly valueText = input<string>('');\n\n /** No-data operator (NULL/NOT_NULL) — hide entire value slot when true. */\n readonly isNoData = input(false);\n\n // ---------------------------------------------------------------------------\n // Outputs\n // ---------------------------------------------------------------------------\n\n /** Single-value commit — parent runs `updateFilter(i, { data })`. */\n readonly commit = output<unknown>();\n\n /** BETWEEN commit (date/datetime) — parent runs `setFilterRange(i, ev)`. */\n readonly commitRange = output<{ from: unknown; to: unknown } | null>();\n\n /** Live edit during multi-select — parent runs `editValueFn(i)(v)`. */\n readonly liveChange = output<unknown>();\n\n /** × removal. */\n readonly remove = output<void>();\n\n // ---------------------------------------------------------------------------\n // Internal state\n // ---------------------------------------------------------------------------\n\n /**\n * Edit toggle for the BOOLEAN branch only — viewed (false) ↔ toggle buttons (true).\n * why: boolean isn't a `viewed`-aware form control (no inline mode); it keeps the chip's own\n * click-to-edit. values/date/datetime/BETWEEN delegate to their control's `viewed='inline'`.\n */\n readonly #editing = signal(false);\n readonly editing = this.#editing.asReadonly();\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n readonly iconName = computed<string>(() => sdQueryFieldIcon(this.field()));\n\n /** Operator code — convenience accessor for template. */\n readonly operator = computed<Operator>(() => (this.filter() as any).operator as Operator);\n\n /** Data payload — convenience accessor for template. */\n readonly data = computed<unknown>(() => (this.filter() as any).data);\n\n // ---------------------------------------------------------------------------\n // Edit lifecycle\n // ---------------------------------------------------------------------------\n\n /** Enter edit mode (BOOLEAN branch — shows the toggle buttons; exits on toggle commit). */\n enterEdit(): void {\n if (this.#editing()) return;\n this.#editing.set(true);\n }\n\n // ---------------------------------------------------------------------------\n // Commit handlers — single emit per category\n // ---------------------------------------------------------------------------\n\n /**\n * Single-value commit (sd-date, sd-datetime, single sd-select).\n * why: date/datetime/values render via `viewed='inline'` (self-managed) — the chip only\n * forwards the value; it no longer toggles `#editing` (that's boolean-only now).\n */\n emitSingleCommit(v: unknown): void {\n this.commit.emit(v);\n }\n\n /** BETWEEN commit — sd-date-range (viewed='inline') emits `{from, to}`; chip just forwards it. */\n emitRangeCommit(ev: { from: unknown; to: unknown } | null): void {\n this.commitRange.emit(ev ?? null);\n }\n\n /** Multi-select live emit (sd-select inline). */\n emitLive(v: unknown): void {\n this.liveChange.emit(v);\n }\n\n /** Boolean toggle commit — exits edit. */\n emitBoolean(v: boolean): void {\n this.commit.emit(v);\n this.#editing.set(false);\n }\n}\n","<!--\n Completed inline chip — non-string/number/seamless branches.\n Edit lifecycle is self-managed: click enters edit + auto-opens picker,\n focusout outside the wrapper exits edit, picker emits commit single OR\n liveChange (multi) OR commitRange (BETWEEN).\n-->\n@let _field = field();\n@let _operator = operator();\n@let _data = data();\n@let _multiple = multiple();\n@let _editing = editing();\n@let _isNoData = isNoData();\n@let _autoId = autoId();\n\n<div class=\"c-token\" [class.c-token-editing]=\"_editing\">\n <sd-icon class=\"c-token-icon\" [name]=\"iconName()\"></sd-icon>\n <span class=\"c-token-field\">{{ _field.label }}</span>\n\n @if (!_isNoData && showOperator()) {\n <sd-operator class=\"c-token-op\" [operators]=\"[_operator]\" [model]=\"_operator\" [disabled]=\"true\" />\n } @else if (!_isNoData) {\n <span class=\"c-token-sep\">:</span>\n }\n\n @if (!_isNoData) {\n @if (_field.type === 'boolean') {\n @if (_editing) {\n <!-- why: native button thay sd-button — mat-button MDC baseline 36px buộc\n phải hack height/padding overrides; chip 28/32px nhỏ hơn nhiều. Tự vẽ\n pill nhỏ với CSS scoped trong chip, không qua MDC, gọn + chuẩn baseline. -->\n <span class=\"c-token-value c-token-value-edit c-bool-toggle\">\n <button\n type=\"button\"\n class=\"c-bool-btn c-bool-true\"\n [class.c-bool-active]=\"_data === true\"\n [attr.data-autoId]=\"_autoId + '-true'\"\n (click)=\"emitBoolean(true)\">\n {{ $any(_field).trueLabel || booleanTrueLabel() }}\n </button>\n <button\n type=\"button\"\n class=\"c-bool-btn c-bool-false\"\n [class.c-bool-active]=\"_data === false\"\n [attr.data-autoId]=\"_autoId + '-false'\"\n (click)=\"emitBoolean(false)\">\n {{ $any(_field).falseLabel || booleanFalseLabel() }}\n </button>\n </span>\n } @else {\n <button type=\"button\" class=\"c-token-value\" (click)=\"enterEdit()\">{{ valueText() }}</button>\n }\n } @else if ((_field.type === 'date' || _field.type === 'datetime') && _operator === 'BETWEEN') {\n <!-- why: sd-date-range [viewed]=\"'inline'\" tự quản click→edit + focusout (datetime downgrade về date).\n Chip không wiring lifecycle nữa; [clearable]=false vì chip có × riêng. -->\n <span class=\"c-token-value c-token-value-edit\">\n <sd-date-range size=\"sm\"\n [autoId]=\"_autoId\"\n [viewed]=\"'inline'\"\n [clearable]=\"false\"\n [model]=\"$any(_data)\"\n (sdChange)=\"emitRangeCommit($any($event))\"></sd-date-range>\n </span>\n } @else if (_field.type === 'values' || _field.type === 'lazy-values') {\n @let _opt = $any(_field).option;\n <!-- why: sd-select [viewed]=\"'inline'\" tự quản click→edit + focusout→thoát + bare editor.\n Chip không wiring lifecycle cho nhánh này nữa (bỏ enterEdit/onFocusOut/bare). -->\n <span class=\"c-token-value c-token-value-edit\">\n <sd-select #chipPicker size=\"sm\" minWidthPanel=\"300px\"\n [autoId]=\"_autoId\"\n [items]=\"_field.type === 'lazy-values' ? $any(_opt).search : $any(_opt.items)\"\n [valueField]=\"_opt.valueField\"\n [displayField]=\"_opt.displayField\"\n [multiple]=\"_multiple\"\n [viewed]=\"'inline'\"\n [clearable]=\"false\"\n [model]=\"$any(_data)\"\n (sdChange)=\"_multiple ? emitLive($event) : emitSingleCommit($event)\">\n <!-- why: viewed mode mặc định dùng comma-joined cho multi — quá dài cho chip.\n Override bằng template \"head +N\" giống popover chipValueText. -->\n <ng-template #sdValue let-selectedItems=\"selectedItems\">\n @if ((selectedItems?.length ?? 0) > 1) {\n <span class=\"c-token-multi-head\">{{ $any(selectedItems)[0][_opt.displayField] }}</span> +{{ selectedItems.length - 1 }}\n } @else if ((selectedItems?.length ?? 0) === 1) {\n <span class=\"c-token-multi-head\">{{ $any(selectedItems)[0][_opt.displayField] }}</span>\n }\n </ng-template>\n </sd-select>\n </span>\n } @else if (_field.type === 'date') {\n <span class=\"c-token-value c-token-value-edit\">\n <sd-date size=\"sm\"\n [autoId]=\"_autoId\"\n [viewed]=\"'inline'\"\n [clearable]=\"false\"\n [model]=\"$any(_data)\"\n (sdChange)=\"emitSingleCommit($any($event))\"></sd-date>\n </span>\n } @else if (_field.type === 'datetime') {\n <span class=\"c-token-value c-token-value-edit\">\n <sd-datetime size=\"sm\"\n [autoId]=\"_autoId\"\n [viewed]=\"'inline'\"\n [clearable]=\"false\"\n [model]=\"$any(_data)\"\n (sdChange)=\"emitSingleCommit($any($event))\"></sd-datetime>\n </span>\n } @else {\n <!-- Fallback (unforeseen type) — read-only display via valueText. -->\n <span class=\"c-token-value\">{{ valueText() }}</span>\n }\n }\n\n <button type=\"button\" class=\"c-token-remove\" aria-label=\"Remove filter\" (click)=\"remove.emit()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n</div>\n","import { ChangeDetectionStrategy, Component, input, output, viewChild } from '@angular/core';\nimport { MatMenu, MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { Filter, Operator } from '@sdcorejs/utils/models';\n\nimport { SdQueryField, sdQueryFieldIcon } from '../../query-bar.model';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/**\n * Compact popover-mode chip face. Click → opens the parent-supplied [menu] (mat-menu\n * containing the chip editor). Inert div[role=button] so the nested <sd-operator>\n * doesn't end up as a button-in-button (invalid HTML).\n */\n@Component({\n selector: 'sd-query-popover-chip',\n templateUrl: './popover-chip.component.html',\n styleUrl: './popover-chip.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatMenuModule, MatTooltipModule, SdOperator],\n})\nexport class SdQueryPopoverChip {\n /** Resolved field (from the bar's `fieldByKey()` map). `undefined` → render raw key. */\n readonly field = input<SdQueryField | undefined>(undefined);\n\n /** The chip's filter — used to read `field` / `operator` / `data` for display text. */\n readonly filter = input.required<Filter>();\n\n /** \"Active\" = chip has a real value or is no-data op. Drives layout + colour. */\n readonly active = input.required<boolean>();\n\n /** Operator visible on the chip face (else hidden, \":\" separator). */\n readonly showOperator = input(false);\n\n /** Rendered value text for the value slot. */\n readonly valueText = input<string>('');\n\n /** Chip popover mat-menu instance supplied by the parent. */\n readonly menu = input.required<MatMenu>();\n\n /** Fired when the chip popover opens (parent seeds its editing state). */\n readonly open = output<void>();\n /** Fired when the user clicks the × removal icon. */\n readonly remove = output<void>();\n\n readonly iconFor = sdQueryFieldIcon;\n\n filterField(): string {\n return (this.filter() as any).field as string;\n }\n filterOperator(): Operator {\n return (this.filter() as any).operator as Operator;\n }\n\n // why: parent's add/swap flow auto-opens the chip popover after render, and removeFilter\n // closes the open one — expose open/close so the parent doesn't need a ViewChild on the\n // internal MatMenuTrigger directive.\n private readonly trigger = viewChild('chipTrigger', { read: MatMenuTrigger });\n openMenu(): void {\n this.trigger()?.openMenu();\n }\n closeMenu(): void {\n this.trigger()?.closeMenu();\n }\n}\n","<!-- why: div[role=button] (not <button>) so the nested <sd-operator> isn't button-in-button (invalid HTML). -->\n@let _active = active();\n@let _field = field();\n@let _filterField = filterField();\n@let _filterOperator = filterOperator();\n\n<div\n #chipTrigger=\"matMenuTrigger\"\n role=\"button\"\n tabindex=\"0\"\n class=\"c-chip\"\n [class.c-chip-active]=\"_active\"\n [class.c-chip-inactive]=\"!_active\"\n [attr.data-field]=\"_filterField\"\n [matTooltip]=\"_field?.label || _filterField\"\n [matMenuTriggerFor]=\"menu()\"\n (menuOpened)=\"open.emit()\"\n (keydown.enter)=\"chipTrigger.openMenu()\"\n (keydown.space)=\"$event.preventDefault(); chipTrigger.openMenu()\">\n <sd-icon class=\"c-chip-icon\" [name]=\"_field ? iconFor(_field) : 'tune'\"></sd-icon>\n <span class=\"c-chip-label\">{{ _field?.label || _filterField }}</span>\n\n @if (showOperator() && _active) {\n <sd-operator class=\"c-chip-operator\" [operators]=\"[_filterOperator]\" [model]=\"_filterOperator\" [disabled]=\"true\" />\n } @else if (_active) {\n <span class=\"c-chip-sep\">:</span>\n }\n\n @if (_active) {\n <span class=\"c-chip-value\">{{ valueText() }}</span>\n }\n\n <sd-icon class=\"c-chip-chevron\" name=\"arrow_drop_down\"></sd-icon>\n\n @if (_active) {\n <span\n role=\"button\"\n tabindex=\"0\"\n class=\"c-chip-remove\"\n aria-label=\"Remove filter\"\n (click)=\"$event.stopPropagation(); remove.emit()\"\n (keydown.enter)=\"$event.stopPropagation(); remove.emit()\">\n <sd-icon name=\"close\"></sd-icon>\n </span>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n Injector,\n input,\n isSignal,\n model,\n output,\n signal,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { Filter, Operator } from '@sdcorejs/utils/models';\n\nimport { SdQueryActionsBar } from './components/actions-bar/actions-bar.component';\nimport { SdQueryBuildChip } from './components/build-chip/build-chip.component';\nimport { SdQueryChipPopover } from './components/chip-popover/chip-popover.component';\nimport { SdQueryFieldPicker } from './components/field-picker/field-picker.component';\nimport { SdQueryInlineChip } from './components/inline-chip/inline-chip.component';\nimport { SdQueryInlineValueChip } from './components/inline-value-chip/inline-value-chip.component';\nimport { SdQueryPopoverChip } from './components/popover-chip/popover-chip.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport {\n BuildingChip,\n SD_QUERY_MULTI_OPERATORS,\n SD_QUERY_NO_DATA_OPERATORS,\n SdQuery,\n SdQueryBarOption,\n SdQueryField,\n SdQueryLogic,\n SdSavedFilter,\n sdQueryAllowedOperators,\n sdQueryDefaultOperator,\n sdQueryFieldIcon,\n} from './query-bar.model';\n\ntype Density = 'compact' | 'comfortable';\ninterface Range {\n from?: string | number | null;\n to?: string | number | null;\n}\n\n/** Shared empty array — stable reference so template bindings don't churn change detection. */\nconst EMPTY_ARRAY: any[] = [];\n\n@Component({\n selector: 'sd-query-bar',\n templateUrl: './query-bar.component.html',\n styleUrls: ['./query-bar.component.scss', './query-bar.controls.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n MatMenuModule,\n MatTooltipModule,\n SdQueryActionsBar,\n SdQueryBuildChip,\n SdQueryChipPopover,\n SdQueryFieldPicker,\n SdQueryInlineChip,\n SdQueryInlineValueChip,\n SdQueryPopoverChip,\n ],\n})\nexport class SdQueryBar {\n readonly #i18n = inject(I18nService);\n readonly #injector = inject(Injector);\n\n /** All popover-mode chips in order — used to auto-open after addFilter / close before removeFilter. */\n readonly popoverChips = viewChildren(SdQueryPopoverChip);\n\n /** The extracted in-progress chip — owns operator menu + value picker view refs. */\n private readonly buildChip = viewChild(SdQueryBuildChip);\n\n /** The extracted chip popover — owns operator+value staging + commit-on-close. */\n readonly chipPopover = viewChild(SdQueryChipPopover);\n\n /**\n * Land the user in the value editor after the build chip reaches the value step:\n * popover-kind controls auto-open their native picker via the child; string/number\n * branches use the seamless chip whose `[autofocus]` handles focus internally.\n */\n #enterValueStep(field: SdQueryField): void {\n const k = field.type;\n if (k === 'values' || k === 'lazy-values' || k === 'date' || k === 'datetime') {\n afterNextRender(() => this.buildChip()?.openPicker(), { injector: this.#injector });\n }\n // why: string/number branch — <sd-query-inline-value-chip [autofocus]> tự focus,\n // không cần parent gọi thêm.\n }\n\n // ---------------------------------------------------------------------------\n // Inputs — all accept null|undefined at boundary, transform to canonical shape\n // ---------------------------------------------------------------------------\n\n /** Main option object. Prefer this API for new usage; individual inputs stay as a migration bridge. */\n readonly option = input<SdQueryBarOption | undefined>(undefined);\n\n /** Prefix for auto-generated `data-autoid` on inner controls (chips, operator/value editors, buttons). */\n readonly autoIdInput = input<string | undefined, string | null | undefined>(undefined, {\n alias: 'autoId',\n transform: (v): string | undefined => v ?? undefined,\n });\n\n /** Available fields the user can filter by. Required for the field picker. */\n readonly fields = input<SdQueryField[], SdQueryField[] | null | undefined>([], {\n transform: (v): SdQueryField[] => (Array.isArray(v) ? v : []),\n });\n\n /**\n * Active filter chips. Two-way bindable via `[(filters)]`.\n * Use this when you only need a flat `Filter[]` (no global logic / search box).\n */\n readonly filters = model<Filter[]>([]);\n\n /**\n * Global connector between filters. Two-way bindable via `[(logic)]`.\n * Only meaningful when `showLogicToggle=true` and there are ≥2 filters.\n */\n readonly logic = model<SdQueryLogic>('AND');\n\n /** Free-text search string. Two-way bindable via `[(search)]`. Only shown when `showSearch=true`. */\n readonly search = model<string>('');\n\n /**\n * Editing mode:\n * - `'popover'` (default) → compact chips; click a chip to edit operator + value in a\n * mat-menu popover, commit with \"Áp dụng\".\n * - `'inline'` → GitLab-style. Each filter's operator + value controls render directly\n * on the bar (no popup, no per-filter apply). Edits update `filters` live; the user\n * presses the search button (or Enter) once to fire `(apply)`.\n */\n readonly mode = input<'popover' | 'inline', 'popover' | 'inline' | null | undefined>('popover', {\n transform: (v): 'popover' | 'inline' => v || 'popover',\n });\n\n /** Density preset — chip / control height. */\n readonly density = input<Density, Density | null | undefined>('compact', {\n transform: (v): Density => v || 'compact',\n });\n\n /** Show free-text search input on the left. */\n readonly showSearch = input(false, { transform: booleanAttribute });\n\n /** Show saved-filters dropdown on the right. Requires `[savedFiltersKey]` to actually persist. */\n readonly showSavedFilters = input(false, { transform: booleanAttribute });\n\n /**\n * Namespace key for persisting saved filters to `localStorage`. When set, the saved-filters\n * dropdown loads/saves under `sd-query-bar:savedFilters:<key>`. Leave undefined to disable.\n */\n readonly savedFiltersKey = input<string | undefined>(undefined);\n\n /**\n * Snapshot of the current query — fed into `<sd-query-saved-filters-menu [query]>` so\n * saving a filter captures live filters/logic/search.\n */\n readonly currentQuery = computed<SdQuery>(() => this.#buildQuery());\n\n /** Receive an applied filter from the saved-filters menu — re-install bar state + trigger apply. */\n onApplyFilter(saved: SdSavedFilter): void {\n this.filters.set(saved.query.filters ?? []);\n this.logic.set(saved.query.logic ?? 'AND');\n if (saved.query.search !== undefined) this.search.set(saved.query.search);\n this.triggerApply();\n }\n\n /** Show AND/OR segmented toggle (renders only when there are ≥2 filters). */\n readonly showLogicToggle = input(false, { transform: booleanAttribute });\n\n /** Show \"Clear all\" button when at least one filter is active. */\n readonly showClearAll = input(true, { transform: booleanAttribute });\n\n /** Render the operator label on the chip face (default: hidden — operator only visible in popover). */\n readonly showOperatorOnChip = input(false, { transform: booleanAttribute });\n\n // ---------------------------------------------------------------------------\n // Outputs\n // ---------------------------------------------------------------------------\n\n /** Composite payload — emitted whenever filters / logic / search change. */\n readonly queryChange = output<SdQuery>();\n\n /** Fires when the user presses \"Áp dụng\" inside a chip popover — host should reload data. */\n readonly apply = output<SdQuery>();\n\n // ---------------------------------------------------------------------------\n // Derived state\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // Nhãn i18n cho template\n // why: `#i18n` trước đây được inject nhưng KHÔNG dùng — mọi chuỗi trong template đều hardcode\n // tiếng Việt. Bọc qua `computed()` thay vì pipe `translate` vì pipe là pure: nó chỉ chạy lại khi\n // input đổi tham chiếu, nên đổi ngôn ngữ runtime không refresh được. `t()` đọc signal `messages()`\n // nên computed tự invalidate khi `I18nService.setLanguage()` chạy.\n // ---------------------------------------------------------------------------\n\n /** Placeholder của ô tìm kiếm tự do bên trái. */\n readonly searchPlaceholder = computed(() => this.#i18n.t('core.component.query-bar.search-placeholder'));\n /** Tooltip nút \"+\" khi consumer chưa khai `fields`. */\n readonly noFieldsLabel = computed(() => this.#i18n.t('core.component.query-bar.no-fields'));\n /** Tooltip nút \"+\" ở trạng thái bình thường. */\n readonly addFilterLabel = computed(() => this.#i18n.t('core.component.query-bar.add-filter'));\n\n /** Map of `field.key` → `SdQueryField` for fast lookup from filters[]. */\n readonly resolvedAutoId = computed(() => this.option()?.autoId ?? this.autoIdInput() ?? undefined);\n readonly resolvedFields = computed(() => this.option()?.fields ?? this.fields());\n readonly resolvedMode = computed(() => this.option()?.mode ?? this.mode());\n readonly resolvedDensity = computed(() => this.option()?.density ?? this.density());\n readonly resolvedShowSearch = computed(() => this.option()?.showSearch ?? this.showSearch());\n readonly resolvedShowSavedFilters = computed(() => this.option()?.showSavedFilters ?? this.showSavedFilters());\n readonly resolvedSavedFiltersKey = computed(() => this.option()?.savedFiltersKey ?? this.savedFiltersKey());\n readonly resolvedShowLogicToggle = computed(() => this.option()?.showLogicToggle ?? this.showLogicToggle());\n readonly resolvedShowClearAll = computed(() => this.option()?.showClearAll ?? this.showClearAll());\n readonly resolvedShowOperatorOnChip = computed(() => this.option()?.showOperatorOnChip ?? this.showOperatorOnChip());\n\n constructor() {\n effect(() => {\n const option = this.option();\n if (!option) return;\n untracked(() => {\n if (option.filters && this.filters() !== option.filters) this.filters.set(option.filters);\n if (option.logic && this.logic() !== option.logic) this.logic.set(option.logic);\n if (option.search !== undefined && this.search() !== option.search) this.search.set(option.search);\n });\n });\n }\n\n readonly fieldByKey = computed<Record<string, SdQueryField>>(() => {\n const map: Record<string, SdQueryField> = {};\n for (const f of this.resolvedFields()) map[f.key as string] = f;\n return map;\n });\n\n /** Field keys already chained on a chip — the picker greys these out. */\n readonly usedFieldKeys = computed<Set<string>>(() => {\n const set = new Set<string>();\n for (const f of this.filters()) {\n if ('field' in f && typeof f.field === 'string') set.add(f.field);\n }\n return set;\n });\n\n /** Render the global AND/OR connector text between chips when `logic === 'OR'`. */\n readonly showOrConnector = computed(() => this.resolvedShowLogicToggle() && this.logic() === 'OR' && this.filters().length >= 2);\n\n /** Search button is actionable only when there is something to apply. */\n readonly canSearch = computed(() => this.filters().length > 0 || this.search().trim().length > 0);\n\n // ---------------------------------------------------------------------------\n // Chip popover state — only `editingIndex` lives on the parent; the\n // `<sd-query-chip-popover>` child owns ALL staging (operator + value + options).\n // ---------------------------------------------------------------------------\n\n /** Index of the chip whose popover is open. Reset to null after commit / close. */\n readonly editingIndex = signal<number | null>(null);\n\n /** Resolved field of the chip whose popover is currently open (or null). */\n readonly editingField = computed<SdQueryField | null>(() => {\n const idx = this.editingIndex();\n if (idx === null) return null;\n const f = this.filters()[idx];\n if (!f || !('field' in f)) return null;\n return this.fieldByKey()[f.field as string] ?? null;\n });\n\n /**\n * Multi-select is derived from the operator (IN / NOT_IN) — not a field flag.\n * Only called by inline-mode + build-mode templates with a known operator;\n * popover-mode chips read `multiple()` from the child popover directly.\n */\n multiple(op: Operator): boolean {\n return SD_QUERY_MULTI_OPERATORS.includes(op);\n }\n\n // ---------------------------------------------------------------------------\n // Row identity — stable synthetic id per filter chip, used as the `@for` track key\n // ---------------------------------------------------------------------------\n\n /**\n * Filter object → synthetic row id.\n *\n * why: `@for (... ; track $index)` gắn chip với VỊ TRÍ, không phải với filter. Xoá chip index 0\n * thì chip index 0 không bị huỷ mà được bind lại sang filter kế tiếp, kéo theo state nội bộ\n * của chip (`inline-chip` `#editing`, `inline-value-chip` `draft`) sang một filter khác.\n * Gắn id tổng hợp cho từng dòng để `track` bám đúng filter.\n *\n * Lưu trong WeakMap thay vì gắn thẳng thuộc tính lên `Filter` để payload `SdQuery.filters` phát\n * ra ngoài vẫn sạch (không rò field nội bộ cho consumer).\n */\n readonly #rowIds = new WeakMap<Filter, string>();\n #rowIdSeq = 0;\n\n /**\n * Stable track key of a filter row. Assigned lazily on first read.\n *\n * ⚠️ Hai ràng buộc với `filters`, đều là hợp đồng của consumer:\n *\n * 1. KHÔNG được chứa cùng một object `Filter` ở hai vị trí. Khoá theo identity nên hai vị trí sẽ\n * cho hai track key trùng nhau và Angular ném NG0955. Đã thử khử trùng bằng hậu tố `$index`\n * và HỎNG: Angular đánh giá biểu thức `track` trên CẢ collection cũ khi diff, nên một filter\n * vừa bị xoá cho `indexOf === -1`, key đổi, và MỌI chip bị huỷ rồi dựng lại. Để Angular báo\n * NG0955 là đúng — thông điệp của nó đã chỉ rõ vấn đề.\n * 2. Object phải ỔN ĐỊNH giữa các lần change detection. Sinh lại object mới mỗi pass\n * (vd `[option]=\"{ filters: buildFilters() }\"`) sẽ khiến mọi chip nhận id mới mỗi pass và bị\n * huỷ + dựng lại — tệ hơn cả `track $index` cũ.\n */\n rowId(filter: Filter): string {\n let id = this.#rowIds.get(filter);\n if (!id) {\n id = `qbr-${++this.#rowIdSeq}`;\n this.#rowIds.set(filter, id);\n }\n return id;\n }\n\n /**\n * Chuyển id của một dòng sang object thay thế.\n * why: mọi mutation đều tạo object mới (`{ ...previous, ...patch }`); không kế thừa id thì mỗi\n * lần sửa giá trị lại huỷ + dựng lại chip, mất focus và state đang gõ dở.\n */\n #inheritRowId(previous: Filter, next: Filter): void {\n this.#rowIds.set(next, this.rowId(previous));\n }\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n readonly iconFor = sdQueryFieldIcon;\n\n /** Chip is \"active\" when it has a non-empty value OR a no-data operator (NULL/NOT_NULL). */\n isFilterActive(filter: Filter): boolean {\n if (SD_QUERY_NO_DATA_OPERATORS.includes(filter.operator as Operator)) return true;\n const data = (filter as any).data;\n if (data === null || data === undefined || data === '') return false;\n if (Array.isArray(data) && data.length === 0) return false;\n return true;\n }\n\n /** Rendered value text on a chip. */\n chipValueText(filter: Filter): string {\n if (SD_QUERY_NO_DATA_OPERATORS.includes(filter.operator as Operator)) return '';\n const data = (filter as any).data;\n if (data === null || data === undefined) return '';\n if (filter.operator === 'BETWEEN' && data && typeof data === 'object') {\n return `${data.from ?? ''} — ${data.to ?? ''}`;\n }\n if (Array.isArray(data)) {\n if (data.length === 0) return '';\n const head = this.#displayOne(filter, data[0]);\n return data.length > 1 ? `${head} +${data.length - 1}` : head;\n }\n return this.#displayOne(filter, data);\n }\n\n isNoDataOperator(op: Operator | string): boolean {\n return SD_QUERY_NO_DATA_OPERATORS.includes(op as Operator);\n }\n\n // ---------------------------------------------------------------------------\n // Inline mode — per-field helpers + live mutators (no popover / no Apply gate)\n // ---------------------------------------------------------------------------\n\n /** The single in-progress inline chip (not yet in `filters`). */\n readonly #building = signal<BuildingChip | null>(null);\n readonly building = this.#building.asReadonly();\n\n /**\n * Allowed operators of `field` — safe to call from a template binding: `sdQueryAllowedOperators`\n * memo hoá theo object field nên ref trả về ổn định giữa các chu kỳ CD.\n * why: `<sd-query-build-chip [allowedOperators]>` là OnPush; ref mới mỗi CD sẽ dirty child liên\n * tục (bug class cấp-phát-mỗi-CD).\n */\n allowedOperatorsFor(field: SdQueryField): Operator[] {\n return sdQueryAllowedOperators(field);\n }\n\n inlineAutoId(index: number, role: string): string {\n const base = this.resolvedAutoId() ?? 'qb';\n return `${base}-inline${index}-${role}`;\n }\n\n // ---------------------------------------------------------------------------\n // Inline mode — progressive token build flow (field → operator → value)\n // ---------------------------------------------------------------------------\n\n /** Append a completed chip to `filters` WITHOUT emitting (inline mode commits on Search). */\n #pushComplete(field: SdQueryField, operator: Operator, value: unknown): void {\n let data: unknown = value;\n if (SD_QUERY_NO_DATA_OPERATORS.includes(operator)) data = null;\n else if (operator === 'BETWEEN') {\n if (!data || typeof data !== 'object') data = { from: null, to: null };\n } else if (SD_QUERY_MULTI_OPERATORS.includes(operator)) {\n data = Array.isArray(data) ? data : value == null ? [] : [value];\n }\n const next = { field: field.key as any, operator, data } as Filter;\n this.filters.set([...this.filters(), next]);\n }\n\n /** Entry point from the field picker — start building a chip for `field`. */\n beginBuild(field: SdQueryField): void {\n const allowed = sdQueryAllowedOperators(field);\n const def = sdQueryDefaultOperator(field);\n // why: date/datetime mặc định là BETWEEN — skip operator step để user vào value\n // step ngay (95% case dùng BETWEEN cho date/datetime; cắt 1 click cho luồng phổ\n // biến nhất). Field type khác giữ flow chọn operator để user thấy đầy đủ lựa chọn.\n const skipOperatorStep = (field.type === 'date' || field.type === 'datetime') && allowed.includes(def);\n if (allowed.length > 1 && !skipOperatorStep) {\n this.#building.set({ field, step: 'operator' });\n // why: auto-open the operator menu so the user can pick the condition without a\n // second click — the viewChild only resolves after the building chip renders.\n afterNextRender(() => this.buildChip()?.openOperator(), { injector: this.#injector });\n return;\n }\n const operator = skipOperatorStep ? def : (allowed[0] ?? def);\n if (SD_QUERY_NO_DATA_OPERATORS.includes(operator)) {\n this.#pushComplete(field, operator, null);\n this.#building.set(null);\n return;\n }\n this.#building.set({ field, operator, step: 'value' });\n this.#enterValueStep(field);\n }\n\n /** Operator chosen during build — finish (no-data) or advance to the value step. */\n pickBuildOperator(op: Operator): void {\n const b = this.#building();\n if (!b) return;\n if (SD_QUERY_NO_DATA_OPERATORS.includes(op)) {\n this.#pushComplete(b.field, op, null);\n this.#building.set(null);\n return;\n }\n this.#building.set({ ...b, operator: op, step: 'value' });\n this.#enterValueStep(b.field);\n }\n\n /** Value committed during build — push the completed chip, clear building. No emit. */\n commitBuildValue(value: unknown): void {\n const b = this.#building();\n if (!b || !b.operator) return;\n this.#pushComplete(b.field, b.operator, value);\n this.#building.set(null);\n }\n\n /**\n * Commit from the seamless build chip (string / number). An empty value (blur with no\n * input) cancels the build instead of pushing a blank chip.\n */\n onBuildSeamlessCommit(value: unknown): void {\n const empty =\n value == null || value === '' || (typeof value === 'object' && (value as Range).from == null && (value as Range).to == null);\n if (empty) {\n this.cancelBuild();\n return;\n }\n this.commitBuildValue(value);\n }\n\n /** Abandon the in-progress chip. */\n cancelBuild(): void {\n this.#building.set(null);\n }\n\n /**\n * Commit both ends of a BETWEEN range at once — called from `<sd-query-inline-chip>`'s\n * `(commitRange)` output when the user picks a date range.\n * why: sd-date-range emits {from,to} via (sdChange) — single call thay cho cặp\n * setFilterRangeFrom / setFilterRangeTo cũ (đã bỏ).\n */\n setFilterRange(i: number, ev: { from: unknown; to: unknown } | null): void {\n this.updateFilter(i, { data: ev ?? { from: null, to: null } } as Partial<Filter>);\n }\n\n // ---------------------------------------------------------------------------\n // Mutations\n // ---------------------------------------------------------------------------\n\n addFilter(field: SdQueryField): void {\n const operator = sdQueryDefaultOperator(field);\n const data = SD_QUERY_MULTI_OPERATORS.includes(operator) ? [] : null;\n const next: Filter = { field: field.key as any, operator, data } as Filter;\n const newIndex = this.filters().length;\n this.filters.set([...this.filters(), next]);\n // why: user added a field — open its edit popover immediately so they can pick\n // operator + value in one continuous flow (no second click required).\n afterNextRender(() => this.popoverChips()[newIndex]?.openMenu(), { injector: this.#injector });\n }\n\n /** Swap the field of an existing chip — reset operator + value to the new field's defaults. */\n changeFilterField(index: number, field: SdQueryField): void {\n const list = [...this.filters()];\n if (index < 0 || index >= list.length) return;\n const operator = sdQueryDefaultOperator(field);\n const data = SD_QUERY_MULTI_OPERATORS.includes(operator) ? [] : null;\n list[index] = { field: field.key as any, operator, data } as Filter;\n this.filters.set(list);\n // why: clicking an item in the nested fieldSwitchPicker closes both the picker AND\n // the parent chipPopover. Re-open the chip's popover on the next render so user can\n // continue picking operator + value without a second manual click.\n afterNextRender(() => this.popoverChips()[index]?.openMenu(), { injector: this.#injector });\n }\n\n updateFilter(index: number, patch: Partial<Filter>): void {\n const list = [...this.filters()];\n if (index < 0 || index >= list.length) return;\n const previous = list[index];\n const next = { ...previous, ...patch } as Filter;\n // why: cùng một dòng logic, chỉ đổi data/operator → giữ nguyên track key để chip được patch\n // tại chỗ thay vì huỷ + dựng lại.\n this.#inheritRowId(previous, next);\n list[index] = next;\n this.filters.set(list);\n }\n\n updateFilterData(index: number, data: unknown): void {\n this.updateFilter(index, { data } as Partial<Filter>);\n }\n\n removeFilter(index: number): void {\n const list = [...this.filters()];\n if (index < 0 || index >= list.length) return;\n const editing = this.editingIndex();\n // why: `editingIndex` là chỉ số vào mảng filters, nên mọi lần xoá ở vị trí <= nó đều làm nó\n // lệch. Trước đây chỉ xử lý trường hợp bằng nhau → xoá một chip ĐỨNG TRƯỚC khiến editingIndex\n // trỏ lố 1 ô và `onChipPopoverCommit` ghi giá trị staged vào SAI filter.\n if (editing !== null && index <= editing) {\n if (index === editing) {\n // close the open popover (it's this chip's) before the chip + its trigger vanish\n this.popoverChips()[index]?.closeMenu();\n this.editingIndex.set(null);\n } else {\n this.editingIndex.set(editing - 1);\n }\n }\n list.splice(index, 1);\n this.filters.set(list);\n }\n\n clearAll(): void {\n if (this.filters().length === 0) return;\n this.filters.set([]);\n this.editingIndex.set(null);\n }\n\n setLogic(value: SdQueryLogic): void {\n if (this.logic() === value) return;\n this.logic.set(value);\n }\n\n setSearch(value: string): void {\n if (this.search() === value) return;\n this.search.set(value);\n }\n\n triggerApply(): void {\n // why: single deferred trigger — fire both the change notification and the reload\n // signal once, from here only (mutations no longer emit).\n const q = this.#buildQuery();\n this.option()?.onQueryChange?.(q);\n this.queryChange.emit(q);\n this.option()?.onApply?.(q);\n this.apply.emit(q);\n }\n\n // ---------------------------------------------------------------------------\n // Chip popover — delegate staging to `<sd-query-chip-popover>` child.\n // ---------------------------------------------------------------------------\n\n /**\n * Called when a popover-mode chip is clicked — set editingIndex and seed the\n * child popover's staging signals from the chip's Filter.\n */\n openChipPopover(index: number): void {\n const filter = this.filters()[index];\n if (!filter || !('field' in filter)) return;\n this.editingIndex.set(index);\n const field = this.fieldByKey()[filter.field as string];\n this.chipPopover()?.seed(filter, field);\n }\n\n /** Receive `(commit)` from the child popover — splice into filters, null the index. */\n onChipPopoverCommit(next: Filter): void {\n const idx = this.editingIndex();\n if (idx === null) return;\n const list = [...this.filters()];\n const previous = list[idx];\n if (!previous) return;\n // why: popover chỉ đổi operator + value của CHÍNH chip đó → giữ track key, nếu không chip sẽ\n // bị huỷ ngay lúc menu đóng (trigger của overlay biến mất giữa chừng).\n this.#inheritRowId(previous, next);\n list[idx] = next;\n this.filters.set(list);\n this.editingIndex.set(null);\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n #buildQuery(): SdQuery {\n return {\n filters: this.filters(),\n logic: this.logic(),\n ...(this.resolvedShowSearch() ? { search: this.search() } : {}),\n };\n }\n\n #displayOne(filter: Filter, raw: any): string {\n const fieldKey = 'field' in filter ? (filter.field as string) : '';\n const field = this.fieldByKey()[fieldKey];\n if (!field) return String(raw);\n if (field.type === 'boolean') {\n // why: nhãn mặc định của field boolean phải theo ngôn ngữ đang chọn; consumer vẫn override\n // được bằng `trueLabel` / `falseLabel` trên chính field.\n const trueLabel = (field as any).trueLabel ?? this.#i18n.t('core.component.query-bar.boolean.true');\n const falseLabel = (field as any).falseLabel ?? this.#i18n.t('core.component.query-bar.boolean.false');\n return raw ? trueLabel : falseLabel;\n }\n if (field.type === 'values' || field.type === 'lazy-values') {\n const opt = (field as any).option;\n const cachedOptions = this.chipPopover()?.editingOptions() ?? [];\n const items = this.#resolveSyncItems(opt?.items) ?? cachedOptions;\n const match = items.find((i: any) => i?.[opt.valueField] === raw);\n if (match) return String(match[opt.displayField]);\n const cached = cachedOptions.find((i: any) => i?.[opt.valueField] === raw);\n return cached ? String(cached[opt.displayField]) : String(raw);\n }\n return String(raw);\n }\n\n #resolveSyncItems(items: any): any[] | null {\n if (Array.isArray(items)) return items;\n if (isSignal(items)) return (items as any)();\n return null;\n }\n}\n","<!--\n sd-query-bar — unified filter chip row (Jira/Linear/Notion style).\n Visual spec: refs/design_handoff_sd_query_bar/README.md\n TODO(next-iter): replace inline placeholders for field-picker + chip-popover\n with extracted sub-components driven by CDK overlay.\n-->\n@let _filters = filters();\n@let _resolvedFields = resolvedFields();\n@let _resolvedDensity = resolvedDensity();\n@let _showOrConnector = showOrConnector();\n@let _usedFieldKeys = usedFieldKeys();\n@let _editingIndex = editingIndex();\n@let _resolvedMode = resolvedMode();\n@let _resolvedShowOperatorOnChip = resolvedShowOperatorOnChip();\n@let _noFieldsLabel = noFieldsLabel();\n@let _addFilterLabel = addFilterLabel();\n\n<div\n class=\"c-query-bar\"\n [class.c-density-compact]=\"_resolvedDensity === 'compact'\"\n [class.c-density-comfortable]=\"_resolvedDensity === 'comfortable'\">\n\n <!-- Main region — search + filters + add-filter. Wraps internally; the right\n action toolbar stays anchored and does NOT flow with this. -->\n <div class=\"c-query-bar__main\">\n\n <!-- Free-text search (left, optional) -->\n @if (resolvedShowSearch()) {\n <div class=\"c-search\">\n <sd-icon class=\"c-search-icon\" name=\"search\"></sd-icon>\n <input\n class=\"c-search-input\"\n type=\"text\"\n [ngModel]=\"search()\"\n (ngModelChange)=\"setSearch($event)\"\n (keydown.enter)=\"triggerApply()\"\n [placeholder]=\"searchPlaceholder()\" />\n </div>\n <span class=\"c-divider\" aria-hidden=\"true\"></span>\n }\n\n <!-- Chip popover — extracted into <sd-query-chip-popover>. Declared BEFORE chips\n so the popover-mode @for chips can bind their [menu] to `chipPopover.menu()`.\n why: mở popover để EDIT chỉ cho chỉnh operator + value — KHÔNG đổi field.\n Bỏ [switchPickerMenu] → header render nhãn field tĩnh (read-only). Muốn đổi\n field thì xoá chip rồi thêm lại. -->\n <sd-query-chip-popover\n #chipPopover\n [field]=\"editingField() ?? undefined\"\n [filter]=\"_editingIndex !== null ? $any(_filters[_editingIndex!]) : undefined\"\n [chipIndex]=\"_editingIndex\"\n [autoIdBase]=\"resolvedAutoId() ?? 'qb'\"\n (commit)=\"onChipPopoverCommit($event)\" />\n\n @if (_resolvedMode === 'inline') {\n <!-- ===== INLINE MODE (GitLab-style token builder) ===== -->\n\n <!-- Completed chips.\n why: track theo rowId(filter) chứ KHÔNG theo $index — track $index gắn chip với vị trí,\n nên xoá filter đầu tiên sẽ bind lại chip cũ sang filter kế tiếp và kéo theo state nội bộ\n (inline-chip `#editing`, inline-value-chip `draft`) sang sai filter. -->\n @for (filter of _filters; track rowId(filter); let i = $index) {\n @if (_showOrConnector && i > 0) {\n <span class=\"c-or-connector\" aria-hidden=\"true\">OR</span>\n }\n @let _field = fieldByKey()[$any(filter).field];\n @if (_field) {\n @let _op = $any(filter.operator);\n @let _data = $any(filter).data;\n @if (_field.type === 'string' || _field.type === 'number') {\n <!-- Seamless chip — the pill is the input (string / number). -->\n <sd-query-inline-value-chip\n [field]=\"_field\"\n [operator]=\"_op\"\n [value]=\"_data\"\n [density]=\"_resolvedDensity\"\n [showOperator]=\"_resolvedShowOperatorOnChip\"\n [autoId]=\"inlineAutoId(i, 'value')\"\n (valueChange)=\"updateFilterData(i, $event)\"\n (remove)=\"removeFilter(i)\" />\n } @else {\n <sd-query-inline-chip\n [field]=\"_field\"\n [filter]=\"filter\"\n [density]=\"_resolvedDensity\"\n [multiple]=\"multiple(_op)\"\n [showOperator]=\"_resolvedShowOperatorOnChip\"\n [autoId]=\"inlineAutoId(i, 'value')\"\n [valueText]=\"chipValueText(filter)\"\n [isNoData]=\"isNoDataOperator(_op)\"\n (commit)=\"updateFilterData(i, $event)\"\n (commitRange)=\"setFilterRange(i, $event)\"\n (liveChange)=\"updateFilterData(i, $event)\"\n (remove)=\"removeFilter(i)\" />\n }\n }\n }\n\n <!-- Building chip (in-progress) — extracted into <sd-query-build-chip>. -->\n @if (building(); as _b) {\n <sd-query-build-chip\n [building]=\"_b\"\n [density]=\"_resolvedDensity\"\n [allowedOperators]=\"allowedOperatorsFor(_b.field)\"\n [multiple]=\"multiple($any(_b.operator))\"\n [showOperator]=\"_resolvedShowOperatorOnChip\"\n (pickOperator)=\"pickBuildOperator($any($event))\"\n (commitValue)=\"commitBuildValue($event)\"\n (cancel)=\"cancelBuild()\"\n (seamlessCommit)=\"onBuildSeamlessCommit($event)\" />\n }\n\n <!-- Add filter -->\n <button\n type=\"button\"\n class=\"c-add-filter\"\n [matMenuTriggerFor]=\"addPicker.menu()\"\n [disabled]=\"_resolvedFields.length === 0 || _usedFieldKeys.size >= _resolvedFields.length\"\n [matTooltip]=\"_resolvedFields.length === 0 ? _noFieldsLabel : _addFilterLabel\">\n <sd-icon name=\"add\"></sd-icon>\n </button>\n } @else {\n <!-- ===== POPOVER MODE (default) — compact chips edited via mat-menu ===== -->\n <!-- why: track theo rowId(filter) — xem ghi chú ở nhánh inline. -->\n @for (filter of _filters; track rowId(filter); let i = $index) {\n @if (_showOrConnector && i > 0) {\n <span class=\"c-or-connector\" aria-hidden=\"true\">OR</span>\n }\n @let _field = fieldByKey()[$any(filter).field];\n @let _active = isFilterActive(filter);\n <!-- why: menu close commit is handled by chipPopover's (commit) →\n onChipPopoverCommit; popover-chip only signals open + remove here. -->\n <sd-query-popover-chip\n [field]=\"_field\"\n [filter]=\"filter\"\n [active]=\"_active\"\n [showOperator]=\"_resolvedShowOperatorOnChip\"\n [valueText]=\"chipValueText(filter)\"\n [menu]=\"chipPopover.menu()!\"\n (open)=\"openChipPopover(i)\"\n (remove)=\"removeFilter(i)\" />\n }\n\n <!-- Add filter trigger -->\n <button\n type=\"button\"\n class=\"c-add-filter\"\n [matMenuTriggerFor]=\"addPicker.menu()\"\n [disabled]=\"_resolvedFields.length === 0 || _usedFieldKeys.size >= _resolvedFields.length\"\n [matTooltip]=\"_resolvedFields.length === 0 ? _noFieldsLabel : _addFilterLabel\">\n <sd-icon name=\"add\"></sd-icon>\n </button>\n }\n\n </div><!-- /.c-query-bar__main -->\n\n <!-- Field picker — list available fields, fade ones already in use. -->\n <sd-query-field-picker\n #addPicker\n [fields]=\"_resolvedFields\"\n [usedKeys]=\"_usedFieldKeys\"\n (pick)=\"_resolvedMode === 'inline' ? beginBuild($event) : addFilter($event)\" />\n\n <sd-query-actions-bar\n [showLogicToggle]=\"resolvedShowLogicToggle()\"\n [(logic)]=\"logic\"\n [filtersCount]=\"_filters.length\"\n [showSavedFilters]=\"resolvedShowSavedFilters()\"\n [savedFiltersKey]=\"resolvedSavedFiltersKey()\"\n [query]=\"currentQuery()\"\n (applyFilter)=\"onApplyFilter($event)\"\n [showClearAll]=\"resolvedShowClearAll()\"\n [canSearch]=\"canSearch()\"\n (clear)=\"clearAll()\"\n (search)=\"triggerApply()\" />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AASA;;;;;;;;;;;;;;AAcG;MASU,uBAAuB,CAAA;AACzB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3B,IAAA,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACnC,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,gDAAgD,CAAC,mFAAC;AAC7F,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,yDAAyD,CAAC,2FAAC;AAC9G,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,+CAA+C,CAAC,kFAAC;AAC3F,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,8CAA8C,CAAC,iFAAC;AACzF,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,6CAA6C,CAAC,gFAAC;;AAGvF,IAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,0EAAC;;AAG1C,IAAA,KAAK,GAAG,KAAK,CAAU,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4EAAC;;IAGrD,KAAK,GAAG,MAAM,EAAiB;AAE/B,IAAA,YAAY,GAAG,MAAM,CAAkB,EAAE,mFAAC;AAE1C,IAAA,WAAW,GAAG,QAAQ,CAAqB,MAAK;AACvD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,OAAO,CAAC,GAAG,CAAA,0BAAA,EAA6B,CAAC,CAAA,CAAE,GAAG,SAAS;AACzD,IAAA,CAAC,kFAAC;;AAGO,IAAA,YAAY,GAAG,MAAM,CAAC,MAAK;AAClC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB;QACF;AACA,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnD;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B;AACF,IAAA,CAAC,mFAAC;AAEF,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxD;AAAE,QAAA,MAAM;;QAER;IACF;AAEA;;;;AAIG;AACH,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;;;AAGzB,QAAA,IAAI,IAAwB;AAC5B,QAAA,IAAI;AACF,YAAA,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mDAAmD,CAAC,EAAE;gBACtG,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,6CAA6C,CAAC;AAClE,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA,CAAC;QACJ;AAAE,QAAA,MAAM;AACN,YAAA,OAAO;QACT;AACA,QAAA,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE;AACnB,QAAA,MAAM,MAAM,GAAkB;YAC5B,EAAE,EAAE,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACjG,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;SACpB;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrB;;AAGA,IAAA,IAAI,CAAC,MAAqB,EAAA;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IACzB;;IAGA,MAAM,CAAC,EAAU,EAAE,EAAU,EAAA;QAC3B,EAAE,EAAE,eAAe,EAAE;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrB;wGA1FW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,0WChCpC,0gDAoCA,EAAA,MAAA,EAAA,CAAA,ynEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDNY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,6vBAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEtC,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBARnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAAA,UAAA,EAG3B,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,0gDAAA,EAAA,MAAA,EAAA,CAAA,ynEAAA,CAAA,EAAA;;;AEtBpD;;;;;;;;;AASG;MASU,iBAAiB,CAAA;AACnB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;IAG3B,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAC/D,IAAA,KAAK,GAAG,KAAK,CAAe,KAAK,4EAAC;AAClC,IAAA,YAAY,GAAG,KAAK,CAAC,CAAC,mFAAC;;IAGvB,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAChE,IAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,sFAAC;AACtD,IAAA,KAAK,GAAG,KAAK,CAAU,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4EAAC;IACrD,WAAW,GAAG,MAAM,EAAiB;;IAGrC,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC3D,KAAK,GAAG,MAAM,EAAQ;;AAGtB,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;IACxB,MAAM,GAAG,MAAM,EAAQ;;;;;AAMvB,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,yCAAyC,CAAC,sFAAC;IACzF,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAClH,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAiC,CAAC,kFAAC;AAEtF,IAAA,QAAQ,CAAC,KAAmB,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK;YAAE;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;wGAjCW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,gxCC1B9B,k9DAuDA,EAAA,MAAA,EAAA,CAAA,wjDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/BY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,6TAAE,uBAAuB,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEhD,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EAGpB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,EAAA,QAAA,EAAA,k9DAAA,EAAA,MAAA,EAAA,CAAA,wjDAAA,CAAA,EAAA;;;AEyI9D;AACA;AACA;AAEA;AACO,MAAM,0BAA0B,GAAyC;AAC9E,IAAA,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC;AACvF,IAAA,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,CAAC;IAC3G,OAAO,EAAE,CAAC,OAAO,CAAC;IAClB,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC;IACvD,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC;IAC3D,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;IAC5C,aAAa,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;;AAGrD;AACO,MAAM,iCAAiC,GAAuC;AACnF,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,MAAM,EAAE,IAAI;AACZ,IAAA,aAAa,EAAE,IAAI;;AAGrB;AACO,MAAM,kBAAkB,GAAqC;AAClE,IAAA,MAAM,EAAE,aAAa;AACrB,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,OAAO,EAAE,WAAW;AACpB,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,aAAa,EAAE,MAAM;;AAGvB;;;AAGG;AACG,SAAU,gBAAgB,CAAC,KAAmB,EAAA;AAClD,IAAA,OAAO,KAAK,CAAC,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM;AAC/D;AAEA;MACa,0BAA0B,GAAe,CAAC,MAAM,EAAE,UAAU;AAEzE;MACa,wBAAwB,GAAe,CAAC,IAAI,EAAE,QAAQ;AAEnE;AACM,SAAU,sBAAsB,CAAC,KAAmB,EAAA;IACxD,IAAI,KAAK,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC,eAAe;AACvD,IAAA,OAAO,iCAAiC,CAAC,KAAK,CAAC,IAAI,CAAC;AACtD;AAEA;;;;;;;;;;;;;AAaG;AACH,MAAM,2BAA2B,GAAG,IAAI,OAAO,EAA4B;AAE3E;;;;;;;;AAQG;AACG,SAAU,uBAAuB,CAAC,KAAmB,EAAA;AACzD,IAAA,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;AAAE,QAAA,OAAO,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC;AAC3E,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,SAAS;IAExF,MAAM,MAAM,GAAG,2BAA2B,CAAC,GAAG,CAAC,KAAK,CAAC;AACrD,IAAA,IAAI,MAAM;AAAE,QAAA,OAAO,MAAM;IAEzB,MAAM,MAAM,GAAe,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAC1D,IAAA,2BAA2B,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AAC9C,IAAA,OAAO,MAAM;AACf;AAEA;;;AAGG;AACG,SAAU,2BAA2B,CAAC,KAAmB,EAAA;IAC7D,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;AAClD;;ACtPA;;;;;;;;;;AAUG;MASU,sBAAsB,CAAA;AACxB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;AAG3B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAgB;;AAEtC,IAAA,QAAQ,GAAG,KAAK,CAAW,SAAS,+EAAC;;AAErC,IAAA,KAAK,GAAG,KAAK,CAAU,IAAI,4EAAC;AAC5B,IAAA,OAAO,GAAG,KAAK,CAA4B,SAAS,8EAAC;;AAErD,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;;AAE3B,IAAA,MAAM,GAAG,KAAK,CAAqB,SAAS,6EAAC;;AAE7C,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;;IAGxB,WAAW,GAAG,MAAM,EAAW;;IAE/B,MAAM,GAAG,MAAM,EAAQ;AAEf,IAAA,UAAU,GAAG,SAAS,CAAe,YAAY,iFAAC;AAE1D,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;;AAGxB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,IAAA,OAAO,GAAG,MAAM,CAAC,EAAE,8EAAC;AAEpB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,QAAQ,+EAAC;AACzD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,SAAS,gFAAC;AACzD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,+EAAC;AAE/E,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,2EAAC;;;IAIrD,EAAE,GAAG,QAAQ,CAAC,MACrB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,4CAA4C,GAAG,2CAA2C,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC3H;IACQ,MAAM,GAAG,QAAQ,CAAC,MACzB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,kDAAkD,GAAG,gDAAgD,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtI;IACQ,IAAI,GAAG,QAAQ,CAAC,MACvB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,gDAAgD,GAAG,8CAA8C,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAClI;AAEQ,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,IAAI;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAU;YAC5B,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAC3E;AACA,QAAA,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAC9B,IAAA,CAAC,+EAAC;AAEO,IAAA,KAAK,GAAG,QAAQ,CAAY,MAAK;QACxC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,OAAO;QACnC,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,OAAO;AAClC,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,GAAG,SAAS;AAC/C,IAAA,CAAC,4EAAC;AAEF,IAAA,WAAA,GAAA;;;QAGE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAU;AAC5B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC;iBAAO;AACL,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC;AACF,QAAA,CAAC,CAAC;;;IAIJ;;AAGA,IAAA,cAAc,CAAC,EAAS,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,MAAqB;AACvC,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE;AACjE,QAAA,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE;IAC5B;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;AACd,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACrC;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;IAC3D;;AAGA,IAAA,aAAa,CAAC,GAA0B,EAAA;AACtC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAU;AAC5B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,GAAG,EAAE,IAAI,EAAE;IACb;AAEA,IAAA,QAAQ,CAAC,EAAS,EAAA;QAChB,EAAE,CAAC,eAAe,EAAE;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;;AAGA,IAAA,OAAO,CAAC,CAAM,EAAA;AACZ,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,OAAO,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1E,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnE;AACA,QAAA,OAAO,MAAM,CAAC,CAAC,CAAC;IAClB;;AAGA,IAAA,MAAM,CAAC,CAAS,EAAA;QACd,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;QAC1B,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE;AACrE,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;;;YAGnB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;AACvC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE;AAC5D,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE;QAC9E;QACA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;IAC/B;wGAnKW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,ipCClCnC,u7HA6FA,EAAA,MAAA,EAAA,CAAA,08DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/DY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,wIAAE,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI/B,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBARlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,EAAA,UAAA,EAC1B,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,u7HAAA,EAAA,MAAA,EAAA,CAAA,08DAAA,CAAA,EAAA;q2BA0BW,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AErCpE;;;;;;;;;;;;;AAaG;MASU,gBAAgB,CAAA;AAClB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;;;AAK3B,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,uFAAC;AACxF,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,wFAAC;;AAG1F,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAgB;;AAGzC,IAAA,OAAO,GAAG,KAAK,CAAU,SAAS,8EAAC;;AAGnC,IAAA,gBAAgB,GAAG,KAAK,CAAa,EAAE,uFAAC;;AAGxC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;;AAGvB,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;AAEpC;;;;AAIG;AACM,IAAA,MAAM,GAAG,KAAK,CAAS,gBAAgB,6EAAC;;;;;IAOxC,YAAY,GAAG,MAAM,EAAY;AAE1C;;;AAGG;IACM,WAAW,GAAG,MAAM,EAAW;;IAG/B,MAAM,GAAG,MAAM,EAAQ;AAEhC;;;AAGG;IACM,cAAc,GAAG,MAAM,EAAW;;IAGlC,WAAW,GAAG,MAAM,EAAW;;IAG/B,WAAW,GAAG,MAAM,EAAQ;;;;;AAOpB,IAAA,MAAM,GAAG,SAAS,CAAa,eAAe,6EAAC;;AAG/C,IAAA,MAAM,GAAG,SAAS,CAA+C,SAAS,6EAAC;;IAG5F,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE;IACvB;;IAGA,UAAU,GAAA;AACP,QAAA,IAAI,CAAC,MAAM,EAAU,EAAE,IAAI,IAAI;IAClC;;;;;AAOS,IAAA,UAAU,GAAG,QAAQ,CAAU,MAAK;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;AACzB,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI;AACtB,QAAA,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ;AACzC,IAAA,CAAC,iFAAC;wGAzFS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,2wCCzC7B,8kMAiIA,EAAA,MAAA,EAAA,CAAA,04GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1FY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,+BAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,qSAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAiB,QAAQ,6cAAE,sBAAsB,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,QAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE1H,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;+BACE,qBAAqB,EAAA,UAAA,EAGnB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,8kMAAA,EAAA,MAAA,EAAA,CAAA,04GAAA,CAAA,EAAA;AAkEtF,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,eAAe,gEAGmB,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE5E7F;;;;;;;;;;;;;AAaG;MAsBU,kBAAkB,CAAA;AACpB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3B,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,qCAAqC,CAAC,uFAAC;AACtF,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kDAAkD,CAAC,sFAAC;AAClG,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,gDAAgD,CAAC,oFAAC;AAC9F,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,uFAAC;AACxF,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,wFAAC;AAC1F,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mDAAmD,CAAC,6FAAC;AAC1G,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kDAAkD,CAAC,4FAAC;AACxG,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,yCAAyC,CAAC,yFAAC;;;;;AAO5F,IAAA,KAAK,GAAG,KAAK,CAA2B,SAAS,4EAAC;;AAGlD,IAAA,MAAM,GAAG,KAAK,CAAqB,SAAS,6EAAC;;AAG7C,IAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,gFAAC;;AAGtC,IAAA,UAAU,GAAG,KAAK,CAAS,IAAI,iFAAC;;AAGhC,IAAA,gBAAgB,GAAG,KAAK,CAAsB,SAAS,uFAAC;;;;;IAOxD,MAAM,GAAG,MAAM,EAAU;;IAGzB,SAAS,GAAG,MAAM,EAAgB;;;;;AAOlC,IAAA,eAAe,GAAG,MAAM,CAAW,OAAO,sFAAC;;AAE3C,IAAA,YAAY,GAAG,MAAM,CAAU,IAAI,mFAAC;;AAEpC,IAAA,cAAc,GAAG,MAAM,CAAQ,EAAE,qFAAC;;AAElC,IAAA,qBAAqB,GAAG,MAAM,CAAC,KAAK,4FAAC;;;;AAMrC,IAAA,gBAAgB,GAAG,QAAQ,CAAa,MAAK;AACpD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,GAAG,EAAE;AAC5C,IAAA,CAAC,uFAAC;AAEO,IAAA,oBAAoB,GAAG,QAAQ,CAAU,MAAK;AACrD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,CAAC,GAAG,2BAA2B,CAAC,CAAC,CAAC,GAAG,KAAK;AACnD,IAAA,CAAC,2FAAC;;AAGF,IAAA,QAAQ,CAAC,EAAa,EAAA;QACpB,OAAO,wBAAwB,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IACxE;;AAGA,IAAA,gBAAgB,CAAC,EAAqB,EAAA;AACpC,QAAA,OAAO,0BAA0B,CAAC,QAAQ,CAAC,EAAc,CAAC;IAC5D;;AAGA,IAAA,UAAU,CAAC,IAAY,EAAA;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;QAC5B,OAAO,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;IAC5C;IAES,OAAO,GAAG,gBAAgB;;;;AAM1B,IAAA,IAAI,GAAG,SAAS,CAAU,MAAM,2EAAC;;;;;;IAQ1C,IAAI,CAAC,MAA0B,EAAE,KAA+B,EAAA;AAC9D,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;AACrB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;AACjC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC;QACF;QACA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAE,MAAc,CAAC,QAAoB,CAAC;QAC9D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAE,MAAc,CAAC,IAAI,IAAI,IAAI,CAAC;AAEnD,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC3B,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAChC;AAAO,aAAA,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE;AACvC,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;QACvC;IACF;;;;;AAOA,IAAA,uBAAuB,CAAC,IAAc,EAAA;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;AACnC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAE9B,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B;QACF;AACA,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;YAC7B,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAK,CAAS;gBAAE;AACxD,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAW,CAAC;YACxD;QACF;QACA,MAAM,YAAY,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC5D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAgB,CAAC;AACpE,QAAA,IAAI,YAAY,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7C;AAAO,aAAA,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE;AACpC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACvE;IACF;;AAGA,IAAA,mBAAmB,CAAC,KAAc,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;;AAGA,IAAA,kBAAkB,CAAC,KAA6B,EAAA;QAC9C,MAAM,CAAC,GAAI,IAAI,CAAC,YAAY,EAAY,IAAI,EAAE;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9C;;AAGA,IAAA,gBAAgB,CAAC,KAA6B,EAAA;QAC5C,MAAM,CAAC,GAAI,IAAI,CAAC,YAAY,EAAY,IAAI,EAAE;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC5C;;AAGA,IAAA,uBAAuB,CAAC,KAAc,EAAA;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAI,IAAI,CAAC,YAAY,EAAgB,CAAC,GAAG,EAAE;QAC7F,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC;AAAE,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;;AAC3B,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B;AAEA,IAAA,sBAAsB,CAAC,KAAc,EAAA;AACnC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC9C;;;;AAMA;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,IAAI,CAAC,CAAC;YAAE;AACR,QAAA,MAAM,IAAI,GAAW;YACnB,KAAK,EAAG,CAAS,CAAC,KAAK;AACvB,YAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE;AAChC,YAAA,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE;SAChB;AACX,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB;;;;AAMA,IAAA,kBAAkB,CAAC,KAAmB,EAAA;AACpC,QAAA,MAAM,GAAG,GAAI,KAAa,CAAC,MAAM;AACjC,QAAA,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK;AACxB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC;QACF;AACA,QAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACnB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAE,KAAa,EAAE,CAAC;AACzC,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC;QACF;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,YAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;AACpC,YAAA,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,iBAAA,IAAI,CAAC,CAAC,GAAU,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AACvD,iBAAA,OAAO,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzD;IACF;AAEA,IAAA,gBAAgB,CAAC,KAAmB,EAAE,MAAM,GAAG,EAAE,EAAA;AAC/C,QAAA,MAAM,GAAG,GAAI,KAAa,CAAC,MAAM;QACjC,IAAI,CAAC,GAAG,EAAE,MAAM;YAAE;AAClB,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;AACpC,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AACjE,QAAA,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE;YACvB,MAAc,CAAC,SAAS,CAAC;AACxB,gBAAA,IAAI,EAAE,CAAC,GAAU,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;gBACxD,QAAQ,EAAE,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;gBACrD,KAAK,EAAE,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnD,aAAA,CAAC;QACJ;aAAO;AACL,YAAA,OAAO,CAAC,OAAO,CAAC,MAAM;AACnB,iBAAA,IAAI,CAAC,CAAC,GAAU,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AACvD,iBAAA,OAAO,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzD;IACF;wGAhPW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnE/B,i4PAgKA,EAAA,MAAA,EAAA,CAAA,wrEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3GI,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,6TAChB,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,eAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,KAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBArB9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,cAGrB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,MAAM;wBACN,YAAY;wBACZ,WAAW;wBACX,aAAa;wBACb,gBAAgB;wBAChB,QAAQ;wBACR,UAAU;wBACV,QAAQ;wBACR,OAAO;wBACP,aAAa;wBACb,MAAM;wBACN,UAAU;AACX,qBAAA,EAAA,QAAA,EAAA,i4PAAA,EAAA,MAAA,EAAA,CAAA,wrEAAA,CAAA,EAAA;spBA4FkC,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEtJ3C;;;;;;;;;;;AAWG;MASU,kBAAkB,CAAA;AACpB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3B,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sCAAsC,CAAC,iFAAC;;AAGjF,IAAA,MAAM,GAAG,KAAK,CAAiB,EAAE,6EAAC;;AAGlC,IAAA,UAAU,GAAG,KAAK,CAAqB,SAAS,iFAAC;;AAGjD,IAAA,QAAQ,GAAG,KAAK,CAAc,IAAI,GAAG,EAAU,+EAAC;;IAGhD,IAAI,GAAG,MAAM,EAAgB;;AAG7B,IAAA,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;IAElC,OAAO,GAAG,gBAAgB;;AAG1B,IAAA,WAAW,GAAG,QAAQ,CAAc,MAAK;QAChD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,IAAI,GAAG;AAAE,YAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACrB,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,kFAAC;AAEF,IAAA,UAAU,CAAC,KAAmB,EAAA;AAC5B,QAAA,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;IAC/E;;AAGA,IAAA,SAAS,CAAC,KAAmB,EAAA;QAC3B,OAAO,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU,EAAE;IACxC;;AAGA,IAAA,MAAM,CAAC,KAAmB,EAAA;QACxB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;IACjD;wGAzCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,iiBAiBM,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5C5C,utBAkBA,EAAA,MAAA,EAAA,CAAA,ilCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDOY,MAAM,uKAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEpB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAR9B,SAAS;+BACE,uBAAuB,EAAA,UAAA,EAGrB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,utBAAA,EAAA,MAAA,EAAA,CAAA,ilCAAA,CAAA,EAAA;maAmBG,OAAO,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE5B5C;;;;;;;;;;;;;;;AAeG;MASU,iBAAiB,CAAA;AACnB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;;AAI3B,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,uFAAC;AACxF,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,wFAAC;;;;;AAO1F,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAgB;;AAGtC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAU;;AAGjC,IAAA,OAAO,GAAG,KAAK,CAAU,SAAS,8EAAC;;AAGnC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;;AAGvB,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;;AAG3B,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;;AAG1B,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;;AAG7B,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;;;;;IAOvB,MAAM,GAAG,MAAM,EAAW;;IAG1B,WAAW,GAAG,MAAM,EAAyC;;IAG7D,UAAU,GAAG,MAAM,EAAW;;IAG9B,MAAM,GAAG,MAAM,EAAQ;;;;AAMhC;;;;AAIG;AACM,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;;;AAMpC,IAAA,QAAQ,GAAG,QAAQ,CAAS,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,+EAAC;;AAGjE,IAAA,QAAQ,GAAG,QAAQ,CAAW,MAAO,IAAI,CAAC,MAAM,EAAU,CAAC,QAAoB,+EAAC;;AAGhF,IAAA,IAAI,GAAG,QAAQ,CAAU,MAAO,IAAI,CAAC,MAAM,EAAU,CAAC,IAAI,2EAAC;;;;;IAOpE,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;;;;AAMA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,CAAU,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACrB;;AAGA,IAAA,eAAe,CAAC,EAAyC,EAAA;QACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC;IACnC;;AAGA,IAAA,QAAQ,CAAC,CAAU,EAAA;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzB;;AAGA,IAAA,WAAW,CAAC,CAAU,EAAA;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;wGAjHW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxC9B,k7KAoHA,EAAA,MAAA,EAAA,CAAA,26GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED9EY,MAAM,uKAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,EAAA,KAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,8XAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,eAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE1E,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;+BACE,sBAAsB,EAAA,UAAA,EAGpB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAA,QAAA,EAAA,k7KAAA,EAAA,MAAA,EAAA,CAAA,26GAAA,CAAA,EAAA;;;AE5BxF;;;;AAIG;MASU,kBAAkB,CAAA;;AAEpB,IAAA,KAAK,GAAG,KAAK,CAA2B,SAAS,4EAAC;;AAGlD,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAU;;AAGjC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAW;;AAGlC,IAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;;AAG3B,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;;AAG7B,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAW;;IAGhC,IAAI,GAAG,MAAM,EAAQ;;IAErB,MAAM,GAAG,MAAM,EAAQ;IAEvB,OAAO,GAAG,gBAAgB;IAEnC,WAAW,GAAA;AACT,QAAA,OAAQ,IAAI,CAAC,MAAM,EAAU,CAAC,KAAe;IAC/C;IACA,cAAc,GAAA;AACZ,QAAA,OAAQ,IAAI,CAAC,MAAM,EAAU,CAAC,QAAoB;IACpD;;;;IAKiB,OAAO,GAAG,SAAS,CAAC,aAAa,+EAAI,IAAI,EAAE,cAAc,EAAA,CAAG;IAC7E,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE;IAC5B;IACA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE;IAC7B;wGA1CW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAoC+B,cAAc,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3D5E,6jDA8CA,EAAA,MAAA,EAAA,CAAA,0+CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDzBY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAElD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAR9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,UAAA,EAGrB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAA,QAAA,EAAA,6jDAAA,EAAA,MAAA,EAAA,CAAA,0+CAAA,CAAA,EAAA;AAsCzB,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,aAAa,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEN9E;AACA,MAAM,WAAW,GAAU,EAAE;MAuBhB,UAAU,CAAA;AACZ,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3B,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;;AAG5B,IAAA,YAAY,GAAG,YAAY,CAAC,kBAAkB,mFAAC;;AAGvC,IAAA,SAAS,GAAG,SAAS,CAAC,gBAAgB,gFAAC;;AAG/C,IAAA,WAAW,GAAG,SAAS,CAAC,kBAAkB,kFAAC;AAEpD;;;;AAIG;AACH,IAAA,eAAe,CAAC,KAAmB,EAAA;AACjC,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI;AACpB,QAAA,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,EAAE;YAC7E,eAAe,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACrF;;;IAGF;;;;;AAOS,IAAA,MAAM,GAAG,KAAK,CAA+B,SAAS,6EAAC;;AAGvD,IAAA,WAAW,GAAG,KAAK,CAAgD,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,aAAA,EAAA,8BAAA,EAAA,CAAA,EACnF,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE,CAAC,CAAC,KAAyB,CAAC,IAAI,SAAS,EAAA,CACpD;;AAGO,IAAA,MAAM,GAAG,KAAK,CAAoD,EAAE,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,CAAA,EAC3E,SAAS,EAAE,CAAC,CAAC,MAAsB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAC7D;AAEF;;;AAGG;AACM,IAAA,OAAO,GAAG,KAAK,CAAW,EAAE,8EAAC;AAEtC;;;AAGG;AACM,IAAA,KAAK,GAAG,KAAK,CAAe,KAAK,4EAAC;;AAGlC,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;AAEnC;;;;;;;AAOG;AACM,IAAA,IAAI,GAAG,KAAK,CAAgE,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,MAAA,EAAA,8BAAA,EAAA,CAAA,EAC5F,SAAS,EAAE,CAAC,CAAC,KAA2B,CAAC,IAAI,SAAS,GACtD;;AAGO,IAAA,OAAO,GAAG,KAAK,CAAsC,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,CAAA,EACrE,SAAS,EAAE,CAAC,CAAC,KAAc,CAAC,IAAI,SAAS,GACzC;;IAGO,UAAU,GAAG,KAAK,CAAC,KAAK,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG1D,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEzE;;;AAGG;AACM,IAAA,eAAe,GAAG,KAAK,CAAqB,SAAS,sFAAC;AAE/D;;;AAGG;IACM,YAAY,GAAG,QAAQ,CAAU,MAAM,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGnE,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;AAC1C,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QACzE,IAAI,CAAC,YAAY,EAAE;IACrB;;IAGS,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG/D,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG3D,kBAAkB,GAAG,KAAK,CAAC,KAAK,0FAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;;;;IAOlE,WAAW,GAAG,MAAM,EAAW;;IAG/B,KAAK,GAAG,MAAM,EAAW;;;;;;;;;;;;AAezB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,6CAA6C,CAAC,wFAAC;;AAE/F,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oCAAoC,CAAC,oFAAC;;AAElF,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,qCAAqC,CAAC,qFAAC;;IAGpF,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,SAAS,qFAAC;AACzF,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,qFAAC;AACvE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,mFAAC;AACjE,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,sFAAC;AAC1E,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE,yFAAC;AACnF,IAAA,wBAAwB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,EAAE,+FAAC;AACrG,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE,8FAAC;AAClG,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE,8FAAC;AAClG,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,2FAAC;AACzF,IAAA,0BAA0B,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,EAAE,iGAAC;AAEpH,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,IAAI,CAAC,MAAM;gBAAE;YACb,SAAS,CAAC,MAAK;gBACb,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,OAAO;oBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBACzF,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,MAAM,CAAC,KAAK;oBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AAC/E,gBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;AACpG,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAES,IAAA,UAAU,GAAG,QAAQ,CAA+B,MAAK;QAChE,MAAM,GAAG,GAAiC,EAAE;AAC5C,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE;AAAE,YAAA,GAAG,CAAC,CAAC,CAAC,GAAa,CAAC,GAAG,CAAC;AAC/D,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,iFAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAAc,MAAK;AAClD,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YAC9B,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;AAAE,gBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QACnE;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,oFAAC;;IAGO,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;IAGvH,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;;;;;AAQxF,IAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,mFAAC;;AAG1C,IAAA,YAAY,GAAG,QAAQ,CAAsB,MAAK;AACzD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,IAAI,GAAG,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC;QAC7B,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;QACtC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAe,CAAC,IAAI,IAAI;AACrD,IAAA,CAAC,mFAAC;AAEF;;;;AAIG;AACH,IAAA,QAAQ,CAAC,EAAY,EAAA;AACnB,QAAA,OAAO,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC9C;;;;AAMA;;;;;;;;;;AAUG;AACM,IAAA,OAAO,GAAG,IAAI,OAAO,EAAkB;IAChD,SAAS,GAAG,CAAC;AAEb;;;;;;;;;;;;;AAaG;AACH,IAAA,KAAK,CAAC,MAAc,EAAA;QAClB,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,EAAE,GAAG,CAAA,IAAA,EAAO,EAAE,IAAI,CAAC,SAAS,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9B;AACA,QAAA,OAAO,EAAE;IACX;AAEA;;;;AAIG;IACH,aAAa,CAAC,QAAgB,EAAE,IAAY,EAAA;AAC1C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C;;;;IAMS,OAAO,GAAG,gBAAgB;;AAGnC,IAAA,cAAc,CAAC,MAAc,EAAA;AAC3B,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAoB,CAAC;AAAE,YAAA,OAAO,IAAI;AACjF,QAAA,MAAM,IAAI,GAAI,MAAc,CAAC,IAAI;QACjC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;AAAE,YAAA,OAAO,KAAK;QACpE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAC1D,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAoB,CAAC;AAAE,YAAA,OAAO,EAAE;AAC/E,QAAA,MAAM,IAAI,GAAI,MAAc,CAAC,IAAI;AACjC,QAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;AAAE,YAAA,OAAO,EAAE;AAClD,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACrE,YAAA,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA,GAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;QAChD;AACA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,EAAE;AAChC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,EAAG,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI;QAC/D;QACA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;IACvC;AAEA,IAAA,gBAAgB,CAAC,EAAqB,EAAA;AACpC,QAAA,OAAO,0BAA0B,CAAC,QAAQ,CAAC,EAAc,CAAC;IAC5D;;;;;AAOS,IAAA,SAAS,GAAG,MAAM,CAAsB,IAAI,gFAAC;AAC7C,IAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE/C;;;;;AAKG;AACH,IAAA,mBAAmB,CAAC,KAAmB,EAAA;AACrC,QAAA,OAAO,uBAAuB,CAAC,KAAK,CAAC;IACvC;IAEA,YAAY,CAAC,KAAa,EAAE,IAAY,EAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI;AAC1C,QAAA,OAAO,GAAG,IAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,IAAI,EAAE;IACzC;;;;;AAOA,IAAA,aAAa,CAAC,KAAmB,EAAE,QAAkB,EAAE,KAAc,EAAA;QACnE,IAAI,IAAI,GAAY,KAAK;AACzB,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,IAAI,GAAG,IAAI;AACzD,aAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC/B,YAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE;QACxE;AAAO,aAAA,IAAI,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACtD,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;QAClE;AACA,QAAA,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAU,EAAE,QAAQ,EAAE,IAAI,EAAY;AAClE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7C;;AAGA,IAAA,UAAU,CAAC,KAAmB,EAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC;AAC9C,QAAA,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,CAAC;;;;QAIzC,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC3C,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;;YAG/C,eAAe,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YACrF;QACF;AACA,QAAA,MAAM,QAAQ,GAAG,gBAAgB,GAAG,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAC7D,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACjD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;AACzC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YACxB;QACF;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACtD,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;IAC7B;;AAGA,IAAA,iBAAiB,CAAC,EAAY,EAAA;AAC5B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAA,IAAI,CAAC,CAAC;YAAE;AACR,QAAA,IAAI,0BAA0B,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YAC3C,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YACxB;QACF;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/B;;AAGA,IAAA,gBAAgB,CAAC,KAAc,EAAA;AAC7B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC;AAC9C,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;AAEA;;;AAGG;AACH,IAAA,qBAAqB,CAAC,KAAc,EAAA;AAClC,QAAA,MAAM,KAAK,GACT,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAe,CAAC,IAAI,IAAI,IAAI,IAAK,KAAe,CAAC,EAAE,IAAI,IAAI,CAAC;QAC9H,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAC9B;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;AAEA;;;;;AAKG;IACH,cAAc,CAAC,CAAS,EAAE,EAAyC,EAAA;QACjE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAqB,CAAC;IACnF;;;;AAMA,IAAA,SAAS,CAAC,KAAmB,EAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC;AAC9C,QAAA,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI;AACpE,QAAA,MAAM,IAAI,GAAW,EAAE,KAAK,EAAE,KAAK,CAAC,GAAU,EAAE,QAAQ,EAAE,IAAI,EAAY;QAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM;AACtC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;;;QAG3C,eAAe,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAChG;;IAGA,iBAAiB,CAAC,KAAa,EAAE,KAAmB,EAAA;QAClD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE;AACvC,QAAA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC;AAC9C,QAAA,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI;AACpE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAU,EAAE,QAAQ,EAAE,IAAI,EAAY;AACnE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;;;;QAItB,eAAe,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC7F;IAEA,YAAY,CAAC,KAAa,EAAE,KAAsB,EAAA;QAChD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,MAAM,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAY;;;AAGhD,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEA,gBAAgB,CAAC,KAAa,EAAE,IAAa,EAAA;QAC3C,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,EAAqB,CAAC;IACvD;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE;AACvC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;;;;QAInC,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,EAAE;AACxC,YAAA,IAAI,KAAK,KAAK,OAAO,EAAE;;gBAErB,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE;AACvC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B;iBAAO;gBACL,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;YACpC;QACF;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;AACjC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,QAAQ,CAAC,KAAmB,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK;YAAE;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK;YAAE;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;IAEA,YAAY,GAAA;;;AAGV,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;QAC5B,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,GAAG,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACpB;;;;AAMA;;;AAGG;AACH,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC;YAAE;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,KAAe,CAAC;QACvD,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;IACzC;;AAGA,IAAA,mBAAmB,CAAC,IAAY,EAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,IAAI,GAAG,KAAK,IAAI;YAAE;QAClB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ;YAAE;;;AAGf,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;;;;IAMA,WAAW,GAAA;QACT,OAAO;AACL,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;YACnB,IAAI,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;SAChE;IACH;IAEA,WAAW,CAAC,MAAc,EAAE,GAAQ,EAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,OAAO,IAAI,MAAM,GAAI,MAAM,CAAC,KAAgB,GAAG,EAAE;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC;AACzC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;;;AAG5B,YAAA,MAAM,SAAS,GAAI,KAAa,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC;AACnG,YAAA,MAAM,UAAU,GAAI,KAAa,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC;YACtG,OAAO,GAAG,GAAG,SAAS,GAAG,UAAU;QACrC;AACA,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE;AAC3D,YAAA,MAAM,GAAG,GAAI,KAAa,CAAC,MAAM;YACjC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;AAChE,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,aAAa;YACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;AACjE,YAAA,IAAI,KAAK;gBAAE,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;YAC1E,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;QAChE;AACA,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC;IACpB;AAEA,IAAA,iBAAiB,CAAC,KAAU,EAAA;AAC1B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QACtC,IAAI,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAQ,KAAa,EAAE;AAC5C,QAAA,OAAO,IAAI;IACb;wGA7jBW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,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,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,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,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,KAAA,EAAA,aAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAKgB,kBAAkB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGhB,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGtB,kBAAkB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxFrD,88OAgLA,EAAA,MAAA,EAAA,CAAA,izPAAA,EAAA,8yJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjHI,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,YAAY,8BACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,UAAA,EAAA,IAAA,EACX,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,OAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,gBAAgB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,kBAAkB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,YAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,sBAAsB,qMACtB,kBAAkB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGT,UAAU,EAAA,UAAA,EAAA,CAAA;kBArBtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cAGZ,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,MAAM;wBACN,YAAY;wBACZ,WAAW;wBACX,aAAa;wBACb,gBAAgB;wBAChB,iBAAiB;wBACjB,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,iBAAiB;wBACjB,sBAAsB;wBACtB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,88OAAA,EAAA,MAAA,EAAA,CAAA,izPAAA,EAAA,8yJAAA,CAAA,EAAA;2HAOoC,kBAAkB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGhB,gBAAgB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAGtB,kBAAkB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AExFrD;;AAEG;;;;"}