{"version":3,"file":"loading-states.mjs","sources":["../../../src/lib/ux/loading-states.tsx"],"sourcesContent":["/**\n * @file Intelligent Loading States\n * @description Comprehensive loading state management with progressive\n * enhancement, timeout handling, and accessibility support.\n *\n * Features:\n * - Progressive loading indicators\n * - Minimum display time\n * - Timeout handling\n * - Loading state composition\n * - Accessible announcements\n * - Custom spinners and loaders\n * @refresh reset\n */\n\n/* eslint-disable react-refresh/only-export-components, @typescript-eslint/prefer-nullish-coalescing, @typescript-eslint/strict-boolean-expressions, react-hooks/set-state-in-effect */\n\nimport React, {\n  useContext,\n  useState,\n  useEffect,\n  useCallback,\n  useMemo,\n  useRef,\n  type ReactNode,\n} from 'react';\nimport { LoadingContext } from '../contexts/LoadingContext';\nimport { announce } from './accessibility-enhancer';\nimport { Spinner } from '../ui/feedback/Spinner';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Loading state\n */\nexport type LoadingState = 'idle' | 'loading' | 'success' | 'error' | 'timeout';\n\n/**\n * Loading phase for progressive display\n */\nexport type LoadingPhase = 'initial' | 'spinner' | 'skeleton' | 'message' | 'timeout';\n\n/**\n * Loading config\n */\nexport interface LoadingConfig {\n  /** Minimum display time for loading state (ms) */\n  minDisplayTime: number;\n  /** Delay before showing spinner (ms) */\n  spinnerDelay: number;\n  /** Delay before showing skeleton (ms) */\n  skeletonDelay: number;\n  /** Delay before showing message (ms) */\n  messageDelay: number;\n  /** Timeout threshold (ms) */\n  timeoutThreshold: number;\n  /** Enable accessibility announcements */\n  announceChanges: boolean;\n}\n\n/**\n * Loading context value\n */\nexport interface LoadingContextValue {\n  state: LoadingState;\n  phase: LoadingPhase;\n  message: string | null;\n  progress: number | null;\n  error: Error | null;\n  startLoading: (message?: string) => void;\n  stopLoading: () => void;\n  setProgress: (progress: number) => void;\n  setError: (error: Error) => void;\n  reset: () => void;\n}\n\n/**\n * Loading provider props\n */\nexport interface LoadingProviderProps {\n  children: ReactNode;\n  config?: Partial<LoadingConfig>;\n  onTimeout?: () => void;\n  onError?: (error: Error) => void;\n}\n\n/**\n * Loading indicator props\n */\nexport interface LoadingIndicatorProps {\n  /** Loading state override */\n  loading?: boolean;\n  /** Minimum display time */\n  minDisplayTime?: number;\n  /** Delay before showing */\n  delay?: number;\n  /** Loading message */\n  message?: string;\n  /** Show spinner */\n  showSpinner?: boolean;\n  /** Spinner size */\n  size?: 'sm' | 'md' | 'lg';\n  /** Custom spinner component */\n  spinner?: ReactNode;\n  /** Overlay mode */\n  overlay?: boolean;\n  /** Full screen mode */\n  fullScreen?: boolean;\n  /** Additional class names */\n  className?: string;\n}\n\n/**\n * Progressive loader props\n */\nexport interface ProgressiveLoaderProps {\n  /** Loading state */\n  loading: boolean;\n  /** Error state */\n  error?: Error | null;\n  /** Success component */\n  children: ReactNode;\n  /** Initial placeholder */\n  initialPlaceholder?: ReactNode;\n  /** Spinner placeholder */\n  spinnerPlaceholder?: ReactNode;\n  /** Skeleton placeholder */\n  skeletonPlaceholder?: ReactNode;\n  /** Timeout message */\n  timeoutMessage?: ReactNode;\n  /** Error fallback */\n  errorFallback?: (error: Error, retry: () => void) => ReactNode;\n  /** Configuration */\n  config?: Partial<LoadingConfig>;\n  /** Retry function */\n  onRetry?: () => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_CONFIG: LoadingConfig = {\n  minDisplayTime: 300,\n  spinnerDelay: 100,\n  skeletonDelay: 500,\n  messageDelay: 2000,\n  timeoutThreshold: 10000,\n  announceChanges: true,\n};\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Use loading context\n */\nexport function useLoading(): LoadingContextValue {\n  const context = useContext(LoadingContext);\n  if (!context) {\n    throw new Error('useLoading must be used within a LoadingProvider');\n  }\n  return context;\n}\n\n/**\n * Use optional loading context (returns null if not in provider)\n */\nexport function useOptionalLoading(): LoadingContextValue | null {\n  return useContext(LoadingContext);\n}\n\n// ============================================================================\n// Loading Provider\n// ============================================================================\n\n/**\n * Loading state provider\n */\nexport function LoadingProvider({\n  children,\n  config: configOverride,\n  onTimeout,\n  onError,\n}: LoadingProviderProps): React.ReactElement {\n  const config = useMemo(() => ({ ...DEFAULT_CONFIG, ...configOverride }), [configOverride]);\n\n  const [state, setState] = useState<LoadingState>('idle');\n  const [phase, setPhase] = useState<LoadingPhase>('initial');\n  const [message, setMessage] = useState<string | null>(null);\n  const [progress, setProgressValue] = useState<number | null>(null);\n  const [error, setErrorValue] = useState<Error | null>(null);\n\n  const loadingStartTime = useRef<number>(0);\n  const timeoutTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const phaseTimers = useRef<Array<ReturnType<typeof setTimeout>>>([]);\n\n  // Clear all timers\n  const clearTimers = useCallback(() => {\n    if (timeoutTimer.current) {\n      clearTimeout(timeoutTimer.current);\n      timeoutTimer.current = null;\n    }\n    phaseTimers.current.forEach((timer) => clearTimeout(timer));\n    phaseTimers.current = [];\n  }, []);\n\n  // Start loading\n  const startLoading = useCallback(\n    (loadingMessage?: string) => {\n      clearTimers();\n      loadingStartTime.current = Date.now();\n      setState('loading');\n      setPhase('initial');\n      setMessage(loadingMessage ?? null);\n      setProgressValue(null);\n      setErrorValue(null);\n\n      // Progressive phase transitions\n      phaseTimers.current.push(setTimeout(() => setPhase('spinner'), config.spinnerDelay));\n      phaseTimers.current.push(setTimeout(() => setPhase('skeleton'), config.skeletonDelay));\n      phaseTimers.current.push(setTimeout(() => setPhase('message'), config.messageDelay));\n\n      // Timeout handling\n      timeoutTimer.current = setTimeout(() => {\n        setState('timeout');\n        setPhase('timeout');\n        onTimeout?.();\n      }, config.timeoutThreshold);\n\n      // Announce for screen readers\n      if (config.announceChanges) {\n        announce('Loading started');\n      }\n    },\n    [config, clearTimers, onTimeout]\n  );\n\n  // Stop loading\n  const stopLoading = useCallback(() => {\n    const elapsed = Date.now() - loadingStartTime.current;\n    const remaining = Math.max(0, config.minDisplayTime - elapsed);\n\n    const complete = (): void => {\n      clearTimers();\n      setState('success');\n      setPhase('initial');\n\n      if (config.announceChanges) {\n        announce('Loading complete');\n      }\n    };\n\n    if (remaining > 0) {\n      setTimeout(complete, remaining);\n    } else {\n      complete();\n    }\n  }, [config, clearTimers]);\n\n  // Set progress\n  const setProgress = useCallback((value: number) => {\n    setProgressValue(Math.max(0, Math.min(100, value)));\n  }, []);\n\n  // Set error\n  const setError = useCallback(\n    (err: Error) => {\n      clearTimers();\n      setState('error');\n      setPhase('initial');\n      setErrorValue(err);\n      onError?.(err);\n\n      if (config.announceChanges) {\n        announce(`Error: ${err.message}`, 'assertive');\n      }\n    },\n    [config, clearTimers, onError]\n  );\n\n  // Reset\n  const reset = useCallback(() => {\n    clearTimers();\n    setState('idle');\n    setPhase('initial');\n    setMessage(null);\n    setProgressValue(null);\n    setErrorValue(null);\n  }, [clearTimers]);\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => clearTimers();\n  }, [clearTimers]);\n\n  const value = useMemo(\n    () => ({\n      state,\n      phase,\n      message,\n      progress,\n      error,\n      startLoading,\n      stopLoading,\n      setProgress,\n      setError,\n      reset,\n    }),\n    [\n      state,\n      phase,\n      message,\n      progress,\n      error,\n      startLoading,\n      stopLoading,\n      setProgress,\n      setError,\n      reset,\n    ]\n  );\n\n  return <LoadingContext.Provider value={value}>{children}</LoadingContext.Provider>;\n}\n\n// ============================================================================\n// Loading Indicator Component\n// ============================================================================\n\n/**\n * Loading indicator with delay and minimum display time\n */\nexport function LoadingIndicator({\n  loading = false,\n  minDisplayTime = DEFAULT_CONFIG.minDisplayTime,\n  delay = DEFAULT_CONFIG.spinnerDelay,\n  message,\n  showSpinner = true,\n  size = 'md',\n  spinner,\n  overlay = false,\n  fullScreen = false,\n  className = '',\n}: LoadingIndicatorProps): React.ReactElement | null {\n  const [visible, setVisible] = useState(false);\n  const loadingStartTime = useRef<number>(0);\n  const delayTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  useEffect(() => {\n    if (loading) {\n      loadingStartTime.current = Date.now();\n      delayTimer.current = setTimeout(() => {\n        setVisible(true);\n      }, delay);\n    } else {\n      if (delayTimer.current) {\n        clearTimeout(delayTimer.current);\n        delayTimer.current = null;\n      }\n\n      if (visible) {\n        const elapsed = Date.now() - loadingStartTime.current;\n        const remaining = Math.max(0, minDisplayTime - elapsed);\n\n        if (remaining > 0) {\n          setTimeout(() => setVisible(false), remaining);\n        } else {\n          void Promise.resolve().then(() => {\n            setVisible(false);\n          });\n        }\n      }\n    }\n\n    return () => {\n      if (delayTimer.current) {\n        clearTimeout(delayTimer.current);\n      }\n    };\n  }, [loading, delay, minDisplayTime, visible]);\n\n  if (!visible) {\n    return null;\n  }\n\n  const sizeClasses = {\n    sm: 'loading-indicator--sm',\n    md: 'loading-indicator--md',\n    lg: 'loading-indicator--lg',\n  };\n\n  const containerClasses = [\n    'loading-indicator',\n    sizeClasses[size],\n    overlay ? 'loading-indicator--overlay' : null,\n    fullScreen ? 'loading-indicator--fullscreen' : null,\n    className,\n  ]\n    .filter((cls): cls is string => typeof cls === 'string' && cls !== '')\n    .join(' ');\n\n  return (\n    <div className={containerClasses} role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n      {showSpinner && (spinner || <DefaultSpinner size={size} />)}\n      {message && <span className=\"loading-indicator__message\">{message}</span>}\n      <span className=\"sr-only\">Loading{message ? `: ${message}` : ''}...</span>\n    </div>\n  );\n}\n\n// ============================================================================\n// Progressive Loader Component\n// ============================================================================\n\n/**\n * Progressive loader with phased placeholders\n */\nexport function ProgressiveLoader({\n  loading,\n  error,\n  children,\n  initialPlaceholder,\n  spinnerPlaceholder,\n  skeletonPlaceholder,\n  timeoutMessage,\n  errorFallback,\n  config: configOverride,\n  onRetry,\n}: ProgressiveLoaderProps): React.ReactElement {\n  const config = useMemo(() => ({ ...DEFAULT_CONFIG, ...configOverride }), [configOverride]);\n\n  const [phase, setPhase] = useState<LoadingPhase>('initial');\n  const [timedOut, setTimedOut] = useState(false);\n  const phaseTimers = useRef<Array<ReturnType<typeof setTimeout>>>([]);\n\n  useEffect(() => {\n    if (loading) {\n      setPhase('initial');\n      setTimedOut(false);\n\n      // Clear previous timers\n      phaseTimers.current.forEach((timer) => clearTimeout(timer));\n      phaseTimers.current = [];\n\n      // Set up phase transitions\n      phaseTimers.current.push(setTimeout(() => setPhase('spinner'), config.spinnerDelay));\n\n      if (skeletonPlaceholder !== undefined && skeletonPlaceholder !== null) {\n        phaseTimers.current.push(\n          setTimeout(() => {\n            setPhase('skeleton');\n          }, config.skeletonDelay)\n        );\n      }\n\n      phaseTimers.current.push(\n        setTimeout(() => {\n          setPhase('message');\n        }, config.messageDelay)\n      );\n\n      phaseTimers.current.push(\n        setTimeout(() => {\n          setPhase('timeout');\n          setTimedOut(true);\n        }, config.timeoutThreshold)\n      );\n    } else {\n      // Clear timers on complete\n      phaseTimers.current.forEach((timer) => clearTimeout(timer));\n      phaseTimers.current = [];\n      setPhase('initial');\n    }\n\n    return () => {\n      phaseTimers.current.forEach((timer) => clearTimeout(timer));\n    };\n  }, [loading, config, skeletonPlaceholder]);\n\n  // Error state\n  if (error) {\n    if (errorFallback) {\n      return <>{errorFallback(error, onRetry || (() => {}))}</>;\n    }\n\n    return (\n      <div className=\"progressive-loader__error\" role=\"alert\">\n        <p>An error occurred: {error.message}</p>\n        {onRetry && (\n          <button onClick={onRetry} className=\"progressive-loader__retry\">\n            Retry\n          </button>\n        )}\n      </div>\n    );\n  }\n\n  // Success state\n  if (!loading && !timedOut) {\n    return <>{children}</>;\n  }\n\n  // Timeout state\n  if (timedOut) {\n    return (\n      <div className=\"progressive-loader__timeout\" role=\"alert\">\n        {timeoutMessage || (\n          <>\n            <p>This is taking longer than expected.</p>\n            {onRetry && (\n              <button onClick={onRetry} className=\"progressive-loader__retry\">\n                Retry\n              </button>\n            )}\n          </>\n        )}\n      </div>\n    );\n  }\n\n  // Loading phases\n  switch (phase) {\n    case 'initial':\n      return <>{initialPlaceholder || null}</>;\n\n    case 'spinner':\n      return (\n        <>\n          {spinnerPlaceholder || (\n            <div className=\"progressive-loader__spinner\">\n              <DefaultSpinner size=\"md\" />\n            </div>\n          )}\n        </>\n      );\n\n    case 'skeleton':\n      return <>{skeletonPlaceholder || spinnerPlaceholder || <DefaultSpinner size=\"md\" />}</>;\n\n    case 'message':\n      return (\n        <div className=\"progressive-loader__message\">\n          {skeletonPlaceholder || <DefaultSpinner size=\"md\" />}\n          <p>Still loading...</p>\n        </div>\n      );\n\n    default:\n      return <>{spinnerPlaceholder || <DefaultSpinner size=\"md\" />}</>;\n  }\n}\n\n// ============================================================================\n// Default Spinner - Re-exports canonical Spinner component\n// ============================================================================\n\ninterface DefaultSpinnerProps {\n  size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * DefaultSpinner wraps the canonical Spinner component from ui/feedback/Spinner.\n * This consolidates spinner implementations to a single source of truth.\n * Use Spinner directly for more control over variants and colors.\n */\nfunction DefaultSpinner({ size = 'md' }: DefaultSpinnerProps): React.ReactElement {\n  return <Spinner size={size} variant=\"primary\" label=\"Loading\" />;\n}\n\n// ============================================================================\n// Progress Bar\n// ============================================================================\n\nexport interface ProgressBarProps {\n  /** Progress value (0-100) */\n  value: number;\n  /** Show percentage text */\n  showPercentage?: boolean;\n  /** Size variant */\n  size?: 'sm' | 'md' | 'lg';\n  /** Color variant */\n  variant?: 'primary' | 'success' | 'warning' | 'error';\n  /** Animated progress */\n  animated?: boolean;\n  /** Striped pattern */\n  striped?: boolean;\n  /** Indeterminate state */\n  indeterminate?: boolean;\n  /** Custom label */\n  label?: string;\n  /** Additional class names */\n  className?: string;\n}\n\n/**\n * Progress bar component\n */\nexport function ProgressBar({\n  value,\n  showPercentage = false,\n  size = 'md',\n  variant = 'primary',\n  animated = false,\n  striped = false,\n  indeterminate = false,\n  label,\n  className = '',\n}: ProgressBarProps): React.ReactElement {\n  const clampedValue = Math.max(0, Math.min(100, value));\n\n  const containerClasses = [\n    'progress-bar',\n    `progress-bar--${size}`,\n    `progress-bar--${variant}`,\n    animated && 'progress-bar--animated',\n    striped && 'progress-bar--striped',\n    indeterminate && 'progress-bar--indeterminate',\n    className,\n  ]\n    .filter(Boolean)\n    .join(' ');\n\n  return (\n    <div\n      className={containerClasses}\n      role=\"progressbar\"\n      aria-valuenow={indeterminate ? undefined : clampedValue}\n      aria-valuemin={0}\n      aria-valuemax={100}\n      aria-label={label || 'Progress'}\n    >\n      <div\n        className=\"progress-bar__fill\"\n        style={{ width: indeterminate ? undefined : `${clampedValue}%` }}\n      />\n      {showPercentage && !indeterminate && (\n        <span className=\"progress-bar__text\">{Math.round(clampedValue)}%</span>\n      )}\n    </div>\n  );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook for managing async loading state\n */\nexport function useLoadingState(config: Partial<LoadingConfig> = {}): {\n  isLoading: boolean;\n  phase: LoadingPhase;\n  error: Error | null;\n  startLoading: () => void;\n  stopLoading: () => void;\n  setError: (error: Error) => void;\n  reset: () => void;\n  wrapAsync: <T>(promise: Promise<T>) => Promise<T>;\n} {\n  const fullConfig = useMemo(() => ({ ...DEFAULT_CONFIG, ...config }), [config]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [phase, setPhase] = useState<LoadingPhase>('initial');\n  const [error, setErrorState] = useState<Error | null>(null);\n  const loadingStartTime = useRef<number>(0);\n  const timers = useRef<Array<ReturnType<typeof setTimeout>>>([]);\n\n  const clearTimers = useCallback(() => {\n    timers.current.forEach((timer) => clearTimeout(timer));\n    timers.current = [];\n  }, []);\n\n  const startLoading = useCallback(() => {\n    clearTimers();\n    loadingStartTime.current = Date.now();\n    setIsLoading(true);\n    setPhase('initial');\n    setErrorState(null);\n\n    timers.current.push(setTimeout(() => setPhase('spinner'), fullConfig.spinnerDelay));\n    timers.current.push(setTimeout(() => setPhase('skeleton'), fullConfig.skeletonDelay));\n    timers.current.push(setTimeout(() => setPhase('message'), fullConfig.messageDelay));\n    timers.current.push(setTimeout(() => setPhase('timeout'), fullConfig.timeoutThreshold));\n  }, [fullConfig, clearTimers]);\n\n  const stopLoading = useCallback(() => {\n    const elapsed = Date.now() - loadingStartTime.current;\n    const remaining = Math.max(0, fullConfig.minDisplayTime - elapsed);\n\n    const complete = (): void => {\n      clearTimers();\n      setIsLoading(false);\n      setPhase('initial');\n    };\n\n    if (remaining > 0) {\n      setTimeout(complete, remaining);\n    } else {\n      complete();\n    }\n  }, [fullConfig, clearTimers]);\n\n  const setError = useCallback(\n    (err: Error) => {\n      clearTimers();\n      setIsLoading(false);\n      setPhase('initial');\n      setErrorState(err);\n    },\n    [clearTimers]\n  );\n\n  const reset = useCallback(() => {\n    clearTimers();\n    setIsLoading(false);\n    setPhase('initial');\n    setErrorState(null);\n  }, [clearTimers]);\n\n  const wrapAsync = useCallback(\n    async <T,>(promise: Promise<T>): Promise<T> => {\n      startLoading();\n      try {\n        const result = await promise;\n        stopLoading();\n        return result;\n      } catch (err) {\n        setError(err instanceof Error ? err : new Error(String(err)));\n        throw err;\n      }\n    },\n    [startLoading, stopLoading, setError]\n  );\n\n  useEffect(() => {\n    return () => clearTimers();\n  }, [clearTimers]);\n\n  return {\n    isLoading,\n    phase,\n    error,\n    startLoading,\n    stopLoading,\n    setError,\n    reset,\n    wrapAsync,\n  };\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * CSS for loading states (include in your stylesheets)\n */\nexport const loadingStateStyles = `\n  .loading-indicator {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    gap: 0.5rem;\n  }\n\n  .loading-indicator--sm { font-size: 0.875rem; }\n  .loading-indicator--md { font-size: 1rem; }\n  .loading-indicator--lg { font-size: 1.25rem; }\n\n  .loading-indicator--overlay {\n    position: absolute;\n    inset: 0;\n    background: rgba(255, 255, 255, 0.8);\n    z-index: 100;\n  }\n\n  .loading-indicator--fullscreen {\n    position: fixed;\n    inset: 0;\n    background: rgba(255, 255, 255, 0.95);\n    z-index: 9999;\n  }\n\n  .loading-spinner {\n    animation: spin 1s linear infinite;\n  }\n\n  @keyframes spin {\n    from { transform: rotate(0deg); }\n    to { transform: rotate(360deg); }\n  }\n\n  .progress-bar {\n    position: relative;\n    width: 100%;\n    background: #e5e7eb;\n    border-radius: 9999px;\n    overflow: hidden;\n  }\n\n  .progress-bar--sm { height: 0.25rem; }\n  .progress-bar--md { height: 0.5rem; }\n  .progress-bar--lg { height: 1rem; }\n\n  .progress-bar__fill {\n    height: 100%;\n    background: currentColor;\n    transition: width 0.3s ease;\n  }\n\n  .progress-bar--primary { color: #3b82f6; }\n  .progress-bar--success { color: #22c55e; }\n  .progress-bar--warning { color: #f59e0b; }\n  .progress-bar--error { color: #ef4444; }\n\n  .progress-bar--indeterminate .progress-bar__fill {\n    width: 30%;\n    animation: indeterminate 1.5s infinite linear;\n  }\n\n  @keyframes indeterminate {\n    0% { transform: translateX(-100%); }\n    100% { transform: translateX(400%); }\n  }\n\n  .sr-only {\n    position: absolute;\n    width: 1px;\n    height: 1px;\n    padding: 0;\n    margin: -1px;\n    overflow: hidden;\n    clip: rect(0, 0, 0, 0);\n    white-space: nowrap;\n    border: 0;\n  }\n`;\n"],"names":["DEFAULT_CONFIG","useLoading","context","useContext","LoadingContext","useOptionalLoading","LoadingProvider","children","configOverride","onTimeout","onError","config","useMemo","state","setState","useState","phase","setPhase","message","setMessage","progress","setProgressValue","error","setErrorValue","loadingStartTime","useRef","timeoutTimer","phaseTimers","clearTimers","useCallback","timer","startLoading","loadingMessage","announce","stopLoading","elapsed","remaining","complete","setProgress","value","setError","err","reset","useEffect","jsx","LoadingIndicator","loading","minDisplayTime","delay","showSpinner","size","spinner","overlay","fullScreen","className","visible","setVisible","delayTimer","containerClasses","cls","jsxs","DefaultSpinner","ProgressiveLoader","initialPlaceholder","spinnerPlaceholder","skeletonPlaceholder","timeoutMessage","errorFallback","onRetry","timedOut","setTimedOut","Fragment","Spinner","ProgressBar","showPercentage","variant","animated","striped","indeterminate","label","clampedValue","useLoadingState","fullConfig","isLoading","setIsLoading","setErrorState","timers","wrapAsync","promise","result","loadingStateStyles"],"mappings":"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"}