{"version":3,"file":"rxap-data-source-table-tree.mjs","sources":["../../../../../packages/angular/data-source/table/tree/src/lib/tree-table.data-source.ts","../../../../../packages/angular/data-source/table/tree/src/index.ts","../../../../../packages/angular/data-source/table/tree/src/rxap-data-source-table-tree.ts"],"sourcesContent":["import { SelectionModel } from '@angular/cdk/collections';\nimport {\n  Inject,\n  Injectable,\n  InjectionToken,\n  isDevMode,\n  OnDestroy,\n  Optional,\n} from '@angular/core';\nimport {\n  BaseDataSourceViewer,\n  RXAP_DATA_SOURCE_METADATA,\n} from '@rxap/data-source';\nimport { PaginatorLike } from '@rxap/data-source/pagination';\nimport {\n  AbstractTableDataSource,\n  FilterLike,\n  RXAP_TABLE_DATA_SOURCE_FILTER,\n  RXAP_TABLE_DATA_SOURCE_PAGINATOR,\n  RXAP_TABLE_DATA_SOURCE_PARAMETERS,\n  RXAP_TABLE_DATA_SOURCE_SORT,\n  SortLike,\n  TableDataSourceMetadata,\n  TableEvent,\n} from '@rxap/data-source/table';\nimport {\n  ExpandNodeFunction,\n  Node,\n} from '@rxap/data-structure-tree';\nimport { Method } from '@rxap/pattern';\nimport '@rxap/rxjs';\nimport {\n  equals,\n  joinPath,\n  WithChildren,\n  WithIdentifier,\n} from '@rxap/utilities';\nimport {\n  BehaviorSubject,\n  combineLatest,\n  Observable,\n  of,\n  share,\n  Subject,\n  Subscription,\n} from 'rxjs';\nimport {\n  debounceTime,\n  distinctUntilChanged,\n  map,\n  skip,\n  startWith,\n  switchMap,\n  tap,\n} from 'rxjs/operators';\nimport { RowDataWithNode } from './row-data-with-node';\n\nexport const RXAP_TREE_TABLE_DATA_SOURCE_ROOT_METHOD =\n  new InjectionToken('rxap/tree/data-source/root-method');\nexport const RXAP_TREE_TABLE_DATA_SOURCE_CHILDREN_METHOD =\n  new InjectionToken('rxap/tree/data-source/children-method');\n\nexport type TreeTableEvent = Omit<TableEvent, 'start' | 'end'>;\n\nexport interface FilterQuery {\n  column: string;\n  filter: string;\n}\n\n@Injectable()\nexport class TreeTableDataSource<RowData extends WithIdentifier & WithChildren,\n  Parameters = any>\n  extends AbstractTableDataSource<RowDataWithNode<RowData>, Parameters>\n  implements OnDestroy {\n  public tree$ = new BehaviorSubject<Array<Node<RowData>>>([]);\n\n  public expanded!: SelectionModel<string>;\n  public override _data$                                         = new Subject<Array<RowDataWithNode<RowData>>>();\n  private _expandedLocalStorageSubscription: Subscription | null = null;\n  private _subscription?: Subscription;\n\n  constructor(\n    @Inject(RXAP_TREE_TABLE_DATA_SOURCE_ROOT_METHOD)\n    public readonly rootMethod: Method<RowData | RowData[], TreeTableEvent>,\n    @Inject(RXAP_TREE_TABLE_DATA_SOURCE_CHILDREN_METHOD)\n    public readonly childrenMethod: Method<RowData[], { node: Node<RowData>, event: TreeTableEvent }>,\n    @Optional()\n    @Inject(RXAP_TABLE_DATA_SOURCE_PAGINATOR)\n      paginator: PaginatorLike | null           = null,\n    @Optional()\n    @Inject(RXAP_TABLE_DATA_SOURCE_SORT)\n      sort: SortLike | null                     = null,\n    @Optional()\n    @Inject(RXAP_TABLE_DATA_SOURCE_FILTER)\n      filter: FilterLike | null                 = null,\n    @Optional()\n    @Inject(RXAP_TABLE_DATA_SOURCE_PARAMETERS)\n      parameters: Observable<Parameters> | null = null,\n    @Optional()\n    @Inject(RXAP_DATA_SOURCE_METADATA)\n      metadata: TableDataSourceMetadata | null  = rootMethod.metadata,\n  ) {\n    super(\n      paginator,\n      sort,\n      filter,\n      parameters,\n      metadata ?? rootMethod.metadata ?? {id: 'tree-table-data-source'},\n    );\n    this.tree$\n      .pipe(\n        debounceTime(100),\n        map((tree) =>\n          tree\n            .map((child) => this.flatTree(child))\n            .reduce((acc, nodes) => [ ...acc, ...nodes ], []),\n        ),\n        map((flatTree) =>\n          flatTree.map((node) => ({\n            ...node.item,\n            __node: node,\n          })),\n        ),\n      )\n      .subscribe(this._data$);\n    this.initExpanded();\n  }\n\n  public override init() {\n    if (this._initialised) {\n      return;\n    }\n    super.init();\n    this.getTreeRoot();\n    // TODO : workaround the handle parameters change\n    if (this.parameters) {\n      this._subscription = this.parameters\n        .pipe(\n          distinctUntilChanged((a, b) => equals(a, b)),\n          skip(1),\n          tap(() => this.refresh()),\n        )\n        .subscribe();\n    }\n  }\n\n  public async getTreeRoot(event: TreeTableEvent = {}): Promise<void> {\n    this.loading$.next(true);\n    this.hasError$.disable();\n\n    const root: RowData | RowData[] = await this.getRoot(event).catch((error) => {\n      this.hasError$.enable();\n      throw new Error(`Failed to load root nodes: ${ error.message }`);\n    });\n\n    let rootNode: Array<Node<RowData>> = [];\n\n    if (Array.isArray(root)) {\n      for (const node of root) {\n        rootNode.push(await this._toNode(node));\n      }\n    } else {\n      rootNode = [ await this._toNode(root) ];\n      if (!rootNode[0].expanded) {\n        await rootNode[0].expand();\n      }\n    }\n\n    this.loading$.next(false);\n\n    this.tree$.next(rootNode);\n  }\n\n  public async getChildren(node: Node<RowData>, event: TreeTableEvent): Promise<RowData[]> {\n    return this.childrenMethod.call({node, event});\n  }\n\n  public async getRoot(event: TreeTableEvent): Promise<RowData | RowData[]> {\n    return this.rootMethod.call(event);\n  }\n\n  public collapseNode(node: Node<RowData>): Promise<void> {\n    this.expanded.deselect(node.id);\n    this.tree$.next(this.tree$.value);\n    return Promise.resolve();\n  }\n\n  public async _toNode(\n    row: RowData,\n    depth                                   = 0,\n    onExpand: ExpandNodeFunction<RowData>   = this.expandNode.bind(this),\n    onCollapse: ExpandNodeFunction<RowData> = this.collapseNode.bind(this),\n  ): Promise<Node<RowData>> {\n    const node = await this.toNode(row, depth, onExpand, onCollapse);\n\n    if (this.expanded.isSelected(node.id) && !node.expanded) {\n      await node\n        .expand()\n        .then(() =>\n          console.debug(`Restore expand for node '${ node.id }' SUCCESSFULLY`),\n        )\n        .catch(() =>\n          console.debug(`Restore expand for node '${ node.id }' FAILED`),\n        );\n    }\n\n    for (const child of node.children) {\n      if (this.expanded.isSelected(child.id) && !child.expanded) {\n        await child\n          .expand()\n          .then(() =>\n            console.debug(\n              `Restore expand for child node '${ child.id }' SUCCESSFULLY`,\n            ),\n          )\n          .catch(() =>\n            console.debug(`Restore expand for child node '${ child.id }' FAILED`),\n          );\n      }\n    }\n\n    return node;\n  }\n\n  public async expandNode(node: Node<RowData>): Promise<void> {\n    if (node.item.hasChildren && !node.item.children?.length) {\n      // TODO : get treeTableEvent from paginator, sort and filter\n      const children: RowData[] = await this.getChildren(node, {}).catch((error) => {\n        this.hasError$.enable();\n        throw new Error(`Failed to load children nodes for '${ node.id }': ${ error.message }`);\n      });\n\n      node.item.children = children;\n\n      const addChildren: Array<Node<RowData>> = [];\n\n      for (const child of children) {\n        const addChild = await this._toNode(\n          child,\n          node.depth +\n          1,\n          node.onExpand,\n          node.onCollapse,\n        );\n        addChildren.push(addChild);\n      }\n\n      node.addChildren(addChildren);\n    }\n\n    this.expanded.select(node.id);\n\n    this.tree$.next(this.tree$.value);\n  }\n\n  public toNode(\n    row: RowData,\n    depth                                   = 0,\n    onExpand: ExpandNodeFunction<RowData>   = this.expandNode.bind(this),\n    onCollapse: ExpandNodeFunction<RowData> = this.collapseNode.bind(this),\n  ): Node<RowData> | Promise<Node<RowData>> {\n    return Node.ToNode(null, row, depth, onExpand, onCollapse);\n  }\n\n  public override ngOnDestroy() {\n    super.ngOnDestroy();\n    this._expandedLocalStorageSubscription?.unsubscribe();\n    this._subscription?.unsubscribe();\n  }\n\n  public flatTree(tree: Node<RowData>): Array<Node<RowData>> {\n    function flat(acc: any[], list: any[]) {\n      return [ ...acc, ...list ];\n    }\n\n    function flatTree(node: Node<RowData>): Array<Node<RowData>> {\n      if (!Array.isArray(node.children)) {\n        if (isDevMode()) {\n          console.log(node);\n        }\n        throw new Error('Node has not defined children');\n      }\n\n      if (node.expanded) {\n        return [\n          node,\n          ...node.children.map((child) => flatTree(child)).reduce(flat, []),\n        ];\n      } else {\n        return [ node ];\n      }\n    }\n\n    return flatTree(tree);\n  }\n\n  public override retry() {\n    return this.getTreeRoot();\n  }\n\n  public override refresh(): any {\n    return this.getTreeRoot();\n  }\n\n  isMatchingFilter(item: RowDataWithNode<RowData>, filterList: Array<FilterQuery>): boolean {\n    for (const filter of filterList) {\n      const value = (item as any)[filter.column] as any;\n      if (value === filter.filter) {\n        return true;\n      }\n      if (typeof value === 'string' && typeof filter.filter === 'string') {\n        return value.toLowerCase().includes(filter.filter.toLowerCase());\n      }\n    }\n    return false;\n  }\n\n  hasMatchingNodesByFilter(\n    nodeList: ReadonlyArray<Node<any>>,\n    filterList: Array<FilterQuery>,\n  ): boolean {\n\n    if (!filterList.length) {\n      return true;\n    }\n\n    return nodeList.some((node) => {\n\n      if (this.isMatchingFilter(node.item, filterList)) {\n        return true;\n      }\n\n      if (!node.hasChildren) {\n        // If item has no children and doesn't pass the filter, remove it\n        return false;\n      }\n\n      return this.hasMatchingNodesByFilter(node.children ?? [], filterList);\n    });\n  }\n\n  override applyFilterBy(\n    data: ReadonlyArray<RowDataWithNode<RowData>>,\n    filter: Record<string, any> | string,\n  ): RowDataWithNode<RowData>[] {\n    const filterList = typeof filter === 'string' ?\n      [] :\n                       Object.entries(filter).map(([ column, filter ]) => ({column, filter}));\n    if (!filterList.length ||\n        filterList.every((filter) => !filter.filter && filter.filter !== false && filter.filter !== 0)) {\n      return data.slice();\n    }\n\n    return data.filter(item => {\n\n      if (this.isMatchingFilter(item, filterList)) {\n        return true;\n      }\n\n      const hasMatch = this.hasMatchingNodesByFilter(item.__node.children, filterList);\n\n      if (hasMatch) {\n        item.__node.expand();\n      }\n\n      return hasMatch;\n\n    });\n\n  }\n\n  protected override _connect(\n    viewer: BaseDataSourceViewer,\n  ): Observable<Array<RowDataWithNode<RowData>>> {\n    this.init();\n    return this._data$.pipe(\n      tap((data) => this.updateTotalLength(data.length)),\n      distinctUntilChanged((a, b) => {\n        if (a.length !== b.length) {\n          return false;\n        }\n        if (!equals(a.map(item => item.__node.id), b.map(item => item.__node.id))) {\n          return false;\n        }\n        return equals(a.map(item => item.__node.item).map(item => ({ ...item, children: null })), b.map(item => item.__node.item).map(item => ({ ...item, children: null })));\n      }),\n      switchMap((data) => {\n        return combineLatest([\n          this.paginator?.page?.pipe(\n            startWith({\n              pageIndex: this.paginator.pageIndex,\n              pageSize: this.paginator.pageSize,\n              length: this.paginator.length,\n            }),\n          ) ?? of(null),\n          this.sort?.sortChange?.pipe(\n            startWith({\n              active: this.sort?.active,\n              direction: this.sort?.direction,\n            }),\n          ) ?? of(null),\n          this.filter?.change.pipe(startWith({})) ?? of(null),\n        ]).pipe(\n          map(([ page, sort, filter ]) => ({\n            page,\n            sort,\n            filter,\n          })),\n          debounceTime(500),\n          distinctUntilChanged((a, b) => equals(a, b)),\n          map((event) => {\n            const {page, sort, filter} = event;\n            let filteredData           = data;\n\n            if (filter) {\n              filteredData = this.applyFilterBy(filteredData, filter);\n            }\n\n            let sortData = filteredData;\n\n            if (sort) {\n              sortData = this.applySortBy(\n                sortData,\n                sort.active,\n                sort.direction,\n              );\n            }\n\n            if (page) {\n              return this.applyPagination(\n                sortData,\n                page.pageSize,\n                page.pageIndex,\n              );\n            }\n\n            return sortData;\n          }),\n        );\n      }),\n      share(),\n    );\n  }\n\n  private initExpanded(): void {\n    const key    = joinPath('rxap/table-system/tree-table', this.id, 'expanded');\n    let expanded = [];\n    if (localStorage.getItem(key)) {\n      try {\n        expanded = JSON.parse(localStorage.getItem(key)!);\n      } catch (e: any) {\n        console.debug('parse expanded tree table data source nodes failed');\n      }\n    }\n\n    this.expanded                          = new SelectionModel<string>(true, expanded);\n    this._expandedLocalStorageSubscription = this.expanded.changed\n      .pipe(\n        tap(() =>\n          localStorage.setItem(key, JSON.stringify(this.expanded.selected)),\n        ),\n      )\n      .subscribe();\n  }\n}\n","// region \nexport * from './lib/row-data-with-node';\nexport * from './lib/tree-table.data-source';\n// endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;MAyDa,uCAAuC,GAClD,IAAI,cAAc,CAAC,mCAAmC;MAC3C,2CAA2C,GACtD,IAAI,cAAc,CAAC,uCAAuC;AAUtD,MAAO,mBAEX,SAAQ,uBAA6D,CAAA;AASrE,IAAA,WAAA,CAEkB,UAAuD,EAEvD,cAAiF,EAG/F,SAA4C,GAAA,IAAI,EAGhD,IAA4C,GAAA,IAAI,EAGhD,MAA4C,GAAA,IAAI,EAGhD,UAA4C,GAAA,IAAI,EAGhD,QAA4C,GAAA,UAAU,CAAC,QAAQ,EAAA;QAEjE,KAAK,CACH,SAAS,EACT,IAAI,EACJ,MAAM,EACN,UAAU,EACV,QAAQ,IAAI,UAAU,CAAC,QAAQ,IAAI,EAAC,EAAE,EAAE,wBAAwB,EAAC,CAClE;QAzBe,IAAU,CAAA,UAAA,GAAV,UAAU;QAEV,IAAc,CAAA,cAAA,GAAd,cAAc;AAXzB,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,eAAe,CAAuB,EAAE,CAAC;AAG5C,QAAA,IAAA,CAAA,MAAM,GAA2C,IAAI,OAAO,EAAmC;QACvG,IAAiC,CAAA,iCAAA,GAAwB,IAAI;AA+BnE,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,YAAY,CAAC,GAAG,CAAC,EACjB,GAAG,CAAC,CAAC,IAAI,KACP;AACG,aAAA,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnC,aAAA,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,CAAE,GAAG,GAAG,EAAE,GAAG,KAAK,CAAE,EAAE,EAAE,CAAC,CACpD,EACD,GAAG,CAAC,CAAC,QAAQ,KACX,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;YACtB,GAAG,IAAI,CAAC,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;SACb,CAAC,CAAC,CACJ;AAEF,aAAA,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE;;IAGL,IAAI,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB;;QAEF,KAAK,CAAC,IAAI,EAAE;QACZ,IAAI,CAAC,WAAW,EAAE;;AAElB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AACvB,iBAAA,IAAI,CACH,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC5C,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;AAE1B,iBAAA,SAAS,EAAE;;;AAIX,IAAA,MAAM,WAAW,CAAC,KAAA,GAAwB,EAAE,EAAA;AACjD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AAExB,QAAA,MAAM,IAAI,GAAwB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AAC1E,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,CAAA,2BAAA,EAA+B,KAAK,CAAC,OAAQ,CAAE,CAAA,CAAC;AAClE,SAAC,CAAC;QAEF,IAAI,QAAQ,GAAyB,EAAE;AAEvC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;gBACvB,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;;aAEpC;YACL,QAAQ,GAAG,CAAE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAE;YACvC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;AACzB,gBAAA,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;;;AAI9B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAEzB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAGpB,IAAA,MAAM,WAAW,CAAC,IAAmB,EAAE,KAAqB,EAAA;AACjE,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC;;IAGzC,MAAM,OAAO,CAAC,KAAqB,EAAA;QACxC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;AAG7B,IAAA,YAAY,CAAC,IAAmB,EAAA;QACrC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACjC,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;IAGnB,MAAM,OAAO,CAClB,GAAY,EACZ,KAAK,GAAqC,CAAC,EAC3C,QAA0C,GAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EACpE,UAA0C,GAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAA;AAEtE,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC;AAEhE,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AACvD,YAAA,MAAM;AACH,iBAAA,MAAM;AACN,iBAAA,IAAI,CAAC,MACJ,OAAO,CAAC,KAAK,CAAC,CAAA,yBAAA,EAA6B,IAAI,CAAC,EAAG,CAAA,cAAA,CAAgB,CAAC;AAErE,iBAAA,KAAK,CAAC,MACL,OAAO,CAAC,KAAK,CAAC,CAAA,yBAAA,EAA6B,IAAI,CAAC,EAAG,CAAU,QAAA,CAAA,CAAC,CAC/D;;AAGL,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjC,YAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACzD,gBAAA,MAAM;AACH,qBAAA,MAAM;AACN,qBAAA,IAAI,CAAC,MACJ,OAAO,CAAC,KAAK,CACX,CAAA,+BAAA,EAAmC,KAAK,CAAC,EAAG,CAAA,cAAA,CAAgB,CAC7D;AAEF,qBAAA,KAAK,CAAC,MACL,OAAO,CAAC,KAAK,CAAC,CAAA,+BAAA,EAAmC,KAAK,CAAC,EAAG,CAAU,QAAA,CAAA,CAAC,CACtE;;;AAIP,QAAA,OAAO,IAAI;;IAGN,MAAM,UAAU,CAAC,IAAmB,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;;AAExD,YAAA,MAAM,QAAQ,GAAc,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AAC3E,gBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AACvB,gBAAA,MAAM,IAAI,KAAK,CAAC,CAAA,mCAAA,EAAuC,IAAI,CAAC,EAAG,CAAA,GAAA,EAAO,KAAK,CAAC,OAAQ,CAAA,CAAE,CAAC;AACzF,aAAC,CAAC;AAEF,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ;YAE7B,MAAM,WAAW,GAAyB,EAAE;AAE5C,YAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;gBAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CACjC,KAAK,EACL,IAAI,CAAC,KAAK;oBACV,CAAC,EACD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,UAAU,CAChB;AACD,gBAAA,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAG5B,YAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;;QAG/B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAE7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;IAG5B,MAAM,CACX,GAAY,EACZ,KAAK,GAAqC,CAAC,EAC3C,QAAA,GAA0C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EACpE,UAA0C,GAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAA;AAEtE,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC;;IAG5C,WAAW,GAAA;QACzB,KAAK,CAAC,WAAW,EAAE;AACnB,QAAA,IAAI,CAAC,iCAAiC,EAAE,WAAW,EAAE;AACrD,QAAA,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;;AAG5B,IAAA,QAAQ,CAAC,IAAmB,EAAA;AACjC,QAAA,SAAS,IAAI,CAAC,GAAU,EAAE,IAAW,EAAA;AACnC,YAAA,OAAO,CAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAE;;QAG5B,SAAS,QAAQ,CAAC,IAAmB,EAAA;YACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACjC,IAAI,SAAS,EAAE,EAAE;AACf,oBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;;AAEnB,gBAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;;AAGlD,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,OAAO;oBACL,IAAI;oBACJ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;iBAClE;;iBACI;gBACL,OAAO,CAAE,IAAI,CAAE;;;AAInB,QAAA,OAAO,QAAQ,CAAC,IAAI,CAAC;;IAGP,KAAK,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;;IAGX,OAAO,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;;IAG3B,gBAAgB,CAAC,IAA8B,EAAE,UAA8B,EAAA;AAC7E,QAAA,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;YAC/B,MAAM,KAAK,GAAI,IAAY,CAAC,MAAM,CAAC,MAAM,CAAQ;AACjD,YAAA,IAAI,KAAK,KAAK,MAAM,CAAC,MAAM,EAAE;AAC3B,gBAAA,OAAO,IAAI;;AAEb,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;AAClE,gBAAA,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;;;AAGpE,QAAA,OAAO,KAAK;;IAGd,wBAAwB,CACtB,QAAkC,EAClC,UAA8B,EAAA;AAG9B,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACtB,YAAA,OAAO,IAAI;;AAGb,QAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;YAE5B,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE;AAChD,gBAAA,OAAO,IAAI;;AAGb,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;AAErB,gBAAA,OAAO,KAAK;;AAGd,YAAA,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,UAAU,CAAC;AACvE,SAAC,CAAC;;IAGK,aAAa,CACpB,IAA6C,EAC7C,MAAoC,EAAA;AAEpC,QAAA,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,QAAQ;AAC3C,YAAA,EAAE;YACe,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,MAAM,EAAE,MAAM,CAAE,MAAM,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC,CAAC;QACzF,IAAI,CAAC,UAAU,CAAC,MAAM;YAClB,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;AAClG,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE;;AAGrB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,IAAG;YAExB,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE;AAC3C,gBAAA,OAAO,IAAI;;AAGb,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;YAEhF,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;;AAGtB,YAAA,OAAO,QAAQ;AAEjB,SAAC,CAAC;;AAIe,IAAA,QAAQ,CACzB,MAA4B,EAAA;QAE5B,IAAI,CAAC,IAAI,EAAE;AACX,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAClD,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YAC5B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE;AACzB,gBAAA,OAAO,KAAK;;AAEd,YAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;AACzE,gBAAA,OAAO,KAAK;;AAEd,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvK,SAAC,CAAC,EACF,SAAS,CAAC,CAAC,IAAI,KAAI;AACjB,YAAA,OAAO,aAAa,CAAC;gBACnB,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CACxB,SAAS,CAAC;AACR,oBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;AACnC,oBAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;AACjC,oBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;AAC9B,iBAAA,CAAC,CACH,IAAI,EAAE,CAAC,IAAI,CAAC;gBACb,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CACzB,SAAS,CAAC;AACR,oBAAA,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM;AACzB,oBAAA,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS;AAChC,iBAAA,CAAC,CACH,IAAI,EAAE,CAAC,IAAI,CAAC;AACb,gBAAA,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;AACpD,aAAA,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAE,MAAM;gBAC/B,IAAI;gBACJ,IAAI;gBACJ,MAAM;AACP,aAAA,CAAC,CAAC,EACH,YAAY,CAAC,GAAG,CAAC,EACjB,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC5C,GAAG,CAAC,CAAC,KAAK,KAAI;gBACZ,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAC,GAAG,KAAK;gBAClC,IAAI,YAAY,GAAa,IAAI;gBAEjC,IAAI,MAAM,EAAE;oBACV,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC;;gBAGzD,IAAI,QAAQ,GAAG,YAAY;gBAE3B,IAAI,IAAI,EAAE;AACR,oBAAA,QAAQ,GAAG,IAAI,CAAC,WAAW,CACzB,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CACf;;gBAGH,IAAI,IAAI,EAAE;AACR,oBAAA,OAAO,IAAI,CAAC,eAAe,CACzB,QAAQ,EACR,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,CACf;;AAGH,gBAAA,OAAO,QAAQ;aAChB,CAAC,CACH;AACH,SAAC,CAAC,EACF,KAAK,EAAE,CACR;;IAGK,YAAY,GAAA;AAClB,QAAA,MAAM,GAAG,GAAM,QAAQ,CAAC,8BAA8B,EAAE,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC;QAC5E,IAAI,QAAQ,GAAG,EAAE;AACjB,QAAA,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC7B,YAAA,IAAI;AACF,gBAAA,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC;;YACjD,OAAO,CAAM,EAAE;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC;;;QAIvE,IAAI,CAAC,QAAQ,GAA4B,IAAI,cAAc,CAAS,IAAI,EAAE,QAAQ,CAAC;AACnF,QAAA,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC,QAAQ,CAAC;aACpD,IAAI,CACH,GAAG,CAAC,MACF,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAClE;AAEF,aAAA,SAAS,EAAE;;AAxYL,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,EAYpB,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,uCAAuC,EAEvC,EAAA,EAAA,KAAA,EAAA,2CAA2C,EAG3C,EAAA,EAAA,KAAA,EAAA,gCAAgC,EAGhC,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,2BAA2B,EAG3B,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,6BAA6B,EAG7B,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,iCAAiC,6BAGjC,yBAAyB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHA7BxB,mBAAmB,EAAA,CAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;0BAaI,MAAM;2BAAC,uCAAuC;;0BAE9C,MAAM;2BAAC,2CAA2C;;0BAElD;;0BACA,MAAM;2BAAC,gCAAgC;;0BAEvC;;0BACA,MAAM;2BAAC,2BAA2B;;0BAElC;;0BACA,MAAM;2BAAC,6BAA6B;;0BAEpC;;0BACA,MAAM;2BAAC,iCAAiC;;0BAExC;;0BACA,MAAM;2BAAC,yBAAyB;;;ACnGrC;AAGA;;ACHA;;AAEG;;;;"}