{"version":3,"file":"lazy-everything.mjs","sources":["../../../src/lib/performance/lazy-everything.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\n/**\n * @file Universal Lazy Loading System\n * @description PhD-level lazy loading infrastructure that handles components, images,\n * modules, and data with intelligent scheduling, network awareness, and SSR support.\n *\n * Features:\n * - IntersectionObserver pooling for efficient DOM observation\n * - Network-aware loading strategies (4G full, 3G lite, 2G minimal)\n * - SSR-compatible lazy components with hydration coordination\n * - Blur-up image placeholders with LQIP support\n * - Module preloading with priority hints\n * - Automatic retry with exponential backoff\n * - Memory-aware loading throttling\n */\n\nimport React, {\n  lazy,\n  Suspense,\n  useState,\n  useEffect,\n  useRef,\n  useCallback,\n  type ComponentType,\n  type ReactNode,\n  type LazyExoticComponent,\n} from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network quality tiers for adaptive loading\n */\nexport type NetworkTier = 'high' | 'medium' | 'low' | 'offline';\n\n/**\n * Loading priority levels\n */\nexport type LoadingPriority = 'critical' | 'high' | 'normal' | 'low' | 'idle';\n\n/**\n * Lazy loading strategy\n */\nexport type LazyStrategy =\n  | 'viewport'      // Load when in viewport\n  | 'interaction'   // Load on user interaction\n  | 'idle'          // Load when browser is idle\n  | 'immediate'     // Load immediately\n  | 'network-aware'; // Adapt based on network\n\n/**\n * Observer entry with component context\n */\ninterface ObserverEntry {\n  element: Element;\n  callback: (isIntersecting: boolean) => void;\n  threshold: number;\n  rootMargin: string;\n}\n\n/**\n * Lazy component configuration\n */\nexport interface LazyComponentConfig<P = unknown> {\n  /** Import function */\n  loader: () => Promise<{ default: ComponentType<P> }>;\n  /** Loading priority */\n  priority?: LoadingPriority;\n  /** Loading strategy */\n  strategy?: LazyStrategy;\n  /** Preload on hover/focus */\n  preloadOnInteraction?: boolean;\n  /** SSR fallback */\n  ssrFallback?: ReactNode;\n  /** Error fallback */\n  errorFallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);\n  /** Loading fallback */\n  loadingFallback?: ReactNode;\n  /** Minimum loading time for UX */\n  minLoadingTime?: number;\n  /** Retry count on failure */\n  retryCount?: number;\n  /** Retry delay in ms */\n  retryDelay?: number;\n  /** Chunk name for webpack */\n  chunkName?: string;\n}\n\n/**\n * Lazy image configuration\n */\nexport interface LazyImageConfig {\n  /** Image source */\n  src: string;\n  /** Placeholder image (LQIP) */\n  placeholder?: string;\n  /** Alt text */\n  alt: string;\n  /** Width */\n  width?: number;\n  /** Height */\n  height?: number;\n  /** Srcset for responsive images */\n  srcSet?: string;\n  /** Sizes attribute */\n  sizes?: string;\n  /** Loading strategy */\n  strategy?: LazyStrategy;\n  /** Root margin for early loading */\n  rootMargin?: string;\n  /** Enable blur-up effect */\n  blurUp?: boolean;\n  /** Blur radius for placeholder */\n  blurRadius?: number;\n  /** Decode async */\n  decodeAsync?: boolean;\n  /** onLoad callback */\n  onLoad?: () => void;\n  /** onError callback */\n  onError?: (error: Error) => void;\n}\n\n/**\n * Module preload configuration\n */\nexport interface ModulePreloadConfig {\n  /** Module path or import function */\n  module: string | (() => Promise<unknown>);\n  /** Preload priority */\n  priority?: LoadingPriority;\n  /** Trigger condition */\n  trigger?: 'immediate' | 'idle' | 'viewport' | 'route';\n  /** Associated route pattern */\n  routePattern?: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst PRIORITY_WEIGHTS: Record<LoadingPriority, number> = {\n  critical: 100,\n  high: 75,\n  normal: 50,\n  low: 25,\n  idle: 0,\n};\n\nconst DEFAULT_ROOT_MARGIN = '200px';\nconst DEFAULT_THRESHOLD = 0.01;\nconst DEFAULT_RETRY_COUNT = 3;\nconst DEFAULT_RETRY_DELAY = 1000;\nconst DEFAULT_MIN_LOADING_TIME = 100;\n\n// ============================================================================\n// IntersectionObserver Pool\n// ============================================================================\n\n/**\n * Pooled IntersectionObserver manager for efficient DOM observation\n * Reduces observer instances by grouping elements with same config\n *\n * Memory Optimization: Includes periodic cleanup of orphaned entries\n * to prevent memory leaks from disconnected DOM elements.\n */\nclass ObserverPool {\n  private static instance: ObserverPool;\n  private static readonly CLEANUP_INTERVAL = 30000; // 30 seconds\n  private observers: Map<string, IntersectionObserver> = new Map();\n  private entries: Map<Element, ObserverEntry> = new Map();\n  private callbacks: Map<Element, (isIntersecting: boolean) => void> = new Map();\n  private cleanupIntervalId: ReturnType<typeof setInterval> | null = null;\n\n  private constructor() {\n    // Start periodic cleanup for orphaned entries\n    this.startCleanupInterval();\n  }\n\n  static getInstance(): ObserverPool {\n    ObserverPool.instance ??= new ObserverPool();\n    return ObserverPool.instance;\n  }\n\n  /**\n   * Reset singleton instance (for testing and HMR)\n   */\n  static reset(): void {\n    if (ObserverPool.instance != null) {\n      ObserverPool.instance.disconnectAll();\n      // Type-safe null assignment\n      (ObserverPool as unknown as { instance: ObserverPool | null }).instance = null;\n    }\n  }\n\n  /**\n   * Observe an element\n   */\n  observe(\n    element: Element,\n    callback: (isIntersecting: boolean) => void,\n    options: { threshold?: number; rootMargin?: string } = {}\n  ): () => void {\n    const threshold = options.threshold ?? DEFAULT_THRESHOLD;\n    const rootMargin = options.rootMargin ?? DEFAULT_ROOT_MARGIN;\n\n    const observer = this.getObserver(threshold, rootMargin);\n    this.callbacks.set(element, callback);\n    this.entries.set(element, { element, callback, threshold, rootMargin });\n    observer.observe(element);\n\n    return () => this.unobserve(element, threshold, rootMargin);\n  }\n\n  /**\n   * Unobserve an element\n   */\n  unobserve(element: Element, threshold: number, rootMargin: string): void {\n    const key = this.getKey(threshold, rootMargin);\n    const observer = this.observers.get(key);\n\n    if (observer !== undefined) {\n      observer.unobserve(element);\n      this.callbacks.delete(element);\n      this.entries.delete(element);\n    }\n  }\n\n  /**\n   * Disconnect all observers and clean up resources\n   */\n  disconnectAll(): void {\n    this.stopCleanupInterval();\n    this.observers.forEach((observer) => observer.disconnect());\n    this.observers.clear();\n    this.callbacks.clear();\n    this.entries.clear();\n  }\n\n  /**\n   * Get current entry count (for debugging/monitoring)\n   */\n  getEntryCount(): number {\n    return this.entries.size;\n  }\n\n  /**\n   * Start periodic cleanup of orphaned entries\n   * Memory leak prevention: Removes entries for elements no longer in DOM\n   */\n  private startCleanupInterval(): void {\n    if (this.cleanupIntervalId !== null) return;\n\n    this.cleanupIntervalId = setInterval(() => {\n      this.cleanupOrphanedEntries();\n    }, ObserverPool.CLEANUP_INTERVAL);\n  }\n\n  /**\n   * Stop cleanup interval\n   */\n  private stopCleanupInterval(): void {\n    if (this.cleanupIntervalId !== null) {\n      clearInterval(this.cleanupIntervalId);\n      this.cleanupIntervalId = null;\n    }\n  }\n\n  /**\n   * Remove entries for elements that are no longer connected to the DOM\n   * This prevents memory leaks from strong references to disconnected elements\n   */\n  private cleanupOrphanedEntries(): void {\n    const orphanedElements: Element[] = [];\n\n    // Find elements that are no longer in the DOM\n    for (const [element] of this.entries) {\n      if (!element.isConnected) {\n        orphanedElements.push(element);\n      }\n    }\n\n    // Clean up orphaned entries\n    for (const element of orphanedElements) {\n      const entry = this.entries.get(element);\n      if (entry !== undefined) {\n        this.unobserve(element, entry.threshold, entry.rootMargin);\n      }\n    }\n\n    if (orphanedElements.length > 0 && typeof console !== 'undefined' && console !== null) {\n      // Debug log for development\n      if (process.env.NODE_ENV === 'development') {\n        // eslint-disable-next-line no-console -- debug logging in development\n        console.debug(`[ObserverPool] Cleaned up ${orphanedElements.length} orphaned entries`);\n      }\n    }\n  }\n\n  /**\n   * Generate cache key for observer config\n   */\n  private getKey(threshold: number, rootMargin: string): string {\n    return `${threshold}-${rootMargin}`;\n  }\n\n  /**\n   * Get or create observer for config\n   */\n  private getObserver(threshold: number, rootMargin: string): IntersectionObserver {\n    const key = this.getKey(threshold, rootMargin);\n\n    if (!this.observers.has(key)) {\n      const observer = new IntersectionObserver(\n        (entries) => {\n          entries.forEach((entry) => {\n            const callback = this.callbacks.get(entry.target);\n            callback?.(entry.isIntersecting);\n          });\n        },\n        { threshold, rootMargin }\n      );\n      this.observers.set(key, observer);\n    }\n\n    const obs = this.observers.get(key);\n    if (obs == null) {\n      throw new Error('Observer not found after creation');\n    }\n    return obs;\n  }\n}\n\n// ============================================================================\n// Network Quality Detection\n// ============================================================================\n\n/**\n * Get current network quality tier\n */\nexport function getNetworkTier(): NetworkTier {\n  if (typeof navigator === 'undefined') return 'high';\n\n  if (!navigator.onLine) return 'offline';\n\n  const {connection} = (navigator as Navigator & {\n    connection?: {\n      effectiveType?: string;\n      downlink?: number;\n      saveData?: boolean;\n    };\n  });\n\n  if (connection === undefined || connection === null) return 'high';\n\n  // Respect data saver\n  if (connection.saveData === true) return 'low';\n\n  // Check effective type\n  const {effectiveType} = connection;\n  if (effectiveType === '4g') return 'high';\n  if (effectiveType === '3g') return 'medium';\n  return 'low';\n}\n\n/**\n * Check if network allows loading\n */\nexport function shouldLoadOnNetwork(\n  priority: LoadingPriority,\n  tier: NetworkTier = getNetworkTier()\n): boolean {\n  if (tier === 'offline') return false;\n  if (priority === 'critical') return true;\n  if (tier === 'high') return true;\n  if (tier === 'medium') return priority !== 'idle' && priority !== 'low';\n  return priority === 'high';\n}\n\n// ============================================================================\n// Module Preloader\n// ============================================================================\n\n/**\n * Intelligent module preloader with priority queue\n */\nclass ModulePreloader {\n  private static instance: ModulePreloader;\n  private preloadQueue: Array<{\n    config: ModulePreloadConfig;\n    priority: number;\n  }> = [];\n  private loadedModules: Set<string> = new Set();\n  private loadingModules: Set<string> = new Set();\n  private isProcessing = false;\n\n  static getInstance(): ModulePreloader {\n    ModulePreloader.instance ??= new ModulePreloader();\n    return ModulePreloader.instance;\n  }\n\n  /**\n   * Queue module for preloading\n   */\n  queue(config: ModulePreloadConfig): void {\n    const moduleId = typeof config.module === 'string'\n      ? config.module\n      : config.module.toString();\n\n    if (this.loadedModules.has(moduleId) || this.loadingModules.has(moduleId)) {\n      return;\n    }\n\n    const priority = PRIORITY_WEIGHTS[config.priority ?? 'normal'];\n    this.preloadQueue.push({ config, priority });\n    this.preloadQueue.sort((a, b) => b.priority - a.priority);\n\n    this.processQueue();\n  }\n\n  /**\n   * Check if module is loaded\n   */\n  isLoaded(moduleId: string): boolean {\n    return this.loadedModules.has(moduleId);\n  }\n\n  /**\n   * Clear all preloaded modules (for testing)\n   */\n  reset(): void {\n    this.preloadQueue = [];\n    this.loadedModules.clear();\n    this.loadingModules.clear();\n    this.isProcessing = false;\n  }\n\n  /**\n   * Process preload queue during idle time\n   */\n  private processQueue(): void {\n    if (this.isProcessing || this.preloadQueue.length === 0) return;\n\n    this.isProcessing = true;\n\n    const process = (deadline?: IdleDeadline): void => {\n      while (\n        this.preloadQueue.length > 0 &&\n        (deadline === undefined || deadline.timeRemaining() > 5)\n      ) {\n        const item = this.preloadQueue.shift();\n        if (item === undefined) break;\n\n        void this.loadModule(item.config);\n      }\n\n      if (this.preloadQueue.length > 0) {\n        if (typeof requestIdleCallback !== 'undefined') {\n          requestIdleCallback(process);\n        } else {\n          setTimeout(() => process(), 50);\n        }\n      } else {\n        this.isProcessing = false;\n      }\n    };\n\n    if (typeof requestIdleCallback !== 'undefined') {\n      requestIdleCallback(process);\n    } else {\n      setTimeout(() => process(), 0);\n    }\n  }\n\n  /**\n   * Load a module\n   */\n  private async loadModule(config: ModulePreloadConfig): Promise<void> {\n    const moduleId = typeof config.module === 'string'\n      ? config.module\n      : config.module.toString();\n\n    if (this.loadingModules.has(moduleId)) return;\n    this.loadingModules.add(moduleId);\n\n    try {\n      if (typeof config.module === 'function') {\n        await config.module();\n      } else {\n        // For string paths, use dynamic import\n        await import(/* webpackChunkName: \"[request]\" */ config.module);\n      }\n      this.loadedModules.add(moduleId);\n    } catch (error) {\n      console.warn(`[ModulePreloader] Failed to preload: ${moduleId}`, error);\n    } finally {\n      this.loadingModules.delete(moduleId);\n    }\n  }\n}\n\n// ============================================================================\n// Lazy Component Factory\n// ============================================================================\n\n/**\n * Create a lazy component with advanced features\n */\nexport function createLazyComponent<P extends object = object>(\n  config: LazyComponentConfig<P>\n): LazyExoticComponent<ComponentType<P>> & {\n  preload: () => Promise<void>;\n} {\n  const {\n    loader,\n    retryCount = DEFAULT_RETRY_COUNT,\n    retryDelay = DEFAULT_RETRY_DELAY,\n    minLoadingTime = DEFAULT_MIN_LOADING_TIME,\n  } = config;\n\n  let loadPromise: Promise<{ default: ComponentType<P> }> | null = null;\n  let loadedModule: { default: ComponentType<P> } | null = null;\n\n  /**\n   * Load with retry logic\n   */\n  const loadWithRetry = async (\n    attempt = 0\n  ): Promise<{ default: ComponentType<P> }> => {\n    const startTime = Date.now();\n\n    try {\n      const module = await loader();\n\n      // Enforce minimum loading time for UX\n      const elapsed = Date.now() - startTime;\n      if (elapsed < minLoadingTime) {\n        await new Promise((r) => setTimeout(r, minLoadingTime - elapsed));\n      }\n\n      loadedModule = module;\n      return module;\n    } catch (error) {\n      if (attempt < retryCount) {\n        await new Promise((r) => setTimeout(r, retryDelay * Math.pow(2, attempt)));\n        return loadWithRetry(attempt + 1);\n      }\n      throw error;\n    }\n  };\n\n  /**\n   * Get or create load promise\n   */\n  const getLoadPromise = async (): Promise<{ default: ComponentType<P> }> => {\n    if (loadedModule !== null) {\n      return Promise.resolve(loadedModule);\n    }\n    loadPromise ??= loadWithRetry();\n    return loadPromise;\n  };\n\n  // Create the lazy component\n  const LazyComponent = lazy(getLoadPromise) as LazyExoticComponent<ComponentType<P>> & {\n    preload: () => Promise<void>;\n  };\n\n  // Add preload method\n  LazyComponent.preload = async (): Promise<void> => {\n    await getLoadPromise();\n  };\n\n  return LazyComponent;\n}\n\n/**\n * Higher-order component for lazy loading with full configuration\n */\nexport function withLazyLoading<P extends object>(\n  config: LazyComponentConfig<P>\n): React.FC<P & {\n  lazyFallback?: ReactNode;\n  lazyErrorFallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);\n}> {\n  const LazyComponent = createLazyComponent(config);\n\n  return function LazyWrapper({ lazyFallback, lazyErrorFallback, ...props }: P & {\n    lazyFallback?: ReactNode;\n    lazyErrorFallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);\n  }) {\n    const [error, setError] = useState<Error | null>(null);\n    const [retryCount, setRetryCount] = useState(0);\n\n    const fallback = lazyFallback ?? config.loadingFallback ?? null;\n    const errorFallbackFn = lazyErrorFallback ?? config.errorFallback;\n\n    const retry = useCallback(() => {\n      setError(null);\n      setRetryCount((c) => c + 1);\n    }, []);\n\n    if (error !== null) {\n      if (typeof errorFallbackFn === 'function') {\n        return <>{errorFallbackFn(error, retry)}</>;\n      }\n      return <>{errorFallbackFn ?? 'Failed to load component'}</>;\n    }\n\n    // Type-safe props spreading: props is correctly typed as P after destructuring\n    return (\n      <Suspense fallback={fallback} key={retryCount}>\n        <ErrorBoundaryWrapper onError={setError}>\n          <LazyComponent {...(props as P)} />\n        </ErrorBoundaryWrapper>\n      </Suspense>\n    );\n  };\n}\n\n// Simple error boundary wrapper\nclass ErrorBoundaryWrapper extends React.Component<\n  { children: ReactNode; onError: (error: Error) => void },\n  { hasError: boolean }\n> {\n  constructor(props: { children: ReactNode; onError: (error: Error) => void }) {\n    super(props);\n    this.state = { hasError: false };\n  }\n\n  static getDerivedStateFromError(): { hasError: boolean } {\n    return { hasError: true };\n  }\n\n  override componentDidCatch(error: Error): void {\n    this.props.onError(error);\n  }\n\n  override render(): ReactNode {\n    if (this.state.hasError) {\n      return null;\n    }\n    return this.props.children;\n  }\n}\n\n// ============================================================================\n// Lazy Image Component\n// ============================================================================\n\n/**\n * Lazy image with blur-up placeholder and network awareness\n */\nexport function LazyImage({\n  src,\n  placeholder,\n  alt,\n  width,\n  height,\n  srcSet,\n  sizes,\n  strategy = 'viewport',\n  rootMargin = DEFAULT_ROOT_MARGIN,\n  blurUp = true,\n  blurRadius = 20,\n  decodeAsync = true,\n  onLoad,\n  onError,\n  ...props\n}: LazyImageConfig & React.ImgHTMLAttributes<HTMLImageElement>): React.JSX.Element {\n  const [isInView, setIsInView] = useState(strategy === 'immediate');\n  const [isLoaded, setIsLoaded] = useState(false);\n  const [hasError, setHasError] = useState(false);\n  const imgRef = useRef<HTMLImageElement>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  // Observe viewport intersection\n  useEffect(() => {\n    if (strategy !== 'viewport' || isInView) return;\n\n    const element = containerRef.current;\n    if (element === null) return;\n\n    const pool = ObserverPool.getInstance();\n    return pool.observe(\n      element,\n      (intersecting) => {\n        if (intersecting) setIsInView(true);\n      },\n      { rootMargin }\n    );\n  }, [strategy, rootMargin, isInView]);\n\n  // Preload image\n  useEffect(() => {\n    if (!isInView || isLoaded) return;\n\n    const img = new Image();\n\n    img.onload = async () => {\n      // Decode async for smoother rendering\n      if (decodeAsync === true && 'decode' in img) {\n        try {\n          await img.decode();\n        } catch {\n          // Decode failed, but image loaded\n        }\n      }\n      setIsLoaded(true);\n      onLoad?.();\n    };\n\n    img.onerror = () => {\n      setHasError(true);\n      onError?.(new Error(`Failed to load image: ${src}`));\n    };\n\n    if (srcSet !== undefined) img.srcset = srcSet;\n    if (sizes !== undefined) img.sizes = sizes;\n    img.src = src;\n  }, [isInView, src, srcSet, sizes, decodeAsync, isLoaded, onLoad, onError]);\n\n  const containerStyle: React.CSSProperties = {\n    position: 'relative',\n    width: width !== undefined && width !== 0 ? `${width}px` : '100%',\n    height: height !== undefined && height !== 0 ? `${height}px` : 'auto',\n    overflow: 'hidden',\n  };\n\n  const placeholderStyle: React.CSSProperties = {\n    position: 'absolute',\n    inset: 0,\n    width: '100%',\n    height: '100%',\n    objectFit: 'cover',\n    filter: blurUp === true ? `blur(${blurRadius}px)` : undefined,\n    transform: blurUp === true ? 'scale(1.1)' : undefined,\n    transition: 'opacity 0.3s ease',\n    opacity: isLoaded ? 0 : 1,\n  };\n\n  const imgStyle: React.CSSProperties = {\n    width: '100%',\n    height: '100%',\n    objectFit: 'cover',\n    opacity: isLoaded ? 1 : 0,\n    transition: 'opacity 0.3s ease',\n  };\n\n  if (hasError) {\n    return (\n      <div\n        ref={containerRef}\n        style={{ ...containerStyle, background: '#f0f0f0' }}\n        role=\"img\"\n        aria-label={`Failed to load: ${alt}`}\n      />\n    );\n  }\n\n  return (\n    <div ref={containerRef} style={containerStyle}>\n      {placeholder !== undefined && (\n        <img\n          src={placeholder}\n          alt=\"\"\n          style={placeholderStyle}\n          aria-hidden=\"true\"\n        />\n      )}\n      {isInView && (\n        <img\n          ref={imgRef}\n          src={src}\n          srcSet={srcSet}\n          sizes={sizes}\n          alt={alt}\n          width={width}\n          height={height}\n          style={imgStyle}\n          loading=\"lazy\"\n          decoding={decodeAsync ? 'async' : 'sync'}\n          {...props}\n        />\n      )}\n    </div>\n  );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook for lazy loading any element on viewport intersection\n */\nexport function useLazyVisible(options: {\n  rootMargin?: string;\n  threshold?: number;\n  triggerOnce?: boolean;\n} = {}): {\n  ref: React.RefObject<HTMLDivElement | null>;\n  isVisible: boolean;\n  hasBeenVisible: boolean;\n} {\n  const {\n    rootMargin = DEFAULT_ROOT_MARGIN,\n    threshold = DEFAULT_THRESHOLD,\n    triggerOnce = true,\n  } = options;\n\n  const ref = useRef<HTMLDivElement>(null);\n  const [isVisible, setIsVisible] = useState(false);\n  const [hasBeenVisible, setHasBeenVisible] = useState(false);\n\n  useEffect(() => {\n    const element = ref.current;\n    if (element === null) return;\n\n    if (triggerOnce && hasBeenVisible) return;\n\n    const pool = ObserverPool.getInstance();\n    return pool.observe(\n      element,\n      (intersecting) => {\n        setIsVisible(intersecting);\n        if (intersecting) setHasBeenVisible(true);\n      },\n      { rootMargin, threshold }\n    );\n  }, [rootMargin, threshold, triggerOnce, hasBeenVisible]);\n\n  return { ref, isVisible, hasBeenVisible };\n}\n\n/**\n * Hook for preloading modules\n */\nexport function useModulePreload(configs: ModulePreloadConfig[]): void {\n  useEffect(() => {\n    const preloader = ModulePreloader.getInstance();\n    configs.forEach((config) => preloader.queue(config));\n  }, [configs]);\n}\n\n/**\n * Hook for network-aware loading decisions\n */\nexport function useNetworkAwareLoading(priority: LoadingPriority = 'normal'): {\n  networkTier: NetworkTier;\n  shouldLoad: boolean;\n  isOnline: boolean;\n} {\n  const [networkTier, setNetworkTier] = useState<NetworkTier>(getNetworkTier);\n\n  useEffect(() => {\n    const updateTier = (): void => setNetworkTier(getNetworkTier());\n\n    window.addEventListener('online', updateTier);\n    window.addEventListener('offline', updateTier);\n\n    const {connection} = (navigator as Navigator & {\n      connection?: { addEventListener: (type: string, handler: () => void) => void };\n    });\n\n    if (connection?.addEventListener !== undefined) {\n      connection.addEventListener('change', updateTier);\n    }\n\n    return () => {\n      window.removeEventListener('online', updateTier);\n      window.removeEventListener('offline', updateTier);\n    };\n  }, []);\n\n  return {\n    networkTier,\n    shouldLoad: shouldLoadOnNetwork(priority, networkTier),\n    isOnline: networkTier !== 'offline',\n  };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Preload a component imperatively\n */\nexport async function preloadComponent<P extends object>(\n  config: LazyComponentConfig<P>\n): Promise<void> {\n  const LazyComponent = createLazyComponent(config);\n  return LazyComponent.preload();\n}\n\n/**\n * Preload multiple components in parallel\n */\nexport async function preloadComponents(\n  configs: Array<LazyComponentConfig>\n): Promise<void> {\n  await Promise.all(configs.map(preloadComponent));\n}\n\n/**\n * Queue module for preloading\n */\nexport function queueModulePreload(config: ModulePreloadConfig): void {\n  ModulePreloader.getInstance().queue(config);\n}\n\n/**\n * Reset observer pool (for testing and HMR)\n */\nexport function resetObserverPool(): void {\n  ObserverPool.reset();\n}\n\n/**\n * Reset module preloader (for testing)\n */\nexport function resetModulePreloader(): void {\n  ModulePreloader.getInstance().reset();\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n  ObserverPool,\n  ModulePreloader,\n};\n\nexport default {\n  createLazyComponent,\n  withLazyLoading,\n  LazyImage,\n  useLazyVisible,\n  useModulePreload,\n  useNetworkAwareLoading,\n  preloadComponent,\n  preloadComponents,\n  queueModulePreload,\n  getNetworkTier,\n  shouldLoadOnNetwork,\n};\n\n// ============================================================================\n// HMR Support\n// ============================================================================\n\n// Vite HMR disposal to prevent memory leaks during hot module replacement\nif (import.meta.hot) {\n  import.meta.hot.dispose(() => {\n    ObserverPool.reset();\n    ModulePreloader.getInstance().reset();\n  });\n}\n"],"names":["PRIORITY_WEIGHTS","DEFAULT_ROOT_MARGIN","DEFAULT_THRESHOLD","DEFAULT_RETRY_COUNT","DEFAULT_RETRY_DELAY","DEFAULT_MIN_LOADING_TIME","ObserverPool","element","callback","options","threshold","rootMargin","observer","key","orphanedElements","entry","entries","obs","getNetworkTier","connection","effectiveType","shouldLoadOnNetwork","priority","tier","ModulePreloader","config","moduleId","a","b","process","deadline","item","error","createLazyComponent","loader","retryCount","retryDelay","minLoadingTime","loadPromise","loadedModule","loadWithRetry","attempt","startTime","module","elapsed","r","getLoadPromise","LazyComponent","lazy","withLazyLoading","lazyFallback","lazyErrorFallback","props","setError","useState","setRetryCount","fallback","errorFallbackFn","retry","useCallback","c","jsx","Fragment","Suspense","ErrorBoundaryWrapper","React","LazyImage","src","placeholder","alt","width","height","srcSet","sizes","strategy","blurUp","blurRadius","decodeAsync","onLoad","onError","isInView","setIsInView","isLoaded","setIsLoaded","hasError","setHasError","imgRef","useRef","containerRef","useEffect","intersecting","img","containerStyle","placeholderStyle","imgStyle","useLazyVisible","triggerOnce","ref","isVisible","setIsVisible","hasBeenVisible","setHasBeenVisible","useModulePreload","configs","preloader","useNetworkAwareLoading","networkTier","setNetworkTier","updateTier","preloadComponent","preloadComponents","queueModulePreload","resetObserverPool","resetModulePreloader"],"mappings":";;AA8IA,MAAMA,IAAoD;AAAA,EACxD,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AACR,GAEMC,IAAsB,SACtBC,IAAoB,MACpBC,IAAsB,GACtBC,IAAsB,KACtBC,IAA2B;AAajC,MAAMC,EAAa;AAAA,EACjB,OAAe;AAAA,EACf,OAAwB,mBAAmB;AAAA;AAAA,EACnC,gCAAmD,IAAA;AAAA,EACnD,8BAA2C,IAAA;AAAA,EAC3C,gCAAiE,IAAA;AAAA,EACjE,oBAA2D;AAAA,EAE3D,cAAc;AAEpB,SAAK,qBAAA;AAAA,EACP;AAAA,EAEA,OAAO,cAA4B;AACjC,WAAAA,EAAa,aAAa,IAAIA,EAAA,GACvBA,EAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAc;AACnB,IAAIA,EAAa,YAAY,SAC3BA,EAAa,SAAS,cAAA,GAErBA,EAA8D,WAAW;AAAA,EAE9E;AAAA;AAAA;AAAA;AAAA,EAKA,QACEC,GACAC,GACAC,IAAuD,CAAA,GAC3C;AACZ,UAAMC,IAAYD,EAAQ,aAAaP,GACjCS,IAAaF,EAAQ,cAAcR,GAEnCW,IAAW,KAAK,YAAYF,GAAWC,CAAU;AACvD,gBAAK,UAAU,IAAIJ,GAASC,CAAQ,GACpC,KAAK,QAAQ,IAAID,GAAS,EAAE,SAAAA,GAAS,UAAAC,GAAU,WAAAE,GAAW,YAAAC,GAAY,GACtEC,EAAS,QAAQL,CAAO,GAEjB,MAAM,KAAK,UAAUA,GAASG,GAAWC,CAAU;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUJ,GAAkBG,GAAmBC,GAA0B;AACvE,UAAME,IAAM,KAAK,OAAOH,GAAWC,CAAU,GACvCC,IAAW,KAAK,UAAU,IAAIC,CAAG;AAEvC,IAAID,MAAa,WACfA,EAAS,UAAUL,CAAO,GAC1B,KAAK,UAAU,OAAOA,CAAO,GAC7B,KAAK,QAAQ,OAAOA,CAAO;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAsB;AACpB,SAAK,oBAAA,GACL,KAAK,UAAU,QAAQ,CAACK,MAAaA,EAAS,YAAY,GAC1D,KAAK,UAAU,MAAA,GACf,KAAK,UAAU,MAAA,GACf,KAAK,QAAQ,MAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACtB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAA6B;AACnC,IAAI,KAAK,sBAAsB,SAE/B,KAAK,oBAAoB,YAAY,MAAM;AACzC,WAAK,uBAAA;AAAA,IACP,GAAGN,EAAa,gBAAgB;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,IAAI,KAAK,sBAAsB,SAC7B,cAAc,KAAK,iBAAiB,GACpC,KAAK,oBAAoB;AAAA,EAE7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAA+B;AACrC,UAAMQ,IAA8B,CAAA;AAGpC,eAAW,CAACP,CAAO,KAAK,KAAK;AAC3B,MAAKA,EAAQ,eACXO,EAAiB,KAAKP,CAAO;AAKjC,eAAWA,KAAWO,GAAkB;AACtC,YAAMC,IAAQ,KAAK,QAAQ,IAAIR,CAAO;AACtC,MAAIQ,MAAU,UACZ,KAAK,UAAUR,GAASQ,EAAM,WAAWA,EAAM,UAAU;AAAA,IAE7D;AAEA,IAAID,EAAiB,SAAS,KAAK,OAAO,UAAY,OAAe,YAAY,QAE3E,QAAQ,IAAI,aAAa,iBAE3B,QAAQ,MAAM,6BAA6BA,EAAiB,MAAM,mBAAmB;AAAA,EAG3F;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAOJ,GAAmBC,GAA4B;AAC5D,WAAO,GAAGD,CAAS,IAAIC,CAAU;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAYD,GAAmBC,GAA0C;AAC/E,UAAME,IAAM,KAAK,OAAOH,GAAWC,CAAU;AAE7C,QAAI,CAAC,KAAK,UAAU,IAAIE,CAAG,GAAG;AAC5B,YAAMD,IAAW,IAAI;AAAA,QACnB,CAACI,MAAY;AACX,UAAAA,EAAQ,QAAQ,CAACD,MAAU;AAEzB,YADiB,KAAK,UAAU,IAAIA,EAAM,MAAM,IACrCA,EAAM,cAAc;AAAA,UACjC,CAAC;AAAA,QACH;AAAA,QACA,EAAE,WAAAL,GAAW,YAAAC,EAAA;AAAA,MAAW;AAE1B,WAAK,UAAU,IAAIE,GAAKD,CAAQ;AAAA,IAClC;AAEA,UAAMK,IAAM,KAAK,UAAU,IAAIJ,CAAG;AAClC,QAAII,KAAO;AACT,YAAM,IAAI,MAAM,mCAAmC;AAErD,WAAOA;AAAA,EACT;AACF;AASO,SAASC,IAA8B;AAC5C,MAAI,OAAO,YAAc,IAAa,QAAO;AAE7C,MAAI,CAAC,UAAU,OAAQ,QAAO;AAE9B,QAAM,EAAC,YAAAC,MAAe;AAQtB,MAAgCA,KAAe,KAAM,QAAO;AAG5D,MAAIA,EAAW,aAAa,GAAM,QAAO;AAGzC,QAAM,EAAC,eAAAC,MAAiBD;AACxB,SAAIC,MAAkB,OAAa,SAC/BA,MAAkB,OAAa,WAC5B;AACT;AAKO,SAASC,EACdC,GACAC,IAAoBL,KACX;AACT,SAAIK,MAAS,YAAkB,KAC3BD,MAAa,cACbC,MAAS,SAAe,KACxBA,MAAS,WAAiBD,MAAa,UAAUA,MAAa,QAC3DA,MAAa;AACtB;AASA,MAAME,EAAgB;AAAA,EACpB,OAAe;AAAA,EACP,eAGH,CAAA;AAAA,EACG,oCAAiC,IAAA;AAAA,EACjC,qCAAkC,IAAA;AAAA,EAClC,eAAe;AAAA,EAEvB,OAAO,cAA+B;AACpC,WAAAA,EAAgB,aAAa,IAAIA,EAAA,GAC1BA,EAAgB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMC,GAAmC;AACvC,UAAMC,IAAW,OAAOD,EAAO,UAAW,WACtCA,EAAO,SACPA,EAAO,OAAO,SAAA;AAElB,QAAI,KAAK,cAAc,IAAIC,CAAQ,KAAK,KAAK,eAAe,IAAIA,CAAQ;AACtE;AAGF,UAAMJ,IAAWtB,EAAiByB,EAAO,YAAY,QAAQ;AAC7D,SAAK,aAAa,KAAK,EAAE,QAAAA,GAAQ,UAAAH,GAAU,GAC3C,KAAK,aAAa,KAAK,CAACK,GAAGC,MAAMA,EAAE,WAAWD,EAAE,QAAQ,GAExD,KAAK,aAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,SAASD,GAA2B;AAClC,WAAO,KAAK,cAAc,IAAIA,CAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,eAAe,CAAA,GACpB,KAAK,cAAc,MAAA,GACnB,KAAK,eAAe,MAAA,GACpB,KAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAC3B,QAAI,KAAK,gBAAgB,KAAK,aAAa,WAAW,EAAG;AAEzD,SAAK,eAAe;AAEpB,UAAMG,IAAU,CAACC,MAAkC;AACjD,aACE,KAAK,aAAa,SAAS,MAC1BA,MAAa,UAAaA,EAAS,kBAAkB,MACtD;AACA,cAAMC,IAAO,KAAK,aAAa,MAAA;AAC/B,YAAIA,MAAS,OAAW;AAExB,QAAK,KAAK,WAAWA,EAAK,MAAM;AAAA,MAClC;AAEA,MAAI,KAAK,aAAa,SAAS,IACzB,OAAO,sBAAwB,MACjC,oBAAoBF,CAAO,IAE3B,WAAW,MAAMA,EAAAA,GAAW,EAAE,IAGhC,KAAK,eAAe;AAAA,IAExB;AAEA,IAAI,OAAO,sBAAwB,MACjC,oBAAoBA,CAAO,IAE3B,WAAW,MAAMA,EAAAA,GAAW,CAAC;AAAA,EAEjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAWJ,GAA4C;AACnE,UAAMC,IAAW,OAAOD,EAAO,UAAW,WACtCA,EAAO,SACPA,EAAO,OAAO,SAAA;AAElB,QAAI,MAAK,eAAe,IAAIC,CAAQ,GACpC;AAAA,WAAK,eAAe,IAAIA,CAAQ;AAEhC,UAAI;AACF,QAAI,OAAOD,EAAO,UAAW,aAC3B,MAAMA,EAAO,OAAA,IAGb,MAAM;AAAA;AAAA,UAA2CA,EAAO;AAAA,WAE1D,KAAK,cAAc,IAAIC,CAAQ;AAAA,MACjC,SAASM,GAAO;AACd,gBAAQ,KAAK,wCAAwCN,CAAQ,IAAIM,CAAK;AAAA,MACxE,UAAA;AACE,aAAK,eAAe,OAAON,CAAQ;AAAA,MACrC;AAAA;AAAA,EACF;AACF;AASO,SAASO,EACdR,GAGA;AACA,QAAM;AAAA,IACJ,QAAAS;AAAA,IACA,YAAAC,IAAahC;AAAA,IACb,YAAAiC,IAAahC;AAAA,IACb,gBAAAiC,IAAiBhC;AAAA,EAAA,IACfoB;AAEJ,MAAIa,IAA6D,MAC7DC,IAAqD;AAKzD,QAAMC,IAAgB,OACpBC,IAAU,MACiC;AAC3C,UAAMC,IAAY,KAAK,IAAA;AAEvB,QAAI;AACF,YAAMC,IAAS,MAAMT,EAAA,GAGfU,IAAU,KAAK,IAAA,IAAQF;AAC7B,aAAIE,IAAUP,KACZ,MAAM,IAAI,QAAQ,CAACQ,MAAM,WAAWA,GAAGR,IAAiBO,CAAO,CAAC,GAGlEL,IAAeI,GACRA;AAAA,IACT,SAASX,GAAO;AACd,UAAIS,IAAUN;AACZ,qBAAM,IAAI,QAAQ,CAACU,MAAM,WAAWA,GAAGT,IAAa,KAAK,IAAI,GAAGK,CAAO,CAAC,CAAC,GAClED,EAAcC,IAAU,CAAC;AAElC,YAAMT;AAAA,IACR;AAAA,EACF,GAKMc,IAAiB,YACjBP,MAAiB,OACZ,QAAQ,QAAQA,CAAY,KAErCD,MAAgBE,EAAA,GACTF,IAIHS,IAAgBC,EAAKF,CAAc;AAKzC,SAAAC,EAAc,UAAU,YAA2B;AACjD,UAAMD,EAAA;AAAA,EACR,GAEOC;AACT;AAKO,SAASE,GACdxB,GAIC;AACD,QAAMsB,IAAgBd,EAAoBR,CAAM;AAEhD,SAAO,SAAqB,EAAE,cAAAyB,GAAc,mBAAAC,GAAmB,GAAGC,KAG/D;AACD,UAAM,CAACpB,GAAOqB,CAAQ,IAAIC,EAAuB,IAAI,GAC/C,CAACnB,GAAYoB,CAAa,IAAID,EAAS,CAAC,GAExCE,IAAWN,KAAgBzB,EAAO,mBAAmB,MACrDgC,IAAkBN,KAAqB1B,EAAO,eAE9CiC,IAAQC,EAAY,MAAM;AAC9B,MAAAN,EAAS,IAAI,GACbE,EAAc,CAACK,MAAMA,IAAI,CAAC;AAAA,IAC5B,GAAG,CAAA,CAAE;AAEL,WAAI5B,MAAU,OACR,OAAOyB,KAAoB,aACtB,gBAAAI,EAAAC,GAAA,EAAG,UAAAL,EAAgBzB,GAAO0B,CAAK,GAAE,sBAEnCI,GAAA,EAAG,eAAmB,4BAA2B,IAKxD,gBAAAD,EAACE,GAAA,EAAS,UAAAP,GACR,UAAA,gBAAAK,EAACG,GAAA,EAAqB,SAASX,GAC7B,UAAA,gBAAAQ,EAACd,GAAA,EAAe,GAAIK,EAAA,CAAa,EAAA,CACnC,EAAA,GAHiCjB,CAInC;AAAA,EAEJ;AACF;AAGA,MAAM6B,UAA6BC,EAAM,UAGvC;AAAA,EACA,YAAYb,GAAiE;AAC3E,UAAMA,CAAK,GACX,KAAK,QAAQ,EAAE,UAAU,GAAA;AAAA,EAC3B;AAAA,EAEA,OAAO,2BAAkD;AACvD,WAAO,EAAE,UAAU,GAAA;AAAA,EACrB;AAAA,EAES,kBAAkBpB,GAAoB;AAC7C,SAAK,MAAM,QAAQA,CAAK;AAAA,EAC1B;AAAA,EAES,SAAoB;AAC3B,WAAI,KAAK,MAAM,WACN,OAEF,KAAK,MAAM;AAAA,EACpB;AACF;AASO,SAASkC,GAAU;AAAA,EACxB,KAAAC;AAAA,EACA,aAAAC;AAAA,EACA,KAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,YAAA/D,IAAaV;AAAA,EACb,QAAA0E,IAAS;AAAA,EACT,YAAAC,IAAa;AAAA,EACb,aAAAC,IAAc;AAAA,EACd,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAG3B;AACL,GAAmF;AACjF,QAAM,CAAC4B,GAAUC,CAAW,IAAI3B,EAASoB,MAAa,WAAW,GAC3D,CAACQ,GAAUC,CAAW,IAAI7B,EAAS,EAAK,GACxC,CAAC8B,GAAUC,CAAW,IAAI/B,EAAS,EAAK,GACxCgC,IAASC,EAAyB,IAAI,GACtCC,IAAeD,EAAuB,IAAI;AAGhD,EAAAE,EAAU,MAAM;AACd,QAAIf,MAAa,cAAcM,EAAU;AAEzC,UAAMzE,IAAUiF,EAAa;AAC7B,WAAIjF,MAAY,OAAM,SAETD,EAAa,YAAA,EACd;AAAA,MACVC;AAAA,MACA,CAACmF,MAAiB;AAChB,QAAIA,OAA0B,EAAI;AAAA,MACpC;AAAA,MACA,EAAE,YAAA/E,EAAA;AAAA,IAAW;AAAA,EAEjB,GAAG,CAAC+D,GAAU/D,GAAYqE,CAAQ,CAAC,GAGnCS,EAAU,MAAM;AACd,QAAI,CAACT,KAAYE,EAAU;AAE3B,UAAMS,IAAM,IAAI,MAAA;AAEhB,IAAAA,EAAI,SAAS,YAAY;AAEvB,UAAId,MAAgB,MAAQ,YAAYc;AACtC,YAAI;AACF,gBAAMA,EAAI,OAAA;AAAA,QACZ,QAAQ;AAAA,QAER;AAEF,MAAAR,EAAY,EAAI,GAChBL,IAAA;AAAA,IACF,GAEAa,EAAI,UAAU,MAAM;AAClB,MAAAN,EAAY,EAAI,GAChBN,IAAU,IAAI,MAAM,yBAAyBZ,CAAG,EAAE,CAAC;AAAA,IACrD,GAEIK,MAAW,WAAWmB,EAAI,SAASnB,IACnCC,MAAU,WAAWkB,EAAI,QAAQlB,IACrCkB,EAAI,MAAMxB;AAAA,EACZ,GAAG,CAACa,GAAUb,GAAKK,GAAQC,GAAOI,GAAaK,GAAUJ,GAAQC,CAAO,CAAC;AAEzE,QAAMa,IAAsC;AAAA,IAC1C,UAAU;AAAA,IACV,OAAOtB,MAAU,UAAaA,MAAU,IAAI,GAAGA,CAAK,OAAO;AAAA,IAC3D,QAAQC,MAAW,UAAaA,MAAW,IAAI,GAAGA,CAAM,OAAO;AAAA,IAC/D,UAAU;AAAA,EAAA,GAGNsB,IAAwC;AAAA,IAC5C,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,QAAQlB,MAAW,KAAO,QAAQC,CAAU,QAAQ;AAAA,IACpD,WAAWD,MAAW,KAAO,eAAe;AAAA,IAC5C,YAAY;AAAA,IACZ,SAASO,IAAW,IAAI;AAAA,EAAA,GAGpBY,IAAgC;AAAA,IACpC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAASZ,IAAW,IAAI;AAAA,IACxB,YAAY;AAAA,EAAA;AAGd,SAAIE,IAEA,gBAAAvB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK2B;AAAA,MACL,OAAO,EAAE,GAAGI,GAAgB,YAAY,UAAA;AAAA,MACxC,MAAK;AAAA,MACL,cAAY,mBAAmBvB,CAAG;AAAA,IAAA;AAAA,EAAA,sBAMrC,OAAA,EAAI,KAAKmB,GAAc,OAAOI,GAC5B,UAAA;AAAA,IAAAxB,MAAgB,UACf,gBAAAP;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKO;AAAA,QACL,KAAI;AAAA,QACJ,OAAOyB;AAAA,QACP,eAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAGfb,KACC,gBAAAnB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKyB;AAAA,QACL,KAAAnB;AAAA,QACA,QAAAK;AAAA,QACA,OAAAC;AAAA,QACA,KAAAJ;AAAA,QACA,OAAAC;AAAA,QACA,QAAAC;AAAA,QACA,OAAOuB;AAAA,QACP,SAAQ;AAAA,QACR,UAAUjB,IAAc,UAAU;AAAA,QACjC,GAAGzB;AAAA,MAAA;AAAA,IAAA;AAAA,EACN,GAEJ;AAEJ;AASO,SAAS2C,GAAetF,IAI3B,IAIF;AACA,QAAM;AAAA,IACJ,YAAAE,IAAaV;AAAA,IACb,WAAAS,IAAYR;AAAA,IACZ,aAAA8F,IAAc;AAAA,EAAA,IACZvF,GAEEwF,IAAMV,EAAuB,IAAI,GACjC,CAACW,GAAWC,CAAY,IAAI7C,EAAS,EAAK,GAC1C,CAAC8C,GAAgBC,CAAiB,IAAI/C,EAAS,EAAK;AAE1D,SAAAmC,EAAU,MAAM;AACd,UAAMlF,IAAU0F,EAAI;AAGpB,WAFI1F,MAAY,QAEZyF,KAAeI,IAAgB,SAEtB9F,EAAa,YAAA,EACd;AAAA,MACVC;AAAA,MACA,CAACmF,MAAiB;AAChB,QAAAS,EAAaT,CAAY,GACrBA,OAAgC,EAAI;AAAA,MAC1C;AAAA,MACA,EAAE,YAAA/E,GAAY,WAAAD,EAAA;AAAA,IAAU;AAAA,EAE5B,GAAG,CAACC,GAAYD,GAAWsF,GAAaI,CAAc,CAAC,GAEhD,EAAE,KAAAH,GAAK,WAAAC,GAAW,gBAAAE,EAAA;AAC3B;AAKO,SAASE,GAAiBC,GAAsC;AACrE,EAAAd,EAAU,MAAM;AACd,UAAMe,IAAYhF,EAAgB,YAAA;AAClC,IAAA+E,EAAQ,QAAQ,CAAC9E,MAAW+E,EAAU,MAAM/E,CAAM,CAAC;AAAA,EACrD,GAAG,CAAC8E,CAAO,CAAC;AACd;AAKO,SAASE,GAAuBnF,IAA4B,UAIjE;AACA,QAAM,CAACoF,GAAaC,CAAc,IAAIrD,EAAsBpC,CAAc;AAE1E,SAAAuE,EAAU,MAAM;AACd,UAAMmB,IAAa,MAAYD,EAAezF,GAAgB;AAE9D,WAAO,iBAAiB,UAAU0F,CAAU,GAC5C,OAAO,iBAAiB,WAAWA,CAAU;AAE7C,UAAM,EAAC,YAAAzF,MAAe;AAItB,WAAIA,GAAY,qBAAqB,UACnCA,EAAW,iBAAiB,UAAUyF,CAAU,GAG3C,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAU,GAC/C,OAAO,oBAAoB,WAAWA,CAAU;AAAA,IAClD;AAAA,EACF,GAAG,CAAA,CAAE,GAEE;AAAA,IACL,aAAAF;AAAA,IACA,YAAYrF,EAAoBC,GAAUoF,CAAW;AAAA,IACrD,UAAUA,MAAgB;AAAA,EAAA;AAE9B;AASA,eAAsBG,EACpBpF,GACe;AAEf,SADsBQ,EAAoBR,CAAM,EAC3B,QAAA;AACvB;AAKA,eAAsBqF,GACpBP,GACe;AACf,QAAM,QAAQ,IAAIA,EAAQ,IAAIM,CAAgB,CAAC;AACjD;AAKO,SAASE,GAAmBtF,GAAmC;AACpE,EAAAD,EAAgB,YAAA,EAAc,MAAMC,CAAM;AAC5C;AAKO,SAASuF,KAA0B;AACxC,EAAA1G,EAAa,MAAA;AACf;AAKO,SAAS2G,KAA6B;AAC3C,EAAAzF,EAAgB,YAAA,EAAc,MAAA;AAChC;"}