{"version":3,"file":"igniteui-angular-grids-tree-grid.mjs","sources":["../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid-api.service.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid.directives.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid-selection.service.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid.summary.pipe.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid.filtering.pipe.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid.pipes.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-cell.component.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-cell.component.html","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid-row.component.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid-row.component.html","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid-group-by-area.component.ts","../../../projects/igniteui-angular/grids/core/src/grouping/group-by-area.component.html","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid.component.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid.component.html","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid.grouping.pipe.ts","../../../projects/igniteui-angular/grids/tree-grid/src/tree-grid.module.ts","../../../projects/igniteui-angular/grids/tree-grid/src/igniteui-angular-grids-tree-grid.ts"],"sourcesContent":["import { GridBaseAPIService } from 'igniteui-angular/grids/core';\nimport {\n    HierarchicalTransaction,\n    TransactionType,\n    State,\n    IgxDataRecordSorting,\n    TreeGridFilteringStrategy,\n    cloneArray,\n    DataUtil,\n    FilterUtil,\n    GridColumnDataType,\n    IFilteringExpressionsTree,\n    ISortingExpression,\n    mergeObjects,\n    ColumnType,\n    ITreeGridRecord\n} from 'igniteui-angular/core';\nimport { Injectable } from '@angular/core';\nimport { GridType } from 'igniteui-angular/grids/core';\n\n@Injectable()\nexport class IgxTreeGridAPIService extends GridBaseAPIService<GridType> {\n\n    public override get_all_data(transactions?: boolean): any[] {\n        const grid = this.grid;\n        let data = grid && grid.flatData ? grid.flatData : [];\n        data = transactions ? grid.dataWithAddedInTransactionRows : data;\n        return data;\n    }\n\n    public override get_summary_data(): any[] | null {\n        const grid = this.grid;\n        const data = grid.processedRootRecords?.filter(row => row.isFilteredOutParent === undefined || row.isFilteredOutParent === false)\n            .map(rec => rec.data);\n        if (data && grid.transactions.enabled) {\n            const deletedRows = grid.transactions.getTransactionLog().filter(t => t.type === TransactionType.DELETE).map(t => t.id);\n            deletedRows.forEach(rowID => {\n                const tempData = grid.primaryKey ? data.map(rec => rec[grid.primaryKey]) : data;\n                const index = tempData.indexOf(rowID);\n                if (index !== -1) {\n                    data.splice(index, 1);\n                }\n            });\n        }\n        return data!;\n    }\n\n    public override allow_expansion_state_change(rowID: any, expanded: boolean): boolean {\n        const grid = this.grid;\n        const row = grid.records!.get(rowID)!;\n        if (row.expanded === expanded ||\n            ((!row.children || !row.children.length) && (!grid.loadChildrenOnDemand ||\n                (grid.hasChildrenKey && !row.data[grid.hasChildrenKey])))) {\n            return false;\n        }\n        return true;\n    }\n\n    public expand_path_to_record(record: ITreeGridRecord) {\n        const grid = this.grid;\n        const expandedStates = grid.expansionStates;\n\n        while (record.parent) {\n            record = record.parent;\n            const expanded = this.get_row_expansion_state(record);\n\n            if (!expanded) {\n                expandedStates.set(record.key, true);\n            }\n        }\n        grid.expansionStates = expandedStates;\n\n        if (grid.rowEditable) {\n            grid.gridAPI.crudService.endEdit(false);\n        }\n    }\n\n    public override get_row_expansion_state(record: ITreeGridRecord): boolean {\n        const grid = this.grid;\n        const states = grid.expansionStates;\n        const expanded = states.get(record.key);\n\n        if (expanded !== undefined) {\n            return expanded;\n        } else {\n            return (record.children && !!record.children.length && record.level! < grid.expansionDepth!)!;\n        }\n    }\n\n    public override should_apply_number_style(column: ColumnType): boolean {\n        return (column.dataType === GridColumnDataType.Number\n            || column.dataType === GridColumnDataType.Currency\n            || column.dataType === GridColumnDataType.Percent) && column.visibleIndex !== 0;\n    }\n\n    public override deleteRowById(rowID: any): any {\n        const treeGrid = this.grid;\n        const flatDataWithCascadeOnDeleteAndTransactions =\n            treeGrid.primaryKey &&\n            treeGrid.foreignKey &&\n            treeGrid.cascadeOnDelete &&\n            treeGrid.transactions.enabled;\n\n        if (flatDataWithCascadeOnDeleteAndTransactions) {\n            treeGrid.transactions.startPending();\n        }\n\n        const record = super.deleteRowById(rowID);\n\n        if (flatDataWithCascadeOnDeleteAndTransactions) {\n            treeGrid.transactions.endPending(true);\n        }\n\n        return record;\n    }\n\n    public override deleteRowFromData(rowID: any, index: number) {\n        const treeGrid = this.grid;\n        const record = treeGrid.records!.get(rowID);\n\n        if (treeGrid.primaryKey && treeGrid.foreignKey) {\n            index = treeGrid.primaryKey ?\n                treeGrid.data!.map(c => c[treeGrid.primaryKey]).indexOf(rowID) :\n                treeGrid.data!.indexOf(rowID);\n            super.deleteRowFromData(rowID, index);\n\n            if (treeGrid.cascadeOnDelete) {\n                if (record && record.children) {\n                    for (const child of record.children) {\n                        super.deleteRowById(child.key);\n                    }\n                }\n            }\n        } else {\n            const collection = record!.parent ? record!.parent.data[treeGrid.childDataKey] : treeGrid.data;\n            index = treeGrid.primaryKey ?\n                collection.map((c: any) => c[treeGrid.primaryKey]).indexOf(rowID) :\n                collection.indexOf(rowID);\n\n            const selectedChildren: any[] = [];\n            this.get_selected_children(record!, selectedChildren);\n            if (selectedChildren.length > 0) {\n                treeGrid.deselectRows(selectedChildren);\n            }\n\n            if (treeGrid.transactions.enabled) {\n                const path = treeGrid.generateRowPath!(rowID);\n                treeGrid.transactions.add({\n                    id: rowID,\n                    type: TransactionType.DELETE,\n                    newValue: null,\n                    path\n                } as HierarchicalTransaction,\n                    collection[index]\n                );\n            } else {\n                collection.splice(index, 1);\n            }\n            this.grid.validation.clear(rowID);\n        }\n    }\n\n    public get_selected_children(record: ITreeGridRecord, selectedRowIDs: any[]) {\n        const grid = this.grid;\n        if (!record.children || record.children.length === 0) {\n            return;\n        }\n        for (const child of record.children) {\n            if (grid.selectionService.isRowSelected(child.key)) {\n                selectedRowIDs.push(child.key);\n            }\n            this.get_selected_children(child, selectedRowIDs);\n        }\n    }\n\n    public override row_deleted_transaction(rowID: any): boolean {\n        return this.row_deleted_parent(rowID) || super.row_deleted_transaction(rowID);\n    }\n\n    public override get_rec_by_id(rowID: any) {\n        return this.grid.records!.get(rowID);\n    }\n\n    /**\n     * Returns the index of the record in the data view by pk or -1 if not found or primaryKey is not set.\n     *\n     * @param pk\n     * @param dataCollection\n     */\n    public override get_rec_index_by_id(pk: string | number, dataCollection?: any[]): number {\n        dataCollection = dataCollection || this.grid.data!;\n        return this.grid.primaryKey ? dataCollection.findIndex(rec => rec.data[this.grid.primaryKey] === pk) : -1;\n    }\n\n    public override addRowToData(data: any, parentRowID?: any) {\n        if (parentRowID !== undefined && parentRowID !== null) {\n\n            const state = this.grid.transactions.getState(parentRowID);\n            // we should not allow adding of rows as child of deleted row\n            if (state && state.type === TransactionType.DELETE) {\n                throw Error(`Cannot add child row to deleted parent row`);\n            }\n\n            const parentRecord = this.grid.records!.get(parentRowID);\n\n            if (!parentRecord) {\n                throw Error('Invalid parent row ID!');\n            }\n            this.grid.summaryService.clearSummaryCache({ rowID: parentRecord.key });\n            if (this.grid.primaryKey && this.grid.foreignKey) {\n                data[this.grid.foreignKey] = parentRowID;\n                super.addRowToData(data);\n            } else {\n                const parentData = parentRecord.data;\n                const childKey = this.grid.childDataKey;\n                if (this.grid.transactions.enabled) {\n                    const rowId = this.grid.primaryKey ? data[this.grid.primaryKey] : data;\n                    const path: any[] = [];\n                    path.push(...this.grid.generateRowPath!(parentRowID));\n                    path.push(parentRowID);\n                    this.grid.transactions.add({\n                        id: rowId,\n                        path,\n                        newValue: data,\n                        type: TransactionType.ADD\n                    } as HierarchicalTransaction,\n                        null);\n                } else {\n                    if (!parentData[childKey]) {\n                        parentData[childKey] = [];\n                    }\n                    parentData[childKey].push(data);\n                }\n            }\n        } else {\n            super.addRowToData(data);\n        }\n    }\n\n    public override filterDataByExpressions(expressionsTree: IFilteringExpressionsTree): any[] {\n        const records = this.filterTreeDataByExpressions(expressionsTree);\n        const data: any[] = [];\n\n        this.getFlatDataFromFilteredRecords(records, data);\n\n        return data;\n    }\n\n    public override sortDataByExpressions(data: ITreeGridRecord[], expressions: ISortingExpression[]) {\n        const records: ITreeGridRecord[] = DataUtil.sort(\n            cloneArray(data),\n            expressions,\n            this.grid.sortStrategy ?? new IgxDataRecordSorting(),\n            this.grid);\n        return records.map(r => r.data);\n    }\n\n    public filterTreeDataByExpressions(expressionsTree: IFilteringExpressionsTree): ITreeGridRecord[] {\n        let records = this.grid.rootRecords!;\n\n        if (expressionsTree.filteringOperands.length) {\n            const state = {\n                expressionsTree,\n                strategy: this.grid.filterStrategy ?? new TreeGridFilteringStrategy()\n            };\n            records = FilterUtil.filter(cloneArray(records), state, this.grid);\n        }\n\n        return records;\n    }\n\n    protected override update_row_in_array(value: any, rowID: any, index: number) {\n        const grid = this.grid;\n        if (grid.primaryKey && grid.foreignKey) {\n            super.update_row_in_array(value, rowID, index);\n        } else {\n            const record = grid.records!.get(rowID);\n            const childData = record!.parent ? record!.parent.data[grid.childDataKey] : grid.data;\n            index = grid.primaryKey ? childData.map((c: any) => c[grid.primaryKey]).indexOf(rowID) :\n                childData.indexOf(rowID);\n            childData[index] = value;\n        }\n    }\n\n    /**\n     * Updates related row of provided grid's data source with provided new row value\n     *\n     * @param grid Grid to update data for\n     * @param rowID ID of the row to update\n     * @param rowValueInDataSource Initial value of the row as it is in data source\n     * @param rowCurrentValue Current value of the row as it is with applied previous transactions\n     * @param rowNewValue New value of the row\n     */\n    protected override updateData(\n        grid: GridType,\n        rowID: any,\n        rowValueInDataSource: any,\n        rowCurrentValue: any,\n        rowNewValue: { [x: string]: any }) {\n        if (grid.transactions.enabled) {\n            const path = grid.generateRowPath!(rowID);\n            const transaction: HierarchicalTransaction = {\n                id: rowID,\n                type: TransactionType.UPDATE,\n                newValue: rowNewValue,\n                path\n            };\n            grid.transactions.add(transaction, rowCurrentValue);\n        } else {\n            mergeObjects(rowValueInDataSource, rowNewValue);\n        }\n    }\n\n    private row_deleted_parent(rowID: any): boolean {\n        const grid = this.grid;\n        if (!grid) {\n            return false;\n        }\n        if ((grid.cascadeOnDelete && grid.foreignKey) || grid.childDataKey) {\n            let node = grid.records!.get(rowID);\n            while (node) {\n                const state: State = grid.transactions.getState(node.key);\n                if (state && state.type === TransactionType.DELETE) {\n                    return true;\n                }\n                node = node.parent;\n            }\n        }\n        return false;\n    }\n\n    private getFlatDataFromFilteredRecords(records: ITreeGridRecord[], data: any[]) {\n        if (!records || records.length === 0) {\n            return;\n        }\n\n        for (const record of records) {\n            if (!record.isFilteredOutParent) {\n                data.push(record);\n            }\n            this.getFlatDataFromFilteredRecords(record.children!, data);\n        }\n    }\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * @hidden\n */\n@Directive({\n    selector: '[igxRowLoadingIndicator]',\n    standalone: true\n})\nexport class IgxRowLoadingIndicatorTemplateDirective {\n    public template = inject<TemplateRef<any>>(TemplateRef);\n}\n","import { Injectable } from '@angular/core';\nimport { GridSelectionMode } from 'igniteui-angular/grids/core';\nimport { IgxGridSelectionService } from 'igniteui-angular/grids/core';\nimport { ITreeGridRecord } from 'igniteui-angular/core';\n\n@Injectable()\nexport class IgxTreeGridSelectionService extends IgxGridSelectionService {\n    private rowsToBeSelected!: Set<any>;\n    private rowsToBeIndeterminate!: Set<any>;\n\n    /** Select specified rows. No event is emitted. */\n    public override selectRowsWithNoEvent(rowIDs: any[], clearPrevSelection?: boolean): void {\n        if (this.grid && this.grid.rowSelection === GridSelectionMode.multipleCascade) {\n            this.cascadeSelectRowsWithNoEvent(rowIDs, clearPrevSelection);\n            return;\n        }\n        super.selectRowsWithNoEvent(rowIDs, clearPrevSelection);\n    }\n\n    /** Deselect specified rows. No event is emitted. */\n    public override deselectRowsWithNoEvent(rowIDs: any[]): void {\n        if (this.grid.rowSelection === GridSelectionMode.multipleCascade) {\n            this.cascadeDeselectRowsWithNoEvent(rowIDs);\n            return;\n        }\n        super.deselectRowsWithNoEvent(rowIDs);\n    }\n\n    public override emitRowSelectionEvent(newSelection: any, added: any, removed: any, event?: MouseEvent): boolean {\n        if (this.grid.rowSelection === GridSelectionMode.multipleCascade) {\n            this.emitCascadeRowSelectionEvent(newSelection, added, removed, event);\n            return undefined!;\n        }\n\n        super.emitRowSelectionEvent(newSelection, added, removed, event);\n        return undefined!;\n    }\n\n    public updateCascadeSelectionOnFilterAndCRUD(\n        parents: Set<any>,\n        crudRowID?: any,\n        visibleRowIDs: Set<any> = null!) {\n        if (visibleRowIDs === null) {\n            // if the tree grid has flat structure\n            // do not explicitly handle the selection state of the rows\n            if (!parents.size) {\n                return;\n            }\n            visibleRowIDs = new Set(this.getRowIDs(this.allData));\n            this.rowsToBeSelected = new Set(this.rowSelection);\n            this.rowsToBeIndeterminate = new Set(this.indeterminateRows);\n            if (crudRowID) {\n                this.rowSelection.delete(crudRowID);\n            }\n        }\n        if (!parents.size) {\n            this.rowSelection = new Set(this.rowsToBeSelected);\n            this.indeterminateRows = new Set(this.rowsToBeIndeterminate);\n            // TODO: emit selectionChangeD event, calculate its args through the handleAddedAndRemovedArgs method\n            this.clearHeaderCBState();\n            this.selectedRowsChange.next(this.getSelectedRows());\n            return;\n        }\n        const newParents = new Set<any>();\n        parents.forEach(parent => {\n            this.handleRowSelectionState(parent, visibleRowIDs);\n            if (parent && parent.parent) {\n                newParents.add(parent.parent);\n            }\n        });\n        this.updateCascadeSelectionOnFilterAndCRUD(newParents, null, visibleRowIDs);\n    }\n\n    private cascadeSelectRowsWithNoEvent(rowIDs: any[], clearPrevSelection?: boolean): void {\n        if (clearPrevSelection) {\n            this.indeterminateRows.clear();\n            this.rowSelection.clear();\n            this.calculateRowsNewSelectionState({ added: rowIDs, removed: [] });\n        } else {\n            const oldSelection = this.getSelectedRows();\n            const newSelection = [...oldSelection, ...rowIDs];\n            const args = { oldSelection, newSelection };\n\n            // retrieve only the rows without their parents/children which has to be added to the selection\n            this.handleAddedAndRemovedArgs(args);\n\n            this.calculateRowsNewSelectionState(args);\n        }\n        this.rowSelection = new Set(this.rowsToBeSelected);\n        this.indeterminateRows = new Set(this.rowsToBeIndeterminate);\n        this.clearHeaderCBState();\n        this.selectedRowsChange.next(this.getSelectedRows());\n    }\n\n    private cascadeDeselectRowsWithNoEvent(rowIDs: any[]): void {\n        const args = { added: [], removed: rowIDs };\n        this.calculateRowsNewSelectionState(args);\n\n        this.rowSelection = new Set(this.rowsToBeSelected);\n        this.indeterminateRows = new Set(this.rowsToBeIndeterminate);\n        this.clearHeaderCBState();\n        this.selectedRowsChange.next(this.getSelectedRows());\n    }\n\n    public get selectionService(): IgxGridSelectionService {\n        return this.grid.selectionService;\n    }\n\n    private emitCascadeRowSelectionEvent(newSelection: any, added: any, removed: any, event?: any): boolean | undefined {\n        const currSelection = this.getSelectedRows();\n        if (this.areEqualCollections(currSelection, newSelection)) {\n            return;\n        }\n\n        const args = {\n            owner: this.grid, oldSelection: this.getSelectedRowsData(), newSelection,\n            added, removed, event, cancel: false\n        };\n\n        this.calculateRowsNewSelectionState(args, !!this.grid.primaryKey);\n        args.newSelection = Array.from(this.grid.gridAPI.get_all_data().filter(r => this.rowsToBeSelected.has(this.grid.primaryKey ? r[this.grid.primaryKey] : r)));\n\n        // retrieve rows/parents/children which has been added/removed from the selection\n        this.handleAddedAndRemovedArgs(args);\n\n        this.grid.rowSelectionChanging.emit(args);\n\n        if (args.cancel) {\n            return;\n        }\n        const newSelectionIDs = args.newSelection.map((r: any) => this.grid.primaryKey? r[this.grid.primaryKey] : r)\n        // if args.newSelection hasn't been modified\n        if (this.areEqualCollections(Array.from(this.rowsToBeSelected), newSelectionIDs)) {\n            this.rowSelection = new Set(this.rowsToBeSelected);\n            this.indeterminateRows = new Set(this.rowsToBeIndeterminate);\n            this.clearHeaderCBState();\n            this.selectedRowsChange.next(this.getSelectedRows());\n        } else {\n            // select the rows within the modified args.newSelection with no event\n            this.cascadeSelectRowsWithNoEvent(newSelectionIDs, true);\n        }\n    }\n\n\n    /**\n     * retrieve the rows which should be added/removed to/from the old selection\n     */\n    private handleAddedAndRemovedArgs(args: any) {\n        const newSelectionSet = new Set(args.newSelection);\n        const oldSelectionSet = new Set(args.oldSelection);\n        args.removed = args.oldSelection.filter((x: any) => !newSelectionSet.has(x));\n        args.added = args.newSelection.filter((x: any) => !oldSelectionSet.has(x));\n    }\n\n    /**\n     * adds to rowsToBeProcessed set all visible children of the rows which was initially within the rowsToBeProcessed set\n     *\n     * @param rowsToBeProcessed set of the rows (without their parents/children) to be selected/deselected\n     * @param visibleRowIDs list of all visible rowIds\n     * @returns a new set with all direct parents of the rows within rowsToBeProcessed set\n     */\n    private collectRowsChildrenAndDirectParents(rowsToBeProcessed: Set<any>, visibleRowIDs: Set<any>, adding: boolean, shouldConvert: boolean): Set<any> {\n        const processedRowsParents = new Set<any>();\n        Array.from(rowsToBeProcessed).forEach((row) => {\n            const rowID = shouldConvert ? row[this.grid.primaryKey] : row;\n            this.selectDeselectRow(rowID, adding);\n            const rowTreeRecord = this.grid.gridAPI.get_rec_by_id(rowID);\n            const rowAndAllChildren = this.get_all_children(rowTreeRecord);\n            rowAndAllChildren.forEach(r => {\n                if (visibleRowIDs.has(r.key)) {\n                    this.selectDeselectRow(r.key, adding);\n                }\n            });\n            if (rowTreeRecord && rowTreeRecord.parent) {\n                processedRowsParents.add(rowTreeRecord.parent);\n            }\n        });\n        return processedRowsParents;\n    }\n\n\n    /**\n     * populates the rowsToBeSelected and rowsToBeIndeterminate sets\n     * with the rows which will be eventually in selected/indeterminate state\n     */\n    private calculateRowsNewSelectionState(args: any, shouldConvert = false) {\n        this.rowsToBeSelected = new Set<any>(args.oldSelection ? shouldConvert ? args.oldSelection.map((r: any) => r[this.grid.primaryKey]) : args.oldSelection : this.getSelectedRows());\n        this.rowsToBeIndeterminate = new Set<any>(this.getIndeterminateRows());\n\n        const visibleRowIDs = new Set(this.getRowIDs(this.allData));\n\n        const removed = new Set(args.removed);\n        const added = new Set(args.added);\n\n        if (removed && removed.size) {\n            let removedRowsParents = new Set<any>();\n\n            removedRowsParents = this.collectRowsChildrenAndDirectParents(removed, visibleRowIDs, false, shouldConvert);\n\n            Array.from(removedRowsParents).forEach((parent) => {\n                this.handleParentSelectionState(parent, visibleRowIDs);\n            });\n        }\n\n        if (added && added.size) {\n            let addedRowsParents = new Set<any>();\n\n            addedRowsParents = this.collectRowsChildrenAndDirectParents(added, visibleRowIDs, true, shouldConvert);\n\n            Array.from(addedRowsParents).forEach((parent) => {\n                this.handleParentSelectionState(parent, visibleRowIDs);\n            });\n        }\n    }\n\n    /**\n     * recursively handle the selection state of the direct and indirect parents\n     */\n    private handleParentSelectionState(treeRow: ITreeGridRecord, visibleRowIDs: Set<any>) {\n        if (!treeRow) {\n            return;\n        }\n        this.handleRowSelectionState(treeRow, visibleRowIDs);\n        if (treeRow.parent) {\n            this.handleParentSelectionState(treeRow.parent, visibleRowIDs);\n        }\n    }\n\n    /**\n     * Handle the selection state of a given row based the selection states of its direct children\n     */\n    private handleRowSelectionState(treeRow: ITreeGridRecord, visibleRowIDs: Set<any>) {\n        let visibleChildren: ITreeGridRecord[] = [];\n        if (treeRow && treeRow.children) {\n            visibleChildren = treeRow.children.filter(child => visibleRowIDs.has(child.key));\n        }\n        if (visibleChildren.length) {\n            if (visibleChildren.every(row => this.rowsToBeSelected.has(row.key))) {\n                this.selectDeselectRow(treeRow.key, true);\n            } else if (visibleChildren.some(row => this.rowsToBeSelected.has(row.key) || this.rowsToBeIndeterminate.has(row.key))) {\n                this.rowsToBeIndeterminate.add(treeRow.key);\n                this.rowsToBeSelected.delete(treeRow.key);\n            } else {\n                this.selectDeselectRow(treeRow.key, false);\n            }\n        } else {\n            // if the children of the row has been deleted and the row was selected do not change its state\n            if (this.isRowSelected(treeRow.key)) {\n                this.selectDeselectRow(treeRow.key, true);\n            } else {\n                this.selectDeselectRow(treeRow.key, false);\n            }\n        }\n    }\n\n    private get_all_children(record: ITreeGridRecord): any[] {\n        const children = [];\n        if (record && record.children && record.children.length) {\n            for (const child of record.children) {\n                children.push(...this.get_all_children(child));\n                children.push(child);\n            }\n        }\n        return children;\n\n    }\n\n    private selectDeselectRow(rowID: any, select: boolean) {\n        if (select) {\n            this.rowsToBeSelected.add(rowID);\n            this.rowsToBeIndeterminate.delete(rowID);\n        } else {\n            this.rowsToBeSelected.delete(rowID);\n            this.rowsToBeIndeterminate.delete(rowID);\n        }\n    }\n\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { IGX_GRID_BASE, GridSummaryPosition, TreeGridType } from 'igniteui-angular/grids/core';\nimport { GridSummaryCalculationMode, ISummaryRecord, ITreeGridRecord } from 'igniteui-angular/core';\n\n/** @hidden */\n@Pipe({\n    name: 'treeGridSummary',\n    standalone: true\n})\nexport class IgxTreeGridSummaryPipe implements PipeTransform {\n    private grid = inject<TreeGridType>(IGX_GRID_BASE);\n\n\n    public transform(flatData: ITreeGridRecord[],\n        hasSummary: boolean,\n        summaryCalculationMode: GridSummaryCalculationMode,\n        summaryPosition: GridSummaryPosition, showSummaryOnCollapse: boolean, _: number, __: number): any[] {\n\n        if (!flatData || !hasSummary || summaryCalculationMode === GridSummaryCalculationMode.rootLevelOnly) {\n            return flatData;\n        }\n\n        return this.addSummaryRows(this.grid, flatData, summaryPosition, showSummaryOnCollapse);\n    }\n\n    private addSummaryRows(grid: TreeGridType, collection: ITreeGridRecord[],\n        summaryPosition: GridSummaryPosition, showSummaryOnCollapse: boolean): any[] {\n        const recordsWithSummary = [];\n        const maxSummaryHeight = grid.summaryService.calcMaxSummaryHeight();\n\n        for (const record of collection) {\n            recordsWithSummary.push(record);\n\n            const isCollapsed = !record.expanded && record.children && record.children.length > 0 && showSummaryOnCollapse;\n            if (isCollapsed) {\n                let childData = record.children!.filter(r => !r.isFilteredOutParent).map(r => r.data);\n                childData = this.removeDeletedRecord(grid, record.key, childData);\n                const summaries = grid.summaryService.calculateSummaries(record.key, childData);\n                const summaryRecord: ISummaryRecord = {\n                    summaries,\n                    max: maxSummaryHeight,\n                    cellIndentation: record.level! + 1\n                };\n                recordsWithSummary.push(summaryRecord);\n            }\n            const isExpanded = record.children && record.children.length > 0 && record.expanded;\n            if (summaryPosition === GridSummaryPosition.bottom && !isExpanded) {\n                let childRecord = record;\n                let parent = record.parent;\n\n                while (parent) {\n                    const children = parent.children;\n\n                    if (children![children!.length - 1] === childRecord ) {\n                        let childData = children!.filter(r => !r.isFilteredOutParent).map(r => r.data);\n                        childData = this.removeDeletedRecord(grid, parent.key, childData);\n                        const summaries = grid.summaryService.calculateSummaries(parent.key, childData);\n                        const summaryRecord: ISummaryRecord = {\n                            summaries,\n                            max: maxSummaryHeight,\n                            cellIndentation: parent.level! + 1\n                        };\n                        recordsWithSummary.push(summaryRecord);\n\n                        childRecord = parent;\n                        parent = childRecord.parent;\n                    } else {\n                        break;\n                    }\n                }\n            } else if (summaryPosition === GridSummaryPosition.top && isExpanded) {\n                let childData = record.children!.filter(r => !r.isFilteredOutParent).map(r => r.data);\n                childData = this.removeDeletedRecord(grid, record.key, childData);\n                const summaries = grid.summaryService.calculateSummaries(record.key, childData);\n                const summaryRecord: ISummaryRecord = {\n                    summaries,\n                    max: maxSummaryHeight,\n                    cellIndentation: record.level! + 1\n                };\n                recordsWithSummary.push(summaryRecord);\n            }\n        }\n        return recordsWithSummary;\n    }\n\n    private removeDeletedRecord(grid: TreeGridType, rowId: any, data: any) {\n        if (!grid.transactions.enabled || !grid.cascadeOnDelete) {\n            return data;\n        }\n        const deletedRows = grid.transactions.getTransactionLog().filter((t: any) => t.type === 'delete').map((t: any) => t.id);\n        let row = grid.records.get(rowId);\n        // Nothing was deleted, so there is nothing to strip from the summary data.\n        if (!row && deletedRows.length === 0) {\n            return data;\n        }\n        row = row?.children ? row : row?.parent;\n        while (row) {\n            rowId = row.key;\n            if (deletedRows.indexOf(rowId) !== -1) {\n                return [];\n            }\n            row = row.parent;\n        }\n        deletedRows.forEach((rowID: any) => {\n            const tempData = grid.primaryKey ? data.map((rec: any) => rec[grid.primaryKey]) : data;\n            const index = tempData.indexOf(rowID);\n            if (index !== -1) {\n                data.splice(index, 1);\n            }\n        });\n        return data;\n    }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { GridType, IGX_GRID_BASE } from 'igniteui-angular/grids/core';\nimport { FilteringExpressionsTree, IFilteringExpressionsTree, IFilteringState, IFilteringStrategy, ITreeGridRecord, TreeGridFilteringStrategy } from 'igniteui-angular/core';\n\n/** @hidden */\n@Pipe({\n    name: 'treeGridFiltering',\n    standalone: true\n})\nexport class IgxTreeGridFilteringPipe implements PipeTransform {\n    private grid = inject<GridType>(IGX_GRID_BASE);\n\n\n    public transform(hierarchyData: ITreeGridRecord[], expressionsTree: IFilteringExpressionsTree,\n        filterStrategy: IFilteringStrategy,\n        advancedFilteringExpressionsTree: IFilteringExpressionsTree,\n        _: number, __: number, pinned?: any): ITreeGridRecord[] {\n        const state: IFilteringState = {\n            expressionsTree,\n            advancedExpressionsTree: advancedFilteringExpressionsTree,\n            strategy: new TreeGridFilteringStrategy()\n        };\n\n        if (filterStrategy) {\n            state.strategy = filterStrategy;\n        }\n\n        if (FilteringExpressionsTree.empty(state.expressionsTree) && FilteringExpressionsTree.empty(state.advancedExpressionsTree!)) {\n            this.grid.setFilteredData(null, pinned);\n            return hierarchyData;\n        }\n\n        const result = this.filter(hierarchyData, state, this.grid);\n        const filteredData: any[] = [];\n        this.expandAllRecursive(this.grid, result, this.grid.expansionStates, filteredData);\n        this.grid.setFilteredData(filteredData, pinned);\n\n        return result;\n    }\n\n    private expandAllRecursive(grid: GridType, data: ITreeGridRecord[],\n        expandedStates: Map<any, boolean>, filteredData: any[]) {\n        for (const rec of data) {\n            filteredData.push(rec.data);\n\n            if (rec.children && rec.children.length > 0) {\n                expandedStates.set(rec.key, true);\n                this.expandAllRecursive(grid, rec.children, expandedStates, filteredData);\n            }\n        }\n    }\n\n    private filter(data: ITreeGridRecord[], state: IFilteringState, grid?: GridType): ITreeGridRecord[] {\n        return state.strategy!.filter(data, state.expressionsTree, state.advancedExpressionsTree, grid);\n    }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { GridType, IGX_GRID_BASE } from 'igniteui-angular/grids/core';\nimport { cloneArray, cloneHierarchicalArray, DataUtil, IGroupingExpression, ISortingExpression, TransactionType, IGridSortingStrategy, ITreeGridRecord } from 'igniteui-angular/core';\nimport { IgxAddRow } from 'igniteui-angular/grids/core';\n\n/**\n * @hidden\n */\n@Pipe({\n    name: 'treeGridHierarchizing',\n    standalone: true\n})\nexport class IgxTreeGridHierarchizingPipe implements PipeTransform {\n    private grid = inject<GridType>(IGX_GRID_BASE);\n\n\n    public transform(collection: any[], primaryKey: string, foreignKey: string, childDataKey: string, _: number): ITreeGridRecord[] {\n        let hierarchicalRecords: ITreeGridRecord[] = [];\n        const treeGridRecordsMap = new Map<any, ITreeGridRecord>();\n        const flatData: any[] = [];\n\n        if (!collection || !collection.length) {\n            this.grid.flatData = collection;\n            this.grid.records = treeGridRecordsMap;\n            this.grid.rootRecords = collection;\n            return collection;\n        }\n\n        if (childDataKey) {\n            hierarchicalRecords = this.hierarchizeRecursive(collection, primaryKey, childDataKey, undefined!,\n                flatData, 0, treeGridRecordsMap);\n        } else if (primaryKey) {\n            hierarchicalRecords = this.hierarchizeFlatData(collection, primaryKey, foreignKey, treeGridRecordsMap, flatData);\n        }\n\n        this.grid.flatData = this.grid.transactions.enabled ?\n            flatData.filter(rec => {\n                const state = this.grid.transactions.getState(this.getRowID(primaryKey, rec));\n                return !state || state.type !== TransactionType.ADD;\n            }) : flatData;\n        this.grid.records = treeGridRecordsMap;\n        this.grid.rootRecords = hierarchicalRecords;\n        return hierarchicalRecords;\n    }\n\n    private getRowID(primaryKey: any, rowData: any) {\n        return primaryKey ? rowData[primaryKey] : rowData;\n    }\n\n    /**\n     * Converts a flat array of data into a hierarchical (tree) structure,\n     * preserving the original order of the records among siblings.\n     *\n     * It uses a two-pass approach:\n     * 1. Creates all ITreeGridRecord objects and populates the Map for quick lookup.\n     * 2. Links the records by iterating again, ensuring children are added to\n     * their parent's children array in the order they appeared in the\n     * original collection.\n     *\n     * @param collection The flat array of data to be hierarchized. This is the array whose order should be preserved.\n     * @param primaryKey The name of the property in the data objects that serves as the unique identifier (e.g., 'id').\n     * @param foreignKey The name of the property in the data objects that links to the parent's primary key (e.g., 'parentId').\n     * @param map A pre-existing Map object (key: primaryKey value, value: ITreeGridRecord) used to store and quickly look up all created records.\n     * @param flatData The original flat data array. Used for passing to the setIndentationLevels method (not directly used for hierarchy building).\n     * @returns An array of ITreeGridRecord objects representing the root nodes of the hierarchy, ordered as they appeared in the original collection.\n     */\n    private hierarchizeFlatData(\n        collection: any[],\n        primaryKey: string,\n        foreignKey: string,\n        map: Map<any, ITreeGridRecord>,\n        flatData: any[]\n    ): ITreeGridRecord[] {\n        collection.forEach(row => {\n            const record: ITreeGridRecord = {\n                key: this.getRowID(primaryKey, row),\n                data: row,\n                children: []\n            };\n            map.set(row[primaryKey], record);\n        });\n\n        const result: ITreeGridRecord[] = [];\n        collection.forEach(row => {\n            const record: ITreeGridRecord = map.get(row[primaryKey])!;\n            const parent = map.get(row[foreignKey]);\n\n            if (parent) {\n                record.parent = parent;\n                parent.children!.push(record);\n            } else {\n                result.push(record);\n            }\n        });\n\n        this.setIndentationLevels(result, 0, flatData);\n\n        return result;\n    }\n\n    private setIndentationLevels(collection: ITreeGridRecord[], indentationLevel: number, flatData: any[]) {\n        for (const record of collection) {\n            record.level = indentationLevel;\n            record.expanded = this.grid.gridAPI.get_row_expansion_state(record);\n            flatData.push(record.data);\n\n            if (record.children && record.children.length > 0) {\n                this.setIndentationLevels(record.children, indentationLevel + 1, flatData);\n            }\n        }\n    }\n\n    private hierarchizeRecursive(collection: any[], primaryKey: string, childDataKey: string,\n        parent: ITreeGridRecord, flatData: any[], indentationLevel: number, map: Map<any, ITreeGridRecord>): ITreeGridRecord[] {\n        const result: ITreeGridRecord[] = [];\n\n        for (const item of collection) {\n            const record: ITreeGridRecord = {\n                key: this.getRowID(primaryKey, item),\n                data: item,\n                parent,\n                level: indentationLevel\n            };\n            record.expanded = this.grid.gridAPI.get_row_expansion_state(record);\n            flatData.push(item);\n            map.set(record.key, record);\n            record.children = item[childDataKey] ?\n                this.hierarchizeRecursive(item[childDataKey], primaryKey, childDataKey, record, flatData, indentationLevel + 1, map) :\n                undefined;\n            result.push(record);\n        }\n\n        return result;\n    }\n}\n\n/**\n * @hidden\n */\n@Pipe({\n    name: 'treeGridFlattening',\n    standalone: true\n})\nexport class IgxTreeGridFlatteningPipe implements PipeTransform {\n    private grid = inject<GridType>(IGX_GRID_BASE);\n\n\n    public transform(collection: ITreeGridRecord[],\n        expandedLevels: number, expandedStates: Map<any, boolean>, _: number): any[] {\n\n        const data: ITreeGridRecord[] = [];\n\n        this.grid.processedRootRecords = collection;\n        this.grid.processedRecords = new Map<any, ITreeGridRecord>();\n\n        this.getFlatDataRecursive(collection, data, expandedLevels, expandedStates, true);\n\n        this.grid.processedExpandedFlatData = data.map(r => r.data);\n\n        return data;\n    }\n\n    private getFlatDataRecursive(collection: ITreeGridRecord[], data: ITreeGridRecord[],\n        expandedLevels: number, expandedStates: Map<any, boolean>, parentExpanded: boolean) {\n        if (!collection || !collection.length) {\n            return;\n        }\n\n        for (const hierarchicalRecord of collection) {\n            if (parentExpanded) {\n                data.push(hierarchicalRecord);\n            }\n\n            hierarchicalRecord.expanded = this.grid.gridAPI.get_row_expansion_state(hierarchicalRecord);\n\n            this.updateNonProcessedRecordExpansion(this.grid, hierarchicalRecord);\n\n            this.grid.processedRecords!.set(hierarchicalRecord.key, hierarchicalRecord);\n\n            this.getFlatDataRecursive(hierarchicalRecord.children!, data, expandedLevels,\n                expandedStates, parentExpanded && hierarchicalRecord.expanded);\n        }\n    }\n\n    private updateNonProcessedRecordExpansion(grid: GridType, record: ITreeGridRecord) {\n        const rec = grid.records!.get(record.key);\n        rec!.expanded = record.expanded;\n    }\n}\n\n/** @hidden */\n@Pipe({\n    name: 'treeGridSorting',\n    standalone: true\n})\nexport class IgxTreeGridSortingPipe implements PipeTransform {\n    private grid = inject<GridType>(IGX_GRID_BASE);\n\n\n    public transform(\n        hierarchicalData: ITreeGridRecord[],\n        sortExpressions: ISortingExpression[],\n        groupExpressions: IGroupingExpression[],\n        sorting: IGridSortingStrategy,\n        _: number,\n        pinned?: boolean): ITreeGridRecord[] {\n\n        const expressions = groupExpressions ? groupExpressions.concat(sortExpressions) : sortExpressions;\n        let result: ITreeGridRecord[];\n        if (!expressions.length) {\n            result = hierarchicalData;\n        } else {\n            result = DataUtil.treeGridSort(hierarchicalData, expressions, sorting, this.grid);\n        }\n\n        const filteredSortedData: any[] = [];\n        this.flattenTreeGridRecords(result, filteredSortedData);\n        this.grid.setFilteredSortedData(filteredSortedData, pinned!);\n\n        return result;\n    }\n\n    private flattenTreeGridRecords(records: ITreeGridRecord[], flatData: any[]) {\n        if (records && records.length) {\n            for (const record of records) {\n                flatData.push(record.data);\n                this.flattenTreeGridRecords(record.children!, flatData);\n            }\n        }\n    }\n}\n\n/** @hidden */\n@Pipe({\n    name: 'treeGridPaging',\n    standalone: true\n})\nexport class IgxTreeGridPagingPipe implements PipeTransform {\n    private grid = inject<GridType>(IGX_GRID_BASE);\n\n\n    public transform(collection: ITreeGridRecord[], enabled: boolean, page = 0, perPage = 15, _: number): ITreeGridRecord[] {\n        if (!enabled || this.grid.pagingMode !== 'local') {\n            return collection;\n        }\n\n        const len = this.grid._totalRecords >= 0 ? this.grid._totalRecords : collection.length;\n        const totalPages = Math.ceil(len / perPage);\n\n        const state = {\n            index: (totalPages > 0 && page >= totalPages) ? totalPages - 1 : page,\n            recordsPerPage: perPage\n        };\n\n        const result: ITreeGridRecord[] = DataUtil.page(cloneArray(collection), state, len);\n        this.grid.pagingState = state;\n        this.grid.page = state.index;\n\n        return result;\n    }\n}\n/** @hidden */\n@Pipe({\n    name: 'treeGridTransaction',\n    standalone: true\n})\nexport class IgxTreeGridTransactionPipe implements PipeTransform {\n    private grid = inject<GridType>(IGX_GRID_BASE);\n\n\n    public transform(collection: any[], _: number): any[] {\n\n        if (this.grid.transactions.enabled) {\n            const aggregatedChanges = this.grid.transactions.getAggregatedChanges(true);\n            if (aggregatedChanges.length > 0) {\n                const primaryKey = this.grid.primaryKey;\n                if (!primaryKey) {\n                    return collection;\n                }\n\n                const childDataKey = this.grid.childDataKey;\n\n                if (childDataKey) {\n                    const hierarchicalDataClone = cloneHierarchicalArray(collection, childDataKey);\n                    return DataUtil.mergeHierarchicalTransactions(\n                        hierarchicalDataClone,\n                        aggregatedChanges,\n                        childDataKey,\n                        this.grid.primaryKey,\n                        this.grid.dataCloneStrategy\n                    );\n                } else {\n                    const flatDataClone = cloneArray(collection);\n                    return DataUtil.mergeTransactions(\n                        flatDataClone,\n                        aggregatedChanges,\n                        this.grid.primaryKey,\n                        this.grid.dataCloneStrategy);\n                }\n            }\n        }\n        return collection;\n    }\n}\n\n/**\n * This pipe maps the original record to ITreeGridRecord format used in TreeGrid.\n */\n@Pipe({\n    name: 'treeGridNormalizeRecord',\n    standalone: true\n})\nexport class IgxTreeGridNormalizeRecordsPipe implements PipeTransform {\n    private grid = inject<GridType>(IGX_GRID_BASE);\n\n\n    public transform(_: any[], __: number): any[] {\n        const primaryKey = this.grid.primaryKey;\n        // using flattened data because origin data may be hierarchical.\n        const flatData = this.grid.flatData;\n        const res = flatData ? flatData.map(rec =>\n        ({\n            rowID: this.grid.primaryKey ? rec[primaryKey] : rec,\n            data: rec,\n            level: 0,\n            children: []\n        })) : [];\n        return res;\n    }\n}\n\n@Pipe({\n    name: 'treeGridAddRow',\n    standalone: true\n})\nexport class IgxTreeGridAddRowPipe implements PipeTransform {\n    private grid = inject<GridType>(IGX_GRID_BASE);\n\n\n    public transform(collection: any, isPinned = false, _pipeTrigger: number) {\n        if (!this.grid.rowEditable || !this.grid.crudService.row || !this.grid.crudService.row.isAddRow ||\n            !this.grid.gridAPI.crudService.addRowParent || isPinned !== this.grid.gridAPI.crudService.addRowParent.isPinned) {\n            return collection;\n        }\n        const copy = collection.slice(0);\n        const rec = (this.grid.crudService.row as IgxAddRow).recordRef;\n        if (this.grid.crudService.addRowParent.isPinned) {\n            const parentRowIndex = copy.findIndex((record: any) => record.rowID === this.grid.crudService.addRowParent.rowID);\n            copy.splice(parentRowIndex + 1, 0, rec);\n        } else {\n            copy.splice(this.grid.crudService.row.index, 0, rec);\n        }\n        this.grid.records!.set(rec.key, rec);\n        return copy;\n    }\n}\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Input\n} from '@angular/core';\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\n\nimport { IgxTreeGridRow } from 'igniteui-angular/grids/core';\nimport { RowType } from 'igniteui-angular/grids/core';\nimport { IgxGridCellImageAltPipe, IgxStringReplacePipe, IgxColumnFormatterPipe } from 'igniteui-angular/grids/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IgxNumberFormatterPipe, IgxPercentFormatterPipe, IgxCurrencyFormatterPipe, IgxDateFormatterPipe } from 'igniteui-angular/core';\nimport { IgxChipComponent } from 'igniteui-angular/chips';\nimport { IgxDateTimeEditorDirective, IgxFocusDirective, IgxTextHighlightDirective, IgxTextSelectionDirective, IgxTooltipDirective, IgxTooltipTargetDirective } from 'igniteui-angular/directives';\nimport { IgxIconComponent } from 'igniteui-angular/icon';\nimport { IgxInputDirective, IgxInputGroupComponent, IgxPrefixDirective, IgxSuffixDirective } from 'igniteui-angular/input-group';\nimport { IgxCheckboxComponent } from 'igniteui-angular/checkbox';\nimport { IgxDatePickerComponent } from 'igniteui-angular/date-picker';\nimport { IgxTimePickerComponent } from 'igniteui-angular/time-picker';\nimport { IgxCircularProgressBarComponent } from 'igniteui-angular/progressbar';\nimport { IgxGridExpandableCellComponent } from 'igniteui-angular/grids/grid';\n\n@Component({\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    selector: 'igx-tree-grid-cell',\n    templateUrl: 'tree-cell.component.html',\n    imports: [\n        NgClass,\n        NgStyle,\n        NgTemplateOutlet,\n        IgxNumberFormatterPipe,\n        IgxPercentFormatterPipe,\n        IgxCurrencyFormatterPipe,\n        IgxDateFormatterPipe,\n        IgxChipComponent,\n        IgxTextHighlightDirective,\n        IgxIconComponent,\n        ReactiveFormsModule,\n        IgxInputGroupComponent,\n        IgxInputDirective,\n        IgxFocusDirective,\n        IgxCheckboxComponent,\n        IgxDatePickerComponent,\n        IgxTimePickerComponent,\n        IgxDateTimeEditorDirective,\n        IgxPrefixDirective,\n        IgxSuffixDirective,\n        IgxCircularProgressBarComponent,\n        IgxTooltipTargetDirective,\n        IgxTooltipDirective,\n        IgxGridCellImageAltPipe,\n        IgxStringReplacePipe,\n        IgxColumnFormatterPipe,\n        IgxTextSelectionDirective\n    ]\n})\nexport class IgxTreeGridCellComponent extends IgxGridExpandableCellComponent {\n\n    /**\n     * @hidden\n     */\n    @Input()\n    public level = 0;\n\n    /**\n     * @hidden\n     */\n    @Input()\n    public showIndicator = false;\n\n    /**\n     * @hidden\n     */\n    @Input()\n    public isLoading!: boolean;\n\n    /**\n     * Gets the row of the cell.\n     * ```typescript\n     * let cellRow = this.cell.row;\n     * ```\n     *\n     * @memberof IgxGridCellComponent\n     */\n    @Input()\n    public override get row(): RowType {\n        // TODO: Fix types\n        return new IgxTreeGridRow(this.grid as any, this.intRow.index, this.intRow.data);\n    }\n\n    /**\n     * @hidden\n     */\n    public override toggle(event: Event) {\n        event.stopPropagation();\n        this.grid.gridAPI.set_row_expansion_state(this.intRow.key, !this.intRow.expanded, event);\n    }\n\n    /**\n     * @hidden\n     */\n    public onLoadingDblClick(event: Event) {\n        event.stopPropagation();\n    }\n}\n","<ng-template #defaultPinnedIndicator>\n  @if (displayPinnedChip) {\n    <igx-chip\n      class=\"igx-grid__td--pinned-chip\"\n      [disabled]=\"true\"\n      [style.--ig-size]=\"1\"\n      >{{ grid.resourceStrings.igx_grid_pinned_row_indicator }}</igx-chip\n    >\n  }\n</ng-template>\n<ng-template #defaultCell>\n  @if (\n    (column.dataType !== 'boolean' && column.dataType !== 'image') ||\n    (column.dataType === 'boolean' && this.formatter)\n  ) {\n    <div\n      igxTextHighlight\n      class=\"igx-grid__td-text\"\n      [cssClass]=\"highlightClass\"\n      [activeCssClass]=\"activeHighlightClass\"\n      [groupName]=\"gridID\"\n      [value]=\"\n        formatter\n          ? (value | columnFormatter: formatter : rowData)\n          : column.dataType === 'number'\n            ? (value | number: column.pipeArgs.digitsInfo : grid.locale)\n            : column.dataType === 'date' ||\n                column.dataType === 'time' ||\n                column.dataType === 'dateTime'\n              ? (value\n                | date\n                  : column.pipeArgs.format\n                  : column.pipeArgs.timezone\n                  : grid.locale)\n              : column.dataType === 'currency'\n                ? (value\n                  | currency\n                    : currencyCode\n                    : column.pipeArgs.display\n                    : column.pipeArgs.digitsInfo\n                    : grid.locale)\n                : column.dataType === 'percent'\n                  ? (value | percent: column.pipeArgs.digitsInfo : grid.locale)\n                  : value\n      \"\n      [row]=\"rowData\"\n      [column]=\"this.column.field\"\n      [containerClass]=\"'igx-grid__td-text'\"\n      [metadata]=\"searchMetadata\"\n    >\n      {{\n        formatter\n          ? (value | columnFormatter: formatter : rowData)\n          : column.dataType === 'number'\n            ? (value | number: column.pipeArgs.digitsInfo : grid.locale)\n            : column.dataType === 'date' ||\n                column.dataType === 'time' ||\n                column.dataType === 'dateTime'\n              ? (value\n                | date\n                  : column.pipeArgs.format\n                  : column.pipeArgs.timezone\n                  : grid.locale)\n              : column.dataType === 'currency'\n                ? (value\n                  | currency\n                    : currencyCode\n                    : column.pipeArgs.display\n                    : column.pipeArgs.digitsInfo\n                    : grid.locale)\n                : column.dataType === 'percent'\n                  ? (value | percent: column.pipeArgs.digitsInfo : grid.locale)\n                  : value\n      }}\n    </div>\n  }\n  @if (column.dataType === 'boolean' && !this.formatter) {\n    <igx-icon\n      family=\"default\"\n      [name]=\"value ? 'confirm' : 'close'\"\n      [ngClass]=\"{ 'igx-icon--success': value, 'igx-icon--error': !value }\"\n    >\n    </igx-icon>\n  }\n  @if (column.dataType === 'image') {\n    <img [src]=\"value\" [alt]=\"value | igxCellImageAlt\" />\n  }\n</ng-template>\n<ng-template #addRowCell let-cell=\"cell\">\n  @if (\n    column.dataType !== 'boolean' ||\n    (column.dataType === 'boolean' && this.formatter)\n  ) {\n    <div\n      igxTextHighlight\n      class=\"igx-grid__td-text\"\n      [cssClass]=\"highlightClass\"\n      [activeCssClass]=\"activeHighlightClass\"\n      [groupName]=\"gridID\"\n      [value]=\"\n        formatter\n          ? (value | columnFormatter: formatter : rowData)\n          : column.dataType === 'number'\n            ? (value | number: column.pipeArgs.digitsInfo : grid.locale)\n            : column.dataType === 'date' ||\n                column.dataType === 'time' ||\n                column.dataType === 'dateTime'\n              ? (value\n                | date\n                  : column.pipeArgs.format\n                  : column.pipeArgs.timezone\n                  : grid.locale)\n              : column.dataType === 'currency'\n                ? (value\n                  | currency\n                    : currencyCode\n                    : column.pipeArgs.display\n                    : column.pipeArgs.digitsInfo\n                    : grid.locale)\n                : column.dataType === 'percent'\n                  ? (value | percent: column.pipeArgs.digitsInfo : grid.locale)\n                  : value\n      \"\n      [row]=\"rowData\"\n      [column]=\"this.column.field\"\n      [containerClass]=\"'igx-grid__td-text'\"\n      [metadata]=\"searchMetadata\"\n    >\n      {{ !isEmptyAddRowCell ? value : column.header || column.field }}\n    </div>\n  }\n</ng-template>\n<ng-template #inlineEditor let-cell=\"cell\">\n  @if (column.dataType === 'string' || column.dataType === 'image') {\n    <ng-container [formGroup]=\"formGroup\">\n      <igx-input-group [style.--ig-size]=\"1\">\n        <input\n          igxInput\n          [attr.aria-describedby]=\"ariaDescribeBy\"\n          [attr.aria-invalid]=\"isInvalid\"\n          [igxFocus]=\"true\"\n          [igxTextSelection]=\"true\"\n          [formControl]=\"formControl\"\n          (compositionstart)=\"grid.crudService.isInCompositionMode = true\"\n          (compositionend)=\"grid.crudService.isInCompositionMode = false\"\n        />\n      </igx-input-group>\n    </ng-container>\n  }\n  @if (column.dataType === 'number') {\n    <igx-input-group [style.--ig-size]=\"1\" [formGroup]=\"formGroup\">\n      <input\n        igxInput\n        [attr.aria-describedby]=\"ariaDescribeBy\"\n        [attr.aria-invalid]=\"isInvalid\"\n        [igxFocus]=\"true\"\n        [step]=\"step\"\n        type=\"number\"\n        [igxTextSelection]=\"true\"\n        [formControl]=\"formControl\"\n      />\n    </igx-input-group>\n  }\n  @if (column.dataType === 'boolean') {\n    <ng-container [formGroup]=\"formGroup\">\n      <igx-checkbox\n        [checked]=\"editValue\"\n        [igxFocus]=\"true\"\n        [disableRipple]=\"true\"\n        [formControl]=\"formControl\"\n      ></igx-checkbox>\n    </ng-container>\n  }\n  @if (column.dataType === 'date') {\n    <ng-container [formGroup]=\"formGroup\">\n      <igx-date-picker\n        [style.width.%]=\"100\"\n        mode=\"dropdown\"\n        [locale]=\"grid.locale\"\n        [weekStart]=\"column.pipeArgs.weekStart!\"\n        [(value)]=\"editValue\"\n        [igxFocus]=\"true\"\n        [formControl]=\"formControl\"\n        [inputFormat]=\"column.editorOptions?.dateTimeFormat!\"\n        [displayFormat]=\"column.pipeArgs.format!\"\n      >\n      </igx-date-picker>\n    </ng-container>\n  }\n  @if (column.dataType === 'time') {\n    <ng-container [formGroup]=\"formGroup\">\n      <igx-time-picker\n        [style.width.%]=\"100\"\n        mode=\"dropdown\"\n        [locale]=\"grid.locale\"\n        [(value)]=\"editValue\"\n        [igxFocus]=\"true\"\n        [formControl]=\"formControl\"\n        [inputFormat]=\"column.editorOptions?.dateTimeFormat!\"\n        [displayFormat]=\"column.pipeArgs.format!\"\n      ></igx-time-picker>\n    </ng-container>\n  }\n  @if (column.dataType === 'dateTime') {\n    <igx-input-group [formGroup]=\"formGroup\">\n      <input\n        type=\"text\"\n        [attr.aria-describedby]=\"ariaDescribeBy\"\n        [attr.aria-invalid]=\"isInvalid\"\n        [formControl]=\"formControl\"\n        igxInput\n        [locale]=\"grid.locale\"\n        [igxDateTimeEditor]=\"column.editorOptions?.dateTimeFormat!\"\n        [defaultFormatType]=\"column.dataType\"\n        [displayFormat]=\"column.pipeArgs.format!\"\n        [igxFocus]=\"true\"\n      />\n    </igx-input-group>\n  }\n  @if (column.dataType === 'currency') {\n    <igx-input-group [style.--ig-size]=\"1\" [formGroup]=\"formGroup\">\n      @if (grid.currencyPositionLeft) {\n        <igx-prefix>{{ currencyCodeSymbol }}</igx-prefix>\n      }\n      <input\n        igxInput\n        [attr.aria-describedby]=\"ariaDescribeBy\"\n        [attr.aria-invalid]=\"isInvalid\"\n        [igxFocus]=\"true\"\n        [step]=\"step\"\n        type=\"number\"\n        [igxTextSelection]=\"true\"\n        [formControl]=\"formControl\"\n      />\n      @if (!grid.currencyPositionLeft) {\n        <igx-suffix>{{ currencyCodeSymbol }}</igx-suffix>\n      }\n    </igx-input-group>\n  }\n  @if (column.dataType === 'percent') {\n    <igx-input-group [style.--ig-size]=\"1\" [formGroup]=\"formGroup\">\n      <input\n        igxInput\n        [attr.aria-describedby]=\"ariaDescribeBy\"\n        [attr.aria-invalid]=\"isInvalid\"\n        [igxFocus]=\"true\"\n        [step]=\"step\"\n        type=\"number\"\n        [igxTextSelection]=\"true\"\n        [formControl]=\"formControl\"\n      />\n      <igx-suffix>\n        {{ editValue | percent: column.pipeArgs.digitsInfo : grid.locale }}\n      </igx-suffix>\n    </igx-input-group>\n  }\n</ng-template>\n@if (!editMode) {\n  @if (level > 0) {\n    <div\n      #indentationDiv\n      class=\"igx-grid__tree-cell--padding-level-{{ level }}\"\n      [ngStyle]=\"{\n        'padding-inline-start':\n          'calc(var(--ig-tree-indent-size) *' + level + ')',\n      }\"\n    ></div>\n  }\n  @if (!isLoading) {\n    <div\n      #indicator\n      class=\"igx-grid__tree-grouping-indicator\"\n      [ngStyle]=\"{ visibility: showIndicator ? 'visible' : 'hidden' }\"\n      (click)=\"toggle($event)\"\n      (focus)=\"onIndicatorFocus()\"\n    >\n      <ng-container\n        *ngTemplateOutlet=\"iconTemplate; context: { $implicit: $any(this) }\"\n      >\n      </ng-container>\n      <ng-container\n        *ngTemplateOutlet=\"pinnedIndicatorTemplate; context: context\"\n      >\n      </ng-container>\n    </div>\n  }\n  @if (isLoading) {\n    <div\n      (dblclick)=\"onLoadingDblClick($event)\"\n      class=\"igx-grid__tree-loading-indicator\"\n    >\n      <ng-container\n        *ngTemplateOutlet=\"\n          grid.rowLoadingIndicatorTemplate\n            ? grid.rowLoadingIndicatorTemplate\n            : defaultLoadingIndicatorTemplate\n        \"\n      >\n      </ng-container>\n    </div>\n  }\n  <ng-template #defaultLoadingIndicatorTemplate>\n    <igx-circular-bar [indeterminate]=\"true\"> </igx-circular-bar>\n  </ng-template>\n}\n<ng-container *ngTemplateOutlet=\"template; context: context\"> </ng-container>\n@if (isInvalid) {\n  <igx-icon\n    family=\"default\"\n    name=\"error\"\n    #errorIcon\n    [igxTooltipTarget]=\"tooltipRef\"\n    (mouseover)=\"errorShowing = true\"\n    (mouseout)=\"errorShowing = false\"\n  >\n  </igx-icon>\n  <div [id]=\"ariaErrorMessage\" igxTooltip #error #tooltipRef=\"tooltip\">\n    <div [style.width]=\"'max-content'\">\n      <ng-container\n        *ngTemplateOutlet=\"\n          cellValidationErrorTemplate || defaultError;\n          context: context\n        \"\n      ></ng-container>\n    </div>\n  </div>\n}\n\n<ng-template #defaultExpandedTemplate>\n  <igx-icon family=\"default\" name=\"tree_collapse\"></igx-icon>\n</ng-template>\n<ng-template #defaultCollapsedTemplate>\n  <igx-icon family=\"default\" name=\"tree_expand\"></igx-icon>\n</ng-template>\n<ng-template #defaultError>\n  @if (\n    formGroup.get(column.field)!.errors?.['required']\n  ) {\n    <div>\n      {{ grid.resourceStrings.igx_grid_required_validation_error }}\n    </div>\n  }\n  @if (\n    formGroup.get(column.field)!.errors?.[\n      'minlength'\n    ]\n  ) {\n    <div>\n      {{\n        grid.resourceStrings.igx_grid_min_length_validation_error!\n          | igxStringReplace\n            : '{0}'\n            : formGroup.get(column.field)!.errors!.minlength.requiredLength\n      }}\n    </div>\n  }\n  @if (\n    formGroup.get(column.field)!.errors?.[\n      'maxlength'\n    ]\n  ) {\n    <div>\n      {{\n        grid.resourceStrings.igx_grid_max_length_validation_error!\n          | igxStringReplace\n            : '{0}'\n            : formGroup.get(column.field)!.errors!.maxlength.requiredLength\n      }}\n    </div>\n  }\n  @if (\n    formGroup.get(column.field)!.errors?.['min']\n  ) {\n    <div>\n      {{\n        grid.resourceStrings.igx_grid_min_validation_error!\n          | igxStringReplace: '{0}' : formGroup.get(column.field)!.errors!.min.min\n      }}\n    </div>\n  }\n  @if (\n    formGroup.get(column.field)!.errors?.['max']\n  ) {\n    <div>\n      {{\n        grid.resourceStrings.igx_grid_max_validation_error!\n          | igxStringReplace: '{0}' : formGroup.get(column.field)!.errors!.max.max\n      }}\n    </div>\n  }\n  @if (\n    formGroup.get(column.field)!.errors?.['email']\n  ) {\n    <div>\n      {{ grid.resourceStrings.igx_grid_email_validation_error }}\n    </div>\n  }\n  @if (\n    formGroup.get(column.field)!.errors?.['pattern']\n  ) {\n    <div>\n      {{ grid.resourceStrings.igx_grid_pattern_validation_error }}\n    </div>\n  }\n</ng-template>\n","import { Component, forwardRef, Input, ViewChildren, QueryList, HostBinding, DoCheck, ChangeDetectionStrategy } from '@angular/core';\nimport { IgxRowDirective } from 'igniteui-angular/grids/core';\nimport { IgxGridNotGroupedPipe, IgxGridCellStylesPipe, IgxGridCellStyleClassesPipe, IgxGridDataMapperPipe, IgxGridTransactionStatePipe } from 'igniteui-angular/grids/core';\nimport { IgxTreeGridCellComponent } from './tree-cell.component';\nimport { IgxGridCellComponent } from 'igniteui-angular/grids/core';\nimport { IgxRowDragDirective } from 'igniteui-angular/grids/core';\nimport { NgTemplateOutlet, NgClass, NgStyle } from '@angular/common';\nimport { IgxGridForOfDirective } from 'igniteui-angular/directives';\nimport { IgxCheckboxComponent } from 'igniteui-angular/checkbox';\nimport { ITreeGridRecord } from 'igniteui-angular/core';\n\n@Component({\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    selector: 'igx-tree-grid-row',\n    templateUrl: 'tree-grid-row.component.html',\n    providers: [{ provide: IgxRowDirective, useExisting: forwardRef(() => IgxTreeGridRowComponent) }],\n    imports: [NgTemplateOutlet, IgxRowDragDirective, IgxGridForOfDirective, IgxGridCellComponent, NgClass, NgStyle, IgxTreeGridCellComponent, IgxCheckboxComponent, IgxGridNotGroupedPipe, IgxGridCellStylesPipe, IgxGridCellStyleClassesPipe, IgxGridDataMapperPipe, IgxGridTransactionStatePipe]\n})\nexport class IgxTreeGridRowComponent extends IgxRowDirective implements DoCheck {\n    @ViewChildren('treeCell')\n    protected override _cells!: QueryList<IgxTreeGridCellComponent>;\n\n    /**\n     * @hidden\n     */\n    public isLoading!: boolean;\n\n    private _treeRow!: ITreeGridRecord;\n\n    /**\n     * The `ITreeGridRecord` passed to the row component.\n     *\n     * ```typescript\n     * const row = this.grid.getRowByKey(1) as IgxTreeGridRowComponent;\n     * const treeRow = row.treeRow;\n     * ```\n     */\n    @Input()\n    public get treeRow(): ITreeGridRecord {\n        return this._treeRow;\n    }\n\n    public set treeRow(value: ITreeGridRecord) {\n        if (this._treeRow !== value) {\n            this._treeRow = value;\n            this.data = this._treeRow.data;\n        }\n    }\n\n    /**\n     * Sets whether the row is pinned.\n     * Default value is `false`.\n     * ```typescript\n     * this.grid.selectedRows[0].pinned = true;\n     * ```\n     */\n    public override set pinned(value: boolean) {\n        if (value) {\n            this.grid.pinRow(this.key);\n        } else {\n            this.grid.unpinRow(this.key);\n        }\n    }\n\n    /**\n     * Gets whether the row is pinned.\n     * ```typescript\n     * let isPinned = row.pinned;\n     * ```\n     */\n    public override get pinned() {\n        return this.grid.isRecordPinned(this._treeRow);\n    }\n\n    /**\n     * @hidden\n     */\n    public override get isRoot(): boolean {\n        let treeRec = this.treeRow;\n        const isPinnedArea = this.pinned && !this.disabled;\n        if (isPinnedArea) {\n            treeRec = this.grid.unpinnedRecords.find(x => x.data === this.data);\n        }\n        return treeRec?.level === 0;\n    }\n\n    /**\n     * @hidden\n     */\n    public override get hasChildren(): boolean {\n        return true;\n    }\n\n    /**\n     * Returns a value indicating whether the row component is expanded.\n     *\n     * ```typescript\n     * const row = this.grid.getRowByKey(1) as IgxTreeGridRowComponent;\n     * const expanded = row.expanded;\n     * ```\n     */\n    @HostBinding('attr.aria-expanded')\n    public override get expanded(): boolean {\n        return this._treeRow.expanded!;\n    }\n\n    /**\n     * Sets a value indicating whether the row component is expanded.\n     *\n     * ```typescript\n     * const row = this.grid.getRowByKey(1) as IgxTreeGridRowComponent;\n     * row.expanded = true;\n     * ```\n     */\n    public override set expanded(value: boolean) {\n        this.grid.gridAPI.set_row_expansion_state(this._treeRow.key, value);\n    }\n\n    /**\n     * @hidden\n     * @internal\n     */\n    public override get viewIndex(): number {\n        return this.index + this.grid.page * this.grid.perPage;\n    }\n\n    /**\n     * @hidden\n     */\n    public get showIndicator() {\n        return this.grid.loadChildrenOnDemand ?\n            this.grid.expansionStates.has(this.key) ?\n                this.treeRow.children && this.treeRow.children.length :\n                this.grid.hasChildrenKey ?\n                    this.data[this.grid.hasChildrenKey] :\n                    true :\n            this.treeRow.children && this.treeRow.children.length;\n    }\n\n    /**\n     * @hidden\n     */\n    public get indeterminate(): boolean {\n        return this.selectionService.isRowInIndeterminateState(this.key);\n    }\n\n    /**\n     * @hidden\n     */\n    public override ngDoCheck() {\n        this.isLoading = this.grid.loadChildrenOnDemand ? this.grid.loadingRows!.has(this.key) : false;\n        super.ngDoCheck();\n    }\n\n    /**\n     * Spawns the add child row UI for the specific row.\n     *\n     * @example\n     * ```typescript\n     * const row = this.grid.getRowByKey(1) as IgxTreeGridRowComponent;\n     * row.beginAddChild();\n     * ```\n     * @param rowID\n     */\n    public beginAddChild() {\n        this.grid.crudService.enterAddRowMode(this, true);\n    }\n}\n","<ng-container\n  *ngTemplateOutlet=\"addRowUI ? addTemp : defaultTemp\"\n></ng-container>\n\n<ng-template #addTemp>\n  <div\n    class=\"igx-grid__tr--inner\"\n    [class.igx-grid__tr--add-animate]=\"triggerAddAnimationClass\"\n    (animationend)=\"animationEndHandler()\"\n  >\n    <ng-container *ngTemplateOutlet=\"defaultTemp\"></ng-container>\n  </div>\n</ng-template>\n<ng-template #defaultTemp>\n  @if (rowDraggable) {\n    <div\n      [class]=\"resolveDragIndicatorClasses\"\n      role=\"gridcell\"\n      [igxRowDrag]=\"this\"\n      (click)=\"$event.stopPropagation()\"\n      [ghostTemplate]=\"this.grid.getDragGhostCustomTemplate()!\"\n    >\n      <ng-container\n        *ngTemplateOutlet=\"\n          this.grid.dragIndicatorIconTemplate\n            ? this.grid.dragIndicatorIconTemplate\n            : this.grid.dragIndicatorIconBase\n        \"\n      ></ng-container>\n    </div>\n  }\n  @if (showRowSelectors) {\n    <div\n      class=\"igx-grid__cbx-selection igx-grid__tr-action\"\n      role=\"gridcell\"\n      (click)=\"onRowSelectorClick($event)\"\n      (pointerdown)=\"$event.preventDefault()\"\n    >\n      <ng-template\n        *ngTemplateOutlet=\"\n          this.grid.rowSelectorTemplate\n            ? this.grid.rowSelectorTemplate\n            : rowSelectorBaseTemplate;\n          context: {\n            $implicit: {\n              index: viewIndex,\n              rowID: key,\n              key,\n              selected: selected,\n            },\n          }\n        \"\n      >\n      </ng-template>\n    </div>\n  }\n  @if (pinnedStartColumns.length > 0) {\n    <ng-container\n      *ngTemplateOutlet=\"\n        pinnedCellsTemplate;\n        context: { $implicit: this, columns: pinnedStartColumns }\n      \"\n    ></ng-container>\n  }\n  <ng-template\n    igxGridFor\n    let-col\n    [igxGridForOf]=\"unpinnedColumns | igxNotGrouped\"\n    [igxForScrollContainer]=\"grid.parentVirtDir\"\n    let-colIndex=\"index\"\n    [igxForScrollOrientation]=\"'horizontal'\"\n    [igxForContainerSize]=\"grid.unpinnedWidth\"\n    [igxForSizePropName]=\"'calcPixelWidth'\"\n    [igxForTrackBy]=\"grid.trackColumnChanges\"\n    #igxDirRef\n  >\n    @if (this.hasMergedCells) {\n      <div\n        [style.height.px]=\"\n          this.metaData?.cellMergeMeta.get(col.field)?.rowSpan > 1\n            ? getRowHeight()\n            : null\n        \"\n        class=\"igx-grid__mrl-block\"\n        [style.visibility]=\"\n          this.metaData?.cellMergeMeta.get(col.field)?.root\n            ? 'hidden'\n            : 'visible'\n        \"\n        [ngStyle]=\"{\n          'grid-template-rows':\n            this.metaData?.cellMergeMeta.get(col.field)?.rowSpan > 1\n              ? this.getMergeCellSpan(col)\n              : null,\n        }\"\n      >\n        <ng-container\n          *ngTemplateOutlet=\"\n            col.visibleIndex === 0 ? treeCellTemplate : cellTemplate;\n            context: { $implicit: this, column: col }\n          \"\n        ></ng-container>\n      </div>\n    } @else {\n      <ng-container\n        *ngTemplateOutlet=\"\n          col.visibleIndex === 0 ? treeCellTemplate : cellTemplate;\n          context: { $implicit: this, column: col }\n        \"\n      ></ng-container>\n    }\n  </ng-template>\n  @if (pinnedEndColumns.length > 0) {\n    <ng-container\n      *ngTemplateOutlet=\"\n        pinnedCellsTemplate;\n        context: { $implicit: this, columns: pinnedEndColumns }\n      \"\n    ></ng-container>\n  }\n</ng-template>\n\n<ng-template #rowSelectorBaseTemplate>\n  <div class=\"igx-grid__cbx-padding\">\n    <igx-checkbox\n      [tabindex]=\"-1\"\n      [readonly]=\"true\"\n      [checked]=\"selected\"\n      [indeterminate]=\"indeterminate\"\n      [disabled]=\"deleted\"\n      [disableRipple]=\"true\"\n      [disableTransitions]=\"grid.disableTransitions\"\n      [aria-label]=\"rowCheckboxAriaLabel\"\n    >\n    </igx-checkbox>\n  </div>\n</ng-template>\n\n<ng-template #pinnedCellsTemplate let-col let-columns=\"columns\">\n  @for (col of columns | igxNotGrouped; track trackPinnedColumn(col)) {\n    @if (this.hasMergedCells) {\n      <div\n        [style.height.px]=\"\n          this.metaData?.cellMergeMeta.get(col.field)?.rowSpan > 1\n            ? getRowHeight()\n            : null\n        \"\n        class=\"igx-grid__mrl-block\"\n        [style.visibility]=\"\n          this.metaData?.cellMergeMeta.get(col.field)?.root\n            ? 'hidden'\n            : 'visible'\n        \"\n        [ngStyle]=\"{\n          'grid-template-rows':\n            this.metaData?.cellMergeMeta.get(col.field)?.rowSpan > 1\n              ? this.getMergeCellSpan(col)\n              : null,\n        }\"\n      >\n        <ng-container\n          *ngTemplateOutlet=\"\n            col.visibleIndex === 0 ? treeCellTemplate : cellTemplate;\n            context: { $implicit: this, column: col }\n          \"\n        ></ng-container>\n      </div>\n    } @else {\n      <ng-container\n        *ngTemplateOutlet=\"\n          col.visibleIndex === 0 ? treeCellTemplate : cellTemplate;\n          context: { $implicit: this, column: col }\n        \"\n      ></ng-container>\n    }\n  }\n</ng-template>\n\n<ng-template #cellTemplate let-col=\"column\">\n  <igx-grid-cell\n    [class.igx-grid__td--merged]=\"\n      metaData?.cellMergeMeta.get(col.field)?.rowSpan > 1\n    \"\n    [class.igx-grid__td--merged-selected]=\"isSelectionRoot(col)\"\n    [class.igx-grid__td--merged-hovered]=\"isHoveredRoot(col)\"\n    [class.igx-grid__td--pinned]=\"col.pinned\"\n    [isMerged]=\"\n      $safeNavigationMigration(\n        metaData?.cellMergeMeta.get(col.field)?.rowSpan\n      ) > 1\n    \"\n    [isPlaceholder]=\"!!this.metaData?.cellMergeMeta.get(col.field)?.root\"\n    class=\"igx-grid__td igx-grid__td--fw\"\n    [class.igx-grid__td--edited]=\"\n      key\n        | transactionState\n          : col.field\n          : grid.rowEditable\n          : grid.transactions\n          : grid.pipeTrigger\n          : grid.gridAPI.crudService.cell\n          : grid.gridAPI.crudService.row\n    \"\n    [class.igx-grid__td--number]=\"\n      col.dataType === 'number' ||\n      col.dataType === 'percent' ||\n      col.dataType === 'currency'\n    \"\n    [ngClass]=\"\n      col.cellClasses\n        | igxCellStyleClasses\n          : data[col.field]\n          : data\n          : col.field\n          : viewIndex\n          : grid.pipeTrigger\n    \"\n    [ngStyle]=\"\n      col.cellStyles\n        | igxCellStyles\n          : data[col.field]\n          : data\n          : col.field\n          : viewIndex\n          : grid.pipeTrigger\n    \"\n    [editMode]=\"\n      col.editable && this.grid.crudService.targetInEdit(index, col.index)\n    \"\n    [column]=\"col\"\n    [formatter]=\"col.formatter\"\n    [intRow]=\"this\"\n    [firstPinned]=\"col.isFirstPinned\"\n    [lastPinned]=\"col.isLastPinned\"\n    [rowData]=\"data\"\n    [style.min-width]=\"col.resolvedWidth\"\n    [style.max-width]=\"col.resolvedWidth\"\n    [style.flex-basis]=\"col.resolvedWidth\"\n    [width]=\"col.getCellWidth()\"\n    [visibleColumnIndex]=\"col.visibleIndex\"\n    [value]=\"\n      data\n        | dataMapper\n          : col.field\n          : grid.pipeTrigger\n          : data[col.field]\n          : col.hasNestedPath\n    \"\n    [cellTemplate]=\"col.bodyTemplate\"\n    [cellValidationErrorTemplate]=\"col.errorTemplate\"\n    [lastSearchInfo]=\"grid.lastSearchInfo\"\n    [active]=\"isCellActive(col.visibleIndex)\"\n    [cellSelectionMode]=\"grid.cellSelection\"\n    [displayPinnedChip]=\"shouldDisplayPinnedChip(col)\"\n    #treeCell\n  >\n  </igx-grid-cell>\n</ng-template>\n<ng-template #treeCellTemplate let-col=\"column\">\n  <igx-tree-grid-cell\n    class=\"igx-grid__td igx-grid__td--fw igx-grid__td--tree-cell\"\n    [class.igx-grid__td--merged]=\"\n      metaData?.cellMergeMeta.get(col.field)?.rowSpan > 1\n    \"\n    [class.igx-grid__td--merged-selected]=\"isSelectionRoot(col)\"\n    [class.igx-grid__td--merged-hovered]=\"isHoveredRoot(col)\"\n    [isMerged]=\"\n      $safeNavigationMigration(\n        metaData?.cellMergeMeta.get(col.field)?.rowSpan\n      ) > 1\n    \"\n    [isPlaceholder]=\"!!this.metaData?.cellMergeMeta.get(col.field)?.root\"\n    [class.igx-grid__td--pinned]=\"col.pinned\"\n    [class.igx-grid__td--edited]=\"\n      key\n        | transactionState\n          : col.field\n          : grid.rowEditable\n          : grid.transactions\n          : grid.pipeTrigger\n          : grid.gridAPI.crudService.cell\n          : grid.gridAPI.crudService.row\n    \"\n    [class.igx-grid__td--number]=\"\n      (col.dataType === 'number' ||\n        col.dataType === 'percent' ||\n        col.dataType === 'currency') &&\n      col.visibleIndex !== 0\n    \"\n    [ngClass]=\"\n      col.cellClasses\n        | igxCellStyleClasses\n          : data[col.field]\n          : data\n          : col.field\n          : viewIndex\n          : grid.pipeTrigger\n    \"\n    [ngStyle]=\"\n      col.cellStyles\n        | igxCellStyles\n          : data[col.field]\n          : data\n          : col.field\n          : viewIndex\n          : grid.pipeTrigger\n    \"\n    [level]=\"treeRow.level!\"\n    [expanded]=\"expanded\"\n    [showIndicator]=\"showIndicator\"\n    [editMode]=\"\n      col.editable && this.grid.crudService.targetInEdit(index, col.index)\n    \"\n    [column]=\"col\"\n    [formatter]=\"col.formatter\"\n    [intRow]=\"this\"\n    [lastPinned]=\"col.isLastPinned\"\n    [rowData]=\"data\"\n    [style.min-width]=\"col.resolvedWidth\"\n    [style.max-width]=\"col.resolvedWidth\"\n    [style.flex-basis]=\"col.resolvedWidth\"\n    [width]=\"col.getCellWidth()\"\n    [visibleColumnIndex]=\"col.visibleIndex\"\n    [value]=\"\n      data\n        | dataMapper\n          : col.field\n          : grid.pipeTrigger\n          : data[col.field]\n          : col.hasNestedPath\n    \"\n    [isLoading]=\"isLoading\"\n    [cellTemplate]=\"col.bodyTemplate\"\n    [cellValidationErrorTemplate]=\"col.errorTemplate\"\n    [lastSearchInfo]=\"grid.lastSearchInfo\"\n    [active]=\"isCellActive(col.visibleIndex)\"\n    [cellSelectionMode]=\"grid.cellSelection\"\n    [displayPinnedChip]=\"shouldDisplayPinnedChip(col)\"\n    #treeCell\n  >\n  </igx-tree-grid-cell>\n</ng-template>\n","import { AfterContentInit, Component, Input, IterableDiffer, IterableDiffers, OnDestroy, booleanAttribute, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { IChipsAreaReorderEventArgs, IgxChipComponent, IgxChipsAreaComponent } from 'igniteui-angular/chips';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { IgxIconComponent } from 'igniteui-angular/icon';\nimport { IgxSuffixDirective } from 'igniteui-angular/input-group';\nimport { IgxDropDirective } from 'igniteui-angular/directives';\nimport { IGroupingExpression, ISortingExpression } from 'igniteui-angular/core';\nimport { IgxGroupAreaDropDirective, IgxGroupByAreaDirective, IgxGroupByMetaPipe } from 'igniteui-angular/grids/core';\n\n/**\n * An internal component representing the group-by drop area for the igx-grid component.\n *\n * @hidden @internal\n */\n@Component({\n    selector: 'igx-tree-grid-group-by-area',\n    templateUrl: '../../core/src/grouping/group-by-area.component.html',\n    providers: [{ provide: IgxGroupByAreaDirective, useExisting: IgxTreeGridGroupByAreaComponent }],\n    changeDetection: ChangeDetectionStrategy.Eager,\n    imports: [IgxChipsAreaComponent, IgxChipComponent, IgxIconComponent, IgxSuffixDirective, IgxGroupAreaDropDirective, IgxDropDirective, NgTemplateOutlet, IgxGroupByMetaPipe]\n})\nexport class IgxTreeGridGroupByAreaComponent extends IgxGroupByAreaDirective implements AfterContentInit, OnDestroy {\n    private differs = inject(IterableDiffers);\n\n    @Input({ transform: booleanAttribute })\n    public get hideGroupedColumns() {\n        return this._hideGroupedColumns;\n    }\n\n    public set hideGroupedColumns(value: boolean) {\n        if (this.grid?.columns && this.expressions) {\n            this.setColumnsVisibility(value);\n        }\n\n        this._hideGroupedColumns = value;\n    }\n\n    private _hideGroupedColumns = false;\n    private groupingDiffer!: IterableDiffer<IGroupingExpression>;\n    private destroy$ = new Subject<any>();\n\n    public ngAfterContentInit(): void {\n        if (this.grid.columns && this.expressions) {\n            this.groupingDiffer = this.differs.find(this.expressions).create();\n            this.updateColumnsVisibility();\n        }\n\n        this.grid.sortingExpressionsChange.pipe(takeUntil(this.destroy$)).subscribe((sortingExpressions: ISortingExpression[]) => {\n            if (!this.expressions || !this.expressions.length) {\n                return;\n            }\n\n            let changed = false;\n\n            sortingExpressions.forEach((sortExpr: ISortingExpression) => {\n                const fieldName = sortExpr.fieldName;\n                const groupingExpr = this.expressions.find(ex => ex.fieldName === fieldName);\n                if (groupingExpr && groupingExpr.dir !== sortExpr.dir) {\n                    groupingExpr.dir = sortExpr.dir;\n                    changed = true;\n                }\n            });\n\n            if (changed) {\n                this.expressions = [...this.expressions];\n            }\n        });\n    }\n\n    public ngOnDestroy(): void {\n        this.destroy$.next(true);\n        this.destroy$.complete();\n    }\n\n    public handleReorder(event: IChipsAreaReorderEventArgs) {\n        const { chipsArray, originalEvent } = event;\n        const newExpressions = this.getReorderedExpressions(chipsArray);\n\n        this.chipExpressions = newExpressions;\n\n        // When reordered using keyboard navigation, we don't have `onMoveEnd` event.\n        if (originalEvent instanceof KeyboardEvent) {\n            this.expressions = newExpressions;\n        }\n    }\n\n    public handleMoveEnd() {\n        this.expressions = this.chipExpressions;\n    }\n\n    public groupBy(expression: IGroupingExpression) {\n        this.expressions.push(expression);\n        this.expressions = [...this.expressions];\n    }\n\n    public clearGrouping(name: string) {\n        this.expressions = this.expressions.filter(item => item.fieldName !== name);\n        this.grid.sortingExpressions = this.grid.sortingExpressions.filter(item => item.fieldName !== name);\n        this.grid.notifyChanges(true);\n    }\n\n    protected override expressionsChanged() {\n        this.updateColumnsVisibility();\n    }\n\n    private updateColumnsVisibility() {\n        if (this.groupingDiffer && this.grid.columns && !this.grid.hasColumnLayouts) {\n            const changes = this.groupingDiffer.diff(this.expressions);\n            if (changes && this.grid.columns.length > 0) {\n                changes.forEachAddedItem((rec) => {\n                    const col = this.grid.getColumnByName(rec.item.fieldName);\n                    col.hidden = this.hideGroupedColumns;\n                });\n                changes.forEachRemovedItem((rec) => {\n                    const col = this.grid.getColumnByName(rec.item.fieldName);\n                    col.hidden = false;\n                });\n            }\n        }\n    }\n\n    private setColumnsVisibility(value: boolean) {\n        if (this.grid.columns.length > 0 && !this.grid.hasColumnLayouts) {\n            this.expressions.forEach((expr) => {\n                const col = this.grid.getColumnByName(expr.fieldName);\n                col.hidden = value;\n            });\n        }\n    }\n}\n\n","<igx-chips-area (reorder)=\"handleReorder($event)\" (moveEnd)=\"handleMoveEnd()\">\n    @for (expression of chipExpressions; track expression.fieldName; let last = $last) {\n        <igx-chip\n            [id]=\"expression.fieldName\"\n            [title]=\"(expression.fieldName | igxGroupByMeta:grid:grid.groupablePipeTrigger).title\"\n            [removable]=\"(expression.fieldName | igxGroupByMeta:grid:grid.groupablePipeTrigger).groupable\"\n            [draggable]=\"(expression.fieldName | igxGroupByMeta:grid:grid.groupablePipeTrigger).groupable\"\n            [disabled]=\"!(expression.fieldName | igxGroupByMeta:grid:grid.groupablePipeTrigger).groupable\"\n            (keyDown)=\"handleKeyDown($event.owner.id, $event.originalEvent)\"\n            (remove)=\"clearGrouping($event.owner.id)\"\n            (chipClick)=\"handleClick(expression.fieldName)\"\n        >\n            <span>{{ (expression.fieldName | igxGroupByMeta:grid:grid.groupablePipeTrigger).title }}</span>\n            <igx-icon\n                family=\"default\"\n                [name]=\"expression.dir === 1 ? 'sort_asc' : 'sort_desc'\"\n                igxSuffix>\n            </igx-icon>\n        </igx-chip>\n\n        <span class=\"igx-grid-grouparea__connector\">\n            <igx-icon\n                family=\"default\"\n                name=\"arrow_forward\"\n                [hidden]=\"(last && !dropAreaVisible)\">\n            </igx-icon>\n        </span>\n    }\n    <div igxGroupAreaDrop\n        class=\"igx-drop-area\"\n        [attr.gridId]=\"grid.id\"\n        [hidden]=\"!dropAreaVisible\"\n        (igxDrop)=\"onDragDrop($event)\"\n    >\n        <ng-container *ngTemplateOutlet=\"dropAreaTemplate || default\"></ng-container>\n    </div>\n</igx-chips-area>\n\n<ng-template #default>\n    <igx-icon\n        family=\"default\"\n        name=\"group_work\"\n        class=\"igx-drop-area__icon\">\n    </igx-icon>\n    <span class=\"igx-drop-area__text\">{{ dropAreaMessage }}</span>\n</ng-template>\n","import {\n    AfterContentInit,\n    AfterViewInit,\n    booleanAttribute,\n    ChangeDetectionStrategy,\n    Component,\n    ContentChild,\n    CUSTOM_ELEMENTS_SCHEMA,\n    DoCheck,\n    HostBinding,\n    inject,\n    Input,\n    OnInit,\n    TemplateRef,\n    ViewChild,\n    ViewEncapsulation,\n} from '@angular/core';\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { IgxTreeGridAPIService } from './tree-grid-api.service';\nimport { IgxGridBaseDirective, IgxGridCellMergePipe, IgxGridUnmergeActivePipe } from 'igniteui-angular/grids/grid';\nimport {\n    CellType,\n    GridSelectionMode,\n    GridType,\n    IGX_GRID_BASE,\n    IGX_GRID_SERVICE_BASE,\n    IgxColumnComponent,\n    IgxColumnMovingDropDirective,\n    IgxColumnResizingService,\n    IgxFilteringService,\n    IgxGridBodyDirective,\n    IgxGridCell,\n    IgxGridColumnResizerComponent,\n    IgxGridCRUDService,\n    IgxGridDragSelectDirective,\n    IgxGridHeaderRowComponent,\n    IgxGridNavigationService,\n    IgxGridRowClassesPipe,\n    IgxGridRowPinningPipe,\n    IgxGridRowStylesPipe,\n    IgxGridSelectionService,\n    IgxGridSummaryService,\n    IgxGridValidationService,\n    IgxHasVisibleColumnsPipe,\n    IgxRowEditTabStopDirective,\n    IgxStringReplacePipe,\n    IgxSummaryDataPipe,\n    IgxSummaryRow,\n    IgxSummaryRowComponent,\n    IgxTreeGridRow,\n    IRowDataCancelableEventArgs,\n    IRowDataEventArgs,\n    IRowToggleEventArgs,\n    RowType,\n} from 'igniteui-angular/grids/core';\nimport { first, takeUntil } from 'rxjs/operators';\nimport { IgxRowLoadingIndicatorTemplateDirective } from './tree-grid.directives';\nimport { IgxTreeGridSelectionService } from './tree-grid-selection.service';\nimport {\n    DefaultTreeGridMergeStrategy,\n    HierarchicalState,\n    HierarchicalTransaction,\n    HierarchicalTransactionService,\n    IGridMergeStrategy, IgxGridTransaction,\n    IgxHierarchicalTransactionFactory,\n    IgxOverlayOutletDirective,\n    ITreeGridRecord,\n    mergeObjects,\n    StateUpdateEvent,\n    TransactionEventOrigin,\n    TransactionType,\n    TreeGridFilteringStrategy,\n} from 'igniteui-angular/core';\nimport { IgxTreeGridSummaryPipe } from './tree-grid.summary.pipe';\nimport { IgxTreeGridFilteringPipe } from './tree-grid.filtering.pipe';\nimport {\n    IgxTreeGridAddRowPipe,\n    IgxTreeGridFlatteningPipe,\n    IgxTreeGridHierarchizingPipe,\n    IgxTreeGridNormalizeRecordsPipe,\n    IgxTreeGridPagingPipe,\n    IgxTreeGridSortingPipe,\n    IgxTreeGridTransactionPipe,\n} from './tree-grid.pipes';\nimport { IgxTreeGridRowComponent } from './tree-grid-row.component';\nimport {\n    IgxButtonDirective,\n    IgxForOfScrollSyncService,\n    IgxForOfSyncService,\n    IgxGridForOfDirective,\n    IgxRippleDirective,\n    IgxScrollInertiaDirective,\n    IgxTemplateOutletDirective,\n    IgxToggleDirective,\n} from 'igniteui-angular/directives';\nimport { IgxCircularProgressBarComponent } from 'igniteui-angular/progressbar';\nimport { IgxSnackbarComponent } from 'igniteui-angular/snackbar';\nimport { IgxIconComponent } from 'igniteui-angular/icon';\nimport { IgxTreeGridGroupByAreaComponent } from './tree-grid-group-by-area.component';\n\nlet NEXT_ID = 0;\n\n/* wcAlternateName: TreeGridBase */\n/* blazorIndirectRender\n   blazorComponent\n   omitModule\n   wcSkipComponentSuffix */\n/**\n * **Ignite UI for Angular Tree Grid** -\n * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/grid/grid)\n *\n * The Ignite UI Tree Grid displays and manipulates hierarchical data with consistent schema formatted as a table and\n * provides features such as sorting, filtering, editing, column pinning, paging, column moving and hiding.\n *\n * Example:\n * ```html\n * <igx-tree-grid [data]=\"employeeData\" primaryKey=\"employeeID\" foreignKey=\"PID\" [autoGenerate]=\"false\">\n *   <igx-column field=\"first\" header=\"First Name\"></igx-column>\n *   <igx-column field=\"last\" header=\"Last Name\"></igx-column>\n *   <igx-column field=\"role\" header=\"Role\"></igx-column>\n * </igx-tree-grid>\n * ```\n */\n@Component({\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    selector: 'igx-tree-grid',\n    templateUrl: 'tree-grid.component.html',\n    encapsulation: ViewEncapsulation.None,\n    providers: [\n        IgxGridCRUDService,\n        IgxGridValidationService,\n        IgxGridSummaryService,\n        IgxGridNavigationService,\n        { provide: IgxGridSelectionService, useClass: IgxTreeGridSelectionService },\n        { provide: IGX_GRID_SERVICE_BASE, useClass: IgxTreeGridAPIService },\n        { provide: IGX_GRID_BASE, useExisting: IgxTreeGridComponent },\n        IgxFilteringService,\n        IgxColumnResizingService,\n        IgxForOfSyncService,\n        IgxForOfScrollSyncService\n    ],\n    imports: [\n        NgClass,\n        NgStyle,\n        NgTemplateOutlet,\n        IgxGridHeaderRowComponent,\n        IgxGridBodyDirective,\n        IgxGridDragSelectDirective,\n        IgxColumnMovingDropDirective,\n        IgxGridForOfDirective,\n        IgxTemplateOutletDirective,\n        IgxTreeGridRowComponent,\n        IgxSummaryRowComponent,\n        IgxOverlayOutletDirective,\n        IgxToggleDirective,\n        IgxCircularProgressBarComponent,\n        IgxSnackbarComponent,\n        IgxButtonDirective,\n        IgxRippleDirective,\n        IgxRowEditTabStopDirective,\n        IgxIconComponent,\n        IgxGridColumnResizerComponent,\n        IgxHasVisibleColumnsPipe,\n        IgxGridRowPinningPipe,\n        IgxGridRowClassesPipe,\n        IgxGridRowStylesPipe,\n        IgxSummaryDataPipe,\n        IgxTreeGridHierarchizingPipe,\n        IgxTreeGridFlatteningPipe,\n        IgxTreeGridSortingPipe,\n        IgxTreeGridFilteringPipe,\n        IgxTreeGridPagingPipe,\n        IgxTreeGridTransactionPipe,\n        IgxTreeGridSummaryPipe,\n        IgxTreeGridNormalizeRecordsPipe,\n        IgxTreeGridAddRowPipe,\n        IgxStringReplacePipe,\n        IgxGridCellMergePipe,\n        IgxScrollInertiaDirective,\n        IgxGridUnmergeActivePipe\n    ],\n    schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class IgxTreeGridComponent extends IgxGridBaseDirective implements GridType, OnInit, AfterViewInit, DoCheck, AfterContentInit {\n    protected override _diTransactions = inject<HierarchicalTransactionService<HierarchicalTransaction, HierarchicalState>>(IgxGridTransaction, { optional: true, });\n    protected override transactionFactory = inject(IgxHierarchicalTransactionFactory);\n    /** @hidden @internal */\n    public override selectionService = inject(IgxGridSelectionService) as IgxTreeGridSelectionService;\n\n    /**\n     * Sets the child data key of the tree grid.\n     * ```html\n     * <igx-tree-grid #grid [data]=\"employeeData\" [childDataKey]=\"'employees'\" [autoGenerate]=\"true\"></igx-tree-grid>\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @Input()\n    public childDataKey!: string;\n\n    /**\n     * Sets the foreign key of the tree grid.\n     * ```html\n     * <igx-tree-grid #grid [data]=\"employeeData\" [primaryKey]=\"'employeeID'\" [foreignKey]=\"'parentID'\" [autoGenerate]=\"true\">\n     * </igx-tree-grid>\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @Input()\n    public foreignKey!: string;\n\n    /**\n     * Sets the key indicating whether a row has children.\n     * This property is only used for load on demand scenarios.\n     * ```html\n     * <igx-tree-grid #grid [data]=\"employeeData\" [primaryKey]=\"'employeeID'\" [foreignKey]=\"'parentID'\"\n     *                [loadChildrenOnDemand]=\"loadChildren\"\n     *                [hasChildrenKey]=\"'hasEmployees'\">\n     * </igx-tree-grid>\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @Input()\n    public hasChildrenKey!: string;\n\n    /**\n     * Sets whether child records should be deleted when their parent gets deleted.\n     * By default it is set to true and deletes all children along with the parent.\n     * ```html\n     * <igx-tree-grid [data]=\"employeeData\" [primaryKey]=\"'employeeID'\" [foreignKey]=\"'parentID'\" cascadeOnDelete=\"false\">\n     * </igx-tree-grid>\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @Input({ transform: booleanAttribute })\n    public cascadeOnDelete = true;\n\n    /* csSuppress */\n    /**\n     * Sets a callback for loading child rows on demand.\n     * ```html\n     * <igx-tree-grid [data]=\"employeeData\" [primaryKey]=\"'employeeID'\" [foreignKey]=\"'parentID'\" [loadChildrenOnDemand]=\"loadChildren\">\n     * </igx-tree-grid>\n     * ```\n     * ```typescript\n     * public loadChildren = (parentID: any, done: (children: any[]) => void) => {\n     *     this.dataService.getData(parentID, children => done(children));\n     * }\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @Input()\n    public loadChildrenOnDemand!: (parentID: any, done: (children: any[]) => void) => void;\n\n    /**\n     * @hidden @internal\n     */\n    @HostBinding('attr.role')\n    public role = 'treegrid';\n\n    /**\n     * Sets the value of the `id` attribute. If not provided it will be automatically generated.\n     * ```html\n     * <igx-tree-grid [id]=\"'igx-tree-grid-1'\"></igx-tree-grid>\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @HostBinding('attr.id')\n    @Input()\n    public id = `igx-tree-grid-${NEXT_ID++}`;\n\n    /**\n     * @hidden\n     * @internal\n     */\n    @ContentChild(IgxTreeGridGroupByAreaComponent, { read: IgxTreeGridGroupByAreaComponent })\n    public treeGroupArea!: IgxTreeGridGroupByAreaComponent;\n\n    /**\n     * @hidden @internal\n     */\n    @ViewChild('record_template', { read: TemplateRef, static: true })\n    protected recordTemplate!: TemplateRef<any>;\n\n    /**\n     * @hidden @internal\n     */\n    @ViewChild('summary_template', { read: TemplateRef, static: true })\n    protected summaryTemplate!: TemplateRef<any>;\n\n    /**\n     * @hidden\n     */\n    @ContentChild(IgxRowLoadingIndicatorTemplateDirective, { read: IgxRowLoadingIndicatorTemplateDirective })\n    protected rowLoadingTemplate!: IgxRowLoadingIndicatorTemplateDirective;\n\n    /**\n     * @hidden\n     */\n    public flatData!: any[] | null;\n\n    /**\n     * @hidden\n     */\n    public processedExpandedFlatData!: any[] | null;\n\n    /**\n     * Returns an array of the root level `ITreeGridRecord`s.\n     * ```typescript\n     * // gets the root record with index=2\n     * const states = this.grid.rootRecords[2];\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    public rootRecords!: ITreeGridRecord[];\n\n    /* blazorSuppress */\n    /**\n     * Returns a map of all `ITreeGridRecord`s.\n     * ```typescript\n     * // gets the record with primaryKey=2\n     * const states = this.grid.records.get(2);\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    public records: Map<any, ITreeGridRecord> = new Map<any, ITreeGridRecord>();\n\n    /**\n     * Returns an array of processed (filtered and sorted) root `ITreeGridRecord`s.\n     * ```typescript\n     * // gets the processed root record with index=2\n     * const states = this.grid.processedRootRecords[2];\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    public processedRootRecords!: ITreeGridRecord[];\n\n    /* blazorSuppress */\n    /**\n     * Returns a map of all processed (filtered and sorted) `ITreeGridRecord`s.\n     * ```typescript\n     * // gets the processed record with primaryKey=2\n     * const states = this.grid.processedRecords.get(2);\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    public processedRecords: Map<any, ITreeGridRecord> = new Map<any, ITreeGridRecord>();\n\n    /**\n     * @hidden\n     */\n    public loadingRows = new Set<any>();\n\n    protected override _filterStrategy = new TreeGridFilteringStrategy();\n    protected override _transactions!: HierarchicalTransactionService<HierarchicalTransaction, HierarchicalState>;\n    protected override _mergeStrategy: IGridMergeStrategy = new DefaultTreeGridMergeStrategy();\n    private _data: any;\n    private _rowLoadingIndicatorTemplate!: TemplateRef<void>;\n    private _expansionDepth = Infinity;\n\n    /* treatAsRef */\n    /**\n     * Gets/Sets the array of data that populates the component.\n     * ```html\n     * <igx-tree-grid [data]=\"Data\" [autoGenerate]=\"true\"></igx-tree-grid>\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @Input()\n    public get data(): any[] | null {\n        return this._data;\n    }\n\n    /* treatAsRef */\n    public set data(value: any[] | null) {\n        const oldData = this._data;\n        this._data = value || [];\n        this.summaryService.clearSummaryCache();\n        if (!this._init) {\n            this.validation.updateAll(this._data);\n        }\n        if (this.autoGenerate && this._data.length > 0 && this.shouldRecreateColumns(oldData, this._data)) {\n            this.setupColumns();\n        }\n        this.checkPrimaryKeyField();\n        this.cdr.markForCheck();\n    }\n\n    /** @hidden @internal */\n    public override get type(): GridType[\"type\"] {\n        return 'tree';\n    }\n\n    /**\n     * Get transactions service for the grid.\n     *\n     * @experimental @hidden\n     */\n    public override get transactions() {\n        if (this._diTransactions && !this.batchEditing) {\n            return this._diTransactions;\n        }\n        return this._transactions;\n    }\n\n    /**\n     * Sets the count of levels to be expanded in the tree grid. By default it is\n     * set to `Infinity` which means all levels would be expanded.\n     * ```html\n     * <igx-tree-grid #grid [data]=\"employeeData\" [childDataKey]=\"'employees'\" expansionDepth=\"1\" [autoGenerate]=\"true\"></igx-tree-grid>\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @Input()\n    public get expansionDepth(): number {\n        return this._expansionDepth;\n    }\n\n    public set expansionDepth(value: number) {\n        this._expansionDepth = value;\n        this.notifyChanges();\n    }\n\n    /**\n     * Template for the row loading indicator when load on demand is enabled.\n     * ```html\n     * <ng-template #rowLoadingTemplate>\n     *     <igx-icon>loop</igx-icon>\n     * </ng-template>\n     *\n     * <igx-tree-grid #grid [data]=\"employeeData\" [primaryKey]=\"'ID'\" [foreignKey]=\"'parentID'\"\n     *                [loadChildrenOnDemand]=\"loadChildren\"\n     *                [rowLoadingIndicatorTemplate]=\"rowLoadingTemplate\">\n     * </igx-tree-grid>\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    @Input()\n    public get rowLoadingIndicatorTemplate(): TemplateRef<void> {\n        return this._rowLoadingIndicatorTemplate;\n    }\n\n    public set rowLoadingIndicatorTemplate(value: TemplateRef<void>) {\n        this._rowLoadingIndicatorTemplate = value;\n        this.notifyChanges();\n    }\n\n    // Kind of stupid\n    // private get _gridAPI(): IgxTreeGridAPIService {\n    //     return this.gridAPI as IgxTreeGridAPIService;\n    // }\n\n    /**\n     * @hidden\n     */\n    public override ngOnInit() {\n        super.ngOnInit();\n\n        this.rowToggle.pipe(takeUntil(this.destroy$)).subscribe((args) => {\n            this.loadChildrenOnRowExpansion(args);\n        });\n\n        // TODO: cascade selection logic should be refactor to be handled in the already existing subs\n        this.rowAddedNotifier.pipe(takeUntil(this.destroy$)).subscribe(args => {\n            if (this.rowSelection === GridSelectionMode.multipleCascade) {\n                let rec = this.gridAPI.get_rec_by_id(this.primaryKey ? args.data[this.primaryKey] : args.data);\n                if (rec && rec.parent) {\n                    this.selectionService.updateCascadeSelectionOnFilterAndCRUD(\n                        new Set([rec.parent]), rec.parent.key);\n                } else {\n                    // The record is still not available\n                    // Wait for the change detection to update records through pipes\n                    requestAnimationFrame(() => {\n                        rec = this.gridAPI.get_rec_by_id(this.primaryKey ?\n                            args.data[this.primaryKey] : args.data);\n                        if (rec && rec.parent) {\n                            this.selectionService.updateCascadeSelectionOnFilterAndCRUD(\n                                new Set([rec.parent]), rec.parent.key);\n                        }\n                        this.notifyChanges();\n                    });\n                }\n            }\n        });\n\n        this.rowDeletedNotifier.pipe(takeUntil(this.destroy$)).subscribe(args => {\n            if (this.rowSelection === GridSelectionMode.multipleCascade) {\n                if (args.data) {\n                    const rec = this.gridAPI.get_rec_by_id(\n                        this.primaryKey ? args.data[this.primaryKey] : args.data);\n                    this.handleCascadeSelection(args, rec);\n                } else {\n                    // if a row has been added and before commiting the transaction deleted\n                    const leafRowsDirectParents = new Set<ITreeGridRecord>();\n                    this.records.forEach(record => {\n                        if (record && (!record.children || record.children.length === 0) && record.parent) {\n                            leafRowsDirectParents.add(record.parent);\n                        }\n                    });\n                    // Wait for the change detection to update records through pipes\n                    requestAnimationFrame(() => {\n                        this.selectionService.updateCascadeSelectionOnFilterAndCRUD(leafRowsDirectParents);\n                        this.notifyChanges();\n                    });\n                }\n            }\n        });\n\n        this.filteringDone.pipe(takeUntil(this.destroy$)).subscribe(() => {\n            if (this.rowSelection === GridSelectionMode.multipleCascade) {\n                const leafRowsDirectParents = new Set<ITreeGridRecord>();\n                this.records.forEach(record => {\n                    if (record && (!record.children || record.children.length === 0) && record.parent) {\n                        leafRowsDirectParents.add(record.parent);\n                    }\n                });\n                (this.gridAPI.grid.selectionService as IgxTreeGridSelectionService).updateCascadeSelectionOnFilterAndCRUD(leafRowsDirectParents);\n                this.notifyChanges();\n            }\n        });\n    }\n\n    /**\n     * @hidden\n     */\n    public override ngAfterViewInit() {\n        super.ngAfterViewInit();\n        // TODO: pipesExectured event\n        // run after change detection in super triggers pipes for records structure\n        if (this.rowSelection === GridSelectionMode.multipleCascade && this.selectedRows.length) {\n            const selRows = this.selectedRows;\n            this.selectionService.clearRowSelection();\n            this.selectRows(selRows, true);\n            this.cdr.detectChanges();\n        }\n    }\n\n    /**\n     * @hidden\n     */\n    public override ngAfterContentInit() {\n        if (this.rowLoadingTemplate) {\n            this._rowLoadingIndicatorTemplate = this.rowLoadingTemplate.template;\n        }\n        super.ngAfterContentInit();\n    }\n\n    public override getDefaultExpandState(record: ITreeGridRecord): boolean {\n        return !!(record.children && record.children.length && record.level! < this.expansionDepth!);\n    }\n\n    /**\n     * Expands all rows.\n     * ```typescript\n     * this.grid.expandAll();\n     * ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    public override expandAll() {\n        this._expansionDepth = Infinity;\n        this.expansionStates = new Map<any, boolean>();\n    }\n\n    /**\n     * Collapses all rows.\n     *\n     * ```typescript\n     * this.grid.collapseAll();\n     *  ```\n     *\n     * @memberof IgxTreeGridComponent\n     */\n    public override collapseAll() {\n        this._expansionDepth = 0;\n        this.expansionStates = new Map<any, boolean>();\n    }\n\n    /**\n     * @hidden\n     */\n    public override refreshGridState(args?: IRowDataEventArgs) {\n        super.refreshGridState();\n        if (this.primaryKey && this.foreignKey && args) {\n            // Invalidate the parent's summaries - the foreign key on the added/changed row points at it.\n            const rowID = (args.rowData ?? args.data)?.[this.foreignKey];\n            this.summaryService.clearSummaryCache({ rowID });\n            this.pipeTrigger++;\n            this.cdr.detectChanges();\n        }\n    }\n\n    /* blazorCSSuppress */\n    /**\n     * Creates a new tree grid row with the given data. If a parentRowID is not specified, the newly created\n     * row would be added at the root level. Otherwise, it would be added as a child of the row whose primaryKey matches\n     * the specified parentRowID. If the parentRowID does not exist, an error would be thrown.\n     * ```typescript\n     * const record = {\n     *     ID: this.grid.data[this.grid1.data.length - 1].ID + 1,\n     *     Name: this.newRecord\n     * };\n     * this.grid.addRow(record, 1); // Adds a new child row to the row with ID=1.\n     * ```\n     *\n     * @param data\n     * @param parentRowID\n     * @memberof IgxTreeGridComponent\n     */\n    // TODO: remove evt emission\n    public override addRow(data: any, parentRowID?: any) {\n        this.crudService.endEdit(true);\n        this.gridAPI.addRowToData(data, parentRowID);\n\n        this.rowAddedNotifier.next({\n            data: data,\n            rowData: data, owner: this,\n            primaryKey: data[this.primaryKey],\n            rowKey: data[this.primaryKey]\n        });\n        this.pipeTrigger++;\n        this.notifyChanges();\n    }\n\n    /**\n     * Enters add mode by spawning the UI with the context of the specified row by index.\n     *\n     * @remarks\n     * Accepted values for index are integers from 0 to this.grid.dataView.length\n     * @remarks\n     * When adding the row as a child, the parent row is the specified row.\n     * @remarks\n     * To spawn the UI on top, call the function with index = null or a negative number.\n     * In this case trying to add this row as a child will result in error.\n     * @example\n     * ```typescript\n     * this.grid.beginAddRowByIndex(10);\n     * this.grid.beginAddRowByIndex(10, true);\n     * this.grid.beginAddRowByIndex(null);\n     * ```\n     * @param index - The index to spawn the UI at. Accepts integers from 0 to this.grid.dataView.length\n     * @param asChild - Whether the record should be added as a child. Only applicable to igxTreeGrid.\n     */\n    public override beginAddRowByIndex(index: number, asChild?: boolean): void {\n        if (index === null || index < 0) {\n            return this.beginAddRowById(null, asChild);\n        }\n        return this._addRowForIndex(index - 1, asChild);\n    }\n\n    /**\n     * @hidden\n     */\n    public getContext(rowData: any, rowIndex: number, pinned?: boolean): any {\n        return {\n            $implicit: this.isGhostRecord(rowData) || this.isRecordMerged(rowData) ? rowData.recordRef : rowData,\n            index: this.getDataViewIndex(rowIndex, pinned!),\n            templateID: {\n                type: this.isSummaryRow(rowData) ? 'summaryRow' : 'dataRow',\n                id: null\n            },\n            disabled: this.isGhostRecord(rowData) ? rowData.recordRef.isFilteredOutParent === undefined : false,\n            metaData: this.isRecordMerged(rowData) ? rowData : null\n        };\n    }\n\n    /**\n     * @hidden\n     * @internal\n     */\n    public override getInitialPinnedIndex(rec: any) {\n        const id = this.gridAPI.get_row_id(rec);\n        return this._pinnedRecordIDs.indexOf(id);\n    }\n\n    /**\n     * @hidden\n     * @internal\n     */\n    public override isRecordPinned(rec: any) {\n        return this.getInitialPinnedIndex(rec.data) !== -1;\n    }\n\n    /**\n     *\n     * Returns an array of the current cell selection in the form of `[{ column.field: cell.value }, ...]`.\n     *\n     * @remarks\n     * If `formatters` is enabled, the cell value will be formatted by its respective column formatter (if any).\n     * If `headers` is enabled, it will use the column header (if any) instead of the column field.\n     */\n    public override getSelectedData(formatters = false, headers = false): any[] {\n        let source: any[] = [];\n\n        const process = (record: any) => {\n            if (record.summaries) {\n                source.push(null);\n                return;\n            }\n            source.push(record.data);\n        };\n\n        this.unpinnedDataView.forEach(process);\n        source = this.isRowPinningToTop ? [...this.pinnedDataView, ...source] : [...source, ...this.pinnedDataView];\n        return this.extractDataFromSelection(source, formatters, headers);\n    }\n\n    /**\n     * @hidden @internal\n     */\n    public override getEmptyRecordObjectFor(inTreeRow: RowType) {\n        const treeRowRec = inTreeRow?.treeRow || null;\n        const row = { ...treeRowRec };\n        const data = treeRowRec?.data || {};\n        row.data = { ...data };\n        Object.keys(row.data).forEach(key => {\n            // persist foreign key if one is set.\n            if (this.foreignKey && key === this.foreignKey) {\n                row.data[key] = treeRowRec!.data[this.crudService.addRowParent?.asChild ? this.primaryKey : key];\n            } else {\n                row.data[key] = undefined;\n            }\n        });\n        let id = this.generateRowID();\n        const rootRecPK = this.foreignKey && this.rootRecords && this.rootRecords.length > 0 ?\n            this.rootRecords[0].data[this.foreignKey] : null;\n        if (id === rootRecPK) {\n            // safeguard in case generated id matches the root foreign key.\n            id = this.generateRowID();\n        }\n        row.key = id;\n        row.data[this.primaryKey] = id;\n        return { rowID: id, data: row.data, recordRef: row };\n    }\n\n    /** @hidden */\n    public override deleteRowById(rowId: any): any {\n        //  if this is flat self-referencing data, and CascadeOnDelete is set to true\n        //  and if we have transactions we should start pending transaction. This allows\n        //  us in case of delete action to delete all child rows as single undo action\n        const args: IRowDataCancelableEventArgs = {\n            rowID: rowId,\n            primaryKey: rowId,\n            rowKey: rowId,\n            cancel: false,\n            rowData: this.getRowData(rowId),\n            data: this.getRowData(rowId),\n            oldValue: null,\n            owner: this\n        };\n        this.rowDelete.emit(args);\n        if (args.cancel) {\n            return;\n        }\n\n        const record = this.gridAPI.deleteRowById(rowId);\n        const key = record[this.primaryKey];\n        if (record !== null && record !== undefined) {\n            const rowDeletedEventArgs: IRowDataEventArgs = {\n                data: record,\n                rowData: record,\n                owner: this,\n                primaryKey: key,\n                rowKey: key\n            };\n            this.rowDeleted.emit(rowDeletedEventArgs);\n        }\n        return record;\n    }\n\n    /**\n     * Returns the tree grid row by index.\n     *\n     * @example\n     * ```typescript\n     * const myRow = treeGrid.getRowByIndex(1);\n     * ```\n     * @param index\n     */\n    public getRowByIndex(index: number): RowType {\n        if (index < 0 || index >= this.dataView.length) {\n            return undefined!;\n        }\n        return this.createRow(index);\n    }\n\n    /**\n     * Returns the `RowType` object by the specified primary key.\n     *\n     * @example\n     * ```typescript\n     * const myRow = this.treeGrid.getRowByIndex(1);\n     * ```\n     * @param index\n     */\n    public getRowByKey(key: any): RowType {\n        const rec = this.filteredSortedData ? this.primaryKey ? this.filteredSortedData.find(r => r[this.primaryKey] === key) :\n            this.filteredSortedData.find(r => r === key) : undefined;\n        const index = this.dataView.findIndex(r => r.data && r.data === rec);\n        if (index < 0 || index >= this.filteredSortedData!.length) {\n            return undefined!;\n        }\n        return new IgxTreeGridRow(this as any, index, rec);\n    }\n\n    /**\n     * Returns the collection of all RowType for current page.\n     *\n     * @hidden @internal\n     */\n    public allRows(): RowType[] {\n        return this.dataView.map((_rec, index) => this.createRow(index));\n    }\n\n    /**\n     * Returns the collection of tree grid rows for current page.\n     *\n     * @hidden @internal\n     */\n    public dataRows(): RowType[] {\n        return this.allRows().filter(row => row instanceof IgxTreeGridRow);\n    }\n\n    /**\n     * Returns an array of the selected grid cells.\n     *\n     * @example\n     * ```typescript\n     * const selectedCells = this.grid.selectedCells;\n     * ```\n     */\n    public get selectedCells(): CellType[] {\n        return this.dataRows().map((row) => row.cells!.filter((cell) => cell.selected))\n            .reduce((a, b) => a.concat(b), []);\n    }\n\n    /**\n     * Returns a `CellType` object that matches the conditions.\n     *\n     * @example\n     * ```typescript\n     * const myCell = this.grid1.getCellByColumn(2, \"UnitPrice\");\n     * ```\n     * @param rowIndex\n     * @param columnField\n     */\n    public getCellByColumn(rowIndex: number, columnField: string): CellType {\n        const row = this.getRowByIndex(rowIndex);\n        const column = this.columns.find((col) => col.field === columnField);\n        if (row && row instanceof IgxTreeGridRow && column) {\n            return new IgxGridCell(this as any, rowIndex, column);\n        }\n            return undefined!;\n    }\n\n    /**\n     * Returns a `CellType` object that matches the conditions.\n     *\n     * @remarks\n     * Requires that the primaryKey property is set.\n     * @example\n     * ```typescript\n     * grid.getCellByKey(1, 'index');\n     * ```\n     * @param rowSelector match any rowID\n     * @param columnField\n     */\n    public getCellByKey(rowSelector: any, columnField: string): CellType {\n        const row = this.getRowByKey(rowSelector);\n        const column = this.columns.find((col) => col.field === columnField);\n        if (row && column) {\n            return new IgxGridCell(this as any, row.index, column);\n        }\n            return undefined!;\n    }\n\n    public override pinRow(rowID: any, index?: number): boolean {\n        const row = this.getRowByKey(rowID);\n        return super.pinRow(rowID, index, row);\n    }\n\n    public override unpinRow(rowID: any): boolean {\n        const row = this.getRowByKey(rowID);\n        return super.unpinRow(rowID, row);\n    }\n\n    /** @hidden */\n    public generateRowPath(rowId: any): any[] {\n        const path: any[] = [];\n        let record = this.records.get(rowId);\n\n        while (record!.parent) {\n            path.push(record!.parent.key);\n            record = record!.parent;\n        }\n\n        return path.reverse();\n    }\n\n    /** @hidden */\n    public isTreeRow(record: any): boolean {\n        return record.key !== undefined && record.data;\n    }\n\n    /** @hidden */\n    public override getUnpinnedIndexById(id: any) {\n        return this.unpinnedRecords.findIndex(x => x.data[this.primaryKey] === id);\n    }\n\n    /**\n     * @hidden\n     */\n    public createRow(index: number, data?: any): RowType {\n        let row!: RowType;\n        const dataIndex = this._getDataViewIndex(index);\n        const rec: any = data ?? this.dataView[dataIndex];\n\n        if (this.isSummaryRow(rec)) {\n            row = new IgxSummaryRow(this as any, index, rec.summaries);\n        }\n\n        if (!row && rec) {\n            const isTreeRow = this.isTreeRow(rec);\n            const dataRec = isTreeRow ? rec.data : rec;\n            const treeRow = isTreeRow ? rec : undefined;\n            row = new IgxTreeGridRow(this as any, index, dataRec, treeRow);\n        }\n\n        return row;\n    }\n\n    protected override generateDataFields(data: any[]): string[] {\n        return super.generateDataFields(data).filter(field => field !== this.childDataKey);\n    }\n\n    protected override transactionStatusUpdate(event: StateUpdateEvent) {\n        let actions: any[] = [];\n        if (event.origin === TransactionEventOrigin.REDO) {\n            actions = event.actions ? event.actions.filter(x => x.transaction.type === TransactionType.DELETE) : [];\n            if (this.rowSelection === GridSelectionMode.multipleCascade) {\n                this.handleCascadeSelection(event);\n            }\n        } else if (event.origin === TransactionEventOrigin.UNDO) {\n            actions = event.actions ? event.actions.filter(x => x.transaction.type === TransactionType.ADD) : [];\n            if (this.rowSelection === GridSelectionMode.multipleCascade) {\n                if (event.actions[0].transaction.type === 'add') {\n                    const rec = this.gridAPI.get_rec_by_id(event.actions[0].transaction.id);\n                    this.handleCascadeSelection(event, rec);\n                } else {\n                    this.handleCascadeSelection(event);\n                }\n            }\n        }\n        if (actions.length) {\n            for (const action of actions) {\n                this.deselectChildren(action.transaction.id);\n            }\n        }\n        super.transactionStatusUpdate(event);\n    }\n\n    protected findRecordIndexInView(rec: any) {\n        return this.dataView.findIndex(x => x.data[this.primaryKey] === rec[this.primaryKey]);\n    }\n\n    /**\n     * @hidden @internal\n     */\n    protected override getDataBasedBodyHeight(): number {\n        return !this.flatData || (this.flatData.length < this._defaultTargetRecordNumber) ?\n            0 : this.defaultTargetBodyHeight;\n    }\n\n    /**\n     * @hidden\n     */\n    protected override scrollTo(row: any | number, column: any | number): void {\n        let delayScrolling = false;\n        let record!: ITreeGridRecord;\n\n        if (typeof (row) !== 'number') {\n            const rowData = row;\n            const rowID = this.gridAPI.get_row_id(rowData);\n            record = this.processedRecords.get(rowID)!;\n            this.gridAPI.expand_path_to_record!(record);\n\n            if (this.paginator) {\n                const rowIndex = this.processedExpandedFlatData!.indexOf(rowData);\n                const page = Math.floor(rowIndex / this.perPage);\n\n                if (this.page !== page) {\n                    delayScrolling = true;\n                    this.page = page;\n                }\n            }\n        }\n\n        if (delayScrolling) {\n            this.verticalScrollContainer.dataChanged.pipe(first()).subscribe(() => {\n                this.scrollDirective(this.verticalScrollContainer,\n                    typeof (row) === 'number' ? row : this.unpinnedDataView.indexOf(record));\n            });\n        } else {\n            this.scrollDirective(this.verticalScrollContainer,\n                typeof (row) === 'number' ? row : this.unpinnedDataView.indexOf(record));\n        }\n\n        this.scrollToHorizontally(column);\n    }\n\n    protected override writeToData(rowIndex: number, value: any) {\n        mergeObjects(this.flatData![rowIndex], value);\n    }\n\n    /**\n     * @hidden\n     */\n    protected override initColumns(collection: IgxColumnComponent[], cb: (args: any) => void = null!) {\n        if (this.hasColumnLayouts) {\n            // invalid configuration - tree grid should not allow column layouts\n            // remove column layouts\n            const nonColumnLayoutColumns = this.columns.filter((col) => !col.columnLayout && !col.columnLayoutChild);\n            this.updateColumns(nonColumnLayoutColumns);\n        }\n        super.initColumns(collection, cb);\n    }\n\n    /**\n     * @hidden @internal\n     */\n    protected override getGroupAreaHeight(): number {\n        return this.treeGroupArea ? this.getComputedHeight(this.treeGroupArea.nativeElement) : 0;\n    }\n\n    /** {@link triggerPipes} will re-create pinnedData on CRUD operations */\n    protected trackPinnedRowData(record: ITreeGridRecord) {\n        // TODO FIX: pipeline data doesn't match end interface (¬_¬ )\n        // return record.key || (record as any).rowID;\n        return record;\n    }\n\n    /**\n     * @description A recursive way to deselect all selected children of a given record\n     * @param recordID ID of the record whose children to deselect\n     * @hidden\n     * @internal\n     */\n    private deselectChildren(recordID: any): void {\n        const selectedChildren: any[] = [];\n        // G.E. Apr 28, 2021 #9465 Records which are not in view can also be selected so we need to\n        // deselect them as well, hence using 'records' map instead of getRowByKey() method which will\n        // return only row components (i.e. records in view).\n        const rowToDeselect = this.records.get(recordID);\n        this.selectionService.deselectRowsWithNoEvent([recordID]);\n        this.gridAPI.get_selected_children!(rowToDeselect!, selectedChildren);\n        if (selectedChildren.length > 0) {\n            selectedChildren.forEach(x => this.deselectChildren(x));\n        }\n    }\n\n    private addChildRows(children: any[], parentID: any) {\n        if (this.primaryKey && this.foreignKey) {\n            for (const child of children) {\n                child[this.foreignKey] = parentID;\n            }\n            this.data!.push(...children);\n        } else if (this.childDataKey) {\n            let parent = this.records.get(parentID);\n            let parentData = parent!.data;\n\n            if (this.transactions.enabled && this.transactions.getAggregatedChanges(true).length) {\n                const path = [];\n                while (parent) {\n                    path.push(parent.key);\n                    parent = parent.parent;\n                }\n\n                let collection = this.data;\n                let record: any;\n                for (let i = path.length - 1; i >= 0; i--) {\n                    const pid = path[i];\n                    record = collection!.find(r => r[this.primaryKey] === pid);\n\n                    if (!record) {\n                        break;\n                    }\n                    collection = record[this.childDataKey];\n                }\n                if (record) {\n                    parentData = record;\n                }\n            }\n\n            parentData[this.childDataKey] = children;\n        }\n        this.selectionService.clearHeaderCBState();\n        this.pipeTrigger++;\n        if (this.rowSelection === GridSelectionMode.multipleCascade) {\n            // Force pipe triggering for building the data structure\n            this.cdr.detectChanges();\n            if (this.selectionService.isRowSelected(parentID)) {\n                this.selectionService.rowSelection.delete(parentID);\n                this.selectionService.selectRowsWithNoEvent([parentID]);\n            }\n        }\n    }\n\n    private loadChildrenOnRowExpansion(args: IRowToggleEventArgs) {\n        if (this.loadChildrenOnDemand) {\n            const parentID = args.rowID;\n\n            if (args.expanded && !this._expansionStates.has(parentID)) {\n                this.loadingRows.add(parentID);\n\n                this.loadChildrenOnDemand(parentID, children => {\n                    this.loadingRows.delete(parentID);\n                    this.addChildRows(children, parentID);\n                    this.notifyChanges();\n                });\n            }\n        }\n    }\n\n    private handleCascadeSelection(event: IRowDataEventArgs | StateUpdateEvent, rec: ITreeGridRecord = null!) {\n        // Wait for the change detection to update records through the pipes\n        requestAnimationFrame(() => {\n            if (rec === null) {\n                rec = this.gridAPI.get_rec_by_id((event as StateUpdateEvent).actions[0].transaction.id);\n            }\n            if (rec && rec.parent) {\n                (this.gridAPI.grid.selectionService as IgxTreeGridSelectionService).updateCascadeSelectionOnFilterAndCRUD(\n                    new Set([rec.parent]), rec.parent.key\n                );\n                this.notifyChanges();\n            }\n        });\n    }\n}\n","<ng-content select=\"igx-grid-toolbar,igc-grid-toolbar\"></ng-content>\n<ng-content\n  select=\"igx-tree-grid-group-by-area,igc-tree-grid-group-by-area\"\n></ng-content>\n<igx-grid-header-row\n  class=\"igx-grid-thead\"\n  tabindex=\"0\"\n  [grid]=\"this\"\n  [hasMRL]=\"hasColumnLayouts\"\n  [width]=\"calcWidth\"\n  [pinnedStartColumnCollection]=\"pinnedStartColumns\"\n  [pinnedEndColumnCollection]=\"pinnedEndColumns\"\n  [unpinnedColumnCollection]=\"unpinnedColumns\"\n  (keydown.meta.c)=\"copyHandler($any($event))\"\n  (keydown.control.c)=\"copyHandler($any($event))\"\n  (copy)=\"copyHandler($event)\"\n  (keydown)=\"navigation.headerNavigation($event)\"\n  (focus)=\"navigation.focusFirstCell()\"\n>\n</igx-grid-header-row>\n\n<div\n  igxGridBody\n  (keydown.control.c)=\"copyHandler($any($event))\"\n  (copy)=\"copyHandler($event)\"\n  class=\"igx-grid__tbody\"\n  role=\"presentation\"\n>\n  <div\n    class=\"igx-grid__tbody-content\"\n    tabindex=\"0\"\n    (focus)=\"navigation.focusTbody($event)\"\n    (keydown)=\"navigation.handleNavigation($event)\"\n    (dragStop)=\"selectionService.dragMode = $event\"\n    [attr.aria-activedescendant]=\"activeDescendant\"\n    [attr.role]=\"dataView.length ? 'rowgroup' : 'row'\"\n    (dragScroll)=\"dragScroll($event)\"\n    [igxGridDragSelect]=\"selectionService.dragMode\"\n    [style.height.px]=\"totalHeight\"\n    [style.width.px]=\"totalCalcWidth\"\n    [style.width]=\"!platform.isBrowser ? '100%' : undefined\"\n    #tbody\n    (scroll)=\"preventContainerScroll($event)\"\n  >\n    @if (moving && columnInDrag && pinnedColumns.length <= 0) {\n      <span\n        [igxColumnMovingDrop]=\"headerContainer\"\n        [attr.droppable]=\"true\"\n        id=\"left\"\n        class=\"igx-grid__scroll-on-drag-left\"\n      ></span>\n    }\n    @if (moving && columnInDrag && pinnedColumns.length > 0) {\n      <span\n        [igxColumnMovingDrop]=\"headerContainer\"\n        [attr.droppable]=\"true\"\n        id=\"left\"\n        class=\"igx-grid__scroll-on-drag-pinned\"\n        [style.left.px]=\"pinnedStartWidth\"\n      ></span>\n    }\n\n    @if (mergedDataInView && mergedDataInView.length > 0) {\n      <div\n        igxScrollInertia\n        [IgxScrollInertiaScrollContainer]=\"\n          this.verticalScrollContainer.dc.instance.scrollContainer\n        \"\n        [IgxScrollInertiaDirection]=\"\n          this.verticalScrollContainer.dc.instance.scrollDirection\n        \"\n      >\n        @for (rowData of mergedDataInView; track rowData.record) {\n          <igx-tree-grid-row\n            class=\"igx-grid__tr--merged-top\"\n            [gridID]=\"id\"\n            [index]=\"rowData.index\"\n            [treeRow]=\"rowData.record.recordRef\"\n            [metaData]=\"rowData.record\"\n            [style.top.px]=\"getMergeCellOffset(rowData)\"\n            [ngClass]=\"\n              rowClasses\n                | igxGridRowClasses\n                  : row\n                  : row.inEditMode\n                  : row.selected\n                  : row.dirty\n                  : row.deleted\n                  : row.dragging\n                  : rowData.index\n                  : hasColumnLayouts\n                  : hasCellsToMerge\n                  : row.treeRow.isFilteredOutParent!\n                  : rowData\n                  : pipeTrigger\n            \"\n            [ngStyle]=\"\n              rowStyles\n                | igxGridRowStyles: rowData : rowData.index : pipeTrigger\n            \"\n            #row\n          >\n          </igx-tree-grid-row>\n        }\n      </div>\n    }\n\n    <ng-template #pinnedRecordsTemplate>\n      @if (\n        data!\n          | treeGridTransaction: pipeTrigger\n          | visibleColumns: hasVisibleColumns\n          | treeGridNormalizeRecord: pipeTrigger\n          | treeGridAddRow: true : pipeTrigger\n          | gridRowPinning: id : true : pipeTrigger\n          | treeGridFiltering\n            : filteringExpressionsTree\n            : filterStrategy\n            : advancedFilteringExpressionsTree\n            : pipeTrigger\n            : filteringPipeTrigger\n            : true\n          | treeGridSorting\n            : sortingExpressions\n            : $safeNavigationMigration(treeGroupArea?.expressions)\n            : sortStrategy\n            : pipeTrigger\n            : true\n          | gridCellMerge\n            : columnsToMerge\n            : cellMergeMode\n            : mergeStrategy\n            : pipeTrigger\n          | gridUnmergeActive\n            : columnsToMerge\n            : activeRowIndexes\n            : true\n            : pipeTrigger;\n        as pinnedData\n      ) {\n        @if (pinnedData.length > 0) {\n          <div\n            #pinContainer\n            [ngClass]=\"{\n              'igx-grid__tr--pinned-bottom': !isRowPinningToTop,\n              'igx-grid__tr--pinned-top': isRowPinningToTop,\n            }\"\n            class=\"igx-grid__tr--pinned\"\n            [style.width.px]=\"calcWidth\"\n          >\n            @for (\n              rowData of pinnedData;\n              track trackPinnedRowData(rowData);\n              let rowIndex = $index\n            ) {\n              <ng-container\n                *ngTemplateOutlet=\"\n                  pinned_record_template;\n                  context: getContext(rowData, rowIndex, true)\n                \"\n              >\n              </ng-container>\n            }\n          </div>\n        }\n      }\n    </ng-template>\n    <ng-container\n      *ngTemplateOutlet=\"\n        hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null\n      \"\n    ></ng-container>\n    <ng-template\n      igxGridFor\n      let-rowData\n      [igxGridForOf]=\"\n        renderData!\n          | treeGridTransaction: pipeTrigger\n          | visibleColumns: hasVisibleColumns\n          | treeGridHierarchizing\n            : primaryKey\n            : foreignKey\n            : childDataKey\n            : pipeTrigger\n          | treeGridFiltering\n            : filteringExpressionsTree\n            : filterStrategy\n            : advancedFilteringExpressionsTree\n            : pipeTrigger\n            : filteringPipeTrigger\n          | treeGridSorting\n            : sortingExpressions\n            : $safeNavigationMigration(treeGroupArea?.expressions)\n            : sortStrategy\n            : pipeTrigger\n          | treeGridFlattening: expansionDepth : expansionStates : pipeTrigger\n          | treeGridPaging: !!paginator : page : perPage : pipeTrigger\n          | treeGridSummary\n            : hasSummarizedColumns\n            : summaryCalculationMode\n            : summaryPosition\n            : showSummaryOnCollapse\n            : pipeTrigger\n            : summaryPipeTrigger\n          | treeGridAddRow: false : pipeTrigger\n          | gridRowPinning: id : false : pipeTrigger\n          | gridCellMerge\n            : columnsToMerge\n            : cellMergeMode\n            : mergeStrategy\n            : pipeTrigger\n          | gridUnmergeActive\n            : columnsToMerge\n            : activeRowIndexes\n            : false\n            : pipeTrigger\n      \"\n      let-rowIndex=\"index\"\n      [igxForScrollOrientation]=\"'vertical'\"\n      [igxForScrollContainer]=\"verticalScroll\"\n      [igxForContainerSize]=\"calcHeight\"\n      [igxForItemSize]=\"renderedRowHeight\"\n      #verticalScrollContainer\n      (dataChanging)=\"dataRebinding($event)\"\n      (dataChanged)=\"dataRebound($event)\"\n    >\n      <div [attr.data-index]=\"rowIndex\">\n        <ng-template\n          [igxTemplateOutlet]=\"\n            isSummaryRow(rowData) ? summary_template : record_template\n          \"\n          [igxTemplateOutletContext]=\"getContext(rowData, rowIndex, false)\"\n          (beforeViewDetach)=\"viewDetachHandler($event)\"\n          (cachedViewLoaded)=\"cachedViewLoaded($event)\"\n        >\n        </ng-template>\n      </div>\n    </ng-template>\n    <ng-container\n      *ngTemplateOutlet=\"\n        hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null\n      \"\n    ></ng-container>\n    <ng-template\n      #record_template\n      let-rowIndex=\"index\"\n      let-disabledRow=\"disabled\"\n      let-rowData\n      let-metaData=\"metaData\"\n    >\n      <igx-tree-grid-row\n        [gridID]=\"id\"\n        [index]=\"rowIndex\"\n        [treeRow]=\"rowData\"\n        [disabled]=\"disabledRow\"\n        [metaData]=\"metaData\"\n        [ngClass]=\"\n          rowClasses\n            | igxGridRowClasses\n              : row\n              : row.inEditMode\n              : row.selected\n              : row.dirty\n              : row.deleted\n              : row.dragging\n              : rowIndex\n              : hasColumnLayouts\n              : hasCellsToMerge\n              : row.treeRow.isFilteredOutParent!\n              : rowData\n              : pipeTrigger\n        \"\n        [ngStyle]=\"\n          rowStyles | igxGridRowStyles: rowData : rowIndex : pipeTrigger\n        \"\n        #row\n      >\n      </igx-tree-grid-row>\n    </ng-template>\n    <ng-template\n      #pinned_record_template\n      let-rowIndex=\"index\"\n      let-rowData\n      let-metaData=\"metaData\"\n    >\n      <igx-tree-grid-row\n        [gridID]=\"id\"\n        [index]=\"rowIndex\"\n        [treeRow]=\"rowData\"\n        [metaData]=\"metaData\"\n        [ngClass]=\"\n          rowClasses\n            | igxGridRowClasses\n              : row\n              : row.inEditMode\n              : row.selected\n              : row.dirty\n              : row.deleted\n              : row.dragging\n              : rowIndex\n              : hasColumnLayouts\n              : hasCellsToMerge\n              : row.treeRow.isFilteredOutParent!\n              : rowData\n              : pipeTrigger\n        \"\n        [ngStyle]=\"\n          rowStyles | igxGridRowStyles: rowData : rowIndex : pipeTrigger\n        \"\n        #row\n        #pinnedRow\n      >\n      </igx-tree-grid-row>\n    </ng-template>\n    <ng-template #summary_template let-rowIndex=\"index\" let-rowData>\n      <igx-grid-summary-row\n        [gridID]=\"id\"\n        [summaries]=\"rowData.summaries\"\n        [firstCellIndentation]=\"rowData.cellIndentation\"\n        [index]=\"rowIndex\"\n        class=\"igx-grid__summaries--body\"\n        role=\"row\"\n        #summaryRow\n      >\n      </igx-grid-summary-row>\n    </ng-template>\n    <ng-container\n      *ngTemplateOutlet=\"template; context: { $implicit: this }\"\n    ></ng-container>\n    <ng-container #bodyViewContainerRef></ng-container>\n    <igc-trial-watermark></igc-trial-watermark>\n  </div>\n  <div igxToggle #loadingOverlay>\n    @if (shouldOverlayLoading) {\n      <igx-circular-bar [indeterminate]=\"true\"></igx-circular-bar>\n    }\n  </div>\n  @if (moving && columnInDrag) {\n    <span\n      [igxColumnMovingDrop]=\"headerContainer\"\n      [attr.droppable]=\"true\"\n      id=\"right\"\n      class=\"igx-grid__scroll-on-drag-right\"\n    ></span>\n  }\n  <div\n    [hidden]=\"!hasVerticalScroll()\"\n    class=\"igx-grid__tbody-scrollbar\"\n    [style.width.px]=\"scrollSize\"\n    (pointerdown)=\"$event.preventDefault()\"\n    [style.height.px]=\"calcHeight\"\n  >\n    <div\n      class=\"igx-grid__tbody-scrollbar-start\"\n      [style.height.px]=\"isRowPinningToTop ? pinnedRowHeight : 0\"\n    ></div>\n    <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]=\"calcHeight\">\n      <ng-template\n        igxGridFor\n        [igxGridForOf]=\"[]\"\n        #verticalScrollHolder\n      ></ng-template>\n    </div>\n    <div\n      class=\"igx-grid__tbody-scrollbar-end\"\n      [style.height.px]=\"!isRowPinningToTop ? pinnedRowHeight : 0\"\n    ></div>\n  </div>\n  <div class=\"igx-grid__addrow-snackbar\">\n    <igx-snackbar\n      #addRowSnackbar\n      [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\"\n      [displayTime]=\"snackbarDisplayTime\"\n      >{{ resourceStrings.igx_grid_snackbar_addrow_label }}</igx-snackbar\n    >\n  </div>\n</div>\n\n<div\n  class=\"igx-grid__tfoot\"\n  role=\"presentation\"\n  [style.height.px]=\"summaryRowHeight\"\n  #tfoot\n>\n  <div\n    tabindex=\"0\"\n    role=\"rowgroup\"\n    (focus)=\"navigation.focusFirstCell(false)\"\n    (keydown)=\"navigation.summaryNav($event)\"\n    [attr.aria-activedescendant]=\"activeDescendant\"\n  >\n    @if (hasSummarizedColumns && rootSummariesEnabled) {\n      <igx-grid-summary-row\n        [style.width.px]=\"calcWidth\"\n        [style.height.px]=\"summaryRowHeight\"\n        [gridID]=\"id\"\n        role=\"row\"\n        [summaries]=\"\n          id | igxGridSummaryDataPipe: summaryService.retriggerRootPipe\n        \"\n        [index]=\"dataView.length\"\n        class=\"igx-grid__summaries\"\n        #summaryRow\n      >\n      </igx-grid-summary-row>\n    }\n    <div\n      class=\"igx-grid__tfoot-thumb\"\n      [hidden]=\"!hasVerticalScroll()\"\n      [style.height.px]=\"summaryRowHeight\"\n      [style.width.px]=\"scrollSize\"\n    ></div>\n  </div>\n</div>\n\n<div\n  class=\"igx-grid__scroll\"\n  role=\"presentation\"\n  [style.height.px]=\"scrollSize\"\n  #scr\n  [hidden]=\"isHorizontalScrollHidden\"\n  (pointerdown)=\"$event.preventDefault()\"\n>\n  <div\n    class=\"igx-grid__scroll-start\"\n    [class.igx-grid__scroll-start--pinned]=\"pinnedStartColumns.length > 0\"\n    [class.igx-grid__scroll-start--column-selection]=\"columnSelection !== 'none'\"\n    [style.width.px]=\"pinnedStartWidth\"\n    [style.min-width.px]=\"pinnedStartWidth\"\n  ></div>\n  <div class=\"igx-grid__scroll-main\" [style.width.px]=\"unpinnedWidth\">\n    <ng-template igxGridFor [igxGridForOf]=\"[]\" #scrollContainer> </ng-template>\n  </div>\n  <div\n    class=\"igx-grid__scroll-end\"\n    [style.width.px]=\"pinnedEndWidth\"\n    [style.min-width.px]=\"pinnedEndWidth\"\n    [hidden]=\"pinnedEndWidth === 0\"\n  ></div>\n</div>\n\n<div class=\"igx-grid__footer\" role=\"presentation\" #footer>\n  <ng-content select=\"igx-grid-footer,igc-grid-footer\"></ng-content>\n  <ng-content select=\"igx-paginator,igc-paginator\"></ng-content>\n</div>\n\n<ng-template #emptyFilteredGrid>\n  <span class=\"igx-grid__tbody-message\" role=\"cell\">\n    <span>{{ emptyFilteredGridMessage }}</span>\n    @if (showAddButton) {\n      <span>\n        <ng-container\n          *ngTemplateOutlet=\"addRowEmptyTemplate || defaultAddRowEmptyTemplate\"\n        ></ng-container>\n      </span>\n    }\n  </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n  <span class=\"igx-grid__tbody-message\" role=\"cell\">\n    <span>{{ emptyGridMessage }}</span>\n    @if (showAddButton) {\n      <span>\n        <ng-container\n          *ngTemplateOutlet=\"addRowEmptyTemplate || defaultAddRowEmptyTemplate\"\n        ></ng-container>\n      </span>\n    }\n  </span>\n</ng-template>\n\n<ng-template #defaultAddRowEmptyTemplate>\n  <button\n    type=\"button\"\n    igxButton=\"contained\"\n    igxRipple\n    (click)=\"this.crudService.enterAddRowMode(null, false, $event)\"\n  >\n    {{ resourceStrings.igx_grid_add_row_label }}\n  </button>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n  <div class=\"igx-grid__loading\">\n    <igx-circular-bar [indeterminate]=\"true\"> </igx-circular-bar>\n  </div>\n</ng-template>\n\n@if (rowEditable) {\n  <div igxToggle #rowEditingOverlay>\n    <div [className]=\"bannerClass\">\n      <ng-container\n        *ngTemplateOutlet=\"\n          rowEditContainer;\n          context: {\n            rowChangesCount: rowChangesCount,\n            endEdit: this.crudService.endEdit.bind(this),\n            $implicit: $any(this)\n          }\n        \"\n      >\n      </ng-container>\n    </div>\n  </div>\n}\n\n<ng-template #defaultRowEditText>\n  {{\n    this.resourceStrings.igx_grid_row_edit_text!\n      | igxStringReplace: '{0}' : rowChangesCount.toString()\n      | igxStringReplace: '{1}' : hiddenColumnsCount.toString()\n  }}\n</ng-template>\n\n<ng-template #defaultRowEditActions>\n  <button\n    type=\"button\"\n    igxButton\n    igxRowEditTabStop\n    (click)=\"this.endRowEditTabStop(false, $event)\"\n  >\n    {{ this.resourceStrings.igx_grid_row_edit_btn_cancel }}\n  </button>\n  <button\n    type=\"button\"\n    igxButton\n    igxRowEditTabStop\n    (click)=\"this.endRowEditTabStop(true, $event)\"\n  >\n    {{ this.resourceStrings.igx_grid_row_edit_btn_done }}\n  </button>\n</ng-template>\n\n<ng-template #defaultRowEditTemplate>\n  <div class=\"igx-banner__message\">\n    <span class=\"igx-banner__text\">\n      <ng-container\n        *ngTemplateOutlet=\"\n          this.crudService.row?.isAddRow\n            ? rowAddTextTemplate\n            : rowEditTextTemplate\n              ? rowEditTextTemplate\n              : defaultRowEditText;\n          context: {\n            $implicit: !this.crudService.row?.isAddRow ? rowChangesCount : null,\n          }\n        \"\n      >\n      </ng-container>\n    </span>\n  </div>\n  <div class=\"igx-banner__actions\">\n    <div class=\"igx-banner__row\">\n      <ng-container\n        *ngTemplateOutlet=\"\n          rowEditActionsTemplate\n            ? rowEditActionsTemplate\n            : defaultRowEditActions;\n          context: { $implicit: this.endEdit.bind(this) }\n        \"\n      >\n      </ng-container>\n    </div>\n  </div>\n</ng-template>\n\n<ng-template #dragIndicatorIconBase>\n  <igx-icon family=\"default\" name=\"drag_indicator\"></igx-icon>\n</ng-template>\n\n@if (colResizingService.showResizer) {\n  <igx-grid-column-resizer></igx-grid-column-resizer>\n}\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n@if (platform.isElements) {\n  <div #sink style=\"display: none\"></div>\n  <ng-content select=\"igx-grid-state,igc-grid-state\"></ng-content>\n  <ng-content\n    select=\"igx-column,igc-column,igx-column-group,igc-column-group,igx-action-strip,igc-action-strip\"\n  ></ng-content>\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { GridType } from 'igniteui-angular/grids/core';\nimport { GridColumnDataType, IGroupingExpression, IgxSorting, ITreeGridRecord } from 'igniteui-angular/core';\n\nconst HIDDEN_FIELD_NAME = '_Igx_Hidden_Data_';\n\n/**\n * @hidden\n * @internal\n */\nclass GroupByRecord {\n    public key!: string;\n    public value: any;\n    public groups!: GroupByRecord[];\n    public records!: any[];\n}\n\nexport class ITreeGridAggregation {\n    public field!: string;\n    public aggregate!: (parent: ITreeGridRecord, children: any[]) => any;\n}\n\nexport class IgxGroupedTreeGridSorting extends IgxSorting {\n    private static _instance: IgxGroupedTreeGridSorting = null!;\n\n    public static instance() {\n        return this._instance || (this._instance = new IgxGroupedTreeGridSorting());\n    }\n\n    protected override getFieldValue(obj: any, key: string, isDate = false, isTime = false): any {\n        const data = obj.data[HIDDEN_FIELD_NAME] ?\n            obj.data.hasOwnProperty(key) ?\n                obj.data :\n                obj.data[HIDDEN_FIELD_NAME] :\n            obj.data;\n\n        return super.getFieldValue(data, key, isDate, isTime);\n    }\n}\n\n/** @hidden */\n@Pipe({\n    name: 'treeGridGrouping',\n    standalone: true\n})\nexport class IgxTreeGridGroupingPipe implements PipeTransform {\n    private grid!: GridType;\n\n    public transform(collection: any[],\n                     groupingExpressions: IGroupingExpression[],\n                     groupKey: string,\n                     childDataKey: string,\n                     grid: GridType,\n                     aggregations?: ITreeGridAggregation[]\n                    ): any[] {\n        if (groupingExpressions.length === 0) {\n            return collection;\n        }\n\n        if (groupKey?.toLowerCase() === childDataKey?.toLowerCase()) {\n            throw new Error('Group key and child data key cannot be the same.');\n        }\n\n        this.grid = grid;\n\n        const result: any[] = [];\n        const groupedRecords = this.groupByMultiple(collection, groupingExpressions);\n        this.flattenGrouping(groupedRecords, groupKey,\n            childDataKey, result, aggregations);\n\n        return result;\n    }\n\n    private flattenGrouping(groupRecords: GroupByRecord[],\n                            groupKey: string,\n                            childDataKey: string,\n                            data: any[],\n                            aggregations: ITreeGridAggregation[] = []) {\n        for (const groupRecord of groupRecords) {\n            const parent: ITreeGridRecord = {} as any;\n            const children = groupRecord.records;\n\n            (parent as any)[childDataKey] = [];\n\n            for (const aggregation of aggregations) {\n                (parent as any)[aggregation.field] = aggregation.aggregate(parent, children);\n            }\n\n            (parent as any)[groupKey] = groupRecord.value + ` (${groupRecord.records.length})`;\n            (parent as any)[HIDDEN_FIELD_NAME] = { [groupRecord.key]: groupRecord.value };\n            data.push(parent);\n\n            if (groupRecord.groups) {\n                this.flattenGrouping(groupRecord.groups, groupKey, childDataKey,\n                    (parent as any)[childDataKey], aggregations);\n            } else {\n                (parent as any)[childDataKey] = children;\n            }\n        }\n    }\n\n    private groupByMultiple(array: any[], groupingExpressions: IGroupingExpression[], index = 0): GroupByRecord[] {\n        const res = this.groupBy(array, groupingExpressions[index]);\n\n        if (index + 1 < groupingExpressions.length) {\n           for (const groupByRecord of res) {\n                groupByRecord.groups = this.groupByMultiple(groupByRecord.records, groupingExpressions, index + 1);\n            }\n        }\n\n        return res;\n    }\n\n    private groupBy(array: any[], groupingExpression: IGroupingExpression): GroupByRecord[] {\n        const key = groupingExpression.fieldName;\n        const column = this.grid?.getColumnByName(key);\n        const isDateTime = column?.dataType === GridColumnDataType.Date ||\n            column?.dataType === GridColumnDataType.DateTime ||\n            column?.dataType === GridColumnDataType.Time;\n        const map: Map<any, GroupByRecord> = new Map<any, GroupByRecord>();\n        for (const record of array) {\n            const value = isDateTime\n                ? this.grid.i18nFormatter.formatDate(record[key], column.pipeArgs.format, this.grid.locale)\n                : record[key];\n\n            let valueCase = value;\n            let groupByRecord: GroupByRecord;\n\n            if (groupingExpression.ignoreCase) {\n                valueCase = value?.toString().toLowerCase();\n            }\n            if (map.has(valueCase)) {\n                groupByRecord = map.get(valueCase)!;\n            } else {\n                groupByRecord = new GroupByRecord();\n                groupByRecord.key = key;\n                groupByRecord.value = value;\n                groupByRecord.records = [];\n                map.set(valueCase, groupByRecord);\n            }\n\n            groupByRecord.records.push(record);\n        }\n\n        return Array.from(map.values());\n    }\n}\n","import { NgModule } from '@angular/core';\nimport { IgxTreeGridComponent } from './tree-grid.component';\nimport { IgxTreeGridGroupByAreaComponent } from './tree-grid-group-by-area.component';\nimport { IgxTreeGridGroupingPipe } from './tree-grid.grouping.pipe';\n\n/* Imports that cannot be resolved from IGX_GRID_COMMON_DIRECTIVES spread\n    NOTE: Do not remove! Issue: https://github.com/IgniteUI/igniteui-angular/issues/13310\n*/\nimport {\n    IgxRowDirective,\n    IgxRowEditTextDirective,\n    IgxRowAddTextDirective,\n    IgxRowEditActionsDirective,\n    IgxRowEditTabStopDirective,\n    IgxGridFooterComponent,\n    IgxAdvancedFilteringDialogComponent,\n    IgxHeaderCollapsedIndicatorDirective,\n    IgxHeaderExpandedIndicatorDirective,\n    IgxRowCollapsedIndicatorDirective,\n    IgxRowExpandedIndicatorDirective,\n    IgxSortAscendingHeaderIconDirective,\n    IgxSortDescendingHeaderIconDirective,\n    IgxSortHeaderIconDirective,\n    IgxExcelStyleHeaderIconDirective,\n    IgxDragIndicatorIconDirective,\n    IgxRowDragGhostDirective,\n    IgxGridStateDirective,\n    IgxGridHeaderComponent,\n    IgxGridHeaderGroupComponent,\n    IgxGridHeaderRowComponent,\n    IgxFilterCellTemplateDirective,\n    IgxSummaryTemplateDirective,\n    IgxCellTemplateDirective,\n    IgxCellValidationErrorDirective,\n    IgxCellHeaderTemplateDirective,\n    IgxCellFooterTemplateDirective,\n    IgxCellEditorTemplateDirective,\n    IgxCollapsibleIndicatorTemplateDirective,\n    IgxColumnComponent,\n    IgxColumnGroupComponent,\n    IgxColumnLayoutComponent,\n    IgxColumnRequiredValidatorDirective,\n    IgxColumnMinValidatorDirective,\n    IgxColumnMaxValidatorDirective,\n    IgxColumnEmailValidatorDirective,\n    IgxColumnMinLengthValidatorDirective,\n    IgxColumnMaxLengthValidatorDirective,\n    IgxColumnPatternValidatorDirective,\n    IgxColumnActionsComponent,\n    IgxColumnHidingDirective,\n    IgxColumnPinningDirective,\n    IgxRowSelectorDirective,\n    IgxGroupByRowSelectorDirective,\n    IgxHeadSelectorDirective,\n    IgxCSVTextDirective,\n    IgxExcelTextDirective,\n    IgxGridToolbarActionsComponent,\n    IgxGridToolbarAdvancedFilteringComponent,\n    IgxGridToolbarComponent,\n    IgxGridToolbarExporterComponent,\n    IgxGridToolbarHidingComponent,\n    IgxGridToolbarPinningComponent,\n    IgxGridToolbarTitleComponent,\n    IgxGridToolbarDirective,\n    IgxGridExcelStyleFilteringComponent,\n    IgxExcelStyleHeaderComponent,\n    IgxExcelStyleSortingComponent,\n    IgxExcelStylePinningComponent,\n    IgxExcelStyleHidingComponent,\n    IgxExcelStyleSelectingComponent,\n    IgxExcelStyleClearFiltersComponent,\n    IgxExcelStyleConditionalFilterComponent,\n    IgxExcelStyleMovingComponent,\n    IgxExcelStyleSearchComponent,\n    IgxExcelStyleColumnOperationsTemplateDirective,\n    IgxExcelStyleFilterOperationsTemplateDirective,\n    IgxExcelStyleLoadingValuesTemplateDirective,\n    IgxGridActionButtonComponent,\n    IgxGridActionsBaseDirective,\n    IgxGridEditingActionsComponent,\n    IgxGridPinningActionsComponent\n} from \"igniteui-angular/grids/core\";\nimport {\n    IgxPaginatorComponent,\n    IgxPageNavigationComponent,\n    IgxPageSizeSelectorComponent,\n    IgxPaginatorContentDirective,\n    IgxPaginatorDirective\n} from 'igniteui-angular/paginator';\n\n/* NOTE: Tree grid directives collection for ease-of-use import in standalone components scenario */\nexport const IGX_TREE_GRID_DIRECTIVES = [\n    IgxTreeGridComponent,\n    IgxTreeGridGroupByAreaComponent,\n    IgxTreeGridGroupingPipe,\n    IgxRowAddTextDirective,\n    IgxRowEditActionsDirective,\n    IgxRowEditTextDirective,\n    IgxRowEditTabStopDirective,\n    // IGX_GRID_COMMON_DIRECTIVES:\n    IgxRowDirective,\n    IgxGridFooterComponent,\n    IgxAdvancedFilteringDialogComponent,\n    IgxRowExpandedIndicatorDirective,\n    IgxRowCollapsedIndicatorDirective,\n    IgxHeaderExpandedIndicatorDirective,\n    IgxHeaderCollapsedIndicatorDirective,\n    IgxExcelStyleHeaderIconDirective,\n    IgxSortAscendingHeaderIconDirective,\n    IgxSortDescendingHeaderIconDirective,\n    IgxSortHeaderIconDirective,\n    IgxDragIndicatorIconDirective,\n    IgxRowDragGhostDirective,\n    IgxGridStateDirective,\n    // IGX_GRID_ACTIONS\n    IgxGridPinningActionsComponent,\n    IgxGridEditingActionsComponent,\n    IgxGridActionsBaseDirective,\n    IgxGridActionButtonComponent,\n    // IGX_GRID_HEADERS_DIRECTIVES:\n    IgxGridHeaderComponent,\n    IgxGridHeaderGroupComponent,\n    IgxGridHeaderRowComponent,\n    // IGX_GRID_COLUMN_DIRECTIVES:\n    IgxFilterCellTemplateDirective,\n    IgxSummaryTemplateDirective,\n    IgxCellTemplateDirective,\n    IgxCellValidationErrorDirective,\n    IgxCellHeaderTemplateDirective,\n    IgxCellFooterTemplateDirective,\n    IgxCellEditorTemplateDirective,\n    IgxCollapsibleIndicatorTemplateDirective,\n    IgxColumnComponent,\n    IgxColumnGroupComponent,\n    IgxColumnLayoutComponent,\n    // IGX_GRID_COLUMN_ACTIONS_DIRECTIVES:\n    IgxColumnActionsComponent,\n    IgxColumnHidingDirective,\n    IgxColumnPinningDirective,\n    // IGX_GRID_SELECTION_DIRECTIVES:\n    IgxRowSelectorDirective,\n    IgxGroupByRowSelectorDirective,\n    IgxHeadSelectorDirective,\n    // IGX_GRID_TOOLBAR_DIRECTIVES:\n    IgxCSVTextDirective,\n    IgxExcelTextDirective,\n    IgxGridToolbarActionsComponent,\n    IgxGridToolbarAdvancedFilteringComponent,\n    IgxGridToolbarComponent,\n    IgxGridToolbarExporterComponent,\n    IgxGridToolbarHidingComponent,\n    IgxGridToolbarPinningComponent,\n    IgxGridToolbarTitleComponent,\n    IgxGridToolbarDirective,\n    // IGX_GRID_EXCEL_STYLE_FILTER_DIRECTIVES:\n    IgxGridExcelStyleFilteringComponent,\n    IgxExcelStyleHeaderComponent,\n    IgxExcelStyleSortingComponent,\n    IgxExcelStylePinningComponent,\n    IgxExcelStyleHidingComponent,\n    IgxExcelStyleSelectingComponent,\n    IgxExcelStyleClearFiltersComponent,\n    IgxExcelStyleConditionalFilterComponent,\n    IgxExcelStyleMovingComponent,\n    IgxExcelStyleSearchComponent,\n    IgxExcelStyleColumnOperationsTemplateDirective,\n    IgxExcelStyleFilterOperationsTemplateDirective,\n    IgxExcelStyleLoadingValuesTemplateDirective,\n    // IGX_PAGINATOR_DIRECTIVES:\n    IgxColumnRequiredValidatorDirective,\n    IgxColumnMinValidatorDirective,\n    IgxColumnMaxValidatorDirective,\n    IgxColumnEmailValidatorDirective,\n    IgxColumnMinLengthValidatorDirective,\n    IgxColumnMaxLengthValidatorDirective,\n    IgxColumnPatternValidatorDirective,\n    // IGX_PAGINATOR_DIRECTIVES:\n    IgxPaginatorComponent,\n    IgxPageNavigationComponent,\n    IgxPageSizeSelectorComponent,\n    IgxPaginatorContentDirective,\n    IgxPaginatorDirective\n] as const;\n\n/**\n * @hidden\n * IMPORTANT: The following is NgModule exported for backwards-compatibility before standalone components\n */\n@NgModule({\n    imports: [\n        ...IGX_TREE_GRID_DIRECTIVES\n    ],\n    exports: [\n        ...IGX_TREE_GRID_DIRECTIVES\n    ]\n})\nexport class IgxTreeGridModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAqBM,MAAO,qBAAsB,SAAQ,kBAA4B,CAAA;AAEnD,IAAA,YAAY,CAAC,YAAsB,EAAA;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;AACtB,QAAA,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE;AACrD,QAAA,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC,8BAA8B,GAAG,IAAI;AAChE,QAAA,OAAO,IAAI;IACf;IAEgB,gBAAgB,GAAA;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,mBAAmB,KAAK,SAAS,IAAI,GAAG,CAAC,mBAAmB,KAAK,KAAK;aAC3H,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;QACzB,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACnC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AACvH,YAAA,WAAW,CAAC,OAAO,CAAC,KAAK,IAAG;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI;gBAC/E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;AACrC,gBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AACd,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzB;AACJ,YAAA,CAAC,CAAC;QACN;AACA,QAAA,OAAO,IAAK;IAChB;IAEgB,4BAA4B,CAAC,KAAU,EAAE,QAAiB,EAAA;AACtE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,KAAK,CAAE;AACrC,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;AACzB,aAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,oBAAoB;AACnE,iBAAC,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE;AAC/D,YAAA,OAAO,KAAK;QAChB;AACA,QAAA,OAAO,IAAI;IACf;AAEO,IAAA,qBAAqB,CAAC,MAAuB,EAAA;AAChD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;AACtB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe;AAE3C,QAAA,OAAO,MAAM,CAAC,MAAM,EAAE;AAClB,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;YAErD,IAAI,CAAC,QAAQ,EAAE;gBACX,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;YACxC;QACJ;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,cAAc;AAErC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3C;IACJ;AAEgB,IAAA,uBAAuB,CAAC,MAAuB,EAAA;AAC3D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;AAEvC,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AACxB,YAAA,OAAO,QAAQ;QACnB;aAAO;YACH,QAAQ,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,KAAM,GAAG,IAAI,CAAC,cAAe;QAC/F;IACJ;AAEgB,IAAA,yBAAyB,CAAC,MAAkB,EAAA;AACxD,QAAA,OAAO,CAAC,MAAM,CAAC,QAAQ,KAAK,kBAAkB,CAAC;AACxC,eAAA,MAAM,CAAC,QAAQ,KAAK,kBAAkB,CAAC;AACvC,eAAA,MAAM,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO,KAAK,MAAM,CAAC,YAAY,KAAK,CAAC;IACvF;AAEgB,IAAA,aAAa,CAAC,KAAU,EAAA;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;AAC1B,QAAA,MAAM,0CAA0C,GAC5C,QAAQ,CAAC,UAAU;AACnB,YAAA,QAAQ,CAAC,UAAU;AACnB,YAAA,QAAQ,CAAC,eAAe;AACxB,YAAA,QAAQ,CAAC,YAAY,CAAC,OAAO;QAEjC,IAAI,0CAA0C,EAAE;AAC5C,YAAA,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE;QACxC;QAEA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;QAEzC,IAAI,0CAA0C,EAAE;AAC5C,YAAA,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAC1C;AAEA,QAAA,OAAO,MAAM;IACjB;IAEgB,iBAAiB,CAAC,KAAU,EAAE,KAAa,EAAA;AACvD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;QAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAE3C,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,EAAE;AAC5C,YAAA,KAAK,GAAG,QAAQ,CAAC,UAAU;gBACvB,QAAQ,CAAC,IAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAC9D,gBAAA,QAAQ,CAAC,IAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACjC,YAAA,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;AAErC,YAAA,IAAI,QAAQ,CAAC,eAAe,EAAE;AAC1B,gBAAA,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE;AAC3B,oBAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACjC,wBAAA,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC;oBAClC;gBACJ;YACJ;QACJ;aAAO;YACH,MAAM,UAAU,GAAG,MAAO,CAAC,MAAM,GAAG,MAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI;AAC9F,YAAA,KAAK,GAAG,QAAQ,CAAC,UAAU;gBACvB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AACjE,gBAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;YAE7B,MAAM,gBAAgB,GAAU,EAAE;AAClC,YAAA,IAAI,CAAC,qBAAqB,CAAC,MAAO,EAAE,gBAAgB,CAAC;AACrD,YAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,gBAAA,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC;YAC3C;AAEA,YAAA,IAAI,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE;gBAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAgB,CAAC,KAAK,CAAC;AAC7C,gBAAA,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC;AACtB,oBAAA,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,eAAe,CAAC,MAAM;AAC5B,oBAAA,QAAQ,EAAE,IAAI;oBACd;AACwB,iBAAA,EACxB,UAAU,CAAC,KAAK,CAAC,CACpB;YACL;iBAAO;AACH,gBAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/B;YACA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;QACrC;IACJ;IAEO,qBAAqB,CAAC,MAAuB,EAAE,cAAqB,EAAA;AACvE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAClD;QACJ;AACA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;YACjC,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AAChD,gBAAA,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAClC;AACA,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,cAAc,CAAC;QACrD;IACJ;AAEgB,IAAA,uBAAuB,CAAC,KAAU,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,KAAK,CAAC;IACjF;AAEgB,IAAA,aAAa,CAAC,KAAU,EAAA;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IACxC;AAEA;;;;;AAKG;IACa,mBAAmB,CAAC,EAAmB,EAAE,cAAsB,EAAA;QAC3E,cAAc,GAAG,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,IAAK;AAClD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7G;IAEgB,YAAY,CAAC,IAAS,EAAE,WAAiB,EAAA;QACrD,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE;AAEnD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;;YAE1D,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,EAAE;AAChD,gBAAA,MAAM,KAAK,CAAC,CAAA,0CAAA,CAA4C,CAAC;YAC7D;AAEA,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;YAExD,IAAI,CAAC,YAAY,EAAE;AACf,gBAAA,MAAM,KAAK,CAAC,wBAAwB,CAAC;YACzC;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC;AACvE,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,WAAW;AACxC,gBAAA,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;YAC5B;iBAAO;AACH,gBAAA,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI;AACpC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY;gBACvC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;oBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI;oBACtE,MAAM,IAAI,GAAU,EAAE;AACtB,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,eAAgB,CAAC,WAAW,CAAC,CAAC;AACrD,oBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AACtB,oBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACvB,wBAAA,EAAE,EAAE,KAAK;wBACT,IAAI;AACJ,wBAAA,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE,eAAe,CAAC;qBACE,EACxB,IAAI,CAAC;gBACb;qBAAO;AACH,oBAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACvB,wBAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE;oBAC7B;oBACA,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACnC;YACJ;QACJ;aAAO;AACH,YAAA,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;QAC5B;IACJ;AAEgB,IAAA,uBAAuB,CAAC,eAA0C,EAAA;QAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAAC;QACjE,MAAM,IAAI,GAAU,EAAE;AAEtB,QAAA,IAAI,CAAC,8BAA8B,CAAC,OAAO,EAAE,IAAI,CAAC;AAElD,QAAA,OAAO,IAAI;IACf;IAEgB,qBAAqB,CAAC,IAAuB,EAAE,WAAiC,EAAA;QAC5F,MAAM,OAAO,GAAsB,QAAQ,CAAC,IAAI,CAC5C,UAAU,CAAC,IAAI,CAAC,EAChB,WAAW,EACX,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,oBAAoB,EAAE,EACpD,IAAI,CAAC,IAAI,CAAC;AACd,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IACnC;AAEO,IAAA,2BAA2B,CAAC,eAA0C,EAAA;AACzE,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAY;AAEpC,QAAA,IAAI,eAAe,CAAC,iBAAiB,CAAC,MAAM,EAAE;AAC1C,YAAA,MAAM,KAAK,GAAG;gBACV,eAAe;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,yBAAyB;aACtE;AACD,YAAA,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;QACtE;AAEA,QAAA,OAAO,OAAO;IAClB;AAEmB,IAAA,mBAAmB,CAAC,KAAU,EAAE,KAAU,EAAE,KAAa,EAAA;AACxE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;QACtB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;YACpC,KAAK,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QAClD;aAAO;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACvC,MAAM,SAAS,GAAG,MAAO,CAAC,MAAM,GAAG,MAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,IAAI;AACrF,YAAA,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAClF,gBAAA,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5B,YAAA,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK;QAC5B;IACJ;AAEA;;;;;;;;AAQG;IACgB,UAAU,CACzB,IAAc,EACd,KAAU,EACV,oBAAyB,EACzB,eAAoB,EACpB,WAAiC,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAgB,CAAC,KAAK,CAAC;AACzC,YAAA,MAAM,WAAW,GAA4B;AACzC,gBAAA,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,eAAe,CAAC,MAAM;AAC5B,gBAAA,QAAQ,EAAE,WAAW;gBACrB;aACH;YACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC;QACvD;aAAO;AACH,YAAA,YAAY,CAAC,oBAAoB,EAAE,WAAW,CAAC;QACnD;IACJ;AAEQ,IAAA,kBAAkB,CAAC,KAAU,EAAA;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;QACtB,IAAI,CAAC,IAAI,EAAE;AACP,YAAA,OAAO,KAAK;QAChB;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,YAAY,EAAE;YAChE,IAAI,IAAI,GAAG,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YACnC,OAAO,IAAI,EAAE;AACT,gBAAA,MAAM,KAAK,GAAU,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;gBACzD,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,EAAE;AAChD,oBAAA,OAAO,IAAI;gBACf;AACA,gBAAA,IAAI,GAAG,IAAI,CAAC,MAAM;YACtB;QACJ;AACA,QAAA,OAAO,KAAK;IAChB;IAEQ,8BAA8B,CAAC,OAA0B,EAAE,IAAW,EAAA;QAC1E,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC;QACJ;AAEA,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC1B,YAAA,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE;AAC7B,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB;YACA,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC,QAAS,EAAE,IAAI,CAAC;QAC/D;IACJ;8GAjUS,qBAAqB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAArB,qBAAqB,EAAA,CAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC;;;AClBD;;AAEG;MAKU,uCAAuC,CAAA;AAJpD,IAAA,WAAA,GAAA;AAKW,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAmB,WAAW,CAAC;AAC1D,IAAA;8GAFY,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvC,uCAAuC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAvC,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBAJnD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,UAAU,EAAE;AACf,iBAAA;;;ACFK,MAAO,2BAA4B,SAAQ,uBAAuB,CAAA;;IAKpD,qBAAqB,CAAC,MAAa,EAAE,kBAA4B,EAAA;AAC7E,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;AAC3E,YAAA,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,kBAAkB,CAAC;YAC7D;QACJ;AACA,QAAA,KAAK,CAAC,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAC3D;;AAGgB,IAAA,uBAAuB,CAAC,MAAa,EAAA;QACjD,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;AAC9D,YAAA,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC;YAC3C;QACJ;AACA,QAAA,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC;IACzC;AAEgB,IAAA,qBAAqB,CAAC,YAAiB,EAAE,KAAU,EAAE,OAAY,EAAE,KAAkB,EAAA;QACjG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;YAC9D,IAAI,CAAC,4BAA4B,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;AACtE,YAAA,OAAO,SAAU;QACrB;QAEA,KAAK,CAAC,qBAAqB,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;AAChE,QAAA,OAAO,SAAU;IACrB;AAEO,IAAA,qCAAqC,CACxC,OAAiB,EACjB,SAAe,EACf,gBAA0B,IAAK,EAAA;AAC/B,QAAA,IAAI,aAAa,KAAK,IAAI,EAAE;;;AAGxB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBACf;YACJ;AACA,YAAA,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAClD,IAAI,CAAC,qBAAqB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAC5D,IAAI,SAAS,EAAE;AACX,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC;YACvC;QACJ;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACf,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;;YAE5D,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACpD;QACJ;AACA,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAO;AACjC,QAAA,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;AACrB,YAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,aAAa,CAAC;AACnD,YAAA,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;AACzB,gBAAA,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YACjC;AACJ,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,qCAAqC,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC;IAC/E;IAEQ,4BAA4B,CAAC,MAAa,EAAE,kBAA4B,EAAA;QAC5E,IAAI,kBAAkB,EAAE;AACpB,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,YAAA,IAAI,CAAC,8BAA8B,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACvE;aAAO;AACH,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE;YAC3C,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC;AACjD,YAAA,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE;;AAG3C,YAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAEpC,YAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC;QAC7C;QACA,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;QAC5D,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;IACxD;AAEQ,IAAA,8BAA8B,CAAC,MAAa,EAAA;QAChD,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;AAC3C,QAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC;QAEzC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;QAC5D,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;IACxD;AAEA,IAAA,IAAW,gBAAgB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB;IACrC;AAEQ,IAAA,4BAA4B,CAAC,YAAiB,EAAE,KAAU,EAAE,OAAY,EAAE,KAAW,EAAA;AACzF,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE;QAC5C,IAAI,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE;YACvD;QACJ;AAEA,QAAA,MAAM,IAAI,GAAG;AACT,YAAA,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,mBAAmB,EAAE,EAAE,YAAY;AACxE,YAAA,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;SAClC;AAED,QAAA,IAAI,CAAC,8BAA8B,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QACjE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAG3J,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;QAEpC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;AAEzC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACb;QACJ;AACA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,GAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;;AAE5G,QAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,eAAe,CAAC,EAAE;YAC9E,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;YAC5D,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACxD;aAAO;;AAEH,YAAA,IAAI,CAAC,4BAA4B,CAAC,eAAe,EAAE,IAAI,CAAC;QAC5D;IACJ;AAGA;;AAEG;AACK,IAAA,yBAAyB,CAAC,IAAS,EAAA;QACvC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;QAClD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9E;AAEA;;;;;;AAMG;AACK,IAAA,mCAAmC,CAAC,iBAA2B,EAAE,aAAuB,EAAE,MAAe,EAAE,aAAsB,EAAA;AACrI,QAAA,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAO;QAC3C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC1C,YAAA,MAAM,KAAK,GAAG,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG;AAC7D,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC;AACrC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC;YAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;AAC9D,YAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAG;gBAC1B,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;oBAC1B,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;gBACzC;AACJ,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,EAAE;AACvC,gBAAA,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC;YAClD;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,oBAAoB;IAC/B;AAGA;;;AAGG;AACK,IAAA,8BAA8B,CAAC,IAAS,EAAE,aAAa,GAAG,KAAK,EAAA;QACnE,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,CAAM,IAAI,CAAC,YAAY,GAAG,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACjL,IAAI,CAAC,qBAAqB,GAAG,IAAI,GAAG,CAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAEtE,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE3D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AAEjC,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;AACzB,YAAA,IAAI,kBAAkB,GAAG,IAAI,GAAG,EAAO;AAEvC,YAAA,kBAAkB,GAAG,IAAI,CAAC,mCAAmC,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC;YAE3G,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AAC9C,gBAAA,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,aAAa,CAAC;AAC1D,YAAA,CAAC,CAAC;QACN;AAEA,QAAA,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;AACrB,YAAA,IAAI,gBAAgB,GAAG,IAAI,GAAG,EAAO;AAErC,YAAA,gBAAgB,GAAG,IAAI,CAAC,mCAAmC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,CAAC;YAEtG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AAC5C,gBAAA,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,aAAa,CAAC;AAC1D,YAAA,CAAC,CAAC;QACN;IACJ;AAEA;;AAEG;IACK,0BAA0B,CAAC,OAAwB,EAAE,aAAuB,EAAA;QAChF,IAAI,CAAC,OAAO,EAAE;YACV;QACJ;AACA,QAAA,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,aAAa,CAAC;AACpD,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC;QAClE;IACJ;AAEA;;AAEG;IACK,uBAAuB,CAAC,OAAwB,EAAE,aAAuB,EAAA;QAC7E,IAAI,eAAe,GAAsB,EAAE;AAC3C,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE;YAC7B,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpF;AACA,QAAA,IAAI,eAAe,CAAC,MAAM,EAAE;YACxB,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;gBAClE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;YAC7C;AAAO,iBAAA,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;gBACnH,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;gBAC3C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;YAC7C;iBAAO;gBACH,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YAC9C;QACJ;aAAO;;YAEH,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACjC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;YAC7C;iBAAO;gBACH,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YAC9C;QACJ;IACJ;AAEQ,IAAA,gBAAgB,CAAC,MAAuB,EAAA;QAC5C,MAAM,QAAQ,GAAG,EAAE;AACnB,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;AACrD,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;gBACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC9C,gBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB;QACJ;AACA,QAAA,OAAO,QAAQ;IAEnB;IAEQ,iBAAiB,CAAC,KAAU,EAAE,MAAe,EAAA;QACjD,IAAI,MAAM,EAAE;AACR,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,YAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5C;aAAO;AACH,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;AACnC,YAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5C;IACJ;8GA7QS,2BAA2B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA3B,2BAA2B,EAAA,CAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC;;;ACDD;MAKa,sBAAsB,CAAA;AAJnC,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAe,aAAa,CAAC;AAsGrD,IAAA;AAnGU,IAAA,SAAS,CAAC,QAA2B,EACxC,UAAmB,EACnB,sBAAkD,EAClD,eAAoC,EAAE,qBAA8B,EAAE,CAAS,EAAE,EAAU,EAAA;AAE3F,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,IAAI,sBAAsB,KAAK,0BAA0B,CAAC,aAAa,EAAE;AACjG,YAAA,OAAO,QAAQ;QACnB;AAEA,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,qBAAqB,CAAC;IAC3F;AAEQ,IAAA,cAAc,CAAC,IAAkB,EAAE,UAA6B,EACpE,eAAoC,EAAE,qBAA8B,EAAA;QACpE,MAAM,kBAAkB,GAAG,EAAE;QAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE;AAEnE,QAAA,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;AAC7B,YAAA,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;YAE/B,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,qBAAqB;YAC9G,IAAI,WAAW,EAAE;AACb,gBAAA,IAAI,SAAS,GAAG,MAAM,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AACrF,gBAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC;AACjE,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC;AAC/E,gBAAA,MAAM,aAAa,GAAmB;oBAClC,SAAS;AACT,oBAAA,GAAG,EAAE,gBAAgB;AACrB,oBAAA,eAAe,EAAE,MAAM,CAAC,KAAM,GAAG;iBACpC;AACD,gBAAA,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1C;AACA,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ;YACnF,IAAI,eAAe,KAAK,mBAAmB,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE;gBAC/D,IAAI,WAAW,GAAG,MAAM;AACxB,gBAAA,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM;gBAE1B,OAAO,MAAM,EAAE;AACX,oBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;oBAEhC,IAAI,QAAS,CAAC,QAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,WAAW,EAAG;wBAClD,IAAI,SAAS,GAAG,QAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC9E,wBAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC;AACjE,wBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC;AAC/E,wBAAA,MAAM,aAAa,GAAmB;4BAClC,SAAS;AACT,4BAAA,GAAG,EAAE,gBAAgB;AACrB,4BAAA,eAAe,EAAE,MAAM,CAAC,KAAM,GAAG;yBACpC;AACD,wBAAA,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC;wBAEtC,WAAW,GAAG,MAAM;AACpB,wBAAA,MAAM,GAAG,WAAW,CAAC,MAAM;oBAC/B;yBAAO;wBACH;oBACJ;gBACJ;YACJ;iBAAO,IAAI,eAAe,KAAK,mBAAmB,CAAC,GAAG,IAAI,UAAU,EAAE;AAClE,gBAAA,IAAI,SAAS,GAAG,MAAM,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AACrF,gBAAA,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC;AACjE,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC;AAC/E,gBAAA,MAAM,aAAa,GAAmB;oBAClC,SAAS;AACT,oBAAA,GAAG,EAAE,gBAAgB;AACrB,oBAAA,eAAe,EAAE,MAAM,CAAC,KAAM,GAAG;iBACpC;AACD,gBAAA,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1C;QACJ;AACA,QAAA,OAAO,kBAAkB;IAC7B;AAEQ,IAAA,mBAAmB,CAAC,IAAkB,EAAE,KAAU,EAAE,IAAS,EAAA;AACjE,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACrD,YAAA,OAAO,IAAI;QACf;AACA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACvH,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;QAEjC,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,YAAA,OAAO,IAAI;QACf;AACA,QAAA,GAAG,GAAG,GAAG,EAAE,QAAQ,GAAG,GAAG,GAAG,GAAG,EAAE,MAAM;QACvC,OAAO,GAAG,EAAE;AACR,YAAA,KAAK,GAAG,GAAG,CAAC,GAAG;YACf,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;AACnC,gBAAA,OAAO,EAAE;YACb;AACA,YAAA,GAAG,GAAG,GAAG,CAAC,MAAM;QACpB;AACA,QAAA,WAAW,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;AAC/B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI;YACtF,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;AACrC,YAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AACd,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACzB;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,IAAI;IACf;8GAtGS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,UAAU,EAAE;AACf,iBAAA;;;ACJD;MAKa,wBAAwB,CAAA;AAJrC,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,aAAa,CAAC;AA6CjD,IAAA;AA1CU,IAAA,SAAS,CAAC,aAAgC,EAAE,eAA0C,EACzF,cAAkC,EAClC,gCAA2D,EAC3D,CAAS,EAAE,EAAU,EAAE,MAAY,EAAA;AACnC,QAAA,MAAM,KAAK,GAAoB;YAC3B,eAAe;AACf,YAAA,uBAAuB,EAAE,gCAAgC;YACzD,QAAQ,EAAE,IAAI,yBAAyB;SAC1C;QAED,IAAI,cAAc,EAAE;AAChB,YAAA,KAAK,CAAC,QAAQ,GAAG,cAAc;QACnC;AAEA,QAAA,IAAI,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAwB,CAAC,EAAE;YACzH,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC;AACvC,YAAA,OAAO,aAAa;QACxB;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;QAC3D,MAAM,YAAY,GAAU,EAAE;AAC9B,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC;QACnF,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC;AAE/C,QAAA,OAAO,MAAM;IACjB;AAEQ,IAAA,kBAAkB,CAAC,IAAc,EAAE,IAAuB,EAC9D,cAAiC,EAAE,YAAmB,EAAA;AACtD,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACpB,YAAA,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAE3B,YAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;AACjC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,CAAC;YAC7E;QACJ;IACJ;AAEQ,IAAA,MAAM,CAAC,IAAuB,EAAE,KAAsB,EAAE,IAAe,EAAA;AAC3E,QAAA,OAAO,KAAK,CAAC,QAAS,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC;IACnG;8GA7CS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,mBAAA,EAAA,CAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,mBAAmB;AACzB,oBAAA,UAAU,EAAE;AACf,iBAAA;;;ACHD;;AAEG;MAKU,4BAA4B,CAAA;AAJzC,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,aAAa,CAAC;AAyHjD,IAAA;IAtHU,SAAS,CAAC,UAAiB,EAAE,UAAkB,EAAE,UAAkB,EAAE,YAAoB,EAAE,CAAS,EAAA;QACvG,IAAI,mBAAmB,GAAsB,EAAE;AAC/C,QAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAwB;QAC1D,MAAM,QAAQ,GAAU,EAAE;QAE1B,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACnC,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,kBAAkB;AACtC,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,UAAU;AAClC,YAAA,OAAO,UAAU;QACrB;QAEA,IAAI,YAAY,EAAE;AACd,YAAA,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,SAAU,EAC5F,QAAQ,EAAE,CAAC,EAAE,kBAAkB,CAAC;QACxC;aAAO,IAAI,UAAU,EAAE;AACnB,YAAA,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,CAAC;QACpH;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO;AAC/C,YAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAG;AAClB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;gBAC7E,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,GAAG;AACvD,YAAA,CAAC,CAAC,GAAG,QAAQ;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,kBAAkB;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,mBAAmB;AAC3C,QAAA,OAAO,mBAAmB;IAC9B;IAEQ,QAAQ,CAAC,UAAe,EAAE,OAAY,EAAA;AAC1C,QAAA,OAAO,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO;IACrD;AAEA;;;;;;;;;;;;;;;;AAgBG;IACK,mBAAmB,CACvB,UAAiB,EACjB,UAAkB,EAClB,UAAkB,EAClB,GAA8B,EAC9B,QAAe,EAAA;AAEf,QAAA,UAAU,CAAC,OAAO,CAAC,GAAG,IAAG;AACrB,YAAA,MAAM,MAAM,GAAoB;gBAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC;AACnC,gBAAA,IAAI,EAAE,GAAG;AACT,gBAAA,QAAQ,EAAE;aACb;YACD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;AACpC,QAAA,CAAC,CAAC;QAEF,MAAM,MAAM,GAAsB,EAAE;AACpC,QAAA,UAAU,CAAC,OAAO,CAAC,GAAG,IAAG;YACrB,MAAM,MAAM,GAAoB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAE;YACzD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAEvC,IAAI,MAAM,EAAE;AACR,gBAAA,MAAM,CAAC,MAAM,GAAG,MAAM;AACtB,gBAAA,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC;iBAAO;AACH,gBAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB;AACJ,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC;AAE9C,QAAA,OAAO,MAAM;IACjB;AAEQ,IAAA,oBAAoB,CAAC,UAA6B,EAAE,gBAAwB,EAAE,QAAe,EAAA;AACjG,QAAA,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;AAC7B,YAAA,MAAM,CAAC,KAAK,GAAG,gBAAgB;AAC/B,YAAA,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC;AACnE,YAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAE1B,YAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/C,gBAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,CAAC,EAAE,QAAQ,CAAC;YAC9E;QACJ;IACJ;AAEQ,IAAA,oBAAoB,CAAC,UAAiB,EAAE,UAAkB,EAAE,YAAoB,EACpF,MAAuB,EAAE,QAAe,EAAE,gBAAwB,EAAE,GAA8B,EAAA;QAClG,MAAM,MAAM,GAAsB,EAAE;AAEpC,QAAA,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;AAC3B,YAAA,MAAM,MAAM,GAAoB;gBAC5B,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;AACpC,gBAAA,IAAI,EAAE,IAAI;gBACV,MAAM;AACN,gBAAA,KAAK,EAAE;aACV;AACD,YAAA,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC;AACnE,YAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;YAC3B,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;gBAChC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,CAAC,EAAE,GAAG,CAAC;AACpH,gBAAA,SAAS;AACb,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACvB;AAEA,QAAA,OAAO,MAAM;IACjB;8GAzHS,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,uBAAA,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAJxC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,uBAAuB;AAC7B,oBAAA,UAAU,EAAE;AACf,iBAAA;;AA6HD;;AAEG;MAKU,yBAAyB,CAAA;AAJtC,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,aAAa,CAAC;AA4CjD,IAAA;AAzCU,IAAA,SAAS,CAAC,UAA6B,EAC1C,cAAsB,EAAE,cAAiC,EAAE,CAAS,EAAA;QAEpE,MAAM,IAAI,GAAsB,EAAE;AAElC,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,UAAU;QAC3C,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAwB;AAE5D,QAAA,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC;AAEjF,QAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAE3D,QAAA,OAAO,IAAI;IACf;IAEQ,oBAAoB,CAAC,UAA6B,EAAE,IAAuB,EAC/E,cAAsB,EAAE,cAAiC,EAAE,cAAuB,EAAA;QAClF,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACnC;QACJ;AAEA,QAAA,KAAK,MAAM,kBAAkB,IAAI,UAAU,EAAE;YACzC,IAAI,cAAc,EAAE;AAChB,gBAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;YACjC;AAEA,YAAA,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,kBAAkB,CAAC;YAE3F,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC;AAErE,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAiB,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,CAAC;AAE3E,YAAA,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,QAAS,EAAE,IAAI,EAAE,cAAc,EACxE,cAAc,EAAE,cAAc,IAAI,kBAAkB,CAAC,QAAQ,CAAC;QACtE;IACJ;IAEQ,iCAAiC,CAAC,IAAc,EAAE,MAAuB,EAAA;AAC7E,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;AACzC,QAAA,GAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;IACnC;8GA5CS,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,oBAAA,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,oBAAoB;AAC1B,oBAAA,UAAU,EAAE;AACf,iBAAA;;AAgDD;MAKa,sBAAsB,CAAA;AAJnC,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,aAAa,CAAC;AAkCjD,IAAA;IA/BU,SAAS,CACZ,gBAAmC,EACnC,eAAqC,EACrC,gBAAuC,EACvC,OAA6B,EAC7B,CAAS,EACT,MAAgB,EAAA;AAEhB,QAAA,MAAM,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,eAAe;AACjG,QAAA,IAAI,MAAyB;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YACrB,MAAM,GAAG,gBAAgB;QAC7B;aAAO;AACH,YAAA,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,gBAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;QACrF;QAEA,MAAM,kBAAkB,GAAU,EAAE;AACpC,QAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,MAAO,CAAC;AAE5D,QAAA,OAAO,MAAM;IACjB;IAEQ,sBAAsB,CAAC,OAA0B,EAAE,QAAe,EAAA;AACtE,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;AAC3B,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC1B,gBAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC1B,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAS,EAAE,QAAQ,CAAC;YAC3D;QACJ;IACJ;8GAlCS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,UAAU,EAAE;AACf,iBAAA;;AAsCD;MAKa,qBAAqB,CAAA;AAJlC,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,aAAa,CAAC;AAsBjD,IAAA;AAnBU,IAAA,SAAS,CAAC,UAA6B,EAAE,OAAgB,EAAE,IAAI,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,CAAS,EAAA;QAC/F,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO,EAAE;AAC9C,YAAA,OAAO,UAAU;QACrB;QAEA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAM;QACtF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC;AAE3C,QAAA,MAAM,KAAK,GAAG;AACV,YAAA,KAAK,EAAE,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,GAAG,IAAI;AACrE,YAAA,cAAc,EAAE;SACnB;AAED,QAAA,MAAM,MAAM,GAAsB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC;AACnF,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK;AAE5B,QAAA,OAAO,MAAM;IACjB;8GAtBS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,UAAU,EAAE;AACf,iBAAA;;AAyBD;MAKa,0BAA0B,CAAA;AAJvC,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,aAAa,CAAC;AAoCjD,IAAA;IAjCU,SAAS,CAAC,UAAiB,EAAE,CAAS,EAAA;QAEzC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAChC,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC;AAC3E,YAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU;gBACvC,IAAI,CAAC,UAAU,EAAE;AACb,oBAAA,OAAO,UAAU;gBACrB;AAEA,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY;gBAE3C,IAAI,YAAY,EAAE;oBACd,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,UAAU,EAAE,YAAY,CAAC;oBAC9E,OAAO,QAAQ,CAAC,6BAA6B,CACzC,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,UAAU,EACpB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAC9B;gBACL;qBAAO;AACH,oBAAA,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC;oBAC5C,OAAO,QAAQ,CAAC,iBAAiB,CAC7B,aAAa,EACb,iBAAiB,EACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EACpB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBACpC;YACJ;QACJ;AACA,QAAA,OAAO,UAAU;IACrB;8GApCS,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,qBAAqB;AAC3B,oBAAA,UAAU,EAAE;AACf,iBAAA;;AAwCD;;AAEG;MAKU,+BAA+B,CAAA;AAJ5C,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,aAAa,CAAC;AAgBjD,IAAA;IAbU,SAAS,CAAC,CAAQ,EAAE,EAAU,EAAA;AACjC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU;;AAEvC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ;AACnC,QAAA,MAAM,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,KACtC;AACG,YAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG;AACnD,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,QAAQ,EAAE;AACb,SAAA,CAAC,CAAC,GAAG,EAAE;AACR,QAAA,OAAO,GAAG;IACd;8GAhBS,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,yBAAA,EAAA,CAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAJ3C,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,yBAAyB;AAC/B,oBAAA,UAAU,EAAE;AACf,iBAAA;;MAwBY,qBAAqB,CAAA;AAJlC,IAAA,WAAA,GAAA;AAKY,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,aAAa,CAAC;AAmBjD,IAAA;AAhBU,IAAA,SAAS,CAAC,UAAe,EAAE,QAAQ,GAAG,KAAK,EAAE,YAAoB,EAAA;QACpE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ;YAC3F,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,EAAE;AACjH,YAAA,OAAO,UAAU;QACrB;QACA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,MAAM,GAAG,GAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAiB,CAAC,SAAS;QAC9D,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,MAAW,KAAK,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;YACjH,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;QAC3C;aAAO;AACH,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC;QACxD;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;AACpC,QAAA,OAAO,IAAI;IACf;8GAnBS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,UAAU,EAAE;AACf,iBAAA;;;ACtRK,MAAO,wBAAyB,SAAQ,8BAA8B,CAAA;AAlC5E,IAAA,WAAA,GAAA;;AAoCI;;AAEG;QAEI,IAAA,CAAA,KAAK,GAAG,CAAC;AAEhB;;AAEG;QAEI,IAAA,CAAA,aAAa,GAAG,KAAK;AAoC/B,IAAA;AA5BG;;;;;;;AAOG;AACH,IAAA,IACoB,GAAG,GAAA;;AAEnB,QAAA,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,IAAW,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACpF;AAEA;;AAEG;AACa,IAAA,MAAM,CAAC,KAAY,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC;IAC5F;AAEA;;AAEG;AACI,IAAA,iBAAiB,CAAC,KAAY,EAAA;QACjC,KAAK,CAAC,eAAe,EAAE;IAC3B;8GA/CS,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,GAAA,EAAA,KAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxDrC,ugZAqZA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1XQ,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAKhB,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,yBAAyB,4KACzB,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,8IAAA,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,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,IAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,eAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,mBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,kBAAkB,EAAA,QAAA,EAAA,mCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,iCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,+BAA+B,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC/B,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAInB,yBAAyB,wHAvBzB,sBAAsB,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACtB,uBAAuB,EAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACvB,wBAAwB,EAAA,IAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACxB,oBAAoB,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAiBpB,uBAAuB,EAAA,IAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACvB,oBAAoB,EAAA,IAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACpB,sBAAsB,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAIjB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAlCpC,SAAS;AACW,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,oBAAoB,EAAA,OAAA,EAErB;wBACL,OAAO;wBACP,OAAO;wBACP,gBAAgB;wBAChB,sBAAsB;wBACtB,uBAAuB;wBACvB,wBAAwB;wBACxB,oBAAoB;wBACpB,gBAAgB;wBAChB,yBAAyB;wBACzB,gBAAgB;wBAChB,mBAAmB;wBACnB,sBAAsB;wBACtB,iBAAiB;wBACjB,iBAAiB;wBACjB,oBAAoB;wBACpB,sBAAsB;wBACtB,sBAAsB;wBACtB,0BAA0B;wBAC1B,kBAAkB;wBAClB,kBAAkB;wBAClB,+BAA+B;wBAC/B,yBAAyB;wBACzB,mBAAmB;wBACnB,uBAAuB;wBACvB,oBAAoB;wBACpB,sBAAsB;wBACtB;AACH,qBAAA,EAAA,QAAA,EAAA,ugZAAA,EAAA;;sBAOA;;sBAMA;;sBAMA;;sBAWA;;;AElEC,MAAO,uBAAwB,SAAQ,eAAe,CAAA;AAWxD;;;;;;;AAOG;AACH,IAAA,IACW,OAAO,GAAA;QACd,OAAO,IAAI,CAAC,QAAQ;IACxB;IAEA,IAAW,OAAO,CAAC,KAAsB,EAAA;AACrC,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE;AACzB,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;YACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;QAClC;IACJ;AAEA;;;;;;AAMG;IACH,IAAoB,MAAM,CAAC,KAAc,EAAA;QACrC,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B;aAAO;YACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QAChC;IACJ;AAEA;;;;;AAKG;AACH,IAAA,IAAoB,MAAM,GAAA;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;IAClD;AAEA;;AAEG;AACH,IAAA,IAAoB,MAAM,GAAA;AACtB,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ;QAClD,IAAI,YAAY,EAAE;YACd,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;QACvE;AACA,QAAA,OAAO,OAAO,EAAE,KAAK,KAAK,CAAC;IAC/B;AAEA;;AAEG;AACH,IAAA,IAAoB,WAAW,GAAA;AAC3B,QAAA,OAAO,IAAI;IACf;AAEA;;;;;;;AAOG;AACH,IAAA,IACoB,QAAQ,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAS;IAClC;AAEA;;;;;;;AAOG;IACH,IAAoB,QAAQ,CAAC,KAAc,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;IACvE;AAEA;;;AAGG;AACH,IAAA,IAAoB,SAAS,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1D;AAEA;;AAEG;AACH,IAAA,IAAW,aAAa,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AACnC,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;AACrD,gBAAA,IAAI,CAAC,IAAI,CAAC,cAAc;oBACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;AACnC,oBAAA,IAAI;AACZ,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAC7D;AAEA;;AAEG;AACH,IAAA,IAAW,aAAa,GAAA;QACpB,OAAO,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC;IACpE;AAEA;;AAEG;IACa,SAAS,GAAA;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;QAC9F,KAAK,CAAC,SAAS,EAAE;IACrB;AAEA;;;;;;;;;AASG;IACI,aAAa,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;IACrD;8GApJS,uBAAuB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,SAAA,EAHrB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,uBAAuB,CAAC,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfrG,+jUAsVA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtUc,gBAAgB,oJAAE,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,6BAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,2XAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,wBAAwB,uHAAE,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,qBAAqB,iDAAE,2BAA2B,EAAA,IAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,2BAA2B,EAAA,IAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEpR,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;sCACW,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,mBAAmB,aAElB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,CAAC,6BAA6B,CAAC,EAAE,CAAC,EAAA,OAAA,EACxF,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,2BAA2B,CAAC,EAAA,QAAA,EAAA,+jUAAA,EAAA;;sBAG7R,YAAY;uBAAC,UAAU;;sBAkBvB;;sBAgEA,WAAW;uBAAC,oBAAoB;;;AE1FrC;;;;AAIG;AAQG,MAAO,+BAAgC,SAAQ,uBAAuB,CAAA;AAP5E,IAAA,WAAA,GAAA;;AAQY,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC;QAejC,IAAA,CAAA,mBAAmB,GAAG,KAAK;AAE3B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAO;AA0FxC,IAAA;AAzGG,IAAA,IACW,kBAAkB,GAAA;QACzB,OAAO,IAAI,CAAC,mBAAmB;IACnC;IAEA,IAAW,kBAAkB,CAAC,KAAc,EAAA;QACxC,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE;AACxC,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QACpC;AAEA,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;IACpC;IAMO,kBAAkB,GAAA;QACrB,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE;AACvC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE;YAClE,IAAI,CAAC,uBAAuB,EAAE;QAClC;QAEA,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAwC,KAAI;AACrH,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBAC/C;YACJ;YAEA,IAAI,OAAO,GAAG,KAAK;AAEnB,YAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,QAA4B,KAAI;AACxD,gBAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS;AACpC,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC;gBAC5E,IAAI,YAAY,IAAI,YAAY,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,EAAE;AACnD,oBAAA,YAAY,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG;oBAC/B,OAAO,GAAG,IAAI;gBAClB;AACJ,YAAA,CAAC,CAAC;YAEF,IAAI,OAAO,EAAE;gBACT,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;YAC5C;AACJ,QAAA,CAAC,CAAC;IACN;IAEO,WAAW,GAAA;AACd,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC5B;AAEO,IAAA,aAAa,CAAC,KAAiC,EAAA;AAClD,QAAA,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,KAAK;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC;AAE/D,QAAA,IAAI,CAAC,eAAe,GAAG,cAAc;;AAGrC,QAAA,IAAI,aAAa,YAAY,aAAa,EAAE;AACxC,YAAA,IAAI,CAAC,WAAW,GAAG,cAAc;QACrC;IACJ;IAEO,aAAa,GAAA;AAChB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe;IAC3C;AAEO,IAAA,OAAO,CAAC,UAA+B,EAAA;AAC1C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;IAC5C;AAEO,IAAA,aAAa,CAAC,IAAY,EAAA;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AACnG,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACjC;IAEmB,kBAAkB,GAAA;QACjC,IAAI,CAAC,uBAAuB,EAAE;IAClC;IAEQ,uBAAuB,GAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AACzE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AAC1D,YAAA,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,gBAAA,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,KAAI;AAC7B,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AACzD,oBAAA,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB;AACxC,gBAAA,CAAC,CAAC;AACF,gBAAA,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,KAAI;AAC/B,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AACzD,oBAAA,GAAG,CAAC,MAAM,GAAG,KAAK;AACtB,gBAAA,CAAC,CAAC;YACN;QACJ;IACJ;AAEQ,IAAA,oBAAoB,CAAC,KAAc,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC7D,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC9B,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;AACrD,gBAAA,GAAG,CAAC,MAAM,GAAG,KAAK;AACtB,YAAA,CAAC,CAAC;QACN;IACJ;8GA3GS,+BAA+B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAGpB,gBAAgB,CAAA,EAAA,EAAA,SAAA,EAPzB,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBnG,u9DA8CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDzBc,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,iCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,+IAAE,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAEjK,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAP3C,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAAA,SAAA,EAE5B,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAA,+BAAiC,EAAE,CAAC,EAAA,eAAA,EAC9E,uBAAuB,CAAC,KAAK,EAAA,OAAA,EACrC,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAA,QAAA,EAAA,u9DAAA,EAAA;;sBAK1K,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;;AE0E1C,IAAI,OAAO,GAAG,CAAC;AAEf;AACA;;;AAG2B;AAC3B;;;;;;;;;;;;;;;AAeG;AA6DG,MAAO,oBAAqB,SAAQ,oBAAoB,CAAA;AA5D9D,IAAA,WAAA,GAAA;;QA6DuB,IAAA,CAAA,eAAe,GAAG,MAAM,CAA6E,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC;AAC7I,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,iCAAiC,CAAC;;AAEjE,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAgC;AAwCjG;;;;;;;;;AASG;QAEI,IAAA,CAAA,eAAe,GAAG,IAAI;AAoB7B;;AAEG;QAEI,IAAA,CAAA,IAAI,GAAG,UAAU;AAExB;;;;;;;AAOG;AAGI,QAAA,IAAA,CAAA,EAAE,GAAG,CAAA,cAAA,EAAiB,OAAO,EAAE,EAAE;;AAiDxC;;;;;;;;AAQG;AACI,QAAA,IAAA,CAAA,OAAO,GAA8B,IAAI,GAAG,EAAwB;;AAc3E;;;;;;;;AAQG;AACI,QAAA,IAAA,CAAA,gBAAgB,GAA8B,IAAI,GAAG,EAAwB;AAEpF;;AAEG;AACI,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAO;AAEhB,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,yBAAyB,EAAE;AAEjD,QAAA,IAAA,CAAA,cAAc,GAAuB,IAAI,4BAA4B,EAAE;QAGlF,IAAA,CAAA,eAAe,GAAG,QAAQ;AA8wBrC,IAAA;;AA3wBG;;;;;;;AAOG;AACH,IAAA,IACW,IAAI,GAAA;QACX,OAAO,IAAI,CAAC,KAAK;IACrB;;IAGA,IAAW,IAAI,CAAC,KAAmB,EAAA;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK;AAC1B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACb,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC;QACA,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;YAC/F,IAAI,CAAC,YAAY,EAAE;QACvB;QACA,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IAC3B;;AAGA,IAAA,IAAoB,IAAI,GAAA;AACpB,QAAA,OAAO,MAAM;IACjB;AAEA;;;;AAIG;AACH,IAAA,IAAoB,YAAY,GAAA;QAC5B,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAC5C,OAAO,IAAI,CAAC,eAAe;QAC/B;QACA,OAAO,IAAI,CAAC,aAAa;IAC7B;AAEA;;;;;;;;AAQG;AACH,IAAA,IACW,cAAc,GAAA;QACrB,OAAO,IAAI,CAAC,eAAe;IAC/B;IAEA,IAAW,cAAc,CAAC,KAAa,EAAA;AACnC,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;QAC5B,IAAI,CAAC,aAAa,EAAE;IACxB;AAEA;;;;;;;;;;;;;;AAcG;AACH,IAAA,IACW,2BAA2B,GAAA;QAClC,OAAO,IAAI,CAAC,4BAA4B;IAC5C;IAEA,IAAW,2BAA2B,CAAC,KAAwB,EAAA;AAC3D,QAAA,IAAI,CAAC,4BAA4B,GAAG,KAAK;QACzC,IAAI,CAAC,aAAa,EAAE;IACxB;;;;;AAOA;;AAEG;IACa,QAAQ,GAAA;QACpB,KAAK,CAAC,QAAQ,EAAE;AAEhB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC7D,YAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;AACzC,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAG;YAClE,IAAI,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;AACzD,gBAAA,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;AAC9F,gBAAA,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE;oBACnB,IAAI,CAAC,gBAAgB,CAAC,qCAAqC,CACvD,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC9C;qBAAO;;;oBAGH,qBAAqB,CAAC,MAAK;wBACvB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU;AAC5C,4BAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;AAC3C,wBAAA,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE;4BACnB,IAAI,CAAC,gBAAgB,CAAC,qCAAqC,CACvD,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;wBAC9C;wBACA,IAAI,CAAC,aAAa,EAAE;AACxB,oBAAA,CAAC,CAAC;gBACN;YACJ;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAG;YACpE,IAAI,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;AACzD,gBAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACX,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;AAC7D,oBAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC1C;qBAAO;;AAEH,oBAAA,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAmB;AACxD,oBAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;wBAC1B,IAAI,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;AAC/E,4BAAA,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;wBAC5C;AACJ,oBAAA,CAAC,CAAC;;oBAEF,qBAAqB,CAAC,MAAK;AACvB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,qCAAqC,CAAC,qBAAqB,CAAC;wBAClF,IAAI,CAAC,aAAa,EAAE;AACxB,oBAAA,CAAC,CAAC;gBACN;YACJ;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YAC7D,IAAI,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;AACzD,gBAAA,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAmB;AACxD,gBAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;oBAC1B,IAAI,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;AAC/E,wBAAA,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;oBAC5C;AACJ,gBAAA,CAAC,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgD,CAAC,qCAAqC,CAAC,qBAAqB,CAAC;gBAChI,IAAI,CAAC,aAAa,EAAE;YACxB;AACJ,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;IACa,eAAe,GAAA;QAC3B,KAAK,CAAC,eAAe,EAAE;;;AAGvB,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACrF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY;AACjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE;AACzC,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC5B;IACJ;AAEA;;AAEG;IACa,kBAAkB,GAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ;QACxE;QACA,KAAK,CAAC,kBAAkB,EAAE;IAC9B;AAEgB,IAAA,qBAAqB,CAAC,MAAuB,EAAA;QACzD,OAAO,CAAC,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,KAAM,GAAG,IAAI,CAAC,cAAe,CAAC;IAChG;AAEA;;;;;;;AAOG;IACa,SAAS,GAAA;AACrB,QAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;AAC/B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAgB;IAClD;AAEA;;;;;;;;AAQG;IACa,WAAW,GAAA;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC;AACxB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAgB;IAClD;AAEA;;AAEG;AACa,IAAA,gBAAgB,CAAC,IAAwB,EAAA;QACrD,KAAK,CAAC,gBAAgB,EAAE;QACxB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE;;AAE5C,YAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC;YAC5D,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC5B;IACJ;;AAGA;;;;;;;;;;;;;;;AAeG;;IAEa,MAAM,CAAC,IAAS,EAAE,WAAiB,EAAA;AAC/C,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC;AAE5C,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;AAC1B,YAAA,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACjC,YAAA,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;AAC/B,SAAA,CAAC;QACF,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,aAAa,EAAE;IACxB;AAEA;;;;;;;;;;;;;;;;;;AAkBG;IACa,kBAAkB,CAAC,KAAa,EAAE,OAAiB,EAAA;QAC/D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;YAC7B,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;QAC9C;QACA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC;IACnD;AAEA;;AAEG;AACI,IAAA,UAAU,CAAC,OAAY,EAAE,QAAgB,EAAE,MAAgB,EAAA;QAC9D,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO;YACpG,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAO,CAAC;AAC/C,YAAA,UAAU,EAAE;AACR,gBAAA,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,YAAY,GAAG,SAAS;AAC3D,gBAAA,EAAE,EAAE;AACP,aAAA;YACD,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,KAAK,SAAS,GAAG,KAAK;AACnG,YAAA,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG;SACtD;IACL;AAEA;;;AAGG;AACa,IAAA,qBAAqB,CAAC,GAAQ,EAAA;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C;AAEA;;;AAGG;AACa,IAAA,cAAc,CAAC,GAAQ,EAAA;QACnC,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD;AAEA;;;;;;;AAOG;AACa,IAAA,eAAe,CAAC,UAAU,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAA;QAC/D,IAAI,MAAM,GAAU,EAAE;AAEtB,QAAA,MAAM,OAAO,GAAG,CAAC,MAAW,KAAI;AAC5B,YAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AAClB,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACjB;YACJ;AACA,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5B,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;AACtC,QAAA,MAAM,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3G,OAAO,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;IACrE;AAEA;;AAEG;AACa,IAAA,uBAAuB,CAAC,SAAkB,EAAA;AACtD,QAAA,MAAM,UAAU,GAAG,SAAS,EAAE,OAAO,IAAI,IAAI;AAC7C,QAAA,MAAM,GAAG,GAAG,EAAE,GAAG,UAAU,EAAE;AAC7B,QAAA,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,IAAI,EAAE;AACnC,QAAA,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE;AACtB,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;;YAEhC,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,KAAK,IAAI,CAAC,UAAU,EAAE;AAC5C,gBAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,UAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;YACpG;iBAAO;AACH,gBAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS;YAC7B;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;AAC7B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;AAChF,YAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI;AACpD,QAAA,IAAI,EAAE,KAAK,SAAS,EAAE;;AAElB,YAAA,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;QAC7B;AACA,QAAA,GAAG,CAAC,GAAG,GAAG,EAAE;QACZ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;AAC9B,QAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;IACxD;;AAGgB,IAAA,aAAa,CAAC,KAAU,EAAA;;;;AAIpC,QAAA,MAAM,IAAI,GAAgC;AACtC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAC/B,YAAA,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAC5B,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,KAAK,EAAE;SACV;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACb;QACJ;QAEA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE;AACzC,YAAA,MAAM,mBAAmB,GAAsB;AAC3C,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,OAAO,EAAE,MAAM;AACf,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,UAAU,EAAE,GAAG;AACf,gBAAA,MAAM,EAAE;aACX;AACD,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAC7C;AACA,QAAA,OAAO,MAAM;IACjB;AAEA;;;;;;;;AAQG;AACI,IAAA,aAAa,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AAC5C,YAAA,OAAO,SAAU;QACrB;AACA,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAChC;AAEA;;;;;;;;AAQG;AACI,IAAA,WAAW,CAAC,GAAQ,EAAA;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;AACjH,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;AACpE,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,kBAAmB,CAAC,MAAM,EAAE;AACvD,YAAA,OAAO,SAAU;QACrB;QACA,OAAO,IAAI,cAAc,CAAC,IAAW,EAAE,KAAK,EAAE,GAAG,CAAC;IACtD;AAEA;;;;AAIG;IACI,OAAO,GAAA;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpE;AAEA;;;;AAIG;IACI,QAAQ,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,YAAY,cAAc,CAAC;IACtE;AAEA;;;;;;;AAOG;AACH,IAAA,IAAW,aAAa,GAAA;QACpB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC;AACzE,aAAA,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC1C;AAEA;;;;;;;;;AASG;IACI,eAAe,CAAC,QAAgB,EAAE,WAAmB,EAAA;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AACxC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,WAAW,CAAC;QACpE,IAAI,GAAG,IAAI,GAAG,YAAY,cAAc,IAAI,MAAM,EAAE;YAChD,OAAO,IAAI,WAAW,CAAC,IAAW,EAAE,QAAQ,EAAE,MAAM,CAAC;QACzD;AACI,QAAA,OAAO,SAAU;IACzB;AAEA;;;;;;;;;;;AAWG;IACI,YAAY,CAAC,WAAgB,EAAE,WAAmB,EAAA;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;AACzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,WAAW,CAAC;AACpE,QAAA,IAAI,GAAG,IAAI,MAAM,EAAE;YACf,OAAO,IAAI,WAAW,CAAC,IAAW,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;QAC1D;AACI,QAAA,OAAO,SAAU;IACzB;IAEgB,MAAM,CAAC,KAAU,EAAE,KAAc,EAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACnC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;IAC1C;AAEgB,IAAA,QAAQ,CAAC,KAAU,EAAA;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACnC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACrC;;AAGO,IAAA,eAAe,CAAC,KAAU,EAAA;QAC7B,MAAM,IAAI,GAAU,EAAE;QACtB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAEpC,QAAA,OAAO,MAAO,CAAC,MAAM,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AAC7B,YAAA,MAAM,GAAG,MAAO,CAAC,MAAM;QAC3B;AAEA,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;IACzB;;AAGO,IAAA,SAAS,CAAC,MAAW,EAAA;QACxB,OAAO,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI;IAClD;;AAGgB,IAAA,oBAAoB,CAAC,EAAO,EAAA;QACxC,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC9E;AAEA;;AAEG;IACI,SAAS,CAAC,KAAa,EAAE,IAAU,EAAA;AACtC,QAAA,IAAI,GAAa;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAC/C,MAAM,GAAG,GAAQ,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;AAEjD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;AACxB,YAAA,GAAG,GAAG,IAAI,aAAa,CAAC,IAAW,EAAE,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC;QAC9D;AAEA,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACrC,YAAA,MAAM,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG;YAC1C,MAAM,OAAO,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS;AAC3C,YAAA,GAAG,GAAG,IAAI,cAAc,CAAC,IAAW,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QAClE;AAEA,QAAA,OAAO,GAAG;IACd;AAEmB,IAAA,kBAAkB,CAAC,IAAW,EAAA;AAC7C,QAAA,OAAO,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC;IACtF;AAEmB,IAAA,uBAAuB,CAAC,KAAuB,EAAA;QAC9D,IAAI,OAAO,GAAU,EAAE;QACvB,IAAI,KAAK,CAAC,MAAM,KAAK,sBAAsB,CAAC,IAAI,EAAE;AAC9C,YAAA,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE;YACvG,IAAI,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;AACzD,gBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACtC;QACJ;aAAO,IAAI,KAAK,CAAC,MAAM,KAAK,sBAAsB,CAAC,IAAI,EAAE;AACrD,YAAA,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE;YACpG,IAAI,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;AACzD,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,EAAE;AAC7C,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;AACvE,oBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC3C;qBAAO;AACH,oBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;gBACtC;YACJ;QACJ;AACA,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAChB,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC1B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YAChD;QACJ;AACA,QAAA,KAAK,CAAC,uBAAuB,CAAC,KAAK,CAAC;IACxC;AAEU,IAAA,qBAAqB,CAAC,GAAQ,EAAA;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzF;AAEA;;AAEG;IACgB,sBAAsB,GAAA;AACrC,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC;AAC7E,YAAA,CAAC,GAAG,IAAI,CAAC,uBAAuB;IACxC;AAEA;;AAEG;IACgB,QAAQ,CAAC,GAAiB,EAAE,MAAoB,EAAA;QAC/D,IAAI,cAAc,GAAG,KAAK;AAC1B,QAAA,IAAI,MAAwB;AAE5B,QAAA,IAAI,QAAQ,GAAG,CAAC,KAAK,QAAQ,EAAE;YAC3B,MAAM,OAAO,GAAG,GAAG;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAE;AAC1C,YAAA,IAAI,CAAC,OAAO,CAAC,qBAAsB,CAAC,MAAM,CAAC;AAE3C,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,yBAA0B,CAAC,OAAO,CAAC,OAAO,CAAC;AACjE,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;AAEhD,gBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;oBACpB,cAAc,GAAG,IAAI;AACrB,oBAAA,IAAI,CAAC,IAAI,GAAG,IAAI;gBACpB;YACJ;QACJ;QAEA,IAAI,cAAc,EAAE;AAChB,YAAA,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,MAAK;AAClE,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,uBAAuB,EAC7C,QAAQ,GAAG,CAAC,KAAK,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAChF,YAAA,CAAC,CAAC;QACN;aAAO;AACH,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,uBAAuB,EAC7C,QAAQ,GAAG,CAAC,KAAK,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChF;AAEA,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;IACrC;IAEmB,WAAW,CAAC,QAAgB,EAAE,KAAU,EAAA;QACvD,YAAY,CAAC,IAAI,CAAC,QAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjD;AAEA;;AAEG;AACgB,IAAA,WAAW,CAAC,UAAgC,EAAE,EAAA,GAA0B,IAAK,EAAA;AAC5F,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;;;YAGvB,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACxG,YAAA,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC;QAC9C;AACA,QAAA,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC;IACrC;AAEA;;AAEG;IACgB,kBAAkB,GAAA;QACjC,OAAO,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC;IAC5F;;AAGU,IAAA,kBAAkB,CAAC,MAAuB,EAAA;;;AAGhD,QAAA,OAAO,MAAM;IACjB;AAEA;;;;;AAKG;AACK,IAAA,gBAAgB,CAAC,QAAa,EAAA;QAClC,MAAM,gBAAgB,GAAU,EAAE;;;;QAIlC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChD,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,qBAAsB,CAAC,aAAc,EAAE,gBAAgB,CAAC;AACrE,QAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,YAAA,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC3D;IACJ;IAEQ,YAAY,CAAC,QAAe,EAAE,QAAa,EAAA;QAC/C,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;AACpC,YAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC1B,gBAAA,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ;YACrC;YACA,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAChC;AAAO,aAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YAC1B,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AACvC,YAAA,IAAI,UAAU,GAAG,MAAO,CAAC,IAAI;AAE7B,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;gBAClF,MAAM,IAAI,GAAG,EAAE;gBACf,OAAO,MAAM,EAAE;AACX,oBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACrB,oBAAA,MAAM,GAAG,MAAM,CAAC,MAAM;gBAC1B;AAEA,gBAAA,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI;AAC1B,gBAAA,IAAI,MAAW;AACf,gBAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACvC,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,oBAAA,MAAM,GAAG,UAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;oBAE1D,IAAI,CAAC,MAAM,EAAE;wBACT;oBACJ;AACA,oBAAA,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC1C;gBACA,IAAI,MAAM,EAAE;oBACR,UAAU,GAAG,MAAM;gBACvB;YACJ;AAEA,YAAA,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,QAAQ;QAC5C;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE;QAC1C,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,eAAe,EAAE;;AAEzD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;gBAC/C,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACnD,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3D;QACJ;IACJ;AAEQ,IAAA,0BAA0B,CAAC,IAAyB,EAAA;AACxD,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC3B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK;AAE3B,YAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACvD,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE9B,gBAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,IAAG;AAC3C,oBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;AACjC,oBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC;oBACrC,IAAI,CAAC,aAAa,EAAE;AACxB,gBAAA,CAAC,CAAC;YACN;QACJ;IACJ;AAEQ,IAAA,sBAAsB,CAAC,KAA2C,EAAE,GAAA,GAAuB,IAAK,EAAA;;QAEpG,qBAAqB,CAAC,MAAK;AACvB,YAAA,IAAI,GAAG,KAAK,IAAI,EAAE;AACd,gBAAA,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAE,KAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3F;AACA,YAAA,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE;gBAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgD,CAAC,qCAAqC,CACrG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CACxC;gBACD,IAAI,CAAC,aAAa,EAAE;YACxB;AACJ,QAAA,CAAC,CAAC;IACN;8GAr8BS,oBAAoB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAsDT,gBAAgB,CAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,SAAA,EAAA,EAAA,EAAA,SAAA,EA7GzB;YACP,kBAAkB;YAClB,wBAAwB;YACxB,qBAAqB;YACrB,wBAAwB;AACxB,YAAA,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AAC3E,YAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,qBAAqB,EAAE;AACnE,YAAA,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE;YAC7D,mBAAmB;YACnB,wBAAwB;YACxB,mBAAmB;YACnB;AACH,SAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA4Ia,+BAA+B,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAU,+BAA+B,kEAkBxE,uCAAuC,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAU,uCAAuC,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAZhE,WAAW,4HAMV,WAAW,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpStD,wjjBAskBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxbQ,OAAO,oFACP,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,6BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,oBAAoB,0DACpB,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,4BAA4B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,qBAAqB,wLACrB,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,0BAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,uBAAuB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,sBAAsB,mIACtB,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,+BAA+B,uGAC/B,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,kBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,0BAA0B,gEAC1B,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAiB7B,yBAAyB,8QAhBzB,wBAAwB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACxB,qBAAqB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACrB,qBAAqB,qDACrB,oBAAoB,EAAA,IAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACpB,kBAAkB,EAAA,IAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAClB,4BAA4B,EAAA,IAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAC5B,yBAAyB,sDACzB,sBAAsB,EAAA,IAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACtB,wBAAwB,EAAA,IAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACxB,qBAAqB,kDACrB,0BAA0B,EAAA,IAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAC1B,sBAAsB,EAAA,IAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACtB,+BAA+B,2DAC/B,qBAAqB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACrB,oBAAoB,EAAA,IAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACpB,oBAAoB,iDAEpB,wBAAwB,EAAA,IAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAInB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA5DhC,SAAS;sCACW,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,eAAe,iBAEV,iBAAiB,CAAC,IAAI,EAAA,SAAA,EAC1B;wBACP,kBAAkB;wBAClB,wBAAwB;wBACxB,qBAAqB;wBACrB,wBAAwB;AACxB,wBAAA,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AAC3E,wBAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,qBAAqB,EAAE;AACnE,wBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,sBAAsB,EAAE;wBAC7D,mBAAmB;wBACnB,wBAAwB;wBACxB,mBAAmB;wBACnB;qBACH,EAAA,OAAA,EACQ;wBACL,OAAO;wBACP,OAAO;wBACP,gBAAgB;wBAChB,yBAAyB;wBACzB,oBAAoB;wBACpB,0BAA0B;wBAC1B,4BAA4B;wBAC5B,qBAAqB;wBACrB,0BAA0B;wBAC1B,uBAAuB;wBACvB,sBAAsB;wBACtB,yBAAyB;wBACzB,kBAAkB;wBAClB,+BAA+B;wBAC/B,oBAAoB;wBACpB,kBAAkB;wBAClB,kBAAkB;wBAClB,0BAA0B;wBAC1B,gBAAgB;wBAChB,6BAA6B;wBAC7B,wBAAwB;wBACxB,qBAAqB;wBACrB,qBAAqB;wBACrB,oBAAoB;wBACpB,kBAAkB;wBAClB,4BAA4B;wBAC5B,yBAAyB;wBACzB,sBAAsB;wBACtB,wBAAwB;wBACxB,qBAAqB;wBACrB,0BAA0B;wBAC1B,sBAAsB;wBACtB,+BAA+B;wBAC/B,qBAAqB;wBACrB,oBAAoB;wBACpB,oBAAoB;wBACpB,yBAAyB;wBACzB;qBACH,EAAA,OAAA,EACQ,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,wjjBAAA,EAAA;;sBAgBhC;;sBAYA;;sBAeA;;sBAaA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAkBrC;;sBAMA,WAAW;uBAAC,WAAW;;sBAWvB,WAAW;uBAAC,SAAS;;sBACrB;;sBAOA,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,+BAA+B,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE;;sBAMvF,SAAS;uBAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;;sBAMhE,SAAS;uBAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;;sBAMjE,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,uCAAuC,EAAE,EAAE,IAAI,EAAE,uCAAuC,EAAE;;sBAgFvG;;sBA8CA;;sBAyBA;;;AE7bL,MAAM,iBAAiB,GAAG,mBAAmB;AAE7C;;;AAGG;AACH,MAAM,aAAa,CAAA;AAKlB;MAEY,oBAAoB,CAAA;AAGhC;AAEK,MAAO,yBAA0B,SAAQ,UAAU,CAAA;aACtC,IAAA,CAAA,SAAS,GAA8B,IAAK,CAAC;AAErD,IAAA,OAAO,QAAQ,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAyB,EAAE,CAAC;IAC/E;IAEmB,aAAa,CAAC,GAAQ,EAAE,GAAW,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAA;QAClF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;gBACxB,GAAG,CAAC,IAAI;AACR,gBAAA,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAC/B,GAAG,CAAC,IAAI;AAEZ,QAAA,OAAO,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC;IACzD;;AAGJ;MAKa,uBAAuB,CAAA;IAGzB,SAAS,CAAC,UAAiB,EACjB,mBAA0C,EAC1C,QAAgB,EAChB,YAAoB,EACpB,IAAc,EACd,YAAqC,EAAA;AAElD,QAAA,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,YAAA,OAAO,UAAU;QACrB;QAEA,IAAI,QAAQ,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,WAAW,EAAE,EAAE;AACzD,YAAA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC;QACvE;AAEA,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAEhB,MAAM,MAAM,GAAU,EAAE;QACxB,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,mBAAmB,CAAC;AAC5E,QAAA,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,QAAQ,EACzC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC;AAEvC,QAAA,OAAO,MAAM;IACjB;IAEQ,eAAe,CAAC,YAA6B,EAC7B,QAAgB,EAChB,YAAoB,EACpB,IAAW,EACX,YAAA,GAAuC,EAAE,EAAA;AAC7D,QAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;YACpC,MAAM,MAAM,GAAoB,EAAS;AACzC,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO;AAEnC,YAAA,MAAc,CAAC,YAAY,CAAC,GAAG,EAAE;AAElC,YAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;AACnC,gBAAA,MAAc,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;YAChF;AAEC,YAAA,MAAc,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAA,EAAA,EAAK,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG;AACjF,YAAA,MAAc,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE;AAC7E,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAEjB,YAAA,IAAI,WAAW,CAAC,MAAM,EAAE;AACpB,gBAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAC1D,MAAc,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;YACpD;iBAAO;AACF,gBAAA,MAAc,CAAC,YAAY,CAAC,GAAG,QAAQ;YAC5C;QACJ;IACJ;AAEQ,IAAA,eAAe,CAAC,KAAY,EAAE,mBAA0C,EAAE,KAAK,GAAG,CAAC,EAAA;AACvF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE3D,IAAI,KAAK,GAAG,CAAC,GAAG,mBAAmB,CAAC,MAAM,EAAE;AACzC,YAAA,KAAK,MAAM,aAAa,IAAI,GAAG,EAAE;AAC5B,gBAAA,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,GAAG,CAAC,CAAC;YACtG;QACJ;AAEA,QAAA,OAAO,GAAG;IACd;IAEQ,OAAO,CAAC,KAAY,EAAE,kBAAuC,EAAA;AACjE,QAAA,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC;QAC9C,MAAM,UAAU,GAAG,MAAM,EAAE,QAAQ,KAAK,kBAAkB,CAAC,IAAI;AAC3D,YAAA,MAAM,EAAE,QAAQ,KAAK,kBAAkB,CAAC,QAAQ;AAChD,YAAA,MAAM,EAAE,QAAQ,KAAK,kBAAkB,CAAC,IAAI;AAChD,QAAA,MAAM,GAAG,GAA4B,IAAI,GAAG,EAAsB;AAClE,QAAA,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;YACxB,MAAM,KAAK,GAAG;kBACR,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;AAC1F,kBAAE,MAAM,CAAC,GAAG,CAAC;YAEjB,IAAI,SAAS,GAAG,KAAK;AACrB,YAAA,IAAI,aAA4B;AAEhC,YAAA,IAAI,kBAAkB,CAAC,UAAU,EAAE;gBAC/B,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE;YAC/C;AACA,YAAA,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACpB,gBAAA,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAE;YACvC;iBAAO;AACH,gBAAA,aAAa,GAAG,IAAI,aAAa,EAAE;AACnC,gBAAA,aAAa,CAAC,GAAG,GAAG,GAAG;AACvB,gBAAA,aAAa,CAAC,KAAK,GAAG,KAAK;AAC3B,gBAAA,aAAa,CAAC,OAAO,GAAG,EAAE;AAC1B,gBAAA,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC;YACrC;AAEA,YAAA,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QACtC;QAEA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACnC;8GApGS,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAJnC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,kBAAkB;AACxB,oBAAA,UAAU,EAAE;AACf,iBAAA;;;AC8CD;AACO,MAAM,wBAAwB,GAAG;IACpC,oBAAoB;IACpB,+BAA+B;IAC/B,uBAAuB;IACvB,sBAAsB;IACtB,0BAA0B;IAC1B,uBAAuB;IACvB,0BAA0B;;IAE1B,eAAe;IACf,sBAAsB;IACtB,mCAAmC;IACnC,gCAAgC;IAChC,iCAAiC;IACjC,mCAAmC;IACnC,oCAAoC;IACpC,gCAAgC;IAChC,mCAAmC;IACnC,oCAAoC;IACpC,0BAA0B;IAC1B,6BAA6B;IAC7B,wBAAwB;IACxB,qBAAqB;;IAErB,8BAA8B;IAC9B,8BAA8B;IAC9B,2BAA2B;IAC3B,4BAA4B;;IAE5B,sBAAsB;IACtB,2BAA2B;IAC3B,yBAAyB;;IAEzB,8BAA8B;IAC9B,2BAA2B;IAC3B,wBAAwB;IACxB,+BAA+B;IAC/B,8BAA8B;IAC9B,8BAA8B;IAC9B,8BAA8B;IAC9B,wCAAwC;IACxC,kBAAkB;IAClB,uBAAuB;IACvB,wBAAwB;;IAExB,yBAAyB;IACzB,wBAAwB;IACxB,yBAAyB;;IAEzB,uBAAuB;IACvB,8BAA8B;IAC9B,wBAAwB;;IAExB,mBAAmB;IACnB,qBAAqB;IACrB,8BAA8B;IAC9B,wCAAwC;IACxC,uBAAuB;IACvB,+BAA+B;IAC/B,6BAA6B;IAC7B,8BAA8B;IAC9B,4BAA4B;IAC5B,uBAAuB;;IAEvB,mCAAmC;IACnC,4BAA4B;IAC5B,6BAA6B;IAC7B,6BAA6B;IAC7B,4BAA4B;IAC5B,+BAA+B;IAC/B,kCAAkC;IAClC,uCAAuC;IACvC,4BAA4B;IAC5B,4BAA4B;IAC5B,8CAA8C;IAC9C,8CAA8C;IAC9C,2CAA2C;;IAE3C,mCAAmC;IACnC,8BAA8B;IAC9B,8BAA8B;IAC9B,gCAAgC;IAChC,oCAAoC;IACpC,oCAAoC;IACpC,kCAAkC;;IAElC,qBAAqB;IACrB,0BAA0B;IAC1B,4BAA4B;IAC5B,4BAA4B;IAC5B;;AAGJ;;;AAGG;MASU,iBAAiB,CAAA;8GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAxG1B,oBAAoB;YACpB,+BAA+B;YAC/B,uBAAuB;YACvB,sBAAsB;YACtB,0BAA0B;YAC1B,uBAAuB;YACvB,0BAA0B;;YAE1B,eAAe;YACf,sBAAsB;YACtB,mCAAmC;YACnC,gCAAgC;YAChC,iCAAiC;YACjC,mCAAmC;YACnC,oCAAoC;YACpC,gCAAgC;YAChC,mCAAmC;YACnC,oCAAoC;YACpC,0BAA0B;YAC1B,6BAA6B;YAC7B,wBAAwB;YACxB,qBAAqB;;YAErB,8BAA8B;YAC9B,8BAA8B;YAC9B,2BAA2B;YAC3B,4BAA4B;;YAE5B,sBAAsB;YACtB,2BAA2B;YAC3B,yBAAyB;;YAEzB,8BAA8B;YAC9B,2BAA2B;YAC3B,wBAAwB;YACxB,+BAA+B;YAC/B,8BAA8B;YAC9B,8BAA8B;YAC9B,8BAA8B;YAC9B,wCAAwC;YACxC,kBAAkB;YAClB,uBAAuB;YACvB,wBAAwB;;YAExB,yBAAyB;YACzB,wBAAwB;YACxB,yBAAyB;;YAEzB,uBAAuB;YACvB,8BAA8B;YAC9B,wBAAwB;;YAExB,mBAAmB;YACnB,qBAAqB;YACrB,8BAA8B;YAC9B,wCAAwC;YACxC,uBAAuB;YACvB,+BAA+B;YAC/B,6BAA6B;YAC7B,8BAA8B;YAC9B,4BAA4B;YAC5B,uBAAuB;;YAEvB,mCAAmC;YACnC,4BAA4B;YAC5B,6BAA6B;YAC7B,6BAA6B;YAC7B,4BAA4B;YAC5B,+BAA+B;YAC/B,kCAAkC;YAClC,uCAAuC;YACvC,4BAA4B;YAC5B,4BAA4B;YAC5B,8CAA8C;YAC9C,8CAA8C;YAC9C,2CAA2C;;YAE3C,mCAAmC;YACnC,8BAA8B;YAC9B,8BAA8B;YAC9B,gCAAgC;YAChC,oCAAoC;YACpC,oCAAoC;YACpC,kCAAkC;;YAElC,qBAAqB;YACrB,0BAA0B;YAC1B,4BAA4B;YAC5B,4BAA4B;AAC5B,YAAA,qBAAqB,aAzFrB,oBAAoB;YACpB,+BAA+B;YAC/B,uBAAuB;YACvB,sBAAsB;YACtB,0BAA0B;YAC1B,uBAAuB;YACvB,0BAA0B;;YAE1B,eAAe;YACf,sBAAsB;YACtB,mCAAmC;YACnC,gCAAgC;YAChC,iCAAiC;YACjC,mCAAmC;YACnC,oCAAoC;YACpC,gCAAgC;YAChC,mCAAmC;YACnC,oCAAoC;YACpC,0BAA0B;YAC1B,6BAA6B;YAC7B,wBAAwB;YACxB,qBAAqB;;YAErB,8BAA8B;YAC9B,8BAA8B;YAC9B,2BAA2B;YAC3B,4BAA4B;;YAE5B,sBAAsB;YACtB,2BAA2B;YAC3B,yBAAyB;;YAEzB,8BAA8B;YAC9B,2BAA2B;YAC3B,wBAAwB;YACxB,+BAA+B;YAC/B,8BAA8B;YAC9B,8BAA8B;YAC9B,8BAA8B;YAC9B,wCAAwC;YACxC,kBAAkB;YAClB,uBAAuB;YACvB,wBAAwB;;YAExB,yBAAyB;YACzB,wBAAwB;YACxB,yBAAyB;;YAEzB,uBAAuB;YACvB,8BAA8B;YAC9B,wBAAwB;;YAExB,mBAAmB;YACnB,qBAAqB;YACrB,8BAA8B;YAC9B,wCAAwC;YACxC,uBAAuB;YACvB,+BAA+B;YAC/B,6BAA6B;YAC7B,8BAA8B;YAC9B,4BAA4B;YAC5B,uBAAuB;;YAEvB,mCAAmC;YACnC,4BAA4B;YAC5B,6BAA6B;YAC7B,6BAA6B;YAC7B,4BAA4B;YAC5B,+BAA+B;YAC/B,kCAAkC;YAClC,uCAAuC;YACvC,4BAA4B;YAC5B,4BAA4B;YAC5B,8CAA8C;YAC9C,8CAA8C;YAC9C,2CAA2C;;YAE3C,mCAAmC;YACnC,8BAA8B;YAC9B,8BAA8B;YAC9B,gCAAgC;YAChC,oCAAoC;YACpC,oCAAoC;YACpC,kCAAkC;;YAElC,qBAAqB;YACrB,0BAA0B;YAC1B,4BAA4B;YAC5B,4BAA4B;YAC5B,qBAAqB,CAAA,EAAA,CAAA,CAAA;AAeZ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAxG1B,oBAAoB;YACpB,+BAA+B;YAQ/B,sBAAsB;YACtB,mCAAmC;;YAanC,8BAA8B;YAC9B,8BAA8B;YAE9B,4BAA4B;;YAE5B,sBAAsB;YACtB,2BAA2B;YAC3B,yBAAyB;YAUzB,kBAAkB;YAClB,uBAAuB;YACvB,wBAAwB;;YAExB,yBAAyB;YAUzB,8BAA8B;YAC9B,wCAAwC;YACxC,uBAAuB;YACvB,+BAA+B;YAC/B,6BAA6B;YAC7B,8BAA8B;YAC9B,4BAA4B;;YAG5B,mCAAmC;YACnC,4BAA4B;YAC5B,6BAA6B;YAC7B,6BAA6B;YAC7B,4BAA4B;YAC5B,+BAA+B;YAC/B,kCAAkC;YAClC,uCAAuC;YACvC,4BAA4B;YAC5B,4BAA4B;;YAa5B,qBAAqB;YACrB,0BAA0B;YAC1B,4BAA4B,CAAA,EAAA,CAAA,CAAA;;2FAiBnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE;AACL,wBAAA,GAAG;AACN,qBAAA;AACD,oBAAA,OAAO,EAAE;AACL,wBAAA,GAAG;AACN;AACJ,iBAAA;;;ACnMD;;AAEG;;;;"}