{"version":3,"file":"guajiritos-general-autocomplete.mjs","sources":["../../../projects/guachos-general-autocomplete/src/utils/constants/constants.ts","../../../projects/guachos-general-autocomplete/src/utils/services/utils.service.ts","../../../projects/guachos-general-autocomplete/src/utils/pipes/resolve-property-path.pipe.ts","../../../projects/guachos-general-autocomplete/src/lib/guachos-general-autocomplete.component.ts","../../../projects/guachos-general-autocomplete/src/lib/guachos-general-autocomplete.component.html","../../../projects/guachos-general-autocomplete/src/public-api.ts","../../../projects/guachos-general-autocomplete/src/guajiritos-general-autocomplete.ts"],"sourcesContent":["import { DisplayOption, DisplayOptionItemType } from '@guajiritos/services';\n\n\nexport const GENERAL_DISPLAY_OPTIONS: DisplayOption = {\n    firthLabel: [\n        {\n            type: DisplayOptionItemType.PATH,\n            path: ['name']\n        }\n    ],\n    applyTranslate: true\n};\n\nexport interface ServiceConfig {\n    service: any;\n    method: string;\n    postBody: any;\n    searchProperty: string;\n    [key: string]: any;\n}\n","import {Injectable} from '@angular/core';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class UtilsService {\n    /**\n     * Resolves the value of a property in an object by providing a path.\n     *\n     * @param {any} obj - The object to traverse.\n     * @param {string[]} path - An array of strings representing the path to the desired property.\n     * @return {any} The value of the property at the given path, or null if the path is invalid.\n     */\n    public static resolvePropertyByPath(obj: any, path: string[]): any {\n        return path.reduce((prev, curr: string) => {\n            return prev ? prev[curr] : null;\n        }, obj || self);\n    }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { DisplayOptionItem, DisplayOptionItemType } from '@guajiritos/services';\n\nimport { UtilsService } from '../services/utils.service';\n\n@Pipe({\n  name: 'resolvePropertyPath',\n  standalone: true\n})\nexport class ResolvePropertyPath implements PipeTransform {\n  /**\n   * Transforms the given object based on the provided path and returns the transformed string.\n   *\n   * @param {any} obj - The object to be transformed.\n   * @param {DisplayOptionItem[]} path - The array of display option items used for transformation.\n   * @return {string} The transformed string.\n   */\n  transform(obj: any, path: DisplayOptionItem[]): string {\n    let result: string = '';\n\n    path?.forEach((item: DisplayOptionItem): void => {\n      if (item?.type === DisplayOptionItemType.DIVIDER) {\n        result += item?.divider;\n      } else {\n        if (item?.path) {\n          result += UtilsService.resolvePropertyByPath(obj, item.path);\n        }\n      }\n    });\n\n    return result;\n  }\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  Input,\n  NgZone,\n  Output,\n  signal,\n  TemplateRef,\n  ViewChild,\n  WritableSignal,\n} from \"@angular/core\";\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  NG_VALUE_ACCESSOR,\n  ReactiveFormsModule,\n  UntypedFormControl,\n  ValidationErrors,\n  ValidatorFn,\n  Validators,\n} from \"@angular/forms\";\nimport {\n  MatAutocomplete,\n  MatAutocompleteModule,\n  MatAutocompleteTrigger,\n} from \"@angular/material/autocomplete\";\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { ThemePalette } from \"@angular/material/core\";\nimport {\n  FloatLabelType,\n  MatFormFieldAppearance,\n  MatFormFieldModule,\n  SubscriptSizing,\n} from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\nimport { TranslateModule, TranslateService } from \"@ngx-translate/core\";\nimport {\n  debounceTime,\n  finalize,\n  Observable,\n  Subject,\n  from,\n  switchMap,\n  tap,\n  of,\n  catchError, takeUntil,\n} from \"rxjs\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\n\nimport {\n  ApiFormData,\n  AutocompleteService,\n  DisplayOption,\n  DisplayOptionItemType,\n  I18nPipe,\n  RestrictionFilter,\n} from \"@guajiritos/services\";\n\nimport {\n  GENERAL_DISPLAY_OPTIONS,\n  ServiceConfig,\n} from \"../utils/constants/constants\";\nimport { ResolvePropertyPath } from \"../utils/pipes/resolve-property-path.pipe\";\nimport { UtilsService } from \"../utils/services/utils.service\";\n\n@Component({\n  selector: \"guajiritos-general-autocomplete\",\n  templateUrl: \"./guachos-general-autocomplete.component.html\",\n  styleUrls: [\"./guachos-general-autocomplete.component.scss\"],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatFormFieldModule,\n    TranslateModule,\n    MatIconModule,\n    ReactiveFormsModule,\n    MatInputModule,\n    MatButtonModule,\n    MatProgressSpinnerModule,\n    MatAutocompleteModule,\n    I18nPipe,\n    ResolvePropertyPath,\n  ],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => GuajiritosGeneralAutocomplete),\n      multi: true,\n    },\n  ],\n})\nexport class GuajiritosGeneralAutocomplete\n  implements ControlValueAccessor, AfterViewInit\n{\n  constructor(\n    private _autocompleteService: AutocompleteService,\n    private _zone: NgZone,\n    private _destroyRef: DestroyRef,\n    public translateService: TranslateService,\n  ) {}\n\n  // --- Propiedades Privadas ---\n  private _isOptionSelected: boolean = false; // Indica si la última actualización del input fue por una selección explícita desde el autocompletado\n\n  private _userInteracted = false;\n  private _clearDataSubject: Subject<void> = new Subject<void>();\n  private _doFocusSubject: Subject<void> = new Subject<void>();\n  private _selectedElement: any = null; // Almacena el objeto completo seleccionado\n  private _url: string | null = null;\n  private _serviceConfig: ServiceConfig = null;\n  private _limit: number = 20;\n  private _offset: number = 0;\n  private _restrictionsFilters: RestrictionFilter[] = [];\n  private _lastSearchText: string = \"\"; // Almacena el texto usado en la última búsqueda de API exitosa\n\n  private _cancelPendingRequest$ = new Subject<void>();\n\n  // --- Señales Públicas (Signals) ---\n  public disabled: WritableSignal<boolean> = signal(false);\n  public loading: WritableSignal<boolean> = signal(false);\n  public required: WritableSignal<boolean> = signal(false);\n  public filteredOptions: WritableSignal<any[]> = signal([]);\n  public originalOptions: WritableSignal<any[]> = signal([]);\n  public notAllowedOption: WritableSignal<any> = signal(null);\n  public component: UntypedFormControl = new UntypedFormControl({\n    value: null,\n    disabled: false,\n  });\n  public hasMore: WritableSignal<boolean> = signal(true); // Indica si hay más datos para cargar\n\n  // --- ViewChildren ---\n  @ViewChild(\"inputText\", { static: true }) inputText!: ElementRef;\n  @ViewChild(\"auto\") matAutocomplete!: MatAutocomplete;\n  @ViewChild(MatAutocompleteTrigger)\n  autocompleteTrigger!: MatAutocompleteTrigger;\n\n  // --- Inputs ---\n  @Input() floatLabel: FloatLabelType = \"auto\";\n  @Input() color: ThemePalette = \"accent\";\n  @Input() appearance: MatFormFieldAppearance = \"outline\";\n  @Input() subscriptSizing: SubscriptSizing = \"dynamic\";\n  @Input() bodyRequest?: ApiFormData;\n  @Input() debounceTimeValue: number = 300;\n  @Input() detailsTemplate?: TemplateRef<any>;\n  @Input() label: string = \"Seleccione\";\n  @Input() showLabel: boolean = true;\n  @Input() placeholder: string = \"Seleccione un elemento\";\n  @Input() field: string[] = [\"name\"];\n  @Input() filterString: string[] | string = \"filter[$and][name][$like]\";\n  @Input() displayOptions: DisplayOption = GENERAL_DISPLAY_OPTIONS;\n  @Input() withoutPaddingBottom: boolean = true;\n  @Input() valueId: boolean = false;\n  @Input() showSuffix: boolean = false;\n  @Input() requireSelection: boolean = false;\n  @Input() order?: string;\n  @Input() suffixIcon: string = \"search\";\n  @Input() removeProperties: string[] = [];\n  @Input() modifyResultFn: (options: any[]) => any[] = (options: any[]) =>\n    options;\n\n  // --- Outputs ---\n  @Output() SelectElement: EventEmitter<any> = new EventEmitter<any>();\n  @Output() clearElement: EventEmitter<any> = new EventEmitter<any>();\n\n  // --- Setters para Inputs ---\n  @Input() set url(data: string) {\n    if (data) {\n      this._url = data;\n      // Suscribirse a los cambios del componente una vez que la URL está disponible\n      this.subscribeToComponentChanges();\n    }\n  }\n\n  // --- Setters para Inputs ---\n  @Input() set serviceConfig(data: ServiceConfig) {\n    if (data) {\n      console.log(data);\n      this._serviceConfig = data;\n      // Suscribirse a los cambios del componente una vez que la URL está disponible\n      this.subscribeToComponentChanges();\n    }\n  }\n\n  @Input() set limit(value: number) {\n    if (value && !isNaN(value)) {\n      this._limit = value;\n    }\n  }\n\n  @Input() set clearData(value: Subject<void>) {\n    this._clearDataSubject = value;\n    this._clearDataSubject\n      .pipe(takeUntilDestroyed(this._destroyRef))\n      .subscribe({\n        next: (): void => {\n          this.clearInternalState();\n        },\n      });\n  }\n\n  @Input() set initialValue(value: any) {\n    // Si el valor inicial es el mismo que el valor actual del control, no hacer nada para evitar bucles\n    if (value === this.component.value) {\n      return;\n    }\n\n    this._selectedElement = value;\n    this._isOptionSelected = !!value; // Marcar como seleccionado si hay un valor inicial\n\n    // Establecer el valor en el formControl sin emitir el evento\n    // para evitar que subscribeToComponentChanges reaccione a esta carga inicial.\n    this.component.setValue(value, { emitEvent: false });\n\n    // Actualizar _lastSearchText basado en el valor inicial\n    if (value) {\n      this._lastSearchText = this.displayFn(value);\n    } else {\n      this._lastSearchText = \"\";\n    }\n  }\n\n  /**\n   * Añade o elimina restricciones de búsqueda\n   */\n  @Input() set restrictions(restrictions: RestrictionFilter[]) {\n    // Using stringify for simple object comparison. If restrictions become complex, a more robust method is needed.\n    if (JSON.stringify(this._restrictionsFilters) === JSON.stringify(restrictions)) {\n      return;\n    }\n\n    this._restrictionsFilters = restrictions?.length ? [...restrictions] : [];\n    this.resetAutocompleteState();\n    const currentSearchText = this.getAutocompleteSearchText();\n\n    // Only re-trigger a search if there was already text in the input.\n    // If the input was empty, we'll wait for user interaction (opening the panel).\n    if (currentSearchText) {\n      // No actualizar _lastSearchText aquí, se actualiza después de la API.\n      this.getAutocompleteByTextHandler(currentSearchText);\n    }\n  }\n\n  /**\n   * Añade o elimina la validación de requerido\n   */\n  @Input() set isRequired(required: boolean) {\n    this.required.set(required);\n    const validators: ValidatorFn[] = [autocompleteValidator];\n    if (required) {\n      validators.push(Validators.required);\n    }\n    this.component.setValidators(validators);\n    this.component.updateValueAndValidity();\n    this.component.markAsDirty();\n    this.component.markAsTouched();\n  }\n\n  /**\n   * Define si se realiza una búsqueda cuando el elemento está en foco\n   */\n  @Input() set doFocus(focusSubject: Subject<void>) {\n    this._doFocusSubject = focusSubject;\n    this._doFocusSubject\n      .pipe(\n        debounceTime(this.debounceTimeValue), // Retrasar para evitar llamadas excesivas\n        takeUntilDestroyed(this._destroyRef),\n      )\n      .subscribe({\n        next: (): void => {\n          // SOLO ejecutar si el usuario ya ha interactu-ado con el componente.\n          // Esto previene que un focus programático inicial (ej: al renderizar una tabla)\n          // dispare una búsqueda no deseada.\n          if (!this._userInteracted) {\n            return;\n          }\n\n          this._zone.run((): void => {\n            setTimeout((): void => {\n              this.inputText?.nativeElement?.focus();\n              // Simular evento 'input' para disparar valueChanges, pero solo si el input está vacío\n              // o si ya hay un valor pero no es el seleccionado (usuario queriendo buscar de nuevo).\n              if (\n                !this.component.value ||\n                (typeof this.component.value === \"string\" &&\n                  !this._selectedElement)\n              ) {\n                (\n                  this.inputText?.nativeElement as HTMLInputElement\n                )?.dispatchEvent(new Event(\"input\"));\n              }\n              this.autocompleteTrigger?.openPanel();\n            }, 50); // Un pequeño retraso para asegurar el foco y la apertura\n          });\n        },\n      });\n  }\n\n  @Input() set notAllowedElements(element: any) {\n    if (element) {\n      this.notAllowedOption.set(element);\n      this.filterOptionsBasedOnNotAllowed();\n    }\n  }\n\n  /**\n   * Reinicia el estado de paginación y opciones del autocompletado.\n   * Centraliza la lógica para evitar duplicación.\n   */\n  private resetAutocompleteState(): void {\n    this._offset = 0;\n    this.originalOptions.set([]);\n    this.filteredOptions.set([]);\n    this.hasMore.set(true);\n  }\n\n  /**\n   * Suscripción a los cambios del input de búsqueda\n   */\n  private subscribeToComponentChanges(): void {\n    this.component.valueChanges\n      .pipe(\n        // TAP se ejecuta inmediatamente ANTES del debounce.\n        // Esto es crucial para detectar borrados de texto en tiempo real y desvincular _selectedElement.\n        tap((value) => {\n          const currentInputText = this.getAutocompleteSearchText();\n\n          // Si el valor actual del control es un STRING (usuario escribiendo/borrando)\n          // Y previamente había un objeto seleccionado (_selectedElement)\n          // Y el texto en el input ya no coincide con el displayFn del _selectedElement,\n          // entonces desvinculamos el _selectedElement y marcamos que no hay selección.\n          if (\n            typeof value === \"string\" &&\n            this._selectedElement &&\n            currentInputText !== this.displayFn(this._selectedElement)\n          ) {\n            this._selectedElement = null; // Quitar la referencia al objeto seleccionado\n            this._isOptionSelected = false; // Marcar que no hay una opción seleccionada\n          } else if (typeof value === \"string\") {\n            // Si el valor es un string, simplemente marcamos que no hay opción seleccionada.\n            // Esto cubre los casos donde el usuario escribe por primera vez o borra sin haber seleccionado.\n            this._isOptionSelected = false;\n          }\n        }),\n        debounceTime(this.debounceTimeValue), // El debounce se aplica después de la lógica del tap\n        switchMap((value: any) => {\n          this._cancelPendingRequest$.next(); // Cancelar cualquier petición anterior\n          const currentSearchText = this.getAutocompleteSearchText();\n\n          // Caso 1: El valor es un objeto y coincide con el elemento seleccionado.\n          if (\n            typeof value === \"object\" &&\n            value !== null &&\n            this._selectedElement === value\n          ) {\n            this._lastSearchText = this.displayFn(value);\n            return of(null);\n          }\n\n          // Caso 2: El usuario ha terminado de escribir o borrar texto.\n          if (currentSearchText !== this._lastSearchText) {\n            this.resetAutocompleteState();\n            this._lastSearchText = currentSearchText;\n            const source$ = this.getAutocompleteByTextHandler(\n              currentSearchText,\n              true,\n            ) as Observable<any>;\n\n            return source$.pipe(\n              catchError(() => {\n                // Al atrapar el error aquí, evitamos que la cadena principal de valueChanges se rompa.\n                // Devolvemos un observable vacío para que la suscripción continúe escuchando cambios.\n                return of(null);\n              }),\n            );\n          } else {\n            // Si el texto es el mismo, pero el panel está abierto, sin opciones y hay más datos potenciales,\n            // podemos necesitar una recarga.\n            if (\n              this.matAutocomplete._isOpen &&\n              this.originalOptions().length === 0 &&\n              this.hasMore() &&\n              !this.loading()\n            ) {\n              return this.getAutocompleteByTextHandler(\n                currentSearchText,\n                true,\n              ) as Observable<any>;\n            }\n          }\n          return of(null);\n        }),\n        takeUntilDestroyed(this._destroyRef),\n      )\n      .subscribe({\n        next: (result: any): void => {\n          if (!result) {\n            return;\n          }\n\n          const newData = result?.payload?.data ?? result?.data ?? [];\n\n          if (this._offset === 0) {\n            this.originalOptions.set(newData);\n          } else {\n            this.originalOptions.update((currentOptions) => [\n              ...currentOptions,\n              ...newData,\n            ]);\n          }\n\n          this._offset += newData.length;\n\n          if (newData.length < this._limit) {\n            this.hasMore.set(false);\n          } else {\n            this.hasMore.set(true);\n          }\n\n          this.filterOptionsBasedOnNotAllowed();\n        },\n        error: (error) => {\n          this.loading.set(false);\n        },\n      });\n  }\n\n  ngAfterViewInit(): void {\n    // Suscribirse a la apertura del panel para añadir el listener de scroll y cargar datos\n    this.matAutocomplete.opened\n      .pipe(takeUntilDestroyed(this._destroyRef))\n      .subscribe(() => {\n        this._cancelPendingRequest$.next(); // Cancelar cualquier petición anterior\n\n\n        if (this.matAutocomplete?.panel) {\n          // Asegurarse de que el listener sea removido antes de añadirlo para prevenir duplicados\n          this.matAutocomplete.panel.nativeElement.removeEventListener(\n            \"scroll\",\n            this.onScroll.bind(this),\n          );\n          this.matAutocomplete.panel.nativeElement.addEventListener(\n            \"scroll\",\n            this.onScroll.bind(this),\n          );\n\n          const currentSearchText = this.getAutocompleteSearchText();\n\n          // **********************************************\n          // MODIFICACIÓN CLAVE AQUÍ:\n          // Cargar opciones iniciales SOLO SI:\n          // 1. No hay opciones cargadas (primera apertura o después de un clear/reset).\n          // 2. O el texto actual en el input es diferente del _lastSearchText (el usuario escribió algo nuevo o borró y abrió).\n          // 3. O el input está vacío Y no hay un _selectedElement Y hay más datos por cargar Y el offset es 0 (lo que implica que es la primera carga para este estado vacío).\n          // Esto evita la doble llamada si subscribeToComponentChanges ya disparó una búsqueda\n          // para el mismo texto, o si ya se sabe que no hay más datos para un input vacío.\n          // **********************************************\n          if (\n            this.originalOptions().length === 0 || // No hay opciones, cargar siempre.\n            currentSearchText !== this._lastSearchText || // El texto ha cambiado, nueva búsqueda.\n            (currentSearchText === \"\" &&\n              !this._selectedElement &&\n              this.hasMore() &&\n              this._offset === 0) // Input vacío, sin selección, con potencial de datos, y es la primera carga.\n          ) {\n            this.resetAutocompleteState(); // Asegurarse de resetear antes de una nueva carga\n            this._lastSearchText = currentSearchText; // Sincronizar _lastSearchText con la búsqueda que se va a realizar\n            this.getAutocompleteByTextHandler(currentSearchText);\n          } else {\n          }\n        }\n      });\n\n    // Suscribirse al cierre del panel para remover el listener de scroll y manejar la deselección\n    this.matAutocomplete.closed\n      .pipe(takeUntilDestroyed(this._destroyRef))\n      .subscribe(() => {\n        if (this.matAutocomplete?.panel) {\n          this.matAutocomplete.panel.nativeElement.removeEventListener(\n            \"scroll\",\n            this.onScroll.bind(this),\n          );\n        }\n\n        const currentInputValue = this.component.value;\n        const currentInputText = this.getAutocompleteSearchText();\n\n        // Lógica para manejar el borrado del input si no hay una selección válida\n        // o si el texto no coincide con el elemento seleccionado.\n        if (typeof currentInputValue === \"string\") {\n          // Si el input está vacío Y no hay un elemento seleccionado\n          if (currentInputText === \"\" && !this._selectedElement) {\n            this.clearInternalState(); // Usa un método para limpiar\n          }\n          // Si se requiere selección y el texto no coincide con el elemento seleccionado,\n          // o no hay ningún elemento seleccionado, entonces se borra.\n          else if (\n            this.requireSelection &&\n            (!this._selectedElement ||\n              currentInputText !== this.displayFn(this._selectedElement))\n          ) {\n            console.warn(\n              \"Autocompletado cerrado: Selección requerida y no se encontró una coincidencia válida. Limpiando input.\",\n            );\n            this.clearInternalState(); // Usa un método para limpiar\n          }\n          // Si NO se requiere selección, pero el usuario ha editado el texto de un elemento previamente seleccionado.\n          // En este caso, NO borramos, sino que revertimos al texto del elemento seleccionado si existe.\n          else if (\n            this._selectedElement &&\n            currentInputText !== this.displayFn(this._selectedElement) &&\n            !this.requireSelection\n          ) {\n            // Revertir al texto del elemento seleccionado.\n            this.component.setValue(this._selectedElement, {\n              emitEvent: false,\n            });\n            this._lastSearchText = this.displayFn(this._selectedElement);\n            this.propagateChange(this._selectedElement); // Propagar el valor original si se revierte\n          }\n          // Si el texto del input es un string y no se requiere selección,\n          // y no hay _selectedElement (porque se deseleccionó en el tap o nunca hubo),\n          // asumimos que el usuario quiere el texto libre.\n          // No hacemos nada, el texto permanece.\n          else if (\n            typeof currentInputValue === \"string\" &&\n            !this.requireSelection &&\n            !this._selectedElement &&\n            currentInputText !== \"\"\n          ) {\n            // Si no hay un elemento seleccionado pero el usuario escribió algo\n            // y no se requiere selección, dejamos el texto tal cual.\n            // Aseguramos que _lastSearchText se actualice para evitar re-búsquedas innecesarias.\n            this._lastSearchText = currentInputText;\n            // this.propagateChange(currentInputText);\n          }\n        }\n        // Si el valor ya es un objeto (porque se seleccionó) pero el texto del input fue borrado\n        // y el _selectedElement es null (ya se desvinculó en el tap), significa que debe limpiarse.\n        else if (\n          typeof currentInputValue === \"object\" &&\n          currentInputText === \"\" &&\n          !this._selectedElement\n        ) {\n          this.clearInternalState();\n        }\n      });\n  }\n\n  /**\n   * Método auxiliar para limpiar el estado interno del autocompletado.\n   * Este método ahora se encarga de la limpieza profunda, incluyendo el valor del FormControl y la propagación.\n   * @param resetLastSearchText - Si es true, reinicia _lastSearchText a una cadena vacía. Por defecto es true.\n   */\n  private clearInternalState(resetLastSearchText: boolean = true): void {\n    // Solo si el valor del control NO es null, lo seteamos a null para evitar bucles.\n    // Esto es importante porque en el tap, solo desvinculamos `_selectedElement` pero no el control.\n    if (this.component.value !== null) {\n      this.component.setValue(null, { emitEvent: false });\n    }\n    this.propagateChange(null);\n    this.SelectElement.emit(null);\n    this._selectedElement = null; // Asegurar que el objeto seleccionado esté a null\n    this._isOptionSelected = false; // Asegurar que la bandera de selección esté a false\n    if (resetLastSearchText) {\n      this._lastSearchText = \"\";\n    }\n    this.resetAutocompleteState(); // Resetear opciones y paginación\n  }\n\n  /**\n   * Busca elementos para mostrar en el componente de autocompletado.\n   * Ahora soporta paginación.\n   * @param text - Texto a buscar\n   */\n  private getAutocompleteByTextHandler(\n    text?: string,\n    returnObservable: boolean = false,\n  ): Observable<any> | void {\n    const currentSearchText = text ?? \"\";\n\n    if (this.loading() || !this._userInteracted) {\n      return returnObservable ? of(null) : undefined;\n    }\n\n    if (\n      !this.hasMore() &&\n      this._offset > 0 &&\n      currentSearchText === this._lastSearchText\n    ) {\n      return returnObservable ? of(null) : undefined;\n    }\n\n    this.loading.set(true);\n\n    const currentOffset = this._offset;\n\n    if (!this._url && !this._serviceConfig) {\n      this.loading.set(false);\n      this.hasMore.set(false);\n      return returnObservable ? of(null) : undefined;\n    }\n\n    let apiCall: Observable<any>;\n\n    if (this._url) {\n      apiCall = from(\n        this._autocompleteService.getAutocompleteByText(\n          this._url,\n          currentSearchText,\n          this.filterString,\n          this._restrictionsFilters,\n          this.removeProperties,\n          this.order,\n          this.bodyRequest,\n          { limit: this._limit, offset: currentOffset },\n        ),\n      ).pipe(switchMap((innerObservable) => innerObservable));\n    } else if (this._serviceConfig) {\n      const body: any = { ...this._serviceConfig };\n      body[this._serviceConfig.searchProperty] = currentSearchText;\n      body[\"limit\"] = this._limit;\n      body[\"offset\"] = currentOffset;\n      Object.keys(this._serviceConfig.postBody).forEach((item) => {\n        body[item] = this._serviceConfig.postBody[item];\n      });\n      console.log(body);\n      delete body.service;\n      delete body.postBody;\n      apiCall = this._serviceConfig.service[this._serviceConfig.method](body);\n    } else {\n      this.loading.set(false);\n      this.hasMore.set(false);\n      return returnObservable ? of(null) : undefined;\n    }\n\n    let panelScrollTop = 0;\n    if (this.matAutocomplete?.panel) {\n      panelScrollTop = this.matAutocomplete.panel.nativeElement.scrollTop;\n    }\n\n    const finalApiCall$ = apiCall.pipe(\n      takeUntil(this._cancelPendingRequest$),\n      finalize((): void => {\n        this.loading.set(false);\n      }),\n    );\n\n    if (returnObservable) {\n      return finalApiCall$;\n    }\n\n    finalApiCall$.pipe(takeUntilDestroyed(this._destroyRef)).subscribe({\n      next: (result: any): void => {\n        const newData = result?.payload?.data ?? result?.data ?? [];\n\n        if (currentOffset === 0) {\n          this.originalOptions.set(newData);\n        } else {\n          this.originalOptions.update((currentOptions) => [\n            ...currentOptions,\n            ...newData,\n          ]);\n        }\n\n        this._offset += newData.length;\n\n        if (newData.length < this._limit) {\n          this.hasMore.set(false);\n        } else {\n          this.hasMore.set(true);\n        }\n\n        this.filterOptionsBasedOnNotAllowed();\n\n        if (this.matAutocomplete?.panel && panelScrollTop > 0) {\n          this._zone.runOutsideAngular(() => {\n            setTimeout(() => {\n              this.matAutocomplete.panel.nativeElement.scrollTop =\n                panelScrollTop;\n            }, 0);\n          });\n        }\n      },\n      error: (error) => {\n        console.error(\"Error al obtener datos de autocompletado:\", error);\n        this.loading.set(false);\n      },\n    });\n  }\n\n  private filterOptionsBasedOnNotAllowed(): void {\n    let currentOptions = this.originalOptions();\n    const modifiedOptions = this.modifyResultFn(currentOptions);\n    if (modifiedOptions !== null && modifiedOptions !== undefined) {\n      currentOptions = modifiedOptions;\n    }\n\n    if (this.notAllowedOption()) {\n      this.filteredOptions.set(\n        currentOptions.filter(\n          (option: any): boolean =>\n            JSON.stringify(option) !== JSON.stringify(this.notAllowedOption()),\n        ),\n      );\n    } else {\n      this.filteredOptions.set(currentOptions);\n    }\n  }\n\n  /**\n   * Define el texto a utilizar para la búsqueda\n   */\n  private getAutocompleteSearchText(): string {\n    const value = this.component.value;\n    if (typeof value === \"object\" && value !== null) {\n      // Si el valor es un objeto, usa displayFn para obtener el texto\n      return this.displayFn(value);\n    } else if (typeof value === \"string\") {\n      return value;\n    }\n    return null;\n  }\n\n  // --- Métodos de ControlValueAccessor ---\n  propagateChange = (_: any): void => {};\n\n  registerOnChange(fn: (_: any) => void): void {\n    this.propagateChange = fn;\n  }\n\n  registerOnTouched(): void {}\n\n  /**\n   * Recibe el valor desde el FormControl externo.\n   */\n  writeValue(value: any): void {\n    // Establecer la bandera para indicar que el cambio viene de un setValue programático\n    this._isOptionSelected = typeof value === \"object\" && value !== null;\n    this.component.setValue(value, { emitEvent: false }); // No emitir evento para evitar bucles.\n\n    this._selectedElement = value\n      ? this.valueId && typeof value === \"object\"\n        ? value?.id\n        : value\n      : null;\n\n    // Actualizar _lastSearchText basado en el valor que se está escribiendo.\n    // Si el valor es nulo, _lastSearchText también debe ser nulo o vacío\n    if (value) {\n      this._lastSearchText = this.displayFn(value);\n    } else {\n      this._lastSearchText = \"\";\n    }\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled.set(isDisabled);\n    if (isDisabled) {\n      this.component.disable();\n    } else {\n      this.component.enable();\n    }\n  }\n\n  /**\n   * Función para mostrar los elementos seleccionados\n   */\n  public displayFn = (value: any): string => {\n    if (!value) {\n      return \"\";\n    }\n    // Si el valor ya es una cadena, devuélvelo directamente\n    if (typeof value === \"string\") {\n      return value;\n    }\n\n    let displayText: string = \"\";\n    const options = this.displayOptions || GENERAL_DISPLAY_OPTIONS;\n\n    options?.firthLabel?.forEach((field: any): void => {\n      if (field?.type === DisplayOptionItemType.PATH) {\n        displayText +=\n          UtilsService.resolvePropertyByPath(value, field?.path) || \"\";\n      } else {\n        displayText += field?.divider || \"\";\n      }\n    });\n\n    return displayText;\n  };\n\n  /**\n   * Acción al limpiar el valor del input\n   */\n  public clear(trigger: MatAutocompleteTrigger): void {\n    this.clearElement.emit(this.component.value);\n    this.clearInternalState(); // Usa el método auxiliar para limpiar\n    this._zone.run((): void => {\n      setTimeout((): void => {\n        trigger.openPanel(); // Reabrir el panel después de borrar\n        this.component.setValue(\"\", { emitEvent: true }); // Cargar opciones iniciales (o todas) después de borrar\n      }, 100);\n    });\n  }\n\n\n\n  public onUserInteraction(): void {\n    this._userInteracted = true;\n\n    // Si el panel ya está abierto, no hacer nada para evitar bucles o recargas innecesarias al volver a hacer clic.\n    if (this.autocompleteTrigger?.panelOpen) {\n      return;\n    }\n\n    this.resetAutocompleteState();\n\n    const searchText = this.getAutocompleteSearchText() ?? \"\";\n    if (!this._selectedElement) {\n      this.getAutocompleteByTextHandler(searchText);\n    }\n  }\n\n  public optionSelected($event: any): void {\n    const selectedValue = $event?.option?.value;\n    if (selectedValue) {\n      this._isOptionSelected = true; // Establecer la bandera de selección\n      this._selectedElement = selectedValue;\n      this.SelectElement.emit(selectedValue);\n\n      if (this.valueId && typeof selectedValue === \"object\") {\n        this.propagateChange(selectedValue?.id);\n      } else {\n        this.propagateChange(selectedValue);\n      }\n      // Cuando un ítem es seleccionado, actualizar _lastSearchText con su valor de display.\n      // Esto es crucial para que el valueChanges no vuelva a disparar una búsqueda para este valor.\n      this._lastSearchText = this.displayFn(selectedValue);\n    } else {\n      // Si se deselecciona o selecciona nulo\n      this.clearInternalState();\n    }\n  }\n\n  /**\n   * Maneja el evento de scroll en el panel del autocompletado para cargar más datos.\n   */\n  onScroll(event: Event): void {\n    const element = event.target as HTMLElement;\n    const scrollPosition = element.scrollTop + element.clientHeight;\n    const scrollHeight = element.scrollHeight;\n    const threshold = 50; // Píxeles antes del final para cargar más\n\n    if (\n      scrollHeight - scrollPosition <= threshold &&\n      !this.loading() &&\n      this.hasMore()\n    ) {\n      // Usar el texto de búsqueda actual (que puede ser el texto del ítem seleccionado o lo que el usuario escribió)\n      this.getAutocompleteByTextHandler(this.getAutocompleteSearchText());\n    }\n  }\n}\n\n/**\n * Validación personalizada para la selección de elementos\n */\nexport function autocompleteValidator(\n  control: AbstractControl,\n): ValidationErrors | null {\n  // Un valor válido es un objeto no nulo que tiene una propiedad 'id'.\n  // Esto asegura que realmente se ha seleccionado un objeto del autocompletado, no solo texto libre.\n  // Si el control está vacío, no se aplica esta validación aquí, sino la de 'Validators.required' si está presente.\n  if (\n    control.value === null ||\n    typeof control.value === \"undefined\" ||\n    control.value === \"\"\n  ) {\n    return null; // Deja que Validators.required maneje si está vacío.\n  }\n\n  if (\n    typeof control?.value === \"object\" &&\n    control?.value !== null &&\n    \"id\" in control.value\n  ) {\n    return null;\n  }\n  // Si el valor es una cadena (texto libre) y debería ser un objeto seleccionado.\n  return { invalidSelection: true };\n}\n","<mat-form-field\n  [floatLabel]=\"floatLabel\"\n  class=\"w-100\"\n  [appearance]=\"appearance\"\n  [color]=\"color\"\n  [subscriptSizing]=\"subscriptSizing\"\n>\n  @if (showLabel) {\n  <mat-label>{{ label | translate }}</mat-label>\n  } @if (showSuffix) {\n  <mat-icon matSuffix>{{ suffixIcon ?? \"search\" }}</mat-icon>\n  }\n  <input\n    #inputText\n    #trigger=\"matAutocompleteTrigger\"\n    (focus)=\"onUserInteraction()\"\n    (click)=\"onUserInteraction()\"\n    (keydown)=\"onUserInteraction()\"\n    [formControl]=\"component\"\n    type=\"text\"\n    [matAutocomplete]=\"auto\"\n    [placeholder]=\"placeholder | translate\"\n    aria-label=\"autocomplete\"\n    autocomplete=\"off\"\n    matInput\n    [required]=\"required()\"\n  />\n  @if (!loading() && component.value) {\n  <button\n    (click)=\"clear(trigger)\"\n    [disabled]=\"disabled()\"\n    aria-label=\"Clear\"\n    mat-icon-button\n    matSuffix\n  >\n    <mat-icon>close</mat-icon>\n  </button>\n  } @if (loading()) {\n  <button aria-label=\"search\" mat-icon-button matSuffix>\n    <mat-spinner [value]=\"90\" color=\"accent\" diameter=\"25\"></mat-spinner>\n  </button>\n  }\n  <mat-autocomplete\n    #auto=\"matAutocomplete\"\n    [displayWith]=\"displayFn\"\n    [requireSelection]=\"requireSelection\"\n    (optionSelected)=\"optionSelected($event)\"\n  >\n    @for (option of filteredOptions(); track option) {\n    <mat-option [value]=\"option\">\n      @if (!displayOptions && !detailsTemplate) {\n      {{ option?.name | i18n: translateService.currentLang }}\n      } @if (!detailsTemplate) {\n      <div class=\"display-options\">\n        <span [ngStyle]=\"{'line-height': displayOptions?.secondLabel ? '16px' : ''}\">\n          {{\n            option | resolvePropertyPath : displayOptions.firthLabel\n            | i18n : translateService.currentLang\n          }}\n        </span>\n        @if (displayOptions?.secondLabel) {\n        <span class=\"mat-caption\">\n          {{\n            option | resolvePropertyPath : displayOptions.secondLabel\n            | i18n : translateService.currentLang\n          }}\n        </span>\n        }\n      </div>\n      } @if (detailsTemplate) {\n      <ng-container\n        *ngTemplateOutlet=\"detailsTemplate; context: { $implicit: option }\"\n      ></ng-container>\n      }\n    </mat-option>\n    }\n  </mat-autocomplete>\n\n  @if (component.invalid && component.touched) {\n  <mat-error>\n    {{ 'Este campo es requerido.' | translate }}\n  </mat-error>\n  }\n</mat-form-field>\n","/*\n * Public API Surface of guachos-general-autocomplete\n */\n\nexport * from './utils/constants/constants';\nexport * from './lib/guachos-general-autocomplete.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAGO,MAAM,uBAAuB,GAAkB;AAClD,IAAA,UAAU,EAAE;AACR,QAAA;YACI,IAAI,EAAE,qBAAqB,CAAC,IAAI;YAChC,IAAI,EAAE,CAAC,MAAM;AAChB;AACJ,KAAA;AACD,IAAA,cAAc,EAAE;;;MCLP,YAAY,CAAA;AACrB;;;;;;AAMG;AACI,IAAA,OAAO,qBAAqB,CAAC,GAAQ,EAAE,IAAc,EAAA;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAY,KAAI;AACtC,YAAA,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;AACnC,QAAA,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IACnB;+GAZS,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFT,MAAM,EAAA,CAAA,CAAA;;4FAET,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCMY,mBAAmB,CAAA;AAC9B;;;;;;AAMG;IACH,SAAS,CAAC,GAAQ,EAAE,IAAyB,EAAA;QAC3C,IAAI,MAAM,GAAW,EAAE;AAEvB,QAAA,IAAI,EAAE,OAAO,CAAC,CAAC,IAAuB,KAAU;YAC9C,IAAI,IAAI,EAAE,IAAI,KAAK,qBAAqB,CAAC,OAAO,EAAE;AAChD,gBAAA,MAAM,IAAI,IAAI,EAAE,OAAO;YACzB;iBAAO;AACL,gBAAA,IAAI,IAAI,EAAE,IAAI,EAAE;oBACd,MAAM,IAAI,YAAY,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;gBAC9D;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;IACf;+GAtBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAJ/B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,qBAAqB;AAC3B,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MC2FY,6BAA6B,CAAA;AAGxC,IAAA,WAAA,CACU,oBAAyC,EACzC,KAAa,EACb,WAAuB,EACxB,gBAAkC,EAAA;QAHjC,IAAA,CAAA,oBAAoB,GAApB,oBAAoB;QACpB,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,WAAW,GAAX,WAAW;QACZ,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;;AAIjB,QAAA,IAAA,CAAA,iBAAiB,GAAY,KAAK,CAAC;QAEnC,IAAA,CAAA,eAAe,GAAG,KAAK;AACvB,QAAA,IAAA,CAAA,iBAAiB,GAAkB,IAAI,OAAO,EAAQ;AACtD,QAAA,IAAA,CAAA,eAAe,GAAkB,IAAI,OAAO,EAAQ;AACpD,QAAA,IAAA,CAAA,gBAAgB,GAAQ,IAAI,CAAC;QAC7B,IAAA,CAAA,IAAI,GAAkB,IAAI;QAC1B,IAAA,CAAA,cAAc,GAAkB,IAAI;QACpC,IAAA,CAAA,MAAM,GAAW,EAAE;QACnB,IAAA,CAAA,OAAO,GAAW,CAAC;QACnB,IAAA,CAAA,oBAAoB,GAAwB,EAAE;AAC9C,QAAA,IAAA,CAAA,eAAe,GAAW,EAAE,CAAC;AAE7B,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,OAAO,EAAQ;;AAG7C,QAAA,IAAA,CAAA,QAAQ,GAA4B,MAAM,CAAC,KAAK,+EAAC;AACjD,QAAA,IAAA,CAAA,OAAO,GAA4B,MAAM,CAAC,KAAK,8EAAC;AAChD,QAAA,IAAA,CAAA,QAAQ,GAA4B,MAAM,CAAC,KAAK,+EAAC;AACjD,QAAA,IAAA,CAAA,eAAe,GAA0B,MAAM,CAAC,EAAE,sFAAC;AACnD,QAAA,IAAA,CAAA,eAAe,GAA0B,MAAM,CAAC,EAAE,sFAAC;AACnD,QAAA,IAAA,CAAA,gBAAgB,GAAwB,MAAM,CAAC,IAAI,uFAAC;QACpD,IAAA,CAAA,SAAS,GAAuB,IAAI,kBAAkB,CAAC;AAC5D,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC;AACK,QAAA,IAAA,CAAA,OAAO,GAA4B,MAAM,CAAC,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC,CAAC;;QAS9C,IAAA,CAAA,UAAU,GAAmB,MAAM;QACnC,IAAA,CAAA,KAAK,GAAiB,QAAQ;QAC9B,IAAA,CAAA,UAAU,GAA2B,SAAS;QAC9C,IAAA,CAAA,eAAe,GAAoB,SAAS;QAE5C,IAAA,CAAA,iBAAiB,GAAW,GAAG;QAE/B,IAAA,CAAA,KAAK,GAAW,YAAY;QAC5B,IAAA,CAAA,SAAS,GAAY,IAAI;QACzB,IAAA,CAAA,WAAW,GAAW,wBAAwB;AAC9C,QAAA,IAAA,CAAA,KAAK,GAAa,CAAC,MAAM,CAAC;QAC1B,IAAA,CAAA,YAAY,GAAsB,2BAA2B;QAC7D,IAAA,CAAA,cAAc,GAAkB,uBAAuB;QACvD,IAAA,CAAA,oBAAoB,GAAY,IAAI;QACpC,IAAA,CAAA,OAAO,GAAY,KAAK;QACxB,IAAA,CAAA,UAAU,GAAY,KAAK;QAC3B,IAAA,CAAA,gBAAgB,GAAY,KAAK;QAEjC,IAAA,CAAA,UAAU,GAAW,QAAQ;QAC7B,IAAA,CAAA,gBAAgB,GAAa,EAAE;AAC/B,QAAA,IAAA,CAAA,cAAc,GAA8B,CAAC,OAAc,KAClE,OAAO;;AAGC,QAAA,IAAA,CAAA,aAAa,GAAsB,IAAI,YAAY,EAAO;AAC1D,QAAA,IAAA,CAAA,YAAY,GAAsB,IAAI,YAAY,EAAO;;AAkjBnE,QAAA,IAAA,CAAA,eAAe,GAAG,CAAC,CAAM,KAAU,EAAE,CAAC;AAwCtC;;AAEG;AACI,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,KAAU,KAAY;YACxC,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,OAAO,EAAE;YACX;;AAEA,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,OAAO,KAAK;YACd;YAEA,IAAI,WAAW,GAAW,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,uBAAuB;YAE9D,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,KAAU,KAAU;gBAChD,IAAI,KAAK,EAAE,IAAI,KAAK,qBAAqB,CAAC,IAAI,EAAE;oBAC9C,WAAW;wBACT,YAAY,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE;gBAChE;qBAAO;AACL,oBAAA,WAAW,IAAI,KAAK,EAAE,OAAO,IAAI,EAAE;gBACrC;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,WAAW;AACpB,QAAA,CAAC;IAlrBE;;IAkEH,IAAa,GAAG,CAAC,IAAY,EAAA;QAC3B,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;;YAEhB,IAAI,CAAC,2BAA2B,EAAE;QACpC;IACF;;IAGA,IAAa,aAAa,CAAC,IAAmB,EAAA;QAC5C,IAAI,IAAI,EAAE;AACR,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACjB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;;YAE1B,IAAI,CAAC,2BAA2B,EAAE;QACpC;IACF;IAEA,IAAa,KAAK,CAAC,KAAa,EAAA;QAC9B,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACrB;IACF;IAEA,IAAa,SAAS,CAAC,KAAoB,EAAA;AACzC,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AACzC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAW;gBACf,IAAI,CAAC,kBAAkB,EAAE;YAC3B,CAAC;AACF,SAAA,CAAC;IACN;IAEA,IAAa,YAAY,CAAC,KAAU,EAAA;;QAElC,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YAClC;QACF;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC7B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC;;;AAIjC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;QAGpD,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9C;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC3B;IACF;AAEA;;AAEG;IACH,IAAa,YAAY,CAAC,YAAiC,EAAA;;AAEzD,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;YAC9E;QACF;AAEA,QAAA,IAAI,CAAC,oBAAoB,GAAG,YAAY,EAAE,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE;QACzE,IAAI,CAAC,sBAAsB,EAAE;AAC7B,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;;QAI1D,IAAI,iBAAiB,EAAE;;AAErB,YAAA,IAAI,CAAC,4BAA4B,CAAC,iBAAiB,CAAC;QACtD;IACF;AAEA;;AAEG;IACH,IAAa,UAAU,CAAC,QAAiB,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,QAAA,MAAM,UAAU,GAAkB,CAAC,qBAAqB,CAAC;QACzD,IAAI,QAAQ,EAAE;AACZ,YAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE;AACvC,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;IAChC;AAEA;;AAEG;IACH,IAAa,OAAO,CAAC,YAA2B,EAAA;AAC9C,QAAA,IAAI,CAAC,eAAe,GAAG,YAAY;AACnC,QAAA,IAAI,CAAC;aACF,IAAI,CACH,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,QAAA,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AAErC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAW;;;;AAIf,gBAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;oBACzB;gBACF;AAEA,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAW;oBACxB,UAAU,CAAC,MAAW;AACpB,wBAAA,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE;;;AAGtC,wBAAA,IACE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK;AACrB,6BAAC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,QAAQ;AACvC,gCAAA,CAAC,IAAI,CAAC,gBAAgB,CAAC,EACzB;AAEE,4BAAA,IAAI,CAAC,SAAS,EAAE,aACjB,EAAE,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;wBACtC;AACA,wBAAA,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE;AACvC,oBAAA,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,gBAAA,CAAC,CAAC;YACJ,CAAC;AACF,SAAA,CAAC;IACN;IAEA,IAAa,kBAAkB,CAAC,OAAY,EAAA;QAC1C,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;YAClC,IAAI,CAAC,8BAA8B,EAAE;QACvC;IACF;AAEA;;;AAGG;IACK,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC;AAChB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;AAEA;;AAEG;IACK,2BAA2B,GAAA;QACjC,IAAI,CAAC,SAAS,CAAC;aACZ,IAAI;;;AAGH,QAAA,GAAG,CAAC,CAAC,KAAK,KAAI;AACZ,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;;;;YAMzD,IACE,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,IAAI,CAAC,gBAAgB;gBACrB,gBAAgB,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC1D;AACA,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,gBAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YACjC;AAAO,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;;;AAGpC,gBAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;YAChC;QACF,CAAC,CAAC,EACF,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,QAAA,SAAS,CAAC,CAAC,KAAU,KAAI;AACvB,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AACnC,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;YAG1D,IACE,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,KAAK,KAAK,IAAI;AACd,gBAAA,IAAI,CAAC,gBAAgB,KAAK,KAAK,EAC/B;gBACA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;YACjB;;AAGA,YAAA,IAAI,iBAAiB,KAAK,IAAI,CAAC,eAAe,EAAE;gBAC9C,IAAI,CAAC,sBAAsB,EAAE;AAC7B,gBAAA,IAAI,CAAC,eAAe,GAAG,iBAAiB;gBACxC,MAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,CAC/C,iBAAiB,EACjB,IAAI,CACc;AAEpB,gBAAA,OAAO,OAAO,CAAC,IAAI,CACjB,UAAU,CAAC,MAAK;;;AAGd,oBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;gBACjB,CAAC,CAAC,CACH;YACH;iBAAO;;;AAGL,gBAAA,IACE,IAAI,CAAC,eAAe,CAAC,OAAO;AAC5B,oBAAA,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC;oBACnC,IAAI,CAAC,OAAO,EAAE;AACd,oBAAA,CAAC,IAAI,CAAC,OAAO,EAAE,EACf;oBACA,OAAO,IAAI,CAAC,4BAA4B,CACtC,iBAAiB,EACjB,IAAI,CACc;gBACtB;YACF;AACA,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AAErC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,MAAW,KAAU;gBAC1B,IAAI,CAAC,MAAM,EAAE;oBACX;gBACF;AAEA,gBAAA,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE;AAE3D,gBAAA,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE;AACtB,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;gBACnC;qBAAO;oBACL,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK;AAC9C,wBAAA,GAAG,cAAc;AACjB,wBAAA,GAAG,OAAO;AACX,qBAAA,CAAC;gBACJ;AAEA,gBAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM;gBAE9B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACzB;qBAAO;AACL,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB;gBAEA,IAAI,CAAC,8BAA8B,EAAE;YACvC,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACN;IAEA,eAAe,GAAA;;QAEb,IAAI,CAAC,eAAe,CAAC;AAClB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;aACzC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AAGnC,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE;;gBAE/B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAC1D,QAAQ,EACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB;gBACD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CACvD,QAAQ,EACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB;AAED,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;;;;;;;;;gBAW1D,IACE,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC;AACnC,oBAAA,iBAAiB,KAAK,IAAI,CAAC,eAAe;qBACzC,iBAAiB,KAAK,EAAE;wBACvB,CAAC,IAAI,CAAC,gBAAgB;wBACtB,IAAI,CAAC,OAAO,EAAE;AACd,wBAAA,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC;kBACrB;AACA,oBAAA,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC9B,oBAAA,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC;AACzC,oBAAA,IAAI,CAAC,4BAA4B,CAAC,iBAAiB,CAAC;gBACtD;qBAAO;gBACP;YACF;AACF,QAAA,CAAC,CAAC;;QAGJ,IAAI,CAAC,eAAe,CAAC;AAClB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;aACzC,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE;gBAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAC1D,QAAQ,EACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB;YACH;AAEA,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAC9C,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,EAAE;;;AAIzD,YAAA,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE;;gBAEzC,IAAI,gBAAgB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AACrD,oBAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B;;;qBAGK,IACH,IAAI,CAAC,gBAAgB;qBACpB,CAAC,IAAI,CAAC,gBAAgB;wBACrB,gBAAgB,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAC7D;AACA,oBAAA,OAAO,CAAC,IAAI,CACV,wGAAwG,CACzG;AACD,oBAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B;;;qBAGK,IACH,IAAI,CAAC,gBAAgB;oBACrB,gBAAgB,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC1D,oBAAA,CAAC,IAAI,CAAC,gBAAgB,EACtB;;oBAEA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC7C,wBAAA,SAAS,EAAE,KAAK;AACjB,qBAAA,CAAC;oBACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;oBAC5D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC9C;;;;;qBAKK,IACH,OAAO,iBAAiB,KAAK,QAAQ;oBACrC,CAAC,IAAI,CAAC,gBAAgB;oBACtB,CAAC,IAAI,CAAC,gBAAgB;oBACtB,gBAAgB,KAAK,EAAE,EACvB;;;;AAIA,oBAAA,IAAI,CAAC,eAAe,GAAG,gBAAgB;;gBAEzC;YACF;;;iBAGK,IACH,OAAO,iBAAiB,KAAK,QAAQ;AACrC,gBAAA,gBAAgB,KAAK,EAAE;AACvB,gBAAA,CAAC,IAAI,CAAC,gBAAgB,EACtB;gBACA,IAAI,CAAC,kBAAkB,EAAE;YAC3B;AACF,QAAA,CAAC,CAAC;IACN;AAEA;;;;AAIG;IACK,kBAAkB,CAAC,sBAA+B,IAAI,EAAA;;;QAG5D,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,EAAE;AACjC,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACrD;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,mBAAmB,EAAE;AACvB,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC3B;AACA,QAAA,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC;AAEA;;;;AAIG;AACK,IAAA,4BAA4B,CAClC,IAAa,EACb,gBAAA,GAA4B,KAAK,EAAA;AAEjC,QAAA,MAAM,iBAAiB,GAAG,IAAI,IAAI,EAAE;QAEpC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AAC3C,YAAA,OAAO,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;QAChD;AAEA,QAAA,IACE,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,IAAI,CAAC,OAAO,GAAG,CAAC;AAChB,YAAA,iBAAiB,KAAK,IAAI,CAAC,eAAe,EAC1C;AACA,YAAA,OAAO,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;QAChD;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEtB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO;QAElC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACtC,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;QAChD;AAEA,QAAA,IAAI,OAAwB;AAE5B,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,OAAO,GAAG,IAAI,CACZ,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAC7C,IAAI,CAAC,IAAI,EACT,iBAAiB,EACjB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,oBAAoB,EACzB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,WAAW,EAChB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAC9C,CACF,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,eAAe,KAAK,eAAe,CAAC,CAAC;QACzD;AAAO,aAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YAC9B,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,iBAAiB;AAC5D,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,aAAa;AAC9B,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACzD,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjD,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YACjB,OAAO,IAAI,CAAC,OAAO;YACnB,OAAO,IAAI,CAAC,QAAQ;AACpB,YAAA,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QACzE;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS;QAChD;QAEA,IAAI,cAAc,GAAG,CAAC;AACtB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE;YAC/B,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;QACrE;AAEA,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAChC,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC,EACtC,QAAQ,CAAC,MAAW;AAClB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,CACH;QAED,IAAI,gBAAgB,EAAE;AACpB,YAAA,OAAO,aAAa;QACtB;AAEA,QAAA,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,YAAA,IAAI,EAAE,CAAC,MAAW,KAAU;AAC1B,gBAAA,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE;AAE3D,gBAAA,IAAI,aAAa,KAAK,CAAC,EAAE;AACvB,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;gBACnC;qBAAO;oBACL,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,cAAc,KAAK;AAC9C,wBAAA,GAAG,cAAc;AACjB,wBAAA,GAAG,OAAO;AACX,qBAAA,CAAC;gBACJ;AAEA,gBAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM;gBAE9B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACzB;qBAAO;AACL,oBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB;gBAEA,IAAI,CAAC,8BAA8B,EAAE;gBAErC,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,cAAc,GAAG,CAAC,EAAE;AACrD,oBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAK;wBAChC,UAAU,CAAC,MAAK;AACd,4BAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;AAChD,gCAAA,cAAc;wBAClB,CAAC,EAAE,CAAC,CAAC;AACP,oBAAA,CAAC,CAAC;gBACJ;YACF,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC;AACjE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;AACF,SAAA,CAAC;IACJ;IAEQ,8BAA8B,GAAA;AACpC,QAAA,IAAI,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE;QAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;QAC3D,IAAI,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK,SAAS,EAAE;YAC7D,cAAc,GAAG,eAAe;QAClC;AAEA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAC3B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CACtB,cAAc,CAAC,MAAM,CACnB,CAAC,MAAW,KACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CACrE,CACF;QACH;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C;IACF;AAEA;;AAEG;IACK,yBAAyB,GAAA;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;QAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;;AAE/C,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9B;AAAO,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACpC,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,IAAI;IACb;AAKA,IAAA,gBAAgB,CAAC,EAAoB,EAAA;AACnC,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;IAC3B;AAEA,IAAA,iBAAiB,KAAU;AAE3B;;AAEG;AACH,IAAA,UAAU,CAAC,KAAU,EAAA;;QAEnB,IAAI,CAAC,iBAAiB,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;AACpE,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC,gBAAgB,GAAG;cACpB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK;kBAC/B,KAAK,EAAE;AACT,kBAAE;cACF,IAAI;;;QAIR,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9C;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC3B;IACF;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;QAC7B,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;QAC1B;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;QACzB;IACF;AA6BA;;AAEG;AACI,IAAA,KAAK,CAAC,OAA+B,EAAA;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAW;YACxB,UAAU,CAAC,MAAW;AACpB,gBAAA,OAAO,CAAC,SAAS,EAAE,CAAC;AACpB,gBAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC,EAAE,GAAG,CAAC;AACT,QAAA,CAAC,CAAC;IACJ;IAIO,iBAAiB,GAAA;AACtB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAG3B,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,SAAS,EAAE;YACvC;QACF;QAEA,IAAI,CAAC,sBAAsB,EAAE;QAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,EAAE,IAAI,EAAE;AACzD,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,YAAA,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC;QAC/C;IACF;AAEO,IAAA,cAAc,CAAC,MAAW,EAAA;AAC/B,QAAA,MAAM,aAAa,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK;QAC3C,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,gBAAgB,GAAG,aAAa;AACrC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;YAEtC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;AACrD,gBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,CAAC;YACzC;iBAAO;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;YACrC;;;YAGA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;QACtD;aAAO;;YAEL,IAAI,CAAC,kBAAkB,EAAE;QAC3B;IACF;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAqB;QAC3C,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY;AAC/D,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;AACzC,QAAA,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,QAAA,IACE,YAAY,GAAG,cAAc,IAAI,SAAS;YAC1C,CAAC,IAAI,CAAC,OAAO,EAAE;AACf,YAAA,IAAI,CAAC,OAAO,EAAE,EACd;;YAEA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACrE;IACF;+GAlwBW,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,GAAA,EAAA,KAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EAR7B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,6BAA6B,CAAC;AAC5D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA4CU,sBAAsB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9InC,89EAoFA,EAAA,MAAA,EAAA,CAAA,4HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDJI,YAAY,0RACZ,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,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,UAAA,EAAA,IAAA,EACnB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,wBAAwB,kOACxB,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,OAAA,EAAA,8BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,mDAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,yBAAA,EAAA,4BAAA,EAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACrB,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACR,mBAAmB,EAAA,IAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAUV,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBA3BzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iCAAiC,mBAG1B,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,kBAAkB;wBAClB,eAAe;wBACf,aAAa;wBACb,mBAAmB;wBACnB,cAAc;wBACd,eAAe;wBACf,wBAAwB;wBACxB,qBAAqB;wBACrB,QAAQ;wBACR,mBAAmB;qBACpB,EAAA,SAAA,EACU;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,mCAAmC,CAAC;AAC5D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,89EAAA,EAAA,MAAA,EAAA,CAAA,4HAAA,CAAA,EAAA;;sBA0CA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBACvC,SAAS;uBAAC,MAAM;;sBAChB,SAAS;uBAAC,sBAAsB;;sBAIhC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAIA;;sBACA;;sBAGA;;sBASA;;sBASA;;sBAMA;;sBAWA;;sBAwBA;;sBAqBA;;sBAeA;;sBAqCA;;AAujBH;;AAEG;AACG,SAAU,qBAAqB,CACnC,OAAwB,EAAA;;;;AAKxB,IAAA,IACE,OAAO,CAAC,KAAK,KAAK,IAAI;AACtB,QAAA,OAAO,OAAO,CAAC,KAAK,KAAK,WAAW;AACpC,QAAA,OAAO,CAAC,KAAK,KAAK,EAAE,EACpB;QACA,OAAO,IAAI,CAAC;IACd;AAEA,IAAA,IACE,OAAO,OAAO,EAAE,KAAK,KAAK,QAAQ;QAClC,OAAO,EAAE,KAAK,KAAK,IAAI;AACvB,QAAA,IAAI,IAAI,OAAO,CAAC,KAAK,EACrB;AACA,QAAA,OAAO,IAAI;IACb;;AAEA,IAAA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE;AACnC;;AEn4BA;;AAEG;;ACFH;;AAEG;;;;"}