@oneteme/jquery-table 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"oneteme-jquery-table.mjs","sources":["../../../../projects/oneteme/jquery-table/src/lib/jquery-table.model.ts","../../../../projects/oneteme/jquery-table/src/lib/jqt-i18n.token.ts","../../../../projects/oneteme/jquery-table/src/lib/directive/jqt-cell-def.directive.ts","../../../../projects/oneteme/jquery-table/src/lib/component/slice-panel/slice-panel.component.ts","../../../../projects/oneteme/jquery-table/src/lib/component/slice-panel/slice-panel.component.html","../../../../projects/oneteme/jquery-table/src/lib/component/table.utils.ts","../../../../projects/oneteme/jquery-table/src/lib/component/view/view.facade.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.constants.ts","../../../../projects/oneteme/jquery-table/src/lib/component/lazy-column-manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table-preferences.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/group-by.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/export.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.component.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.component.html","../../../../projects/oneteme/jquery-table/src/public-api.ts","../../../../projects/oneteme/jquery-table/src/oneteme-jquery-table.ts"],"sourcesContent":["import { DataProvider } from '@oneteme/jquery-core';\nimport { Observable } from 'rxjs';\nimport { SliceConfig } from './component/slice-panel/slice-panel.model';\nexport { SliceConfig } from './component/slice-panel/slice-panel.model';\n\nexport interface TableColumnProvider<T = any> {\n key: string;\n /** Libellé affiché dans l'en-tête de colonne. Optionnel si la colonne utilise un template custom. */\n header?: string;\n icon?: string;\n value?: DataProvider<any>;\n /** Valeur utilisée pour le tri si différente de `value`. Utile quand `value` retourne une chaîne formatée (date, durée...). */\n sortValue?: DataProvider<any>;\n /**\n * Valeur utilisée pour la recherche plein-texte.\n * À définir quand la colonne utilise un `jqt-cell-def` template personnalisé et qu'aucun `value` provider n'est déclaré.\n * Si absent, la recherche utilise `value` en priorité, puis la valeur brute de la ligne.\n * Exemple : `searchValue: (row) => durationPipe.transform((today - row.start) / 1000)`\n */\n searchValue?: DataProvider<string>;\n sortable?: boolean;\n removable?: boolean;\n optional?: boolean;\n width?: string;\n groupable?: boolean;\n sliceable?: boolean;\n /** Chargement différé : la présence de cet objet active le mode lazy. */\n lazy?: {\n /** Fonction appelée pour charger les valeurs de la colonne. Retourne un tableau dans le même ordre que les lignes. */\n fetchFn: () => Observable<any[]>;\n };\n}\n\n/** Configuration de la barre de recherche. */\nexport interface TableSearchConfig {\n enabled?: boolean;\n /** Valeur initiale au chargement. */\n initialQuery?: string;\n /** Restreint la recherche texte aux colonnes dont la `key` est dans ce tableau. Si absent, toutes les colonnes sont cherchées. */\n searchColumns?: string[];\n}\n\n/** Configuration de la pagination. */\nexport interface TablePaginationConfig {\n enabled?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n showFirstLastButtons?: boolean;\n /** Options de taille de page spécifiques au mode Group by. Si absent, utilise `pageSizeOptions`. */\n pageSizeOptionsGroupBy?: number[];\n}\n\n/** Configuration du menu View (Champs / Group by / Slice by). */\nexport interface TableViewConfig {\n /** Active le bouton View. Par défaut : `false`. */\n enabled?: boolean;\n /** Autorise le masquage/affichage des colonnes de base via View > Champs. Par défaut : `true`. */\n enableColumnRemoval?: boolean;\n /** Active le drag & drop pour réordonner les colonnes. Par défaut : `false`. */\n enableColumnDragDrop?: boolean;\n}\n\n/** Labels d'état du tableau. */\nexport interface TableLabelsConfig {\n /** Affiché quand le tableau est vide. Par défaut : `'Aucune donnée'`. */\n empty?: string;\n /** Affiché pendant le chargement. Par défaut : `'Chargement des données...'`. */\n loading?: string;\n}\n\n/**\n * Raccourci pour déclarer une colonne de base.\n *\n * ```ts\n * columns: [\n * col('name', 'Nom'),\n * col('status', 'Statut', { sortable: false }),\n * ]\n * ```\n */\nexport function col<T = any>(\n key: string,\n header: string,\n overrides?: Partial<TableColumnProvider<T>>,\n): TableColumnProvider<T> {\n return { key, header, ...overrides };\n}\n\n/** Configuration de l’export CSV déclenché depuis la toolbar. */\nexport interface TableExportConfig<T = any> {\n /** Affiche le bouton Export dans la toolbar. Par défaut : `true`. */\n enabled?: boolean;\n /** Nom du fichier généré. Par défaut : `'export.csv'`. */\n filename?: string;\n /**\n * Transforme chaque ligne avant export.\n * Si absent, les valeurs affichées (après `normalizeCellValue`) sont utilisées.\n * Seules les colonnes visibles sont exportées.\n */\n transform?: (row: T) => Record<string, string>;\n}\n/**\n * Configuration de la fonctionnalité Préférences.\n *\n * Ajoute un menu \"Préférences\" dans View qui permet :\n * - Le **mode édition** (redimensionner / réordonner les colonnes à la souris)\n * - L'**enregistrement** de la configuration courante dans le localStorage\n * - L'**effacement** de la configuration sauvegardée\n *\n * Chaque tableau est identifié par `tableId` (clé localStorage unique).\n */\nexport interface TablePreferencesConfig {\n /** Active la fonctionnalité. Par défaut : `true`. */\n enabled?: boolean;\n /**\n * Identifiant unique du tableau, utilisé comme clé localStorage.\n * Doit être stable entre les rechargements de page.\n * Si absent, un identifiant est dérivé automatiquement des clés de colonnes.\n * Exemple : `'user-table'`, `'invoice-list'`.\n */\n tableId?: string;\n}\n\n/** Snapshot de configuration persisté dans le localStorage. */\nexport interface SavedTableConfig {\n /** Valeur de la searchbar. */\n search?: string;\n /** Clé de la colonne utilisée pour le group by. `null` = aucun. */\n groupBy?: string | null;\n /** Ordre des clés de colonnes (position). */\n columnOrder?: string[];\n /** Clés des colonnes visibles. */\n visibleColumns?: string[];\n /** Largeurs de colonnes en pixels, indexées par clé. */\n columnWidths?: Record<string, number>;\n /** Panneau slice replié ou non. */\n slicePanelCollapsed?: boolean;\n /** Clés des slices statiques cachées par l'utilisateur (via toggle dans le menu View). */\n hiddenSliceKeys?: string[];\n /** Clés des colonnes utilisées comme slices dynamiques. */\n dynamicSliceKeys?: string[];\n /** Filtres actifs du slice panel : map sliceIndex → tableau de clés actives. */\n sliceFilters?: Record<number, string[]>;\n}\nexport interface TableProvider<T = any> {\n columns?: TableColumnProvider<T>[];\n title?: string;\n slices?: SliceConfig<T>[];\n /** Affiche le bouton toggle pour replier/déplier le panneau de slices. Par défaut : `true`. */\n enableSliceToggle?: boolean;\n /**\n * Permet de vider search bar depuis config\n * Changez cette valeur (ex: route courante, compteur, timestamp) pour déclencher un reset.\n */\n clearSearchInput?: string | number | boolean | null;\n search?: TableSearchConfig;\n pagination?: TablePaginationConfig;\n view?: TableViewConfig;\n labels?: TableLabelsConfig;\n /** Tri initial appliqué au chargement. N'est pas écrasé par les changements de données. */\n defaultSort?: { active: string; direction: 'asc' | 'desc' };\n /** Clé de colonne à utiliser comme group-by par défaut au chargement. N'est pas écrasé par les changements de données ni par un reset explicite de l'utilisateur. */\n defaultGroupBy?: string | null;\n rowClass?: (row: T, index: number) => string | string[] | Record<string, boolean>;\n /** Callback déclenché quand l'utilisateur clique sur une ligne. Alternative au `(rowSelected)` Output. */\n onRowSelected?: (row: T, event: MouseEvent | null) => void;\n /** Configuration de l'export CSV. */\n export?: TableExportConfig<T>;\n /** Configuration de la fonctionnalité Préférences (édition + persistance localStorage). */\n preferences?: TablePreferencesConfig;\n}\n\n\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Labels de l'interface utilisateur de jquery-table.\n *\n * Fournir ce token au niveau du module ou du composant racine pour localiser\n * ou personnaliser tous les textes de la bibliothèque en un seul endroit :\n *\n * ```ts\n * providers: [\n * { provide: JQT_I18N, useValue: { searchPlaceholder: 'Search…', emptyState: 'No data' } }\n * ]\n * ```\n *\n * Tous les champs sont optionnels : seul ce que vous fournissez écrase les\n * valeurs par défaut françaises.\n */\nexport interface JqtI18n {\n /** Placeholder de la barre de recherche. */\n searchPlaceholder: string;\n /** Titre du bouton pour déplier le panneau de filtres. */\n expandFilterTitle: string;\n /** Titre du bouton pour replier le panneau de filtres. */\n collapseFilterTitle: string;\n /** Label du sous-menu \"Champs\" dans View. */\n viewMenuFields: string;\n /** Label du sous-menu \"Group by\" dans View. */\n viewMenuGroupBy: string;\n /** Label du sous-menu \"Slice by\" dans View. */\n viewMenuSliceBy: string;\n /** Label affiché quand aucune option n'est sélectionnée (groupe, slice). */\n viewNoneSelected: string;\n /** Bouton \"Retirer le groupe\" dans la barre de groupe. */\n groupRemove: string;\n /** Label \"Trier :\" dans la barre de groupe. */\n groupSortLabel: string;\n /** Tooltip tri ascendant. */\n groupSortAsc: string;\n /** Tooltip tri descendant. */\n groupSortDesc: string;\n /** Label \"Lignes par groupe\" dans le sélecteur de taille de groupe. */\n groupRowsPerGroup: string;\n /** Option \"Toutes\" (afficher toutes les lignes sans pagination de groupe). */\n groupShowAll: string;\n /** Message quand le groupe dépasse le nombre maximal autorisé. Reçoit le nombre de groupes. */\n groupTooMany: (count: number) => string;\n /** Label du bouton de réessai pour une colonne lazy en erreur. */\n lazyRetry: string;\n /** Tooltip du bouton de réessai. */\n lazyErrorTitle: string;\n /** Tooltip de l'icône d'erreur dans le menu View > Champs. */\n lazyErrorMenuTitle: string;\n /** Valeur affichée dans une cellule vide (null / undefined / ''). */\n cellEmpty: string;\n /** Message quand le tableau est vide. */\n emptyState: string;\n /** Message pendant le chargement (`[isLoading]=\"true\"`). */\n loadingState: string;\n /** Titre du panneau de filtres latéral. Reçoit le nombre de blocs de filtres actifs. */\n filterPanelTitle: (count: number) => string;\n /** Titre par défaut d'un bloc de filtre sans `title` configuré. */\n filterBlockDefaultTitle: string;\n /** Message dans un bloc de filtre sans catégories correspondantes. */\n filterEmptyState: string;\n /** Label du bouton d'export CSV. */\n exportButtonLabel: string;\n /** Label du menu Préférences dans View. */\n preferencesMenuLabel: string;\n /** Sous-item : activer le mode édition. */\n preferencesEdit: string;\n /** Sous-item : enregistrer la config. */\n preferencesSave: string;\n /** Sous-item : effacer la config. */\n preferencesClear: string;\n /** Message de confirmation après enregistrement. */\n preferencesSavedMessage: string;\n /** Message de confirmation après effacement. */\n preferencesClearedMessage: string;\n /** Tooltip du bouton de validation du mode édition. */\n preferencesConfirmEdit: string;\n}\n\n/** Valeurs par défaut (français). Toutes les propriétés sont garanties non nulles. */\nexport const JQT_I18N_DEFAULTS: JqtI18n = {\n searchPlaceholder: 'Rechercher...',\n expandFilterTitle: 'Déplier le filtre',\n collapseFilterTitle: 'Replier le filtre',\n viewMenuFields: 'Champs',\n viewMenuGroupBy: 'Grouper par',\n viewMenuSliceBy: 'Filtrer par',\n viewNoneSelected: 'Aucun',\n groupRemove: 'Retirer le groupe',\n groupSortLabel: 'Trier :',\n groupSortAsc: 'A → Z',\n groupSortDesc: 'Z → A',\n groupRowsPerGroup: 'Lignes par groupe :',\n groupShowAll: 'Toutes',\n groupTooMany: (count) => `⚠ Trop de groupes (${count}) — affinez les données ou choisissez une autre colonne`,\n lazyRetry: 'Réessayer',\n lazyErrorTitle: 'Erreur de chargement — cliquer pour réessayer',\n lazyErrorMenuTitle: 'Erreur de chargement',\n cellEmpty: 'N/A',\n emptyState: 'Aucune donnée',\n loadingState: 'Chargement des données...',\n filterPanelTitle: (count) => count > 1 ? 'Filtres' : 'Filtre',\n filterBlockDefaultTitle: 'Filtrer',\n filterEmptyState: 'Aucune donnée',\n exportButtonLabel: 'Exporter',\n preferencesMenuLabel: 'Préférences',\n preferencesEdit: 'Éditeur',\n preferencesSave: 'Sauvegarder',\n preferencesClear: 'Réinitialiser',\n preferencesSavedMessage: 'Configuration enregistrée. Vous pouvez la réinitialiser à tout moment via Préférences → Réinitialiser.',\n preferencesClearedMessage: 'Configuration réinitialisée.',\n preferencesConfirmEdit: 'Valider les modifications',\n};\n\n/**\n * Token d'injection pour surcharger tout ou partie des labels de jquery-table.\n * Accepte un `Partial<JqtI18n>` — seules les clés fournies écrasent les défauts.\n */\nexport const JQT_I18N = new InjectionToken<Partial<JqtI18n>>('JQT_I18N');\n","import { Directive, Input, TemplateRef } from '@angular/core';\n\n/**\n * Directive permettant de définir un template de cellule personnalisé pour une colonne.\n *\n * Usage:\n * ```html\n * <jquery-table [config]=\"tableConfig\">\n * <ng-template jqtCellDef=\"monKey\" let-row>\n * <span>{{ row.monChamp }}</span>\n * </ng-template>\n * </jquery-table>\n * ```\n * Le contexte expose `$implicit` (ligne brute `T`) et `index` (index global).\n */\n@Directive({\n selector: '[jqtCellDef]',\n standalone: true,\n})\nexport class JqtCellDefDirective {\n /** Clé de la colonne à laquelle ce template s'applique. */\n @Input('jqtCellDef') columnKey: string = '';\n\n constructor(public readonly template: TemplateRef<{ $implicit: any; index: number }>) {}\n}\n","import { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component,\n ElementRef, EventEmitter, Input, OnChanges, OnInit, Output,\n SimpleChanges, ViewChild, inject\n} from '@angular/core';\nimport { SliceColumnDef, SliceConfig } from './slice-panel.model';\nimport { JqtI18n, JQT_I18N, JQT_I18N_DEFAULTS } from '../../jqt-i18n.token';\n\nconst EMPTY_CATEGORY_KEY = '__empty__';\nconst EMPTY_CATEGORY_LABEL = 'Vide';\n\n@Component({\n standalone: true,\n selector: 'slice-panel',\n imports: [CommonModule, MatIconModule],\n templateUrl: './slice-panel.component.html',\n styleUrls: ['./slice-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SlicePanelComponent<T = any> implements OnChanges, OnInit {\n\n @Input() sliceConfigs: SliceConfig<T>[] = [];\n @Input() columns: SliceColumnDef<T>[] = [];\n @Input() data: T[] = [];\n @Input() lazyData: Map<string, Map<any, any>> = new Map();\n @Input() lazyStatus: Map<string, 'idle' | 'loading' | 'loaded' | 'error'> = new Map();\n @Input() showToggle = true;\n @Input() showCounts = true;\n @Input() collapsedByDefault = false;\n @Input() alwaysShow = false;\n\n @Output() filterChange = new EventEmitter<(row: T) => boolean>();\n @Output() activeKeysChange = new EventEmitter<string[][]>();\n @Output() dynamicSliceKeysChange = new EventEmitter<string[]>();\n @Output() collapsedChange = new EventEmitter<boolean>();\n\n @ViewChild('slicePanelBody') slicePanelBodyRef?: ElementRef<HTMLElement>;\n\n private _cdr = inject(ChangeDetectorRef);\n private _i18nRaw = inject(JQT_I18N, { optional: true });\n readonly i18n: JqtI18n = { ...JQT_I18N_DEFAULTS, ...(this._i18nRaw ?? {}) };\n\n isCollapsed = false;\n activeKeysBySlice: Map<number, Set<string>> = new Map();\n private _expandedSlices = new Set<number>();\n _dynamicSlices: Array<{ key: string; slice: SliceConfig<T> }> = [];\n\n // ── Cache\n _cachedSlices: SliceConfig<T>[] = [];\n private _countCache = new Map<string, number>();\n\n readonly trackBySliceIndex = (index: number, _: any): number => index;\n readonly trackByCategoryKey = (_: number, cat: any): string => cat.key;\n\n // ── Lifecycle\n\n ngOnInit(): void {\n this.isCollapsed = this.collapsedByDefault;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['sliceConfigs'] || changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']) {\n this._refreshDynamicSlices();\n this._rebuildCache();\n const shouldReemitFilter = !!(changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']);\n const hasActiveFilters = [...this.activeKeysBySlice.values()].some(s => s.size > 0);\n if (hasActiveFilters && shouldReemitFilter) {\n this._emitFilter();\n }\n this._cdr.markForCheck();\n }\n }\n\n // ── Computed\n\n get showPanel(): boolean {\n const hasCfg = (this.sliceConfigs || []).length > 0 || this._dynamicSlices.length > 0;\n if (this.alwaysShow) return hasCfg;\n return hasCfg && (this.data?.length ?? 0) > 0;\n }\n\n get slices(): SliceConfig<T>[] {\n return this._cachedSlices;\n }\n\n get staticSliceCount(): number {\n return (this.sliceConfigs || []).length;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string }> {\n return (this.sliceConfigs || [])\n .filter((s) => !!s.columnKey)\n .map((s) => ({ key: s.columnKey!, title: s.title || s.columnKey! }));\n }\n\n get activeDynamicSliceColumns(): SliceColumnDef<T>[] {\n return this._dynamicSlices\n .map((d) => (this.columns || []).find((c) => c.key === d.key))\n .filter((c): c is SliceColumnDef<T> => !!c);\n }\n\n get availableColumnsForDynamicSlice(): SliceColumnDef<T>[] {\n const dynamicKeys = new Set(this._dynamicSlices.map((d) => d.key));\n const staticKeys = new Set(\n (this.sliceConfigs || []).map((s) => s.columnKey).filter((k): k is string => !!k)\n );\n const existingKeys = new Set([...dynamicKeys, ...staticKeys]);\n const seen = new Set<string>();\n return (this.columns || []).filter((c) => {\n if (existingKeys.has(c.key) || seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n }\n\n get activeSliceByLabel(): string {\n const staticActiveCount = (this.sliceConfigs || []).length;\n const total = staticActiveCount + this._dynamicSlices.length;\n if (total === 0) return 'Aucun';\n if (total === 1) {\n const first = (this.sliceConfigs || [])[0];\n if (first) return first.title || first.columnKey || '1';\n return this.activeDynamicSliceColumns[0]?.header || '1';\n }\n return `${total} actifs`;\n }\n\n // ── UI state\n\n isSliceCollapsed(sliceIndex: number): boolean {\n if (this._cachedSlices.length === 1) {\n return this._expandedSlices.has(-1 - sliceIndex);\n }\n return !this._expandedSlices.has(sliceIndex);\n }\n\n toggleSliceCollapse(sliceIndex: number): void {\n if (this.slices.length === 1) {\n const closedKey = -1 - sliceIndex;\n if (this._expandedSlices.has(closedKey)) {\n this._expandedSlices.delete(closedKey);\n } else {\n this._expandedSlices.add(closedKey);\n this._scrollSliceTitleIntoView(sliceIndex);\n }\n } else {\n if (this._expandedSlices.has(sliceIndex)) {\n this._expandedSlices.delete(sliceIndex);\n } else {\n this._expandedSlices.clear();\n this._expandedSlices.add(sliceIndex);\n this._scrollSliceTitleIntoView(sliceIndex);\n }\n }\n this._cdr.markForCheck();\n }\n\n togglePanel(): void {\n this.isCollapsed = !this.isCollapsed;\n this.collapsedChange.emit(this.isCollapsed);\n this._cdr.markForCheck();\n }\n\n isSliceDynamic(sliceIndex: number): boolean {\n return sliceIndex >= this.staticSliceCount;\n }\n\n isSliceLoading(sliceIndex: number): boolean {\n const staticSlice = (this.sliceConfigs || [])[sliceIndex];\n if (staticSlice?.columnKey) {\n const colDef = (this.columns || []).find(c => c.key === staticSlice.columnKey);\n if (colDef?.lazy) {\n const status = this.lazyStatus.get(staticSlice.columnKey!) ?? 'idle';\n return status === 'loading' || status === 'idle';\n }\n return false;\n }\n const key = this._getDynamicSliceColumnKey(sliceIndex);\n if (!key) return false;\n const colDef = (this.columns || []).find(c => c.key === key);\n if (!colDef?.lazy) return false;\n const status = this.lazyStatus.get(key) ?? 'idle';\n return status === 'loading' || status === 'idle';\n }\n\n isStaticSliceVisible(_columnKey: string): boolean {\n return true;\n }\n\n toggleStaticSlice(_columnKey: string): void {\n // Délégué à table.component via _staticSliceHiddenKeys — ne rien faire ici.\n }\n\n // ── Selection\n getSliceIcon(slice: SliceConfig<T>): string | undefined {\n if (slice.icon) return slice.icon;\n if (slice.columnKey) {\n return (this.columns || []).find(c => c.key === slice.columnKey)?.icon;\n }\n return undefined;\n }\n isSliceCategoryActive(sliceIndex: number, categoryKey: string): boolean {\n return this.activeKeysBySlice.get(sliceIndex)?.has(categoryKey) ?? false;\n }\n\n isSliceAllActive(sliceIndex: number): boolean {\n return !this.activeKeysBySlice.has(sliceIndex) || this.activeKeysBySlice.get(sliceIndex)!.size === 0;\n }\n\n sliceCategoryCount(sliceIndex: number, categoryKey: string): number {\n const cacheKey = `${sliceIndex}:${categoryKey}`;\n if (this._countCache.has(cacheKey)) {\n return this._countCache.get(cacheKey)!;\n }\n const slice = this._cachedSlices[sliceIndex];\n if (!slice) return 0;\n const category = (slice.categories || []).find((c) => c.key === categoryKey);\n const count = category ? (this.data || []).filter((row) => category.filter(row)).length : 0;\n this._countCache.set(cacheKey, count);\n return count;\n }\n\n isSliceEmpty(sliceIndex: number): boolean {\n const slice = this._cachedSlices[sliceIndex];\n if (!slice) return true;\n return (slice.categories || []).every(c => this.sliceCategoryCount(sliceIndex, c.key) === 0);\n }\n\n onSliceCategorySelected(sliceIndex: number, categoryKey: string): void {\n const slice = this.slices[sliceIndex];\n if (!slice) return;\n if (!this.activeKeysBySlice.has(sliceIndex)) {\n this.activeKeysBySlice.set(sliceIndex, new Set());\n }\n const activeKeys = this.activeKeysBySlice.get(sliceIndex)!;\n if (slice.multiSelect === false) {\n if (activeKeys.has(categoryKey)) {\n activeKeys.clear();\n } else {\n activeKeys.clear();\n activeKeys.add(categoryKey);\n }\n } else {\n if (activeKeys.has(categoryKey)) {\n activeKeys.delete(categoryKey);\n } else {\n activeKeys.add(categoryKey);\n }\n }\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n onSliceAllSelected(sliceIndex: number): void {\n if (this.activeKeysBySlice.has(sliceIndex)) {\n this.activeKeysBySlice.get(sliceIndex)!.clear();\n }\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n /** Retourne l'état des filtres actifs sous forme sérialisable (sliceIndex → tableau de clés).\n * Inclut les slices sans sélection (tableau vide) pour distinguer \"aucune tranche sélectionnée\"\n * (= filtre ouvert, rien coché) de \"slice absente\". */\n getActiveFilters(): Record<number, string[]> {\n const result: Record<number, string[]> = {};\n this._cachedSlices.forEach((_, idx) => {\n const keys = this.activeKeysBySlice.get(idx);\n result[idx] = keys ? [...keys] : [];\n });\n return result;\n }\n\n /** Restaure les filtres actifs depuis un snapshot sérialisé et réémet le filtre. */\n restoreFilters(filters: Record<number, string[]>): void {\n this.activeKeysBySlice = new Map(\n Object.entries(filters).map(([idx, keys]) => [Number(idx), new Set(keys)])\n );\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n // ── Dynamic slice management\n\n addDynamicSlice(column: SliceColumnDef<T>): void {\n const distinctValues = this._computeDistinctValues(column.key);\n const newSlice: SliceConfig<T> = {\n title: column.header,\n columnKey: column.key,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(column.key, v)),\n };\n this._dynamicSlices = [...this._dynamicSlices, { key: column.key, slice: newSlice }];\n this._rebuildCache();\n this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n removeDynamicSlice(sliceIndex: number): void {\n const dynamicIndex = sliceIndex - this.staticSliceCount;\n if (dynamicIndex < 0) return;\n const newActiveKeys = new Map<number, Set<string>>();\n this.activeKeysBySlice.forEach((keys, idx) => {\n if (idx < sliceIndex) newActiveKeys.set(idx, keys);\n else if (idx > sliceIndex) newActiveKeys.set(idx - 1, keys);\n });\n this.activeKeysBySlice = newActiveKeys;\n this._dynamicSlices = this._dynamicSlices.filter((_, i) => i !== dynamicIndex);\n this._rebuildCache();\n this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));\n this._emitFilter();\n this._cdr.markForCheck();\n }\n\n removeDynamicSliceByKey(key: string): void {\n const dynamicIndex = this._dynamicSlices.findIndex((d) => d.key === key);\n if (dynamicIndex < 0) return;\n const sliceIndex = this.staticSliceCount + dynamicIndex;\n this.removeDynamicSlice(sliceIndex);\n }\n\n // ── Private helpers\n\n private _emitFilter(): void {\n const slices = this.slices;\n const activeKeysBySlice = this.activeKeysBySlice;\n\n this.activeKeysChange.emit(\n slices.map((_, i) => {\n const keys = activeKeysBySlice.get(i);\n return keys ? [...keys] : [];\n })\n );\n\n const pred = (row: T): boolean =>\n slices.every((slice, sliceIndex) => {\n const activeKeys = activeKeysBySlice.get(sliceIndex);\n if (!activeKeys || activeKeys.size === 0) return true;\n return [...activeKeys].some((key) => {\n const category = (slice.categories || []).find((c) => c.key === key);\n if (!category) return false;\n // Si pas de filter défini (usage chart), on ne filtre pas en mémoire\n if (!category?.filter) return true;\n return category.filter(row);\n });\n });\n this.filterChange.emit(pred);\n }\n\n private _getDynamicSliceColumnKey(sliceIndex: number): string | null {\n const dynamicIndex = sliceIndex - this.staticSliceCount;\n return this._dynamicSlices[dynamicIndex]?.key ?? null;\n }\n\n private _getSliceIdentity(slice: SliceConfig<T>, fallbackIndex: number): string {\n if (slice.columnKey) {\n return `column:${slice.columnKey}`;\n }\n if (slice.title) {\n return `title:${slice.title}`;\n }\n const categoryKeys = (slice.categories || []).map((category) => category.key).join('|');\n return `index:${fallbackIndex}|categories:${categoryKeys}`;\n }\n\n private _materializeSlice(slice: SliceConfig<T>): SliceConfig<T> {\n if (!slice.columnKey || (slice.categories && slice.categories.length > 0)) {\n return slice;\n }\n const col = (this.columns || []).find(c => c.key === slice.columnKey);\n const isLazy = !!col?.lazy;\n if (isLazy && this.lazyStatus.get(slice.columnKey!) !== 'loaded') {\n return { ...slice, categories: [] };\n }\n if (slice.bucket) {\n const distinctValues = [...new Set((this.data || []).map(slice.bucket))].sort();\n return {\n ...slice,\n categories: distinctValues.map((v) => ({\n key: v,\n label: v,\n filter: (row: T) => slice.bucket!(row) === v,\n })),\n };\n }\n const distinctValues = this._computeDistinctValues(slice.columnKey!);\n return {\n ...slice,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(slice.columnKey!, v)),\n };\n }\n\n private _buildCategoryFromValue(columnKey: string, v: string): { key: string; label: string; filter: (row: T) => boolean } {\n if (v === EMPTY_CATEGORY_KEY) {\n return {\n key: EMPTY_CATEGORY_KEY,\n label: EMPTY_CATEGORY_LABEL,\n filter: (row: T) => {\n const val = this._getLazyAwareValue(columnKey, row);\n return val == null || val === '';\n },\n };\n }\n return {\n key: v,\n label: v,\n filter: (row: T) => String(this._getLazyAwareValue(columnKey, row) ?? '') === v,\n };\n }\n\n private _computeDistinctValues(columnKey: string): string[] {\n const rawValues = (this.data || []).map((row) => {\n const val = this._getLazyAwareValue(columnKey, row);\n return val != null && val !== '' ? String(val) : null;\n });\n const distinct = [...new Set(rawValues.filter((v): v is string => v !== null))].sort();\n if (rawValues.some(v => v === null)) {\n distinct.push(EMPTY_CATEGORY_KEY);\n }\n return distinct;\n }\n\n private _getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = (this.columns || []).find(c => c.key === columnKey);\n if (colDef?.lazy) {\n return this.lazyData.get(columnKey)?.get(row) ?? null;\n }\n if (colDef?.value) {\n return colDef.value(row, 0);\n }\n return (row as any)[columnKey];\n }\n\n private _rebuildCache(): void {\n const previousSlices = this._cachedSlices;\n const previousActiveKeys = this.activeKeysBySlice;\n const allSlices = [...(this.sliceConfigs || []), ...this._dynamicSlices.map((d) => d.slice)];\n this._cachedSlices = allSlices.map((slice) => this._materializeSlice(slice));\n\n const previousKeysByIdentity = new Map<string, Set<string>>();\n previousSlices.forEach((slice, index) => {\n const activeKeys = previousActiveKeys.get(index);\n if (!activeKeys || activeKeys.size === 0) return;\n previousKeysByIdentity.set(this._getSliceIdentity(slice, index), new Set(activeKeys));\n });\n\n const nextActiveKeys = new Map<number, Set<string>>();\n this._cachedSlices.forEach((slice, index) => {\n const previousKeys = previousKeysByIdentity.get(this._getSliceIdentity(slice, index));\n if (!previousKeys || previousKeys.size === 0) return;\n\n const availableKeys = new Set((slice.categories || []).map((category) => category.key));\n const matchingKeys = [...previousKeys].filter((key) => availableKeys.has(key));\n if (matchingKeys.length > 0) {\n nextActiveKeys.set(index, new Set(matchingKeys));\n }\n });\n\n this.activeKeysBySlice = nextActiveKeys;\n this._countCache.clear();\n }\n\n private _refreshDynamicSlices(): void {\n this._dynamicSlices = this._dynamicSlices.map(({ key, slice }) => {\n const distinctValues = this._computeDistinctValues(key);\n return {\n key,\n slice: {\n ...slice,\n categories: distinctValues.map((v) => this._buildCategoryFromValue(key, v)),\n },\n };\n });\n }\n\n private _scrollSliceTitleIntoView(sliceIndex: number): void {\n setTimeout(() => {\n const container = this.slicePanelBodyRef?.nativeElement;\n if (!container) return;\n const row = container.querySelector(`[data-slice-index=\"${sliceIndex}\"]`) as HTMLElement;\n if (!row) return;\n row.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 0);\n }\n}\n","<div class=\"slice-panel-wrapper\" [class.collapsed]=\"isCollapsed\">\n <aside class=\"slice-panel\" [class.collapsed]=\"isCollapsed\">\n <div class=\"slice-panel-header\">\n <span *ngIf=\"!isCollapsed\" class=\"slice-panel-title\">\n {{ i18n.filterPanelTitle(slices.length) }}\n </span>\n <button\n *ngIf=\"showToggle\"\n type=\"button\"\n class=\"slice-toggle\"\n [attr.aria-label]=\"isCollapsed ? i18n.expandFilterTitle : i18n.collapseFilterTitle\"\n (click)=\"togglePanel()\"\n >\n <mat-icon class=\"slice-toggle-mat-icon\">{{ isCollapsed ? 'filter_list' : 'filter_list_off' }}</mat-icon>\n </button>\n </div>\n\n <div class=\"slice-panel-body\" *ngIf=\"!isCollapsed\" #slicePanelBody>\n <ng-container *ngFor=\"let slice of slices; let si = index; trackBy: trackBySliceIndex\">\n <div class=\"slice-title-row\" [attr.data-slice-index]=\"si\" (click)=\"toggleSliceCollapse(si)\">\n <span class=\"slice-title-chevron\" [class.expanded]=\"!isSliceCollapsed(si)\">›</span>\n <mat-icon *ngIf=\"getSliceIcon(slice)\" class=\"slice-title-icon\">{{ getSliceIcon(slice) }}</mat-icon>\n <p class=\"slice-title\">{{ slice.title || i18n.filterBlockDefaultTitle }}</p>\n <button\n *ngIf=\"isSliceDynamic(si)\"\n type=\"button\"\n class=\"slice-remove-btn\"\n (click)=\"$event.stopPropagation(); removeDynamicSlice(si)\"\n >×</button>\n </div>\n\n <div class=\"slice-section-items\" *ngIf=\"!isSliceCollapsed(si)\">\n <ng-container *ngIf=\"isSliceLoading(si); else sliceContent\">\n <div class=\"slice-lazy-loading\">\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n </div>\n </ng-container>\n <ng-template #sliceContent>\n <ng-container *ngFor=\"let category of slice.categories; trackBy: trackByCategoryKey\">\n <button\n *ngIf=\"sliceCategoryCount(si, category.key) > 0\"\n class=\"slice-item\"\n type=\"button\"\n [class.active]=\"isSliceCategoryActive(si, category.key)\"\n [attr.data-category-key]=\"category.key\"\n [title]=\"category.label\"\n (click)=\"onSliceCategorySelected(si, category.key)\"\n >\n <span>{{ category.label }}</span>\n <span *ngIf=\"showCounts\">{{ sliceCategoryCount(si, category.key) }}</span>\n </button>\n </ng-container>\n <div *ngIf=\"isSliceEmpty(si)\" class=\"slice-empty-state\">{{ i18n.filterEmptyState }}</div>\n </ng-template>\n </div>\n\n <hr *ngIf=\"si < slices.length - 1\" class=\"slice-divider\" />\n </ng-container>\n </div>\n </aside>\n</div>\n","import { MatPaginatorIntl } from '@angular/material/paginator';\n\n/** Traductions françaises du paginator Material. */\nexport function getFrenchPaginatorIntl(): MatPaginatorIntl {\n const intl = new MatPaginatorIntl();\n intl.itemsPerPageLabel = 'Éléments par page :';\n intl.nextPageLabel = 'Page suivante';\n intl.previousPageLabel = 'Page précédente';\n intl.firstPageLabel = 'Première page';\n intl.lastPageLabel = 'Dernière page';\n intl.getRangeLabel = (page: number, pageSize: number, length: number) => {\n if (length === 0 || pageSize === 0) return `0 sur ${length}`;\n length = Math.max(length, 0);\n const start = page * pageSize;\n const end = start < length ? Math.min(start + pageSize, length) : start + pageSize;\n return `${start + 1} – ${end} sur ${length}`;\n };\n return intl;\n}\n\n/**\n * Convertit une valeur brute en chaîne affichable.\n * - null/undefined → ''\n * - Date → format locale fr-FR\n * - Tableau → valeurs jointes par ', '\n * - Objet avec label/name → sa valeur string\n * - Autres → String(value)\n */\nexport function normalizeCellValue(value: any): any {\n if (value === null || value === undefined) {\n return '';\n }\n if (value instanceof Date) {\n return value.toLocaleString();\n }\n if (Array.isArray(value)) {\n return value.map((item) => normalizeCellValue(item)).join(', ');\n }\n if (typeof value === 'object') {\n if ('label' in value && value.label !== undefined) {\n return String(value.label);\n }\n if ('name' in value && value.name !== undefined) {\n return String(value.name);\n }\n return JSON.stringify(value);\n }\n return value;\n}\n\n/**\n * Transforme une clé camelCase/snake_case en libellé lisible.\n * Ex: 'createdAt' → 'Created at', 'my_field' → 'My field'\n */\nexport function humanizeKey(key: string): string {\n return key\n .replaceAll(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replaceAll(/[_-]+/g, ' ')\n .replace(/^./, (value) => value.toUpperCase());\n}\n","import { Subject } from 'rxjs';\nimport { ViewEvent, ViewField, ViewState } from '@oneteme/jquery-core';\nimport { TableColumnProvider, TableViewConfig } from '../../jquery-table.model';\nimport { SliceConfig } from '../slice-panel/slice-panel.model';\nimport { humanizeKey } from '../table.utils';\n\nexport type { ViewField, ViewConfig, ViewState, ViewEvent } from '@oneteme/jquery-core';\nexport { viewField, groupableViewFields, sliceableViewFields, initialViewState } from '@oneteme/jquery-core';\n\n// ── Types internes\n\nexport interface ViewFieldState {\n activeColumns: TableColumnProvider<any>[];\n /** true si l'utilisateur a déjà personnalisé la sélection de colonnes */\n userCustomized: boolean;\n}\n\nexport interface ViewGroupByState {\n activeKey: string | null;\n userCustomized: boolean;\n}\n\nexport interface ViewSliceByState {\n activeDynamicColumns: TableColumnProvider<any>[];\n availableForDynamic: TableColumnProvider<any>[];\n allDynamicColumns: TableColumnProvider<any>[];\n activeLabel: string;\n}\n\nexport interface ViewPanelConfig {\n /** Config brute issue de TableProvider.view */\n config?: TableViewConfig;\n /** Toutes les colonnes résolues (non filtrées) */\n columns: TableColumnProvider<any>[];\n /** Slices statiques */\n sliceConfigs: SliceConfig<any>[];\n /** Label utilisé quand aucun groupe / aucune slice n’est actif. Défaut : 'Aucun'. */\n noneLabel?: string; /** Clé de colonne utilisée comme group-by par défaut au chargement. */\n defaultGroupBy?: string | null;}\n\n// ── Facade\n\n/**\n * Centralise l'état et les actions du panneau View (Champs / Group by / Slice by).\n * Pas de dépendance Angular/DOM : peut être extraite vers jquery-core à terme.\n *\n * Usage :\n * this._view = new ViewFacade();\n * this._view.events$.subscribe(e => { ... });\n * this._view.update({ config, columns, sliceConfigs });\n */\nexport class ViewFacade<T = any> {\n\n // ── State\n\n readonly fields: ViewFieldState = {\n activeColumns: [],\n userCustomized: false,\n };\n\n readonly groupBy: ViewGroupByState = {\n activeKey: null,\n userCustomized: false,\n };\n\n readonly sliceBy: ViewSliceByState = {\n activeDynamicColumns: [],\n availableForDynamic: [],\n allDynamicColumns: [],\n activeLabel: 'Aucun',\n };\n\n private _panelConfig: ViewPanelConfig = { columns: [], sliceConfigs: [] };\n private _hiddenStaticKeys = new Set<string>();\n\n // ── Events\n\n private readonly _events$ = new Subject<ViewEvent>();\n readonly events$ = this._events$.asObservable();\n\n // ── Computed flags\n\n get enabled(): boolean {\n return this._panelConfig.config?.enabled === true;\n }\n\n get showFields(): boolean {\n return this.enabled;\n }\n\n get showGroupBySection(): boolean {\n return this.enabled && this.groupByColumns.length > 0;\n }\n\n get showSliceBySection(): boolean {\n return this.enabled && (\n (this._panelConfig.sliceConfigs?.length ?? 0) > 0 ||\n this.sliceBy.allDynamicColumns.length > 0\n );\n }\n\n get allowColumnRemoval(): boolean {\n return this._panelConfig.config?.enableColumnRemoval !== false;\n }\n\n get isColumnDragDropEnabled(): boolean {\n return this._panelConfig.config?.enableColumnDragDrop === true;\n }\n\n get menuBaseColumns(): TableColumnProvider<T>[] {\n return this._uniqueByKey((this._panelConfig.columns || []).filter(c => !c.optional));\n }\n\n get menuOptionalColumns(): TableColumnProvider<T>[] {\n return this._uniqueByKey((this._panelConfig.columns || []).filter(c => c.optional));\n }\n\n get totalColumnCount(): number {\n return new Set((this._panelConfig.columns || []).map(c => c.key)).size;\n }\n\n get groupByColumns(): TableColumnProvider<T>[] {\n const seen = new Set<string>();\n return (this._panelConfig.columns || []).filter(c => {\n if (c.groupable === false || seen.has(c.key)) return false;\n if (!c.header && c.groupable !== true) return false;\n seen.add(c.key);\n return true;\n });\n }\n\n get activeGroupByLabel(): string {\n if (!this.groupBy.activeKey) return this._panelConfig.noneLabel ?? 'Aucun';\n const col = this.groupByColumns.find(c => c.key === this.groupBy.activeKey);\n return col?.header || this.groupBy.activeKey;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> {\n return (this._panelConfig.sliceConfigs ?? [])\n .filter(s => !!s.columnKey)\n .map(s => {\n const colIcon = (this._panelConfig.columns ?? []).find(c => c.key === s.columnKey)?.icon;\n return { key: s.columnKey!, title: s.title || humanizeKey(s.columnKey!), icon: s.icon ?? colIcon };\n });\n }\n\n colLabel(col: { key: string; header?: string }): string {\n return col.header || humanizeKey(col.key);\n }\n\n // ── Mise à jour de la config (appelée depuis refreshViewModel)\n\n update(panelConfig: ViewPanelConfig): void {\n this._panelConfig = panelConfig;\n this._refreshDefaultColumns();\n this._refreshDynamicSliceMeta();\n if (!this.groupBy.userCustomized) {\n this.groupBy.activeKey = panelConfig.defaultGroupBy ?? null;\n }\n }\n\n // ── Actions Fields\n\n setActiveColumns(columns: TableColumnProvider<T>[]): void {\n this.fields.activeColumns = columns;\n this.fields.userCustomized = true;\n }\n\n setUserCustomized(value: boolean): void {\n this.fields.userCustomized = value;\n }\n\n /** Remet la vue dans son état initial : colonnes par défaut, groupBy par défaut, pas de dynamic slices. */\n resetToDefaults(): void {\n this.fields.userCustomized = false;\n this.groupBy.userCustomized = false;\n this._refreshDefaultColumns();\n this.groupBy.activeKey = this._panelConfig.defaultGroupBy ?? null;\n this.sliceBy.activeDynamicColumns = [];\n this._refreshDynamicSliceMeta();\n }\n\n addColumn(column: TableColumnProvider<T>): void {\n const configCols = this._panelConfig.columns ?? [];\n const configIndex = configCols.findIndex(c => c.key === column.key);\n if (configIndex === -1) {\n this.fields.activeColumns = [...this.fields.activeColumns, column];\n } else {\n const insertBefore = this.fields.activeColumns.findIndex(c => {\n const ci = configCols.findIndex(cc => cc.key === c.key);\n return ci !== -1 && ci > configIndex;\n });\n if (insertBefore === -1) {\n this.fields.activeColumns = [...this.fields.activeColumns, column];\n } else {\n const copy = [...this.fields.activeColumns];\n copy.splice(insertBefore, 0, column);\n this.fields.activeColumns = copy;\n }\n }\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeColumns.map(c => c.key) });\n }\n\n removeColumn(columnKey: string): boolean {\n const col = this.fields.activeColumns.find(c => c.key === columnKey);\n if (!col) return false;\n if (!col.optional && !this.allowColumnRemoval) return false;\n if (this.fields.activeColumns.length <= 1) return false;\n this.fields.activeColumns = this.fields.activeColumns.filter(c => c.key !== columnKey);\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeColumns.map(c => c.key) });\n return true;\n }\n\n toggleColumnVisibility(column: TableColumnProvider<T>, visible: boolean): void {\n const isVisible = this.isColumnVisible(column.key);\n if (visible && !isVisible) {\n this.addColumn(column);\n } else if (!visible && isVisible) {\n this.removeColumn(column.key);\n }\n }\n\n reorderColumns(fromKey: string, toKey: string): boolean {\n const prev = this.fields.activeColumns.findIndex(c => c.key === fromKey);\n const curr = this.fields.activeColumns.findIndex(c => c.key === toKey);\n if (prev === -1 || curr === -1 || prev === curr) return false;\n const reordered = [...this.fields.activeColumns];\n const [moved] = reordered.splice(prev, 1);\n reordered.splice(curr, 0, moved);\n this.fields.activeColumns = reordered;\n this.fields.userCustomized = true;\n this._events$.next({ type: 'fieldsChanged', fieldIds: this.fields.activeColumns.map(c => c.key) });\n return true;\n }\n\n isColumnVisible(key: string): boolean {\n return this.fields.activeColumns.some(c => c.key === key);\n }\n\n // ── Actions Group by\n\n setGroupBy(key: string | null): void {\n this.groupBy.activeKey = key;\n this.groupBy.userCustomized = true;\n this._events$.next({ type: 'groupByChanged', key });\n }\n\n // ── Actions Slice by (dynamique)\n\n /** Appelée quand le SlicePanelComponent émet dynamicSliceKeysChange */\n onDynamicSliceKeysChange(keys: string[]): void {\n const allCols = this._panelConfig.columns ?? [];\n const staticKeys = new Set(\n (this._panelConfig.sliceConfigs ?? []).map(s => s.columnKey).filter((k): k is string => !!k)\n );\n const dynamicKeySet = new Set(keys);\n const existingKeys = new Set([...staticKeys, ...dynamicKeySet]);\n\n this.sliceBy.activeDynamicColumns = keys\n .map(k => allCols.find(c => c.key === k))\n .filter((c): c is TableColumnProvider<T> => !!c);\n\n const seen = new Set<string>();\n this.sliceBy.availableForDynamic = allCols.filter(c => {\n if (c.sliceable === false || existingKeys.has(c.key) || seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n\n this._computeSliceLabel();\n this._events$.next({ type: 'dynamicSlicesChanged', keys });\n }\n\n isDynamicSliceActive(key: string): boolean {\n return this.sliceBy.activeDynamicColumns.some(c => c.key === key);\n }\n\n // ── Contrat core\n\n /** Retourne un snapshot ViewState (contrat core) de l'état courant. */\n toViewState(): ViewState {\n return {\n selectedFieldIds: this.fields.activeColumns.map(c => c.key),\n groupByKey: this.groupBy.activeKey,\n dynamicSliceKeys: this.sliceBy.activeDynamicColumns.map(c => c.key),\n };\n }\n\n /** Convertit une TableColumnProvider en ViewField (contrat core). */\n static toViewField(col: TableColumnProvider<any>): ViewField {\n return {\n id: col.key,\n label: col.header,\n icon: col.icon,\n groupable: col.groupable,\n sliceable: col.sliceable,\n optional: col.optional,\n };\n }\n\n // ── Destructor\n\n destroy(): void {\n this._events$.complete();\n }\n\n // ── Helpers privés\n\n private _refreshDefaultColumns(): void {\n const defaultCols = (this._panelConfig.columns || []).filter(c => !c.optional);\n if (!this.fields.userCustomized || this.fields.activeColumns.length === 0) {\n this.fields.activeColumns = [...defaultCols];\n } else {\n const allowedKeys = new Set((this._panelConfig.columns || []).map(c => c.key));\n this.fields.activeColumns = this.fields.activeColumns.filter(c => allowedKeys.has(c.key));\n }\n }\n\n private _refreshDynamicSliceMeta(): void {\n const allCols = this._panelConfig.columns ?? [];\n const staticKeys = new Set(\n (this._panelConfig.sliceConfigs ?? []).map(s => s.columnKey).filter((k): k is string => !!k)\n );\n const activeDynKeys = new Set(this.sliceBy.activeDynamicColumns.map(c => c.key));\n\n const seen1 = new Set<string>();\n this.sliceBy.availableForDynamic = allCols.filter(c => {\n if (c.sliceable === false || staticKeys.has(c.key) || activeDynKeys.has(c.key) || seen1.has(c.key)) return false;\n if (!c.header && c.sliceable !== true) return false;\n seen1.add(c.key);\n return true;\n });\n\n const seen2 = new Set<string>();\n this.sliceBy.allDynamicColumns = allCols.filter(c => {\n if (c.sliceable === false || staticKeys.has(c.key) || seen2.has(c.key)) return false;\n if (!c.header && c.sliceable !== true) return false;\n seen2.add(c.key);\n return true;\n });\n\n this._computeSliceLabel();\n }\n\n /** Notifie la facade des slices statiques actuellement cachées (géré par table.component).\n * Recalcule le label slice afin qu'il reflète uniquement les slices visibles. */\n updateHiddenStaticKeys(keys: Set<string>): void {\n this._hiddenStaticKeys = keys;\n this._computeSliceLabel();\n }\n\n private _computeSliceLabel(): void {\n const visibleStatics = (this._panelConfig.sliceConfigs ?? []).filter(\n s => !s.columnKey || !this._hiddenStaticKeys.has(s.columnKey)\n );\n const visibleStaticCount = visibleStatics.length;\n const total = visibleStaticCount + this.sliceBy.activeDynamicColumns.length;\n if (total === 0) { this.sliceBy.activeLabel = this._panelConfig.noneLabel ?? 'Aucun'; return; }\n if (total === 1) {\n if (visibleStaticCount === 1) {\n const first = visibleStatics[0];\n this.sliceBy.activeLabel = first?.title || first?.columnKey || '1';\n return;\n }\n this.sliceBy.activeLabel = this.sliceBy.activeDynamicColumns[0]?.header || '1';\n return;\n }\n this.sliceBy.activeLabel = `${total} actifs`;\n }\n\n private _uniqueByKey(cols: TableColumnProvider<T>[]): TableColumnProvider<T>[] {\n const seen = new Set<string>();\n return cols.filter(c => {\n if (seen.has(c.key)) return false;\n seen.add(c.key);\n return true;\n });\n }\n}\n","/**\n * Constantes sentinel utilisées pour les identifiants de colonnes et les valeurs\n * projetées dans le datasource interne de la table.\n *\n * Centraliser ici évite les typos silencieuses et facilite les tests unitaires.\n */\n\n/** Identifiant de la colonne virtuelle rendue sur toute la largeur pour les en-têtes de groupe. */\nexport const GROUP_ROW_COLUMN = '__group_row';\n\n/** Marqueur posé sur les objets de ligne pour signaler une ligne d'en-tête de groupe. */\nexport const GROUP_HEADER_MARKER = '__groupHeader';\n\n/** Clé du groupe spéciale « chargement lazy en cours ». */\nexport const GROUP_KEY_LAZY_LOADING = '__lazy_loading__';\n\n/** Clé du groupe spéciale « trop de groupes ». */\nexport const GROUP_KEY_TOO_MANY = '__too_many_groups__';\n\n/** Propriété injectée dans chaque ligne projetée : référence vers la ligne brute d'origine. */\nexport const ROW_RAW_KEY = '__raw';\n\n/** Propriété injectée dans chaque ligne projetée : index global de la ligne dans le jeu de données filtré. */\nexport const ROW_INDEX_KEY = '__index';\n\n/** Propriété injectée dans chaque ligne projetée : clé du groupe auquel appartient la ligne d'en-tête. */\nexport const ROW_GROUP_KEY = '__groupKey';\n\n/** Propriété injectée dans chaque ligne projetée : nombre de lignes dans le groupe. */\nexport const ROW_GROUP_COUNT = '__groupCount';\n\n/** Propriété injectée dans chaque ligne projetée : page courante du groupe. */\nexport const ROW_GROUP_PAGE = '__groupPage';\n\n/** Propriété injectée dans chaque ligne projetée : nombre de pages du groupe. */\nexport const ROW_GROUP_PAGE_COUNT = '__groupPageCount';\n\n/** Valeur sentinelle posée dans une cellule lazy en cours de chargement. */\nexport const LAZY_LOADING_VALUE = '__lazy_loading__';\n\n/** Valeur sentinelle posée dans une cellule lazy en erreur. */\nexport const LAZY_ERROR_VALUE = '__lazy_error__';\n","import { Subject, take, takeUntil } from 'rxjs';\nimport { TableColumnProvider } from '../jquery-table.model';\nimport { LAZY_LOADING_VALUE, LAZY_ERROR_VALUE } from './table.constants';\n\nexport interface LazyCallbacks {\n onRefresh(): void;\n onMarkForCheck(): void;\n}\n\n/**\n * Gère le cycle de vie des colonnes à chargement différé (lazy) :\n * statuts, données, annulation des requêtes en cours.\n *\n * Pas de dépendance Angular/DOM — peut être instancié manuellement dans le composant.\n */\nexport class LazyColumnManager<T = any> {\n\n private _status = new Map<string, 'idle' | 'loading' | 'loaded' | 'error'>();\n private _data = new Map<string, Map<any, any>>();\n private _cancels = new Map<string, Subject<void>>();\n\n get status(): Map<string, 'idle' | 'loading' | 'loaded' | 'error'> {\n return this._status;\n }\n\n get data(): Map<string, Map<any, any>> {\n return this._data;\n }\n\n getStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error' {\n return this._status.get(key) ?? 'idle';\n }\n\n getRenderType(rowValue: any): 'loading' | 'error' | 'value' {\n if (rowValue === LAZY_LOADING_VALUE) return 'loading';\n if (rowValue === LAZY_ERROR_VALUE) return 'error';\n return 'value';\n }\n\n /** Annule tous les fetches en cours et réinitialise l'état (appeler lors d'un changement de données). */\n cancelAll(): void {\n this._cancels.forEach(s => { s.next(); s.complete(); });\n this._cancels.clear();\n this._status = new Map();\n this._data = new Map();\n }\n\n /** Réinitialise une colonne et relance son fetch. */\n retry(column: TableColumnProvider<T>, resolvedData: T[], callbacks: LazyCallbacks): void {\n const k = column.key;\n const prev = this._cancels.get(k);\n if (prev) { prev.next(); prev.complete(); }\n this._cancels.delete(k);\n\n const newStatus = new Map(this._status);\n newStatus.delete(k);\n this._status = newStatus;\n\n const newData = new Map(this._data);\n newData.delete(k);\n this._data = newData;\n\n this.fetch(column, resolvedData, callbacks);\n }\n\n /** Lance le chargement différé d'une colonne. No-op si déjà en cours. */\n fetch(column: TableColumnProvider<T>, resolvedData: T[], callbacks: LazyCallbacks): void {\n if (!column.lazy) return;\n const k = column.key;\n if (this._status.get(k) === 'loading') return;\n\n const prev = this._cancels.get(k);\n if (prev) { prev.next(); prev.complete(); }\n const cancel$ = new Subject<void>();\n this._cancels.set(k, cancel$);\n\n const newStatus = new Map(this._status);\n newStatus.set(k, 'loading');\n this._status = newStatus;\n callbacks.onRefresh();\n\n column.lazy.fetchFn().pipe(\n take(1),\n takeUntil(cancel$),\n ).subscribe({\n next: (values: any[]) => {\n const rowMap = new Map<any, any>();\n values.forEach((value, i) => {\n if (i < resolvedData.length) rowMap.set(resolvedData[i], value);\n });\n const newData = new Map(this._data);\n newData.set(k, rowMap);\n this._data = newData;\n\n const newStatus2 = new Map(this._status);\n newStatus2.set(k, 'loaded');\n this._status = newStatus2;\n\n callbacks.onRefresh();\n callbacks.onMarkForCheck();\n },\n error: () => {\n const newStatusErr = new Map(this._status);\n newStatusErr.set(k, 'error');\n this._status = newStatusErr;\n\n callbacks.onRefresh();\n callbacks.onMarkForCheck();\n },\n });\n }\n}\n","import { SavedTableConfig } from '../jquery-table.model';\n\nconst STORAGE_PREFIX = 'jqt_prefs_';\n\n/**\n * Gère la persistance de la configuration d'un tableau dans le localStorage.\n * Identifie chaque tableau par un `tableId` unique fourni par l'utilisateur.\n */\nexport class TablePreferencesManager {\n readonly key: string;\n\n constructor(tableId: string) {\n this.key = STORAGE_PREFIX + tableId;\n }\n\n /** Retourne la configuration sauvegardée, ou `null` si absente / corrompue. */\n load(): SavedTableConfig | null {\n try {\n const raw = localStorage.getItem(this.key);\n return raw ? (JSON.parse(raw) as SavedTableConfig) : null;\n } catch {\n return null;\n }\n }\n\n /** Persiste la configuration dans le localStorage. */\n save(config: SavedTableConfig): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(config));\n } catch {\n // localStorage peut être indisponible (mode privé strict, quota dépassé…)\n }\n }\n\n /** Supprime la configuration sauvegardée. */\n clear(): void {\n localStorage.removeItem(this.key);\n }\n\n /** Indique si une configuration est actuellement sauvegardée. */\n hasSaved(): boolean {\n return localStorage.getItem(this.key) !== null;\n }\n}\n","/**\n * GroupByManager\n *\n * Encapsule tout l'état et la logique liés au mode Group By :\n * - état collapsed / expanded des groupes\n * - pagination interne par groupe\n * - tri des groupes (asc / desc)\n * - scroll vers un groupe\n *\n * Le composant TableComponent l'instancie et lui passe deux callbacks :\n * - `onNeedProjection` : demande une reprojection légère de la page courante\n * - `onNeedRender` : demande un rebuild complet (tri changé etc.)\n */\nexport class GroupByManager {\n /** Groupes actuellement ouverts (mode default-collapsed) ou fermés (mode default-expanded). */\n private readonly _collapsedGroups = new Set<string>();\n\n /** Page courante par clé de groupe. */\n private readonly _groupPages = new Map<string, number>();\n\n /** Taille de page pour la pagination interne des groupes. */\n groupPageSize = 5;\n\n /** Ordre de tri des groupes ('asc' | 'desc'). */\n groupSortOrder: 'asc' | 'desc' = 'asc';\n\n /**\n * Quand `true`, tous les groupes sont collapsés par défaut.\n * `_collapsedGroups` contient alors le seul groupe ouvert.\n */\n private _defaultGroupCollapsed = false;\n\n constructor(\n private readonly onNeedProjection: () => void,\n private readonly onNeedRender: () => void,\n ) {}\n\n // ── API publique\n\n /** Initialise le mode par défaut selon qu'un groupBy vient d'être activé. */\n setDefaultCollapsed(collapsed: boolean): void {\n this._defaultGroupCollapsed = collapsed;\n }\n\n /** Réinitialise l'état (à appeler quand le groupBy change de colonne). */\n reset(): void {\n this._collapsedGroups.clear();\n this._groupPages.clear();\n }\n\n isGroupCollapsed(groupKey: string): boolean {\n return this._defaultGroupCollapsed\n ? !this._collapsedGroups.has(groupKey)\n : this._collapsedGroups.has(groupKey);\n }\n\n toggleGroupCollapse(groupKey: string, scrollTo: (key: string) => void): void {\n if (this._collapsedGroups.has(groupKey)) {\n this._collapsedGroups.delete(groupKey);\n } else {\n this._collapsedGroups.clear();\n this._collapsedGroups.add(groupKey);\n scrollTo(groupKey);\n }\n this.onNeedProjection();\n }\n\n /** Retourne le groupe actuellement ouvert (seulement en mode default-collapsed avec exactement 1 ouvert). */\n getSingleOpenGroup(): string | null {\n return this._defaultGroupCollapsed && this._collapsedGroups.size === 1\n ? [...this._collapsedGroups][0]\n : null;\n }\n\n // ── Pagination par groupe\n\n getPage(groupKey: string): number {\n return this._groupPages.get(groupKey) ?? 0;\n }\n\n groupPageBack(groupKey: string): void {\n const current = this._groupPages.get(groupKey) ?? 0;\n if (current > 0) {\n this._groupPages.set(groupKey, current - 1);\n this.onNeedProjection();\n }\n }\n\n groupPageForward(groupKey: string, totalCount: number): void {\n const maxPage = Math.ceil(totalCount / this.groupPageSize) - 1;\n const current = this._groupPages.get(groupKey) ?? 0;\n if (current < maxPage) {\n this._groupPages.set(groupKey, current + 1);\n this.onNeedProjection();\n }\n }\n\n onGroupPageSizeChange(size: number): void {\n this.groupPageSize = size;\n this._groupPages.clear();\n this.onNeedRender();\n }\n\n onGroupSortToggle(dir: 'asc' | 'desc', scrollTo: (key: string) => void): void {\n if (this.groupSortOrder === dir) return;\n this.groupSortOrder = dir;\n this._groupPages.clear();\n this.onNeedRender();\n const openGroup = this.getSingleOpenGroup();\n if (openGroup) scrollTo(openGroup);\n }\n}\n","import { TableColumnProvider, TableExportConfig } from '../jquery-table.model';\n\n/**\n * ExportManager\n *\n * Encapsule l'export CSV : construction du fichier BOM/UTF-8, échappement et déclenchement du téléchargement.\n * Aucune dépendance Angular — indépendant du cycle de vie du composant.\n */\nexport class ExportManager<T> {\n constructor(\n private readonly getRows: () => T[],\n private readonly getColumns: () => TableColumnProvider<T>[],\n private readonly getConfig: () => TableExportConfig<T> | undefined,\n private readonly resolveCellValue: (col: TableColumnProvider<T>, row: T, index: number) => any,\n ) {}\n\n export(): void {\n const cfg = this.getConfig();\n if (!cfg?.enabled) return;\n const rows = this.getRows();\n const columns = this.getColumns();\n const filename = (cfg.filename || 'export') + '.csv';\n\n const header = columns.map(c => this._csvEscape(c.header || c.key)).join(',');\n const lines = rows.map((row, idx) => {\n if (cfg.transform) {\n const t = cfg.transform(row);\n return columns.map(c => this._csvEscape(String(t[c.key] ?? ''))).join(',');\n }\n return columns.map(c => this._csvEscape(String(this.resolveCellValue(c, row, idx) ?? ''))).join(',');\n });\n\n // BOM UTF-8 pour une ouverture correcte sous Excel\n const blob = new Blob(['\\uFEFF' + [header, ...lines].join('\\n')], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename.endsWith('.csv') ? filename : filename + '.csv';\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private _csvEscape(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return '\"' + value.replace(/\"/g, '\"\"') + '\"';\n }\n return value;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterContentInit, AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, inject, Input, NgZone, OnChanges, OnDestroy, Output, QueryList, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSort, MatSortModule } from '@angular/material/sort';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { Subject, takeUntil } from 'rxjs';\nimport { TableColumnProvider, TableExportConfig, TablePreferencesConfig, TableProvider, TableViewConfig } from '../jquery-table.model';\nimport { JqtI18n, JQT_I18N, JQT_I18N_DEFAULTS } from '../jqt-i18n.token';\nimport { JqtCellDefDirective } from '../directive/jqt-cell-def.directive';\nimport { SliceConfig } from './slice-panel/slice-panel.model';\nimport { SlicePanelComponent } from './slice-panel/slice-panel.component';\nimport { getFrenchPaginatorIntl, humanizeKey, normalizeCellValue } from './table.utils';\nimport { ViewFacade } from './view/view.facade';\nimport { LazyColumnManager } from './lazy-column-manager';\nimport { TablePreferencesManager } from './table-preferences.manager';\nimport { GroupByManager } from './group-by.manager';\nimport { ExportManager } from './export.manager';\nimport {\n GROUP_ROW_COLUMN, GROUP_HEADER_MARKER,\n GROUP_KEY_LAZY_LOADING, GROUP_KEY_TOO_MANY,\n ROW_RAW_KEY, ROW_INDEX_KEY,\n ROW_GROUP_KEY, ROW_GROUP_COUNT, ROW_GROUP_PAGE, ROW_GROUP_PAGE_COUNT,\n LAZY_LOADING_VALUE, LAZY_ERROR_VALUE,\n} from './table.constants';\n\n/** Cache interne du groupement — invalidé dès que les données, la clé ou les paramètres de tri changent. */\ninterface GroupByCache<T> {\n rows: T[];\n key: string;\n sortOrder: 'asc' | 'desc';\n sortActive: string;\n sortDir: string;\n order: string[];\n map: Map<string, T[]>;\n}\n\n@Component({\n standalone: true,\n selector: 'jquery-table',\n imports: [ CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent ],\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }],\n})\nexport class TableComponent<T = any> implements OnChanges, AfterContentInit, AfterViewInit, OnDestroy {\n @Input() config?: TableProvider<T>;\n\n @Input() dataSource?: T[] | { data: T[] };\n @Input() data?: T[];\n @Input() displayedColumns?: string[];\n @Input() columnsConfig?: TableColumnProvider<T>[];\n\n /**\n * Mode HTML : active et configure le panneau View indépendamment du `[config]`.\n * Prend le dessus sur `config.view` si défini.\n * Exemple : `<jquery-table [view]=\"{ enabled: true }\">`\n */\n @Input() view?: TableViewConfig;\n\n @Input() columnLabels?: Record<string, string>;\n @Input() isLoading = false;\n\n /** Paramètre de contrôle pour réinitialiser barre de recherche. */\n @Input()\n set clearSearchInput(value: boolean | null | undefined) {\n if (value) {\n this.searchQuery = '';\n this.onSearchChange();\n }\n }\n\n @Output() addRequested = new EventEmitter<void>();\n @Output() columnAdded = new EventEmitter<TableColumnProvider<T>>();\n @Output() columnRemoved = new EventEmitter<TableColumnProvider<T>>();\n @Output() categorySelected = new EventEmitter<string>();\n @Output() rowSelected = new EventEmitter<T>();\n\n /** Émis à chaque changement de tri (y compris le tri initial). */\n @Output() sortChange = new EventEmitter<{ active: string; direction: 'asc' | 'desc' | '' }>();\n /** Émis à chaque changement de page ou de taille de page. */\n @Output() pageChange = new EventEmitter<{ pageIndex: number; pageSize: number }>();\n /** Émis à chaque changement de la recherche texte. */\n @Output() searchChange = new EventEmitter<string>();\n /** Émis quand le Group by change (clé de colonne, ou `null` si désactivé). */\n @Output() groupByChange = new EventEmitter<string | null>();\n /** Émis quand la liste des colonnes visibles change (clés dans l’ordre d’affichage). */\n @Output() columnsChange = new EventEmitter<string[]>();\n\n @ViewChild(MatPaginator)\n set paginator(value: MatPaginator | undefined) {\n this._paginator = value;\n if (value) {\n this.attachPaginator();\n this._scheduleRender();\n }\n }\n get paginator(): MatPaginator | undefined { return this._paginator; }\n private _paginator?: MatPaginator;\n @ViewChild(MatSort) sort?: MatSort;\n @ViewChild('tableBodyScroll') tableBodyScrollRef?: ElementRef<HTMLElement>;\n @ViewChild(SlicePanelComponent) slicePanelRef?: SlicePanelComponent<T>;\n @ViewChild('viewMenuTrigger') viewMenuTrigger?: MatMenuTrigger;\n @ContentChildren(JqtCellDefDirective) _cellDefs!: QueryList<JqtCellDefDirective>;\n /** Map clé→TemplateRef pré-calculée depuis _cellDefs. Mise à jour dans ngAfterContentInit et sur _cellDefs.changes. */\n private _cellDefMap = new Map<string, TemplateRef<{ $implicit: any; index: number }>>();\n\n renderedColumns: string[] = [];\n tableDataSource = new MatTableDataSource<any>([]);\n\n /** Constante exposée au template pour le matColumnDef de la ligne de groupe. */\n readonly _GROUP_ROW_COLUMN = GROUP_ROW_COLUMN;\n /** Clés d'accès aux propriétés des lignes projetées — exposées pour le template. */\n readonly _ROW_RAW_KEY = ROW_RAW_KEY;\n readonly _ROW_INDEX_KEY = ROW_INDEX_KEY;\n readonly _ROW_GROUP_KEY = ROW_GROUP_KEY;\n readonly _ROW_GROUP_COUNT = ROW_GROUP_COUNT;\n readonly _ROW_GROUP_PAGE = ROW_GROUP_PAGE;\n readonly _ROW_GROUP_PAGE_COUNT = ROW_GROUP_PAGE_COUNT;\n\n /** Facade View : état et actions centralisés (Champs / Group by / Slice by) */\n readonly _view = new ViewFacade<T>();\n\n /**\n * Snapshot stable synchronisé depuis _view.fields.activeColumns dans refreshViewModel().\n * Propriété (non getter) pour qu'Angular puisse la suivre sans NG0100.\n */\n activeColumns: TableColumnProvider<T>[] = [];\n\n activeSliceFilter: (row: T) => boolean = () => true;\n\n // Propriétés stables pour les bindings du template (contre erreur NG0100)\n _sliceConfigs: any[] = [];\n _sliceColumns: TableColumnProvider<T>[] = [];\n _sliceData: T[] = [];\n _sliceShowToggle = true;\n /** Snapshot stable de la visibilité du panneau slice — jamais calculé depuis @ViewChild */\n _showSlicePanel = false;\n /** Snapshot stable de l'état collapsed du panneau slice, mis à jour via (collapsedChange) */\n _slicePanelCollapsed = false;\n\n // Délégués vers _view (conservés pour compatibilité template sans refactoring HTML)\n get _staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> { return this._view.staticSlicesForMenu; }\n get _activeDynamicSliceColumns(): TableColumnProvider<T>[] { return this._view.sliceBy.activeDynamicColumns; }\n get _availableColumnsForDynamicSlice(): TableColumnProvider<T>[] { return this._view.sliceBy.availableForDynamic; }\n get _allDynamicSliceColumns(): TableColumnProvider<T>[] { return this._view.sliceBy.allDynamicColumns; }\n get _activeSliceByLabel(): string { return this._view.sliceBy.activeLabel; }\n _sliceByMenuItems: Array<{ isStatic: boolean; key: string; title: string; icon?: string; col?: TableColumnProvider<T> }> = [];\n\n searchQuery = '';\n get activeGroupByKey(): string | null { return this._view.groupBy.activeKey; }\n _matSortActive = '';\n _matSortDirection: 'asc' | 'desc' | '' = '';\n private _activeSort: { active: string; direction: 'asc' | 'desc' | '' } = { active: '', direction: '' };\n private _sortSubscribed: MatSort | null = null;\n private _destroy$ = new Subject<void>();\n private _totalFilteredCount = 0;\n\n /** Gestionnaire du mode Group By (état collapsed, pagination, tri des groupes). */\n readonly _groupBy = new GroupByManager(\n () => { this._projectCurrentPage(); this._cdr.markForCheck(); },\n () => this.refreshViewModel(),\n );\n\n /** Délégués vers GroupByManager pour la compatibilité des templates. */\n get groupPageSize(): number { return this._groupBy.groupPageSize; }\n set groupPageSize(v: number) { this._groupBy.groupPageSize = v; }\n get groupSortOrder(): 'asc' | 'desc' { return this._groupBy.groupSortOrder; }\n set groupSortOrder(v: 'asc' | 'desc') { this._groupBy.groupSortOrder = v; }\n\n /** Gestionnaire du cycle de vie des colonnes lazy (fetch, annulation, statuts, données). */\n private _lazy = new LazyColumnManager<T>();\n /** Compatibilité template : retourne la map de statuts lazy. */\n get _lazyColumnStatus() { return this._lazy.status; }\n /** Compatibilité template : retourne la map de données lazy. */\n get _lazyColumnData() { return this._lazy.data; }\n private _cdr = inject(ChangeDetectorRef);\n private _el = inject(ElementRef<HTMLElement>);\n private _ngZone = inject(NgZone);\n private _i18nRaw = inject(JQT_I18N, { optional: true });\n\n /** Labels de l’interface. Fusionnés depuis JQT_I18N_DEFAULTS et le token JQT_I18N injecté. */\n readonly i18n: JqtI18n = { ...JQT_I18N_DEFAULTS, ...(this._i18nRaw ?? {}) };\n\n isGroupHeader = (_: number, row: any): boolean => row[GROUP_HEADER_MARKER] === true;\n\n /** Retourne true si la ligne de groupe est une ligne normale (ni lazy, ni too-many). */\n isNormalGroupRow(row: any): boolean {\n return row[ROW_GROUP_KEY] !== GROUP_KEY_LAZY_LOADING && row[ROW_GROUP_KEY] !== GROUP_KEY_TOO_MANY;\n }\n isGroupRowLoading(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_LAZY_LOADING; }\n isGroupRowTooMany(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_TOO_MANY; }\n\n /** Gère le clic sur une ligne d'en-tête de groupe (no-op pour les états spéciaux). */\n onGroupHeaderClick(row: any): void {\n if (!this.isNormalGroupRow(row)) return;\n this.toggleGroupCollapse(row[ROW_GROUP_KEY]);\n }\n\n /** Gestionnaire export CSV. */\n private readonly _export = new ExportManager<T>(\n () => this._allFilteredRows,\n () => this.activeColumns,\n () => this.resolvedConfig.export,\n (col, row, idx) => this.resolveCellValue(col, row, idx),\n );\n\n // ── Lifecycle\n\n pageSize = 5;\n pageSizeOptions: number[] = [5, 10, 20];\n pageSizeOptionsGroupBy: number[] = [5, 10, 20];\n\n draggedColumnKey: string | null = null;\n dragOverColumnKey: string | null = null;\n\n // ── Mode édition (Préférences)\n /** Vrai quand le mode édition est actif (resize + drag colonnes, interactions désactivées). */\n _editMode = false;\n /** Largeurs de colonnes personnalisées par l'utilisateur (clé → px). */\n _columnWidths: Record<string, number> = {};\n /** Message de feedback après save/clear. `null` = pas de message. */\n _preferencesMessage: string | null = null;\n /** Vrai si une configuration est sauvegardée pour ce tableau. */\n _hasSavedConfig = false;\n private _preferencesManager: TablePreferencesManager | null = null;\n /** true une fois que le group-by par défaut a été initialisé (évite de reconfigurer GroupByManager à chaque changement de données). */\n private _defaultGroupByApplied = false;\n private _resizeState: { key: string; startX: number; startWidth: number } | null = null;\n /** Dynamic slice keys à restaurer après ngAfterViewInit (slicePanelRef pas encore dispo). */\n private _pendingDynamicSliceKeys: string[] | null = null;\n /** Filtres de slice à restaurer après ngAfterViewInit (slicePanelRef pas encore dispo). */\n private _pendingSliceFilters: Record<number, string[]> | null = null;\n\n private resolvedConfig: TableProvider<T> = { columns: [] };\n private _columnMap: Map<string, TableColumnProvider<T>> = new Map();\n private _resolvedData: T[] = [];\n private _preservePageIndex: number | null = null;\n private _lastConfigClearSearchInput: string | number | boolean | null | undefined;\n\n // Seuil au-delà duquel le rendu groupé est bloqué pour protéger le navigateur\n private static readonly MAX_GROUP_COUNT = 500;\n\n // ── Optimisation performance\n private _allFilteredRows: T[] = [];\n private _paginatorSubscribed: MatPaginator | null = null;\n\n /** Cache groupBy — invalidé dès que rows/key/tri changent. */\n private _groupCache: GroupByCache<T> | null = null;\n private _pendingRender: ReturnType<typeof setTimeout> | null = null;\n\n private _staticSliceHiddenKeys = new Set<string>();\n private _configHiddenKeys = new Set<string>();\n\n\n /** Clés des colonnes visibles du dernier émission columnsChange (pour éviter les émissions dupliquement). */\n private _prevColumnKeys: string[] = [];\n\n ngOnChanges(changes: SimpleChanges): void {\n const dataChanged = !!(changes['config'] || changes['data'] || changes['dataSource']);\n if (dataChanged) {\n this._lazy.cancelAll();\n }\n this.refreshViewModel();\n if (changes['config']) {\n this.applyConfigSearchReset();\n this.applyInitialSearchQuery();\n }\n if (dataChanged) {\n this.activeColumns.filter(c => c.lazy).forEach(c => this.triggerLazyFetch(c));\n }\n }\n\n ngAfterContentInit(): void {\n this._rebuildCellDefMap();\n this._cellDefs.changes.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this._rebuildCellDefMap();\n this._cdr.markForCheck();\n });\n }\n\n ngAfterViewInit(): void {\n this.attachPaginator();\n this.attachSort();\n this._measureHeaderHeight();\n this._applyPendingDynamicSliceKeys();\n }\n\n private _applyPendingDynamicSliceKeys(): void {\n const hasPendingDynamic = !!this._pendingDynamicSliceKeys;\n const hasPendingFilters = !!this._pendingSliceFilters;\n if (!hasPendingDynamic && !hasPendingFilters) return;\n\n const allCols = this.resolvedConfig.columns ?? [];\n const keys = hasPendingDynamic ? [...this._pendingDynamicSliceKeys!] : [];\n const filters = this._pendingSliceFilters ? { ...this._pendingSliceFilters } : null;\n this._pendingDynamicSliceKeys = null;\n this._pendingSliceFilters = null;\n\n // Tout est différé dans le même setTimeout pour :\n // 1. Éviter NG0100 (modifications après vérification dans ngAfterViewInit)\n // 2. Garantir que les dynamic slices sont ajoutées AVANT la restauration des filtres\n // (les indices dans sliceFilters dépendent de l'ordre final de _cachedSlices)\n setTimeout(() => {\n keys.forEach(key => {\n const col = allCols.find(c => c.key === key);\n if (col) this.addDynamicSlice(col);\n });\n if (filters) {\n if (this.slicePanelRef) {\n this.slicePanelRef.restoreFilters(filters);\n } else {\n // slicePanelRef toujours null (données pas encore arrivées) :\n // remettre en attente pour que _recomputeShowSlicePanel les applique\n this._pendingSliceFilters = filters;\n }\n }\n this._cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n }\n if (this._preferencesMessageTimer !== null) {\n clearTimeout(this._preferencesMessageTimer);\n }\n // Nettoie un éventuel resize en cours (listeners window non retirés)\n this._resizeState = null;\n this._destroy$.next();\n this._destroy$.complete();\n this._view.destroy();\n }\n\n private _measureHeaderHeight(): void {\n const measure = () => {\n const headerRow = this._el.nativeElement.querySelector('tr.mat-mdc-header-row') as HTMLElement;\n if (headerRow) {\n const h = headerRow.getBoundingClientRect().height;\n if (h > 0) {\n this._el.nativeElement.style.setProperty('--actual-header-height', h + 'px');\n return;\n }\n }\n // Header pas encore rendu (ex: lazy Angular Material), on réessaie après le prochain frame\n this._ngZone.runOutsideAngular(() => requestAnimationFrame(() => measure()));\n };\n this._ngZone.runOutsideAngular(() => requestAnimationFrame(() => measure()));\n }\n\n // ── Getters d'affichage\n\n get title(): string {\n return this.resolvedConfig.title ?? '';\n }\n\n get showTitle(): boolean {\n return !!this.resolvedConfig.title;\n }\n\n get visibleColumns(): TableColumnProvider<T>[] {\n return this.activeColumns;\n }\n\n get showSearchBar(): boolean { return this.resolvedConfig.search?.enabled === true; }\n get showViewButton(): boolean { return this._view.enabled || this.showExportButton || this.showPreferencesMenu; }\n get showSliceExpandBtn(): boolean { return this._showSlicePanel && this._slicePanelCollapsed && this._sliceShowToggle; }\n get showExportButton(): boolean {\n return this.resolvedConfig.export?.enabled === true;\n }\n get showPreferencesMenu(): boolean {\n return this.resolvedConfig.preferences?.enabled === true;\n }\n\n get isDefaultGroupByActive(): boolean {\n if (!this.activeGroupByKey) return false;\n return this.activeGroupByKey === this.resolvedConfig.defaultGroupBy;\n }\n\n get hasSavedPreferences(): boolean { return this._hasSavedConfig; }\n\n get showToolbar(): boolean { return this.showSearchBar || this.showViewButton || this.showSliceExpandBtn; }\n\n expandSlicePanel(): void {\n this.slicePanelRef?.togglePanel();\n }\n get showFields(): boolean { return this._view.showFields; }\n get showGroupBySection(): boolean { return this._view.showGroupBySection; }\n\n get filteredRowCount(): number {\n return this.activeGroupByKey ? this._totalFilteredCount : this._allFilteredRows.length;\n }\n\n get activeGroupByLabel(): string { return this._view.activeGroupByLabel; }\n\n get totalColumnCount(): number { return this._view.totalColumnCount; }\n\n get activeSliceByLabel(): string { return this._view.sliceBy.activeLabel; }\n\n get activeDynamicSliceColumns(): TableColumnProvider<T>[] { return this._view.sliceBy.activeDynamicColumns; }\n\n removeDynamicSliceByKey(key: string): void {\n this.slicePanelRef?.removeDynamicSliceByKey(key);\n }\n\n get groupByColumns(): TableColumnProvider<T>[] { return this._view.groupByColumns; }\n\n colLabel(col: { key: string; header?: string }): string { return this._view.colLabel(col); }\n\n // ── Actions utilisateur\n\n onSearchChange(): void {\n this._preservePageIndex = 0;\n this.refreshViewModel();\n this.paginator?.firstPage();\n this.searchChange.emit(this.searchQuery);\n }\n\n onGroupByChange(key: string | null): void {\n this._view.setGroupBy(key);\n this._groupBy.setDefaultCollapsed(key !== null);\n this._groupBy.reset();\n this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();\n this.refreshViewModel();\n this.paginator?.firstPage();\n this.groupByChange.emit(key);\n if (key) {\n this.viewMenuTrigger?.closeMenu();\n const colDef = (this.resolvedConfig.columns || []).find(c => c.key === key);\n if (colDef?.lazy && this._lazyColumnStatus.get(key) !== 'loaded') {\n this.triggerLazyFetch(colDef);\n }\n } else {\n this._ngZone.runOutsideAngular(() => setTimeout(() => {\n this.tableBodyScrollRef?.nativeElement.scrollTo({ top: 0, behavior: 'smooth' });\n }, 0));\n }\n }\n\n onGroupPageSizeChange(size: number | string): void {\n this._groupBy.onGroupPageSizeChange(Number(size));\n }\n\n onGroupSortToggle(dir: 'asc' | 'desc'): void {\n this._groupBy.onGroupSortToggle(dir, (key) => {\n this._ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToGroupHeader(key), 0));\n });\n }\n\n // ── Lazy loading\n\n getLazyColumnStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error' {\n return this._lazy.getStatus(key);\n }\n\n getLazyRenderType(rowValue: any): 'loading' | 'error' | 'value' {\n return this._lazy.getRenderType(rowValue);\n }\n\n retryLazyColumn(column: TableColumnProvider<T>): void {\n this._lazy.retry(column, this._resolvedData, this._lazyCallbacks());\n }\n\n triggerLazyFetch(column: TableColumnProvider<T>): void {\n this._lazy.fetch(column, this._resolvedData, this._lazyCallbacks());\n }\n\n private _lazyCallbacks() {\n return {\n onRefresh: () => this.refreshViewModel(),\n onMarkForCheck: () => this._cdr.markForCheck(),\n };\n }\n\n // ── Groupement\n\n toggleGroupCollapse(groupKey: string): void {\n this._groupBy.toggleGroupCollapse(groupKey, (key) => {\n this._ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToGroupHeader(key), 0));\n });\n }\n\n private scrollToGroupHeader(groupKey: string): void {\n const container = this.tableBodyScrollRef?.nativeElement;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`tr[data-group-key=\"${CSS.escape(groupKey)}\"]`);\n if (!row) return;\n const headerHeight = parseFloat(\n this._el.nativeElement.style.getPropertyValue('--actual-header-height') || '56'\n ) || 56;\n const containerRect = container.getBoundingClientRect();\n const rowRect = row.getBoundingClientRect();\n const currentScrollTop = container.scrollTop;\n const targetScrollTop = currentScrollTop + (rowRect.top - containerRect.top) - headerHeight;\n container.scrollTo({ top: targetScrollTop, behavior: 'smooth' });\n }\n\n isGroupCollapsed(groupKey: string): boolean {\n return this._groupBy.isGroupCollapsed(groupKey);\n }\n\n groupPageBack(groupKey: string): void {\n this._groupBy.groupPageBack(groupKey);\n }\n\n groupPageForward(groupKey: string, totalCount: number): void {\n this._groupBy.groupPageForward(groupKey, totalCount);\n }\n\n // ── Colonnes\n\n get hasAddableColumns(): boolean {\n return this._view.menuBaseColumns.length > 0 || this._view.menuOptionalColumns.length > 0;\n }\n\n get menuBaseColumns(): TableColumnProvider<T>[] {\n return this._view.menuBaseColumns;\n }\n\n get menuOptionalColumns(): TableColumnProvider<T>[] {\n return this._view.menuOptionalColumns;\n }\n\n get availableColumnsToAdd(): TableColumnProvider<T>[] {\n const activeKeys = new Set(this.activeColumns.map((column) => column.key));\n return (this.resolvedConfig.columns || []).filter((c) => c.optional && !activeKeys.has(c.key));\n }\n\n get allowColumnRemoval(): boolean {\n return this._view.allowColumnRemoval;\n }\n\n // ── Slices\n\n get hasSliceConfig(): boolean {\n return (this.resolvedConfig.slices?.length ?? 0) > 0;\n }\n\n get showSlicePanel(): boolean {\n return this._showSlicePanel;\n }\n\n onSlicePanelCollapsedChange(collapsed: boolean): void {\n this._slicePanelCollapsed = collapsed;\n this._cdr.markForCheck();\n }\n\n private _recomputeShowSlicePanel(): void {\n const hasCfg = this._sliceConfigs.length > 0 || this._view.sliceBy.activeDynamicColumns.length > 0;\n const wasVisible = this._showSlicePanel;\n this._showSlicePanel = hasCfg && this._resolvedData.length > 0;\n // Le SlicePanelComponent vient d'être rendu pour la 1ère fois\n // (données arrivées) → appliquer les filtres en attente\n if (!wasVisible && this._showSlicePanel && this._pendingSliceFilters) {\n const filters = this._pendingSliceFilters;\n this._pendingSliceFilters = null;\n setTimeout(() => {\n this.slicePanelRef?.restoreFilters(filters);\n this._cdr.markForCheck();\n });\n }\n }\n\n get showAddSliceButton(): boolean {\n return this._view.showSliceBySection;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> {\n return this._view.staticSlicesForMenu;\n }\n\n get availableColumnsForDynamicSlice(): TableColumnProvider<T>[] {\n return this._view.sliceBy.availableForDynamic;\n }\n\n isStaticSliceVisible(columnKey: string): boolean {\n return !this._staticSliceHiddenKeys.has(columnKey);\n }\n\n toggleStaticSlice(columnKey: string): void {\n const next = new Set(this._staticSliceHiddenKeys);\n if (next.has(columnKey)) next.delete(columnKey);\n else next.add(columnKey);\n this._staticSliceHiddenKeys = next;\n this._view.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n this._sliceConfigs = this._computeSliceConfigs();\n // Si une slice vient d'être cachée, réinitialise le filtre actif pour éviter\n // un filtre orphelin (la slice n'est plus visible mais son filtre resterait actif)\n if (next.has(columnKey)) {\n this.activeSliceFilter = () => true;\n }\n this._recomputeShowSlicePanel();\n this._scheduleRender();\n this._cdr.markForCheck();\n }\n\n addDynamicSlice(column: TableColumnProvider<T>): void {\n this.slicePanelRef?.addDynamicSlice(column);\n if (column.lazy && this._lazyColumnStatus.get(column.key) !== 'loaded') {\n this.triggerLazyFetch(column);\n }\n }\n\n get allDynamicSliceColumns(): TableColumnProvider<T>[] {\n return this._allDynamicSliceColumns;\n }\n\n isDynamicSliceActive(key: string): boolean {\n return this._view.isDynamicSliceActive(key);\n }\n\n toggleDynamicSlice(col: TableColumnProvider<T>): void {\n if (this.isDynamicSliceActive(col.key)) {\n this.removeDynamicSliceByKey(col.key);\n } else {\n this.addDynamicSlice(col);\n }\n }\n\n onSliceFilterChange(pred: (row: T) => boolean): void {\n this.activeSliceFilter = pred;\n this._preservePageIndex = 0;\n this.refreshViewModel();\n this.paginator?.firstPage();\n }\n\n onDynamicSliceKeysChange(keys: string[]): void {\n this._view.onDynamicSliceKeysChange(keys);\n this._recomputeShowSlicePanel();\n this._cdr.markForCheck();\n }\n\n get emptyStateLabel(): string {\n return this.resolvedConfig.labels?.empty || this.i18n.emptyState;\n }\n\n get loadingStateLabel(): string {\n return this.resolvedConfig.labels?.loading || this.i18n.loadingState;\n }\n\n get effectiveIsLoading(): boolean {\n return this.isLoading;\n }\n\n get isEmpty(): boolean {\n // _pendingRender : le rendu interne n'est pas encore terminé → pas de message vide prématuré\n return !this.isLoading && this._pendingRender === null && this._allFilteredRows.length === 0;\n }\n\n get showPagination(): boolean {\n if (this.activeGroupByKey !== null) return false;\n return this.resolvedConfig.pagination?.enabled !== false;\n }\n\n get resolvedPaginationShowFirstLastButtons(): boolean {\n return this.resolvedConfig.pagination?.showFirstLastButtons === true;\n }\n\n get isColumnDragDropEnabled(): boolean {\n return this._view.isColumnDragDropEnabled;\n }\n\n get totalRows(): number {\n return this.activeGroupByKey\n ? this.tableDataSource.data.filter((r) => !r[GROUP_HEADER_MARKER]).length\n : this._allFilteredRows.length;\n }\n\n // ── Gestion des colonnes\n\n onAddColumn(column: TableColumnProvider<T>): void {\n this._view.addColumn(column);\n this._preservePageIndex = this.paginator?.pageIndex ?? null;\n this.refreshViewModel();\n\n if (column.lazy) {\n this.triggerLazyFetch(column);\n }\n\n this.addRequested.emit();\n this.columnAdded.emit(column);\n }\n\n onColumnVisibilityChange(column: TableColumnProvider<T>, checked: boolean): void {\n const isVisible = this._view.isColumnVisible(column.key);\n\n if (checked && !isVisible) {\n this.onAddColumn(column);\n return;\n }\n\n if (!checked && isVisible) {\n const removed = this._view.removeColumn(column.key);\n if (!removed) return;\n this._preservePageIndex = this.paginator?.pageIndex ?? null;\n this.refreshViewModel();\n this.columnRemoved.emit(column);\n }\n }\n\n isColumnVisible(columnKey: string): boolean {\n return this.activeColumns.some(c => c.key === columnKey);\n }\n\n onRemoveColumn(columnKey: string, event?: Event): void {\n event?.stopPropagation();\n const column = this.activeColumns.find(item => item.key === columnKey);\n if (!column) return;\n const removed = this._view.removeColumn(columnKey);\n if (!removed) return;\n this.refreshViewModel();\n this.columnRemoved.emit(column);\n }\n\n // ── Lignes\n\n private _rebuildCellDefMap(): void {\n this._cellDefMap = new Map(\n (this._cellDefs ?? []).map(d => [d.columnKey, d.template] as [string, TemplateRef<{ $implicit: any; index: number }>])\n );\n }\n\n getCellTemplate(key: string): TemplateRef<{ $implicit: any; index: number }> | null {\n return this._cellDefMap.get(key) ?? null;\n }\n\n get hasCustomCellDefs(): boolean {\n return this._cellDefMap.size > 0;\n }\n\n get hasRowClickHandler(): boolean {\n return this.rowSelected.observed || !!this.resolvedConfig.onRowSelected;\n }\n\n /** Largeur minimale du tableau en px, calculée depuis les largeurs explicites des colonnes actives.\n * Retourne null si aucune colonne n'a de largeur définie (le tableau remplit alors 100% du conteneur).\n * Seules les valeurs explicitement en `px` sont sommables ; les pourcentages ou autres unités sont ignorés. */\n get tableMinWidth(): string | null {\n const hasResized = Object.keys(this._columnWidths).length > 0;\n const hasSomeExplicitWidth = hasResized || this.activeColumns.some(c => c.width);\n if (!hasSomeExplicitWidth) return null;\n let sum = 0;\n for (const col of this.activeColumns) {\n if (this._columnWidths[col.key] != null) {\n sum += this._columnWidths[col.key];\n } else if (col.width) {\n const isPx = col.width.trim().toLowerCase().endsWith('px');\n const px = Number.parseFloat(col.width);\n if (isPx && !Number.isNaN(px)) { sum += px; }\n else { sum += 150; }\n } else {\n sum += 120; // largeur minimale estimée pour une colonne sans largeur explicite\n }\n }\n return sum + 'px';\n }\n\n trackRowFn = (_index: number, row: any): any =>\n row[GROUP_HEADER_MARKER] ? `__group_${row[ROW_GROUP_KEY]}` : row[ROW_INDEX_KEY] ?? _index;\n\n getRowClass(row: any): string | string[] | Record<string, boolean> {\n const fn = this.resolvedConfig.rowClass;\n if (!fn || row?.[GROUP_HEADER_MARKER]) return {};\n return fn(row[ROW_RAW_KEY] ?? row, row[ROW_INDEX_KEY] ?? 0);\n }\n\n onRowClick(row: any, event: MouseEvent | null): void {\n if (row?.[GROUP_HEADER_MARKER]) return;\n if (!this.hasRowClickHandler) return;\n const resolved = (row?.[ROW_RAW_KEY] ?? row) as T;\n this.resolvedConfig.onRowSelected?.(resolved, event);\n this.rowSelected.emit(resolved);\n }\n\n // ── Drag & drop\n\n onHeaderDragStart(columnKey: string, event: DragEvent): void {\n if (!this.isColumnDragDropEnabled && !this._editMode) {\n return;\n }\n\n this.draggedColumnKey = columnKey;\n this.dragOverColumnKey = null;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', columnKey);\n }\n }\n\n onHeaderDragOver(columnKey: string, event: DragEvent): void {\n if ((!this.isColumnDragDropEnabled && !this._editMode) || !this.draggedColumnKey) {\n return;\n }\n\n event.preventDefault();\n this.dragOverColumnKey = columnKey;\n }\n\n onHeaderDrop(targetColumnKey: string, event: DragEvent): void {\n if ((!this.isColumnDragDropEnabled && !this._editMode) || !this.draggedColumnKey) {\n return;\n }\n\n event.preventDefault();\n\n const moved = this._view.reorderColumns(this.draggedColumnKey, targetColumnKey);\n if (!moved) {\n this.onHeaderDragEnd();\n return;\n }\n\n this.refreshViewModel();\n this.onHeaderDragEnd();\n }\n\n onHeaderDragEnd(): void {\n this.draggedColumnKey = null;\n this.dragOverColumnKey = null;\n }\n\n isHeaderDropTarget(columnKey: string): boolean {\n return !!this.draggedColumnKey && this.dragOverColumnKey === columnKey && this.draggedColumnKey !== columnKey;\n }\n\n // ── Préférences : mode édition\n\n enterEditMode(): void {\n this._editMode = true;\n this._preferencesMessage = null;\n this._cdr.markForCheck();\n }\n\n confirmEditMode(): void {\n this._editMode = false;\n this._cdr.markForCheck();\n }\n\n /** Démarre le resize d'une colonne (mousedown sur la poignée droite). */\n onResizeStart(columnKey: string, event: MouseEvent): void {\n if (!this._editMode) return;\n event.preventDefault();\n event.stopPropagation();\n\n const th = (event.target as HTMLElement).closest('th') as HTMLElement | null;\n if (!th) return;\n\n const scrollEl = this.tableBodyScrollRef?.nativeElement;\n if (scrollEl) {\n const allTh = scrollEl.querySelectorAll<HTMLElement>('th.mat-mdc-header-cell');\n allTh.forEach(thEl => {\n const key = thEl.getAttribute('mat-column-header') || thEl.getAttribute('mat-sort-header') || '';\n const colClass = Array.from(thEl.classList).find(c => c.startsWith('mat-column-'));\n const colKey = colClass ? colClass.replace('mat-column-', '') : null;\n if (colKey && this._columnWidths[colKey] == null) {\n this._columnWidths = { ...this._columnWidths, [colKey]: thEl.offsetWidth };\n }\n });\n }\n\n this._resizeState = { key: columnKey, startX: event.clientX, startWidth: th.offsetWidth };\n\n const onMove = (e: MouseEvent) => {\n if (!this._resizeState) {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n return;\n }\n const delta = e.clientX - this._resizeState.startX;\n const newWidth = Math.max(60, this._resizeState.startWidth + delta);\n this._columnWidths = { ...this._columnWidths, [this._resizeState.key]: newWidth };\n // detectChanges() pour forcer la mise à jour immédiate en mode OnPush\n // (les listeners window tournent hors zone Angular avec runOutsideAngular)\n this._cdr.detectChanges();\n };\n\n const onUp = () => {\n this._resizeState = null;\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n\n // Listeners hors zone Angular pour éviter des cycles CD à chaque mousemove\n this._ngZone.runOutsideAngular(() => {\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n });\n }\n\n /** Retourne la largeur CSS d'une colonne (px si personnalisée, sinon la valeur de config ou auto). */\n getColumnWidth(key: string): string {\n if (this._columnWidths[key] != null) return this._columnWidths[key] + 'px';\n const col = this._columnMap.get(key);\n return col?.width ?? 'auto';\n }\n\n // ── Préférences : save / clear\n\n savePreferences(): void {\n if (!this._preferencesManager) return;\n const dynamicSliceKeys = this._view.sliceBy.activeDynamicColumns.map(c => c.key);\n const config: import('../jquery-table.model').SavedTableConfig = {\n search: this.searchQuery || undefined,\n groupBy: this.activeGroupByKey,\n columnOrder: this.activeColumns.map(c => c.key),\n visibleColumns: this.activeColumns.map(c => c.key),\n columnWidths: Object.keys(this._columnWidths).length ? { ...this._columnWidths } : undefined,\n slicePanelCollapsed: this._slicePanelCollapsed,\n hiddenSliceKeys: [...this._staticSliceHiddenKeys],\n dynamicSliceKeys: dynamicSliceKeys.length ? dynamicSliceKeys : undefined,\n sliceFilters: this.slicePanelRef ? this.slicePanelRef.getActiveFilters() : undefined,\n };\n this._preferencesManager.save(config);\n this._hasSavedConfig = true;\n this._showPreferencesMessage(this.i18n.preferencesSavedMessage);\n }\n\n clearPreferences(): void {\n if (!this._preferencesManager) return;\n this._preferencesManager.clear();\n this._hasSavedConfig = false;\n\n // Capturer les dynamic slices actives AVANT le reset (resetToDefaults() les vide)\n const dynamicSlicesToRemove = this._view.sliceBy.activeDynamicColumns.slice();\n\n // Reset complet de l'état vers les valeurs par défaut de la config\n this.searchQuery = '';\n this._columnWidths = {};\n this._slicePanelCollapsed = false;\n // Synchroniser l'état interne du slice-panel : si le composant est en état collapsed\n // (l'utilisateur l'avait fermé après la sauvegarde), le rouvrir explicitement pour\n // éviter que display:none soit retiré mais que isCollapsed interne reste à true.\n if (this.slicePanelRef?.isCollapsed) {\n this.slicePanelRef.togglePanel();\n }\n this._groupBy.reset();\n this._groupBy.setDefaultCollapsed(false);\n\n // Slices statiques : revenir aux seules celles cachées par la config (pas par l'utilisateur)\n this._staticSliceHiddenKeys = new Set(this._configHiddenKeys);\n this._view.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n\n // Colonnes et groupBy : reset via la facade (retire les optionnelles, remet l'ordre config)\n this._view.resetToDefaults();\n this._defaultGroupByApplied = false;\n\n // Dynamic slices : les retirer du slice panel avec la liste capturée avant le reset\n dynamicSlicesToRemove.forEach(col => {\n this.slicePanelRef?.removeDynamicSliceByKey(col.key);\n });\n\n // Filtre de slice actif\n this.activeSliceFilter = () => true;\n if (this.slicePanelRef) this.slicePanelRef.restoreFilters({});\n\n // Rafraîchit toute la vue\n this.activeColumns = this._view.fields.activeColumns;\n this.renderedColumns = this.activeColumns.map(c => c.key);\n this._pendingDynamicSliceKeys = null;\n this._pendingSliceFilters = null;\n this.refreshViewModel();\n\n this._showPreferencesMessage(this.i18n.preferencesClearedMessage);\n }\n\n private _preferencesMessageTimer: ReturnType<typeof setTimeout> | null = null;\n\n private _showPreferencesMessage(msg: string): void {\n if (this._preferencesMessageTimer !== null) clearTimeout(this._preferencesMessageTimer);\n this._preferencesMessage = msg;\n this._cdr.markForCheck();\n this._preferencesMessageTimer = setTimeout(() => {\n this._preferencesMessageTimer = null;\n this._preferencesMessage = null;\n this._cdr.markForCheck();\n }, 4000);\n }\n\n private _applyPreferences(saved: import('../jquery-table.model').SavedTableConfig | null): void {\n if (!saved) return;\n // Recherche\n if (saved.search) this.searchQuery = saved.search;\n // Largeurs colonnes\n if (saved.columnWidths) this._columnWidths = { ...saved.columnWidths };\n // Group by\n if (saved.groupBy !== undefined) {\n this._view.setGroupBy(saved.groupBy);\n if (saved.groupBy) {\n this._groupBy.setDefaultCollapsed(true);\n this._groupBy.reset();\n }\n }\n // État panneau slice\n if (saved.slicePanelCollapsed !== undefined) this._slicePanelCollapsed = saved.slicePanelCollapsed;\n // Slices statiques cachées — on utilise la valeur exacte sauvegardée (pas les defaults de config)\n if (saved.hiddenSliceKeys !== undefined) {\n this._staticSliceHiddenKeys = new Set(saved.hiddenSliceKeys);\n this._view.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n }\n // Colonnes visibles + ordre — reconstruit activeColumns en une seule passe.\n // On part de saved.columnOrder (ordre sauvegardé) si disponible, sinon saved.visibleColumns.\n // Cela gère à la fois : colonnes optionnelles ajoutées, colonnes retirées, et réordonnancement.\n const targetKeys = saved.columnOrder ?? saved.visibleColumns;\n if (targetKeys?.length) {\n const allByKey = new Map((this.resolvedConfig.columns ?? []).map(c => [c.key, c]));\n // Colonnes dans l'ordre sauvegardé (on ne garde que celles connues de la config)\n const ordered = targetKeys\n .map(key => allByKey.get(key))\n .filter((c): c is TableColumnProvider<T> => c !== undefined);\n // Colonnes actives actuelllement non présentes dans targetKeys (non-optional passées sous silence)\n // → on les exclut : l'utilisateur avait explicitement choisi ce sous-ensemble\n if (ordered.length > 0) {\n this._view.setActiveColumns(ordered);\n }\n }\n // Dynamic slices — différé : slicePanelRef pas encore disponible au moment de ngOnChanges\n if (saved.dynamicSliceKeys?.length) {\n this._pendingDynamicSliceKeys = saved.dynamicSliceKeys;\n }\n // Filtres actifs du slice panel\n // Filtres actifs du slice panel — toujours stockés en pending :\n // appliqués par _applyPendingDynamicSliceKeys (si dynamic slices) ou\n // par _recomputeShowSlicePanel (quand les données arrivent et rendent le panel visible)\n if (saved.sliceFilters && Object.keys(saved.sliceFilters).length) {\n this._pendingSliceFilters = saved.sliceFilters;\n }\n }\n\n canRemoveColumn(column: TableColumnProvider<T>): boolean {\n return (\n this._view.allowColumnRemoval &&\n column.removable !== false &&\n this.activeColumns.length > 1\n );\n }\n\n isCellEmpty(value: any): boolean {\n return value === '' || value == null;\n }\n\n asTitle(value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n return String(value);\n }\n\n // ── Export CSV\n\n onExport(): void {\n this._export.export();\n }\n\n // ── Pipeline de données (privé)\n\n private refreshViewModel(): void {\n this._resolvedData = this.resolveData();\n this.resolvedConfig = this.buildEffectiveConfig();\n this._columnMap = new Map((this.resolvedConfig.columns || []).map(c => [c.key, c]));\n\n // ── Initialiser le gestionnaire de préférences si l'option est activée\n const prefsId = this.resolvedConfig.preferences?.enabled\n ? this.resolvedConfig.preferences.tableId\n : null;\n const currentId = prefsId ?? null;\n // Préférences à appliquer après _view.update() (quand activeColumns est déjà peuplé)\n let pendingPrefs: import('../jquery-table.model').SavedTableConfig | null = null;\n if (currentId && this._preferencesManager?.key !== ('jqt_prefs_' + currentId)) {\n this._preferencesManager = new TablePreferencesManager(currentId);\n this._hasSavedConfig = this._preferencesManager.hasSaved();\n pendingPrefs = this._preferencesManager.load();\n } else if (!currentId) {\n this._preferencesManager = null;\n this._hasSavedConfig = false;\n }\n\n // Délègue à la facade : mise à jour de l'état View (colonnes, groupBy meta, sliceBy meta)\n this._view.update({\n config: this.resolvedConfig.view,\n columns: this.resolvedConfig.columns ?? [],\n sliceConfigs: this.resolvedConfig.slices ?? [],\n defaultGroupBy: this.resolvedConfig.defaultGroupBy,\n });\n\n if (!pendingPrefs && !this._defaultGroupByApplied && !this._view.groupBy.userCustomized && this._view.groupBy.activeKey != null) {\n this._defaultGroupByApplied = true;\n this._groupBy.setDefaultCollapsed(true);\n this._groupBy.reset();\n this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();\n }\n\n // Synchronise la propriété stable (évite NG0100 — la facade est source de vérité)\n this.activeColumns = this._view.fields.activeColumns;\n\n this.renderedColumns = this.activeColumns.map(c => c.key);\n\n this.pageSize = this.paginator?.pageSize || this.resolvePageSize();\n this.pageSizeOptions = this.resolvePageSizeOptions();\n this.pageSizeOptionsGroupBy = this.resolvePageSizeOptionsGroupBy();\n if (this.groupPageSize !== 0 && !this.pageSizeOptionsGroupBy.includes(this.groupPageSize)) {\n this.groupPageSize = this.resolveDefaultGroupPageSize();\n }\n\n this.attachPaginator();\n this.attachSort();\n\n // Réinitialise _staticSliceHiddenKeys seulement si les clés hidden de la config ont vraiment changé\n // ET qu'il n'y a pas de préférences sauvegardées (qui géreront hiddenSliceKeys elles-mêmes).\n const newConfigHidden = new Set<string>(\n (this.resolvedConfig.slices ?? []).filter(s => s.hidden && s.columnKey).map(s => s.columnKey!)\n );\n if (!TableComponent._setsEqual(newConfigHidden, this._configHiddenKeys)) {\n this._configHiddenKeys = newConfigHidden;\n // N'écraser _staticSliceHiddenKeys que si on n'est PAS en train d'appliquer des prefs\n // (pendingPrefs les gèrera lui-même via _applyPreferences → hiddenSliceKeys)\n if (!pendingPrefs) {\n this._staticSliceHiddenKeys = new Set(newConfigHidden);\n this._view.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n }\n }\n\n // Applique les préférences ICI, APRÈS _view.update() ET après _configHiddenKeys mis à jour,\n // mais avant _computeSliceConfigs() pour que hiddenSliceKeys soit déjà restauré.\n if (pendingPrefs) {\n this._applyPreferences(pendingPrefs);\n }\n\n // Propriétés stables pour les bindings du template\n // On recalcule _sliceConfigs en reflétant l'état courant des slices cachées,\n // pour que SlicePanelComponent.ngOnInit reçoive la bonne valeur de `hidden`\n // même quand le composant est créé pour la 1ère fois après un toggle.\n this._sliceConfigs = this._computeSliceConfigs();\n this._sliceColumns = this.resolvedConfig.columns ?? [];\n this._sliceData = this._resolvedData;\n this._sliceShowToggle = this.resolvedConfig.enableSliceToggle !== false;\n this._recomputeShowSlicePanel();\n if (!this._activeSort.active && this.resolvedConfig.defaultSort) {\n this._matSortActive = this.resolvedConfig.defaultSort.active;\n this._matSortDirection = this.resolvedConfig.defaultSort.direction;\n }\n this._buildSliceByMenuItems();\n\n this._scheduleRender();\n }\n\n /** Retourne uniquement les slices visibles (non cachées par _staticSliceHiddenKeys).\n * Le SlicePanelComponent affiche tout ce qu'il reçoit — c'est ici que se fait le filtrage. */\n private _computeSliceConfigs(): SliceConfig<T>[] {\n return (this.resolvedConfig.slices ?? []).filter(\n s => !s.columnKey || !this._staticSliceHiddenKeys.has(s.columnKey)\n );\n }\n\n private static _setsEqual(a: Set<string>, b: Set<string>): boolean {\n if (a.size !== b.size) return false;\n for (const v of a) if (!b.has(v)) return false;\n return true;\n }\n\n private _buildSliceByMenuItems(): void {\n const staticSliceMap = new Map(this._staticSlicesForMenu.map(s => [s.key, s]));\n const dynamicSliceSet = new Set(this._allDynamicSliceColumns.map(c => c.key));\n const seen = new Set<string>();\n const items: Array<{ isStatic: boolean; key: string; title: string; icon?: string; col?: TableColumnProvider<T> }> = [];\n for (const col of this.resolvedConfig.columns ?? []) {\n if (seen.has(col.key)) continue;\n if (staticSliceMap.has(col.key)) {\n const s = staticSliceMap.get(col.key)!;\n items.push({ isStatic: true, key: s.key, title: s.title, icon: s.icon });\n seen.add(col.key);\n } else if (dynamicSliceSet.has(col.key)) {\n items.push({ isStatic: false, key: col.key, title: this.colLabel(col), icon: col.icon, col });\n seen.add(col.key);\n }\n }\n for (const s of this._staticSlicesForMenu) {\n if (!seen.has(s.key)) {\n items.push({ isStatic: true, key: s.key, title: s.title, icon: s.icon });\n }\n }\n this._sliceByMenuItems = items;\n }\n\n get sliceByMenuItems() { return this._sliceByMenuItems; }\n\n onSliceMenuItemClick(item: { isStatic: boolean; key: string; col?: TableColumnProvider<T> }): void {\n if (item.isStatic) {\n this.toggleStaticSlice(item.key);\n } else if (item.col) {\n this.toggleDynamicSlice(item.col);\n }\n }\n\n isSliceMenuItemActive(item: { isStatic: boolean; key: string }): boolean {\n return item.isStatic ? this.isStaticSliceVisible(item.key) : this.isDynamicSliceActive(item.key);\n }\n\n private _scheduleRender(): void {\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n this._pendingRender = null;\n }\n this._ngZone.runOutsideAngular(() => {\n this._pendingRender = setTimeout(() => {\n this._pendingRender = null;\n this._ngZone.run(() => this._executeRender());\n }, 0);\n });\n }\n\n private _executeRender(): void {\n const categoryRows = this.getCategoryFilteredData();\n if (this.activeGroupByKey) {\n // En mode groupBy, projectRows gère tout le tri internement — pas de sort global inutile\n this._allFilteredRows = categoryRows;\n } else {\n const compareFn = this._buildSortComparator();\n this._allFilteredRows = compareFn ? [...categoryRows].sort(compareFn) : categoryRows;\n }\n\n // Mettre à jour le paginator avec le nouveau total\n if (this.paginator) {\n const savedIndex = this._preservePageIndex ?? this.paginator.pageIndex;\n const maxPage = Math.max(0, Math.ceil(this._allFilteredRows.length / this.pageSize) - 1);\n this.paginator.length = this._allFilteredRows.length;\n this.paginator.pageIndex = Math.min(savedIndex, maxPage);\n this._preservePageIndex = null;\n }\n\n this._projectCurrentPage();\n // detectChanges() au lieu de markForCheck() : met à jour uniquement CE composant\n // sans déclencher un cycle CD global qui provoquerait NG0100 dans les parents.\n this._cdr.detectChanges();\n }\n\n private _projectCurrentPage(): void {\n if (this.activeGroupByKey) {\n this.tableDataSource.data = this.projectRows(this._allFilteredRows);\n return;\n }\n\n const pageIndex = this.paginator?.pageIndex ?? 0;\n const start = pageIndex * this.pageSize;\n const pageRows = this._allFilteredRows.slice(start, start + this.pageSize);\n\n const projected: any[] = [];\n pageRows.forEach((row, i) => {\n const idx = start + i;\n const p: any = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };\n this.activeColumns.forEach((col) => {\n p[col.key] = this.resolveCellValue(col, row, idx);\n });\n projected.push(p);\n });\n this.tableDataSource.data = projected;\n }\n\n private buildEffectiveConfig(): TableProvider<T> {\n const config = this.config || {};\n const rows = this._resolvedData;\n\n const columns =\n config.columns ||\n this.columnsConfig ||\n this.resolveColumnsFromCompat(rows);\n\n // Mode HTML : [view] prend le dessus sur config.view si fourni (Phase 3).\n const view = this.view ?? config.view;\n\n const autoTableId = config.preferences?.tableId || TableComponent._hashColumns((columns || []).map(c => c.key));\n const exportConfig: TableExportConfig<T> = {\n enabled: true,\n filename: autoTableId,\n ...config.export,\n };\n\n const prefsConfig: TablePreferencesConfig = {\n enabled: true,\n tableId: autoTableId,\n ...config.preferences,\n };\n\n return {\n ...config,\n columns,\n view,\n slices: config.slices || [],\n enableSliceToggle: config.enableSliceToggle ?? true,\n export: exportConfig,\n preferences: prefsConfig,\n };\n }\n\n private applyConfigSearchReset(): void {\n const clearToken = this.resolvedConfig.clearSearchInput;\n const shouldClear = !!clearToken && clearToken !== this._lastConfigClearSearchInput;\n\n this._lastConfigClearSearchInput = clearToken;\n\n if (!shouldClear) {\n return;\n }\n\n this.searchQuery = '';\n this.onSearchChange();\n }\n\n private applyInitialSearchQuery(): void {\n const initialQuery = this.resolvedConfig.search?.initialQuery;\n if (initialQuery == null) {\n return;\n }\n\n this.searchQuery = initialQuery;\n this.onSearchChange();\n }\n\n private static _hashColumns(keys: string[]): string {\n const str = keys.join('|');\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h.toString(16).padStart(8, '0');\n }\n\n private resolveData(): T[] {\n if (Array.isArray(this.data)) {\n return this.data;\n }\n\n if (Array.isArray(this.dataSource)) {\n return this.dataSource;\n }\n\n if (this.dataSource && Array.isArray((this.dataSource as any).data)) {\n return (this.dataSource as any).data;\n }\n\n return [];\n }\n\n private resolveColumnsFromCompat(rows: T[]): TableColumnProvider<T>[] {\n if (this.displayedColumns?.length) {\n return this.displayedColumns.map((key) => ({\n key,\n header: this.columnLabels?.[key] || humanizeKey(key),\n }));\n }\n\n const firstRow = rows[0] as any;\n if (!firstRow || typeof firstRow !== 'object') {\n return [];\n }\n\n return Object.keys(firstRow).map((key) => ({\n key,\n header: this.columnLabels?.[key] || humanizeKey(key),\n }));\n }\n\n private getCategoryFilteredData(): T[] {\n const data = this._resolvedData;\n\n let filtered = data.filter(this.activeSliceFilter);\n\n const query = this.searchQuery?.trim().toLowerCase();\n if (query) {\n const restrictedKeys = this.resolvedConfig.search?.searchColumns;\n const searchCols = restrictedKeys?.length\n ? [...this._columnMap.values()].filter(col => restrictedKeys.includes(col.key))\n : [...this._columnMap.values()];\n filtered = filtered.filter((row) =>\n searchCols.some((col) => {\n const val = this.getDisplayValueForSearch(col, row);\n return val != null && String(val).toLowerCase().includes(query);\n })\n );\n }\n return filtered;\n }\n\n private projectRows(rows: T[]): any[] {\n const groupKey = this.activeGroupByKey;\n\n if (!groupKey) {\n const result: any[] = [];\n rows.forEach((row, index) => {\n const projected: any = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: index };\n this.activeColumns.forEach((col) => {\n projected[col.key] = this.resolveCellValue(col, row, index);\n });\n result.push(projected);\n });\n return result;\n }\n\n const groupColDef = this._columnMap.get(groupKey);\n const groupLazyStatus = groupColDef?.lazy ? (this._lazyColumnStatus.get(groupKey) ?? 'idle') : 'loaded';\n\n if (groupLazyStatus !== 'loaded') {\n this._totalFilteredCount = rows.length;\n return [{ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: GROUP_KEY_LAZY_LOADING, [ROW_GROUP_COUNT]: rows.length, [ROW_GROUP_PAGE]: 0, [ROW_GROUP_PAGE_COUNT]: 1 }];\n }\n\n const effectiveSort = this._activeSort.active && this._activeSort.direction\n ? this._activeSort\n : this.resolvedConfig.defaultSort ?? { active: '', direction: '' as const };\n\n // Vérifie si le cache est encore valide (même référence de rows + même paramètres de tri/groupe)\n const cacheValid =\n this._groupCache !== null &&\n this._groupCache.rows === rows &&\n this._groupCache.key === groupKey &&\n this._groupCache.sortOrder === this._groupBy.groupSortOrder &&\n this._groupCache.sortActive === (effectiveSort.active ?? '') &&\n this._groupCache.sortDir === (effectiveSort.direction ?? '');\n\n let groupOrder: string[];\n let groupMap: Map<string, T[]>;\n\n if (cacheValid) {\n groupOrder = this._groupCache!.order;\n groupMap = this._groupCache!.map;\n } else {\n // Pré-calcul des valeurs de groupe en un seul passage (évite O(n) find() par comparaison)\n const groupValueCache = new Map<T, string>();\n rows.forEach(row => groupValueCache.set(row, String(this.getLazyAwareValue(groupKey, row) ?? '')));\n\n // Pré-calcul des valeurs de tri (évite O(n log n) × getLazyAwareValue dans le comparateur)\n let fastCompareFn: ((a: T, b: T) => number) | null = null;\n if (effectiveSort.active && effectiveSort.direction) {\n const sortValueCache = new Map<T, any>();\n rows.forEach(row => sortValueCache.set(row, this.getLazyAwareValue(effectiveSort.active, row)));\n const dir = effectiveSort.direction;\n fastCompareFn = (a: T, b: T): number => {\n const va = sortValueCache.get(a);\n const vb = sortValueCache.get(b);\n let cmp = 0;\n if (typeof va === 'number' && typeof vb === 'number') {\n cmp = va < vb ? -1 : va > vb ? 1 : 0;\n } else {\n const sa = va == null ? '' : String(va).toLowerCase();\n const sb = vb == null ? '' : String(vb).toLowerCase();\n cmp = sa < sb ? -1 : sa > sb ? 1 : 0;\n }\n return dir === 'asc' ? cmp : -cmp;\n };\n }\n\n const sorted = [...rows].sort((a, b) => {\n const va = groupValueCache.get(a)!;\n const vb = groupValueCache.get(b)!;\n const cmp = va.localeCompare(vb);\n return this._groupBy.groupSortOrder === 'desc' ? -cmp : cmp;\n });\n\n groupOrder = [];\n groupMap = new Map<string, T[]>();\n sorted.forEach((row) => {\n const groupValue = groupValueCache.get(row)!;\n if (!groupMap.has(groupValue)) {\n groupOrder.push(groupValue);\n groupMap.set(groupValue, []);\n }\n groupMap.get(groupValue)!.push(row);\n });\n\n // Tri intra-groupe stocké dans le cache — évite le re-tri sur collapse/expand/pagination\n if (fastCompareFn) {\n const fn = fastCompareFn;\n groupMap.forEach((groupRows, key) => {\n groupMap.set(key, [...groupRows].sort(fn));\n });\n }\n\n // Mise en cache\n this._groupCache = {\n rows,\n key: groupKey,\n sortOrder: this._groupBy.groupSortOrder,\n sortActive: effectiveSort.active ?? '',\n sortDir: effectiveSort.direction ?? '',\n order: groupOrder,\n map: groupMap,\n };\n }\n\n this._totalFilteredCount = rows.length;\n\n // Protection contre les jeux de données à trop haute cardinalité\n if (groupOrder.length > TableComponent.MAX_GROUP_COUNT) {\n return [{ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: GROUP_KEY_TOO_MANY, [ROW_GROUP_COUNT]: groupOrder.length, [ROW_GROUP_PAGE]: 0, [ROW_GROUP_PAGE_COUNT]: 1 }];\n }\n\n const pageSize = this.groupPageSize;\n const result: any[] = [];\n\n groupOrder.forEach((groupValue) => {\n const groupRows = groupMap.get(groupValue)!;\n const totalCount = groupRows.length;\n const currentPage = pageSize === 0 ? 0 : this._groupBy.getPage(groupValue);\n const pageCount = pageSize === 0 ? 1 : Math.max(1, Math.ceil(totalCount / pageSize));\n const collapsed = this.isGroupCollapsed(groupValue);\n\n result.push({ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: groupValue, [ROW_GROUP_COUNT]: totalCount, [ROW_GROUP_PAGE]: currentPage, [ROW_GROUP_PAGE_COUNT]: pageCount });\n\n if (!collapsed) {\n const start = pageSize === 0 ? 0 : currentPage * pageSize;\n const end = pageSize === 0 ? totalCount : Math.min(start + pageSize, totalCount);\n groupRows.slice(start, end).forEach((row, i) => {\n const idx = start + i;\n const projected: any = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };\n this.activeColumns.forEach((col) => {\n projected[col.key] = this.resolveCellValue(col, row, idx);\n });\n result.push(projected);\n });\n }\n });\n\n return result;\n }\n\n private _buildSortComparator(): ((a: T, b: T) => number) | null {\n const sort = this._activeSort.active && this._activeSort.direction\n ? this._activeSort\n : this.resolvedConfig.defaultSort ?? { active: '', direction: '' as const };\n const { active, direction } = sort;\n if (!active || !direction) return null;\n return (a: T, b: T): number => {\n const va = this.getLazyAwareValue(active, a);\n const vb = this.getLazyAwareValue(active, b);\n let cmp = 0;\n if (typeof va === 'number' && typeof vb === 'number') {\n cmp = va < vb ? -1 : va > vb ? 1 : 0;\n } else {\n const sa = va == null ? '' : String(va).toLowerCase();\n const sb = vb == null ? '' : String(vb).toLowerCase();\n cmp = sa < sb ? -1 : sa > sb ? 1 : 0;\n }\n return direction === 'asc' ? cmp : -cmp;\n };\n }\n\n /**\n * Retourne la valeur telle qu'elle est affichée dans la cellule, en suivant exactement\n * le même chemin que resolveCellValue — utilisée pour la recherche plein-texte.\n * Ne passe pas par sortValue (valeur brute de tri) contrairement à getLazyAwareValue.\n */\n private getDisplayValueForSearch(col: TableColumnProvider<T>, row: T): any {\n if (col.lazy) {\n const status = this._lazyColumnStatus.get(col.key) ?? 'idle';\n if (status !== 'loaded') return null;\n const rowMap = this._lazyColumnData.get(col.key);\n return normalizeCellValue(rowMap?.get(row) ?? '');\n }\n if (col.searchValue) {\n return col.searchValue(row, 0);\n }\n const rawValue = col.value ? col.value(row, 0) : (row as any)?.[col.key];\n return normalizeCellValue(rawValue);\n }\n\n private getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = this._columnMap.get(columnKey);\n if (colDef?.lazy) {\n return this._lazyColumnData.get(columnKey)?.get(row) ?? null;\n }\n if (colDef?.sortValue) {\n return normalizeCellValue(colDef.sortValue(row, 0));\n }\n if (colDef?.value) {\n return normalizeCellValue(colDef.value(row, 0));\n }\n return (row as any)[columnKey];\n }\n\n private resolveCellValue(col: TableColumnProvider<T>, row: T, index: number): any {\n if (col.lazy) {\n const status = this._lazyColumnStatus.get(col.key) ?? 'idle';\n if (status === 'loading') return LAZY_LOADING_VALUE;\n if (status === 'error') return LAZY_ERROR_VALUE;\n if (status === 'loaded') {\n const rowMap = this._lazyColumnData.get(col.key);\n return normalizeCellValue(rowMap?.get(row) ?? '');\n }\n return '';\n }\n const valueProvider = col.value;\n const rawValue = valueProvider ? valueProvider(row, index) : (row as any)?.[col.key];\n return normalizeCellValue(rawValue);\n }\n\n private resolvePageSize(): number {\n return Math.max(1, this.resolvedConfig.pagination?.pageSize || this.pageSize || 5);\n }\n\n private resolvePageSizeOptions(): number[] {\n const options = this.resolvedConfig.pagination?.pageSizeOptions || [5, 10, 20];\n const unique = [...new Set(options.filter((value) => value > 0))];\n\n if (!unique.includes(this.pageSize)) {\n unique.push(this.pageSize);\n }\n\n return unique.sort((a, b) => a - b);\n }\n\n private resolvePageSizeOptionsGroupBy(): number[] {\n const options = this.resolvedConfig.pagination?.pageSizeOptionsGroupBy || this.resolvedConfig.pagination?.pageSizeOptions || [5, 10, 20];\n const unique = [...new Set(options.filter((v) => v > 0))];\n if (this.groupPageSize > 0 && !unique.includes(this.groupPageSize)) {\n unique.push(this.groupPageSize);\n }\n return unique.sort((a, b) => a - b);\n }\n\n private resolveDefaultGroupPageSize(): number {\n const cfg = this.resolvedConfig;\n const options = cfg.pagination?.pageSizeOptionsGroupBy || cfg.pagination?.pageSizeOptions;\n if (options?.length) return options[0];\n return cfg.pagination?.pageSize || 5;\n }\n\n private uniqueColumnsByKey(columns: TableColumnProvider<T>[]): TableColumnProvider<T>[] {\n const seen = new Set<string>();\n return columns.filter((column) => {\n if (seen.has(column.key)) {\n return false;\n }\n seen.add(column.key);\n return true;\n });\n }\n\n private attachPaginator(): void {\n if (!this.showPagination) {\n this.tableDataSource.paginator = null;\n return;\n }\n if (!this.paginator) return;\n\n this.tableDataSource.paginator = null;\n this.paginator.pageSize = this.pageSize;\n\n if (this._paginatorSubscribed !== this.paginator) {\n this._paginatorSubscribed = this.paginator;\n this.paginator.page.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this.pageSize = this.paginator!.pageSize;\n this.pageChange.emit({ pageIndex: this.paginator!.pageIndex, pageSize: this.paginator!.pageSize });\n if (this._pendingRender !== null) return;\n this._projectCurrentPage();\n this._cdr.markForCheck();\n });\n }\n }\n\n private attachSort(): void {\n if (!this.sort) return;\n\n this.tableDataSource.sort = null as any;\n\n if (this._sortSubscribed !== this.sort) {\n this._sortSubscribed = this.sort;\n this.sort.sortChange.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this._activeSort = {\n active: this.sort.active,\n direction: this.sort.direction,\n };\n this.sortChange.emit({ active: this.sort.active, direction: this.sort.direction });\n this._scheduleRender();\n });\n }\n }\n}\n","<section class=\"jquery-table-wrapper\">\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">×</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showViewButton\" class=\"table-toolbar-right\">\n <button *ngIf=\"showViewButton\" type=\"button\" class=\"view-btn\" [matMenuTriggerFor]=\"viewMenu\" #viewMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"view-btn-icon\">settings</mat-icon>\n </button>\n\n <mat-menu #viewMenu=\"matMenu\" [panelClass]=\"'view-menu-panel'\">\n <button *ngIf=\"showFields\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuFields }}</span>\n <span class=\"view-menu-sub-value\">{{ visibleColumns.length }}/{{ totalColumnCount }}</span>\n </button>\n <button *ngIf=\"showGroupBySection\" mat-menu-item [matMenuTriggerFor]=\"groupBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuGroupBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeGroupByLabel }}</span>\n </button>\n <button *ngIf=\"showAddSliceButton\" mat-menu-item [matMenuTriggerFor]=\"sliceBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuSliceBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeSliceByLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showExportButton\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showExportButton\" mat-menu-item type=\"button\" class=\"view-menu-export-item\"\n (click)=\"onExport(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-export-icon\">download</mat-icon>\n <span class=\"view-menu-sub-label\">{{ i18n.exportButtonLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showPreferencesMenu\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showPreferencesMenu\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.preferencesMenuLabel }}</span>\n </button>\n </mat-menu>\n\n <mat-menu #preferencesSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"enterEditMode(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">edit</mat-icon>\n {{ i18n.preferencesEdit }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"savePreferences(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">save</mat-icon>\n {{ i18n.preferencesSave }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" [disabled]=\"!hasSavedPreferences\" (mousedown)=\"clearPreferences(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">delete_outline</mat-icon>\n {{ i18n.preferencesClear }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #fieldsSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuBaseColumns\"\n [disabled]=\"!column.optional && !allowColumnRemoval\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n </button>\n <ng-container *ngIf=\"menuOptionalColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuOptionalColumns\"\n [disabled]=\"(isColumnVisible(column.key) && visibleColumns.length === 1) || getLazyColumnStatus(column.key) === 'loading'\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'loading'\" class=\"lazy-menu-spinner\">↻</span>\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'error'\" class=\"lazy-menu-error\" [title]=\"i18n.lazyErrorMenuTitle\">⚠</span>\n </button>\n </ng-container>\n </div>\n </mat-menu>\n\n <mat-menu #groupBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of groupByColumns\"\n [class.active]=\"activeGroupByKey === col.key\"\n (mousedown)=\"onGroupByChange(activeGroupByKey === col.key ? null : col.key)\">\n <span class=\"view-menu-check\">{{ activeGroupByKey === col.key ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #sliceBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let item of sliceByMenuItems\"\n [class.active]=\"isSliceMenuItemActive(item)\"\n (mousedown)=\"onSliceMenuItemClick(item)\">\n <span class=\"view-menu-check\">{{ isSliceMenuItemActive(item) ? '✓' : '' }}</span>\n <mat-icon *ngIf=\"item.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ item.icon }}</mat-icon>\n {{ item.title }}\n </button>\n </div>\n </mat-menu>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Bannière message préférences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode édition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n <!-- Poignée de resize (visible uniquement en mode édition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">⚠</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null)\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">›</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">‹</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">›</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n (click)=\"onGroupHeaderClick(row)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showFirstLastButtons]=\"resolvedPaginationShowFirstLastButtons\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" *ngIf=\"!isDefaultGroupByActive\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\" *ngIf=\"!isDefaultGroupByActive\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n","/*\n * Public API Surface of jquery-table\n */\n\nexport * from './lib/jquery-table.model';\nexport * from './lib/jqt-i18n.token';\nexport * from './lib/component/table.component';\nexport * from './lib/component/slice-panel/slice-panel.model';\nexport * from './lib/component/slice-panel/slice-panel.component';\nexport * from './lib/directive/jqt-cell-def.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i8"],"mappings":"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"}
1
+ {"version":3,"file":"oneteme-jquery-table.mjs","sources":["../../../../projects/oneteme/jquery-table/src/lib/jquery-table.model.ts","../../../../projects/oneteme/jquery-table/src/lib/jqt-i18n.token.ts","../../../../projects/oneteme/jquery-table/src/lib/directive/jqt-cell-def.directive.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.utils.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table-preferences.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/export.manager.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.constants.ts","../../../../projects/oneteme/jquery-table/src/lib/component/organizer-button/organizer-button.component.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.component.ts","../../../../projects/oneteme/jquery-table/src/lib/component/table.component.html","../../../../projects/oneteme/jquery-table/src/public-api.ts","../../../../projects/oneteme/jquery-table/src/oneteme-jquery-table.ts"],"sourcesContent":["import { DataProvider } from '@oneteme/jquery-core';\nimport { Observable } from 'rxjs';\nimport { SliceConfig } from '@oneteme/jquery-organizer';\nexport { SliceConfig } from '@oneteme/jquery-organizer';\n\nexport interface TableColumnProvider<T = any> {\n key: string;\n /** Libellé affiché dans l'en-tête de colonne. Optionnel si la colonne utilise un template custom. */\n header?: string;\n icon?: string;\n value?: DataProvider<any>;\n /** Valeur utilisée pour le tri si différente de `value`. Utile quand `value` retourne une chaîne formatée (date, durée...). */\n sortValue?: DataProvider<any>;\n /**\n * Valeur utilisée pour la recherche plein-texte.\n * À définir quand la colonne utilise un `jqt-cell-def` template personnalisé et qu'aucun `value` provider n'est déclaré.\n * Si absent, la recherche utilise `value` en priorité, puis la valeur brute de la ligne.\n * Exemple : `searchValue: (row) => durationPipe.transform((today - row.start) / 1000)`\n */\n searchValue?: DataProvider<string>;\n sortable?: boolean;\n removable?: boolean;\n optional?: boolean;\n width?: string;\n groupable?: boolean;\n sliceable?: boolean;\n /** Chargement différé : la présence de cet objet active le mode lazy. */\n lazy?: {\n /** Fonction appelée pour charger les valeurs de la colonne. Retourne un tableau dans le même ordre que les lignes. */\n fetchFn: () => Observable<any[]>;\n };\n}\n\n/** Configuration de la barre de recherche. */\nexport interface TableSearchConfig {\n enabled?: boolean;\n /** Valeur initiale au chargement. */\n initialQuery?: string;\n /** Restreint la recherche texte aux colonnes dont la `key` est dans ce tableau. Si absent, toutes les colonnes sont cherchées. */\n searchColumns?: string[];\n}\n\n/** Configuration de la pagination. */\nexport interface TablePaginationConfig {\n enabled?: boolean;\n pageSize?: number;\n pageSizeOptions?: number[];\n showFirstLastButtons?: boolean;\n /** Options de taille de page spécifiques au mode Group by. Si absent, utilise `pageSizeOptions`. */\n pageSizeOptionsGroupBy?: number[];\n}\n\n/** Configuration du menu View (Champs / Group by / Slice by). */\nexport interface TableViewConfig {\n /** Active le bouton View. Par défaut : `false`. */\n enabled?: boolean;\n /** Autorise le masquage/affichage des colonnes de base via View > Champs. Par défaut : `true`. */\n enableColumnRemoval?: boolean;\n /** Active le drag & drop pour réordonner les colonnes. Par défaut : `false`. */\n enableColumnDragDrop?: boolean;\n}\n\n/** Labels d'état du tableau. */\nexport interface TableLabelsConfig {\n /** Affiché quand le tableau est vide. Par défaut : `'Aucune donnée'`. */\n empty?: string;\n /** Affiché pendant le chargement. Par défaut : `'Chargement des données...'`. */\n loading?: string;\n}\n\n/**\n * Raccourci pour déclarer une colonne de base.\n *\n * ```ts\n * columns: [\n * col('name', 'Nom'),\n * col('status', 'Statut', { sortable: false }),\n * ]\n * ```\n */\nexport function col<T = any>(\n key: string,\n header: string,\n overrides?: Partial<TableColumnProvider<T>>,\n): TableColumnProvider<T> {\n return { key, header, ...overrides };\n}\n\n/** Configuration de l’export CSV déclenché depuis la toolbar. */\nexport interface TableExportConfig<T = any> {\n /** Affiche le bouton Export dans la toolbar. Par défaut : `true`. */\n enabled?: boolean;\n /** Nom du fichier généré. Par défaut : `'export.csv'`. */\n filename?: string;\n /**\n * Transforme chaque ligne avant export.\n * Si absent, les valeurs affichées (après `normalizeCellValue`) sont utilisées.\n * Seules les colonnes visibles sont exportées.\n */\n transform?: (row: T) => Record<string, string>;\n}\n/**\n * Configuration de la fonctionnalité Préférences.\n *\n * Ajoute un menu \"Préférences\" dans View qui permet :\n * - Le **mode édition** (redimensionner / réordonner les colonnes à la souris)\n * - L'**enregistrement** de la configuration courante dans le localStorage\n * - L'**effacement** de la configuration sauvegardée\n *\n * Chaque tableau est identifié par `tableId` (clé localStorage unique).\n */\nexport interface TablePreferencesConfig {\n /** Active la fonctionnalité. Par défaut : `true`. */\n enabled?: boolean;\n /**\n * Identifiant unique du tableau, utilisé comme clé localStorage.\n * Doit être stable entre les rechargements de page.\n * Si absent, un identifiant est dérivé automatiquement des clés de colonnes.\n * Exemple : `'user-table'`, `'invoice-list'`.\n */\n tableId?: string;\n}\n\n/** Snapshot de configuration persisté dans le localStorage. */\nexport interface SavedTableConfig {\n /** Valeur de la searchbar. */\n search?: string;\n /** Clé de la colonne utilisée pour le group by. `null` = aucun. */\n groupBy?: string | null;\n /** Ordre des clés de colonnes (position). */\n columnOrder?: string[];\n /** Clés des colonnes visibles. */\n visibleColumns?: string[];\n /** Largeurs de colonnes en pixels, indexées par clé. */\n columnWidths?: Record<string, number>;\n /** Panneau slice replié ou non. */\n slicePanelCollapsed?: boolean;\n /** Clés des slices statiques cachées par l'utilisateur (via toggle dans le menu View). */\n hiddenSliceKeys?: string[];\n /** Clés des colonnes utilisées comme slices dynamiques. */\n dynamicSliceKeys?: string[];\n /** Filtres actifs du slice panel : map sliceIndex → tableau de clés actives. */\n sliceFilters?: Record<number, string[]>;\n}\nexport interface TableProvider<T = any> {\n columns?: TableColumnProvider<T>[];\n title?: string;\n slices?: SliceConfig<T>[];\n /** Affiche le bouton toggle pour replier/déplier le panneau de slices. Par défaut : `true`. */\n enableSliceToggle?: boolean;\n /**\n * Permet de vider search bar depuis config\n * Changez cette valeur (ex: route courante, compteur, timestamp) pour déclencher un reset.\n */\n clearSearchInput?: string | number | boolean | null;\n search?: TableSearchConfig;\n pagination?: TablePaginationConfig;\n view?: TableViewConfig;\n labels?: TableLabelsConfig;\n /** Tri initial appliqué au chargement. N'est pas écrasé par les changements de données. */\n defaultSort?: { active: string; direction: 'asc' | 'desc' };\n /** Clé de colonne à utiliser comme group-by par défaut au chargement. N'est pas écrasé par les changements de données ni par un reset explicite de l'utilisateur. */\n defaultGroupBy?: string | null;\n rowClass?: (row: T, index: number) => string | string[] | Record<string, boolean>;\n /** Callback déclenché quand l'utilisateur clique sur une ligne. Alternative au `(rowSelected)` Output. */\n onRowSelected?: (row: T, event: MouseEvent | null) => void;\n /** Configuration de l'export CSV. */\n export?: TableExportConfig<T>;\n /** Configuration de la fonctionnalité Préférences (édition + persistance localStorage). */\n preferences?: TablePreferencesConfig;\n}\n\n\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Labels de l'interface utilisateur de jquery-table.\n *\n * Fournir ce token au niveau du module ou du composant racine pour localiser\n * ou personnaliser tous les textes de la bibliothèque en un seul endroit :\n *\n * ```ts\n * providers: [\n * { provide: JQT_I18N, useValue: { searchPlaceholder: 'Search…', emptyState: 'No data' } }\n * ]\n * ```\n *\n * Tous les champs sont optionnels : seul ce que vous fournissez écrase les\n * valeurs par défaut françaises.\n */\nexport interface JqtI18n {\n /** Placeholder de la barre de recherche. */\n searchPlaceholder: string;\n /** Titre du bouton pour déplier le panneau de filtres. */\n expandFilterTitle: string;\n /** Titre du bouton pour replier le panneau de filtres. */\n collapseFilterTitle: string;\n /** Label du sous-menu \"Champs\" dans View. */\n viewMenuFields: string;\n /** Label du sous-menu \"Group by\" dans View. */\n viewMenuGroupBy: string;\n /** Label du sous-menu \"Slice by\" dans View. */\n viewMenuSliceBy: string;\n /** Label affiché quand aucune option n'est sélectionnée (groupe, slice). */\n viewNoneSelected: string;\n /** Bouton \"Retirer le groupe\" dans la barre de groupe. */\n groupRemove: string;\n /** Label \"Trier :\" dans la barre de groupe. */\n groupSortLabel: string;\n /** Tooltip tri ascendant. */\n groupSortAsc: string;\n /** Tooltip tri descendant. */\n groupSortDesc: string;\n /** Label \"Lignes par groupe\" dans le sélecteur de taille de groupe. */\n groupRowsPerGroup: string;\n /** Option \"Toutes\" (afficher toutes les lignes sans pagination de groupe). */\n groupShowAll: string;\n /** Message quand le groupe dépasse le nombre maximal autorisé. Reçoit le nombre de groupes. */\n groupTooMany: (count: number) => string;\n /** Label du bouton de réessai pour une colonne lazy en erreur. */\n lazyRetry: string;\n /** Tooltip du bouton de réessai. */\n lazyErrorTitle: string;\n /** Tooltip de l'icône d'erreur dans le menu View > Champs. */\n lazyErrorMenuTitle: string;\n /** Valeur affichée dans une cellule vide (null / undefined / ''). */\n cellEmpty: string;\n /** Message quand le tableau est vide. */\n emptyState: string;\n /** Message pendant le chargement (`[isLoading]=\"true\"`). */\n loadingState: string;\n /** Titre du panneau de filtres latéral. Reçoit le nombre de blocs de filtres actifs. */\n filterPanelTitle: (count: number) => string;\n /** Titre par défaut d'un bloc de filtre sans `title` configuré. */\n filterBlockDefaultTitle: string;\n /** Message dans un bloc de filtre sans catégories correspondantes. */\n filterEmptyState: string;\n /** Label du bouton d'export CSV. */\n exportButtonLabel: string;\n /** Label du menu Préférences dans View. */\n preferencesMenuLabel: string;\n /** Sous-item : activer le mode édition. */\n preferencesEdit: string;\n /** Sous-item : enregistrer la config. */\n preferencesSave: string;\n /** Sous-item : effacer la config. */\n preferencesClear: string;\n /** Message de confirmation après enregistrement. */\n preferencesSavedMessage: string;\n /** Message de confirmation après effacement. */\n preferencesClearedMessage: string;\n /** Tooltip du bouton de validation du mode édition. */\n preferencesConfirmEdit: string;\n}\n\n/** Valeurs par défaut (français). Toutes les propriétés sont garanties non nulles. */\nexport const JQT_I18N_DEFAULTS: JqtI18n = {\n searchPlaceholder: 'Rechercher...',\n expandFilterTitle: 'Déplier le filtre',\n collapseFilterTitle: 'Replier le filtre',\n viewMenuFields: 'Champs',\n viewMenuGroupBy: 'Grouper par',\n viewMenuSliceBy: 'Filtrer par',\n viewNoneSelected: 'Aucun',\n groupRemove: 'Retirer le groupe',\n groupSortLabel: 'Trier :',\n groupSortAsc: 'A → Z',\n groupSortDesc: 'Z → A',\n groupRowsPerGroup: 'Lignes par groupe :',\n groupShowAll: 'Toutes',\n groupTooMany: (count) => `⚠ Trop de groupes (${count}) — affinez les données ou choisissez une autre colonne`,\n lazyRetry: 'Réessayer',\n lazyErrorTitle: 'Erreur de chargement — cliquer pour réessayer',\n lazyErrorMenuTitle: 'Erreur de chargement',\n cellEmpty: 'N/A',\n emptyState: 'Aucune donnée',\n loadingState: 'Chargement des données...',\n filterPanelTitle: (count) => count > 1 ? 'Filtres' : 'Filtre',\n filterBlockDefaultTitle: 'Filtrer',\n filterEmptyState: 'Aucune donnée',\n exportButtonLabel: 'Exporter',\n preferencesMenuLabel: 'Préférences',\n preferencesEdit: 'Éditer',\n preferencesSave: 'Sauvegarder',\n preferencesClear: 'Réinitialiser',\n preferencesSavedMessage: 'Configuration enregistrée. Vous pouvez la réinitialiser à tout moment via Préférences → Réinitialiser.',\n preferencesClearedMessage: 'Configuration réinitialisée.',\n preferencesConfirmEdit: 'Valider les modifications',\n};\n\n/**\n * Token d'injection pour surcharger tout ou partie des labels de jquery-table.\n * Accepte un `Partial<JqtI18n>` — seules les clés fournies écrasent les défauts.\n */\nexport const JQT_I18N = new InjectionToken<Partial<JqtI18n>>('JQT_I18N');\n","import { Directive, Input, TemplateRef } from '@angular/core';\n\n/**\n * Directive permettant de définir un template de cellule personnalisé pour une colonne.\n *\n * Usage:\n * ```html\n * <jquery-table [config]=\"tableConfig\">\n * <ng-template jqtCellDef=\"monKey\" let-row>\n * <span>{{ row.monChamp }}</span>\n * </ng-template>\n * </jquery-table>\n * ```\n * Le contexte expose `$implicit` (ligne brute `T`) et `index` (index global).\n */\n@Directive({\n selector: '[jqtCellDef]',\n standalone: true,\n})\nexport class JqtCellDefDirective {\n /** Clé de la colonne à laquelle ce template s'applique. */\n @Input('jqtCellDef') columnKey: string = '';\n\n constructor(public readonly template: TemplateRef<{ $implicit: any; index: number }>) {}\n}\n","import { MatPaginatorIntl } from '@angular/material/paginator';\n\n/** Traductions françaises du paginator Material. */\nexport function getFrenchPaginatorIntl(): MatPaginatorIntl {\n const intl = new MatPaginatorIntl();\n intl.itemsPerPageLabel = 'Éléments par page :';\n intl.nextPageLabel = 'Page suivante';\n intl.previousPageLabel = 'Page précédente';\n intl.firstPageLabel = 'Première page';\n intl.lastPageLabel = 'Dernière page';\n intl.getRangeLabel = (page: number, pageSize: number, length: number) => {\n if (length === 0 || pageSize === 0) return `0 sur ${length}`;\n length = Math.max(length, 0);\n const start = page * pageSize;\n const end = start < length ? Math.min(start + pageSize, length) : start + pageSize;\n return `${start + 1} – ${end} sur ${length}`;\n };\n return intl;\n}\n\n/**\n * Convertit une valeur brute en chaîne affichable.\n * - null/undefined → ''\n * - Date → format locale fr-FR\n * - Tableau → valeurs jointes par ', '\n * - Objet avec label/name → sa valeur string\n * - Autres → String(value)\n */\nexport function normalizeCellValue(value: any): any {\n if (value === null || value === undefined) {\n return '';\n }\n if (value instanceof Date) {\n return value.toLocaleString();\n }\n if (Array.isArray(value)) {\n return value.map((item) => normalizeCellValue(item)).join(', ');\n }\n if (typeof value === 'object') {\n if ('label' in value && value.label !== undefined) {\n return String(value.label);\n }\n if ('name' in value && value.name !== undefined) {\n return String(value.name);\n }\n return JSON.stringify(value);\n }\n return value;\n}\n\n/**\n * Transforme une clé camelCase/snake_case en libellé lisible.\n * Ex: 'createdAt' → 'Created at', 'my_field' → 'My field'\n */\nexport function humanizeKey(key: string): string {\n return key\n .replaceAll(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replaceAll(/[_-]+/g, ' ')\n .replace(/^./, (value) => value.toUpperCase());\n}\n","import { SavedTableConfig } from '../jquery-table.model';\n\nconst STORAGE_PREFIX = 'jqt_prefs_';\n\n/**\n * Gère la persistance de la configuration d'un tableau dans le localStorage.\n * Identifie chaque tableau par un `tableId` unique fourni par l'utilisateur.\n */\nexport class TablePreferencesManager {\n readonly key: string;\n\n constructor(tableId: string) {\n this.key = STORAGE_PREFIX + tableId;\n }\n\n /** Retourne la configuration sauvegardée, ou `null` si absente / corrompue. */\n load(): SavedTableConfig | null {\n try {\n const raw = localStorage.getItem(this.key);\n return raw ? (JSON.parse(raw) as SavedTableConfig) : null;\n } catch {\n return null;\n }\n }\n\n /** Persiste la configuration dans le localStorage. */\n save(config: SavedTableConfig): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(config));\n } catch {\n // localStorage peut être indisponible (mode privé strict, quota dépassé…)\n }\n }\n\n /** Supprime la configuration sauvegardée. */\n clear(): void {\n localStorage.removeItem(this.key);\n }\n\n /** Indique si une configuration est actuellement sauvegardée. */\n hasSaved(): boolean {\n return localStorage.getItem(this.key) !== null;\n }\n}\n","import { TableColumnProvider, TableExportConfig } from '../jquery-table.model';\n\n/**\n * ExportManager\n *\n * Encapsule l'export CSV : construction du fichier BOM/UTF-8, échappement et déclenchement du téléchargement.\n * Aucune dépendance Angular — indépendant du cycle de vie du composant.\n */\nexport class ExportManager<T> {\n constructor(\n private readonly getRows: () => T[],\n private readonly getColumns: () => TableColumnProvider<T>[],\n private readonly getConfig: () => TableExportConfig<T> | undefined,\n private readonly resolveCellValue: (col: TableColumnProvider<T>, row: T, index: number) => any,\n ) {}\n\n export(): void {\n const cfg = this.getConfig();\n if (!cfg?.enabled) return;\n const rows = this.getRows();\n const columns = this.getColumns();\n const filename = (cfg.filename || 'export') + '.csv';\n\n const header = columns.map(c => this._csvEscape(c.header || c.key)).join(',');\n const lines = rows.map((row, idx) => {\n if (cfg.transform) {\n const t = cfg.transform(row);\n return columns.map(c => this._csvEscape(String(t[c.key] ?? ''))).join(',');\n }\n return columns.map(c => this._csvEscape(String(this.resolveCellValue(c, row, idx) ?? ''))).join(',');\n });\n\n // BOM UTF-8 pour une ouverture correcte sous Excel\n const blob = new Blob(['\\uFEFF' + [header, ...lines].join('\\n')], { type: 'text/csv;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename.endsWith('.csv') ? filename : filename + '.csv';\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private _csvEscape(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return '\"' + value.replace(/\"/g, '\"\"') + '\"';\n }\n return value;\n }\n}\n","/**\n * Constantes sentinel utilisées pour les identifiants de colonnes et les valeurs\n * projetées dans le datasource interne de la table.\n *\n * Centraliser ici évite les typos silencieuses et facilite les tests unitaires.\n */\n\n/** Identifiant de la colonne virtuelle rendue sur toute la largeur pour les en-têtes de groupe. */\nexport const GROUP_ROW_COLUMN = '__group_row';\n\n/** Marqueur posé sur les objets de ligne pour signaler une ligne d'en-tête de groupe. */\nexport const GROUP_HEADER_MARKER = '__groupHeader';\n\n/** Clé du groupe spéciale « chargement lazy en cours ». */\nexport const GROUP_KEY_LAZY_LOADING = '__lazy_loading__';\n\n/** Clé du groupe spéciale « trop de groupes ». */\nexport const GROUP_KEY_TOO_MANY = '__too_many_groups__';\n\n/** Propriété injectée dans chaque ligne projetée : référence vers la ligne brute d'origine. */\nexport const ROW_RAW_KEY = '__raw';\n\n/** Propriété injectée dans chaque ligne projetée : index global de la ligne dans le jeu de données filtré. */\nexport const ROW_INDEX_KEY = '__index';\n\n/** Propriété injectée dans chaque ligne projetée : clé du groupe auquel appartient la ligne d'en-tête. */\nexport const ROW_GROUP_KEY = '__groupKey';\n\n/** Propriété injectée dans chaque ligne projetée : nombre de lignes dans le groupe. */\nexport const ROW_GROUP_COUNT = '__groupCount';\n\n/** Propriété injectée dans chaque ligne projetée : page courante du groupe. */\nexport const ROW_GROUP_PAGE = '__groupPage';\n\n/** Propriété injectée dans chaque ligne projetée : nombre de pages du groupe. */\nexport const ROW_GROUP_PAGE_COUNT = '__groupPageCount';\n\n/** Valeur sentinelle posée dans une cellule lazy en cours de chargement. */\nexport const LAZY_LOADING_VALUE = '__lazy_loading__';\n\n/** Valeur sentinelle posée dans une cellule lazy en erreur. */\nexport const LAZY_ERROR_VALUE = '__lazy_error__';\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { OrganizerButtonComponent, OrganizerConfig, OrganizerButtonEvent, OrganizerState, OrganizerSliceState } from '@oneteme/jquery-organizer';\n\n@Component({\n standalone: true,\n selector: 'table-organizer-button',\n imports: [OrganizerButtonComponent],\n template: `\n <organizer-button\n [config]=\"config\"\n [state]=\"state\"\n [hideMenuValues]=\"hideMenuValues\"\n (viewChange)=\"viewChange.emit($event)\"\n (sliceStateChange)=\"sliceStateChange.emit($event)\">\n </organizer-button>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class OrganizerButtonWrapperComponent {\n @Input() config!: OrganizerConfig;\n @Input() state?: OrganizerState;\n @Input() hideMenuValues = false;\n @Output() viewChange = new EventEmitter<OrganizerButtonEvent>();\n @Output() sliceStateChange = new EventEmitter<OrganizerSliceState | null>();\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterContentInit, AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, inject, Input, NgZone, OnChanges, OnDestroy, Output, QueryList, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSort, MatSortModule } from '@angular/material/sort';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { Subject, takeUntil } from 'rxjs';\nimport { TableColumnProvider, TableExportConfig, TablePreferencesConfig, TableProvider, TableViewConfig } from '../jquery-table.model';\nimport { JqtI18n, JQT_I18N, JQT_I18N_DEFAULTS } from '../jqt-i18n.token';\nimport { JqtCellDefDirective } from '../directive/jqt-cell-def.directive';\nimport { SliceConfig, SlicePanelComponent, OrganizerFacade, GroupByManager, LazyFieldManager, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';\nimport { getFrenchPaginatorIntl, humanizeKey, normalizeCellValue } from './table.utils';\nimport { TablePreferencesManager } from './table-preferences.manager';\nimport { ExportManager } from './export.manager';\nimport {\n GROUP_ROW_COLUMN, GROUP_HEADER_MARKER,\n GROUP_KEY_LAZY_LOADING, GROUP_KEY_TOO_MANY,\n ROW_RAW_KEY, ROW_INDEX_KEY,\n ROW_GROUP_KEY, ROW_GROUP_COUNT, ROW_GROUP_PAGE, ROW_GROUP_PAGE_COUNT,\n LAZY_LOADING_VALUE, LAZY_ERROR_VALUE,\n} from './table.constants';\nimport { OrganizerButtonWrapperComponent } from './organizer-button/organizer-button.component';\n\n/** Cache interne du groupement — invalidé dès que les données, la clé ou les paramètres de tri changent. */\ninterface GroupByCache<T> {\n rows: T[];\n key: string;\n sortOrder: 'asc' | 'desc';\n sortActive: string;\n sortDir: string;\n order: string[];\n map: Map<string, T[]>;\n}\n\n@Component({\n standalone: true,\n selector: 'jquery-table',\n imports: [ CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent, OrganizerButtonWrapperComponent ],\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }],\n})\nexport class TableComponent<T = any> implements OnChanges, AfterContentInit, AfterViewInit, OnDestroy {\n @Input() config?: TableProvider<T>;\n\n @Input() dataSource?: T[] | { data: T[] };\n @Input() data?: T[];\n @Input() displayedColumns?: string[];\n @Input() columnsConfig?: TableColumnProvider<T>[];\n\n /**\n * Mode HTML : active et configure le panneau View indépendamment du `[config]`.\n * Prend le dessus sur `config.view` si défini.\n * Exemple : `<jquery-table [view]=\"{ enabled: true }\">`\n */\n @Input() view?: TableViewConfig;\n\n @Input() columnLabels?: Record<string, string>;\n @Input() isLoading = false;\n\n /** Paramètre de contrôle pour réinitialiser barre de recherche. */\n @Input()\n set clearSearchInput(value: boolean | null | undefined) {\n if (value) {\n this.searchQuery = '';\n this.onSearchChange();\n }\n }\n\n @Output() addRequested = new EventEmitter<void>();\n @Output() columnAdded = new EventEmitter<TableColumnProvider<T>>();\n @Output() columnRemoved = new EventEmitter<TableColumnProvider<T>>();\n @Output() categorySelected = new EventEmitter<string>();\n @Output() rowSelected = new EventEmitter<T>();\n\n /** Émis à chaque changement de tri (y compris le tri initial). */\n @Output() sortChange = new EventEmitter<{ active: string; direction: 'asc' | 'desc' | '' }>();\n /** Émis à chaque changement de page ou de taille de page. */\n @Output() pageChange = new EventEmitter<{ pageIndex: number; pageSize: number }>();\n /** Émis à chaque changement de la recherche texte. */\n @Output() searchChange = new EventEmitter<string>();\n /** Émis quand le Group by change (clé de colonne, ou `null` si désactivé). */\n @Output() groupByChange = new EventEmitter<string | null>();\n /** Émis quand la liste des colonnes visibles change (clés dans l’ordre d’affichage). */\n @Output() columnsChange = new EventEmitter<string[]>();\n\n @ViewChild(MatPaginator)\n set paginator(value: MatPaginator | undefined) {\n this._paginator = value;\n if (value) {\n this.attachPaginator();\n this._scheduleRender();\n }\n }\n get paginator(): MatPaginator | undefined { return this._paginator; }\n private _paginator?: MatPaginator;\n @ViewChild(MatSort) sort?: MatSort;\n @ViewChild('tableBodyScroll') tableBodyScrollRef?: ElementRef<HTMLElement>;\n @ViewChild(SlicePanelComponent) slicePanelRef?: SlicePanelComponent<T>;\n @ContentChildren(JqtCellDefDirective) _cellDefs!: QueryList<JqtCellDefDirective>;\n /** Map clé→TemplateRef pré-calculée depuis _cellDefs. Mise à jour dans ngAfterContentInit et sur _cellDefs.changes. */\n private _cellDefMap = new Map<string, TemplateRef<{ $implicit: any; index: number }>>();\n\n renderedColumns: string[] = [];\n tableDataSource = new MatTableDataSource<any>([]);\n\n /** Constante exposée au template pour le matColumnDef de la ligne de groupe. */\n readonly _GROUP_ROW_COLUMN = GROUP_ROW_COLUMN;\n /** Clés d'accès aux propriétés des lignes projetées — exposées pour le template. */\n readonly _ROW_RAW_KEY = ROW_RAW_KEY;\n readonly _ROW_INDEX_KEY = ROW_INDEX_KEY;\n readonly _ROW_GROUP_KEY = ROW_GROUP_KEY;\n readonly _ROW_GROUP_COUNT = ROW_GROUP_COUNT;\n readonly _ROW_GROUP_PAGE = ROW_GROUP_PAGE;\n readonly _ROW_GROUP_PAGE_COUNT = ROW_GROUP_PAGE_COUNT;\n\n /** Facade View : état et actions centralisés (Champs / Group by / Slice by) */\n readonly _organizer = new OrganizerFacade<TableColumnProvider<T>>();\n\n /**\n * Snapshot stable synchronisé depuis _organizer.fields.activeFields dans refreshViewModel().\n * Propriété (non getter) pour qu'Angular puisse la suivre sans NG0100.\n */\n activeFields: TableColumnProvider<T>[] = [];\n\n activeSliceFilter: (row: T) => boolean = () => true;\n\n // Propriétés stables pour les bindings du template (contre erreur NG0100)\n _sliceConfigs: any[] = [];\n _sliceColumns: TableColumnProvider<T>[] = [];\n _sliceData: T[] = [];\n _sliceShowToggle = true;\n /** Snapshot stable de la visibilité du panneau slice — jamais calculé depuis @ViewChild */\n _showSlicePanel = false;\n /** Snapshot stable de l'état collapsed du panneau slice, mis à jour via (collapsedChange) */\n _slicePanelCollapsed = false;\n\n // Délégués vers _view (conservés pour compatibilité template sans refactoring HTML)\n get _staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> { return this._organizer.staticSlicesForMenu; }\n get _activeDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.activeDynamicFields; }\n get _availableColumnsForDynamicSlice(): TableColumnProvider<T>[] { return this._organizer.sliceBy.availableForDynamic; }\n get _allDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.allDynamicFields; }\n get _activeSliceByLabel(): string { return this._organizer.sliceBy.activeLabel; }\n _sliceByMenuItems: Array<{ isStatic: boolean; key: string; title: string; icon?: string; col?: TableColumnProvider<T> }> = [];\n\n searchQuery = '';\n get activeGroupByKey(): string | null { return this._organizer.groupBy.activeKey; }\n _matSortActive = '';\n _matSortDirection: 'asc' | 'desc' | '' = '';\n private _activeSort: { active: string; direction: 'asc' | 'desc' | '' } = { active: '', direction: '' };\n private _sortSubscribed: MatSort | null = null;\n private _destroy$ = new Subject<void>();\n private _totalFilteredCount = 0;\n\n /** Gestionnaire du mode Group By (état collapsed, pagination, tri des groupes). */\n readonly _groupBy = new GroupByManager(\n () => { this._projectCurrentPage(); this._cdr.markForCheck(); },\n () => this.refreshViewModel(),\n );\n\n /** Délégués vers GroupByManager pour la compatibilité des templates. */\n get groupPageSize(): number { return this._groupBy.groupPageSize; }\n set groupPageSize(v: number) { this._groupBy.groupPageSize = v; }\n get groupSortOrder(): 'asc' | 'desc' { return this._groupBy.groupSortOrder; }\n set groupSortOrder(v: 'asc' | 'desc') { this._groupBy.groupSortOrder = v; }\n\n /** Gestionnaire du cycle de vie des colonnes lazy (fetch, annulation, statuts, données). */\n private _lazy = new LazyFieldManager<TableColumnProvider<T>>();\n /** Compatibilité template : retourne la map de statuts lazy. */\n get _lazyColumnStatus() { return this._lazy.status; }\n /** Compatibilité template : retourne la map de données lazy. */\n get _lazyColumnData() { return this._lazy.data; }\n private _cdr = inject(ChangeDetectorRef);\n private _el = inject(ElementRef<HTMLElement>);\n private _ngZone = inject(NgZone);\n private _i18nRaw = inject(JQT_I18N, { optional: true });\n\n /** Labels de l’interface. Fusionnés depuis JQT_I18N_DEFAULTS et le token JQT_I18N injecté. */\n readonly i18n: JqtI18n = { ...JQT_I18N_DEFAULTS, ...(this._i18nRaw ?? {}) };\n\n isGroupHeader = (_: number, row: any): boolean => row[GROUP_HEADER_MARKER] === true;\n\n /** Retourne true si la ligne de groupe est une ligne normale (ni lazy, ni too-many). */\n isNormalGroupRow(row: any): boolean {\n return row[ROW_GROUP_KEY] !== GROUP_KEY_LAZY_LOADING && row[ROW_GROUP_KEY] !== GROUP_KEY_TOO_MANY;\n }\n isGroupRowLoading(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_LAZY_LOADING; }\n isGroupRowTooMany(row: any): boolean { return row[ROW_GROUP_KEY] === GROUP_KEY_TOO_MANY; }\n\n /** Gère le clic sur une ligne d'en-tête de groupe (no-op pour les états spéciaux). */\n onGroupHeaderClick(row: any): void {\n if (!this.isNormalGroupRow(row)) return;\n this.toggleGroupCollapse(row[ROW_GROUP_KEY]);\n }\n\n /** Gestionnaire export CSV. */\n private readonly _export = new ExportManager<T>(\n () => this._allFilteredRows,\n () => this.activeFields,\n () => this.resolvedConfig.export,\n (col, row, idx) => this.resolveCellValue(col, row, idx),\n );\n\n // ── Lifecycle\n\n pageSize = 5;\n pageSizeOptions: number[] = [5, 10, 20];\n pageSizeOptionsGroupBy: number[] = [5, 10, 20];\n\n draggedColumnKey: string | null = null;\n dragOverColumnKey: string | null = null;\n\n // ── Mode édition (Préférences)\n /** Vrai quand le mode édition est actif (resize + drag colonnes, interactions désactivées). */\n _editMode = false;\n /** Largeurs de colonnes personnalisées par l'utilisateur (clé → px). */\n _columnWidths: Record<string, number> = {};\n /** Message de feedback après save/clear. `null` = pas de message. */\n _preferencesMessage: string | null = null;\n /** Vrai si une configuration est sauvegardée pour ce tableau. */\n _hasSavedConfig = false;\n private _preferencesManager: TablePreferencesManager | null = null;\n /** true une fois que le group-by par défaut a été initialisé (évite de reconfigurer GroupByManager à chaque changement de données). */\n private _defaultGroupByApplied = false;\n private _resizeState: { key: string; startX: number; startWidth: number } | null = null;\n /** Dynamic slice keys à restaurer après ngAfterViewInit (slicePanelRef pas encore dispo). */\n private _pendingDynamicSliceKeys: string[] | null = null;\n /** Filtres de slice à restaurer après ngAfterViewInit (slicePanelRef pas encore dispo). */\n private _pendingSliceFilters: Record<number, string[]> | null = null;\n\n private resolvedConfig: TableProvider<T> = { columns: [] };\n private _columnMap: Map<string, TableColumnProvider<T>> = new Map();\n private _resolvedData: T[] = [];\n private _preservePageIndex: number | null = null;\n private _lastConfigClearSearchInput: string | number | boolean | null | undefined;\n\n // Seuil au-delà duquel le rendu groupé est bloqué pour protéger le navigateur\n private static readonly MAX_GROUP_COUNT = 500;\n\n // ── Optimisation performance\n private _allFilteredRows: T[] = [];\n private _paginatorSubscribed: MatPaginator | null = null;\n\n /** Cache groupBy — invalidé dès que rows/key/tri changent. */\n private _groupCache: GroupByCache<T> | null = null;\n private _pendingRender: ReturnType<typeof setTimeout> | null = null;\n\n private _staticSliceHiddenKeys = new Set<string>();\n private _configHiddenKeys = new Set<string>();\n\n\n /** Clés des colonnes visibles du dernier émission columnsChange (pour éviter les émissions dupliquement). */\n private _prevColumnKeys: string[] = [];\n\n ngOnChanges(changes: SimpleChanges): void {\n const dataChanged = !!(changes['config'] || changes['data'] || changes['dataSource']);\n if (dataChanged) {\n this._lazy.cancelAll();\n }\n this.refreshViewModel();\n if (changes['config']) {\n this.applyConfigSearchReset();\n this.applyInitialSearchQuery();\n this._invalidateOrganizerConfig(); // les colonnes ont pu changer\n }\n if (dataChanged) {\n this.activeFields.filter(c => c.lazy).forEach(c => this.triggerLazyFetch(c));\n }\n }\n\n ngAfterContentInit(): void {\n this._rebuildCellDefMap();\n this._cellDefs.changes.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this._rebuildCellDefMap();\n this._cdr.markForCheck();\n });\n }\n\n ngAfterViewInit(): void {\n this.attachPaginator();\n this.attachSort();\n this._measureHeaderHeight();\n this._applyPendingDynamicSliceKeys();\n }\n\n private _applyPendingDynamicSliceKeys(): void {\n const hasPendingDynamic = !!this._pendingDynamicSliceKeys;\n const hasPendingFilters = !!this._pendingSliceFilters;\n if (!hasPendingDynamic && !hasPendingFilters) return;\n\n const allCols = this.resolvedConfig.columns ?? [];\n const keys = hasPendingDynamic ? [...this._pendingDynamicSliceKeys!] : [];\n const filters = this._pendingSliceFilters ? { ...this._pendingSliceFilters } : null;\n this._pendingDynamicSliceKeys = null;\n this._pendingSliceFilters = null;\n\n setTimeout(() => {\n if (this._resolvedData.length === 0) {\n console.log('[SliceRestore] ngAfterViewInit: données absentes, restauration différée à _recomputeShowSlicePanel', { keys, filters });\n if (filters) this._pendingSliceFilters = filters;\n if (keys.length > 0) this._pendingDynamicSliceKeys = [...keys];\n return;\n }\n console.log('[SliceRestore] ngAfterViewInit: données présentes, application immédiate', { keys, filters });\n keys.forEach(key => {\n const col = allCols.find(c => c.key === key);\n if (col) this.addDynamicSlice(col);\n });\n if (filters && this.slicePanelRef) {\n console.log('[SliceRestore] restoreFilters depuis ngAfterViewInit', filters);\n this.slicePanelRef.restoreFilters(filters);\n }\n this._cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n }\n if (this._preferencesMessageTimer !== null) {\n clearTimeout(this._preferencesMessageTimer);\n }\n // Nettoie un éventuel resize en cours (listeners window non retirés)\n this._resizeState = null;\n this._destroy$.next();\n this._destroy$.complete();\n this._organizer.destroy();\n }\n\n private _measureHeaderHeight(): void {\n const measure = () => {\n const headerRow = this._el.nativeElement.querySelector('tr.mat-mdc-header-row') as HTMLElement;\n if (headerRow) {\n const h = headerRow.getBoundingClientRect().height;\n if (h > 0) {\n this._el.nativeElement.style.setProperty('--actual-header-height', h + 'px');\n return;\n }\n }\n // Header pas encore rendu (ex: lazy Angular Material), on réessaie après le prochain frame\n this._ngZone.runOutsideAngular(() => requestAnimationFrame(() => measure()));\n };\n this._ngZone.runOutsideAngular(() => requestAnimationFrame(() => measure()));\n }\n\n private _organizerConfigCache: OrganizerConfig | null = null;\n private _invalidateOrganizerConfig(): void { this._organizerConfigCache = null; }\n get organizerConfig(): OrganizerConfig {\n if (this._organizerConfigCache) return this._organizerConfigCache;\n const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];\n this._organizerConfigCache = {\n fields: this._organizer.showFields ? allCols.map(c => ({\n id: c.key,\n label: this.colLabel(c),\n icon: c.icon,\n state: 'ready' as const,\n })) : undefined,\n groups: this._organizer.showGroupBySection ? this._organizer.groupByFields.map(c => ({\n id: c.key,\n label: this.colLabel(c),\n icon: c.icon,\n })) : undefined,\n slices: this._organizer.showSliceBySection ? this._sliceByMenuItems.map(item => ({\n id: item.key,\n label: item.title,\n icon: item.icon,\n })) : undefined,\n showExport: this.showExportButton,\n onExport: () => this.onExport(),\n showPreferences: this.showPreferencesMenu,\n hasSavedPreferences: this.hasSavedPreferences,\n onPreferencesEdit: () => this.enterEditMode(),\n onPreferencesSave: () => this.savePreferences(),\n onPreferencesClear: () => this.clearPreferences(),\n };\n return this._organizerConfigCache;\n }\n\n get organizerState(): OrganizerState {\n return {\n visibleFields: this.visibleColumns.map(c => c.key),\n selectedGroupBy: this.activeGroupByKey ?? undefined,\n selectedSlices: this._sliceByMenuItems\n .filter(i => this.isSliceMenuItemActive(i))\n .map(i => i.key),\n };\n }\n\n onOrganizerViewChange(event: OrganizerButtonEvent): void {\n if (event.type === 'fieldToggled') {\n const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];\n const newVisible = new Set(event.state.visibleFields ?? []);\n for (const col of allCols) {\n const isNowVisible = newVisible.has(col.key);\n if (this.isColumnVisible(col.key) !== isNowVisible) {\n this.onColumnVisibilityChange(col, isNowVisible);\n }\n }\n } else if (event.type === 'groupBySelected') {\n const newKey = event.state.selectedGroupBy ?? null;\n this.onGroupByChange(newKey === this.activeGroupByKey ? null : newKey);\n } else if (event.type === 'sliceSelected') {\n const prevSlices = new Set(this.organizerState.selectedSlices ?? []);\n const clickedId = (event.state.selectedSlices ?? []).find(id => !prevSlices.has(id));\n if (clickedId) {\n const item = this._sliceByMenuItems.find(i => i.key === clickedId);\n if (item) this.onSliceMenuItemClick(item);\n }\n }\n this._cdr.markForCheck();\n }\n\n get title(): string {\n return this.resolvedConfig.title ?? '';\n }\n\n get showTitle(): boolean {\n return !!this.resolvedConfig.title;\n }\n\n get visibleColumns(): TableColumnProvider<T>[] {\n return this.activeFields;\n }\n\n get showSearchBar(): boolean { return this.resolvedConfig.search?.enabled === true; }\n get showViewButton(): boolean { return this._organizer.enabled || this.showExportButton || this.showPreferencesMenu; }\n get showOrganizerButton(): boolean { return this._organizer.enabled || this.showExportButton || this.showPreferencesMenu; }\n get showSliceExpandBtn(): boolean { return this._showSlicePanel && this._slicePanelCollapsed && this._sliceShowToggle; }\n get showExportButton(): boolean {\n return this.resolvedConfig.export?.enabled === true;\n }\n get showPreferencesMenu(): boolean {\n return this.resolvedConfig.preferences?.enabled === true;\n }\n\n get isDefaultGroupByActive(): boolean {\n if (!this.activeGroupByKey) return false;\n return this.activeGroupByKey === this.resolvedConfig.defaultGroupBy;\n }\n\n get hasSavedPreferences(): boolean { return this._hasSavedConfig; }\n\n get showToolbar(): boolean { return this.showSearchBar || this.showViewButton || this.showSliceExpandBtn; }\n\n expandSlicePanel(): void {\n this.slicePanelRef?.togglePanel();\n }\n get showFields(): boolean { return this._organizer.showFields; }\n get showGroupBySection(): boolean { return this._organizer.showGroupBySection; }\n\n get filteredRowCount(): number {\n return this.activeGroupByKey ? this._totalFilteredCount : this._allFilteredRows.length;\n }\n\n get activeGroupByLabel(): string { return this._organizer.activeGroupByLabel; }\n\n get totalColumnCount(): number { return this._organizer.totalFieldCount; }\n\n get activeSliceByLabel(): string { return this._organizer.sliceBy.activeLabel; }\n\n get activeDynamicSliceColumns(): TableColumnProvider<T>[] { return this._organizer.sliceBy.activeDynamicFields; }\n\n removeDynamicSliceByKey(key: string): void {\n this.slicePanelRef?.removeDynamicSliceByKey(key);\n }\n\n get groupByColumns(): TableColumnProvider<T>[] { return this._organizer.groupByFields; }\n\n colLabel(col: { key: string; header?: string }): string { return this._organizer.fieldLabel(col); }\n\n onSearchChange(): void {\n this._preservePageIndex = 0;\n this.refreshViewModel();\n this.paginator?.firstPage();\n this.searchChange.emit(this.searchQuery);\n }\n\n onGroupByChange(key: string | null): void {\n this._organizer.setGroupBy(key);\n this._groupBy.setDefaultCollapsed(key !== null);\n this._groupBy.reset();\n this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();\n this.refreshViewModel();\n this.paginator?.firstPage();\n this.groupByChange.emit(key);\n if (key) {\n const colDef = (this.resolvedConfig.columns || []).find(c => c.key === key);\n if (colDef?.lazy && this._lazyColumnStatus.get(key) !== 'loaded') {\n this.triggerLazyFetch(colDef);\n }\n } else {\n this._ngZone.runOutsideAngular(() => setTimeout(() => {\n this.tableBodyScrollRef?.nativeElement.scrollTo({ top: 0, behavior: 'smooth' });\n }, 0));\n }\n }\n\n onGroupPageSizeChange(size: number | string): void {\n this._groupBy.onGroupPageSizeChange(Number(size));\n }\n\n onGroupSortToggle(dir: 'asc' | 'desc'): void {\n this._groupBy.onGroupSortToggle(dir, (key) => {\n this._ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToGroupHeader(key), 0));\n });\n }\n\n getLazyColumnStatus(key: string): 'idle' | 'loading' | 'loaded' | 'error' {\n return this._lazy.getStatus(key);\n }\n\n getLazyRenderType(rowValue: any): 'loading' | 'error' | 'value' {\n return this._lazy.getRenderType(rowValue);\n }\n\n retryLazyColumn(column: TableColumnProvider<T>): void {\n this._lazy.retry(column, this._resolvedData, this._lazyCallbacks());\n }\n\n triggerLazyFetch(column: TableColumnProvider<T>): void {\n this._lazy.fetch(column, this._resolvedData, this._lazyCallbacks());\n }\n\n private _lazyCallbacks() {\n return {\n onRefresh: () => this.refreshViewModel(),\n onMarkForCheck: () => this._cdr.markForCheck(),\n };\n }\n\n toggleGroupCollapse(groupKey: string): void {\n this._groupBy.toggleGroupCollapse(groupKey, (key) => {\n this._ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToGroupHeader(key), 0));\n });\n }\n\n private scrollToGroupHeader(groupKey: string): void {\n const container = this.tableBodyScrollRef?.nativeElement;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`tr[data-group-key=\"${CSS.escape(groupKey)}\"]`);\n if (!row) return;\n const headerHeight = parseFloat(\n this._el.nativeElement.style.getPropertyValue('--actual-header-height') || '56'\n ) || 56;\n const containerRect = container.getBoundingClientRect();\n const rowRect = row.getBoundingClientRect();\n const currentScrollTop = container.scrollTop;\n const targetScrollTop = currentScrollTop + (rowRect.top - containerRect.top) - headerHeight;\n container.scrollTo({ top: targetScrollTop, behavior: 'smooth' });\n }\n\n isGroupCollapsed(groupKey: string): boolean {\n return this._groupBy.isGroupCollapsed(groupKey);\n }\n\n groupPageBack(groupKey: string): void {\n this._groupBy.groupPageBack(groupKey);\n }\n\n groupPageForward(groupKey: string, totalCount: number): void {\n this._groupBy.groupPageForward(groupKey, totalCount);\n }\n\n get hasAddableColumns(): boolean {\n return this._organizer.menuBaseFields.length > 0 || this._organizer.menuOptionalFields.length > 0;\n }\n\n get menuBaseColumns(): TableColumnProvider<T>[] {\n return this._organizer.menuBaseFields;\n }\n\n get menuOptionalColumns(): TableColumnProvider<T>[] {\n return this._organizer.menuOptionalFields;\n }\n\n get availableColumnsToAdd(): TableColumnProvider<T>[] {\n const activeKeys = new Set(this.activeFields.map((column) => column.key));\n return (this.resolvedConfig.columns || []).filter((c) => c.optional && !activeKeys.has(c.key));\n }\n\n get allowColumnRemoval(): boolean {\n return this._organizer.allowFieldRemoval;\n }\n\n get hasSliceConfig(): boolean {\n return (this.resolvedConfig.slices?.length ?? 0) > 0;\n }\n\n get showSlicePanel(): boolean {\n return this._showSlicePanel;\n }\n\n onSlicePanelCollapsedChange(collapsed: boolean): void {\n this._slicePanelCollapsed = collapsed;\n this._cdr.markForCheck();\n }\n\n private _recomputeShowSlicePanel(): void {\n const hasCfg = this._sliceConfigs.length > 0 || this._organizer.sliceBy.activeDynamicFields.length > 0;\n const wasVisible = this._showSlicePanel;\n this._showSlicePanel = hasCfg && this._resolvedData.length > 0;\n // Les données viennent d'arriver : appliquer les dynamic slices ET les filtres en attente.\n // Les dynamic slices doivent être ajoutées AVANT restoreFilters car les indices de\n // sliceFilters dépendent de l'ordre final de _cachedSlices.\n if (!wasVisible && this._showSlicePanel && (this._pendingSliceFilters || this._pendingDynamicSliceKeys)) {\n const filters = this._pendingSliceFilters;\n const dynamicKeys = this._pendingDynamicSliceKeys;\n this._pendingSliceFilters = null;\n this._pendingDynamicSliceKeys = null;\n const allCols = this.resolvedConfig.columns ?? [];\n console.log('[SliceRestore] _recomputeShowSlicePanel: données arrivées', { dynamicKeys, filters });\n setTimeout(() => {\n if (dynamicKeys) {\n dynamicKeys.forEach(key => {\n const col = allCols.find(c => c.key === key);\n if (col) this.addDynamicSlice(col);\n });\n }\n if (filters && this.slicePanelRef) {\n console.log('[SliceRestore] restoreFilters depuis _recomputeShowSlicePanel', filters);\n this.slicePanelRef.restoreFilters(filters);\n }\n this._cdr.markForCheck();\n });\n }\n }\n\n get showAddSliceButton(): boolean {\n return this._organizer.showSliceBySection;\n }\n\n get staticSlicesForMenu(): Array<{ key: string; title: string; icon?: string }> {\n return this._organizer.staticSlicesForMenu;\n }\n\n get availableColumnsForDynamicSlice(): TableColumnProvider<T>[] {\n return this._organizer.sliceBy.availableForDynamic;\n }\n\n isStaticSliceVisible(columnKey: string): boolean {\n return !this._staticSliceHiddenKeys.has(columnKey);\n }\n\n toggleStaticSlice(columnKey: string): void {\n const next = new Set(this._staticSliceHiddenKeys);\n if (next.has(columnKey)) next.delete(columnKey);\n else next.add(columnKey);\n this._staticSliceHiddenKeys = next;\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n this._sliceConfigs = this._computeSliceConfigs();\n // Si une slice vient d'être cachée, réinitialise le filtre actif pour éviter\n // un filtre orphelin (la slice n'est plus visible mais son filtre resterait actif)\n if (next.has(columnKey)) {\n this.activeSliceFilter = () => true;\n }\n this._recomputeShowSlicePanel();\n this._scheduleRender();\n this._cdr.markForCheck();\n }\n\n addDynamicSlice(column: TableColumnProvider<T>): void {\n this.slicePanelRef?.addDynamicSlice(column);\n if (column.lazy && this._lazyColumnStatus.get(column.key) !== 'loaded') {\n this.triggerLazyFetch(column);\n }\n }\n\n get allDynamicSliceColumns(): TableColumnProvider<T>[] {\n return this._allDynamicSliceColumns;\n }\n\n isDynamicSliceActive(key: string): boolean {\n return this._organizer.isDynamicSliceActive(key);\n }\n\n toggleDynamicSlice(col: TableColumnProvider<T>): void {\n if (this.isDynamicSliceActive(col.key)) {\n this.removeDynamicSliceByKey(col.key);\n } else {\n this.addDynamicSlice(col);\n }\n }\n\n onSliceFilterChange(pred: (row: T) => boolean): void {\n this.activeSliceFilter = pred;\n this._preservePageIndex = 0;\n this.refreshViewModel();\n this.paginator?.firstPage();\n }\n\n onDynamicSliceKeysChange(keys: string[]): void {\n this._organizer.onDynamicSliceKeysChange(keys);\n this._recomputeShowSlicePanel();\n this._cdr.markForCheck();\n }\n\n get emptyStateLabel(): string {\n return this.resolvedConfig.labels?.empty || this.i18n.emptyState;\n }\n\n get loadingStateLabel(): string {\n return this.resolvedConfig.labels?.loading || this.i18n.loadingState;\n }\n\n get effectiveIsLoading(): boolean {\n return this.isLoading;\n }\n\n get isEmpty(): boolean {\n // _pendingRender : le rendu interne n'est pas encore terminé → pas de message vide prématuré\n return !this.isLoading && this._pendingRender === null && this._allFilteredRows.length === 0;\n }\n\n get showPagination(): boolean {\n if (this.activeGroupByKey !== null) return false;\n return this.resolvedConfig.pagination?.enabled !== false;\n }\n\n get resolvedPaginationShowFirstLastButtons(): boolean {\n return this.resolvedConfig.pagination?.showFirstLastButtons !== false;\n }\n\n get isColumnDragDropEnabled(): boolean {\n return this._organizer.isFieldDragDropEnabled;\n }\n\n get totalRows(): number {\n return this.activeGroupByKey\n ? this.tableDataSource.data.filter((r) => !r[GROUP_HEADER_MARKER]).length\n : this._allFilteredRows.length;\n }\n\n // ── Gestion des colonnes\n\n onAddColumn(column: TableColumnProvider<T>): void {\n this._organizer.addField(column);\n this._preservePageIndex = this.paginator?.pageIndex ?? null;\n this.refreshViewModel();\n\n if (column.lazy) {\n this.triggerLazyFetch(column);\n }\n\n this.addRequested.emit();\n this.columnAdded.emit(column);\n }\n\n onColumnVisibilityChange(column: TableColumnProvider<T>, checked: boolean): void {\n const isVisible = this._organizer.isFieldVisible(column.key);\n\n if (checked && !isVisible) {\n this.onAddColumn(column);\n return;\n }\n\n if (!checked && isVisible) {\n const removed = this._organizer.removeField(column.key);\n if (!removed) return;\n this._preservePageIndex = this.paginator?.pageIndex ?? null;\n this.refreshViewModel();\n this.columnRemoved.emit(column);\n }\n }\n\n isColumnVisible(columnKey: string): boolean {\n return this.activeFields.some(c => c.key === columnKey);\n }\n\n onRemoveColumn(columnKey: string, event?: Event): void {\n event?.stopPropagation();\n const column = this.activeFields.find(item => item.key === columnKey);\n if (!column) return;\n const removed = this._organizer.removeField(columnKey);\n if (!removed) return;\n this.refreshViewModel();\n this.columnRemoved.emit(column);\n }\n\n // ── Lignes\n\n private _rebuildCellDefMap(): void {\n this._cellDefMap = new Map(\n (this._cellDefs ?? []).map(d => [d.columnKey, d.template] as [string, TemplateRef<{ $implicit: any; index: number }>])\n );\n }\n\n getCellTemplate(key: string): TemplateRef<{ $implicit: any; index: number }> | null {\n return this._cellDefMap.get(key) ?? null;\n }\n\n get hasCustomCellDefs(): boolean {\n return this._cellDefMap.size > 0;\n }\n\n get hasRowClickHandler(): boolean {\n return this.rowSelected.observed || !!this.resolvedConfig.onRowSelected;\n }\n\n /** Largeur minimale du tableau en px, calculée depuis les largeurs explicites des colonnes actives.\n * Retourne null si aucune colonne n'a de largeur définie (le tableau remplit alors 100% du conteneur).\n * Seules les valeurs explicitement en `px` sont sommables ; les pourcentages ou autres unités sont ignorés. */\n get tableMinWidth(): string | null {\n const hasResized = Object.keys(this._columnWidths).length > 0;\n const hasSomeExplicitWidth = hasResized || this.activeFields.some(c => c.width);\n if (!hasSomeExplicitWidth) return null;\n let sum = 0;\n for (const col of this.activeFields) {\n if (this._columnWidths[col.key] != null) {\n sum += this._columnWidths[col.key];\n } else if (col.width) {\n const isPx = col.width.trim().toLowerCase().endsWith('px');\n const px = Number.parseFloat(col.width);\n if (isPx && !Number.isNaN(px)) { sum += px; }\n else { sum += 150; }\n } else {\n sum += 120; // largeur minimale estimée pour une colonne sans largeur explicite\n }\n }\n return sum + 'px';\n }\n\n trackRowFn = (_index: number, row: any): any =>\n row[GROUP_HEADER_MARKER] ? `__group_${row[ROW_GROUP_KEY]}` : row[ROW_INDEX_KEY] ?? _index;\n\n getRowClass(row: any): string | string[] | Record<string, boolean> {\n const fn = this.resolvedConfig.rowClass;\n if (!fn || row?.[GROUP_HEADER_MARKER]) return {};\n return fn(row[ROW_RAW_KEY] ?? row, row[ROW_INDEX_KEY] ?? 0);\n }\n\n onRowClick(row: any, event: MouseEvent | null): void {\n if (row?.[GROUP_HEADER_MARKER]) return;\n if (!this.hasRowClickHandler) return;\n const resolved = (row?.[ROW_RAW_KEY] ?? row) as T;\n this.resolvedConfig.onRowSelected?.(resolved, event);\n this.rowSelected.emit(resolved);\n }\n\n // ── Drag & drop\n\n onHeaderDragStart(columnKey: string, event: DragEvent): void {\n if (!this.isColumnDragDropEnabled && !this._editMode) {\n return;\n }\n\n this.draggedColumnKey = columnKey;\n this.dragOverColumnKey = null;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', columnKey);\n }\n }\n\n onHeaderDragOver(columnKey: string, event: DragEvent): void {\n if ((!this.isColumnDragDropEnabled && !this._editMode) || !this.draggedColumnKey) {\n return;\n }\n\n event.preventDefault();\n this.dragOverColumnKey = columnKey;\n }\n\n onHeaderDrop(targetColumnKey: string, event: DragEvent): void {\n if ((!this.isColumnDragDropEnabled && !this._editMode) || !this.draggedColumnKey) {\n return;\n }\n\n event.preventDefault();\n\n const moved = this._organizer.reorderFields(this.draggedColumnKey, targetColumnKey);\n if (!moved) {\n this.onHeaderDragEnd();\n return;\n }\n\n this.refreshViewModel();\n this.onHeaderDragEnd();\n }\n\n onHeaderDragEnd(): void {\n this.draggedColumnKey = null;\n this.dragOverColumnKey = null;\n }\n\n isHeaderDropTarget(columnKey: string): boolean {\n return !!this.draggedColumnKey && this.dragOverColumnKey === columnKey && this.draggedColumnKey !== columnKey;\n }\n\n // ── Préférences : mode édition\n\n enterEditMode(): void {\n this._editMode = true;\n this._preferencesMessage = null;\n this._cdr.markForCheck();\n }\n\n confirmEditMode(): void {\n this._editMode = false;\n this._cdr.markForCheck();\n }\n\n /** Démarre le resize d'une colonne (mousedown sur la poignée droite). */\n onResizeStart(columnKey: string, event: MouseEvent): void {\n if (!this._editMode) return;\n event.preventDefault();\n event.stopPropagation();\n\n const th = (event.target as HTMLElement).closest('th') as HTMLElement | null;\n if (!th) return;\n\n const scrollEl = this.tableBodyScrollRef?.nativeElement;\n if (scrollEl) {\n const allTh = scrollEl.querySelectorAll<HTMLElement>('th.mat-mdc-header-cell');\n allTh.forEach(thEl => {\n const key = thEl.getAttribute('mat-column-header') || thEl.getAttribute('mat-sort-header') || '';\n const colClass = Array.from(thEl.classList).find(c => c.startsWith('mat-column-'));\n const colKey = colClass ? colClass.replace('mat-column-', '') : null;\n if (colKey && this._columnWidths[colKey] == null) {\n this._columnWidths = { ...this._columnWidths, [colKey]: thEl.offsetWidth };\n }\n });\n }\n\n this._resizeState = { key: columnKey, startX: event.clientX, startWidth: th.offsetWidth };\n\n const onMove = (e: MouseEvent) => {\n if (!this._resizeState) {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n return;\n }\n const delta = e.clientX - this._resizeState.startX;\n const newWidth = Math.max(60, this._resizeState.startWidth + delta);\n this._columnWidths = { ...this._columnWidths, [this._resizeState.key]: newWidth };\n // detectChanges() pour forcer la mise à jour immédiate en mode OnPush\n // (les listeners window tournent hors zone Angular avec runOutsideAngular)\n this._cdr.detectChanges();\n };\n\n const onUp = () => {\n this._resizeState = null;\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n };\n\n // Listeners hors zone Angular pour éviter des cycles CD à chaque mousemove\n this._ngZone.runOutsideAngular(() => {\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n });\n }\n\n /** Retourne la largeur CSS d'une colonne (px si personnalisée, sinon la valeur de config ou auto). */\n getColumnWidth(key: string): string {\n if (this._columnWidths[key] != null) return this._columnWidths[key] + 'px';\n const col = this._columnMap.get(key);\n return col?.width ?? 'auto';\n }\n\n // ── Préférences : save / clear\n\n savePreferences(): void {\n if (!this._preferencesManager) return;\n const dynamicSliceKeys = this._organizer.sliceBy.activeDynamicFields.map(c => c.key);\n const config: import('../jquery-table.model').SavedTableConfig = {\n search: this.searchQuery || undefined,\n groupBy: this.activeGroupByKey,\n columnOrder: this.activeFields.map(c => c.key),\n visibleColumns: this.activeFields.map(c => c.key),\n columnWidths: Object.keys(this._columnWidths).length ? { ...this._columnWidths } : undefined,\n slicePanelCollapsed: this._slicePanelCollapsed,\n hiddenSliceKeys: [...this._staticSliceHiddenKeys],\n dynamicSliceKeys: dynamicSliceKeys.length ? dynamicSliceKeys : undefined,\n sliceFilters: this.slicePanelRef ? this.slicePanelRef.getActiveFilters() : undefined,\n };\n this._preferencesManager.save(config);\n this._hasSavedConfig = true;\n this._showPreferencesMessage(this.i18n.preferencesSavedMessage);\n }\n\n clearPreferences(): void {\n if (!this._preferencesManager) return;\n this._preferencesManager.clear();\n this._hasSavedConfig = false;\n\n // Capturer les dynamic slices actives AVANT le reset (resetToDefaults() les vide)\n const dynamicSlicesToRemove = this._organizer.sliceBy.activeDynamicFields.slice();\n\n // Reset complet de l'état vers les valeurs par défaut de la config\n this.searchQuery = '';\n this._columnWidths = {};\n this._slicePanelCollapsed = false;\n // Synchroniser l'état interne du slice-panel : si le composant est en état collapsed\n // (l'utilisateur l'avait fermé après la sauvegarde), le rouvrir explicitement pour\n // éviter que display:none soit retiré mais que isCollapsed interne reste à true.\n if (this.slicePanelRef?.isCollapsed) {\n this.slicePanelRef.togglePanel();\n }\n this._groupBy.reset();\n this._groupBy.setDefaultCollapsed(false);\n\n // Slices statiques : revenir aux seules celles cachées par la config (pas par l'utilisateur)\n this._staticSliceHiddenKeys = new Set(this._configHiddenKeys);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n\n // Colonnes et groupBy : reset via la facade (retire les optionnelles, remet l'ordre config)\n this._organizer.resetToDefaults();\n this._defaultGroupByApplied = false;\n\n // Dynamic slices : les retirer du slice panel avec la liste capturée avant le reset\n dynamicSlicesToRemove.forEach(col => {\n this.slicePanelRef?.removeDynamicSliceByKey(col.key);\n });\n\n // Filtre de slice actif\n this.activeSliceFilter = () => true;\n if (this.slicePanelRef) this.slicePanelRef.restoreFilters({});\n\n // Rafraîchit toute la vue\n this.activeFields = this._organizer.fields.activeFields;\n this.renderedColumns = this.activeFields.map(c => c.key);\n this._pendingDynamicSliceKeys = null;\n this._pendingSliceFilters = null;\n this.refreshViewModel();\n\n this._showPreferencesMessage(this.i18n.preferencesClearedMessage);\n }\n\n private _preferencesMessageTimer: ReturnType<typeof setTimeout> | null = null;\n\n private _showPreferencesMessage(msg: string): void {\n if (this._preferencesMessageTimer !== null) clearTimeout(this._preferencesMessageTimer);\n this._preferencesMessage = msg;\n this._cdr.markForCheck();\n this._preferencesMessageTimer = setTimeout(() => {\n this._preferencesMessageTimer = null;\n this._preferencesMessage = null;\n this._cdr.markForCheck();\n }, 4000);\n }\n\n private _applyPreferences(saved: import('../jquery-table.model').SavedTableConfig | null): void {\n if (!saved) return;\n // Recherche\n if (saved.search) this.searchQuery = saved.search;\n // Largeurs colonnes\n if (saved.columnWidths) this._columnWidths = { ...saved.columnWidths };\n // Group by\n if (saved.groupBy !== undefined) {\n this._organizer.setGroupBy(saved.groupBy);\n if (saved.groupBy) {\n this._groupBy.setDefaultCollapsed(true);\n this._groupBy.reset();\n }\n }\n // État panneau slice\n if (saved.slicePanelCollapsed !== undefined) this._slicePanelCollapsed = saved.slicePanelCollapsed;\n // Slices statiques cachées — on utilise la valeur exacte sauvegardée (pas les defaults de config)\n if (saved.hiddenSliceKeys !== undefined) {\n this._staticSliceHiddenKeys = new Set(saved.hiddenSliceKeys);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n }\n // Colonnes visibles + ordre — reconstruit activeFields en une seule passe.\n // On part de saved.columnOrder (ordre sauvegardé) si disponible, sinon saved.visibleColumns.\n // Cela gère à la fois : colonnes optionnelles ajoutées, colonnes retirées, et réordonnancement.\n const targetKeys = saved.columnOrder ?? saved.visibleColumns;\n if (targetKeys?.length) {\n const allByKey = new Map((this.resolvedConfig.columns ?? []).map(c => [c.key, c]));\n // Colonnes dans l'ordre sauvegardé (on ne garde que celles connues de la config)\n const ordered = targetKeys\n .map(key => allByKey.get(key))\n .filter((c): c is TableColumnProvider<T> => c !== undefined);\n // Colonnes actives actuelllement non présentes dans targetKeys (non-optional passées sous silence)\n // → on les exclut : l'utilisateur avait explicitement choisi ce sous-ensemble\n if (ordered.length > 0) {\n this._organizer.setActiveFields(ordered);\n }\n }\n // Dynamic slices — différé : slicePanelRef pas encore disponible au moment de ngOnChanges\n if (saved.dynamicSliceKeys?.length) {\n this._pendingDynamicSliceKeys = saved.dynamicSliceKeys;\n }\n // Filtres actifs du slice panel\n // Filtres actifs du slice panel — toujours stockés en pending :\n // appliqués par _applyPendingDynamicSliceKeys (si dynamic slices) ou\n // par _recomputeShowSlicePanel (quand les données arrivent et rendent le panel visible)\n if (saved.sliceFilters && Object.keys(saved.sliceFilters).length) {\n this._pendingSliceFilters = saved.sliceFilters;\n }\n }\n\n canRemoveColumn(column: TableColumnProvider<T>): boolean {\n return (\n this._organizer.allowFieldRemoval &&\n column.removable !== false &&\n this.activeFields.length > 1\n );\n }\n\n isCellEmpty(value: any): boolean {\n return value === '' || value == null;\n }\n\n asTitle(value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n return String(value);\n }\n\n // ── Export CSV\n\n onExport(): void {\n this._export.export();\n }\n\n // ── Pipeline de données (privé)\n\n private refreshViewModel(): void {\n this._resolvedData = this.resolveData();\n this.resolvedConfig = this.buildEffectiveConfig();\n this._columnMap = new Map((this.resolvedConfig.columns || []).map(c => [c.key, c]));\n\n // ── Initialiser le gestionnaire de préférences si l'option est activée\n const prefsId = this.resolvedConfig.preferences?.enabled\n ? this.resolvedConfig.preferences.tableId\n : null;\n const currentId = prefsId ?? null;\n // Préférences à appliquer après _organizer.update() (quand activeFields est déjà peuplé)\n let pendingPrefs: import('../jquery-table.model').SavedTableConfig | null = null;\n if (currentId && this._preferencesManager?.key !== ('jqt_prefs_' + currentId)) {\n this._preferencesManager = new TablePreferencesManager(currentId);\n this._hasSavedConfig = this._preferencesManager.hasSaved();\n pendingPrefs = this._preferencesManager.load();\n } else if (!currentId) {\n this._preferencesManager = null;\n this._hasSavedConfig = false;\n }\n\n // Délègue à la facade : mise à jour de l'état View (colonnes, groupBy meta, sliceBy meta)\n this._organizer.update({\n config: this.resolvedConfig.view,\n fields: this.resolvedConfig.columns ?? [],\n sliceConfigs: this.resolvedConfig.slices ?? [],\n defaultGroupBy: this.resolvedConfig.defaultGroupBy,\n });\n\n if (!pendingPrefs && !this._defaultGroupByApplied && !this._organizer.groupBy.userCustomized && this._organizer.groupBy.activeKey != null) {\n this._defaultGroupByApplied = true;\n this._groupBy.setDefaultCollapsed(true);\n this._groupBy.reset();\n this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();\n }\n\n // Synchronise la propriété stable (évite NG0100 — la facade est source de vérité)\n this.activeFields = this._organizer.fields.activeFields;\n\n this.renderedColumns = this.activeFields.map(c => c.key);\n\n this.pageSize = this.paginator?.pageSize || this.resolvePageSize();\n this.pageSizeOptions = this.resolvePageSizeOptions();\n this.pageSizeOptionsGroupBy = this.resolvePageSizeOptionsGroupBy();\n if (this.groupPageSize !== 0 && !this.pageSizeOptionsGroupBy.includes(this.groupPageSize)) {\n this.groupPageSize = this.resolveDefaultGroupPageSize();\n }\n\n this.attachPaginator();\n this.attachSort();\n\n // Réinitialise _staticSliceHiddenKeys seulement si les clés hidden de la config ont vraiment changé\n // ET qu'il n'y a pas de préférences sauvegardées (qui géreront hiddenSliceKeys elles-mêmes).\n const newConfigHidden = new Set<string>(\n (this.resolvedConfig.slices ?? []).filter(s => s.hidden && s.columnKey).map(s => s.columnKey!)\n );\n if (!TableComponent._setsEqual(newConfigHidden, this._configHiddenKeys)) {\n this._configHiddenKeys = newConfigHidden;\n // N'écraser _staticSliceHiddenKeys que si on n'est PAS en train d'appliquer des prefs\n // (pendingPrefs les gèrera lui-même via _applyPreferences → hiddenSliceKeys)\n if (!pendingPrefs) {\n this._staticSliceHiddenKeys = new Set(newConfigHidden);\n this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);\n }\n }\n\n // Applique les préférences ICI, APRÈS _organizer.update() ET après _configHiddenKeys mis à jour,\n // mais avant _computeSliceConfigs() pour que hiddenSliceKeys soit déjà restauré.\n if (pendingPrefs) {\n this._applyPreferences(pendingPrefs);\n }\n\n // Propriétés stables pour les bindings du template\n // On recalcule _sliceConfigs en reflétant l'état courant des slices cachées,\n // pour que SlicePanelComponent.ngOnInit reçoive la bonne valeur de `hidden`\n // même quand le composant est créé pour la 1ère fois après un toggle.\n this._sliceConfigs = this._computeSliceConfigs();\n this._sliceColumns = this.resolvedConfig.columns ?? [];\n this._sliceData = this._resolvedData;\n this._sliceShowToggle = this.resolvedConfig.enableSliceToggle !== false;\n this._recomputeShowSlicePanel();\n if (!this._activeSort.active && this.resolvedConfig.defaultSort) {\n this._matSortActive = this.resolvedConfig.defaultSort.active;\n this._matSortDirection = this.resolvedConfig.defaultSort.direction;\n }\n this._buildSliceByMenuItems();\n\n this._scheduleRender();\n }\n\n /** Retourne uniquement les slices visibles (non cachées par _staticSliceHiddenKeys).\n * Le SlicePanelComponent affiche tout ce qu'il reçoit — c'est ici que se fait le filtrage. */\n private _computeSliceConfigs(): SliceConfig<T>[] {\n return (this.resolvedConfig.slices ?? []).filter(\n s => !s.columnKey || !this._staticSliceHiddenKeys.has(s.columnKey)\n );\n }\n\n private static _setsEqual(a: Set<string>, b: Set<string>): boolean {\n if (a.size !== b.size) return false;\n for (const v of a) if (!b.has(v)) return false;\n return true;\n }\n\n private _buildSliceByMenuItems(): void {\n const staticSliceMap = new Map(this._staticSlicesForMenu.map(s => [s.key, s]));\n const dynamicSliceSet = new Set(this._allDynamicSliceColumns.map(c => c.key));\n const seen = new Set<string>();\n const items: Array<{ isStatic: boolean; key: string; title: string; icon?: string; col?: TableColumnProvider<T> }> = [];\n for (const col of this.resolvedConfig.columns ?? []) {\n if (seen.has(col.key)) continue;\n if (staticSliceMap.has(col.key)) {\n const s = staticSliceMap.get(col.key)!;\n items.push({ isStatic: true, key: s.key, title: s.title, icon: s.icon });\n seen.add(col.key);\n } else if (dynamicSliceSet.has(col.key)) {\n items.push({ isStatic: false, key: col.key, title: this.colLabel(col), icon: col.icon, col });\n seen.add(col.key);\n }\n }\n for (const s of this._staticSlicesForMenu) {\n if (!seen.has(s.key)) {\n items.push({ isStatic: true, key: s.key, title: s.title, icon: s.icon });\n }\n }\n this._sliceByMenuItems = items;\n this._invalidateOrganizerConfig(); // les slices ont changé\n }\n\n get sliceByMenuItems() { return this._sliceByMenuItems; }\n\n onSliceMenuItemClick(item: { isStatic: boolean; key: string; col?: TableColumnProvider<T> }): void {\n if (item.isStatic) {\n this.toggleStaticSlice(item.key);\n } else if (item.col) {\n this.toggleDynamicSlice(item.col);\n }\n }\n\n isSliceMenuItemActive(item: { isStatic: boolean; key: string }): boolean {\n return item.isStatic ? this.isStaticSliceVisible(item.key) : this.isDynamicSliceActive(item.key);\n }\n\n private _scheduleRender(): void {\n if (this._pendingRender !== null) {\n clearTimeout(this._pendingRender);\n this._pendingRender = null;\n }\n this._ngZone.runOutsideAngular(() => {\n this._pendingRender = setTimeout(() => {\n this._pendingRender = null;\n this._ngZone.run(() => this._executeRender());\n }, 0);\n });\n }\n\n private _executeRender(): void {\n const categoryRows = this.getCategoryFilteredData();\n if (this.activeGroupByKey) {\n // En mode groupBy, projectRows gère tout le tri internement — pas de sort global inutile\n this._allFilteredRows = categoryRows;\n } else {\n const compareFn = this._buildSortComparator();\n this._allFilteredRows = compareFn ? [...categoryRows].sort(compareFn) : categoryRows;\n }\n\n // Mettre à jour le paginator avec le nouveau total\n if (this.paginator) {\n const savedIndex = this._preservePageIndex ?? this.paginator.pageIndex;\n const maxPage = Math.max(0, Math.ceil(this._allFilteredRows.length / this.pageSize) - 1);\n this.paginator.length = this._allFilteredRows.length;\n this.paginator.pageIndex = Math.min(savedIndex, maxPage);\n this._preservePageIndex = null;\n }\n\n this._projectCurrentPage();\n // detectChanges() au lieu de markForCheck() : met à jour uniquement CE composant\n // sans déclencher un cycle CD global qui provoquerait NG0100 dans les parents.\n this._cdr.detectChanges();\n }\n\n private _projectCurrentPage(): void {\n if (this.activeGroupByKey) {\n this.tableDataSource.data = this.projectRows(this._allFilteredRows);\n return;\n }\n\n const pageIndex = this.paginator?.pageIndex ?? 0;\n const start = pageIndex * this.pageSize;\n const pageRows = this._allFilteredRows.slice(start, start + this.pageSize);\n\n const projected: any[] = [];\n pageRows.forEach((row, i) => {\n const idx = start + i;\n const p: any = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };\n this.activeFields.forEach((col) => {\n p[col.key] = this.resolveCellValue(col, row, idx);\n });\n projected.push(p);\n });\n this.tableDataSource.data = projected;\n }\n\n private buildEffectiveConfig(): TableProvider<T> {\n const config = this.config || {};\n const rows = this._resolvedData;\n\n const columns =\n config.columns ||\n this.columnsConfig ||\n this.resolveColumnsFromCompat(rows);\n\n // Mode HTML : [view] prend le dessus sur config.view si fourni (Phase 3).\n const view = this.view ?? config.view;\n\n const autoTableId = config.preferences?.tableId || TableComponent._hashColumns((columns || []).map(c => c.key));\n const exportConfig: TableExportConfig<T> = {\n enabled: true,\n filename: autoTableId,\n ...config.export,\n };\n\n const prefsConfig: TablePreferencesConfig = {\n enabled: true,\n tableId: autoTableId,\n ...config.preferences,\n };\n\n return {\n ...config,\n columns,\n view,\n slices: config.slices || [],\n enableSliceToggle: config.enableSliceToggle ?? true,\n export: exportConfig,\n preferences: prefsConfig,\n };\n }\n\n private applyConfigSearchReset(): void {\n const clearToken = this.resolvedConfig.clearSearchInput;\n const shouldClear = !!clearToken && clearToken !== this._lastConfigClearSearchInput;\n\n this._lastConfigClearSearchInput = clearToken;\n\n if (!shouldClear) {\n return;\n }\n\n this.searchQuery = '';\n this.onSearchChange();\n }\n\n private applyInitialSearchQuery(): void {\n const initialQuery = this.resolvedConfig.search?.initialQuery;\n if (initialQuery == null) {\n return;\n }\n\n this.searchQuery = initialQuery;\n this.onSearchChange();\n }\n\n private static _hashColumns(keys: string[]): string {\n const str = keys.join('|');\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h.toString(16).padStart(8, '0');\n }\n\n private resolveData(): T[] {\n if (Array.isArray(this.data)) {\n return this.data;\n }\n\n if (Array.isArray(this.dataSource)) {\n return this.dataSource;\n }\n\n if (this.dataSource && Array.isArray((this.dataSource as any).data)) {\n return (this.dataSource as any).data;\n }\n\n return [];\n }\n\n private resolveColumnsFromCompat(rows: T[]): TableColumnProvider<T>[] {\n if (this.displayedColumns?.length) {\n return this.displayedColumns.map((key) => ({\n key,\n header: this.columnLabels?.[key] || humanizeKey(key),\n }));\n }\n\n const firstRow = rows[0] as any;\n if (!firstRow || typeof firstRow !== 'object') {\n return [];\n }\n\n return Object.keys(firstRow).map((key) => ({\n key,\n header: this.columnLabels?.[key] || humanizeKey(key),\n }));\n }\n\n private getCategoryFilteredData(): T[] {\n const data = this._resolvedData;\n\n let filtered = data.filter(this.activeSliceFilter);\n\n const query = this.searchQuery?.trim().toLowerCase();\n if (query) {\n const restrictedKeys = this.resolvedConfig.search?.searchColumns;\n const searchCols = restrictedKeys?.length\n ? [...this._columnMap.values()].filter(col => restrictedKeys.includes(col.key))\n : [...this._columnMap.values()];\n filtered = filtered.filter((row) =>\n searchCols.some((col) => {\n const val = this.getDisplayValueForSearch(col, row);\n return val != null && String(val).toLowerCase().includes(query);\n })\n );\n }\n return filtered;\n }\n\n private projectRows(rows: T[]): any[] {\n const groupKey = this.activeGroupByKey;\n\n if (!groupKey) {\n const result: any[] = [];\n rows.forEach((row, index) => {\n const projected: any = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: index };\n this.activeFields.forEach((col) => {\n projected[col.key] = this.resolveCellValue(col, row, index);\n });\n result.push(projected);\n });\n return result;\n }\n\n const groupColDef = this._columnMap.get(groupKey);\n const groupLazyStatus = groupColDef?.lazy ? (this._lazyColumnStatus.get(groupKey) ?? 'idle') : 'loaded';\n\n if (groupLazyStatus !== 'loaded') {\n this._totalFilteredCount = rows.length;\n return [{ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: GROUP_KEY_LAZY_LOADING, [ROW_GROUP_COUNT]: rows.length, [ROW_GROUP_PAGE]: 0, [ROW_GROUP_PAGE_COUNT]: 1 }];\n }\n\n const effectiveSort = this._activeSort.active && this._activeSort.direction\n ? this._activeSort\n : this.resolvedConfig.defaultSort ?? { active: '', direction: '' as const };\n\n // Vérifie si le cache est encore valide (même référence de rows + même paramètres de tri/groupe)\n const cacheValid =\n this._groupCache !== null &&\n this._groupCache.rows === rows &&\n this._groupCache.key === groupKey &&\n this._groupCache.sortOrder === this._groupBy.groupSortOrder &&\n this._groupCache.sortActive === (effectiveSort.active ?? '') &&\n this._groupCache.sortDir === (effectiveSort.direction ?? '');\n\n let groupOrder: string[];\n let groupMap: Map<string, T[]>;\n\n if (cacheValid) {\n groupOrder = this._groupCache!.order;\n groupMap = this._groupCache!.map;\n } else {\n // Pré-calcul des valeurs de groupe en un seul passage (évite O(n) find() par comparaison)\n const groupValueCache = new Map<T, string>();\n rows.forEach(row => groupValueCache.set(row, String(this.getLazyAwareValue(groupKey, row) ?? '')));\n\n // Pré-calcul des valeurs de tri (évite O(n log n) × getLazyAwareValue dans le comparateur)\n let fastCompareFn: ((a: T, b: T) => number) | null = null;\n if (effectiveSort.active && effectiveSort.direction) {\n const sortValueCache = new Map<T, any>();\n rows.forEach(row => sortValueCache.set(row, this.getLazyAwareValue(effectiveSort.active, row)));\n const dir = effectiveSort.direction;\n fastCompareFn = (a: T, b: T): number => {\n const va = sortValueCache.get(a);\n const vb = sortValueCache.get(b);\n let cmp = 0;\n if (typeof va === 'number' && typeof vb === 'number') {\n cmp = va < vb ? -1 : va > vb ? 1 : 0;\n } else {\n const sa = va == null ? '' : String(va).toLowerCase();\n const sb = vb == null ? '' : String(vb).toLowerCase();\n cmp = sa < sb ? -1 : sa > sb ? 1 : 0;\n }\n return dir === 'asc' ? cmp : -cmp;\n };\n }\n\n const sorted = [...rows].sort((a, b) => {\n const va = groupValueCache.get(a)!;\n const vb = groupValueCache.get(b)!;\n const cmp = va.localeCompare(vb);\n return this._groupBy.groupSortOrder === 'desc' ? -cmp : cmp;\n });\n\n groupOrder = [];\n groupMap = new Map<string, T[]>();\n sorted.forEach((row) => {\n const groupValue = groupValueCache.get(row)!;\n if (!groupMap.has(groupValue)) {\n groupOrder.push(groupValue);\n groupMap.set(groupValue, []);\n }\n groupMap.get(groupValue)!.push(row);\n });\n\n // Tri intra-groupe stocké dans le cache — évite le re-tri sur collapse/expand/pagination\n if (fastCompareFn) {\n const fn = fastCompareFn;\n groupMap.forEach((groupRows, key) => {\n groupMap.set(key, [...groupRows].sort(fn));\n });\n }\n\n // Mise en cache\n this._groupCache = {\n rows,\n key: groupKey,\n sortOrder: this._groupBy.groupSortOrder,\n sortActive: effectiveSort.active ?? '',\n sortDir: effectiveSort.direction ?? '',\n order: groupOrder,\n map: groupMap,\n };\n }\n\n this._totalFilteredCount = rows.length;\n\n // Protection contre les jeux de données à trop haute cardinalité\n if (groupOrder.length > TableComponent.MAX_GROUP_COUNT) {\n return [{ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: GROUP_KEY_TOO_MANY, [ROW_GROUP_COUNT]: groupOrder.length, [ROW_GROUP_PAGE]: 0, [ROW_GROUP_PAGE_COUNT]: 1 }];\n }\n\n const pageSize = this.groupPageSize;\n const result: any[] = [];\n\n groupOrder.forEach((groupValue) => {\n const groupRows = groupMap.get(groupValue)!;\n const totalCount = groupRows.length;\n const currentPage = pageSize === 0 ? 0 : this._groupBy.getPage(groupValue);\n const pageCount = pageSize === 0 ? 1 : Math.max(1, Math.ceil(totalCount / pageSize));\n const collapsed = this.isGroupCollapsed(groupValue);\n\n result.push({ [GROUP_HEADER_MARKER]: true, [ROW_GROUP_KEY]: groupValue, [ROW_GROUP_COUNT]: totalCount, [ROW_GROUP_PAGE]: currentPage, [ROW_GROUP_PAGE_COUNT]: pageCount });\n\n if (!collapsed) {\n const start = pageSize === 0 ? 0 : currentPage * pageSize;\n const end = pageSize === 0 ? totalCount : Math.min(start + pageSize, totalCount);\n groupRows.slice(start, end).forEach((row, i) => {\n const idx = start + i;\n const projected: any = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };\n this.activeFields.forEach((col) => {\n projected[col.key] = this.resolveCellValue(col, row, idx);\n });\n result.push(projected);\n });\n }\n });\n\n return result;\n }\n\n private _buildSortComparator(): ((a: T, b: T) => number) | null {\n const sort = this._activeSort.active && this._activeSort.direction\n ? this._activeSort\n : this.resolvedConfig.defaultSort ?? { active: '', direction: '' as const };\n const { active, direction } = sort;\n if (!active || !direction) return null;\n return (a: T, b: T): number => {\n const va = this.getLazyAwareValue(active, a);\n const vb = this.getLazyAwareValue(active, b);\n let cmp = 0;\n if (typeof va === 'number' && typeof vb === 'number') {\n cmp = va < vb ? -1 : va > vb ? 1 : 0;\n } else {\n const sa = va == null ? '' : String(va).toLowerCase();\n const sb = vb == null ? '' : String(vb).toLowerCase();\n cmp = sa < sb ? -1 : sa > sb ? 1 : 0;\n }\n return direction === 'asc' ? cmp : -cmp;\n };\n }\n\n /**\n * Retourne la valeur telle qu'elle est affichée dans la cellule, en suivant exactement\n * le même chemin que resolveCellValue — utilisée pour la recherche plein-texte.\n * Ne passe pas par sortValue (valeur brute de tri) contrairement à getLazyAwareValue.\n */\n private getDisplayValueForSearch(col: TableColumnProvider<T>, row: T): any {\n if (col.lazy) {\n const status = this._lazyColumnStatus.get(col.key) ?? 'idle';\n if (status !== 'loaded') return null;\n const rowMap = this._lazyColumnData.get(col.key);\n return normalizeCellValue(rowMap?.get(row) ?? '');\n }\n if (col.searchValue) {\n return col.searchValue(row, 0);\n }\n const rawValue = col.value ? col.value(row, 0) : (row as any)?.[col.key];\n return normalizeCellValue(rawValue);\n }\n\n private getLazyAwareValue(columnKey: string, row: T): any {\n const colDef = this._columnMap.get(columnKey);\n if (colDef?.lazy) {\n return this._lazyColumnData.get(columnKey)?.get(row) ?? null;\n }\n if (colDef?.sortValue) {\n return normalizeCellValue(colDef.sortValue(row, 0));\n }\n if (colDef?.value) {\n return normalizeCellValue(colDef.value(row, 0));\n }\n return (row as any)[columnKey];\n }\n\n private resolveCellValue(col: TableColumnProvider<T>, row: T, index: number): any {\n if (col.lazy) {\n const status = this._lazyColumnStatus.get(col.key) ?? 'idle';\n if (status === 'loading') return LAZY_LOADING_VALUE;\n if (status === 'error') return LAZY_ERROR_VALUE;\n if (status === 'loaded') {\n const rowMap = this._lazyColumnData.get(col.key);\n return normalizeCellValue(rowMap?.get(row) ?? '');\n }\n return '';\n }\n const valueProvider = col.value;\n const rawValue = valueProvider ? valueProvider(row, index) : (row as any)?.[col.key];\n return normalizeCellValue(rawValue);\n }\n\n private resolvePageSize(): number {\n return Math.max(1, this.resolvedConfig.pagination?.pageSize || this.pageSize || 5);\n }\n\n private resolvePageSizeOptions(): number[] {\n const options = this.resolvedConfig.pagination?.pageSizeOptions || [5, 10, 20];\n const unique = [...new Set(options.filter((value) => value > 0))];\n\n if (!unique.includes(this.pageSize)) {\n unique.push(this.pageSize);\n }\n\n return unique.sort((a, b) => a - b);\n }\n\n private resolvePageSizeOptionsGroupBy(): number[] {\n const options = this.resolvedConfig.pagination?.pageSizeOptionsGroupBy || this.resolvedConfig.pagination?.pageSizeOptions || [5, 10, 20];\n const unique = [...new Set(options.filter((v) => v > 0))];\n if (this.groupPageSize > 0 && !unique.includes(this.groupPageSize)) {\n unique.push(this.groupPageSize);\n }\n return unique.sort((a, b) => a - b);\n }\n\n private resolveDefaultGroupPageSize(): number {\n const cfg = this.resolvedConfig;\n const options = cfg.pagination?.pageSizeOptionsGroupBy || cfg.pagination?.pageSizeOptions;\n if (options?.length) return options[0];\n return cfg.pagination?.pageSize || 5;\n }\n\n private uniqueColumnsByKey(columns: TableColumnProvider<T>[]): TableColumnProvider<T>[] {\n const seen = new Set<string>();\n return columns.filter((column) => {\n if (seen.has(column.key)) {\n return false;\n }\n seen.add(column.key);\n return true;\n });\n }\n\n private attachPaginator(): void {\n if (!this.showPagination) {\n this.tableDataSource.paginator = null;\n return;\n }\n if (!this.paginator) return;\n\n this.tableDataSource.paginator = null;\n this.paginator.pageSize = this.pageSize;\n\n if (this._paginatorSubscribed !== this.paginator) {\n this._paginatorSubscribed = this.paginator;\n this.paginator.page.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this.pageSize = this.paginator!.pageSize;\n this.pageChange.emit({ pageIndex: this.paginator!.pageIndex, pageSize: this.paginator!.pageSize });\n if (this._pendingRender !== null) return;\n this._projectCurrentPage();\n this._cdr.markForCheck();\n });\n }\n }\n\n private attachSort(): void {\n if (!this.sort) return;\n\n this.tableDataSource.sort = null as any;\n\n if (this._sortSubscribed !== this.sort) {\n this._sortSubscribed = this.sort;\n this.sort.sortChange.pipe(takeUntil(this._destroy$)).subscribe(() => {\n this._activeSort = {\n active: this.sort.active,\n direction: this.sort.direction,\n };\n this.sortChange.emit({ active: this.sort.active, direction: this.sort.direction });\n this._scheduleRender();\n });\n }\n }\n}\n","<section class=\"jquery-table-wrapper\">\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">×</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showOrganizerButton\" class=\"table-toolbar-right\">\n <table-organizer-button\n [config]=\"organizerConfig\"\n [state]=\"organizerState\"\n (viewChange)=\"onOrganizerViewChange($event)\">\n </table-organizer-button>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Bannière message préférences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode édition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n <!-- Poignée de resize (visible uniquement en mode édition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">⚠</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null)\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">›</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">‹</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">›</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n (click)=\"onGroupHeaderClick(row)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showFirstLastButtons]=\"resolvedPaginationShowFirstLastButtons\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" \n [class.paginator-range-loader--no-first-last]=\"!resolvedPaginationShowFirstLastButtons\"\n *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n","/*\n * Public API Surface of jquery-table\n */\n\nexport * from './lib/jquery-table.model';\nexport * from './lib/jqt-i18n.token';\nexport * from './lib/component/table.component';\nexport * from './lib/component/organizer-button/organizer-button.component';\nexport { SliceConfig, SliceColumnDef, SliceCategory, SlicePanelComponent } from '@oneteme/jquery-organizer';\nexport { OrganizerButtonComponent, OrganizerConfig, OrganizerButtonEvent, OrganizerState } from '@oneteme/jquery-organizer';\nexport * from './lib/directive/jqt-cell-def.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAsEA;;;;;;;;;AASG;SACa,GAAG,CACjB,GAAW,EACX,MAAc,EACd,SAA2C,EAAA;IAE3C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;AACvC;;ACJA;AACa,MAAA,iBAAiB,GAAY;AACxC,IAAA,iBAAiB,EAAE,eAAe;AAClC,IAAA,iBAAiB,EAAE,mBAAmB;AACtC,IAAA,mBAAmB,EAAE,mBAAmB;AACxC,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,eAAe,EAAE,aAAa;AAC9B,IAAA,eAAe,EAAE,aAAa;AAC9B,IAAA,gBAAgB,EAAE,OAAO;AACzB,IAAA,WAAW,EAAE,mBAAmB;AAChC,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,aAAa,EAAE,OAAO;AACtB,IAAA,iBAAiB,EAAE,qBAAqB;AACxC,IAAA,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,CAAC,KAAK,KAAK,CAAA,mBAAA,EAAsB,KAAK,CAAyD,uDAAA,CAAA;AAC7G,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,cAAc,EAAE,+CAA+C;AAC/D,IAAA,kBAAkB,EAAE,sBAAsB;AAC1C,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,UAAU,EAAE,eAAe;AAC3B,IAAA,YAAY,EAAE,2BAA2B;AACzC,IAAA,gBAAgB,EAAE,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,GAAG,SAAS,GAAG,QAAQ;AAC7D,IAAA,uBAAuB,EAAE,SAAS;AAClC,IAAA,gBAAgB,EAAE,eAAe;AACjC,IAAA,iBAAiB,EAAE,UAAU;AAC7B,IAAA,oBAAoB,EAAE,aAAa;AACnC,IAAA,eAAe,EAAE,QAAQ;AACzB,IAAA,eAAe,EAAE,aAAa;AAC9B,IAAA,gBAAgB,EAAE,eAAe;AACjC,IAAA,uBAAuB,EAAE,wGAAwG;AACjI,IAAA,yBAAyB,EAAE,8BAA8B;AACzD,IAAA,sBAAsB,EAAE,2BAA2B;EACnD;AAEF;;;AAGG;MACU,QAAQ,GAAG,IAAI,cAAc,CAAmB,UAAU;;ACvHvE;;;;;;;;;;;;AAYG;MAKU,mBAAmB,CAAA;AAI9B,IAAA,WAAA,CAA4B,QAAwD,EAAA;QAAxD,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAgD;;QAF/D,IAAS,CAAA,SAAA,GAAW,EAAE,CAAC;KAE4C;+GAJ7E,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAJ/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;kGAGsB,SAAS,EAAA,CAAA;sBAA7B,KAAK;uBAAC,YAAY,CAAA;;;ACnBrB;SACgB,sBAAsB,GAAA;AACpC,IAAA,MAAM,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;AACpC,IAAA,IAAI,CAAC,iBAAiB,GAAG,qBAAqB,CAAC;AAC/C,IAAA,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC;AACrC,IAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;AAC3C,IAAA,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC;AACtC,IAAA,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC;IACrC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,MAAc,KAAI;AACtE,QAAA,IAAI,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAC;QAC7D,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC;QACnF,OAAO,CAAA,EAAG,KAAK,GAAG,CAAC,MAAM,GAAG,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAE,CAAC;AAC/C,KAAC,CAAC;AACF,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;AAOG;AACG,SAAU,kBAAkB,CAAC,KAAU,EAAA;AAC3C,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;IACD,IAAI,KAAK,YAAY,IAAI,EAAE;AACzB,QAAA,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;AAC/B,KAAA;AACD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,KAAA;AACD,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE;AACjD,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC5B,SAAA;QACD,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;AAC/C,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3B,SAAA;AACD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,KAAA;AACD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;AAGG;AACG,SAAU,WAAW,CAAC,GAAW,EAAA;AACrC,IAAA,OAAO,GAAG;AACP,SAAA,UAAU,CAAC,oBAAoB,EAAE,OAAO,CAAC;AACzC,SAAA,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;AACzB,SAAA,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACnD;;ACzDA,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC;;;AAGG;MACU,uBAAuB,CAAA;AAGlC,IAAA,WAAA,CAAY,OAAe,EAAA;AACzB,QAAA,IAAI,CAAC,GAAG,GAAG,cAAc,GAAG,OAAO,CAAC;KACrC;;IAGD,IAAI,GAAA;QACF,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,YAAA,OAAO,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,GAAG,IAAI,CAAC;AAC3D,SAAA;QAAC,MAAM;AACN,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;KACF;;AAGD,IAAA,IAAI,CAAC,MAAwB,EAAA;QAC3B,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACxD,SAAA;QAAC,MAAM;;AAEP,SAAA;KACF;;IAGD,KAAK,GAAA;AACH,QAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACnC;;IAGD,QAAQ,GAAA;QACN,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;KAChD;AACF;;ACzCD;;;;;AAKG;MACU,aAAa,CAAA;AACxB,IAAA,WAAA,CACmB,OAAkB,EAClB,UAA0C,EAC1C,SAAiD,EACjD,gBAA6E,EAAA;QAH7E,IAAO,CAAA,OAAA,GAAP,OAAO,CAAW;QAClB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAgC;QAC1C,IAAS,CAAA,SAAA,GAAT,SAAS,CAAwC;QACjD,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAA6D;KAC5F;IAEJ,MAAM,GAAA;AACJ,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,EAAE,OAAO;YAAE,OAAO;AAC1B,QAAA,MAAM,IAAI,GAAM,IAAI,CAAC,OAAO,EAAE,CAAC;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAC;AAErD,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;YAClC,IAAI,GAAG,CAAC,SAAS,EAAE;gBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,gBAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5E,aAAA;AACD,YAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvG,SAAC,CAAC,CAAC;;QAGH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACtG,MAAM,GAAG,GAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,GAAM,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACzC,QAAA,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;AACb,QAAA,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;QACtE,CAAC,CAAC,KAAK,EAAE,CAAC;AACV,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;KAC1B;AAEO,IAAA,UAAU,CAAC,KAAa,EAAA;QAC9B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACtE,YAAA,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;AAC9C,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AACF;;AChDD;;;;;AAKG;AAEH;AACO,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAE9C;AACO,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAEnD;AACO,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAEzD;AACO,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAExD;AACO,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC;AACO,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC;AACO,MAAM,aAAa,GAAG,YAAY,CAAC;AAE1C;AACO,MAAM,eAAe,GAAG,cAAc,CAAC;AAE9C;AACO,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C;AACO,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD;AACO,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAErD;AACO,MAAM,gBAAgB,GAAG,gBAAgB;;MCvBnC,+BAA+B,CAAA;AAf5C,IAAA,WAAA,GAAA;QAkBW,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;AACtB,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAwB,CAAC;AACtD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAA8B,CAAC;AAC7E,KAAA;+GANY,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,EAXhC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;AAQT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EATS,wBAAwB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;4FAYvB,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAf3C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,wBAAwB;oBAClC,OAAO,EAAE,CAAC,wBAAwB,CAAC;AACnC,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;AAQT,EAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA,CAAA;8BAEU,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACI,UAAU,EAAA,CAAA;sBAAnB,MAAM;gBACG,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;;;MCyBI,cAAc,CAAA;AAT3B,IAAA,WAAA,GAAA;QAyBW,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;AAWjB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAQ,CAAC;AACxC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAA0B,CAAC;AACzD,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAA0B,CAAC;AAC3D,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU,CAAC;AAC9C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAK,CAAC;;AAGpC,QAAA,IAAA,CAAA,UAAU,GAAM,IAAI,YAAY,EAAsD,CAAC;;AAEvF,QAAA,IAAA,CAAA,UAAU,GAAM,IAAI,YAAY,EAA2C,CAAC;;AAE5E,QAAA,IAAA,CAAA,YAAY,GAAI,IAAI,YAAY,EAAU,CAAC;;AAE3C,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAiB,CAAC;;AAElD,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAY,CAAC;;AAiB/C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAA0D,CAAC;QAExF,IAAe,CAAA,eAAA,GAAa,EAAE,CAAC;AAC/B,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,kBAAkB,CAAM,EAAE,CAAC,CAAC;;QAGzC,IAAiB,CAAA,iBAAA,GAAG,gBAAgB,CAAC;;QAErC,IAAY,CAAA,YAAA,GAAG,WAAW,CAAC;QAC3B,IAAc,CAAA,cAAA,GAAG,aAAa,CAAC;QAC/B,IAAc,CAAA,cAAA,GAAG,aAAa,CAAC;QAC/B,IAAgB,CAAA,gBAAA,GAAG,eAAe,CAAC;QACnC,IAAe,CAAA,eAAA,GAAG,cAAc,CAAC;QACjC,IAAqB,CAAA,qBAAA,GAAG,oBAAoB,CAAC;;AAG7C,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,eAAe,EAA0B,CAAC;AAEpE;;;AAGG;QACH,IAAY,CAAA,YAAA,GAA6B,EAAE,CAAC;AAE5C,QAAA,IAAA,CAAA,iBAAiB,GAAwB,MAAM,IAAI,CAAC;;QAGpD,IAAa,CAAA,aAAA,GAAU,EAAE,CAAC;QAC1B,IAAa,CAAA,aAAA,GAA6B,EAAE,CAAC;QAC7C,IAAU,CAAA,UAAA,GAAQ,EAAE,CAAC;QACrB,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC;;QAExB,IAAe,CAAA,eAAA,GAAG,KAAK,CAAC;;QAExB,IAAoB,CAAA,oBAAA,GAAG,KAAK,CAAC;QAQ7B,IAAiB,CAAA,iBAAA,GAA0G,EAAE,CAAC;QAE9H,IAAW,CAAA,WAAA,GAAG,EAAE,CAAC;QAEjB,IAAc,CAAA,cAAA,GAAG,EAAE,CAAC;QACpB,IAAiB,CAAA,iBAAA,GAAwB,EAAE,CAAC;QACpC,IAAW,CAAA,WAAA,GAAuD,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAChG,IAAe,CAAA,eAAA,GAAmB,IAAI,CAAC;AACvC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,OAAO,EAAQ,CAAC;QAChC,IAAmB,CAAA,mBAAA,GAAG,CAAC,CAAC;;AAGvB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,cAAc,CACpC,MAAQ,EAAA,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,EAC/D,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAC9B,CAAC;;AASM,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,gBAAgB,EAA0B,CAAC;AAKvD,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACjC,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,EAAC,UAAuB,EAAC,CAAC;AACtC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,IAAQ,CAAA,QAAA,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;AAG/C,QAAA,IAAA,CAAA,IAAI,GAAY,EAAE,GAAG,iBAAiB,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;AAE5E,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,CAAS,EAAE,GAAQ,KAAc,GAAG,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;;QAgBnE,IAAO,CAAA,OAAA,GAAG,IAAI,aAAa,CAC1C,MAAM,IAAI,CAAC,gBAAgB,EAC3B,MAAM,IAAI,CAAC,YAAY,EACvB,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAChC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CACxD,CAAC;;QAIF,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAC;QACb,IAAe,CAAA,eAAA,GAAa,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACxC,IAAsB,CAAA,sBAAA,GAAa,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAE/C,IAAgB,CAAA,gBAAA,GAAkB,IAAI,CAAC;QACvC,IAAiB,CAAA,iBAAA,GAAkB,IAAI,CAAC;;;QAIxC,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;;QAElB,IAAa,CAAA,aAAA,GAA2B,EAAE,CAAC;;QAE3C,IAAmB,CAAA,mBAAA,GAAkB,IAAI,CAAC;;QAE1C,IAAe,CAAA,eAAA,GAAG,KAAK,CAAC;QAChB,IAAmB,CAAA,mBAAA,GAAmC,IAAI,CAAC;;QAE3D,IAAsB,CAAA,sBAAA,GAAG,KAAK,CAAC;QAC/B,IAAY,CAAA,YAAA,GAA+D,IAAI,CAAC;;QAEhF,IAAwB,CAAA,wBAAA,GAAoB,IAAI,CAAC;;QAEjD,IAAoB,CAAA,oBAAA,GAAoC,IAAI,CAAC;AAE7D,QAAA,IAAA,CAAA,cAAc,GAAqB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACnD,QAAA,IAAA,CAAA,UAAU,GAAwC,IAAI,GAAG,EAAE,CAAC;QAC5D,IAAa,CAAA,aAAA,GAAQ,EAAE,CAAC;QACxB,IAAkB,CAAA,kBAAA,GAAkB,IAAI,CAAC;;QAOzC,IAAgB,CAAA,gBAAA,GAAQ,EAAE,CAAC;QAC3B,IAAoB,CAAA,oBAAA,GAAwB,IAAI,CAAC;;QAGjD,IAAW,CAAA,WAAA,GAA2B,IAAI,CAAC;QAC3C,IAAc,CAAA,cAAA,GAAyC,IAAI,CAAC;AAE5D,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC3C,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;;QAItC,IAAe,CAAA,eAAA,GAAa,EAAE,CAAC;QA8F/B,IAAqB,CAAA,qBAAA,GAA2B,IAAI,CAAC;AA4d7D,QAAA,IAAA,CAAA,UAAU,GAAG,CAAC,MAAc,EAAE,GAAQ,KACpC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAW,QAAA,EAAA,GAAG,CAAC,aAAa,CAAC,CAAA,CAAE,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC;QA8MpF,IAAwB,CAAA,wBAAA,GAAyC,IAAI,CAAC;AAwsB/E,KAAA;;IAhpDC,IACI,gBAAgB,CAAC,KAAiC,EAAA;AACpD,QAAA,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,SAAA;KACF;IAmBD,IACI,SAAS,CAAC,KAA+B,EAAA;AAC3C,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,QAAA,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;AACxB,SAAA;KACF;IACD,IAAI,SAAS,KAA+B,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE;;IA4CrE,IAAI,oBAAoB,GAA2D,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE;AAChI,IAAA,IAAI,0BAA0B,GAAA,EAA+B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;AAClH,IAAA,IAAI,gCAAgC,GAAA,EAA+B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;AACxH,IAAA,IAAI,uBAAuB,GAAA,EAA+B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;AAC5G,IAAA,IAAI,mBAAmB,GAAA,EAAa,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAIjF,IAAA,IAAI,gBAAgB,GAAA,EAAoB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;;IAenF,IAAI,aAAa,GAAa,EAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;AACnE,IAAA,IAAI,aAAa,CAAC,CAAS,EAAA,EAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE;IACjE,IAAI,cAAc,GAAqB,EAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;AAC7E,IAAA,IAAI,cAAc,CAAC,CAAiB,EAAA,EAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,CAAC,CAAC,EAAE;;IAK3E,IAAI,iBAAiB,GAAK,EAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;;IAErD,IAAI,eAAe,GAAK,EAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;;AAYjD,IAAA,gBAAgB,CAAC,GAAQ,EAAA;AACvB,QAAA,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,sBAAsB,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,kBAAkB,CAAC;KACnG;AACD,IAAA,iBAAiB,CAAC,GAAQ,EAAa,EAAA,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,sBAAsB,CAAC,EAAE;AAC9F,IAAA,iBAAiB,CAAC,GAAQ,EAAa,EAAA,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,kBAAkB,CAAC,EAAE;;AAG1F,IAAA,kBAAkB,CAAC,GAAQ,EAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;YAAE,OAAO;QACxC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;KAC9C;;aA4CuB,IAAe,CAAA,eAAA,GAAG,GAAH,CAAO,EAAA;AAiB9C,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,MAAM,WAAW,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;AACtF,QAAA,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;AACxB,SAAA;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACxB,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;YACrB,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,uBAAuB,EAAE,CAAC;AAC/B,YAAA,IAAI,CAAC,0BAA0B,EAAE,CAAC;AACnC,SAAA;AACD,QAAA,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,SAAA;KACF;IAED,kBAAkB,GAAA;QAChB,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACpE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAC3B,SAAC,CAAC,CAAC;KACJ;IAED,eAAe,GAAA;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,6BAA6B,EAAE,CAAC;KACtC;IAEO,6BAA6B,GAAA;AACnC,QAAA,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAC1D,QAAA,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACtD,QAAA,IAAI,CAAC,iBAAiB,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAErD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,CAAC;AAClD,QAAA,MAAM,IAAI,GAAG,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,wBAAyB,CAAC,GAAG,EAAE,CAAC;AAC1E,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC;AACpF,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAEjC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBACnC,OAAO,CAAC,GAAG,CAAC,oGAAoG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACrI,gBAAA,IAAI,OAAO;AAAE,oBAAA,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC;AACjD,gBAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;AAAE,oBAAA,IAAI,CAAC,wBAAwB,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC/D,OAAO;AACR,aAAA;YACD,OAAO,CAAC,GAAG,CAAC,0EAA0E,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3G,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,IAAG;AACjB,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAC7C,gBAAA,IAAI,GAAG;AAAE,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACrC,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE;AACjC,gBAAA,OAAO,CAAC,GAAG,CAAC,sDAAsD,EAAE,OAAO,CAAC,CAAC;AAC7E,gBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC5C,aAAA;AACD,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAC3B,SAAC,CAAC,CAAC;KACJ;IAED,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAChC,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACnC,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,wBAAwB,KAAK,IAAI,EAAE;AAC1C,YAAA,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAC7C,SAAA;;AAED,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;KAC3B;IAEO,oBAAoB,GAAA;QAC1B,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,uBAAuB,CAAgB,CAAC;AAC/F,YAAA,IAAI,SAAS,EAAE;gBACb,MAAM,CAAC,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC;gBACnD,IAAI,CAAC,GAAG,CAAC,EAAE;AACT,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;oBAC7E,OAAO;AACR,iBAAA;AACF,aAAA;;AAED,YAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,qBAAqB,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;AAC/E,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,qBAAqB,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;KAC9E;IAGO,0BAA0B,GAAA,EAAW,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,EAAE;AACjF,IAAA,IAAI,eAAe,GAAA;QACjB,IAAI,IAAI,CAAC,qBAAqB;YAAE,OAAO,IAAI,CAAC,qBAAqB,CAAC;AAClE,QAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAC3F,IAAI,CAAC,qBAAqB,GAAG;AAC3B,YAAA,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK;gBACrD,EAAE,EAAE,CAAC,CAAC,GAAG;AACT,gBAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;AACZ,gBAAA,KAAK,EAAE,OAAgB;AACxB,aAAA,CAAC,CAAC,GAAG,SAAS;YACf,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK;gBACnF,EAAE,EAAE,CAAC,CAAC,GAAG;AACT,gBAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;AACb,aAAA,CAAC,CAAC,GAAG,SAAS;AACf,YAAA,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,KAAK;gBAC/E,EAAE,EAAE,IAAI,CAAC,GAAG;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;AAChB,aAAA,CAAC,CAAC,GAAG,SAAS;YACf,UAAU,EAAE,IAAI,CAAC,gBAAgB;AACjC,YAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;YAC/B,eAAe,EAAE,IAAI,CAAC,mBAAmB;YACzC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;AAC7C,YAAA,iBAAiB,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AAC7C,YAAA,iBAAiB,EAAE,MAAM,IAAI,CAAC,eAAe,EAAE;AAC/C,YAAA,kBAAkB,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE;SAClD,CAAC;QACF,OAAO,IAAI,CAAC,qBAAqB,CAAC;KACnC;AAED,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;AACL,YAAA,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AAClD,YAAA,eAAe,EAAE,IAAI,CAAC,gBAAgB,IAAI,SAAS;YACnD,cAAc,EAAE,IAAI,CAAC,iBAAiB;iBACnC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;iBAC1C,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;SACnB,CAAC;KACH;AAED,IAAA,qBAAqB,CAAC,KAA2B,EAAA;AAC/C,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE;AACjC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAC3F,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;AAC5D,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;gBACzB,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,YAAY,EAAE;AAClD,oBAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AAClD,iBAAA;AACF,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE;YAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC;AACnD,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC;AACxE,SAAA;AAAM,aAAA,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE;AACzC,YAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;YACrE,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACrF,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;AACnE,gBAAA,IAAI,IAAI;AAAE,oBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC3C,aAAA;AACF,SAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;KAC1B;AAED,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC;KACxC;AAED,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;KACpC;AAED,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC;KAC1B;AAED,IAAA,IAAI,aAAa,GAAA,EAAc,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,EAAE;AACrF,IAAA,IAAI,cAAc,GAAc,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE;AACtH,IAAA,IAAI,mBAAmB,GAAc,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE;AAC3H,IAAA,IAAI,kBAAkB,GAAc,EAAA,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,gBAAgB,CAAC,EAAE;AACxH,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;KACrD;AACD,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;KAC1D;AAED,IAAA,IAAI,sBAAsB,GAAA;QACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,KAAK,CAAC;QACzC,OAAO,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;KACrE;IAED,IAAI,mBAAmB,KAAc,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE;AAEnE,IAAA,IAAI,WAAW,GAAc,EAAA,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE;IAE3G,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;KACnC;IACD,IAAI,UAAU,GAAc,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;IAChE,IAAI,kBAAkB,GAAc,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;AAEhF,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;KACxF;IAED,IAAI,kBAAkB,GAAa,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;IAE/E,IAAI,gBAAgB,GAAa,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE;AAE1E,IAAA,IAAI,kBAAkB,GAAA,EAAa,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAEhF,IAAA,IAAI,yBAAyB,GAAA,EAA+B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;AAEjH,IAAA,uBAAuB,CAAC,GAAW,EAAA;AACjC,QAAA,IAAI,CAAC,aAAa,EAAE,uBAAuB,CAAC,GAAG,CAAC,CAAC;KAClD;IAED,IAAI,cAAc,GAA+B,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;AAExF,IAAA,QAAQ,CAAC,GAAqC,EAAY,EAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;IAEnG,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;KAC1C;AAED,IAAA,eAAe,CAAC,GAAkB,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAChD,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7B,QAAA,IAAI,GAAG,EAAE;YACP,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAC5E,YAAA,IAAI,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;AAChE,gBAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC/B,aAAA;AACF,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,UAAU,CAAC,MAAK;AACnD,gBAAA,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AAClF,aAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACR,SAAA;KACF;AAED,IAAA,qBAAqB,CAAC,IAAqB,EAAA;QACzC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;KACnD;AAED,IAAA,iBAAiB,CAAC,GAAmB,EAAA;QACnC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,GAAG,KAAI;YAC3C,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3F,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,mBAAmB,CAAC,GAAW,EAAA;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;KAClC;AAED,IAAA,iBAAiB,CAAC,QAAa,EAAA;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;KAC3C;AAED,IAAA,eAAe,CAAC,MAA8B,EAAA;AAC5C,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;KACrE;AAED,IAAA,gBAAgB,CAAC,MAA8B,EAAA;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;KACrE;IAEO,cAAc,GAAA;QACpB,OAAO;AACL,YAAA,SAAS,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE;YACxC,cAAc,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;SAC/C,CAAC;KACH;AAED,IAAA,mBAAmB,CAAC,QAAgB,EAAA;QAClC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAI;YAClD,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3F,SAAC,CAAC,CAAC;KACJ;AAEO,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AAC1C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC;AACzD,QAAA,IAAI,CAAC,SAAS;YAAE,OAAO;AACvB,QAAA,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAc,CAAA,mBAAA,EAAsB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA,EAAA,CAAI,CAAC,CAAC;AACjG,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,YAAY,GAAG,UAAU,CAC7B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,IAAI,IAAI,CAChF,IAAI,EAAE,CAAC;AACR,QAAA,MAAM,aAAa,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;AACxD,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;AAC5C,QAAA,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,CAAC;AAC7C,QAAA,MAAM,eAAe,GAAG,gBAAgB,IAAI,OAAO,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;AAC5F,QAAA,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;KAClE;AAED,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;KACjD;AAED,IAAA,aAAa,CAAC,QAAgB,EAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;KACvC;IAED,gBAAgB,CAAC,QAAgB,EAAE,UAAkB,EAAA;QACnD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;KACtD;AAED,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;KACnG;AAED,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;KACvC;AAED,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;KAC3C;AAED,IAAA,IAAI,qBAAqB,GAAA;QACvB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,QAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KAChG;AAED,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;KAC1C;AAED,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;KACtD;AAED,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;KAC7B;AAED,IAAA,2BAA2B,CAAC,SAAkB,EAAA;AAC5C,QAAA,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;KAC1B;IAEO,wBAAwB,GAAA;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;AACvG,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;AACxC,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;;;;AAI/D,QAAA,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,wBAAwB,CAAC,EAAE;AACvG,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC;AAC1C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,CAAC;AAClD,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACjC,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,2DAA2D,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YACnG,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,WAAW,EAAE;AACf,oBAAA,WAAW,CAAC,OAAO,CAAC,GAAG,IAAG;AACxB,wBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAC7C,wBAAA,IAAI,GAAG;AAAE,4BAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACrC,qBAAC,CAAC,CAAC;AACJ,iBAAA;AACD,gBAAA,IAAI,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE;AACjC,oBAAA,OAAO,CAAC,GAAG,CAAC,+DAA+D,EAAE,OAAO,CAAC,CAAC;AACtF,oBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC5C,iBAAA;AACD,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAC3B,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;AAED,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;KAC3C;AAED,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;KAC5C;AAED,IAAA,IAAI,+BAA+B,GAAA;AACjC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC;KACpD;AAED,IAAA,oBAAoB,CAAC,SAAiB,EAAA;QACpC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;KACpD;AAED,IAAA,iBAAiB,CAAC,SAAiB,EAAA;QACjC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAClD,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;;AAC3C,YAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AACpE,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;;;AAGjD,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACvB,YAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,IAAI,CAAC;AACrC,SAAA;QACD,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,eAAe,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;KAC1B;AAED,IAAA,eAAe,CAAC,MAA8B,EAAA;AAC5C,QAAA,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;AAC5C,QAAA,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;AACtE,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC/B,SAAA;KACF;AAED,IAAA,IAAI,sBAAsB,GAAA;QACxB,OAAO,IAAI,CAAC,uBAAuB,CAAC;KACrC;AAED,IAAA,oBAAoB,CAAC,GAAW,EAAA;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;KAClD;AAED,IAAA,kBAAkB,CAAC,GAA2B,EAAA;QAC5C,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACvC,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3B,SAAA;KACF;AAED,IAAA,mBAAmB,CAAC,IAAyB,EAAA;AAC3C,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;KAC7B;AAED,IAAA,wBAAwB,CAAC,IAAc,EAAA;AACrC,QAAA,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,wBAAwB,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;KAC1B;AAED,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;KAClE;AAED,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;KACtE;AAED,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC;KACvB;AAED,IAAA,IAAI,OAAO,GAAA;;AAET,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,CAAC;KAC9F;AAED,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;AAAE,YAAA,OAAO,KAAK,CAAC;QACjD,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,KAAK,KAAK,CAAC;KAC1D;AAED,IAAA,IAAI,sCAAsC,GAAA;QACxC,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,oBAAoB,KAAK,KAAK,CAAC;KACvE;AAED,IAAA,IAAI,uBAAuB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;KAC/C;AAED,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,gBAAgB;cACxB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM;AACzE,cAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;KAClC;;AAID,IAAA,WAAW,CAAC,MAA8B,EAAA;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC;QAC5D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC/B,SAAA;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC/B;IAED,wBAAwB,CAAC,MAA8B,EAAE,OAAgB,EAAA;AACvE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAE7D,QAAA,IAAI,OAAO,IAAI,CAAC,SAAS,EAAE;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE;AACzB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACxD,YAAA,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC;YAC5D,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACxB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjC,SAAA;KACF;AAED,IAAA,eAAe,CAAC,SAAiB,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;KACzD;IAED,cAAc,CAAC,SAAiB,EAAE,KAAa,EAAA;QAC7C,KAAK,EAAE,eAAe,EAAE,CAAC;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACjC;;IAIO,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CACxB,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAA6D,CAAC,CACvH,CAAC;KACH;AAED,IAAA,eAAe,CAAC,GAAW,EAAA;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;KAC1C;AAED,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;KAClC;AAED,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;KACzE;AAED;;AAE+G;AAC/G,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,QAAA,MAAM,oBAAoB,GAAG,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AAChF,QAAA,IAAI,CAAC,oBAAoB;AAAE,YAAA,OAAO,IAAI,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE;YACnC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;gBACvC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACpC,aAAA;iBAAM,IAAI,GAAG,CAAC,KAAK,EAAE;AACpB,gBAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;oBAAE,GAAG,IAAI,EAAE,CAAC;AAAE,iBAAA;AACxC,qBAAA;oBAAE,GAAG,IAAI,GAAG,CAAC;AAAE,iBAAA;AACrB,aAAA;AAAM,iBAAA;AACL,gBAAA,GAAG,IAAI,GAAG,CAAC;AACZ,aAAA;AACF,SAAA;QACD,OAAO,GAAG,GAAG,IAAI,CAAC;KACnB;AAKD,IAAA,WAAW,CAAC,GAAQ,EAAA;AAClB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;AACxC,QAAA,IAAI,CAAC,EAAE,IAAI,GAAG,GAAG,mBAAmB,CAAC;AAAE,YAAA,OAAO,EAAE,CAAC;AACjD,QAAA,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;KAC7D;IAED,UAAU,CAAC,GAAQ,EAAE,KAAwB,EAAA;AAC3C,QAAA,IAAI,GAAG,GAAG,mBAAmB,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QACrC,MAAM,QAAQ,IAAI,GAAG,GAAG,WAAW,CAAC,IAAI,GAAG,CAAM,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACjC;;IAID,iBAAiB,CAAC,SAAiB,EAAE,KAAgB,EAAA;QACnD,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACpD,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,YAAA,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC;YAC1C,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AACrD,SAAA;KACF;IAED,gBAAgB,CAAC,SAAiB,EAAE,KAAgB,EAAA;AAClD,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAChF,OAAO;AACR,SAAA;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;KACpC;IAED,YAAY,CAAC,eAAuB,EAAE,KAAgB,EAAA;AACpD,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAChF,OAAO;AACR,SAAA;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;AAEvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;AACR,SAAA;QAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;IAED,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;KAC/B;AAED,IAAA,kBAAkB,CAAC,SAAiB,EAAA;AAClC,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC;KAC/G;;IAID,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;KAC1B;IAED,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;KAC1B;;IAGD,aAAa,CAAC,SAAiB,EAAE,KAAiB,EAAA;QAChD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,EAAE,GAAI,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,IAAI,CAAuB,CAAC;AAC7E,QAAA,IAAI,CAAC,EAAE;YAAE,OAAO;AAEhB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC;AACxD,QAAA,IAAI,QAAQ,EAAE;YACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAc,wBAAwB,CAAC,CAAC;AAC/E,YAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;AACnB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;gBACjG,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AACnF,gBAAA,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;gBACrE,IAAI,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;AAChD,oBAAA,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5E,iBAAA;AACH,aAAC,CAAC,CAAC;AACJ,SAAA;QAED,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;AAE1F,QAAA,MAAM,MAAM,GAAG,CAAC,CAAa,KAAI;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,gBAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAChD,gBAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC5C,OAAO;AACR,aAAA;YACD,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AACnD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;AACpE,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,QAAQ,EAAE,CAAC;;;AAGlF,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AAC5B,SAAC,CAAC;QAEF,MAAM,IAAI,GAAG,MAAK;AAChB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAChD,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9C,SAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAK;AAClC,YAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC7C,YAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC3C,SAAC,CAAC,CAAC;KACJ;;AAGD,IAAA,cAAc,CAAC,GAAW,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrC,QAAA,OAAO,GAAG,EAAE,KAAK,IAAI,MAAM,CAAC;KAC7B;;IAID,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACrF,QAAA,MAAM,MAAM,GAAqD;AAC/D,YAAA,MAAM,EAAe,IAAI,CAAC,WAAW,IAAI,SAAS;YAClD,OAAO,EAAc,IAAI,CAAC,gBAAgB;AAC1C,YAAA,WAAW,EAAU,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACtD,YAAA,cAAc,EAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;YACtD,YAAY,EAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,SAAS;YACnG,mBAAmB,EAAE,IAAI,CAAC,oBAAoB;AAC9C,YAAA,eAAe,EAAM,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC;YACrD,gBAAgB,EAAK,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,GAAG,SAAS;AAC3E,YAAA,YAAY,EAAS,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,GAAG,SAAS;SAC5F,CAAC;AACF,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;KACjE;IAED,gBAAgB,GAAA;QACd,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO;AACtC,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;;AAG7B,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;;AAGlF,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;;;;AAIlC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;AACnC,YAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;AAClC,SAAA;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;;QAGzC,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;;AAGpE,QAAA,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;;AAGpC,QAAA,qBAAqB,CAAC,OAAO,CAAC,GAAG,IAAG;YAClC,IAAI,CAAC,aAAa,EAAE,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACvD,SAAC,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,IAAI,CAAC;QACpC,IAAI,IAAI,CAAC,aAAa;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;;QAG9D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;AACxD,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;KACnE;AAIO,IAAA,uBAAuB,CAAC,GAAW,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,wBAAwB,KAAK,IAAI;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AACxF,QAAA,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,wBAAwB,GAAG,UAAU,CAAC,MAAK;AAC9C,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACrC,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAChC,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;SAC1B,EAAE,IAAI,CAAC,CAAC;KACV;AAEO,IAAA,iBAAiB,CAAC,KAA8D,EAAA;AACtF,QAAA,IAAI,CAAC,KAAK;YAAE,OAAO;;QAEnB,IAAI,KAAK,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;;QAElD,IAAI,KAAK,CAAC,YAAY;YAAE,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;;AAEvE,QAAA,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE;YAC/B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,OAAO,EAAE;AACjB,gBAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACxC,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;AACvB,aAAA;AACF,SAAA;;AAED,QAAA,IAAI,KAAK,CAAC,mBAAmB,KAAK,SAAS;AAAE,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,mBAAmB,CAAC;;AAEnG,QAAA,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE;YACvC,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC7D,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AACrE,SAAA;;;;QAID,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,cAAc,CAAC;QAC7D,IAAI,UAAU,EAAE,MAAM,EAAE;AACtB,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;YAEnF,MAAM,OAAO,GAAG,UAAU;iBACvB,GAAG,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAC7B,MAAM,CAAC,CAAC,CAAC,KAAkC,CAAC,KAAK,SAAS,CAAC,CAAC;;;AAG/D,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,gBAAA,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AAC1C,aAAA;AACF,SAAA;;AAED,QAAA,IAAI,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE;AAClC,YAAA,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC,gBAAgB,CAAC;AACxD,SAAA;;;;;AAKD,QAAA,IAAI,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE;AAChE,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,YAAY,CAAC;AAChD,SAAA;KACF;AAED,IAAA,eAAe,CAAC,MAA8B,EAAA;AAC5C,QAAA,QACE,IAAI,CAAC,UAAU,CAAC,iBAAiB;YACjC,MAAM,CAAC,SAAS,KAAK,KAAK;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAC5B;KACH;AAED,IAAA,WAAW,CAAC,KAAU,EAAA;AACpB,QAAA,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC;KACtC;AAED,IAAA,OAAO,CAAC,KAAU,EAAA;AAChB,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;KACtB;;IAID,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;KACvB;;IAIO,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;QAGpF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO;AACtD,cAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO;cACvC,IAAI,CAAC;AACT,QAAA,MAAM,SAAS,GAAG,OAAO,IAAI,IAAI,CAAC;;QAElC,IAAI,YAAY,GAA4D,IAAI,CAAC;AACjF,QAAA,IAAI,SAAS,IAAI,IAAI,CAAC,mBAAmB,EAAE,GAAG,MAAM,YAAY,GAAG,SAAS,CAAC,EAAE;YAC7E,IAAI,CAAC,mBAAmB,GAAG,IAAI,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAClE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;AAC3D,YAAA,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;AAChD,SAAA;aAAM,IAAI,CAAC,SAAS,EAAE;AACrB,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AAChC,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;AAC9B,SAAA;;AAGD,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AACrB,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI;AAChC,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE;AACzC,YAAA,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE;AAC9C,YAAA,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc;AACnD,SAAA,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,EAAE;AACzI,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACxC,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;AAClE,SAAA;;QAGD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;AAExD,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAEzD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;AACnE,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,6BAA6B,EAAE,CAAC;AACnE,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACzF,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;AACzD,SAAA;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,EAAE,CAAC;;;AAIlB,QAAA,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAU,CAAC,CAC/F,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE;AACvE,YAAA,IAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC;;;YAGzC,IAAI,CAAC,YAAY,EAAE;gBACjB,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;gBACvD,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AACrE,aAAA;AACF,SAAA;;;AAID,QAAA,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACtC,SAAA;;;;;AAMD,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACjD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,CAAC;AACvD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC;QACrC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,KAAK,KAAK,CAAC;QACxE,IAAI,CAAC,wBAAwB,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;YAC/D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC;YAC7D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC;AACpE,SAAA;QACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,IAAI,CAAC,eAAe,EAAE,CAAC;KACxB;AAED;AAC8F;IACtF,oBAAoB,GAAA;AAC1B,QAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAC9C,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CACnE,CAAC;KACH;AAEO,IAAA,OAAO,UAAU,CAAC,CAAc,EAAE,CAAc,EAAA;AACtD,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,CAAC;AAAE,YAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,KAAK,CAAC;AAC/C,QAAA,OAAO,IAAI,CAAC;KACb;IAEO,sBAAsB,GAAA;QAC5B,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9E,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,KAAK,GAA0G,EAAE,CAAC;QACxH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,EAAE;AACnD,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAChC,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC/B,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACzE,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,aAAA;iBAAM,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACvC,gBAAA,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AAC9F,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,aAAA;AACF,SAAA;AACD,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE;YACzC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;gBACpB,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1E,aAAA;AACF,SAAA;AACD,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,0BAA0B,EAAE,CAAC;KACnC;IAED,IAAI,gBAAgB,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAEzD,IAAA,oBAAoB,CAAC,IAAsE,EAAA;QACzF,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClC,SAAA;aAAM,IAAI,IAAI,CAAC,GAAG,EAAE;AACnB,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,SAAA;KACF;AAED,IAAA,qBAAqB,CAAC,IAAwC,EAAA;QAC5D,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAClG;IAEO,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAChC,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAClC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC5B,SAAA;AACD,QAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAK;AAClC,YAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;AACpC,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC3B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;aAC/C,EAAE,CAAC,CAAC,CAAC;AACR,SAAC,CAAC,CAAC;KACJ;IAEO,cAAc,GAAA;AACpB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,gBAAgB,EAAE;;AAEzB,YAAA,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;AACtC,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9C,IAAI,CAAC,gBAAgB,GAAG,SAAS,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;AACtF,SAAA;;QAGD,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACzF,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACrD,YAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAChC,SAAA;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;;;AAG3B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;KAC3B;IAEO,mBAAmB,GAAA;QACzB,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpE,OAAO;AACR,SAAA;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,CAAC,CAAC;AACjD,QAAA,MAAM,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;AACxC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE3E,MAAM,SAAS,GAAU,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;AAC1B,YAAA,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;AACtB,YAAA,MAAM,CAAC,GAAQ,EAAE,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,aAAa,GAAG,GAAG,EAAE,CAAC;YAC5D,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAChC,gBAAA,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACpD,aAAC,CAAC,CAAC;AACH,YAAA,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,SAAS,CAAC;KACvC;IAEO,oBAAoB,GAAA;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;AAEhC,QAAA,MAAM,OAAO,GACX,MAAM,CAAC,OAAO;AACd,YAAA,IAAI,CAAC,aAAa;AAClB,YAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;;QAGtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;AAEtC,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,IAAI,cAAc,CAAC,YAAY,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChH,QAAA,MAAM,YAAY,GAAyB;AACzC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,QAAQ,EAAE,WAAW;YACrB,GAAG,MAAM,CAAC,MAAM;SACjB,CAAC;AAEF,QAAA,MAAM,WAAW,GAA2B;AAC1C,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,OAAO,EAAE,WAAW;YACpB,GAAG,MAAM,CAAC,WAAW;SACtB,CAAC;QAEF,OAAO;AACL,YAAA,GAAG,MAAM;YACT,OAAO;YACP,IAAI;AACJ,YAAA,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;AAC3B,YAAA,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,IAAI;AACnD,YAAA,MAAM,EAAE,YAAY;AACpB,YAAA,WAAW,EAAE,WAAW;SACzB,CAAC;KACH;IAEO,sBAAsB,GAAA;AAC5B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;QACxD,MAAM,WAAW,GAAG,CAAC,CAAC,UAAU,IAAI,UAAU,KAAK,IAAI,CAAC,2BAA2B,CAAC;AAEpF,QAAA,IAAI,CAAC,2BAA2B,GAAG,UAAU,CAAC;QAE9C,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAEO,uBAAuB,GAAA;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC;QAC9D,IAAI,YAAY,IAAI,IAAI,EAAE;YACxB,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;IAEO,OAAO,YAAY,CAAC,IAAc,EAAA;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,UAAU,CAAC;AACnB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;AACpC,SAAA;AACD,QAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;KACxC;IAEO,WAAW,GAAA;QACjB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC5B,OAAO,IAAI,CAAC,IAAI,CAAC;AAClB,SAAA;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC,UAAU,CAAC;AACxB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAE,IAAI,CAAC,UAAkB,CAAC,IAAI,CAAC,EAAE;AACnE,YAAA,OAAQ,IAAI,CAAC,UAAkB,CAAC,IAAI,CAAC;AACtC,SAAA;AAED,QAAA,OAAO,EAAE,CAAC;KACX;AAEO,IAAA,wBAAwB,CAAC,IAAS,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE;YACjC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;gBACzC,GAAG;AACH,gBAAA,MAAM,EAAE,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC;AACrD,aAAA,CAAC,CAAC,CAAC;AACL,SAAA;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAQ,CAAC;AAChC,QAAA,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAC7C,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AAED,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;YACzC,GAAG;AACH,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC;AACrD,SAAA,CAAC,CAAC,CAAC;KACL;IAEO,uBAAuB,GAAA;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAEhC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEnD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACrD,QAAA,IAAI,KAAK,EAAE;YACT,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC;AACjE,YAAA,MAAM,UAAU,GAAG,cAAc,EAAE,MAAM;kBACrC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;kBAC7E,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AAClC,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,KAC7B,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,KAAI;gBACtB,MAAM,GAAG,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpD,gBAAA,OAAO,GAAG,IAAI,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aACjE,CAAC,CACH,CAAC;AACH,SAAA;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;AAEO,IAAA,WAAW,CAAC,IAAS,EAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAEvC,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,MAAM,GAAU,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;AAC1B,gBAAA,MAAM,SAAS,GAAQ,EAAE,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,aAAa,GAAG,KAAK,EAAE,CAAC;gBACtE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAChC,oBAAA,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9D,iBAAC,CAAC,CAAC;AACH,gBAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzB,aAAC,CAAC,CAAC;AACH,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC;QAExG,IAAI,eAAe,KAAK,QAAQ,EAAE;AAChC,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;AACvC,YAAA,OAAO,CAAC,EAAE,CAAC,mBAAmB,GAAG,IAAI,EAAE,CAAC,aAAa,GAAG,sBAAsB,EAAE,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC,CAAC;AACnK,SAAA;AAED,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS;cACvE,IAAI,CAAC,WAAW;AAClB,cAAE,IAAI,CAAC,cAAc,CAAC,WAAW,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAW,EAAE,CAAC;;AAG9E,QAAA,MAAM,UAAU,GACd,IAAI,CAAC,WAAW,KAAK,IAAI;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI;AAC9B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,KAAK,QAAQ;YACjC,IAAI,CAAC,WAAW,CAAC,SAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,cAAc;YAC3D,IAAI,CAAC,WAAW,CAAC,UAAU,MAAM,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC;AAC5D,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,MAAM,aAAa,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAE/D,QAAA,IAAI,UAAoB,CAAC;AACzB,QAAA,IAAI,QAA0B,CAAC;AAE/B,QAAA,IAAI,UAAU,EAAE;AACd,YAAA,UAAU,GAAG,IAAI,CAAC,WAAY,CAAC,KAAK,CAAC;AACrC,YAAA,QAAQ,GAAG,IAAI,CAAC,WAAY,CAAC,GAAG,CAAC;AAClC,SAAA;AAAM,aAAA;;AAEL,YAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAa,CAAC;AAC7C,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;;YAGnG,IAAI,aAAa,GAAoC,IAAI,CAAC;AAC1D,YAAA,IAAI,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,SAAS,EAAE;AACnD,gBAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;gBACzC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAChG,gBAAA,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC;AACpC,gBAAA,aAAa,GAAG,CAAC,CAAI,EAAE,CAAI,KAAY;oBACrC,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACjC,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACjC,IAAI,GAAG,GAAG,CAAC,CAAC;oBACZ,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;wBACpD,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,qBAAA;AAAM,yBAAA;AACL,wBAAA,MAAM,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACtD,wBAAA,MAAM,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;wBACtD,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,qBAAA;AACD,oBAAA,OAAO,GAAG,KAAK,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AACpC,iBAAC,CAAC;AACH,aAAA;AAED,YAAA,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;gBACrC,MAAM,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;gBACnC,MAAM,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AACjC,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,KAAK,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;AAC9D,aAAC,CAAC,CAAC;YAEH,UAAU,GAAG,EAAE,CAAC;AAChB,YAAA,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;AAClC,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;gBACrB,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AAC7C,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AAC7B,oBAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC5B,oBAAA,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC9B,iBAAA;gBACD,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtC,aAAC,CAAC,CAAC;;AAGH,YAAA,IAAI,aAAa,EAAE;gBACjB,MAAM,EAAE,GAAG,aAAa,CAAC;gBACzB,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,GAAG,KAAI;AAClC,oBAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7C,iBAAC,CAAC,CAAC;AACJ,aAAA;;YAGD,IAAI,CAAC,WAAW,GAAG;gBACjB,IAAI;AACJ,gBAAA,GAAG,EAAE,QAAQ;AACb,gBAAA,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc;AACvC,gBAAA,UAAU,EAAE,aAAa,CAAC,MAAM,IAAI,EAAE;AACtC,gBAAA,OAAO,EAAE,aAAa,CAAC,SAAS,IAAI,EAAE;AACtC,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,GAAG,EAAE,QAAQ;aACd,CAAC;AACH,SAAA;AAED,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;;AAGvC,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,cAAc,CAAC,eAAe,EAAE;AACtD,YAAA,OAAO,CAAC,EAAE,CAAC,mBAAmB,GAAG,IAAI,EAAE,CAAC,aAAa,GAAG,kBAAkB,EAAE,CAAC,eAAe,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC,CAAC;AACrK,SAAA;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;QACpC,MAAM,MAAM,GAAU,EAAE,CAAC;AAEzB,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;YAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;AAC5C,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;YACpC,MAAM,WAAW,GAAG,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3E,MAAM,SAAS,GAAG,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC;YACrF,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAEpD,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,GAAG,IAAI,EAAE,CAAC,aAAa,GAAG,UAAU,EAAE,CAAC,eAAe,GAAG,UAAU,EAAE,CAAC,cAAc,GAAG,WAAW,EAAE,CAAC,oBAAoB,GAAG,SAAS,EAAE,CAAC,CAAC;YAE3K,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,MAAM,KAAK,GAAG,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,QAAQ,CAAC;gBAC1D,MAAM,GAAG,GAAG,QAAQ,KAAK,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,UAAU,CAAC,CAAC;AACjF,gBAAA,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;AAC7C,oBAAA,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;AACtB,oBAAA,MAAM,SAAS,GAAQ,EAAE,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,aAAa,GAAG,GAAG,EAAE,CAAC;oBACpE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAChC,wBAAA,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC5D,qBAAC,CAAC,CAAC;AACH,oBAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzB,iBAAC,CAAC,CAAC;AACJ,aAAA;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,MAAM,CAAC;KACf;IAEO,oBAAoB,GAAA;AAC1B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS;cAC9D,IAAI,CAAC,WAAW;AAClB,cAAE,IAAI,CAAC,cAAc,CAAC,WAAW,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAW,EAAE,CAAC;AAC9E,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI,CAAC;AACvC,QAAA,OAAO,CAAC,CAAI,EAAE,CAAI,KAAY;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;gBACpD,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACtD,gBAAA,MAAM,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBACtD,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,aAAA;AACD,YAAA,OAAO,SAAS,KAAK,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AAC1C,SAAC,CAAC;KACH;AAED;;;;AAIG;IACK,wBAAwB,CAAC,GAA2B,EAAE,GAAM,EAAA;QAClE,IAAI,GAAG,CAAC,IAAI,EAAE;AACZ,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;YAC7D,IAAI,MAAM,KAAK,QAAQ;AAAE,gBAAA,OAAO,IAAI,CAAC;AACrC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjD,OAAO,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACnD,SAAA;QACD,IAAI,GAAG,CAAC,WAAW,EAAE;YACnB,OAAO,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAChC,SAAA;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,GAAI,GAAW,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACzE,QAAA,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;KACrC;IAEO,iBAAiB,CAAC,SAAiB,EAAE,GAAM,EAAA;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,IAAI,EAAE;AAChB,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAC9D,SAAA;QACD,IAAI,MAAM,EAAE,SAAS,EAAE;YACrB,OAAO,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,SAAA;QACD,IAAI,MAAM,EAAE,KAAK,EAAE;YACjB,OAAO,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACjD,SAAA;AACD,QAAA,OAAQ,GAAW,CAAC,SAAS,CAAC,CAAC;KAChC;AAEO,IAAA,gBAAgB,CAAC,GAA2B,EAAE,GAAM,EAAE,KAAa,EAAA;QACzE,IAAI,GAAG,CAAC,IAAI,EAAE;AACZ,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;YAC7D,IAAI,MAAM,KAAK,SAAS;AAAE,gBAAA,OAAO,kBAAkB,CAAC;YACpD,IAAI,MAAM,KAAK,OAAO;AAAE,gBAAA,OAAO,gBAAgB,CAAC;YAChD,IAAI,MAAM,KAAK,QAAQ,EAAE;AACvB,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjD,OAAO,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACnD,aAAA;AACD,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC;QAChC,MAAM,QAAQ,GAAG,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,GAAI,GAAW,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACrF,QAAA,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;KACrC;IAEO,eAAe,GAAA;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;KACpF;IAEO,sBAAsB,GAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,eAAe,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACnC,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5B,SAAA;AAED,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;KACrC;IAEO,6BAA6B,GAAA;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,sBAAsB,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,eAAe,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACzI,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,QAAA,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AAClE,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACjC,SAAA;AACD,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;KACrC;IAEO,2BAA2B,GAAA;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;AAChC,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,sBAAsB,IAAI,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC;QAC1F,IAAI,OAAO,EAAE,MAAM;AAAE,YAAA,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,OAAO,GAAG,CAAC,UAAU,EAAE,QAAQ,IAAI,CAAC,CAAC;KACtC;AAEO,IAAA,kBAAkB,CAAC,OAAiC,EAAA;AAC1D,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;AAC/B,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAI;YAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;AACxB,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;AACD,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,YAAA,OAAO,IAAI,CAAC;AACd,SAAC,CAAC,CAAC;KACJ;IAEO,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC;YACtC,OAAO;AACR,SAAA;QACD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;AAE5B,QAAA,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC;QACtC,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;AAExC,QAAA,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,SAAS,EAAE;AAChD,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC;AAC3C,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;gBACjE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAU,CAAC,QAAQ,CAAC;gBACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnG,gBAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;oBAAE,OAAO;gBACzC,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAC3B,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAC3B,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;IAEO,UAAU,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;AAEvB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAW,CAAC;AAExC,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,IAAI,EAAE;AACtC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;gBAClE,IAAI,CAAC,WAAW,GAAG;AACjB,oBAAA,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;AACxB,oBAAA,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;iBAC/B,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;gBACnF,IAAI,CAAC,eAAe,EAAE,CAAC;AACzB,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;+GAlqDU,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,SAAA,EAFd,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,sBAAsB,EAAE,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EA2D7D,mBAAmB,EAbzB,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,YAAY,uEAUZ,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAEP,mBAAmB,ECxGhC,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,8jaAmPA,6hoBDzMa,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,cAAc,qmCAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,yJAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,OAAA,EAAA,uBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAE,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,mLAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,8BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,+BAA+B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;4FAMpN,cAAc,EAAA,UAAA,EAAA,CAAA;kBAT1B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,YACN,cAAc,EAAA,OAAA,EACf,CAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,+BAA+B,CAAE,EAGhN,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,sBAAsB,EAAE,CAAC,EAAA,QAAA,EAAA,8jaAAA,EAAA,MAAA,EAAA,CAAA,s+nBAAA,CAAA,EAAA,CAAA;8BAGrE,MAAM,EAAA,CAAA;sBAAd,KAAK;gBAEG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;gBACG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAOG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBAEG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBAIF,gBAAgB,EAAA,CAAA;sBADnB,KAAK;gBAQI,YAAY,EAAA,CAAA;sBAArB,MAAM;gBACG,WAAW,EAAA,CAAA;sBAApB,MAAM;gBACG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBACG,gBAAgB,EAAA,CAAA;sBAAzB,MAAM;gBACG,WAAW,EAAA,CAAA;sBAApB,MAAM;gBAGG,UAAU,EAAA,CAAA;sBAAnB,MAAM;gBAEG,UAAU,EAAA,CAAA;sBAAnB,MAAM;gBAEG,YAAY,EAAA,CAAA;sBAArB,MAAM;gBAEG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBAEG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBAGH,SAAS,EAAA,CAAA;sBADZ,SAAS;uBAAC,YAAY,CAAA;gBAUH,IAAI,EAAA,CAAA;sBAAvB,SAAS;uBAAC,OAAO,CAAA;gBACY,kBAAkB,EAAA,CAAA;sBAA/C,SAAS;uBAAC,iBAAiB,CAAA;gBACI,aAAa,EAAA,CAAA;sBAA5C,SAAS;uBAAC,mBAAmB,CAAA;gBACQ,SAAS,EAAA,CAAA;sBAA9C,eAAe;uBAAC,mBAAmB,CAAA;;;AEzGtC;;AAEG;;ACFH;;AAEG;;;;"}