@titan-design/react-ui 0.9.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/bodymap.js +78 -24
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +78 -24
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +31 -8
  6. package/dist/index.d.ts +31 -8
  7. package/dist/index.js +214 -113
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +210 -114
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/pages.js +214 -157
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +214 -157
  14. package/dist/pages.mjs.map +1 -1
  15. package/dist/theme/index.d.mts +129 -34
  16. package/dist/theme/index.d.ts +129 -34
  17. package/dist/theme/index.js +95 -19
  18. package/dist/theme/index.js.map +1 -1
  19. package/dist/theme/index.mjs +92 -20
  20. package/dist/theme/index.mjs.map +1 -1
  21. package/dist/theme/tokens-css.js +88 -24
  22. package/dist/theme/tokens-css.js.map +1 -1
  23. package/dist/theme/tokens-css.mjs +88 -24
  24. package/dist/theme/tokens-css.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/src/components/custom/Workout/BaseBadge.tsx +5 -5
  27. package/src/components/custom/Workout/RowInventory.stories.tsx +5 -2
  28. package/src/components/custom/Workout/S3FullRail.stories.tsx +13 -1
  29. package/src/components/custom/Workout/SessionHeader.tsx +2 -2
  30. package/src/components/custom/Workout/SessionRail.stories.tsx +4 -1
  31. package/src/components/custom/Workout/SessionRail.tsx +5 -5
  32. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +16 -25
  33. package/src/components/custom/Workout/SupersetWrapper.tsx +1 -1
  34. package/src/components/custom/Workout/TempoDisplay.tsx +3 -7
  35. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +4 -1
  36. package/src/components/custom/Workout/WorkoutPill.tsx +2 -2
  37. package/src/components/ui/surface/Surface.stories.tsx +195 -1
  38. package/src/components/ui/surface/Surface.test.tsx +148 -9
  39. package/src/components/ui/surface/Surface.tsx +37 -9
  40. package/src/components/ui/surface/SurfaceContext.ts +48 -8
  41. package/src/components/ui/surface/index.ts +1 -0
  42. package/src/components/ui/surface/surface.contract.test.ts +283 -0
  43. package/src/theme/ColorSystem.stories.tsx +232 -47
  44. package/src/theme/config.ts +12 -0
  45. package/src/theme/elevation.ts +90 -67
  46. package/src/theme/global.css +35 -9
  47. package/src/theme/tokens/primitives.ts +40 -0
  48. package/src/theme/tokens/semantic.ts +63 -14
  49. package/tailwind.config.js +8 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/tokens/primitives.ts","../src/theme/workout-tokens.ts","../src/utils/workout-format.ts","../src/web-jsx/jsx-runtime.ts","../src/components/custom/Workout/SegmentedBar.tsx","../src/components/custom/Workout/SetBar.tsx","../src/components/custom/Workout/SetStrip.tsx","../src/components/custom/Workout/VelocityStrip.tsx","../src/utils/cn.ts","../src/components/custom/Workout/PlaceholderStrip.tsx","../src/components/icons/SvgIcon.tsx","../src/components/icons/icons.tsx","../src/components/custom/Workout/BaseBadge.tsx","../src/theme/tokens/semantic.ts","../src/components/custom/Workout/PrBadge.tsx","../src/components/custom/Workout/SetRow.tsx","../src/components/custom/Workout/SetTableHeader.tsx","../src/components/custom/Workout/metricText.tsx","../src/components/custom/Workout/SetsRepsLoad.tsx","../src/theme/shadows.ts","../src/utils/colors.ts","../src/components/custom/Workout/TempoDisplay.tsx","../src/components/custom/Workout/ExerciseIndicator.tsx","../src/components/custom/Workout/ExerciseHeading.tsx","../src/components/custom/Workout/ExerciseCardHeading.tsx","../src/components/custom/Workout/ExerciseCard.tsx","../src/theme/resolve-color.ts","../src/components/custom/Workout/InputBar.tsx","../src/hooks/useTimer.ts","../src/components/ui/progress/Progress.tsx","../src/components/custom/CircularTimer/CircularTimer.tsx","../src/components/custom/Workout/RestTimer.tsx","../src/components/custom/Workout/SupersetWrapper.tsx","../src/components/custom/Workout/ActiveWorkoutPage.tsx","../src/theme/elevation.ts","../src/utils/useTheme.ts","../src/components/ui/card/Card.tsx","../src/components/custom/Workout/StatusDot.tsx","../src/theme/extracted-colors-dataviz.ts","../src/components/custom/Workout/MesoStatusCard.tsx","../src/components/custom/Workout/StrengthTrendChart.tsx","../src/components/custom/Workout/CapacityBandChart.tsx","../src/components/custom/Workout/ExerciseDetailPage.tsx","../src/components/custom/Workout/MesoProgressBar.tsx","../src/components/ui/indicator/Indicator.tsx","../src/components/ui/badge/Badge.tsx","../src/components/custom/Workout/WorkoutPill.tsx","../src/components/custom/Workout/IntensityBar.tsx","../src/components/custom/Workout/WeekRow.tsx","../src/components/custom/Workout/MesoCard.tsx","../src/components/custom/Workout/MuscleGroupChip.tsx","../src/components/custom/Workout/WorkoutCard.tsx","../src/components/custom/Workout/ProgramPlanningPage.tsx"],"names":["cn","reactJsx","reactJsxs","_","View","TODO_COLOR","useState","useEffect","Easing","Animated","Pressable","Text","t","DARK","Platform","BRAND_PRIMARY","formatValue","accessibilityLabel","intensityConfig","useMemo","Fragment","MetricCell","STATUS_SUCCESS","STATUS_ERROR","STATUS_WARNING","buildColumns","toX","toY","sizeStyles","usePulse","BRAND_PRIMARY_DARK","BRAND_PRIMARY_LIGHT","ACCENT_STOPS"],"mappings":"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","file":"pages.mjs","sourcesContent":["/**\n * Primitive Design Tokens\n *\n * Raw values with no semantic meaning. These are the foundation of the design system\n * and should rarely be used directly in components. Use semantic tokens instead.\n */\n\nexport const primitiveColors = {\n // Blue scale\n blue: {\n 50: '#EFF6FF',\n 100: '#DBEAFE',\n 200: '#BFDBFE',\n 300: '#93C5FD',\n 400: '#60A5FA',\n 500: '#3B82F6',\n 600: '#5048E5',\n 700: '#3832A0',\n 800: '#1E40AF',\n 900: '#1E3A8A',\n },\n\n // Red scale\n red: {\n 50: '#FEF2F2',\n 100: '#FEE2E2',\n 200: '#FECACA',\n 300: '#FCA5A5',\n 400: '#DA6868',\n 500: '#EF4444',\n 600: '#D14343',\n 700: '#922E2E',\n 800: '#991B1B',\n 900: '#7F1D1D',\n },\n\n // Vivid red scale\n redVivid: {\n 50: '#FFECEE',\n 100: '#FFD6DB',\n 200: '#FFB3BC',\n 300: '#FF8593',\n 400: '#FF6070',\n 500: '#FF4757',\n 600: '#E63548',\n 700: '#C42539',\n 800: '#9E1C2C',\n 900: '#7A1520',\n },\n\n // Neutral/Gray scale\n neutral: {\n 50: '#FAFAFA',\n 100: '#F3F4F6',\n 200: '#E5E7EB',\n 300: '#D1D5DB',\n 400: '#9CA3AF',\n 500: '#6B7280',\n 600: '#4B5563',\n 700: '#374151',\n 800: '#1F2937',\n 900: '#111827',\n 950: '#030712',\n },\n\n // Charcoal scale (dark backgrounds)\n charcoal: {\n 0: '#6E6E6E',\n 50: '#5D5D5D',\n 100: '#4C4C4C',\n 200: '#3C3C3C',\n 300: '#2C2C2C',\n 400: '#1F1F1F',\n 500: '#1C1C1C',\n 600: '#191919',\n 700: '#161616',\n 800: '#131313',\n 900: '#101010',\n },\n\n // Pure colors\n white: '#FFFFFF',\n black: '#000000',\n transparent: 'transparent',\n} as const\n\n/**\n * Derived tonal ramps (TD-05.09 color foundations)\n *\n * Seven OKLCH-generated hue ramps, 11 perceptual lightness steps each (50 -> 950).\n * Built with hue-torsion + a chroma arc, anchored through existing brand/semantic\n * hexes. `pin` marks the step each ramp flows through its anchor.\n * This is the single source of truth for chromatic hexes — the categorical palette\n * below references these steps rather than duplicating values.\n * See coordination/design-explorations/foundations.\n */\nexport const primitiveRamps = {\n red: {\n 50: '#FFF4F4',\n 100: '#FFE3E5',\n 200: '#FFC2C5',\n 300: '#FF9A9D',\n 400: '#F77175',\n 500: '#E05254',\n 600: '#D14343', // pin\n 700: '#A4221C',\n 800: '#7E1002',\n 900: '#5A0900',\n 950: '#3D0400',\n },\n orange: {\n 50: '#FFF5ED',\n 100: '#FFE6D4',\n 200: '#FFC7A2',\n 300: '#FFA063',\n 400: '#FF7900', // pin\n 500: '#DA5F00',\n 600: '#B94A00',\n 700: '#983804',\n 800: '#6F290F',\n 900: '#4E1C0C',\n 950: '#331107',\n },\n amber: {\n 50: '#FFF7DD',\n 100: '#FFEAA9',\n 200: '#FFD352',\n 300: '#F9B415', // pin\n 400: '#E08C00',\n 500: '#C27400',\n 600: '#A45E00',\n 700: '#814D14',\n 800: '#5B3A1A',\n 900: '#442503',\n 950: '#301500',\n },\n green: {\n 50: '#E3FFEE',\n 100: '#B5FFD2',\n 200: '#58F69E',\n 300: '#2ED573', // pin\n 400: '#21C05D',\n 500: '#22A444',\n 600: '#298732',\n 700: '#2B6B25',\n 800: '#264D1C',\n 900: '#1B3515',\n 950: '#11220D',\n },\n cyan: {\n 50: '#E6FBFF',\n 100: '#C2F6FF',\n 200: '#62EAFF',\n 300: '#22D3EE', // pin\n 400: '#01B5D1',\n 500: '#2697B7',\n 600: '#307B9B',\n 700: '#2A617F',\n 800: '#22465F',\n 900: '#0B3149',\n 950: '#001F36',\n },\n blue: {\n 50: '#EFF8FF',\n 100: '#D9EFFF',\n 200: '#ACDBFF',\n 300: '#78C2FF',\n 400: '#3CA8FF',\n 500: '#2196F3', // pin\n 600: '#1072CB',\n 700: '#135AA8',\n 800: '#14407E',\n 900: '#112C5A',\n 950: '#091B3C',\n },\n magenta: {\n 50: '#FFF3F9',\n 100: '#FFE2F1',\n 200: '#FFBDE2',\n 300: '#FF8FD5',\n 400: '#ED69C3',\n 500: '#D548AF',\n 600: '#BA2996',\n 700: '#9C0D7A', // pin\n 800: '#77005A',\n 900: '#56003F',\n 950: '#3B0029',\n },\n} as const\n\n/**\n * Categorical (qualitative) palette — an ordered, CVD-safe series expressed as\n * references into {@link primitiveRamps} (one source of truth; the palette moves\n * with the ramps).\n *\n * Design: a single canonical hue order (blue, magenta, red, orange, green, cyan,\n * amber), with steps chosen vivid-midtone-first and fanned lighter/darker as the\n * series grows to preserve separation. The sequence is nested-stable — a chart\n * with N series uses the first N colors, and the series index is stable as N\n * changes. Colorblind-safe worst-case deuteranopia/protanopia floor 8 holds\n * through {@link CATEGORICAL_CVD_SAFE_MAX} colors; the 7th is an extended color\n * that should be paired with a legend or other secondary encoding.\n *\n * Two variants: `default` (vivid, sits on neutral/light surfaces, legible under\n * black text) and `dark` (deeper shades legible under white text on a fill). A\n * separate \"light\" variant was dropped — the vivid `default` picks already clear\n * black-text contrast, so it doubles as the light-context palette.\n */\nexport const categoricalPalette = {\n default: [\n primitiveRamps.blue[500],\n primitiveRamps.magenta[500],\n primitiveRamps.red[500],\n primitiveRamps.orange[400],\n primitiveRamps.green[300],\n primitiveRamps.cyan[300],\n primitiveRamps.amber[600], // extended (7th) — pair with a legend\n ],\n dark: [\n primitiveRamps.blue[600],\n primitiveRamps.magenta[600],\n primitiveRamps.red[500],\n primitiveRamps.orange[600],\n primitiveRamps.green[800],\n primitiveRamps.cyan[800],\n primitiveRamps.amber[500], // extended (7th) — pair with a legend\n ],\n} as const\n\n/** Largest series count that holds the CVD floor without a legend. */\nexport const CATEGORICAL_CVD_SAFE_MAX = 6\n\n/**\n * Categorical palette variant.\n * - `default` : vivid; neutral/light surfaces, legible under black text\n * - `dark` : deeper shades, legible under white text on a filled swatch\n */\nexport type CategoricalVariant = keyof typeof categoricalPalette\n\n/**\n * Get a color from the ordered categorical palette by series index.\n * The palette is nested-stable, so the color for a given index does not change\n * with the total series count; `index` simply wraps past the end.\n *\n * @param index - 0-based series index (wraps past the end)\n * @param variant - `default` (black-text / light surfaces) or `dark` (white text)\n * @returns The hex color string\n */\nexport function getCategoricalColor(index: number, variant: CategoricalVariant = 'default'): string {\n const palette = categoricalPalette[variant]\n index = Math.max(0, Math.floor(index))\n return palette[index % palette.length]\n}\n\n/**\n * Diverging status scale (BodyMap training-status: under → optimal → over) as\n * references into {@link primitiveRamps}. A true diverging shape — `optimal` is\n * the lightest center, the extremes go darker — so the signal reads in lightness\n * (colorblind-robust; worst-case deut/protanopia min ΔE ~10.9) and the direction\n * reads in the blue↔red axis (the CVD-safe hue pair).\n *\n * Tuned so every stop is dark enough for the fill yet light enough that BLACK\n * text clears 4.5:1 on all five — no per-cell white/black flipping. The value\n * valley is symmetric: the two mid-arms (maintenance / approaching) sit at equal\n * lightness (both ~0.53 relative luminance), the ends darker.\n */\nexport const divergingScale = [\n primitiveRamps.blue[500], // under\n primitiveRamps.cyan[300], // maintenance\n primitiveRamps.green[200], // optimal (light center)\n primitiveRamps.amber[300], // approaching\n primitiveRamps.red[600], // over\n] as const\n\n/**\n * Sequential \"effort\" scale (low → high intensity: green → yellow → orange → red)\n * as references into {@link primitiveRamps}. A 6-stop ordinal palette; the\n * velocity/RPE strip sub-samples it. Every adjacent pair clears the CVD floor\n * (min deut/protan ΔE ≥ 4.5), and within that the hue walk is kept smooth —\n * the amber-200 → amber-300 → orange-400 run steps the yellow→orange transition\n * gradually rather than lurching. Order encodes magnitude, so it tolerates the\n * green↔red CVD pair. Stops 0–3 take black text; the dark reds take white.\n */\nexport const sequentialEffort = [\n primitiveRamps.green[300],\n primitiveRamps.amber[200],\n primitiveRamps.amber[300],\n primitiveRamps.orange[400],\n primitiveRamps.red[600],\n primitiveRamps.red[700],\n] as const\n\n/**\n * Best-contrast text color (black or white) for a solid fill — for labels sitting\n * on categorical/diverging/effort swatches. Uses the WCAG relative-luminance ratio.\n */\nexport function bestTextColor(hex: string): '#000000' | '#FFFFFF' {\n const [r, g, b] = [0, 2, 4].map((i) => {\n const c = parseInt(hex.replace('#', '').slice(i, i + 2), 16) / 255\n return c >= 0.04045 ? ((c + 0.055) / 1.055) ** 2.4 : c / 12.92\n })\n const l = 0.2126 * r + 0.7152 * g + 0.0722 * b\n return (l + 0.05) / 0.05 >= 1.05 / (l + 0.05) ? '#000000' : '#FFFFFF'\n}\n\n/**\n * Discrete rainbow palette for data visualization\n * Based on Paul Tol's color schemes: https://personal.sron.nl/~pault/#fig:scheme_rainbow_discrete\n */\nexport const discreteRainbow = [\n '#E8ECFB',\n '#D9CCE3',\n '#D1BBD7',\n '#CAACCB',\n '#BA8DB4',\n '#AE76A3',\n '#AA6F9E',\n '#994F88',\n '#882E72',\n '#1965B0',\n '#437DBF',\n '#5289C7',\n '#6195CF',\n '#7BAFDE',\n '#4EB265',\n '#90C987',\n '#CAE0AB',\n '#F7F056',\n '#F7CB45',\n '#F6C141',\n '#F4A736',\n '#F1932D',\n '#EE8026',\n '#E8601C',\n '#E65518',\n '#DC050C',\n '#A5170E',\n '#72190E',\n '#42150A',\n] as const\n\n/**\n * Palette indices for discrete rainbow colors at different palette sizes.\n * For a given palette size (index + 1), returns the indices of colors to use.\n */\nconst discreteRainbowPalettes: number[][] = [\n [10],\n [10, 26],\n [10, 18, 26],\n [10, 15, 18, 26],\n [10, 14, 15, 18, 26],\n [10, 14, 15, 17, 18, 26],\n [9, 10, 14, 15, 17, 18, 26],\n [9, 10, 14, 15, 17, 18, 23, 26],\n [9, 10, 14, 15, 17, 18, 23, 26, 28],\n [9, 10, 14, 15, 17, 18, 21, 24, 26, 28],\n [9, 10, 12, 14, 15, 17, 18, 21, 24, 26, 28],\n [3, 6, 9, 10, 12, 14, 15, 17, 18, 21, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 21, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28, 29],\n [1, 2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28, 29],\n]\n\n/**\n * Get a color from the discrete rainbow palette for a given index and palette size.\n * Colors are optimized for visual distinction at each palette size.\n *\n * @param index - The index of the color in the series (0-based)\n * @param size - The total number of colors needed (1-23)\n * @returns The hex color string\n */\nexport function getDiscreteRainbowColor(index: number, size: number): string {\n index = Math.max(0, index)\n size = Math.min(Math.max(1, size), discreteRainbowPalettes.length)\n\n const palette = discreteRainbowPalettes[size - 1]\n if (index >= palette.length) index = index % palette.length\n\n return discreteRainbow[palette[index] - 1]\n}\n\nexport const primitiveTypography = {\n fontFamilies: {\n sans: ['Inter', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Helvetica', 'Arial', 'sans-serif'],\n body: ['Nunito Sans', 'sans-serif'],\n heading: ['Space Grotesk', 'sans-serif'],\n mono: ['SF Mono', 'Monaco', 'Inconsolata', 'Fira Mono', 'Droid Sans Mono', 'Source Code Pro', 'monospace'],\n },\n fontSizes: {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n base: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.5rem', // 24px\n '2xl': '2rem', // 32px\n '3xl': '2.25rem', // 36px\n '4xl': '3rem', // 48px\n '5xl': '3.5rem', // 56px\n },\n fontWeights: {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeights: {\n none: 1,\n tight: 1.375,\n snug: 1.5,\n normal: 1.57,\n relaxed: 1.66,\n loose: 1.75,\n },\n letterSpacing: {\n tighter: '-0.05em',\n tight: '-0.025em',\n normal: '0em',\n wide: '0.025em',\n wider: '0.05em',\n widest: '0.5px',\n },\n} as const\n\nexport const primitiveSpacing = {\n 0: '0',\n px: '1px',\n 0.5: '0.125rem', // 2px\n 1: '0.25rem', // 4px\n 1.5: '0.375rem', // 6px\n 2: '0.5rem', // 8px\n 2.5: '0.625rem', // 10px\n 3: '0.75rem', // 12px\n 3.5: '0.875rem', // 14px\n 4: '1rem', // 16px\n 5: '1.25rem', // 20px\n 6: '1.5rem', // 24px\n 7: '1.75rem', // 28px\n 8: '2rem', // 32px\n 9: '2.25rem', // 36px\n 10: '2.5rem', // 40px\n 11: '2.75rem', // 44px\n 12: '3rem', // 48px\n 14: '3.5rem', // 56px\n 16: '4rem', // 64px\n 20: '5rem', // 80px\n 24: '6rem', // 96px\n 28: '7rem', // 112px\n 32: '8rem', // 128px\n} as const\n\nexport const primitiveBorderRadius = {\n none: '0',\n sm: '4px',\n DEFAULT: '8px',\n md: '8px',\n lg: '12px',\n xl: '16px',\n '2xl': '24px',\n full: '9999px',\n} as const\n\nexport const primitiveShadows = {\n none: 'none',\n sm: '0px 1px 2px rgba(100, 116, 139, 0.12)',\n DEFAULT: '0px 1px 3px rgba(100, 116, 139, 0.12), 0px 1px 2px rgba(100, 116, 139, 0.24)',\n md: '0px 4px 6px rgba(100, 116, 139, 0.12)',\n lg: '0px 10px 15px rgba(100, 116, 139, 0.12)',\n xl: '0px 20px 25px rgba(100, 116, 139, 0.12)',\n '2xl': '0px 25px 50px rgba(100, 116, 139, 0.25)',\n inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',\n} as const\n\nexport const primitiveBreakpoints = {\n xs: 0,\n sm: 600,\n md: 1000,\n lg: 1200,\n xl: 1920,\n} as const\n\nexport const primitiveZIndex = {\n hide: -1,\n auto: 'auto',\n base: 0,\n docked: 10,\n dropdown: 1000,\n sticky: 1100,\n drawer: 1100,\n banner: 1200,\n appBar: 1200,\n overlay: 1300,\n modal: 1400,\n popover: 1500,\n skipLink: 1600,\n toast: 1700,\n tooltip: 1800,\n} as const\n","/**\n * Workout-specific tokens not yet in the main Tailwind config.\n * Use these inline instead of Tailwind classes.\n */\nimport { divergingScale, sequentialEffort, primitiveRamps as ramp } from './tokens/primitives'\n\nexport const WORKOUT_TOKENS = {\n // Canonical 4-band performance scale — the single source for BOTH the\n // VelocityStrip zone bars and the SetRow RPE color (TD-03.43). The direction\n // is intentionally inverted between the two consumers: for velocity, green =\n // fastest/best; for RPE, green = easiest. This is the [0,2,3,4] subsample of\n // the canonical `sequentialEffort` primitive: an EVEN hue walk across the ramp\n // (green → gold → orange → red). The earlier [0,1,2,4] spent two of its four\n // bands on adjacent yellows (amber-200 + amber-300) and skipped orange, reading\n // yellow-heavy with an abrupt jump to red; sampling amber-300 + orange-400\n // instead gives four cleanly separable bands that hold at 3px strip scale.\n // Consumed inline (RN).\n scale: {\n green: sequentialEffort[0], // green-300\n yellow: sequentialEffort[2], // amber-300 (gold)\n orange: sequentialEffort[3], // orange-400 (true orange)\n red: sequentialEffort[4], // red-600\n },\n\n // BodyMap volume heatmap — the canonical `divergingScale` (under → optimal →\n // over): a true diverging shape with a light green center, cool-blue under-\n // trained end and warm-red over-reaching end (colorblind-robust in lightness).\n heatmap: {\n none: '#E0E0E0', // no training data\n under: divergingScale[0], // below MEV\n maintenance: divergingScale[1], // MEV to MAV\n productive: divergingScale[2], // optimal center — MAV to MRV\n approaching: divergingScale[3], // near MRV\n over: divergingScale[4], // over MRV\n },\n\n // Badge border-radius (rounded-sm is 4px, we need 2px)\n badgeRadius: 2,\n\n // Surface and border colors were removed here: those flip with the theme, so\n // components use the CSS custom properties (var(--color-surface-*/border-*))\n // directly. Only theme-independent data-viz values remain below.\n\n // Intensity bar specific — over-target tiers deepen along the red ramp.\n intensity: {\n track: '#333333',\n over1: ramp.red[600], // matches status-error\n over2: ramp.red[700],\n over3: ramp.red[800],\n targetLine: 'rgba(33, 150, 243, 0.5)',\n atTargetGlow:\n '0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)',\n },\n\n // Placeholder strip\n placeholder: {\n fill: '#3A3A3A',\n },\n\n // Deviation bar\n deviation: {\n track: '#333333',\n },\n} as const\n","// Font mapping context: presentation-only helpers, no rendering.\nimport { WORKOUT_TOKENS } from '../theme/workout-tokens'\n\n/**\n * Presentation helpers for workout metrics.\n *\n * The data layer (`@voltras/workout-analytics` view-model derivations) supplies\n * EXACT, unrounded values; these turn them into the rounded / banded / formatted\n * forms a view renders. Keeping display munging here — in the design system, not\n * the analytics layer — is the render half of the model↔render split: one view\n * can round while another (or a hover) shows the exact value from the same real\n * data. Workout components consume these so the rules live in one place.\n */\n\n/** Round an exact RPE onto its conventional 0.5 granularity for display. */\nexport function roundRpe(rpe: number): number {\n return Math.round(rpe * 2) / 2\n}\n\n/**\n * Color band for an RPE on the canonical performance scale. Higher RPE = harder\n * = red (direction inverted vs velocity, which shares the same scale). Bands:\n * `<7` green, `7–8.5` yellow, `8.5–9.5` orange, `≥9.5` red.\n */\nexport function rpeColor(rpe: number): string {\n if (rpe >= 9.5) return WORKOUT_TOKENS.scale.red\n if (rpe >= 8.5) return WORKOUT_TOKENS.scale.orange\n if (rpe >= 7) return WORKOUT_TOKENS.scale.yellow\n return WORKOUT_TOKENS.scale.green\n}\n\n/** Round a weight or e1RM to a whole unit for compact display. */\nexport function roundWeight(weight: number): number {\n return Math.round(weight)\n}\n\n/** Format an exact velocity (m/s) to the 2-dp string shown on the velocity strip. */\nexport function formatVelocity(velocity: number): string {\n return velocity.toFixed(2)\n}\n\n/** Round an exact tempo tuple (seconds) to 1 dp per phase for display. */\nexport function roundTempo(\n tempo: [number, number, number, number]\n): [number, number, number, number] {\n return tempo.map((v) => Math.round(v * 10) / 10) as [number, number, number, number]\n}\n\n/** Signed percentage label for a deviation ratio, e.g. `+9%` / `-5%` / `0%`. */\nexport function formatSignedPct(ratio: number): string {\n const pct = Math.round(ratio * 100)\n return `${pct > 0 ? '+' : ''}${pct}%`\n}\n\n/** Structured prescription for the active exercise (from the plan). */\nexport interface PrescriptionInput {\n repsLow?: number\n repsHigh?: number\n weightLbs?: number\n rpe?: number\n}\n\n/**\n * Human prescription string, e.g. `\"8–10 @ 62 lb · RPE 8\"`. `null` when there is\n * nothing to show. Presentation-only: the plan supplies the numbers, this shapes\n * the label.\n */\nexport function formatPrescription(p: PrescriptionInput | null | undefined): string | null {\n if (p == null) return null\n let reps: string | null = null\n if (p.repsLow != null && p.repsHigh != null) {\n reps = p.repsLow === p.repsHigh ? `${p.repsLow}` : `${p.repsLow}–${p.repsHigh}`\n } else if (p.repsLow != null) {\n reps = `${p.repsLow}`\n }\n const weight = p.weightLbs != null ? `${p.weightLbs} lb` : null\n const head = [reps, weight].filter((s): s is string => s != null).join(' @ ')\n const rpe = p.rpe != null ? `RPE ${p.rpe}` : null\n const full = [head.length > 0 ? head : null, rpe]\n .filter((s): s is string => s != null)\n .join(' · ')\n return full.length > 0 ? full : null\n}\n","/**\n * Custom JSX runtime for titan-design's web distribution.\n *\n * Converts className props to $$css style objects at build time,\n * eliminating the need for NativeWind's runtime interopComponents\n * Map lookup. RNW's styleq recognizes $$css objects and applies\n * their values as CSS class names on DOM elements.\n *\n * This file is NOT used by source builds (specimen, storybook,\n * native Metro). It is only inlined into the dist by tsup via\n * an esbuild onResolve plugin.\n */\nimport {\n jsx as reactJsx,\n jsxs as reactJsxs,\n Fragment,\n} from 'react/jsx-runtime'\nimport type { StyleProp } from 'react-native'\n\ntype JsxFn = typeof reactJsx\n\nfunction wrapJsx(fn: JsxFn): JsxFn {\n return function (type, props: Record<string, any>, ...rest) {\n if (props && typeof props.className === 'string' && props.className) {\n const cn = props.className\n const cssStyle = { $$css: true, [cn]: cn } as unknown as StyleProp<any>\n const existing = props.style\n props = {\n ...props,\n style: existing ? [cssStyle, existing] : cssStyle,\n }\n delete props.className\n }\n return fn(type, props, ...rest)\n } as JsxFn\n}\n\nconst jsx = wrapJsx(reactJsx)\nconst jsxs = wrapJsx(reactJsxs)\n\nexport { jsx, jsxs, Fragment }\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Animated, Easing, type ViewProps, type DimensionValue } from 'react-native'\n\n/** ~1.9s full cycle: a pulsing segment eases up then back down (2 × half). */\nconst PULSE_HALF_MS = 950\n\n/** Pulsing segments breathe their opacity between this floor and full. */\nconst PULSE_MIN_OPACITY = 0.45\n\n/** Default between-segment gap — matches SetStrip's between-set gap so strips read the same. */\nconst SEGMENTED_BAR_GAP = 5\n\nexport interface SegmentedBarSegment {\n /** Flex weight of this segment's slot. Default 1 (all segments equal width). */\n weight?: number\n /** Fraction 0..1 of the slot the coloured fill covers, left-aligned. Default 1 (full). */\n fill?: number\n /** Fill colour — a literal hex (RNW-safe), never a `var()` token ref. */\n color: string\n /** When true the fill animates on the shared active-pulse loop. */\n pulse?: boolean\n /**\n * When pulsing, interpolate the fill's `backgroundColor` from→to over the loop\n * (full opacity). Omit to fall back to the default opacity breathe.\n */\n pulseColor?: [from: string, to: string]\n /**\n * A fixed gap (px) carved in before this segment's slot — lets a composer split\n * an otherwise-butted bar into sub-structure (drop notch, myo cluster) without a\n * uniform {@link SegmentedBarProps.gap}. Default 0 (butted against the previous).\n */\n leadingGap?: number\n /**\n * Static fill opacity 0..1 for a non-pulsing segment (e.g. a fading \"count\n * unknown\" trail). Ignored for `pulse` segments, which drive their own opacity.\n */\n opacity?: number\n}\n\nexport interface SegmentedBarProps extends ViewProps {\n /** The weighted segments, laid left-to-right. */\n segments: SegmentedBarSegment[]\n /** Track height in px. Default 8. */\n height?: number\n /** Gap between segment slots in px. Default 5 (SetStrip's between-set gap). */\n gap?: number\n /** Corner radius of each segment slot in px. Default 2. */\n radius?: number\n /** An absolutely-positioned vertical marker line at `position` (0..1 of total width). */\n marker?: { position: number; color: string } | null\n /**\n * Resolve the testID of a segment's fill element. Lets a composing component\n * (e.g. SetBar) preserve its own test hooks; defaults to `segmented-bar-segment`.\n */\n segmentTestID?: (segment: SegmentedBarSegment, index: number) => string | undefined\n}\n\n/** The shared active-pulse loop: a single 0→1→0 value driving every pulsing segment. */\nfunction usePulse(active: boolean): Animated.Value {\n const [value] = useState(() => new Animated.Value(0))\n\n useEffect(() => {\n if (!active) return\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(value, {\n toValue: 1,\n duration: PULSE_HALF_MS,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: false,\n }),\n Animated.timing(value, {\n toValue: 0,\n duration: PULSE_HALF_MS,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: false,\n }),\n ])\n )\n loop.start()\n return () => loop.stop()\n }, [active, value])\n\n return value\n}\n\n/**\n * A horizontal track split into weighted, individually-fillable segments — the\n * presentational atom the per-set strips are built from. Each segment is a flex\n * slot (flex = `weight`) holding a left-aligned fill (`fill` fraction, `color`);\n * `pulse` segments breathe on a shared active-pulse loop, and `marker` drops a\n * vertical line at a fraction of the total width. Colours are passed-in literal hex.\n */\nexport function SegmentedBar({\n segments,\n height = 8,\n gap = SEGMENTED_BAR_GAP,\n radius = 2,\n marker = null,\n segmentTestID,\n style,\n ...props\n}: SegmentedBarProps) {\n const pulse = usePulse(segments.some((s) => s.pulse))\n\n return (\n <View style={[{ flexDirection: 'row', height, gap, position: 'relative' }, style]} {...props}>\n {segments.map((seg, i) => {\n const fillStyle = {\n width: `${(seg.fill ?? 1) * 100}%` as DimensionValue,\n height: '100%' as DimensionValue,\n backgroundColor: seg.color,\n opacity: seg.opacity,\n }\n const testID = segmentTestID?.(seg, i) ?? 'segmented-bar-segment'\n return (\n <View\n key={i}\n style={{\n flex: seg.weight ?? 1,\n minWidth: 0,\n height: '100%',\n marginLeft: seg.leadingGap,\n borderRadius: radius,\n overflow: 'hidden',\n }}\n >\n {seg.pulse ? (\n <Animated.View\n style={{\n ...fillStyle,\n ...(seg.pulseColor\n ? {\n backgroundColor: pulse.interpolate({\n inputRange: [0, 1],\n outputRange: seg.pulseColor,\n }),\n }\n : {\n opacity: pulse.interpolate({\n inputRange: [0, 1],\n outputRange: [PULSE_MIN_OPACITY, 1],\n }),\n }),\n }}\n accessibilityElementsHidden\n testID={testID}\n />\n ) : (\n <View style={fillStyle} accessibilityElementsHidden testID={testID} />\n )}\n </View>\n )\n })}\n {marker ? (\n <View\n style={{\n position: 'absolute',\n left: `${marker.position * 100}%` as DimensionValue,\n top: 0,\n bottom: 0,\n width: 2,\n backgroundColor: marker.color,\n }}\n accessibilityElementsHidden\n testID=\"segmented-bar-marker\"\n />\n ) : null}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { primitiveColors, primitiveRamps } from '../../../theme/tokens/primitives'\nimport { SegmentedBar, type SegmentedBarSegment } from './SegmentedBar'\n\n/**\n * The four canonical rep-intensity zone pins (real titan ramp pins). A rep's mean\n * velocity ratio maps to one of these; butted together they form a set's bar.\n */\nexport const SET_STRIP_ZONES = {\n slow: primitiveRamps.red[600],\n moderate: primitiveRamps.orange[400],\n fast: primitiveRamps.amber[300],\n fastest: primitiveRamps.green[300],\n} as const\n\n/** Grey fill for planned-but-unperformed reps / upcoming sets (charcoal placeholder). */\nconst TODO_COLOR = primitiveColors.charcoal[300]\n\n/**\n * The learned \"variable / unknown / opportunity\" semantic (cyan-900, a real ramp\n * pin): an unperformed rep in a range's variable zone, and the fading trail of a\n * myo set whose cluster count isn't yet known.\n */\nexport const SET_STRIP_VARIABLE_COLOR = primitiveRamps.cyan[900]\n\n// Gap hierarchy — the chunk-size *pattern* carries set-type identity:\n// butted reps (0) < NOTCH (drop sub-load) < CLUSTER (myo rest-pause) < SET_GAP (5, between sets).\n/** Drop-set sub-load divider — a thin notch, narrower than a myo cluster gap. */\nconst NOTCH_GAP = 2\n/** Myo rest-pause divider between the activation chunk and each mini-cluster. */\nconst CLUSTER_GAP = 3\n\n/** myo-upcoming trail defaults: N fading expected clusters, each this many reps. */\nconst MYO_UPCOMING_CLUSTERS = 3\nconst MYO_UPCOMING_CLUSTER_LEN = 5\n/** Per-cluster opacity decay along the \"count unknown\" trail (1 · 0.6 · 0.36 · …). */\nconst MYO_UPCOMING_FADE = 0.6\n\n/**\n * Active-set pulse range per zone: each segment eases between its pin's adjacent\n * lighter/darker ramp steps, keeping the intensity reading while signalling \"live\".\n */\nconst PULSE_RANGE: Record<string, [string, string]> = {\n [SET_STRIP_ZONES.slow]: [primitiveRamps.red[500], primitiveRamps.red[700]],\n [SET_STRIP_ZONES.moderate]: [primitiveRamps.orange[300], primitiveRamps.orange[500]],\n [SET_STRIP_ZONES.fast]: [primitiveRamps.amber[200], primitiveRamps.amber[400]],\n [SET_STRIP_ZONES.fastest]: [primitiveRamps.green[200], primitiveRamps.green[400]],\n}\n\n/** Map a per-rep mean-velocity ratio to its zone pin (fastest = green, slowest = red). */\nexport function velocityZoneColor(v: number): string {\n if (v < 0.5) return SET_STRIP_ZONES.slow\n if (v < 0.75) return SET_STRIP_ZONES.moderate\n if (v < 1.0) return SET_STRIP_ZONES.fast\n return SET_STRIP_ZONES.fastest\n}\n\n/**\n * One set's data. Flat variants: `done` = every rep performed; `active` = reps-so-far\n * performed against a planned count (remainder greyed, performed reps pulse); `todo` =\n * a planned but unstarted set (solid grey bar). Set-type variants:\n * - `range` — variable rep-range (e.g. 15–20): `max` segments; committed zone\n * `0..floor` (done = velocity, todo = grey), variable zone `floor..max` (done =\n * velocity, todo = the variable/opportunity cyan). `doneVels` may run past `floor`.\n * - `drop` — one set, no rest: `subloads` butted internally, split by 2px notches.\n * - `myo` — done rest-pause: `activation` chunk + `clusters`, split by 3px cluster gaps.\n * - `myo-upcoming` — planned myo, length unknown: grey activation (`activationLen`) +\n * a fading cyan \"clusters-to-failure\" trail with the right edge left open.\n */\nexport type SetStripSet =\n | { status: 'done'; velocities: number[] }\n | { status: 'active'; velocities: number[]; planned: number }\n | { status: 'todo'; planned: number }\n | { status: 'range'; floor: number; max: number; doneVels: number[] }\n | { status: 'drop'; subloads: number[][] }\n | { status: 'myo'; activation: number[]; clusters: number[][] }\n | { status: 'myo-upcoming'; activationLen: number; clusterCount?: number }\n\n/** Flatten velocity chunks into butted segments, carving `gap` before each chunk but the first. */\nfunction chunkedSegments(chunks: number[][], gap: number): SegmentedBarSegment[] {\n return chunks.flatMap((vels, ci) =>\n vels.map((v, ri) => ({\n color: velocityZoneColor(v),\n ...(ci > 0 && ri === 0 ? { leadingGap: gap } : {}),\n }))\n )\n}\n\n/** The variable rep-range's `max` segments: velocity where done, else grey (committed) / cyan (variable). */\nfunction rangeSegments(floor: number, max: number, doneVels: number[]): SegmentedBarSegment[] {\n return Array.from({ length: max }, (_, i) => {\n if (i < doneVels.length) return { color: velocityZoneColor(doneVels[i]) }\n return { color: i < floor ? TODO_COLOR : SET_STRIP_VARIABLE_COLOR }\n })\n}\n\n/** Grey activation chunk + a fading, right-open cyan trail of expected rest-pause clusters. */\nfunction myoUpcomingSegments(activationLen: number, clusterCount: number): SegmentedBarSegment[] {\n const activation = Array.from({ length: activationLen }, () => ({ color: TODO_COLOR }))\n const trail = Array.from({ length: clusterCount }, (_, ci) =>\n Array.from({ length: MYO_UPCOMING_CLUSTER_LEN }, (_, ri) => ({\n color: SET_STRIP_VARIABLE_COLOR,\n opacity: MYO_UPCOMING_FADE ** ci,\n ...(ri === 0 ? { leadingGap: CLUSTER_GAP } : {}),\n }))\n ).flat()\n return [...activation, ...trail]\n}\n\n/** Map a set's performance state to the butted per-rep segments of its bar. */\nfunction setSegments(set: SetStripSet): SegmentedBarSegment[] {\n if (set.status === 'todo') {\n return [{ color: TODO_COLOR }]\n }\n if (set.status === 'done') {\n return set.velocities.map((v) => ({ color: velocityZoneColor(v) }))\n }\n if (set.status === 'range') {\n return rangeSegments(set.floor, set.max, set.doneVels)\n }\n if (set.status === 'drop') {\n return chunkedSegments(set.subloads, NOTCH_GAP)\n }\n if (set.status === 'myo') {\n return chunkedSegments([set.activation, ...set.clusters], CLUSTER_GAP)\n }\n if (set.status === 'myo-upcoming') {\n return myoUpcomingSegments(set.activationLen, set.clusterCount ?? MYO_UPCOMING_CLUSTERS)\n }\n const performed = set.velocities.map((v) => {\n const color = velocityZoneColor(v)\n return { color, pulse: true, pulseColor: PULSE_RANGE[color] }\n })\n const remaining = Math.max(0, set.planned - set.velocities.length)\n return [...performed, ...Array.from({ length: remaining }, () => ({ color: TODO_COLOR }))]\n}\n\n/** Preserve SetBar's per-segment test hooks over the generic SegmentedBar fills. */\nfunction setBarSegmentTestID(seg: SegmentedBarSegment): string {\n if (seg.pulse) return 'set-strip-pulse'\n if (seg.color === SET_STRIP_VARIABLE_COLOR) return 'set-strip-variable'\n return seg.color === TODO_COLOR ? 'set-strip-empty' : 'set-strip-fill'\n}\n\nexport interface SetBarProps {\n /** One set's performance state (done / active / todo). */\n set: SetStripSet\n /** Bar height in px. Default 8. */\n height?: number\n}\n\n/**\n * ONE set's multi-coloured bar: the butted per-rep colour segments for a single\n * set (`done` = velocity-coloured reps · `active` = performed reps pulsing + grey\n * remainder · `todo` = a solid grey bar), composed over {@link SegmentedBar}.\n * Fills its flex slot; {@link SetStrip} lays several side by side. Colours are the\n * real titan ramp pins.\n */\nexport function SetBar({ set, height = 8 }: SetBarProps) {\n return (\n <SegmentedBar\n segments={setSegments(set)}\n height={height}\n gap={0}\n radius={0}\n segmentTestID={setBarSegmentTestID}\n style={{ flex: 1, minWidth: 0, borderRadius: 2, overflow: 'hidden' }}\n testID=\"set-strip-set\"\n />\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, type ViewProps } from 'react-native'\nimport { SetBar, type SetStripSet } from './SetBar'\n\n// Re-exported so the per-set colour vocabulary stays importable from either the\n// molecule (SetStrip) or the atom (SetBar) it now lives in.\nexport {\n SET_STRIP_ZONES,\n SET_STRIP_VARIABLE_COLOR,\n velocityZoneColor,\n SetBar,\n type SetBarProps,\n} from './SetBar'\nexport type { SetStripSet } from './SetBar'\n\n/** Gap between set bars — ~2× the (zero) rep gap, so sets read as discrete units. */\nconst SET_STRIP_GAP = 5\n\n/** Collapse a set (flat or set-type) to its glance category for the progress summary. */\nfunction setCategory(set: SetStripSet): 'done' | 'active' | 'upcoming' {\n switch (set.status) {\n case 'done':\n case 'drop':\n case 'myo':\n return 'done'\n case 'active':\n return 'active'\n case 'range':\n return set.doneVels.length > 0 ? 'active' : 'upcoming'\n case 'todo':\n case 'myo-upcoming':\n return 'upcoming'\n }\n}\n\nfunction describeSets(sets: SetStripSet[]): string {\n const done = sets.filter((s) => setCategory(s) === 'done').length\n const active = sets.filter((s) => setCategory(s) === 'active').length\n const upcoming = sets.filter((s) => setCategory(s) === 'upcoming').length\n return `Set progress: ${done} done, ${active} in progress, ${upcoming} upcoming`\n}\n\nexport interface SetStripProps extends ViewProps {\n /** Per-set performance data, in set order. */\n sets: SetStripSet[]\n /** Bar height in px. Default 8. */\n height?: number\n className?: string\n}\n\n/**\n * The per-set segmented performance strip: one continuous {@link SetBar} per set\n * (rep intensities as butted color segments, no rep gaps), sets separated by a\n * fixed gap. Fills its container width. Colors are the real titan ramp pins.\n */\nexport function SetStrip({ sets, height = 8, className, ...props }: SetStripProps) {\n return (\n <View\n className={className}\n style={{ flexDirection: 'row', width: '100%', height, gap: SET_STRIP_GAP }}\n accessibilityRole=\"image\"\n accessibilityLabel={describeSets(sets)}\n testID=\"set-strip\"\n {...props}\n >\n {sets.map((set, i) => (\n <SetBar key={i} set={set} height={height} />\n ))}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport {\n View,\n Text,\n Pressable,\n Animated,\n Easing,\n type ViewProps,\n type ViewStyle,\n type LayoutChangeEvent,\n} from 'react-native'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\nimport { primitiveColors, primitiveRamps, sequentialEffort } from '../../../theme/tokens/primitives'\nimport { formatVelocity } from '../../../utils/workout-format'\nimport { SET_STRIP_VARIABLE_COLOR } from './SetStrip'\n\n/**\n * Structural velocity-zone band accepted from an upstream analytics source\n * (e.g. workout-analytics' `VelocityZones.bands`).\n *\n * Deliberately a plain structural shape — titan never imports the analytics\n * package (the same presentational-only policy the Workout family follows). Any object with\n * this shape can be passed, so `zones={waVelocityZones.bands}` works directly.\n * Bands are ordered slow → fast, contiguous, and cover `[0, ∞)` with the top\n * band's `max === null`. Bands carry NO color — color is a UI concern resolved\n * here via {@link zoneIdToScaleToken}.\n */\nexport interface VelocityZoneBandProp {\n /** Stable zone identity (e.g. WA's `VelocityZoneId`). Drives color mapping. */\n id: string\n /** Human-readable label shown in the summary row. */\n label: string\n /** Inclusive lower bound (m/s mean concentric velocity). */\n min: number\n /** Exclusive upper bound (m/s); `null` marks the open top band. */\n max: number | null\n}\n\nexport interface VelocityStripProps extends ViewProps {\n /**\n * Per-rep MEAN concentric velocity (m/s), one entry per rep (brain WA-D02).\n * Drives both bar height and — in the default path — zone color. Callers must\n * feed mean (not peak) concentric velocity so bar color, height, and the\n * summary label all describe one metric.\n *\n * Optional: provide exactly one of `velocities` or {@link VelocityStripProps.set}.\n * When neither is given the strip renders nothing.\n */\n velocities?: number[]\n /**\n * Optional structured strength-training set descriptor (see {@link VelocitySet}).\n * When present it supersedes `velocities`: the done-velocity array is derived\n * from the set (so mean / loss / zone summaries still work) and the strip is\n * drawn as a typed slot list — grey todo, cyan variable / continue windows and\n * the wide-gap chunking that distinguishes drop / myo / cluster sets. Provide\n * exactly one of `velocities` or `set`.\n */\n set?: VelocitySet\n /**\n * Optional velocity-zone bands (shape-compatible with WA's\n * `VelocityZones.bands`). When provided, bar color and the summary zone label\n * come from these bands via {@link zoneIdToScaleToken}. When omitted, the\n * built-in default scale (≥1.0 / ≥0.75 / ≥0.5) is used — identical to prior\n * releases. Colors NEVER come from the bands themselves.\n */\n zones?: readonly VelocityZoneBandProp[]\n /**\n * Live mode: index of the most-recently-completed rep. That bar animates in\n * with a \"pop\"; if it is also the current set peak (a new best), it \"bounces\"\n * instead. Only the latest bar animates. Honors `prefers-reduced-motion`.\n * Framed `expanded` chart only (interactive tap-to-expand use).\n */\n liveRepIndex?: number\n /**\n * `expanded` variant: whether the chart is OPEN. Default true (the variant shows\n * its chart). Toggle it (with {@link onToggle}) for the interactive tap-to-expand\n * collapse↔chart animation; a static open chart (no `onToggle`) does not animate.\n */\n expanded?: boolean\n onToggle?: () => void\n onRepPress?: (index: number, velocity: number) => void\n /**\n * `mini` — a flat 3px static strip (set-type aware). `expanded` — the velocity-\n * HEIGHT bar chart (rounded tops), whose chrome is prop-driven: with\n * {@link showNumbers} or {@link showInfo} on it's the framed chart (raised surface,\n * padding, per-bar m/s labels, mean/loss info row, interactive collapse); with both\n * off it's a bare strip — the active-set \"spotlight\" of {@link ExerciseCard}. `hero`\n * — the across-the-room, single-set wall treatment: tall bars, a per-bar m/s value\n * label, a dashed running-best reference line, and dashed placeholders for the reps\n * still to come (see {@link targetReps}). Reuses the zone scale and the live-rep pop.\n */\n variant?: 'mini' | 'expanded' | 'hero'\n /** `expanded` / `hero` plot height in px (bars scale to this). Default 60 (`expanded`) / 220 (`hero`). */\n height?: number\n /**\n * `hero` only: the set's planned rep count. Reps beyond {@link velocities} draw as\n * dashed placeholder stubs so the wall reads \"3 of 8 done\" at a glance. Ignored\n * (and no placeholders drawn) when absent or ≤ the performed-rep count.\n */\n targetReps?: number\n /**\n * `expanded` / `hero` bar scaling. `peak` (default) scales to the set's own max\n * (+15% headroom). `fixed` scales to a fixed velocity ceiling so bar heights read\n * the same absolute velocity across sets (the spotlight).\n */\n scale?: 'peak' | 'fixed'\n /** `expanded` framed chart: per-bar m/s labels. Default true. */\n showNumbers?: boolean\n /** `expanded` framed chart: the mean/loss info row. Default true. */\n showInfo?: boolean\n className?: string\n}\n\n// Canonical 4-color performance scale shared with SetRow's RPE color\n// (see theme/workout-tokens.ts). green = fastest, red = slowest/grinding.\nconst VEL_COLORS = WORKOUT_TOKENS.scale\n\n/**\n * Map a velocity-zone id (WA's 5-band taxonomy) directly onto the 6-stop\n * `sequentialEffort` ramp. The default strip uses the 4-color {@link VEL_COLORS}\n * scale (a subsample of the same ramp), but the 5-band taxonomy has one more\n * level than that scale carries, so it samples 5 stops: the top four align with\n * the default scale (speed/power/strengthSpeed/maximalStrength = green/gold/\n * orange/red) and `grinding` takes the ramp's darker red. `maximalStrength` and\n * `grinding` therefore stay DISTINCT — they no longer collapse onto one red for\n * lack of a 5th hue. An exercise moving from default to profile-derived zones\n * never shifts its fast-end colors.\n *\n * Unknown ids fall back to `green` (matching the historical default-path\n * fallback), so a forward-compatible band id never renders an empty bar.\n */\nconst bandIdToEffortColor: Record<string, string> = {\n speed: sequentialEffort[0], // green-300\n power: sequentialEffort[2], // amber-300 (gold)\n strengthSpeed: sequentialEffort[3], // orange-400\n maximalStrength: sequentialEffort[4], // red-600\n grinding: sequentialEffort[5], // red-700 — the distinct 5th band\n}\n\n// --- Default (no-zones) scale ------------------------------------------------\n// Retained as named exports for back-compat; they define the default path.\n\nexport function getVelocityZoneColor(velocity: number): string {\n if (velocity >= 1.0) return 'vel-green'\n if (velocity >= 0.75) return 'vel-yellow'\n if (velocity >= 0.5) return 'vel-orange'\n return 'vel-red'\n}\n\nexport function getVelocityZoneName(velocity: number): string {\n if (velocity >= 1.0) return 'Speed'\n if (velocity >= 0.75) return 'Power'\n if (velocity >= 0.5) return 'Strength-Speed'\n return 'Strength'\n}\n\nconst zoneHexMap: Record<string, string> = {\n 'vel-green': VEL_COLORS.green,\n 'vel-yellow': VEL_COLORS.yellow,\n 'vel-orange': VEL_COLORS.orange,\n 'vel-red': VEL_COLORS.red,\n}\n\n/**\n * Velocity loss for a set, as a whole percentage. Uses the running-best rep as\n * the reference (matching WA-02.05 / brain WA-D01): `(vBest − vLast) / vBest`,\n * clamped to ≥ 0 so a set that ends on its best rep reports 0 loss.\n */\nexport function calculateVelocityLoss(velocities: number[]): number {\n if (velocities.length < 2) return 0\n const best = Math.max(...velocities)\n if (best <= 0) return 0\n const last = velocities[velocities.length - 1]\n return Math.max(0, Math.round(((best - last) / best) * 100))\n}\n\n/** Arithmetic mean of the per-rep mean-concentric velocities. */\nexport function calculateMeanVelocity(velocities: number[]): number {\n if (velocities.length === 0) return 0\n const sum = velocities.reduce((acc, v) => acc + v, 0)\n return sum / velocities.length\n}\n\n/** Classify a velocity into its band (slow → fast, min inclusive / max exclusive). */\nfunction classifyBand(\n velocity: number,\n bands: readonly VelocityZoneBandProp[]\n): VelocityZoneBandProp | undefined {\n for (const band of bands) {\n if (band.max === null || velocity < band.max) return band\n }\n return bands[bands.length - 1]\n}\n\nfunction bandColor(band: VelocityZoneBandProp): string {\n return bandIdToEffortColor[band.id] ?? VEL_COLORS.green\n}\n\nfunction getLossStyle(loss: number): Record<string, string> | null {\n if (loss > 25) return { color: VEL_COLORS.red }\n if (loss > 20) return { color: VEL_COLORS.orange }\n return null\n}\n\n// --- Set-type slot model -----------------------------------------------------\n// The strength-training set vocabulary (operator-approved in the Set Modalities\n// exploration): one strip encoding for every per-rep set type. A set resolves to\n// an ordered list of slots; the slot `kind` picks the color and `leadingGap`\n// encodes the chunk pattern (rep gap vs the wide notch that splits drop sub-loads\n// / myo clusters / cluster intra-rests). Set-LEVEL types (pyramid / superset /\n// tempo) belong to the heading, not the strip.\n\n/**\n * A structured strength-training set. Supply as {@link VelocityStripProps.set} to\n * render its set-type encoding; the done-velocity array (used for the mean / loss\n * / zone summary) is derived from the type's velocity fields.\n */\nexport type VelocitySet =\n /** Fixed reps at a fixed load: done reps colored + a grey todo remainder to `planned`. */\n | { type: 'straight'; velocities: number[]; planned?: number }\n /** Bounded reps: committed slots `0..floor`, then a cyan variable window `floor..max`. */\n | { type: 'range'; velocities: number[]; floor: number; max: number }\n /** As-many-reps-as-possible: done reps + a trailing cyan \"continue\" slot that never closes. */\n | { type: 'amrap'; velocities: number[]; target?: number }\n /** Load drops with no rest: each sub-load's reps, split by a WIDE notch gap. */\n | { type: 'drop'; subloads: number[][] }\n /** Rest-pause: an activation chunk + mini-clusters split by WIDE gaps; `open` adds a cyan continue. */\n | { type: 'myo'; activation: number[]; clusters: number[][]; open?: boolean }\n /** Fixed count broken by intra-set rests: reps grouped by `groupSize` with WIDE intra-rest gaps. */\n | { type: 'cluster'; velocities: number[]; groupSize: number; planned?: number }\n\n/** One drawn cell of the strip. `kind` picks the color; `leadingGap` the spacing before it. */\ninterface VelocitySlot {\n kind: 'rep' | 'todo' | 'variable' | 'continue'\n velocity?: number\n leadingGap: number\n}\n\n/** Butted reps carry this gap; chunk boundaries carry {@link WIDE_GAP}. */\nconst REP_GAP = 2\n/**\n * The between-group notch (drop sub-loads / myo clusters / cluster intra-rests): a\n * fixed 8px total gap that reads as a group break without dominating a narrow strip.\n * 4× the rep gap — enough to separate groups at session-rail scale AND wall scale\n * without the notch ballooning at large widths. In the mini variant the container's\n * 2px gap covers part of it, so per-slot margin adds the remaining 6px (2 + 6 = 8).\n */\nconst WIDE_GAP = 8\n\n/** Grey fill for planned-but-unperformed reps (charcoal placeholder, literal hex). */\nconst TODO_COLOR = primitiveColors.charcoal[300]\n/** The thin cyan-800 outline on the open-ended \"continue\" slot — reads as \"keep going\". */\nconst CONTINUE_OUTLINE = primitiveRamps.cyan[800]\n\n/** The done-velocity array a set contributes to the mean / loss / zone summary. */\nfunction deriveDoneVelocities(set: VelocitySet): number[] {\n switch (set.type) {\n case 'drop':\n return set.subloads.flat()\n case 'myo':\n return [...set.activation, ...set.clusters.flat()]\n default:\n return set.velocities\n }\n}\n\n/** Flatten velocity chunks into rep slots, carving a WIDE gap before each chunk but the first. */\nfunction chunkedRepSlots(chunks: number[][]): VelocitySlot[] {\n const slots: VelocitySlot[] = []\n chunks.forEach((chunk) => {\n chunk.forEach((velocity, ri) => {\n const first = slots.length === 0\n slots.push({ kind: 'rep', velocity, leadingGap: first ? 0 : ri === 0 ? WIDE_GAP : REP_GAP })\n })\n })\n return slots\n}\n\n/** Resolve a set to its ordered slot list — the exact vocabulary of the Set Modalities sheet. */\nfunction buildSlots(set: VelocitySet): VelocitySlot[] {\n switch (set.type) {\n case 'straight': {\n const total = Math.max(set.velocities.length, set.planned ?? set.velocities.length)\n return Array.from({ length: total }, (_, i) => {\n const done = i < set.velocities.length\n return {\n kind: done ? 'rep' : 'todo',\n velocity: done ? set.velocities[i] : undefined,\n leadingGap: i === 0 ? 0 : REP_GAP,\n }\n })\n }\n case 'range': {\n const total = Math.max(set.max, set.velocities.length)\n return Array.from({ length: total }, (_, i) => {\n const kind: VelocitySlot['kind'] =\n i < set.velocities.length ? 'rep' : i < set.floor ? 'todo' : 'variable'\n return {\n kind,\n velocity: kind === 'rep' ? set.velocities[i] : undefined,\n leadingGap: i === 0 ? 0 : REP_GAP,\n }\n })\n }\n case 'amrap': {\n const reps = set.velocities.map<VelocitySlot>((velocity, i) => ({\n kind: 'rep',\n velocity,\n leadingGap: i === 0 ? 0 : REP_GAP,\n }))\n reps.push({ kind: 'continue', leadingGap: reps.length === 0 ? 0 : REP_GAP })\n return reps\n }\n case 'drop':\n return chunkedRepSlots(set.subloads)\n case 'myo': {\n const slots = chunkedRepSlots([set.activation, ...set.clusters])\n if (set.open) slots.push({ kind: 'continue', leadingGap: slots.length === 0 ? 0 : REP_GAP })\n return slots\n }\n case 'cluster': {\n const total = Math.max(set.velocities.length, set.planned ?? set.velocities.length)\n return Array.from({ length: total }, (_, i) => {\n const done = i < set.velocities.length\n const boundary = i > 0 && i % set.groupSize === 0\n return {\n kind: done ? 'rep' : 'todo',\n velocity: done ? set.velocities[i] : undefined,\n leadingGap: i === 0 ? 0 : boundary ? WIDE_GAP : REP_GAP,\n }\n })\n }\n }\n}\n\n/** A concise, set-type-aware summary for the strip's accessibility label. */\nfunction setAccessibilityLabel(set: VelocitySet, repCount: number): string {\n switch (set.type) {\n case 'straight':\n return `Velocity strip, straight set, ${repCount} reps`\n case 'range':\n return `Velocity strip, rep-range set, floor ${set.floor} to ${set.max}, ${repCount} reps done`\n case 'amrap':\n return `Velocity strip, AMRAP set, ${repCount} reps and counting`\n case 'drop':\n return `Velocity strip, drop set, ${set.subloads.length} loads, ${repCount} reps`\n case 'myo':\n return `Velocity strip, myo-reps set, ${set.clusters.length} clusters${set.open ? ', open' : ''}, ${repCount} reps`\n case 'cluster':\n return `Velocity strip, cluster set, groups of ${set.groupSize}, ${repCount} reps`\n }\n}\n\n/** Per-slot accessibility label for the expanded set-type bars. */\nfunction slotAccessibilityLabel(slot: VelocitySlot, index: number): string {\n switch (slot.kind) {\n case 'rep':\n return `Rep ${index + 1}: ${formatVelocity(slot.velocity ?? 0)} meters per second`\n case 'todo':\n return `Rep ${index + 1}: planned`\n case 'variable':\n return `Rep ${index + 1}: variable`\n case 'continue':\n return 'Keep going'\n }\n}\n\n/** Straight-set expanded stub height for a planned (todo) rep, as a % of the plot. */\nconst EXPANDED_TODO_STUB_PCT = 16\n/** Expanded height for advanced set-types (drop / myo / cluster / range / amrap): a short mini-style bar. */\nconst EXPANDED_ENCODED_PCT = 45\n\n/** Default framed `expanded` chart height (px). */\nconst EXPANDED_HEIGHT = 60\n/**\n * The `scale=\"fixed\"` velocity ceiling (m/s). `peak` scales to the set's own max\n * (+15% headroom); `fixed` uses this constant so a bar's height reads the same\n * absolute velocity across sets (the spotlight).\n */\nconst FIXED_MAX_VELOCITY = 1.15\n/** Minimum bare-strip bar height (px) — a planned / variable / continue stub, or a near-zero rep. */\nconst BARE_STUB_HEIGHT = 3\n\n// --- Hero variant ------------------------------------------------------------\n// The across-the-room, single-set wall treatment. Absorbs the R2 \"HeroVelocityBars\"\n// candidate into VelocityStrip: tall bars + per-bar value labels + a dashed\n// running-best reference line + dashed placeholders for the reps still to come.\n\n/** Default `hero` plot height (px) — tall enough to read a set's velocity shape across a room. */\nconst HERO_HEIGHT = 220\n/** Vertical band reserved above the tallest bar for its value label (px). */\nconst HERO_LABEL_HEADROOM = 20\n/** Gap between hero bars (px) — a group-notch-free even rhythm at wall scale. */\nconst HERO_BAR_GAP = 8\n/** Cap on a single hero bar's width so a 2–3 rep set doesn't render slab-wide bars (px). */\nconst HERO_BAR_MAX_WIDTH = 120\n/** Below this per-bar width the value labels collide, so all but the peak + live rep are dropped. */\nconst HERO_LABEL_MIN_BAR_WIDTH = 30\n/** Top-corner radius on hero bars (px). */\nconst HERO_BAR_RADIUS = 5\n/** Minimum drawn height of a performed hero bar (px) — a near-zero rep still reads as a rep. */\nconst HERO_MIN_BAR_HEIGHT = 4\n/** Dashed-stub border for a planned-but-unperformed hero rep (charcoal, reads on a dark wall). */\nconst HERO_PENDING_COLOR = primitiveColors.charcoal[100]\n/** The dashed running-best reference line + its label (the lightest charcoal step). */\nconst HERO_REFERENCE_COLOR = primitiveColors.charcoal[0]\n\n/**\n * Headroom above the peak bar: just enough to seat its value label without a big empty\n * band at the top (was 1.15 — too airy for the wall hero).\n */\nconst PEAK_HEADROOM = 1.06\n\n/** The bar-height scaling denominator for the given `scale` (guarded ≥ 0 by callers). */\nfunction scaleDenominator(scale: 'peak' | 'fixed', maxVelocity: number): number {\n return scale === 'fixed' ? FIXED_MAX_VELOCITY : maxVelocity * PEAK_HEADROOM\n}\n\n/** Bare-strip bar height (px): velocity-scaled for a performed rep, a short stub otherwise. */\nfunction bareSlotHeight(slot: VelocitySlot, height: number, denom: number): number {\n if (slot.kind !== 'rep' || denom <= 0) return BARE_STUB_HEIGHT\n const ratio = Math.min(1, (slot.velocity ?? 0) / denom)\n return Math.max(BARE_STUB_HEIGHT, ratio * height)\n}\n\nfunction getReducedMotionPreference(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** Track the OS \"reduce motion\" preference; falls back to `false` (jsdom/SSR). */\nfunction usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(getReducedMotionPreference)\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)')\n const handler = () => setReduced(mq.matches)\n handler()\n mq.addEventListener?.('change', handler)\n return () => mq.removeEventListener?.('change', handler)\n }, [])\n return reduced\n}\n\nconst ANIMATION_DURATION = 400\nconst ANIMATION_EASING = Easing.bezier(0.22, 1, 0.36, 1)\nconst POP_EASING = Easing.bezier(0.34, 1.56, 0.64, 1)\n\n/**\n * The newest-rep entrance shared by the framed `expanded` chart and `hero`: a\n * bounce when the rep is a new set peak, a pop otherwise. Honors reduced motion.\n * Returns the scale `Animated.Value` for the live bar; inert while `active` is\n * false or no live rep is present.\n */\nfunction useLiveRepPop(\n active: boolean,\n liveRepIndex: number | undefined,\n liveVelocity: number | undefined,\n isNewPeak: boolean\n): Animated.Value {\n const prefersReducedMotion = usePrefersReducedMotion()\n const [liveScale] = useState(() => new Animated.Value(1))\n useEffect(() => {\n if (!active || liveRepIndex == null || liveVelocity == null) return\n if (prefersReducedMotion) {\n liveScale.setValue(1)\n return\n }\n if (isNewPeak) {\n liveScale.setValue(1)\n Animated.sequence([\n Animated.timing(liveScale, {\n toValue: 1.25,\n duration: 150,\n easing: Easing.out(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.spring(liveScale, {\n toValue: 1,\n friction: 3,\n tension: 140,\n useNativeDriver: true,\n }),\n ]).start()\n } else {\n liveScale.setValue(0.8)\n Animated.timing(liveScale, {\n toValue: 1,\n duration: 300,\n easing: POP_EASING,\n useNativeDriver: true,\n }).start()\n }\n }, [active, liveRepIndex, liveVelocity, isNewPeak, prefersReducedMotion, liveScale])\n return liveScale\n}\n\ninterface HeroVelocityChartProps {\n /** Performed per-rep mean concentric velocities (m/s). */\n doneVelocities: number[]\n /** Zone → color resolver, shared with the other variants (single-sources the scale). */\n barColorFor: (velocity: number) => string\n /** Bar-height scaling denominator (`peak` set-max or `fixed` ceiling). */\n scaleDenom: number\n /** Running-best velocity (the set peak) — drives the dashed reference line. */\n referenceVelocity: number\n liveRepIndex?: number\n isNewPeak: boolean\n targetReps?: number\n height: number\n className?: string\n viewProps: ViewProps\n}\n\n/**\n * The `hero` render: the across-the-room, single-set wall treatment. Tall bars +\n * a per-bar value label + a dashed running-best reference line + dashed placeholders\n * for the reps still to come. Reuses {@link barColorFor} (zone scale) and the\n * {@link useLiveRepPop} entrance so it stays consistent with the framed chart.\n */\nfunction HeroVelocityChart({\n doneVelocities,\n barColorFor,\n scaleDenom,\n referenceVelocity,\n liveRepIndex,\n isNewPeak,\n targetReps,\n height,\n className,\n viewProps,\n}: HeroVelocityChartProps) {\n const liveVelocity = liveRepIndex != null ? doneVelocities[liveRepIndex] : undefined\n const liveScale = useLiveRepPop(true, liveRepIndex, liveVelocity, isNewPeak)\n\n // Measure the plot so per-bar value labels can thin on a narrow chart (they collide once\n // bars get thin). Width 0 (unmeasured) → show all, so test/server renders are unchanged.\n const [plotW, setPlotW] = useState(0)\n const onPlotLayout = (e: LayoutChangeEvent) => setPlotW(e.nativeEvent.layout.width)\n\n // Reserve a band above the tallest bar for its value label so a peak bar never clips.\n const plotHeight = Math.max(0, height - HERO_LABEL_HEADROOM)\n const barHeight = (velocity: number): number =>\n scaleDenom > 0\n ? Math.max(HERO_MIN_BAR_HEIGHT, Math.min(1, velocity / scaleDenom) * plotHeight)\n : HERO_MIN_BAR_HEIGHT\n\n const pendingCount = Math.max(0, (targetReps ?? 0) - doneVelocities.length)\n const referencePx =\n referenceVelocity > 0 && scaleDenom > 0\n ? Math.min(plotHeight, (referenceVelocity / scaleDenom) * plotHeight)\n : 0\n\n // When bars get too thin, keep only the peak + live-rep labels so the rest don't overlap.\n const totalSlots = doneVelocities.length + pendingCount\n const barWidth =\n plotW > 0 && totalSlots > 0\n ? Math.min(HERO_BAR_MAX_WIDTH, (plotW - HERO_BAR_GAP * (totalSlots - 1)) / totalSlots)\n : HERO_BAR_MAX_WIDTH\n const labelsCrowded = plotW > 0 && barWidth < HERO_LABEL_MIN_BAR_WIDTH\n // Step the inter-bar gap down with the bars so the gaps never dwarf the bars themselves.\n const heroGap =\n plotW === 0 ? HERO_BAR_GAP : barWidth < 16 ? 2 : barWidth < 28 ? 4 : HERO_BAR_GAP\n const peakIndex = doneVelocities.reduce(\n (best, v, i) => (v > doneVelocities[best] ? i : best),\n 0,\n )\n const showBarLabel = (i: number): boolean =>\n !labelsCrowded || i === peakIndex || i === liveRepIndex\n\n const repCount = doneVelocities.length\n const total = Math.max(repCount, targetReps ?? repCount)\n const label =\n referenceVelocity > 0\n ? `Velocity chart, ${repCount} of ${total} reps, best ${formatVelocity(referenceVelocity)} meters per second`\n : `Velocity chart, ${repCount} of ${total} reps`\n\n const { style: externalStyle, ...restProps } = viewProps\n\n return (\n <View\n className={className}\n style={[{ height }, externalStyle]}\n accessibilityRole=\"image\"\n accessibilityLabel={label}\n testID=\"velocity-strip-hero\"\n {...restProps}\n >\n <View\n onLayout={onPlotLayout}\n style={{\n flex: 1,\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: heroGap,\n position: 'relative',\n borderBottomWidth: 2,\n borderBottomColor: HERO_PENDING_COLOR,\n }}\n >\n {/*\n * Running-best reference line. Deliberately unlabeled: it sits at the tallest\n * bar's top, and that bar already displays its velocity as its own value label,\n * so a \"best X.XX\" tag would duplicate it — and would collide with that label\n * whenever the peak bar is on the same side (declines peak-left, ends-on-best\n * peak-right). The line alone reads as \"how far has velocity fallen from best\".\n * The numeric best is in the container's accessibility label.\n */}\n {referencePx > 0 && (\n <View\n accessibilityElementsHidden\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: referencePx,\n borderTopWidth: 1,\n borderStyle: 'dashed',\n borderColor: HERO_REFERENCE_COLOR,\n pointerEvents: 'none',\n }}\n testID=\"velocity-hero-reference\"\n />\n )}\n\n {doneVelocities.map((velocity, i) => {\n const isLive = liveRepIndex === i\n return (\n <View\n key={i}\n accessibilityElementsHidden\n style={{\n flex: 1,\n maxWidth: HERO_BAR_MAX_WIDTH,\n height: '100%',\n alignItems: 'center',\n justifyContent: 'flex-end',\n }}\n >\n {showBarLabel(i) && (\n <Text\n className=\"text-text-primary\"\n style={{ fontSize: 12, fontWeight: '800', marginBottom: 4 }}\n testID={`velocity-label-${i}`}\n >\n {formatVelocity(velocity)}\n </Text>\n )}\n <Animated.View\n style={[\n {\n width: '100%',\n height: barHeight(velocity),\n borderTopLeftRadius: HERO_BAR_RADIUS,\n borderTopRightRadius: HERO_BAR_RADIUS,\n backgroundColor: barColorFor(velocity),\n },\n isLive ? { transform: [{ scale: liveScale }] } : null,\n ]}\n testID={`velocity-bar-${i}`}\n />\n </View>\n )\n })}\n\n {Array.from({ length: pendingCount }, (_, i) => (\n <View\n key={`pending-${i}`}\n accessibilityElementsHidden\n style={{\n flex: 1,\n maxWidth: HERO_BAR_MAX_WIDTH,\n height: '100%',\n alignItems: 'center',\n justifyContent: 'flex-end',\n }}\n >\n <View\n style={{\n width: '100%',\n height: HERO_MIN_BAR_HEIGHT * 3,\n borderWidth: 1,\n borderStyle: 'dashed',\n borderColor: HERO_PENDING_COLOR,\n borderTopLeftRadius: HERO_BAR_RADIUS,\n borderTopRightRadius: HERO_BAR_RADIUS,\n }}\n testID=\"velocity-slot-todo\"\n />\n </View>\n ))}\n </View>\n </View>\n )\n}\n\nexport function VelocityStrip({\n velocities,\n set,\n zones,\n liveRepIndex,\n expanded = true,\n onToggle,\n onRepPress,\n variant = 'expanded',\n height = EXPANDED_HEIGHT,\n targetReps,\n scale = 'peak',\n showNumbers = true,\n showInfo = true,\n className,\n ...props\n}: VelocityStripProps) {\n // A `set` descriptor derives its own done-velocity array; the legacy\n // `velocities` path stays the source of truth otherwise. Every summary calc\n // (mean / loss / zone) runs on this one array so the info row works either way.\n const doneVelocities = set ? deriveDoneVelocities(set) : (velocities ?? [])\n const slots: VelocitySlot[] = set\n ? buildSlots(set)\n : doneVelocities.map((v, i) => ({\n kind: 'rep',\n velocity: v,\n leadingGap: i === 0 ? 0 : REP_GAP,\n }))\n\n const maxVelocity = Math.max(...doneVelocities, 0)\n const meanVelocity = calculateMeanVelocity(doneVelocities)\n const loss = calculateVelocityLoss(doneVelocities)\n\n // The framed chart (raised box, labels, info) vs the bare spotlight strip is the\n // only fork in the `expanded` variant — keyed by whether any chrome is requested.\n const framed = showNumbers || showInfo\n const scaleDenom = scaleDenominator(scale, maxVelocity)\n\n const hasZones = zones != null && zones.length > 0\n const barColorFor = (v: number): string =>\n hasZones ? bandColor(classifyBand(v, zones)!) : zoneHexMap[getVelocityZoneColor(v)]\n const slotColor = (slot: VelocitySlot): string => {\n if (slot.kind === 'rep') return barColorFor(slot.velocity ?? 0)\n if (slot.kind === 'todo') return TODO_COLOR\n return SET_STRIP_VARIABLE_COLOR\n }\n const meanZone = hasZones\n ? (classifyBand(meanVelocity, zones)?.label ?? '')\n : getVelocityZoneName(meanVelocity)\n\n const [heightAnim] = useState(() => new Animated.Value(expanded ? height : 3))\n const [labelOpacity] = useState(() => new Animated.Value(expanded ? 1 : 0))\n const [infoOpacity] = useState(() => new Animated.Value(expanded ? 1 : 0))\n\n // Newest-rep animation: pop for a normal rep, bounce when it sets a new peak.\n const liveVelocity = liveRepIndex != null ? doneVelocities[liveRepIndex] : undefined\n const isNewPeak = liveVelocity != null && maxVelocity > 0 && liveVelocity === maxVelocity\n const liveScale = useLiveRepPop(\n variant === 'expanded' && framed,\n liveRepIndex,\n liveVelocity,\n isNewPeak\n )\n\n useEffect(() => {\n if (variant !== 'expanded' || !framed) return\n\n Animated.parallel([\n Animated.timing(heightAnim, {\n toValue: expanded ? height : 3,\n duration: ANIMATION_DURATION,\n easing: ANIMATION_EASING,\n useNativeDriver: false,\n }),\n Animated.timing(labelOpacity, {\n toValue: expanded ? 1 : 0,\n duration: 300,\n delay: expanded ? 150 : 0,\n useNativeDriver: false,\n }),\n Animated.timing(infoOpacity, {\n toValue: expanded ? 1 : 0,\n duration: 300,\n delay: expanded ? 200 : 0,\n useNativeDriver: false,\n }),\n ]).start()\n }, [expanded, variant, framed, height, heightAnim, labelOpacity, infoOpacity])\n\n // Nothing to draw: neither a legacy velocity array nor a set descriptor.\n if (set == null && velocities == null) return null\n\n const repCount = doneVelocities.length\n const miniLabel = set ? setAccessibilityLabel(set, repCount) : `Velocity strip, ${repCount} reps`\n\n if (variant === 'hero') {\n // Hero's plot is far taller than the expanded chart; apply its own default when\n // the caller left `height` at the shared 60px default.\n const heroHeight = height === EXPANDED_HEIGHT ? HERO_HEIGHT : height\n return (\n <HeroVelocityChart\n doneVelocities={doneVelocities}\n barColorFor={barColorFor}\n scaleDenom={scaleDenom}\n referenceVelocity={maxVelocity}\n liveRepIndex={liveRepIndex}\n isNewPeak={isNewPeak}\n targetReps={targetReps}\n height={heroHeight}\n className={className}\n viewProps={props}\n />\n )\n }\n\n if (variant === 'mini') {\n const { style: externalStyle, ...restProps } = props\n // The container keeps the uniform REP_GAP (so a no-`set` strip is byte-identical\n // to prior releases and holds HTML-parity); per-slot `marginLeft` carries only\n // the EXTRA spacing for the WIDE notch that chunks drop / myo / cluster sets.\n return (\n <View\n className={className}\n style={[\n { flexDirection: 'row', height: 3, gap: REP_GAP, borderRadius: 2, overflow: 'hidden' },\n externalStyle,\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={miniLabel}\n testID=\"velocity-strip-mini\"\n {...restProps}\n >\n {slots.map((slot, i) => (\n <View\n key={i}\n style={{\n flex: 1,\n backgroundColor: slotColor(slot),\n borderRadius: 1,\n minWidth: 4,\n height: '100%' as unknown as number,\n // The container's uniform 2px gap covers rep spacing; a wide slot adds\n // only the EXTRA (WIDE_GAP − REP_GAP) so the notch totals WIDE_GAP.\n marginLeft: Math.max(0, slot.leadingGap - REP_GAP),\n ...(slot.kind === 'continue'\n ? { borderWidth: 1, borderColor: CONTINUE_OUTLINE }\n : {}),\n }}\n accessibilityElementsHidden\n testID={slot.kind === 'rep' ? `velocity-bar-${i}` : `velocity-slot-${slot.kind}`}\n />\n ))}\n </View>\n )\n }\n\n // Bare `expanded` strip (both chrome flags off): the velocity-HEIGHT spotlight —\n // px bar heights, no raised box / labels / info row / animation. Set-type gaps carry\n // over from the slot model exactly as in `mini` (container REP_GAP + per-slot extra\n // for a WIDE notch); planned / variable / continue slots draw as stubs.\n if (!framed) {\n const { style: externalStyle, ...restProps } = props\n return (\n <View\n className={className}\n style={[\n { flexDirection: 'row', height, gap: REP_GAP, alignItems: 'flex-end' },\n externalStyle,\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={miniLabel}\n testID=\"velocity-strip-compact\"\n {...restProps}\n >\n {slots.map((slot, i) => (\n <View\n key={i}\n style={{\n flex: 1,\n minWidth: 4,\n height: bareSlotHeight(slot, height, scaleDenom),\n // Top-rounded to match the framed chart's bars (the \"rounded tops from\n // the numbers one\"); square bottoms since bars sit on the baseline.\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n backgroundColor: slotColor(slot),\n marginLeft: Math.max(0, slot.leadingGap - REP_GAP),\n ...(slot.kind === 'continue'\n ? { borderWidth: 1, borderColor: CONTINUE_OUTLINE }\n : {}),\n }}\n accessibilityElementsHidden\n testID={slot.kind === 'rep' ? `velocity-bar-${i}` : `velocity-slot-${slot.kind}`}\n />\n ))}\n </View>\n )\n }\n\n const stripLabel = set\n ? `${setAccessibilityLabel(set, repCount)}, tap to ${expanded ? 'collapse' : 'expand'}`\n : `Velocity chart for set, ${repCount} reps, tap to ${expanded ? 'collapse' : 'expand'}`\n // When onToggle wraps the strip or individual reps are interactive, the container itself is not a button\n const hasInteractiveContainer = onToggle != null\n const hasInteractiveReps = onRepPress != null && expanded\n\n // Expanded set-type bars: `straight` is the active-set spotlight (velocity-height\n // done reps + short grey planned stubs); the advanced types render as a short,\n // mini-style encoding (the gaps + colors carry identity, height is uniform).\n const setBars =\n set != null &&\n slots.map((slot, i) => {\n const isStraightRep = set.type === 'straight' && slot.kind === 'rep'\n const heightPct = isStraightRep\n ? scaleDenom > 0\n ? Math.round(((slot.velocity ?? 0) / scaleDenom) * 100)\n : 0\n : set.type === 'straight'\n ? EXPANDED_TODO_STUB_PCT\n : EXPANDED_ENCODED_PCT\n return (\n <View\n key={i}\n style={{\n flex: 1,\n height: '100%',\n justifyContent: 'flex-end',\n marginLeft: slot.leadingGap,\n }}\n >\n <View\n style={{\n height: `${heightPct}%`,\n minHeight: 2,\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n backgroundColor: slotColor(slot),\n ...(slot.kind === 'continue'\n ? { borderWidth: 1, borderColor: CONTINUE_OUTLINE }\n : {}),\n }}\n testID={slot.kind === 'rep' ? `velocity-bar-${i}` : `velocity-slot-${slot.kind}`}\n accessibilityRole=\"image\"\n accessibilityLabel={slotAccessibilityLabel(slot, i)}\n />\n </View>\n )\n })\n\n const stripContent = (\n <Animated.View\n className={[className, expanded ? 'bg-surface-raised' : 'bg-transparent']\n .filter(Boolean)\n .join(' ')}\n style={[\n {\n height: heightAnim,\n width: '100%',\n gap: 2,\n borderRadius: expanded ? 6 : 2,\n paddingTop: expanded ? 16 : 0,\n paddingBottom: expanded ? 24 : 0,\n // No horizontal inset — the framed chart's bars span full width, matching\n // the bare spotlight and mini. Numbers/info sit in the vertical padding.\n paddingHorizontal: 0,\n paddingVertical: expanded ? undefined : 8,\n overflow: expanded ? 'visible' : 'hidden',\n },\n ]}\n accessibilityRole={hasInteractiveContainer || hasInteractiveReps ? 'none' : 'button'}\n accessibilityLabel={hasInteractiveContainer || hasInteractiveReps ? undefined : stripLabel}\n testID=\"velocity-strip\"\n {...props}\n >\n <View style={{ flexDirection: 'row', flex: 1, gap: set ? 0 : 2, alignItems: 'flex-end' }}>\n {set\n ? setBars\n : doneVelocities.map((v, i) => {\n const barBackground = barColorFor(v)\n // Guard all-zero velocities (idle / pre-rep): a 0 denominator makes\n // this 0 / 0 === NaN and emits height:'NaN%'. Flatten the bars instead.\n const barHeightPct = scaleDenom > 0 ? Math.round((v / scaleDenom) * 100) : 0\n const isLive = liveRepIndex === i\n const liveLabelSuffix = isLive\n ? isNewPeak\n ? ', latest rep, new set peak'\n : ', latest rep'\n : ''\n\n const barStyle: ViewStyle = expanded\n ? {\n height: `${barHeightPct}%`,\n minHeight: 2,\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n backgroundColor: barBackground,\n }\n : {\n minHeight: '100%' as unknown as number,\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n backgroundColor: barBackground,\n }\n\n const barInner = isLive ? (\n <Animated.View\n style={[barStyle, { transform: [{ scale: liveScale }] }]}\n testID={`velocity-bar-${i}`}\n accessibilityRole=\"image\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second${liveLabelSuffix}`}\n />\n ) : (\n <View\n style={barStyle}\n testID={`velocity-bar-${i}`}\n accessibilityRole=\"image\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second`}\n />\n )\n\n const bar = (\n <View\n key={i}\n style={{\n flex: 1,\n height: '100%',\n justifyContent: 'flex-end',\n position: 'relative',\n }}\n >\n {expanded && showNumbers && (\n <Animated.View\n style={{\n opacity: labelOpacity,\n alignItems: 'center',\n position: 'absolute',\n top: -13,\n left: 0,\n right: 0,\n }}\n accessibilityElementsHidden\n >\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 8, fontWeight: '600' }}\n testID={`velocity-label-${i}`}\n >\n {formatVelocity(v)}\n </Text>\n </Animated.View>\n )}\n {barInner}\n </View>\n )\n\n if (onRepPress && expanded) {\n return (\n <Pressable\n key={i}\n style={{ flex: 1, height: '100%' }}\n onPress={() => onRepPress(i, v)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second, tap for details`}\n testID={`velocity-bar-pressable-${i}`}\n >\n {bar}\n </Pressable>\n )\n }\n\n return bar\n })}\n </View>\n {expanded && showInfo && (\n <Animated.View\n style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n opacity: infoOpacity,\n position: 'absolute',\n bottom: 4,\n left: 6,\n right: 6,\n }}\n testID=\"velocity-info-row\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {meanZone} {'·'} {formatVelocity(meanVelocity)} m/s\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n ...getLossStyle(loss),\n }}\n >\n Loss: {loss}%\n </Text>\n </Animated.View>\n )}\n </Animated.View>\n )\n\n if (onToggle) {\n return (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={stripLabel}\n testID=\"velocity-strip-pressable\"\n >\n {stripContent}\n </Pressable>\n )\n }\n\n return stripContent\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Utility function to merge Tailwind CSS classes with proper conflict resolution.\n * Combines clsx for conditional classes with tailwind-merge for deduplication.\n *\n * @example\n * cn('p-4 bg-red-500', isActive && 'bg-blue-500', className)\n * // If isActive is true, returns 'p-4 bg-blue-500' (not 'p-4 bg-red-500 bg-blue-500')\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nexport interface PlaceholderStripProps extends ViewProps {\n width?: number | string\n /** Render as single solid strip or segmented mini-strip */\n mode?: 'single' | 'segmented'\n /** Number of segments when mode is 'segmented' */\n segments?: number\n className?: string\n}\n\nfunction SingleStrip({\n width,\n className,\n ...props\n}: Omit<PlaceholderStripProps, 'mode' | 'segments'>) {\n return (\n <View\n className={className}\n style={[\n {\n height: 3,\n backgroundColor: WORKOUT_TOKENS.placeholder.fill,\n borderRadius: 2,\n opacity: 0.5,\n },\n width != null ? { width: width as number } : { flex: 1 },\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Planned set, not yet completed\"\n testID=\"placeholder-strip\"\n {...props}\n />\n )\n}\n\nfunction SegmentedStrip({\n segments = 3,\n width,\n className,\n ...props\n}: Omit<PlaceholderStripProps, 'mode'>) {\n return (\n <View\n className={cn('flex-row', className)}\n style={[\n { height: 3, gap: 2, opacity: 0.5 },\n width != null ? { width: width as number } : { flex: 1 },\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Planned set, not yet completed\"\n testID=\"placeholder-strip\"\n {...props}\n >\n {Array.from({ length: segments }, (_, i) => (\n <View\n key={i}\n style={{\n flex: 1,\n height: 3,\n backgroundColor: WORKOUT_TOKENS.placeholder.fill,\n borderRadius: 1,\n minWidth: 4,\n }}\n accessibilityElementsHidden\n testID=\"placeholder-segment\"\n />\n ))}\n </View>\n )\n}\n\nexport function PlaceholderStrip({\n mode = 'single',\n segments,\n ...props\n}: PlaceholderStripProps) {\n if (mode === 'segmented') {\n return <SegmentedStrip segments={segments} {...props} />\n }\n return <SingleStrip {...props} />\n}\n","import type { ReactNode } from 'react'\n\nexport interface IconProps {\n /** Rendered width/height in px (viewBox is fixed 24×24). */\n size?: number\n /** Stroke color (or fill, for solid icons). Defaults to `currentColor` so a wrapper's text token drives it. */\n color?: string\n /** Stroke width for outline icons. */\n strokeWidth?: number\n /** Fill color; defaults to `none` (outline). */\n fill?: string\n /** Accessible title — sets `role=\"img\"` + `<title>`. Omit for a decorative icon (hidden from AT). */\n title?: string\n}\n\nexport interface SvgIconProps extends IconProps {\n children: ReactNode\n}\n\n/**\n * Base SVG wrapper for the titan icon set — a 24×24 web-`<svg>` with the shared\n * accessibility contract (titled → `role=\"img\"` + `<title>`; untitled →\n * `aria-hidden`) and `currentColor` inheritance. Icons pass their paths as\n * children plus their stroke/fill defaults.\n */\nexport function SvgIcon({\n size = 24,\n color = 'currentColor',\n strokeWidth = 2,\n fill = 'none',\n title,\n children,\n}: SvgIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={fill}\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...(title ? { role: 'img', 'aria-label': title } : { 'aria-hidden': true })}\n >\n {title ? <title>{title}</title> : null}\n {children}\n </svg>\n )\n}\n","import { SvgIcon, type IconProps } from './SvgIcon'\n\n/**\n * Voltras brand mark — the ◇ diamond (outline). Pass `fill` for a solid mark.\n */\nexport function VoltrasMark({ size = 14, ...props }: IconProps) {\n return (\n <SvgIcon size={size} {...props}>\n <path d=\"M12 2 22 12 12 22 2 12Z\" />\n </SvgIcon>\n )\n}\n\n/**\n * Bluetooth glyph (stroked) — e.g. device-connection state (color via `currentColor`).\n */\nexport function BluetoothIcon({ size = 18, ...props }: IconProps) {\n return (\n <SvgIcon size={size} {...props}>\n <path d=\"M7 7 17 17 12 22 12 2 17 7 7 17\" />\n </SvgIcon>\n )\n}\n\n/** Dumbbell glyph (mirrors lucide-react `Dumbbell`). Outline-only by default. */\nexport function DumbbellIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M14.4 14.4 9.6 9.6\" />\n <path d=\"M18.657 21.485a2 2 0 1 1-2.829-2.828l-1.767 1.768a2 2 0 1 1-2.829-2.829l6.364-6.364a2 2 0 1 1 2.829 2.829l-1.768 1.767a2 2 0 1 1 2.828 2.829z\" />\n <path d=\"m21.5 21.5-1.4-1.4\" />\n <path d=\"M3.9 3.9 2.5 2.5\" />\n <path d=\"M6.404 12.768a2 2 0 1 1-2.829-2.829l1.768-1.767a2 2 0 1 1-2.828-2.829l2.828-2.828a2 2 0 1 1 2.829 2.828l1.767-1.768a2 2 0 1 1 2.829 2.829z\" />\n </SvgIcon>\n )\n}\n\n/** Star glyph (mirrors lucide-react `Star`). Pass `fill` for a solid star. */\nexport function StarIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </SvgIcon>\n )\n}\n\n/** Activity / pulse-line glyph (mirrors lucide-react `Activity`). Shell S2 nav → Live. */\nexport function ActivityIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </SvgIcon>\n )\n}\n\n/** History / clock-arrow glyph (mirrors lucide-react `History`). Shell S2 nav → Review. */\nexport function HistoryIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M12 7v5l4 2\" />\n </SvgIcon>\n )\n}\n\n/** Layers / stack glyph (mirrors lucide-react `Layers`). Shell S2 nav → Program (mesocycle stack). */\nexport function LayersIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z\" />\n <path d=\"m6.08 9.5-3.49 1.59a1 1 0 0 0 0 1.81l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9a1 1 0 0 0 0-1.83l-3.5-1.59\" />\n <path d=\"m6.08 14.5-3.49 1.59a1 1 0 0 0 0 1.81l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9a1 1 0 0 0 0-1.83l-3.5-1.59\" />\n </SvgIcon>\n )\n}\n\n/** Standing-figure glyph (mirrors lucide-react `PersonStanding`). Shell S2 nav → Body (muscle map). */\nexport function PersonStandingIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <path d=\"m9 20 3-6 3 6\" />\n <path d=\"m6 8 6 2 6-2\" />\n <path d=\"M12 10v4\" />\n </SvgIcon>\n )\n}\n\n/** Balance-scale glyph (mirrors lucide-react `Scale`). ExerciseIndicator → `imbalance`. */\nexport function ScaleIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z\" />\n <path d=\"m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z\" />\n <path d=\"M7 21h10\" />\n <path d=\"M12 3v18\" />\n <path d=\"M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2\" />\n </SvgIcon>\n )\n}\n\n/** Warning-triangle glyph (mirrors lucide-react `AlertTriangle`). ExerciseIndicator → `overshoot`. */\nexport function AlertTriangleIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </SvgIcon>\n )\n}\n\n/** Down-trend glyph (mirrors lucide-react `TrendingDown`). ExerciseIndicator → `velocity-loss`. */\nexport function TrendingDownIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M16 17h6v-6\" />\n <path d=\"m22 17-8.5-8.5-5 5L2 7\" />\n </SvgIcon>\n )\n}\n\n/** Slashed-circle glyph (mirrors lucide-react `CircleSlash`). ExerciseIndicator → `missed-reps`. */\nexport function CircleSlashIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 15 6-6\" />\n </SvgIcon>\n )\n}\n\n/** Medal glyph (mirrors lucide-react `Award`). ExerciseIndicator → `pr`. */\nexport function AwardIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526\" />\n <circle cx=\"12\" cy=\"8\" r=\"6\" />\n </SvgIcon>\n )\n}\n\n/** Info-circle glyph (mirrors lucide-react `Info`). ExerciseIndicator → `info`. */\nexport function InfoIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </SvgIcon>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState, type ReactNode } from 'react'\nimport { View, Pressable, Animated, type ViewProps } from 'react-native'\n\nexport type BaseBadgeVariant = 'plain' | 'pr'\nexport type BaseBadgeSize = 'sm' | 'md' | 'lg'\n\nexport interface BaseBadgeProps extends ViewProps {\n /** Visual variant — plain (neutral) or pr (brand-primary-subtle) */\n variant?: BaseBadgeVariant\n /** Size variant */\n size?: BaseBadgeSize\n /** Optional icon rendered left of children; hidden from a11y tree */\n icon?: ReactNode\n onPress?: () => void\n className?: string\n children?: ReactNode\n}\n\nexport const baseBadgeSizeConfig: Record<\n BaseBadgeSize,\n { fontSize: number; paddingH: number; paddingV: number; iconSize: number }\n> = {\n sm: { fontSize: 9, paddingH: 6, paddingV: 2, iconSize: 10 },\n md: { fontSize: 10, paddingH: 8, paddingV: 2, iconSize: 12 },\n lg: { fontSize: 12, paddingH: 10, paddingV: 4, iconSize: 14 },\n}\n\nconst variantColors: Record<\n BaseBadgeVariant,\n { backgroundColor: string; borderColor: string }\n> = {\n plain: { backgroundColor: '#1C1C1C', borderColor: '#1F1F1F' },\n pr: {\n backgroundColor: 'rgba(255, 121, 0, 0.12)',\n borderColor: 'rgba(255, 121, 0, 0.3)',\n },\n}\n\nexport function BaseBadge({\n variant = 'plain',\n size = 'md',\n icon,\n onPress,\n className,\n children,\n ...props\n}: BaseBadgeProps) {\n const [scaleAnim] = useState(() => new Animated.Value(1))\n const config = baseBadgeSizeConfig[size]\n const colors = variantColors[variant]\n\n const handlePressIn = () => {\n Animated.timing(scaleAnim, {\n toValue: 0.97,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const handlePressOut = () => {\n Animated.timing(scaleAnim, {\n toValue: 1,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const badge = (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 3,\n // borderRadius 2 is intentional per workout-tokens.ts (squared-off pill)\n borderRadius: 2,\n borderWidth: 1,\n borderColor: colors.borderColor,\n backgroundColor: colors.backgroundColor,\n paddingHorizontal: config.paddingH,\n paddingVertical: config.paddingV,\n }}\n {...props}\n >\n {icon != null && (\n <View accessibilityElementsHidden testID=\"base-badge-icon\">\n {icon}\n </View>\n )}\n {children}\n </View>\n )\n\n if (onPress) {\n return (\n <Animated.View style={{ transform: [{ scale: scaleAnim }] }}>\n <Pressable\n onPress={onPress}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n accessibilityRole=\"button\"\n accessibilityLabel={props.accessibilityLabel}\n testID=\"base-badge-pressable\"\n >\n {badge}\n </Pressable>\n </Animated.View>\n )\n }\n\n return badge\n}\n","/**\n * Semantic Design Tokens\n *\n * Meaningful tokens following DTCG (Design Tokens Community Group) naming conventions.\n * Pattern: {category}-{intent}-{variant?}-{state?}\n *\n * Categories:\n * - brand-* : Brand colors (primary, secondary, accent)\n * - status-* : Feedback colors (success, error, warning, info)\n * - result-* : Outcome indicators (improve, degrade, inconclusive, neutral)\n * - data-* : Data visualization colors (chart series)\n * - on-* : Text on colored backgrounds\n * - surface-* : Elevated containers (NOT \"paper\")\n * - background-* : Page backgrounds\n * - text-* : Text colors\n * - border-* : Border colors\n * - interactive-* : Hover/focus/active/disabled states\n */\n\nimport { primitiveColors as p, primitiveRamps as ramp, discreteRainbow } from './primitives'\n\n// Light mode semantic colors (default)\nexport const semanticColorsLight = {\n // Brand colors (brand-*)\n 'brand-primary': ramp.orange[400],\n 'brand-primary-light': ramp.orange[300],\n 'brand-primary-dark': ramp.orange[500],\n 'brand-primary-subtle': 'rgba(255, 121, 0, 0.08)',\n 'brand-primary-hover': ramp.orange[500],\n 'brand-primary-active': ramp.orange[600],\n\n 'brand-secondary': ramp.cyan[600],\n 'brand-secondary-light': ramp.cyan[500],\n 'brand-secondary-dark': ramp.cyan[700],\n 'brand-secondary-subtle': 'rgba(48, 123, 155, 0.08)',\n 'brand-secondary-hover': ramp.cyan[700],\n 'brand-secondary-active': ramp.cyan[800],\n\n // Text on brand backgrounds (on-*)\n 'on-brand-primary': p.white,\n 'on-brand-secondary': p.white,\n\n // Status colors (status-*)\n 'status-success': ramp.green[300],\n 'status-success-light': ramp.green[200],\n 'status-success-dark': ramp.green[600],\n 'status-success-subtle': ramp.green[50],\n\n // Live-session accent — its OWN role, decoupled from success so the two can diverge\n 'status-live': ramp.green[300],\n 'status-live-muted': ramp.green[500],\n\n 'status-error': ramp.red[600],\n 'status-error-light': ramp.red[500],\n 'status-error-dark': ramp.red[700],\n 'status-error-subtle': ramp.red[50],\n\n 'status-error-vivid': p.redVivid[500], // vivid alert red\n 'status-error-vivid-light': p.redVivid[400],\n 'status-error-vivid-dark': p.redVivid[700],\n 'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',\n\n 'status-warning': ramp.amber[300],\n 'status-warning-light': ramp.amber[200],\n 'status-warning-dark': ramp.amber[500],\n 'status-warning-subtle': ramp.amber[50],\n\n 'status-info': ramp.blue[500],\n 'status-info-light': ramp.blue[300],\n 'status-info-dark': ramp.blue[600],\n 'status-info-subtle': ramp.blue[50],\n\n // Text on status backgrounds (on-status-*)\n 'on-status-success': p.white,\n 'on-status-error': p.white,\n 'on-status-warning': p.white,\n 'on-status-info': p.white,\n\n // Result/outcome indicators (result-*)\n 'result-improve': '#4caf50', // Green - positive outcome\n 'result-improve-light': 'rgba(76, 175, 80, 0.12)',\n 'result-improve-dark': '#248a24',\n 'result-degrade': '#ef5350', // Red - negative outcome\n 'result-degrade-light': 'rgba(239, 83, 80, 0.12)',\n 'result-degrade-dark': '#b30000',\n 'result-inconclusive': '#9E9A97', // Gray - no clear result\n 'result-inconclusive-light': 'rgba(158, 154, 151, 0.12)',\n 'result-neutral': p.neutral[500], // Neutral baseline\n\n // Text on result backgrounds (on-result-*)\n 'on-result-improve': p.white,\n 'on-result-degrade': p.white,\n 'on-result-inconclusive': p.white,\n\n // Data visualization colors (data-*)\n // First 10 colors from discrete rainbow optimized for charts\n 'data-1': discreteRainbow[9], // Blue\n 'data-2': discreteRainbow[14], // Green\n 'data-3': discreteRainbow[17], // Yellow\n 'data-4': discreteRainbow[25], // Red\n 'data-5': discreteRainbow[8], // Purple\n 'data-6': discreteRainbow[20], // Orange\n 'data-7': discreteRainbow[13], // Light Blue\n 'data-8': discreteRainbow[15], // Light Green\n 'data-9': discreteRainbow[3], // Lavender\n 'data-10': discreteRainbow[22], // Dark Orange\n\n // Text colors (text-*)\n 'text-primary': '#121828',\n 'text-secondary': '#65748B',\n 'text-tertiary': p.neutral[400],\n 'text-disabled': 'rgba(55, 65, 81, 0.48)',\n 'text-inverse': p.white,\n 'text-link': p.blue[600],\n 'text-link-hover': p.blue[700],\n\n // Surface colors (surface-*) - for elevated containers\n 'surface-base': p.white,\n 'surface-elevated': p.neutral[50], // slightly off-white for elevated cards\n 'surface-raised': p.neutral[100], // light gray for raised cards\n 'surface-overlay': p.white,\n 'surface-input': p.neutral[50], // Input field background (filled variant)\n\n // Background colors (background-*)\n 'background-base': '#EBEBEB',\n 'background-default': p.white,\n 'background-subtle': p.neutral[50],\n\n // Border colors (border-*)\n 'border-default': '#E8E9EB',\n 'border-subtle': p.neutral[100],\n 'border-strong': p.neutral[300],\n 'border-prominent': p.neutral[400], // high-visibility divider\n 'border-focus': p.blue[600],\n 'border-input': p.neutral[300], // Input field border\n 'border-input-hover': p.neutral[400], // Input field border on hover\n 'border-input-focus': p.blue[600], // Input field border on focus\n 'border-input-error': p.red[600], // Input field border on error\n\n // Interactive states (interactive-*)\n 'interactive-hover': 'rgba(55, 65, 81, 0.04)',\n 'interactive-focus': 'rgba(55, 65, 81, 0.12)',\n 'interactive-active': 'rgba(55, 65, 81, 0.16)',\n 'interactive-selected': 'rgba(55, 65, 81, 0.08)',\n 'interactive-disabled': 'rgba(55, 65, 81, 0.12)',\n 'interactive-disabled-text': 'rgba(55, 65, 81, 0.26)',\n\n // Divider\n 'divider': '#E8E9EB',\n\n // Avatar default\n 'avatar-background': p.neutral[500],\n 'avatar-text': p.white,\n} as const\n\n// Dark mode semantic colors\nexport const semanticColorsDark = {\n // Brand colors stay the same in dark mode\n 'brand-primary': ramp.orange[400],\n 'brand-primary-light': ramp.orange[300],\n 'brand-primary-dark': ramp.orange[500],\n 'brand-primary-subtle': 'rgba(255, 121, 0, 0.12)',\n 'brand-primary-hover': ramp.orange[300],\n 'brand-primary-active': ramp.orange[200],\n\n 'brand-secondary': ramp.cyan[600],\n 'brand-secondary-light': ramp.cyan[500],\n 'brand-secondary-dark': ramp.cyan[700],\n 'brand-secondary-subtle': 'rgba(48, 123, 155, 0.12)',\n 'brand-secondary-hover': ramp.cyan[500],\n 'brand-secondary-active': ramp.cyan[400],\n\n // Text on brand backgrounds\n 'on-brand-primary': p.white,\n 'on-brand-secondary': p.white,\n\n // Status colors\n 'status-success': ramp.green[300],\n 'status-success-light': ramp.green[200],\n 'status-success-dark': ramp.green[600],\n 'status-success-subtle': 'rgba(46, 213, 115, 0.12)',\n\n // Live-session accent — its OWN role, decoupled from success so the two can diverge\n 'status-live': ramp.green[300],\n 'status-live-muted': ramp.green[500],\n\n 'status-error': ramp.red[600],\n 'status-error-light': ramp.red[500],\n 'status-error-dark': ramp.red[700],\n 'status-error-subtle': 'rgba(209, 67, 67, 0.12)',\n\n 'status-error-vivid': p.redVivid[500],\n 'status-error-vivid-light': p.redVivid[400],\n 'status-error-vivid-dark': p.redVivid[700],\n 'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',\n\n 'status-warning': ramp.amber[300],\n 'status-warning-light': ramp.amber[200],\n 'status-warning-dark': ramp.amber[500],\n 'status-warning-subtle': 'rgba(249, 180, 21, 0.12)',\n\n 'status-info': ramp.blue[500],\n 'status-info-light': ramp.blue[300],\n 'status-info-dark': ramp.blue[600],\n 'status-info-subtle': 'rgba(33, 150, 243, 0.12)',\n\n // Text on status backgrounds\n 'on-status-success': p.white,\n 'on-status-error': p.white,\n 'on-status-warning': p.white,\n 'on-status-info': p.white,\n\n // Result/outcome indicators (result-*)\n 'result-improve': '#4caf50',\n 'result-improve-light': 'rgba(76, 175, 80, 0.16)',\n 'result-improve-dark': '#248a24',\n 'result-degrade': '#ef5350',\n 'result-degrade-light': 'rgba(239, 83, 80, 0.16)',\n 'result-degrade-dark': '#b30000',\n 'result-inconclusive': '#9E9A97',\n 'result-inconclusive-light': 'rgba(158, 154, 151, 0.16)',\n 'result-neutral': p.neutral[400],\n\n // Text on result backgrounds\n 'on-result-improve': p.white,\n 'on-result-degrade': p.white,\n 'on-result-inconclusive': p.white,\n\n // Data visualization colors (same in dark mode for consistency)\n 'data-1': discreteRainbow[9],\n 'data-2': discreteRainbow[14],\n 'data-3': discreteRainbow[17],\n 'data-4': discreteRainbow[25],\n 'data-5': discreteRainbow[8],\n 'data-6': discreteRainbow[20],\n 'data-7': discreteRainbow[13],\n 'data-8': discreteRainbow[15],\n 'data-9': discreteRainbow[3],\n 'data-10': discreteRainbow[22],\n\n // Text colors - inverted for dark mode\n 'text-primary': p.neutral[100],\n 'text-secondary': p.neutral[400],\n 'text-tertiary': p.neutral[500],\n 'text-disabled': 'rgba(255, 255, 255, 0.38)',\n 'text-inverse': p.neutral[900],\n 'text-link': '#828DF8',\n 'text-link-hover': p.blue[400],\n\n // Surface colors - dark backgrounds\n 'surface-base': p.charcoal[700], // main surface\n 'surface-elevated': p.charcoal[600], // elevated surface\n 'surface-raised': p.charcoal[500], // raised surface\n 'surface-overlay': p.charcoal[600], // overlay surface\n 'surface-input': p.charcoal[600], // input surface\n\n // Background colors\n 'background-base': p.charcoal[900], // darkest charcoal\n 'background-default': p.charcoal[700], // main background\n 'background-subtle': p.charcoal[500], // subtle background\n\n // Border colors\n 'border-default': p.charcoal[400], // default border\n 'border-subtle': p.charcoal[500], // subtle border\n 'border-strong': p.charcoal[300], // strong border\n 'border-prominent': p.charcoal[200], // high-visibility divider\n 'border-focus': '#828DF8',\n 'border-input': p.neutral[600],\n 'border-input-hover': p.neutral[500],\n 'border-input-focus': '#828DF8',\n 'border-input-error': p.red[500],\n\n // Interactive states\n 'interactive-hover': 'rgba(255, 255, 255, 0.04)',\n 'interactive-focus': 'rgba(255, 255, 255, 0.12)',\n 'interactive-active': 'rgba(255, 255, 255, 0.16)',\n 'interactive-selected': 'rgba(255, 255, 255, 0.08)',\n 'interactive-disabled': 'rgba(255, 255, 255, 0.12)',\n 'interactive-disabled-text': 'rgba(255, 255, 255, 0.26)',\n\n // Divider\n 'divider': p.charcoal[400], // divider color\n\n // Avatar default\n 'avatar-background': p.neutral[600],\n 'avatar-text': p.white,\n} as const\n\n// Typography tokens matching existing app\nexport const semanticTypography = {\n // Headings (Space Grotesk)\n h1: {\n fontFamily: 'heading',\n fontSize: '3.5rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h2: {\n fontFamily: 'heading',\n fontSize: '3rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h3: {\n fontFamily: 'heading',\n fontSize: '2.25rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h4: {\n fontFamily: 'heading',\n fontSize: '2rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h5: {\n fontFamily: 'heading',\n fontSize: '1.5rem',\n fontWeight: 600,\n lineHeight: 1.375,\n },\n h6: {\n fontFamily: 'heading',\n fontSize: '1.125rem',\n fontWeight: 600,\n lineHeight: 1.375,\n },\n\n // Body text (Nunito Sans)\n body1: {\n fontFamily: 'body',\n fontSize: '1rem',\n fontWeight: 400,\n lineHeight: 1.5,\n },\n body2: {\n fontFamily: 'body',\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: 1.57,\n },\n subtitle1: {\n fontFamily: 'body',\n fontSize: '1rem',\n fontWeight: 500,\n lineHeight: 1.75,\n },\n subtitle2: {\n fontFamily: 'body',\n fontSize: '0.875rem',\n fontWeight: 500,\n lineHeight: 1.57,\n },\n caption: {\n fontFamily: 'body',\n fontSize: '0.75rem',\n fontWeight: 400,\n lineHeight: 1.66,\n },\n overline: {\n fontFamily: 'body',\n fontSize: '0.75rem',\n fontWeight: 600,\n lineHeight: 2.5,\n letterSpacing: '0.5px',\n textTransform: 'uppercase' as const,\n },\n button: {\n fontFamily: 'sans',\n fontSize: '0.875rem',\n fontWeight: 600,\n lineHeight: 1.75,\n },\n} as const\n\n// Button size tokens\nexport const buttonSizes = {\n sm: {\n paddingX: '16px',\n paddingY: '6px',\n fontSize: '0.875rem',\n },\n md: {\n paddingX: '20px',\n paddingY: '8px',\n fontSize: '0.875rem',\n },\n lg: {\n paddingX: '24px',\n paddingY: '11px',\n fontSize: '1rem',\n },\n} as const\n\n// Export type for theme mode\nexport type ThemeMode = 'light' | 'dark'\n\n// Helper to get semantic colors based on mode\nexport function getSemanticColors(mode: ThemeMode) {\n return mode === 'dark' ? semanticColorsDark : semanticColorsLight\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Animated, Easing, type ViewProps } from 'react-native'\nimport { StarIcon } from './icons'\nimport { BaseBadge } from './BaseBadge'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport type PRType = 'e1rm' | 'weight' | 'reps' | 'volume' | 'velocity'\n\nexport interface PrBadgeProps extends ViewProps {\n /** PR type determines auto-generated label */\n type?: PRType\n /** Display label (e.g., \"PR e1RM\", \"PR 5RM\"). Auto-generated from type if omitted. */\n label?: string\n /** Show only the star icon, no text label */\n compact?: boolean\n /** Trigger pop animation on mount */\n animate?: boolean\n className?: string\n}\n\nconst typeLabels: Record<PRType, string> = {\n e1rm: 'PR e1RM',\n weight: 'PR Weight',\n reps: 'PR Reps',\n volume: 'PR Volume',\n velocity: 'PR Velocity',\n}\n\nexport function PrBadge({\n type = 'e1rm',\n label: labelProp,\n compact = false,\n animate = true,\n className,\n ...props\n}: PrBadgeProps) {\n const resolvedLabel = labelProp ?? typeLabels[type]\n const [scale] = useState(() => new Animated.Value(animate ? 0.8 : 1))\n const [opacity] = useState(() => new Animated.Value(animate ? 0 : 1))\n\n useEffect(() => {\n if (!animate) return\n\n // HTML demo uses a 3-keyframe sequence; bezier approximation is close enough for native\n Animated.parallel([\n Animated.timing(scale, {\n toValue: 1,\n duration: 400,\n easing: Easing.bezier(0.34, 1.56, 0.64, 1),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 400,\n easing: Easing.bezier(0.34, 1.56, 0.64, 1),\n useNativeDriver: true,\n }),\n ]).start()\n }, [animate, scale, opacity])\n\n const badge = compact ? (\n <View\n className={className}\n accessibilityRole=\"image\"\n accessibilityLabel={`Personal record: ${resolvedLabel}`}\n testID=\"pr-badge-star\"\n {...props}\n >\n <StarIcon size={14} color={BRAND_PRIMARY} fill={BRAND_PRIMARY} strokeWidth={2} />\n </View>\n ) : (\n <BaseBadge\n variant=\"pr\"\n className={className}\n accessibilityLabel={`Personal record: ${resolvedLabel}`}\n {...props}\n >\n <Text\n style={{\n fontSize: 12,\n color: BRAND_PRIMARY,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {'\\u2605'} {resolvedLabel}\n </Text>\n </BaseBadge>\n )\n\n if (animate) {\n return (\n <Animated.View\n style={{ transform: [{ scale }], opacity }}\n testID=\"pr-badge-animated\"\n >\n {badge}\n </Animated.View>\n )\n }\n\n return badge\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { type ReactNode } from 'react'\nimport { View, Text } from 'react-native'\nimport { VelocityStrip, type VelocityZoneBandProp } from './VelocityStrip'\nimport { roundWeight, roundRpe } from '../../../utils/workout-format'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nexport type SetRowUnit = 'lbs' | 'kg'\n\n/** A set's lifecycle: logged (`done`), being performed now (`live`), or planned (`todo`). */\nexport type SetRowState = 'done' | 'live' | 'todo'\n\ninterface SetRowBase {\n setNumber: number\n unit: SetRowUnit\n /** Optional set-type marker (e.g. \"DROP\", \"AMRAP\") shown in the SET cell. */\n setType?: string\n /** Optional velocity-zone bands (WA `VelocityZones.bands`); default scale when absent. */\n velocityZones?: readonly VelocityZoneBandProp[]\n}\n\n/**\n * One row of the unified expanded exercise table (SET · REPS · LBS · RPE + a\n * per-row velocity strip), as a lifecycle discriminated union:\n * - `done` — a logged set: recorded reps / weight / rpe, a flat `mini` strip.\n * - `live` — performed right now: shows its TARGET (never \"reps-done/target\"),\n * stands out by brightness, and a compact velocity-HEIGHT spotlight strip.\n * - `todo` — planned: shows its target, muted, a flat grey `mini` stub strip.\n *\n * `done` + `todo` share ONE muted treatment; only `live` is brightened. There is\n * no PREV column (dropped in the unified design).\n */\nexport type SetRowProps =\n | (SetRowBase & {\n state: 'done'\n reps: number\n weight: number\n rpe?: number | null\n /** Per-rep MEAN concentric velocities (m/s). */\n velocities: number[]\n })\n | (SetRowBase & {\n state: 'live'\n /** The prescribed target shown in the REPS / LBS cells (no live \"5/10\"). */\n target: { reps: number; weight: number }\n /** Reps / weight committed so far (available to hosts; the display shows `target`). */\n reps: number\n weight: number\n rpe?: number | null\n /** Per-rep MEAN concentric velocities logged so far this set. */\n velocities: number[]\n /** Newest rep index — reserved; the compact spotlight strip is static. */\n liveRepIndex?: number\n })\n | (SetRowBase & {\n state: 'todo'\n /** The prescribed target shown in the REPS / LBS cells. */\n target: { reps: number; weight: number }\n /** Planned rep count backing the grey stub strip. Default `target.reps`. */\n planned?: number\n })\n\nconst DARK = getSemanticColors('dark')\n/** Live set — brightest (neutral 100). Done + upcoming share the muted neutral 400. */\nconst TEXT_ACTIVE = DARK['text-primary']\nconst TEXT_MUTED = DARK['text-secondary']\n\n/** Column widths mirror SetTableHeader(showPrevious=false) so cells align under it. */\nconst COL = { set: 36, reps: 44, load: 56, rpe: 36 } as const\nconst cellText = { fontFamily: 'Inter, sans-serif', fontSize: 13, fontWeight: '600' as const }\nconst typeBadge = {\n fontSize: 10,\n fontWeight: '700' as const,\n fontFamily: 'Inter, sans-serif',\n color: WORKOUT_TOKENS.scale.orange,\n backgroundColor: 'rgba(255,165,2,0.12)',\n paddingVertical: 1,\n paddingHorizontal: 5,\n borderRadius: 3,\n overflow: 'hidden' as const,\n}\n\n/** Reps to show: recorded for a `done` set, else the prescribed target. */\nfunction displayReps(set: SetRowProps): number {\n return set.state === 'done' ? set.reps : set.target.reps\n}\n\nfunction displayWeight(set: SetRowProps): number {\n return set.state === 'done' ? set.weight : set.target.weight\n}\n\n/** Planned rep count backing the row's strip. */\nfunction plannedReps(set: SetRowProps): number {\n if (set.state === 'done') return set.velocities.length\n if (set.state === 'live') return set.target.reps\n return set.planned ?? set.target.reps\n}\n\nfunction accessibilityLabel(set: SetRowProps): string {\n const base = `Set ${set.setNumber}: ${displayReps(set)} reps at ${roundWeight(displayWeight(set))} ${set.unit}`\n if (set.state === 'live') return `${base}, in progress`\n if (set.state === 'todo') return `${base}, upcoming`\n return base\n}\n\nfunction Cell({\n width,\n children,\n testID,\n}: {\n width: number\n children: ReactNode\n testID?: string\n}) {\n return (\n <View style={{ width, alignItems: 'center', justifyContent: 'center' }} testID={testID}>\n {children}\n </View>\n )\n}\n\n/** The per-row velocity strip: compact spotlight for the live set, flat mini otherwise. */\nfunction RowStrip({ set }: { set: SetRowProps }) {\n const zones = set.velocityZones\n if (set.state === 'live') {\n // The active-set spotlight: the bare velocity-height `expanded` chart at 24px,\n // fixed scale, no labels / info (both chrome flags off → the bare strip).\n return (\n <VelocityStrip\n variant=\"expanded\"\n showNumbers={false}\n showInfo={false}\n height={24}\n scale=\"fixed\"\n set={{ type: 'straight', velocities: set.velocities, planned: set.target.reps }}\n zones={zones}\n />\n )\n }\n const velocities = set.state === 'done' ? set.velocities : []\n return (\n <VelocityStrip\n variant=\"mini\"\n set={{ type: 'straight', velocities, planned: plannedReps(set) }}\n zones={zones}\n />\n )\n}\n\n/**\n * ONE set row of the unified expanded exercise table. SET · REPS · LBS · RPE over\n * a per-row {@link VelocityStrip}; `live` stands out by brightness with a compact\n * velocity-height spotlight, `done`/`todo` are muted with a flat mini strip. Its\n * column widths mirror {@link SetTableHeader}(`showPrevious={false}`).\n */\nexport function SetRow(set: SetRowProps) {\n const live = set.state === 'live'\n const valueColor = live ? TEXT_ACTIVE : TEXT_MUTED\n const rpe = set.state === 'todo' ? null : set.rpe\n\n return (\n <View\n style={{ paddingVertical: 6, paddingHorizontal: 8 }}\n accessibilityLabel={accessibilityLabel(set)}\n testID=\"set-row\"\n >\n <View className=\"flex-row items-center\" style={{ justifyContent: 'space-between' }}>\n <Cell width={COL.set} testID=\"set-row-set-number\">\n {set.setType ? (\n <Text style={typeBadge} testID=\"set-row-type-badge\">\n {set.setType}\n </Text>\n ) : (\n <Text style={{ ...cellText, color: valueColor, fontWeight: live ? '700' : '600' }}>\n {set.setNumber}\n </Text>\n )}\n </Cell>\n <Cell width={COL.reps} testID=\"set-row-reps\">\n <Text style={{ ...cellText, color: valueColor }}>{displayReps(set)}</Text>\n </Cell>\n <Cell width={COL.load} testID=\"set-row-weight\">\n <Text style={{ ...cellText, color: valueColor }}>{roundWeight(displayWeight(set))}</Text>\n </Cell>\n <Cell width={COL.rpe} testID=\"set-row-rpe\">\n <Text style={{ ...cellText, color: TEXT_MUTED }}>\n {rpe != null ? roundRpe(rpe) : '—'}\n </Text>\n </Cell>\n </View>\n <View style={{ marginTop: live ? 6 : 4 }} testID=\"set-row-strip\">\n <RowStrip set={set} />\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text } from 'react-native'\n\n// One header column: its label and its fixed width (PREV is the lone flex column,\n// `undefined`). Order + widths mirror SetRow's cells so headers align over rows.\ntype Column = { label: string; width: number | undefined }\n\nexport interface SetTableHeaderProps {\n /** Weight-column label: LBS / KG. Default lbs. */\n unit?: 'lbs' | 'kg'\n /** Show the PREV (previous-best) column. Default true; false drops it for rail density. */\n showPrevious?: boolean\n /** Overridable so a host card can keep its own testID. Default \"table-header\". */\n testID?: string\n}\n\n// The previous-best column is the lone flex column (`undefined` width). When hidden\n// it is dropped entirely (not blanked to a spacer) and the four fixed columns\n// distribute across the full strip width via `justifyContent: space-between`.\nconst PREV_COLUMN: Column = { label: 'PREV', width: undefined }\n\n/** Columns in order, with the weight column reflecting `unit`; PREV dropped when hidden. */\nfunction buildColumns(unit: 'lbs' | 'kg', showPrevious: boolean): Column[] {\n return [\n { label: 'SET', width: 36 },\n ...(showPrevious ? [PREV_COLUMN] : []),\n { label: 'REPS', width: 44 },\n { label: unit.toUpperCase(), width: 56 },\n { label: 'RPE', width: 36 },\n ]\n}\n\n/**\n * The expanded-set-table column-header row: SET · PREV · REPS · LOAD · RPE, with\n * the weight column reflecting `unit`. `showPrevious={false}` drops PREV (rail\n * density). Its per-column widths mirror {@link SetRow} so headers align over the\n * rows. Extracted from {@link ExerciseCard}'s expanded state for reuse.\n */\nexport function SetTableHeader({\n unit = 'lbs',\n showPrevious = true,\n testID = 'table-header',\n}: SetTableHeaderProps) {\n const columns = buildColumns(unit, showPrevious)\n\n return (\n <View\n className=\"flex-row\"\n style={{\n paddingVertical: 8,\n paddingHorizontal: 8,\n paddingBottom: 4,\n ...(showPrevious ? {} : { justifyContent: 'space-between' }),\n }}\n testID={testID}\n >\n {columns.map(({ label, width }) => {\n const isFlex = width === undefined\n\n return (\n <View\n key={label}\n style={{\n ...(isFlex ? { minWidth: 44 } : { width, flexShrink: 1 }),\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n }}\n {...(isFlex ? { className: 'flex-1' } : {})}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontWeight: '600',\n fontFamily: 'Inter, sans-serif',\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n }}\n >\n {label}\n </Text>\n </View>\n )\n })}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport type { ReactNode } from 'react'\nimport { Text } from 'react-native'\n\n/**\n * Shared \"segmented metric\" typography primitive — the Inter · 600 · letter-spacing 1\n * value/separator cell used by both {@link TempoDisplay} (tempo digits + dashes) and\n * {@link SetsRepsLoad} (sets × reps @ load). Extracted so the two read as one visual\n * language instead of drifting copies.\n */\nexport const METRIC_FONT = 'Inter, sans-serif'\n\nexport interface MetricCellProps {\n children: ReactNode\n /** Cell text color — value cells take a primary color, separators a muted one. */\n color: string\n fontSize?: number\n}\n\nexport function MetricCell({ children, color, fontSize = 11 }: MetricCellProps) {\n return (\n <Text\n style={{\n fontFamily: METRIC_FONT,\n fontSize,\n color,\n fontWeight: '600',\n letterSpacing: 1,\n }}\n >\n {children}\n </Text>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { MetricCell } from './metricText'\n\nconst t = getSemanticColors('dark')\n\nconst TIMES = '×' // × multiplication sign, padded by muted separators\nconst AT = '@'\n\nexport interface SetsRepsLoadProps extends ViewProps {\n sets: number\n reps: number | string\n /** Load value; a string (e.g. \"—\") passes through verbatim for an unset/discovery load. */\n load: number | string\n /** Displayed load unit label (e.g. \"lb\", \"kg\"). */\n unit?: string\n /** Cell font size (px). Default 11 — the compact rail/card scale. Raise for a wall read-out. */\n fontSize?: number\n className?: string\n}\n\n/**\n * The `sets × reps @ load` prescription line, in the TempoDisplay visual language\n * (Inter · 600 · letter-spacing 1 · value cells with muted `×` / `@` separators).\n * Shares the {@link MetricCell} primitive with TempoDisplay so the two stay in step.\n */\nexport function SetsRepsLoad({\n sets,\n reps,\n load,\n unit = 'lb',\n fontSize,\n className,\n ...props\n}: SetsRepsLoadProps) {\n const value = t['text-primary']\n const sep = t['text-tertiary']\n\n return (\n <View\n className={className}\n style={{ flexDirection: 'row', alignItems: 'baseline' }}\n accessibilityLabel={`${sets} sets of ${reps} reps at ${load} ${unit}`}\n testID=\"sets-reps-load\"\n {...props}\n >\n <MetricCell color={value} fontSize={fontSize}>\n {sets}\n </MetricCell>\n <MetricCell color={sep} fontSize={fontSize}>{` ${TIMES} `}</MetricCell>\n <MetricCell color={value} fontSize={fontSize}>\n {reps}\n </MetricCell>\n <MetricCell color={sep} fontSize={fontSize}>{` ${AT} `}</MetricCell>\n <MetricCell color={value} fontSize={fontSize}>\n {load}\n </MetricCell>\n <MetricCell color={sep} fontSize={fontSize}>{` ${unit}`}</MetricCell>\n </View>\n )\n}\n","/**\n * Neumorphic Shadow Utilities\n * \n * Neumorphism creates soft, extruded UI using dual opposing shadows.\n * - Light source assumed from top-left\n * - Raised elements: dark shadow bottom-right, light highlight top-left\n * - Pressed elements: inverted with `inset` shadows\n */\n\nimport { Platform, type ViewStyle } from 'react-native'\n\n// ============================================================================\n// Color Math Utilities\n// ============================================================================\n\n/**\n * Parse a hex color to RGB values (0-255).\n * Supports both #RGB and #RRGGBB formats.\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const cleaned = hex.replace('#', '')\n \n let r: number, g: number, b: number\n \n if (cleaned.length === 3) {\n r = parseInt(cleaned[0] + cleaned[0], 16)\n g = parseInt(cleaned[1] + cleaned[1], 16)\n b = parseInt(cleaned[2] + cleaned[2], 16)\n } else if (cleaned.length === 6) {\n r = parseInt(cleaned.slice(0, 2), 16)\n g = parseInt(cleaned.slice(2, 4), 16)\n b = parseInt(cleaned.slice(4, 6), 16)\n } else {\n return null\n }\n \n return { r, g, b }\n}\n\n/**\n * Convert RGB (0-255) to HSV (h: 0-360, s: 0-1, v: 0-1).\n */\nexport function rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n const rNorm = r / 255\n const gNorm = g / 255\n const bNorm = b / 255\n \n const max = Math.max(rNorm, gNorm, bNorm)\n const min = Math.min(rNorm, gNorm, bNorm)\n const delta = max - min\n \n // Value\n const v = max\n \n // Saturation\n const s = max === 0 ? 0 : delta / max\n \n // Hue\n let h = 0\n if (delta !== 0) {\n if (max === rNorm) {\n h = 60 * (((gNorm - bNorm) / delta) % 6)\n } else if (max === gNorm) {\n h = 60 * ((bNorm - rNorm) / delta + 2)\n } else {\n h = 60 * ((rNorm - gNorm) / delta + 4)\n }\n }\n if (h < 0) h += 360\n \n return { h, s, v }\n}\n\n/**\n * Convert HSV (h: 0-360, s: 0-1, v: 0-1) to RGB (0-255).\n */\nexport function hsvToRgb(h: number, s: number, v: number): { r: number; g: number; b: number } {\n const c = v * s\n const x = c * (1 - Math.abs((h / 60) % 2 - 1))\n const m = v - c\n \n let rPrime: number, gPrime: number, bPrime: number\n\n if (h >= 0 && h < 60) {\n rPrime = c; gPrime = x; bPrime = 0\n } else if (h >= 60 && h < 120) {\n rPrime = x; gPrime = c; bPrime = 0\n } else if (h >= 120 && h < 180) {\n rPrime = 0; gPrime = c; bPrime = x\n } else if (h >= 180 && h < 240) {\n rPrime = 0; gPrime = x; bPrime = c\n } else if (h >= 240 && h < 300) {\n rPrime = x; gPrime = 0; bPrime = c\n } else {\n rPrime = c; gPrime = 0; bPrime = x\n }\n \n return {\n r: Math.round((rPrime + m) * 255),\n g: Math.round((gPrime + m) * 255),\n b: Math.round((bPrime + m) * 255),\n }\n}\n\n/**\n * Convert RGB values to hex string.\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const toHex = (n: number) => {\n const clamped = Math.max(0, Math.min(255, Math.round(n)))\n return clamped.toString(16).padStart(2, '0')\n }\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`\n}\n\n/**\n * Lighten a color by increasing its HSV Value component.\n * \n * @param hex - The hex color to lighten\n * @param amount - Amount to increase V by (0-1)\n */\nexport function lighten(hex: string, amount: number = 0.1): string {\n const rgb = hexToRgb(hex)\n if (!rgb) return hex\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const newV = Math.min(1, hsv.v + amount)\n \n const newRgb = hsvToRgb(hsv.h, hsv.s, newV)\n return rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n}\n\n/**\n * Darken a color by decreasing its HSV Value component.\n * \n * @param hex - The hex color to darken\n * @param amount - Amount to decrease V by (0-1)\n */\nexport function darken(hex: string, amount: number = 0.1): string {\n const rgb = hexToRgb(hex)\n if (!rgb) return hex\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const newV = Math.max(0, hsv.v - amount)\n \n const newRgb = hsvToRgb(hsv.h, hsv.s, newV)\n return rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n}\n\n/**\n * Get hover colors for a button based on its background color.\n * Automatically adapts intensity based on the color's luminance.\n * \n * @param bgColor - The button's background color (hex)\n * @param intensity - How strong the hover effect should be ('subtle' | 'medium' | 'strong')\n */\nexport function getHoverColors(\n bgColor: string, \n intensity: 'subtle' | 'medium' | 'strong' = 'medium'\n): { raised: string; pressed: string } {\n const amounts = {\n subtle: 0.01,\n medium: 0.02,\n strong: 0.03,\n }\n \n const amount = amounts[intensity]\n \n return {\n raised: lighten(bgColor, amount), // Raised hover: lighten (lifting up)\n pressed: darken(bgColor, amount), // Pressed hover: darken (pressing down)\n }\n}\n\n/**\n * Check if a color is considered \"dark\" (for choosing text color).\n * Uses HSV Value component for simplicity.\n */\nexport function isDark(hex: string): boolean {\n const rgb = hexToRgb(hex)\n if (!rgb) return true\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n return hsv.v < 0.6\n}\n\n/**\n * Shadow configuration for different surface colors.\n * Each surface needs calibrated light/dark shadow colors.\n * \n * - dark: soft shadow for depth (bottom-right)\n * - light: sharp rim highlight (top-left) - higher opacity for crisp edge\n * - darker: deeper shadow for pressed/inset states\n */\nexport const shadowColors = {\n // For charcoal surfaces (~#2C2C2C to #3C3C3C)\n charcoal: {\n dark: 'rgba(0, 0, 0, 0.5)',\n light: 'rgba(255, 255, 255, 0.12)', // brighter for crisp rim light\n darker: 'rgba(0, 0, 0, 0.6)',\n },\n // For neutral dark surfaces (~#1F2937)\n neutralDark: {\n dark: 'rgba(0, 0, 0, 0.4)',\n light: 'rgba(255, 255, 255, 0.08)',\n darker: 'rgba(0, 0, 0, 0.5)',\n },\n // For light surfaces (white/light gray backgrounds)\n neutralLight: {\n dark: 'rgba(0, 0, 0, 0.15)', // Visible dark shadow for depth on light backgrounds\n light: 'rgba(255, 255, 255, 1)', // Bright highlight for raised effect (visible on light gray)\n darker: 'rgba(0, 0, 0, 0.2)', // Deeper shadow for pressed states\n },\n}\n\nexport type ShadowIntensity = 'subtle' | 'medium' | 'strong'\nexport type ShadowSurface = keyof typeof shadowColors\n\ninterface ShadowConfig {\n offset: number\n blur: number\n}\n\nconst intensityConfig: Record<ShadowIntensity, ShadowConfig> = {\n subtle: { offset: 1, blur: 2 }, // very light, barely visible\n medium: { offset: 2, blur: 4 }, // noticeable but restrained\n strong: { offset: 2, blur: 5 }, // slightly deeper blur, same offset as medium\n}\n\n/**\n * Creates a raised (elevated) neumorphic shadow.\n * Element appears to float above the surface.\n * \n * Uses a soft dark shadow (bottom-right) and a sharp rim light (top-left).\n */\nexport function createRaisedShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Rim light is sharper: same offset as shadow, but minimal blur for crisp edge\n const rimBlur = 1 // Very tight blur for crisp rim\n \n return Platform.select({\n web: {\n boxShadow: `${offset}px ${offset}px ${blur}px ${colors.dark}, -${offset}px -${offset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n // React Native shadow approximation (limited compared to web)\n shadowColor: '#000',\n shadowOffset: { width: offset, height: offset },\n shadowOpacity: 0.3,\n shadowRadius: blur / 2,\n elevation: offset,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a pressed (inset) neumorphic shadow.\n * Element appears pushed into the surface.\n * \n * Uses a soft dark inset shadow (top-left) and a thin sharp rim light (bottom-right).\n */\nexport function createPressedShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Rim light is always thin and subtle for pressed states\n const rimOffset = 1 // Fixed thin rim\n const rimBlur = 1 // Very tight blur for crisp edge\n \n return Platform.select({\n web: {\n boxShadow: `inset ${offset}px ${offset}px ${blur}px ${colors.darker}, inset -${rimOffset}px -${rimOffset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n // React Native doesn't support inset shadows, approximate with darker bg\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a flat (no shadow) style for hover states.\n */\nexport function createFlatShadow(): ViewStyle {\n return Platform.select({\n web: {\n boxShadow: 'none',\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a hover shadow for raised elements.\n * Reduces shadow depth but keeps a subtle rim light to maintain visual boundary.\n */\nexport function createRaisedHoverShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Reduce shadow depth by half for hover, keep minimal rim light\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n const rimBlur = 1\n \n return Platform.select({\n web: {\n // Keep same offsets as normal state for rim to prevent \"shrinking\" effect\n boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${colors.dark}, -${offset}px -${offset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: hoverOffset, height: hoverOffset },\n shadowOpacity: 0.2,\n shadowRadius: hoverBlur / 2,\n elevation: hoverOffset,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a hover shadow for pressed elements.\n * Reduces shadow depth but keeps a subtle rim light to maintain visual boundary.\n */\nexport function createPressedHoverShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Reduce shadow depth by half for hover, keep minimal rim light\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n const rimBlur = 1\n \n return Platform.select({\n web: {\n // Keep rim offset at 1px (same as pressed normal) to prevent \"shrinking\" effect\n boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${colors.darker}, inset -1px -1px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Pre-built shadow presets for common use cases.\n */\nexport const neumorphicShadows = {\n // Charcoal surface shadows (for dark toolbars, cards)\n charcoal: {\n raised: {\n subtle: createRaisedShadow('charcoal', 'subtle'),\n medium: createRaisedShadow('charcoal', 'medium'),\n strong: createRaisedShadow('charcoal', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('charcoal', 'subtle'),\n medium: createRaisedHoverShadow('charcoal', 'medium'),\n strong: createRaisedHoverShadow('charcoal', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('charcoal', 'subtle'),\n medium: createPressedShadow('charcoal', 'medium'),\n strong: createPressedShadow('charcoal', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('charcoal', 'subtle'),\n medium: createPressedHoverShadow('charcoal', 'medium'),\n strong: createPressedHoverShadow('charcoal', 'strong'),\n },\n flat: createFlatShadow(),\n },\n // Neutral dark surface shadows\n neutralDark: {\n raised: {\n subtle: createRaisedShadow('neutralDark', 'subtle'),\n medium: createRaisedShadow('neutralDark', 'medium'),\n strong: createRaisedShadow('neutralDark', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('neutralDark', 'subtle'),\n medium: createRaisedHoverShadow('neutralDark', 'medium'),\n strong: createRaisedHoverShadow('neutralDark', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('neutralDark', 'subtle'),\n medium: createPressedShadow('neutralDark', 'medium'),\n strong: createPressedShadow('neutralDark', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('neutralDark', 'subtle'),\n medium: createPressedHoverShadow('neutralDark', 'medium'),\n strong: createPressedHoverShadow('neutralDark', 'strong'),\n },\n flat: createFlatShadow(),\n },\n // Neutral light surface shadows\n neutralLight: {\n raised: {\n subtle: createRaisedShadow('neutralLight', 'subtle'),\n medium: createRaisedShadow('neutralLight', 'medium'),\n strong: createRaisedShadow('neutralLight', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('neutralLight', 'subtle'),\n medium: createRaisedHoverShadow('neutralLight', 'medium'),\n strong: createRaisedHoverShadow('neutralLight', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('neutralLight', 'subtle'),\n medium: createPressedShadow('neutralLight', 'medium'),\n strong: createPressedShadow('neutralLight', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('neutralLight', 'subtle'),\n medium: createPressedHoverShadow('neutralLight', 'medium'),\n strong: createPressedHoverShadow('neutralLight', 'strong'),\n },\n flat: createFlatShadow(),\n },\n}\n","/**\n * Color utility functions for the design system\n *\n * lighten/darken are re-exported from shadows.ts which uses HSV-based\n * color math for more perceptually consistent results across hues.\n */\n\nexport { lighten, darken } from '../theme/shadows'\n\nexport type StatusType = 'success' | 'error' | 'warning' | 'info'\nexport type ResultType = 'improve' | 'degrade' | 'inconclusive' | 'neutral'\n\n/**\n * Get the semantic color token for a status type.\n *\n * @param status - The status type\n * @returns The CSS variable reference for the status color\n *\n * @example\n * const color = getStatusColor('success') // 'var(--color-status-success)'\n */\nexport function getStatusColor(status: StatusType): string {\n return `var(--color-status-${status})`\n}\n\n/**\n * Get the semantic color token for a result type.\n *\n * @param result - The result type\n * @returns The CSS variable reference for the result color\n *\n * @example\n * const color = getResultColor('improve') // 'var(--color-result-improve)'\n */\nexport function getResultColor(result: ResultType): string {\n return `var(--color-result-${result})`\n}\n\n/**\n * Apply alpha/opacity to a color.\n * Works with hex colors and rgb values.\n *\n * @param color - The color value (hex or rgb)\n * @param opacity - Opacity value between 0 and 1\n * @returns The color with alpha applied\n *\n * @example\n * alpha('#5048E5', 0.5) // 'rgba(80, 72, 229, 0.5)'\n * alpha('rgb(80, 72, 229)', 0.5) // 'rgba(80, 72, 229, 0.5)'\n */\nexport function alpha(color: string, opacity: number): string {\n // Clamp opacity between 0 and 1\n const clampedOpacity = Math.max(0, Math.min(1, opacity))\n\n // Handle hex colors\n if (color.startsWith('#')) {\n const hex = color.slice(1)\n let r: number, g: number, b: number\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16)\n g = parseInt(hex[1] + hex[1], 16)\n b = parseInt(hex[2] + hex[2], 16)\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16)\n g = parseInt(hex.slice(2, 4), 16)\n b = parseInt(hex.slice(4, 6), 16)\n } else {\n return color\n }\n\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n // Handle rgb colors\n const rgbMatch = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/)\n if (rgbMatch) {\n const [, r, g, b] = rgbMatch\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n // Handle rgba colors - replace the alpha value\n const rgbaMatch = color.match(/rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*[\\d.]+\\)/)\n if (rgbaMatch) {\n const [, r, g, b] = rgbaMatch\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n return color\n}\n\n/**\n * Determine if a color is light or dark.\n * Useful for determining text color contrast.\n *\n * @param color - Hex color value\n * @returns 'light' or 'dark'\n *\n * @example\n * getLuminance('#FFFFFF') // 'light'\n * getLuminance('#000000') // 'dark'\n */\nexport function getLuminance(color: string): 'light' | 'dark' {\n if (!color.startsWith('#')) return 'dark'\n\n const hex = color.slice(1)\n let r: number, g: number, b: number\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16)\n g = parseInt(hex[1] + hex[1], 16)\n b = parseInt(hex[2] + hex[2], 16)\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16)\n g = parseInt(hex.slice(2, 4), 16)\n b = parseInt(hex.slice(4, 6), 16)\n } else {\n return 'dark'\n }\n\n // Calculate relative luminance using sRGB\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n\n return luminance > 0.5 ? 'light' : 'dark'\n}\n\n/**\n * Get a contrasting text color for a given background.\n *\n * @param backgroundColor - The background color (hex)\n * @returns 'white' or 'black' for contrast\n *\n * @example\n * getContrastText('#5048E5') // 'white'\n * getContrastText('#FFFFFF') // 'black'\n */\nexport function getContrastText(backgroundColor: string): string {\n return getLuminance(backgroundColor) === 'light' ? '#000000' : '#FFFFFF'\n}\n\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState, useCallback } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { roundTempo } from '../../../utils/workout-format'\nimport { alpha } from '../../../utils/colors'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { primitiveRamps } from '../../../theme/tokens/primitives'\nimport { MetricCell } from './metricText'\n\nconst t = getSemanticColors('dark')\n\n/** The four tempo phases, in the order the display renders them. */\nexport type TempoLivePhase = 'eccentric' | 'pauseBottom' | 'concentric' | 'pauseTop'\n\n/**\n * Live rep state driving the phase-fill overlay. Controlled by the consumer\n * (matching titan's `elapsedMs`-in convention) so the same real timer feeds\n * both web dashboard and native app — TempoDisplay owns rendering only.\n */\nexport interface TempoLiveState {\n /** Phase currently in progress, or null when idle/at rest. */\n activePhase: TempoLivePhase | null\n /** Elapsed time (ms) within the active phase. */\n phaseElapsedMs: number\n /**\n * Actual completed durations (ms) for phases finished earlier THIS rep. A done cell\n * freezes at its final readout (not the target) until the next rep resets the row.\n * Omit a phase to fall back to its target (assume it completed on pace).\n */\n completed?: Partial<Record<TempoLivePhase, number>>\n}\n\nexport interface TempoDisplayProps extends ViewProps {\n /** Tempo values: [eccentric, pauseBottom, concentric, pauseTop] in seconds */\n tempo: [number, number, number, number]\n size?: 'sm' | 'md'\n /** Override the digit font size (px). Defaults from `size` (9 sm / 11 md); raise for a wall read-out. */\n fontSize?: number\n /** Show the \"TEMPO\" caption before the values. Default true. */\n showLabel?: boolean\n /** Show info tooltip on press */\n showInfo?: boolean\n /**\n * When set, renders a live phase-fill: the active phase digit fills against\n * its prescribed duration and inactive phases dim. Omit for the static\n * prescription string (default, backward compatible).\n */\n live?: TempoLiveState\n /** Active-phase readout when `live`: `countdown` remaining to 0.0 (default), or `countup` elapsed. */\n liveReadout?: TempoLiveReadout\n onPress?: () => void\n className?: string\n}\n\nconst INTER = 'Inter, sans-serif'\nconst TEXT_TERTIARY = '#6B7280'\nconst STATUS_ERROR = t['status-error'] // slow — over the target time\nconst STATUS_SUCCESS = t['status-success'] // on target (within the band of 0.0)\nconst STATUS_WARNING = t['status-warning'] // ahead — still time left to the target\n\n/** Live active-phase readout: `countdown` remaining to 0.0, or `countup` elapsed to target. */\nexport type TempoLiveReadout = 'countdown' | 'countup'\n\n/** ± this window (ms) around the target still counts as on target (0.0 ± 0.1s). */\nconst ON_TARGET_MS = 100\n\n/** Phase-progress fill percent (0–100): how far the active phase has run toward its target. */\nfunction getTempoFillPct(elapsedMs: number, targetMs: number | null): number {\n if (!targetMs) return 100\n return Math.min(100, (elapsedMs / targetMs) * 100)\n}\n\n/**\n * Semantic pacing tone for the active/completed phase's NUMBER (the fill bar carries phase\n * identity, so the number is free to carry pacing). Keyed on time remaining to target:\n * ahead of target (still counting) → warning; within ±0.1s of 0.0 → success; over → error.\n */\nfunction activeNumberTone(elapsedMs: number, targetMs: number | null): string {\n if (targetMs == null) return t['text-primary']\n const remainingMs = targetMs - elapsedMs\n if (remainingMs > ON_TARGET_MS) return STATUS_WARNING\n if (remainingMs >= -ON_TARGET_MS) return STATUS_SUCCESS\n return STATUS_ERROR\n}\n\n/** The active number: `countup` elapsed (→ target) or `countdown` remaining (→ 0.0, then −). */\nfunction liveReadoutText(\n elapsedMs: number,\n targetMs: number,\n readout: TempoLiveReadout,\n): string {\n const seconds = readout === 'countup' ? elapsedMs / 1000 : (targetMs - elapsedMs) / 1000\n return seconds.toFixed(1)\n}\n\n// Phase IDENTITY colours — deliberately NON-semantic (magenta ecc / cyan con) so the\n// phase hue never collides with the semantic pacing tones (success/error) the active\n// number carries. Pauses stay neutral grey. [eccentric, pauseBottom, concentric, pauseTop]\nconst phaseColors = {\n eccentric: primitiveRamps.magenta[400],\n pauseBottom: TEXT_TERTIARY,\n concentric: primitiveRamps.cyan[300],\n pauseTop: TEXT_TERTIARY,\n dash: TEXT_TERTIARY,\n}\n\nfunction TempoValue({\n value,\n color,\n fontSize,\n}: {\n value: number\n color: string\n fontSize: number\n}) {\n return (\n <MetricCell color={color} fontSize={fontSize}>\n {value}\n </MetricCell>\n )\n}\n\nfunction TempoSeparator({ color, fontSize }: { color: string; fontSize: number }) {\n return (\n <MetricCell color={color} fontSize={fontSize}>\n -\n </MetricCell>\n )\n}\n\n// Phase order + color matching the tempo tuple, for the live phase-fill row.\nconst LIVE_PHASES: { key: TempoLivePhase; color: string }[] = [\n { key: 'eccentric', color: phaseColors.eccentric },\n { key: 'pauseBottom', color: phaseColors.pauseBottom },\n { key: 'concentric', color: phaseColors.concentric },\n { key: 'pauseTop', color: phaseColors.pauseTop },\n]\n\n/** A phase's place in the current rep: already done (locked full), filling now, or still to come. */\ntype LiveCellStatus = 'done' | 'active' | 'upcoming'\n\n/** A bottom-anchored vertical fill behind the number (the phase-progress bar). */\nfunction CellFill({ color, pct }: { color: string; pct: number }) {\n return (\n <View\n style={{\n position: 'absolute',\n left: 2,\n right: 2,\n bottom: 0,\n height: `${pct}%`,\n backgroundColor: alpha(color, 0.28),\n borderRadius: 3,\n }}\n />\n )\n}\n\n/** Monospace stack for the live readout so digit widths never shift. */\nconst MONO = 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace'\n/** Widest readout the cell must hold: sign · two whole digits · point · tenths, e.g. \"-12.3\". */\nconst READOUT_MAX_CHARS = 5\n\nfunction LiveTempoCell({\n value,\n color,\n status,\n phaseElapsedMs,\n completedMs,\n fontSize,\n readout,\n}: {\n value: number\n color: string\n status: LiveCellStatus\n phaseElapsedMs: number\n completedMs: number | undefined\n fontSize: number\n readout: TempoLiveReadout\n}) {\n const targetMs = value > 0 ? value * 1000 : null\n // Fixed, monospace-width cell sized to the widest readout — a phase activating or its\n // number changing never shifts the layout (the fill bar stays put too).\n const cellW = Math.ceil(fontSize * 0.62 * READOUT_MAX_CHARS)\n const wrap = {\n position: 'relative' as const,\n width: cellW,\n minHeight: Math.round(fontSize * 1.25),\n alignItems: 'center' as const,\n justifyContent: 'center' as const,\n }\n const num = (c: string, text: string) => (\n <Text style={{ fontFamily: MONO, fontSize, color: c, fontWeight: '700' }}>{text}</Text>\n )\n\n // Upcoming / idle: the phase's prescribed time in the FULL phase colour, no fill — so a\n // not-yet-started (or fully idle) row just reads as the base tempo lockup, not a dim mode.\n if (status === 'upcoming') {\n const targetText = targetMs != null ? (targetMs / 1000).toFixed(1) : String(value)\n return <View style={wrap}>{num(color, targetText)}</View>\n }\n\n // Done: FROZEN at the phase's final readout (its actual completed time, not the target),\n // fill locked full in the phase colour. The number keeps its SEMANTIC pacing tone (it is\n // showing the final time, not the target) — banked progress until the next rep resets.\n if (status === 'done') {\n const finalMs = completedMs ?? targetMs ?? 0\n const finalText = targetMs != null ? liveReadoutText(finalMs, targetMs, readout) : String(value)\n const finalTone = targetMs != null ? activeNumberTone(finalMs, targetMs) : color\n return (\n <View style={wrap} testID=\"tempo-live-done\">\n <CellFill color={color} pct={100} />\n {num(finalTone, finalText)}\n </View>\n )\n }\n\n // Active: the phase-hued fill grows with the phase; the number reads the live time\n // (countdown/countup) to 0.1s, coloured SEMANTICALLY by pacing (neutral/on-target/behind).\n const numberTone = activeNumberTone(phaseElapsedMs, targetMs)\n const fillPct = getTempoFillPct(phaseElapsedMs, targetMs)\n const activeText =\n targetMs != null ? liveReadoutText(phaseElapsedMs, targetMs, readout) : String(value)\n return (\n <View style={wrap} testID=\"tempo-live-active\">\n <CellFill color={color} pct={fillPct} />\n {num(numberTone, activeText)}\n </View>\n )\n}\n\nfunction LiveTempoRow({\n values,\n live,\n fontSize,\n readout,\n}: {\n values: [number, number, number, number]\n live: TempoLiveState\n fontSize: number\n readout: TempoLiveReadout\n}) {\n // Phases run in a fixed order within a rep, so the active phase's position tells us which\n // phases are already done (locked). When it wraps back to the first phase, the row resets.\n const activeIndex = live.activePhase\n ? LIVE_PHASES.findIndex((p) => p.key === live.activePhase)\n : -1\n return (\n <>\n {LIVE_PHASES.map((phase, i) => {\n const status: LiveCellStatus =\n activeIndex < 0 || i > activeIndex ? 'upcoming' : i < activeIndex ? 'done' : 'active'\n return (\n <View key={phase.key} style={{ flexDirection: 'row', alignItems: 'center' }}>\n {i > 0 && <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />}\n <LiveTempoCell\n value={values[i]}\n color={phase.color}\n status={status}\n phaseElapsedMs={live.phaseElapsedMs}\n completedMs={live.completed?.[phase.key]}\n fontSize={fontSize}\n readout={readout}\n />\n </View>\n )\n })}\n </>\n )\n}\n\nexport function TempoDisplay({\n tempo,\n size = 'md',\n fontSize: fontSizeProp,\n showLabel = true,\n showInfo = true,\n live,\n liveReadout = 'countdown',\n onPress,\n className,\n ...props\n}: TempoDisplayProps) {\n const [showTooltip, setShowTooltip] = useState(false)\n // Round exact (unrounded) tempo seconds to the 1-dp display granularity.\n const [eccentric, pauseBottom, concentric, pauseTop] = roundTempo(tempo)\n const isSm = size === 'sm'\n const fontSize = fontSizeProp ?? (isSm ? 9 : 11)\n // The chrome (padding, radius, label) scales with the digit size so the whole view stays\n // proportional at any form factor — a compact rail chip up to a wall read-out.\n const chromePadX = Math.round(fontSize * 0.6)\n const chromePadY = Math.round(fontSize * 0.3)\n const chromeRadius = Math.round(fontSize * 0.4)\n const labelFont = Math.max(9, Math.round(fontSize * 0.5))\n\n const handlePress = useCallback(() => {\n if (onPress) {\n onPress()\n }\n if (showInfo) {\n setShowTooltip((prev) => !prev)\n }\n }, [onPress, showInfo])\n\n const content = (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#1C1C1C',\n paddingHorizontal: chromePadX,\n paddingVertical: chromePadY,\n borderRadius: chromeRadius,\n }}\n {...props}\n >\n {showLabel && (\n <Text\n style={{\n fontFamily: INTER,\n fontSize: labelFont,\n fontWeight: '500',\n // Live-muted green while a rep is running, tertiary at rest.\n color: live ? t['status-live-muted'] : TEXT_TERTIARY,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n marginRight: Math.round(fontSize * 0.5),\n }}\n >\n TEMPO\n </Text>\n )}\n <View style={{ flexDirection: 'row' }} testID=\"tempo-value\">\n {live ? (\n <LiveTempoRow\n values={[eccentric, pauseBottom, concentric, pauseTop]}\n live={live}\n fontSize={fontSize}\n readout={liveReadout}\n />\n ) : (\n // Static prescription: the phase-coloured lockup (the same colours the live row rests at).\n <>\n <TempoValue value={eccentric} color={phaseColors.eccentric} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={pauseBottom} color={phaseColors.pauseBottom} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={concentric} color={phaseColors.concentric} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={pauseTop} color={phaseColors.pauseTop} fontSize={fontSize} />\n </>\n )}\n </View>\n </View>\n )\n\n return (\n <Pressable\n accessibilityLabel={`Tempo: ${eccentric} second eccentric, ${pauseBottom} second pause, ${concentric} second concentric, ${pauseTop} second pause`}\n accessibilityRole=\"button\"\n onPress={handlePress}\n testID=\"tempo-display\"\n >\n {content}\n {showTooltip && (\n <View\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: [{ translateX: '-50%' as unknown as number }],\n marginBottom: 8,\n zIndex: 20,\n alignItems: 'center',\n }}\n testID=\"tempo-tooltip\"\n >\n <View\n style={{\n backgroundColor: '#191919',\n borderRadius: 6,\n paddingVertical: 8,\n paddingHorizontal: 12,\n borderWidth: 1,\n borderColor: '#2C2C2C',\n }}\n >\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Eccentric: {eccentric}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Pause (bottom): {pauseBottom}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Concentric: {concentric}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Pause (top): {pauseTop}s\n </Text>\n </View>\n <View\n style={{\n width: 0,\n height: 0,\n borderLeftWidth: 5,\n borderRightWidth: 5,\n borderTopWidth: 5,\n borderLeftColor: 'transparent',\n borderRightColor: 'transparent',\n borderTopColor: '#2C2C2C',\n }}\n />\n </View>\n )}\n </Pressable>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport type { ComponentType } from 'react'\nimport { View, Pressable, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n ScaleIcon,\n AlertTriangleIcon,\n TrendingDownIcon,\n CircleSlashIcon,\n AwardIcon,\n InfoIcon,\n type IconProps,\n} from '../../icons'\n\n// Literal-hex status pins (getSemanticColors, not resolveColor) — `resolveColor()` yields a\n// `var(...)` under the RNW vitest alias, which breaks `toHaveStyle` in tests.\nconst t = getSemanticColors('dark')\n\n/**\n * The LOCKED 6-kind indicator taxonomy (TD-03.51). One precedence-ranked slot is\n * ever shown per exercise, resolved by {@link resolveIndicator}. Glyph = the\n * specific signal; color = the severity tier (danger/warning/success/info, bound\n * to titan status tokens). Outlined (border + glyph, no fill) so a chip never\n * collides with the filled velocity strip beside it.\n */\nexport type ExerciseIndicatorKind =\n | 'imbalance'\n | 'overshoot'\n | 'velocity-loss'\n | 'missed-reps'\n | 'pr'\n | 'info'\n\ninterface IndicatorConfig {\n Icon: ComponentType<IconProps>\n /** Tier color — a titan status semantic token (literal hex on `t`). */\n color: string\n /** Accessible description (also the intended tooltip subject). */\n label: string\n}\n\nconst INDICATOR_CONFIG: Record<ExerciseIndicatorKind, IndicatorConfig> = {\n imbalance: { Icon: ScaleIcon, color: t['status-error'], label: 'Left/right imbalance' },\n overshoot: { Icon: AlertTriangleIcon, color: t['status-error'], label: 'Load overshoot' },\n 'velocity-loss': { Icon: TrendingDownIcon, color: t['status-warning'], label: 'Velocity loss' },\n 'missed-reps': { Icon: CircleSlashIcon, color: t['status-warning'], label: 'Missed reps' },\n pr: { Icon: AwardIcon, color: t['status-success'], label: 'Personal record' },\n info: { Icon: InfoIcon, color: t['status-info'], label: 'More info' },\n}\n\n/**\n * Precedence order (1=highest → last=lowest). A single chip is shown, so when\n * several signals are true the highest-ranked wins. Alerts outrank `pr`; `info`\n * is the floor. This ordering is LOCKED — do not reshuffle.\n */\nexport const INDICATOR_PRECEDENCE: readonly ExerciseIndicatorKind[] = [\n 'imbalance',\n 'overshoot',\n 'velocity-loss',\n 'missed-reps',\n 'pr',\n 'info',\n]\n\n/**\n * Given the signals currently true for an exercise, pick the single\n * highest-precedence kind to surface (or `undefined` when none apply). Order and\n * duplicates in `candidates` don't matter — {@link INDICATOR_PRECEDENCE} decides.\n */\nexport function resolveIndicator(\n candidates: ExerciseIndicatorKind[],\n): ExerciseIndicatorKind | undefined {\n return INDICATOR_PRECEDENCE.find((kind) => candidates.includes(kind))\n}\n\nexport interface ExerciseIndicatorProps extends Omit<ViewProps, 'children'> {\n kind: ExerciseIndicatorKind\n /** Optional tap handler (surfaces detail — PR history / alert / info). */\n onPress?: () => void\n className?: string\n}\n\n/**\n * A small circular outlined chip for an exercise heading. Presentational and\n * static (chips are chrome — no pulse); the tap detail (tooltip/sheet) is wired\n * by the consumer.\n */\nexport function ExerciseIndicator({ kind, onPress, className, ...props }: ExerciseIndicatorProps) {\n const { Icon, color, label } = INDICATOR_CONFIG[kind]\n\n const chip = (\n <View\n className={className}\n style={{\n width: 16,\n height: 16,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: color,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n accessibilityRole=\"image\"\n accessibilityLabel={label}\n testID=\"exercise-indicator\"\n {...props}\n >\n <Icon size={11} color={color} />\n </View>\n )\n\n if (onPress) {\n return (\n <Pressable onPress={onPress} accessibilityRole=\"button\" accessibilityLabel={label}>\n {chip}\n </Pressable>\n )\n }\n return chip\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, Pressable } from 'react-native'\nimport { roundWeight } from '../../../utils/workout-format'\nimport { SetsRepsLoad } from './SetsRepsLoad'\nimport { TempoDisplay } from './TempoDisplay'\nimport { ExerciseIndicator, type ExerciseIndicatorKind } from './ExerciseIndicator'\n\nexport interface ExerciseHeadingProps {\n name: string\n /** Prescription line values (sets × reps @ load). */\n sets: number\n reps: number | string\n /** Load value; a string (e.g. \"—\") passes through verbatim for an unset/discovery load. */\n load: number | string\n unit?: 'lbs' | 'kg'\n /** Tempo tuple [eccentric, pauseBottom, concentric, pauseTop]; hidden when absent. */\n tempo?: [number, number, number, number]\n /** Small PR / issue / info chip in the title row. */\n indicator?: ExerciseIndicatorKind\n /** Dim the block as a not-yet-reached exercise (standalone use). */\n dimmed?: boolean\n /** Press target for the name row (expand / select). */\n onPress?: () => void\n}\n\nfunction headingLabel(\n name: string,\n sets: number,\n reps: number | string,\n load: number | string,\n unit: string\n) {\n const loadLabel = typeof load === 'number' ? roundWeight(load) : load\n return `${name}, ${sets}×${reps} @ ${loadLabel} ${unit}`\n}\n\n/**\n * The exercise-heading info block (no strip): the name + {@link ExerciseIndicator}\n * title row over a tight {@link SetsRepsLoad} prescription line beside the real\n * {@link TempoDisplay} (`showLabel={false}`). The name row is the sole press\n * target — TempoDisplay is a sibling, never a descendant, since it is itself a\n * Pressable (nesting would be an a11y nested-interactive violation).\n */\nexport function ExerciseHeading({\n name,\n sets,\n reps,\n load,\n unit = 'lbs',\n tempo,\n indicator,\n dimmed,\n onPress,\n}: ExerciseHeadingProps) {\n return (\n <View style={{ opacity: dimmed ? 0.55 : 1 }} testID=\"exercise-heading\">\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={headingLabel(name, sets, reps, load, unit)}\n className=\"flex-row items-center\"\n style={{ gap: 8 }}\n testID=\"exercise-card-header\"\n >\n <Text\n className=\"text-text-primary\"\n style={{ fontSize: 14, fontFamily: '\"Space Grotesk\", sans-serif', fontWeight: '700' }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n {indicator && <ExerciseIndicator kind={indicator} />}\n </Pressable>\n\n <View\n className=\"flex-row items-center\"\n style={{ gap: 8, marginTop: 1 }}\n testID=\"exercise-card-summary\"\n >\n <SetsRepsLoad sets={sets} reps={reps} load={load} unit={unit} />\n <View className=\"flex-1\" />\n {tempo && <TempoDisplay tempo={tempo} size=\"sm\" showLabel={false} showInfo={false} />}\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View } from 'react-native'\nimport { ExerciseHeading, type ExerciseHeadingProps } from './ExerciseHeading'\nimport { SetStrip, type SetStripSet } from './SetStrip'\n\nexport interface ExerciseCardHeadingProps extends ExerciseHeadingProps {\n /** Per-set performance data driving the strip; an empty list renders no strip. */\n setStates: SetStripSet[]\n /** Strip height in px. Default 8. */\n stripHeight?: number\n /** Root testID. Default \"exercise-card\"; override when nested inside another card. */\n testID?: string\n}\n\n/**\n * The complete, standalone session-rail heading: an {@link ExerciseHeading} info\n * block over its per-set {@link SetStrip}. The unit the rail lists — self-contained\n * and independent of {@link ExerciseCard} (whose `rail` state delegates here).\n * e1RM is intentionally dropped (a planning / live-panel concern). Dimming lives on\n * the outer wrapper so the strip dims with the heading.\n */\nexport function ExerciseCardHeading({\n setStates,\n stripHeight = 8,\n dimmed,\n testID = 'exercise-card',\n ...heading\n}: ExerciseCardHeadingProps) {\n return (\n <View\n style={{ paddingVertical: 9, paddingHorizontal: 12, opacity: dimmed ? 0.55 : 1 }}\n testID={testID}\n >\n <ExerciseHeading {...heading} />\n\n {setStates.length > 0 && (\n <View style={{ marginTop: 7 }} testID=\"exercise-card-strip\">\n <SetStrip sets={setStates} height={stripHeight} />\n </View>\n )}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState } from 'react'\nimport { View, Text, Pressable } from 'react-native'\nimport { VelocityStrip, type VelocityZoneBandProp } from './VelocityStrip'\nimport { PlaceholderStrip } from './PlaceholderStrip'\nimport { PrBadge } from './PrBadge'\nimport { SetRow, type SetRowProps } from './SetRow'\nimport { type SetStripSet } from './SetStrip'\nimport { SetTableHeader } from './SetTableHeader'\nimport { ExerciseCardHeading } from './ExerciseCardHeading'\nimport { type ExerciseIndicatorKind } from './ExerciseIndicator'\nimport { roundWeight } from '../../../utils/workout-format'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport interface ExerciseCardProps {\n name: string\n /**\n * The dimmed, not-yet-reached representation (prescription + previous-best line).\n * Overrides the expand state — an upcoming card never expands.\n */\n upcoming?: boolean\n /** Controlled expand state. Omit to run uncontrolled (see {@link defaultExpanded}). */\n expanded?: boolean\n /** Uncontrolled initial expand state. Default false. Ignored when `expanded` is set. */\n defaultExpanded?: boolean\n /** Notified when the user toggles the card between collapsed and expanded. */\n onExpandedChange?: (expanded: boolean) => void\n onNavigateDetail?: () => void\n summary?: {\n sets: number\n reps: number | string\n weight: number\n unit: 'lbs' | 'kg'\n }\n isPR?: boolean\n /** Collapsed glance: per-set logged velocities (drives the mini strips). */\n setVelocities?: number[][]\n /** Optional velocity-zone bands shared across this exercise's sets (WA bands). */\n velocityZones?: readonly VelocityZoneBandProp[]\n /** Collapsed glance: total planned sets (placeholder strips fill the remainder). */\n totalPlannedSets?: number\n /** Expanded body: the per-set rows (done / live / todo). */\n sets?: SetRowProps[]\n tempo?: [number, number, number, number]\n prescription?: string\n previousBest?: string\n supersetPosition?: 'first' | 'last' | 'middle' | null\n supersetColor?: string\n /** Expanded header per-set strip override; derived from `sets` when omitted. */\n setStates?: SetStripSet[]\n /** A small PR / issue / info chip in the title line (expanded header). */\n indicator?: ExerciseIndicatorKind\n /** Expanded header strip height in px. Default 8. */\n stripHeight?: number\n}\n\n/** The sub-card render props: everything but the expand-control surface, plus a resolved toggle. */\ntype CardBodyProps = Omit<\n ExerciseCardProps,\n 'upcoming' | 'expanded' | 'defaultExpanded' | 'onExpandedChange'\n> & { onToggle: () => void }\n\nfunction getSupersetBorderRadius(\n position: ExerciseCardProps['supersetPosition']\n): Record<string, number> {\n switch (position) {\n case 'first':\n return {\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderBottomLeftRadius: 8,\n borderBottomRightRadius: 8,\n }\n case 'last':\n return {\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n borderBottomLeftRadius: 12,\n borderBottomRightRadius: 12,\n }\n case 'middle':\n return {\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n borderBottomLeftRadius: 8,\n borderBottomRightRadius: 8,\n }\n default:\n return {\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderBottomLeftRadius: 12,\n borderBottomRightRadius: 12,\n }\n }\n}\n\nfunction getSupersetMargin(\n position: ExerciseCardProps['supersetPosition']\n): Record<string, number> {\n if (position === 'first' || position === 'middle') {\n return { marginBottom: 2 }\n }\n return {}\n}\n\nfunction formatSummary(summary: ExerciseCardProps['summary']): string {\n if (!summary) return ''\n return `${summary.sets}×${summary.reps} @ ${roundWeight(summary.weight)} ${summary.unit}`\n}\n\nfunction formatAccessibilityLabel(\n name: string,\n summary: ExerciseCardProps['summary'],\n prescription: ExerciseCardProps['prescription']\n): string {\n if (summary) return `${name}, ${formatSummary(summary)}`\n if (prescription) return `${name}, ${prescription}`\n return name\n}\n\nfunction CollapsedCard({\n name,\n onToggle,\n summary,\n isPR,\n setVelocities,\n velocityZones,\n totalPlannedSets,\n supersetPosition,\n}: CardBodyProps) {\n const [pressed, setPressed] = useState(false)\n const completedSets = setVelocities?.length ?? 0\n const remaining = Math.max(0, (totalPlannedSets ?? 0) - completedSets)\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n\n return (\n <Pressable\n onPress={onToggle}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n accessibilityRole=\"button\"\n accessibilityLabel={formatAccessibilityLabel(name, summary, undefined)}\n testID=\"exercise-card\"\n >\n <View\n className={pressed ? 'bg-surface-raised' : undefined}\n style={{\n padding: 12,\n paddingHorizontal: 14,\n cursor: 'pointer',\n ...borderRadius,\n ...supersetMargin,\n }}\n >\n <View className=\"flex-row items-center\" testID=\"exercise-card-header\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 14,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n {summary && (\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n marginRight: 8,\n }}\n testID=\"exercise-card-summary\"\n >\n {formatSummary(summary)}\n </Text>\n )}\n {isPR && (\n <View style={{ marginLeft: 4 }}>\n <PrBadge type=\"e1rm\" compact animate={false} />\n </View>\n )}\n </View>\n\n {(completedSets > 0 || remaining > 0) && (\n <View className=\"flex-row\" style={{ marginTop: 6, gap: 4 }} testID=\"exercise-card-strips\">\n {setVelocities?.map((velocities, i) => (\n <VelocityStrip\n key={i}\n velocities={velocities}\n zones={velocityZones}\n variant=\"mini\"\n testID={`exercise-card-velocity-strip-${i}`}\n />\n ))}\n {Array.from({ length: remaining }, (_, i) => (\n <PlaceholderStrip\n key={`placeholder-${i}`}\n testID={`exercise-card-placeholder-${i}`}\n />\n ))}\n </View>\n )}\n </View>\n </Pressable>\n )\n}\n\n// --- Unified expanded card ---------------------------------------------------\n// The expanded card is \"one object\" with its rail heading: the persistent header\n// is the real ExerciseCardHeading, and the revealed body drops PREV and renders\n// one real SetRow per set (muted done/todo, brightened live spotlight).\n\nconst DARK = getSemanticColors('dark')\n/** The header↔body seam. */\nconst BODY_DIVIDER = DARK['border-subtle']\n\n/** Project the set rows onto the heading strip's per-set state (done / active / todo). */\nfunction deriveHeaderSetStates(sets: SetRowProps[]): SetStripSet[] {\n return sets.map((set): SetStripSet => {\n switch (set.state) {\n case 'live':\n return { status: 'active', velocities: set.velocities, planned: set.target.reps }\n case 'done':\n return { status: 'done', velocities: set.velocities }\n case 'todo':\n return { status: 'todo', planned: set.planned ?? set.target.reps }\n }\n })\n}\n\nfunction ExpandedCard({\n name,\n onToggle,\n summary,\n isPR,\n sets,\n tempo,\n indicator,\n setStates,\n stripHeight = 8,\n velocityZones,\n supersetPosition,\n}: CardBodyProps) {\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n // Summary is the card-level authority for the weight column; fall back to the\n // first set's unit, then lbs. (Mixed per-set units keep the card-level label.)\n const unit = summary?.unit ?? sets?.[0]?.unit ?? 'lbs'\n // The rail heading IS the header: its per-set strip comes from an explicit\n // `setStates` when supplied, else it's derived from the set rows. e1RM is dropped\n // entirely; a PR surfaces via the chip.\n const headerStates = setStates ?? (sets ? deriveHeaderSetStates(sets) : [])\n const headerIndicator = indicator ?? (isPR ? 'pr' : undefined)\n\n return (\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n ...borderRadius,\n ...supersetMargin,\n }}\n testID=\"exercise-card\"\n >\n <ExerciseCardHeading\n name={name}\n sets={summary?.sets ?? sets?.length ?? 0}\n reps={summary?.reps ?? 0}\n load={summary?.weight ?? 0}\n unit={unit}\n tempo={tempo}\n indicator={headerIndicator}\n setStates={headerStates}\n stripHeight={stripHeight}\n onPress={onToggle}\n testID=\"exercise-card-heading\"\n />\n\n <View\n style={{ borderTopWidth: 1, borderTopColor: BODY_DIVIDER, paddingBottom: 6 }}\n testID=\"exercise-card-body\"\n >\n <SetTableHeader unit={unit} showPrevious={false} testID=\"exercise-card-column-headers\" />\n\n {sets && (\n <View testID=\"exercise-card-sets\">\n {sets.map((set, i) => (\n <SetRow key={i} {...set} velocityZones={set.velocityZones ?? velocityZones} />\n ))}\n </View>\n )}\n </View>\n </View>\n )\n}\n\nfunction UpcomingCard({\n name,\n prescription,\n previousBest,\n supersetPosition,\n onToggle,\n}: CardBodyProps) {\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n\n return (\n <Pressable onPress={onToggle} accessibilityRole=\"button\">\n <View\n style={{\n opacity: 0.6,\n padding: 12,\n paddingHorizontal: 14,\n ...borderRadius,\n ...supersetMargin,\n }}\n accessibilityLabel={formatAccessibilityLabel(name, undefined, prescription)}\n testID=\"exercise-card\"\n >\n <View className=\"flex-row items-center\">\n {/* Name never truncates (no numberOfLines); prescription + previousBest ellipsize first. */}\n <Text\n className=\"text-text-primary\"\n style={{\n flexShrink: 0,\n fontSize: 14,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n {prescription && (\n <Text\n className=\"text-text-secondary\"\n numberOfLines={1}\n style={{\n flexShrink: 1,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n marginLeft: 8,\n }}\n testID=\"exercise-card-prescription\"\n >\n {prescription}\n </Text>\n )}\n <View className=\"flex-1\" style={{ minWidth: 8 }} />\n {previousBest && (\n <Text\n className=\"text-text-tertiary\"\n numberOfLines={1}\n style={{\n flexShrink: 1,\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"exercise-card-previous-best\"\n >\n {previousBest}\n </Text>\n )}\n </View>\n </View>\n </Pressable>\n )\n}\n\n/**\n * The data-contract exercise card, in three representations:\n * - `upcoming` — a dimmed, not-yet-reached row (prescription + previous best).\n * - collapsed — a glance: name + summary + per-set velocity strips.\n * - expanded — the unified card: the real {@link ExerciseCardHeading} header over\n * the SET · REPS · LBS · RPE body (one {@link SetRow} per set).\n *\n * Expand is controlled (`expanded` + `onExpandedChange`) or uncontrolled\n * (`defaultExpanded`, internal state). `upcoming` overrides expand.\n */\nexport function ExerciseCard({\n upcoming,\n expanded,\n defaultExpanded,\n onExpandedChange,\n ...rest\n}: ExerciseCardProps) {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded ?? false)\n const isControlled = expanded !== undefined\n const isExpanded = isControlled ? expanded : internalExpanded\n\n const onToggle = () => {\n const next = !isExpanded\n onExpandedChange?.(next)\n if (!isControlled) setInternalExpanded(next)\n }\n\n if (upcoming) return <UpcomingCard {...rest} onToggle={onToggle} />\n return isExpanded ? (\n <ExpandedCard {...rest} onToggle={onToggle} />\n ) : (\n <CollapsedCard {...rest} onToggle={onToggle} />\n )\n}\n","import { Platform } from 'react-native'\nimport { getSemanticColors, type ThemeMode } from './tokens/semantic'\n\ntype ColorToken = keyof ReturnType<typeof getSemanticColors>\n\n/**\n * Resolve a semantic color token for an inline style where a nativewind\n * className can't apply — gradients (`backgroundImage`), per-edge borders\n * (`borderTopColor`, …), SVG attributes, and conditional hex/token mixes.\n *\n * The companion to className color tokens: on **web** it returns the CSS\n * variable (`var(--color-…)`), so the dashboard's light/dark switching keeps\n * working exactly as `global.css` intends; on **native** it returns the\n * resolved hex from `getSemanticColors` (mobile is dark-only). This is why\n * these spots stay theme-correct on web while also rendering on-device.\n */\nexport function resolveColor(token: ColorToken, mode: ThemeMode = 'dark'): string {\n return Platform.OS === 'web' ? `var(--color-${token})` : getSemanticColors(mode)[token]\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport React from 'react'\nimport { View, Text, Pressable, TextInput } from 'react-native'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport interface InputBarProps {\n exerciseName: string\n setNumber: number\n totalSets: number | null\n reps: string\n weight: string\n unit: 'lbs' | 'kg'\n onRepsChange: (value: string) => void\n onWeightChange: (value: string) => void\n onRecord: () => void\n canRecord: boolean\n visible: boolean\n}\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\nconst INPUT_CLASSNAME = 'bg-surface-raised border-border-strong text-text-primary'\n\nconst inputStyle = {\n fontSize: 14,\n fontWeight: '600' as const,\n fontFamily: 'Inter, sans-serif',\n borderWidth: 1,\n borderRadius: 6,\n textAlign: 'center' as const,\n paddingVertical: 5,\n paddingHorizontal: 2,\n}\n\nexport function InputBar({\n exerciseName,\n setNumber,\n totalSets,\n reps,\n weight,\n unit,\n onRepsChange,\n onWeightChange,\n onRecord,\n canRecord,\n visible,\n}: InputBarProps) {\n if (!visible) return null\n\n const setLabel = totalSets != null ? `Set ${setNumber}/${totalSets}` : `Set ${setNumber}`\n\n return (\n <View\n className=\"bg-surface-elevated\"\n style={{\n width: '100%',\n borderTopWidth: 1,\n borderTopColor: resolveColor('border-default'),\n paddingTop: 10,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n }}\n accessibilityRole=\"toolbar\"\n testID=\"input-bar\"\n >\n <View style={{ minWidth: 80, flexDirection: 'column' }}>\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 12,\n fontWeight: '700',\n fontFamily: '\"Space Grotesk\", sans-serif',\n }}\n testID=\"input-bar-exercise-name\"\n numberOfLines={1}\n >\n {exerciseName}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"input-bar-set-info\"\n >\n {setLabel}\n </Text>\n </View>\n\n <View className=\"flex-1 flex-row items-center\" style={{ gap: 4 }}>\n <TextInput\n value={reps}\n onChangeText={onRepsChange}\n className={INPUT_CLASSNAME}\n style={{ ...inputStyle, width: 36 }}\n accessibilityLabel=\"Reps\"\n testID=\"input-bar-reps\"\n keyboardType=\"numeric\"\n />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {'\\u00D7'}\n </Text>\n <TextInput\n value={weight}\n onChangeText={onWeightChange}\n className={INPUT_CLASSNAME}\n style={{ ...inputStyle, width: 52 }}\n accessibilityLabel={`Weight in ${unit}`}\n testID=\"input-bar-weight\"\n keyboardType=\"numeric\"\n />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 12,\n fontWeight: '500',\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"input-bar-unit\"\n >\n {unit}\n </Text>\n </View>\n\n <Pressable\n onPress={onRecord}\n disabled={!canRecord}\n style={({ pressed }) => ({\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 16,\n opacity: !canRecord ? 0.4 : pressed ? 0.8 : 1,\n })}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Record set\"\n testID=\"input-bar-record\"\n >\n <Text\n style={{\n fontSize: 13,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n color: '#FFFFFF',\n }}\n >\n Record\n </Text>\n </Pressable>\n </View>\n )\n}\n","import { useEffect, useState } from 'react'\n\nexport type TimerMode = 'up' | 'down'\n\nexport interface UseTimerOptions {\n /** 'up' counts elapsed upward; 'down' counts remaining toward 0. Default 'up'. */\n mode?: TimerMode\n /** Total duration in ms. Required for 'down' mode and for progress in 'up' mode. */\n durationMs?: number\n /** Controlled elapsed time in ms. When provided, the hook derives everything from it and never ticks. */\n elapsedMs?: number\n /** Self-tick only advances while running. */\n running?: boolean\n /** Enable the internal interval. Ignored when `elapsedMs` is controlled. */\n autoTick?: boolean\n /** Interval step in ms. Default 1000. */\n tickMs?: number\n}\n\nexport interface TimerState {\n elapsedMs: number\n remainingMs: number\n /** 0..1, clamped. */\n progress: number\n /** mm:ss for the active direction (remaining when 'down', elapsed when 'up'). */\n label: string\n /** True once a down-timer reaches 0 (or an up-timer passes its duration). */\n done: boolean\n}\n\n/** Format a millisecond duration as mm:ss, rounding partial seconds up. */\nexport function formatDuration(ms: number): string {\n const totalSeconds = Math.max(0, Math.ceil(ms / 1000))\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n return `${minutes}:${String(seconds).padStart(2, '0')}`\n}\n\nexport function useTimer(options: UseTimerOptions = {}): TimerState {\n const {\n mode = 'up',\n durationMs,\n elapsedMs: controlledElapsedMs,\n running = false,\n autoTick = false,\n tickMs = 1000,\n } = options\n\n const isControlled = controlledElapsedMs != null\n const [internalElapsedMs, setInternalElapsedMs] = useState(0)\n\n useEffect(() => {\n if (isControlled || !autoTick || !running) return\n const id = setInterval(() => {\n setInternalElapsedMs((prev) => prev + tickMs)\n }, tickMs)\n return () => clearInterval(id)\n }, [isControlled, autoTick, running, tickMs])\n\n const elapsedMs = isControlled ? controlledElapsedMs : internalElapsedMs\n\n const hasDuration = durationMs != null && durationMs > 0\n const remainingMs = durationMs != null ? Math.max(0, durationMs - elapsedMs) : 0\n\n let progress: number\n if (hasDuration) {\n progress = Math.min(1, Math.max(0, elapsedMs / durationMs))\n } else {\n // A zero/undefined duration is trivially complete for a countdown, empty for a stopwatch.\n progress = mode === 'down' ? 1 : 0\n }\n\n const label = formatDuration(mode === 'down' ? remainingMs : elapsedMs)\n const done = durationMs != null && elapsedMs >= durationMs\n\n return { elapsedMs, remainingMs, progress, label, done }\n}\n","import React from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\n\nexport type ProgressSize = 'sm' | 'md' | 'lg'\nexport type ProgressColor = 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'\nexport type ProgressVariant = 'linear' | 'circular'\n\n/** Maps the color prop to a CSS variable reference for inline styles */\nexport const colorVarMap: Record<ProgressColor, string> = {\n primary: 'var(--color-brand-primary)',\n secondary: 'var(--color-brand-secondary)',\n success: 'var(--color-status-success)',\n error: 'var(--color-status-error)',\n warning: 'var(--color-status-warning)',\n info: 'var(--color-status-info)',\n}\n\nexport interface ProgressProps extends ViewProps {\n /** Current value (0-100) */\n value?: number\n /** Maximum value */\n max?: number\n /** Whether the progress is indeterminate */\n isIndeterminate?: boolean\n /** Size of the progress bar */\n size?: ProgressSize\n /** Color of the progress */\n color?: ProgressColor\n /** Whether to show the value label */\n showValue?: boolean\n /** Custom value format function */\n formatValue?: (value: number, max: number) => string\n /** Label text */\n label?: string\n /** Fixed track width in pixels (default: full width) */\n trackWidth?: number\n /** Custom hex color override for the fill bar */\n customColor?: string\n /** Additional className */\n className?: string\n}\n\nconst sizeStyles: Record<ProgressSize, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n}\n\nconst colorStyles: Record<ProgressColor, string> = {\n primary: 'bg-brand-primary',\n secondary: 'bg-brand-secondary',\n success: 'bg-status-success',\n error: 'bg-status-error',\n warning: 'bg-status-warning',\n info: 'bg-status-info',\n}\n\nconst trackColorStyles: Record<ProgressColor, string> = {\n primary: 'bg-brand-primary/20',\n secondary: 'bg-brand-secondary/20',\n success: 'bg-status-success/20',\n error: 'bg-status-error/20',\n warning: 'bg-status-warning/20',\n info: 'bg-status-info/20',\n}\n\n/**\n * Linear progress bar component.\n *\n * @example\n * // Determinate progress\n * <Progress value={75} />\n *\n * @example\n * // With label and value\n * <Progress value={45} label=\"Uploading...\" showValue />\n *\n * @example\n * // Indeterminate progress\n * <Progress isIndeterminate />\n */\nexport function Progress({\n value = 0,\n max = 100,\n isIndeterminate = false,\n size = 'md',\n color = 'primary',\n showValue = false,\n formatValue = (v, m) => `${Math.round((v / m) * 100)}%`,\n label,\n trackWidth,\n customColor,\n className,\n ...props\n}: ProgressProps) {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <View className={cn('w-full', className)} {...props}>\n {/* Label and Value Row */}\n {(label || showValue) && (\n <View className=\"flex-row justify-between items-center mb-1\">\n {label && <Text className=\"text-sm text-text-secondary\">{label}</Text>}\n {showValue && !isIndeterminate && (\n <Text className=\"text-sm font-medium text-text-primary\">{formatValue(value, max)}</Text>\n )}\n </View>\n )}\n\n {/* Progress Track */}\n <View\n className={cn(\n 'rounded-full overflow-hidden',\n trackWidth ? undefined : 'w-full',\n trackColorStyles[color],\n sizeStyles[size]\n )}\n style={trackWidth ? { width: trackWidth } : undefined}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{\n min: 0,\n max: max,\n now: isIndeterminate ? undefined : value,\n }}\n >\n {/* Progress Fill */}\n <View\n className={cn(\n 'h-full rounded-full',\n !customColor && colorStyles[color],\n isIndeterminate && 'animate-pulse w-1/3'\n )}\n style={{\n ...(isIndeterminate ? {} : { width: `${percentage}%` }),\n ...(customColor ? { backgroundColor: customColor } : {}),\n }}\n />\n </View>\n </View>\n )\n}\n\nexport interface CircularProgressProps extends ViewProps {\n /** Current value (0-100) */\n value?: number\n /** Maximum value */\n max?: number\n /** Whether the progress is indeterminate */\n isIndeterminate?: boolean\n /** Size of the progress circle (diameter) */\n size?: number\n /** Stroke width */\n strokeWidth?: number\n /** Color of the progress */\n color?: ProgressColor\n /** Whether to show the value in center */\n showValue?: boolean\n /** Custom value format function */\n formatValue?: (value: number, max: number) => string\n /**\n * Custom center content (a numeral, a timer readout, an icon). When provided it\n * replaces the {@link showValue} text — the ring becomes a generic container for\n * any centered element. See {@link CircularTimer} for the batteries-included timer.\n */\n children?: React.ReactNode\n /**\n * Fill the parent container (responsive) instead of drawing a fixed `size` box.\n * The SVG uses a `0 0 size size` viewBox scaled to the container, so `size` still\n * sets the geometry proportions (radius, stroke) while the ring grows/shrinks with\n * its parent — e.g. a wall column. Default false (fixed `size` px).\n */\n fill?: boolean\n /** Additional className */\n className?: string\n}\n\n/**\n * Circular progress indicator component.\n *\n * @example\n * <CircularProgress value={75} showValue />\n */\nexport function CircularProgress({\n value = 0,\n max = 100,\n isIndeterminate = false,\n size = 48,\n strokeWidth = 4,\n color = 'primary',\n showValue = false,\n formatValue = (v, m) => `${Math.round((v / m) * 100)}%`,\n children,\n fill = false,\n className,\n ...props\n}: CircularProgressProps) {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n const radius = (size - strokeWidth) / 2\n const circumference = 2 * Math.PI * radius\n const strokeDashoffset = circumference - (percentage / 100) * circumference\n const center = size / 2\n // Fixed: a `size × size` px box. Fill: fill the parent, staying square, and let\n // the `0 0 size size` viewBox scale the geometry to fit (a responsive ring).\n const boxStyle = fill ? { width: '100%' as const, aspectRatio: 1 } : { width: size, height: size }\n\n return (\n <View\n className={cn('items-center justify-center', className)}\n style={boxStyle}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{\n min: 0,\n max: max,\n now: isIndeterminate ? undefined : value,\n }}\n {...props}\n >\n {/* SVG implementation for web — width/height 100% so it scales with `boxStyle`. */}\n <View className={cn(isIndeterminate && 'animate-spin')} style={boxStyle}>\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${size} ${size}`}\n style={{ position: 'absolute' }}\n >\n {/* Background track */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke=\"var(--color-border-default)\"\n strokeWidth={strokeWidth}\n />\n {/* Progress arc */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke={colorVarMap[color]}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={isIndeterminate ? circumference * 0.75 : strokeDashoffset}\n transform={`rotate(-90 ${center} ${center})`}\n style={{ transition: 'stroke-dashoffset 300ms cubic-bezier(0.22, 1, 0.36, 1)' }}\n />\n </svg>\n </View>\n\n {/* Center: custom children take precedence over the showValue readout. */}\n {children != null ? (\n <View\n style={{\n position: 'absolute',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n }}\n >\n {children}\n </View>\n ) : (\n showValue &&\n !isIndeterminate && (\n <Text\n className=\"text-xs font-semibold text-text-primary absolute\"\n style={{ fontSize: Math.max(size * 0.22, 10) }}\n >\n {formatValue(value, max)}\n </Text>\n )\n )}\n </View>\n )\n}\n\nexport interface ProgressStepsProps extends ViewProps {\n /** Current step (0-indexed) */\n currentStep: number\n /** Total number of steps */\n totalSteps: number\n /** Color of completed steps */\n color?: ProgressColor\n /** Size of step indicators */\n size?: ProgressSize\n /** Labels for each step */\n labels?: string[]\n /** Additional className */\n className?: string\n}\n\nconst stepSizeStyles: Record<ProgressSize, { dot: string; connector: string }> = {\n sm: { dot: 'w-2 h-2', connector: 'h-0.5' },\n md: { dot: 'w-3 h-3', connector: 'h-1' },\n lg: { dot: 'w-4 h-4', connector: 'h-1.5' },\n}\n\n/**\n * Step-based progress indicator.\n *\n * @example\n * <ProgressSteps currentStep={2} totalSteps={4} labels={['Cart', 'Shipping', 'Payment', 'Done']} />\n */\nexport function ProgressSteps({\n currentStep,\n totalSteps,\n color = 'primary',\n size = 'md',\n labels,\n className,\n ...props\n}: ProgressStepsProps) {\n const { dot, connector } = stepSizeStyles[size]\n\n return (\n <View className={cn('w-full', className)} {...props}>\n <View className=\"flex-row items-center\">\n {Array.from({ length: totalSteps }).map((_, index) => (\n <React.Fragment key={index}>\n {/* Step dot */}\n <View\n className={cn(\n 'rounded-full',\n dot,\n index <= currentStep ? colorStyles[color] : 'bg-border-strong'\n )}\n />\n\n {/* Connector line */}\n {index < totalSteps - 1 && (\n <View\n className={cn(\n 'flex-1 mx-1',\n connector,\n index < currentStep ? colorStyles[color] : 'bg-border-strong'\n )}\n />\n )}\n </React.Fragment>\n ))}\n </View>\n\n {/* Labels */}\n {labels && labels.length > 0 && (\n <View className=\"flex-row mt-2\">\n {labels.map((label, index) => (\n <Text\n key={index}\n className={cn(\n 'flex-1 text-xs text-center',\n index <= currentStep ? 'text-text-primary font-medium' : 'text-text-tertiary'\n )}\n >\n {label}\n </Text>\n ))}\n </View>\n )}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport type { ReactNode } from 'react'\nimport { View, Text } from 'react-native'\nimport { CircularProgress, colorVarMap, type ProgressColor } from '../../ui/progress/Progress'\nimport { useTimer, type TimerMode } from '../../../hooks/useTimer'\n\nexport interface CircularTimerProps {\n /** Total duration (ms). `down`: the countdown length; `up`: the target for progress. */\n durationMs: number\n /** Controlled elapsed time (ms). */\n elapsedMs: number\n /** `down` (default) counts remaining toward 0 (ring drains); `up` counts elapsed up (ring fills). */\n mode?: TimerMode\n /** Ring diameter (px) — the geometry/stroke reference. Default 160. */\n size?: number\n /** Ring stroke width (px). Default 8. */\n strokeWidth?: number\n /** Fill the parent container (responsive) instead of a fixed `size` box. */\n fill?: boolean\n /** Ring color while running. Default `primary`. */\n color?: ProgressColor\n /**\n * `down` mode: the text shown in the center — and the color the ring fills to — when\n * the countdown completes (e.g. `doneLabel=\"GO\"`). Omit to keep showing `0:00`.\n */\n doneLabel?: string\n /** Ring + center color when complete (with {@link doneLabel}). Default `success`. */\n doneColor?: ProgressColor\n /** Optional controls rendered below the ring (e.g. +30s / Skip). */\n controls?: ReactNode\n /** Accessibility label for the timer. Defaults to a seconds-remaining description. */\n accessibilityLabel?: string\n testID?: string\n}\n\n/**\n * A circular countdown / countup with a time readout in the center — the graphical\n * sibling of {@link TimerReadout}. Batteries-included: owns {@link useTimer} (pass\n * controlled `durationMs` + `elapsedMs`) and composes {@link CircularProgress} for the\n * arc (`down` drains as time runs out, `up` fills), rendering the mm:ss label in its\n * center slot. On completion (`down` + {@link doneLabel}) the ring fills fully in\n * {@link doneColor} and the center reads the done label — the \"go\" moment. An optional\n * {@link controls} node renders below the ring. Consumers (e.g. `RestTimer`'s `ring`\n * variant) wrap this and add their own domain chrome.\n */\nexport function CircularTimer({\n durationMs,\n elapsedMs,\n mode = 'down',\n size = 160,\n strokeWidth = 8,\n fill = false,\n color = 'primary',\n doneLabel,\n doneColor = 'success',\n controls,\n accessibilityLabel,\n testID,\n}: CircularTimerProps) {\n const { remainingMs, progress, label, done } = useTimer({ mode, durationMs, elapsedMs })\n\n const isDone = done && mode === 'down'\n const showDone = isDone && doneLabel != null\n // Down → the remaining fraction (ring drains); up → elapsed progress (ring fills).\n // A completed countdown with a done label fills fully to signal \"go\".\n const remainingFrac = durationMs > 0 ? Math.max(0, Math.min(1, remainingMs / durationMs)) : 0\n const arc = mode === 'down' ? (showDone ? 1 : remainingFrac) : progress\n const ringColor: ProgressColor = showDone ? doneColor : color\n\n const remainingSec = Math.ceil(Math.max(0, remainingMs) / 1000)\n const a11y =\n accessibilityLabel ?? (isDone ? 'Timer complete' : `${remainingSec} seconds remaining`)\n\n return (\n <View\n style={{ alignItems: 'center', gap: 16 }}\n accessibilityRole=\"timer\"\n accessibilityLabel={a11y}\n testID={testID ?? 'circular-timer'}\n >\n <CircularProgress\n value={arc}\n max={1}\n size={size}\n strokeWidth={strokeWidth}\n fill={fill}\n color={ringColor}\n // A distinct static name for the ring (the live countdown text lives on the\n // enclosing timer role) — satisfies the progressbar-name a11y rule without\n // duplicating the timer label.\n accessibilityLabel=\"Timer ring\"\n testID=\"circular-timer-ring\"\n >\n <Text\n className={showDone ? undefined : 'text-text-primary'}\n style={{\n fontSize: Math.round(size * (showDone ? 0.28 : 0.24)),\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '800',\n fontVariant: ['tabular-nums'],\n letterSpacing: showDone ? 1 : -1,\n ...(showDone ? { color: colorVarMap[doneColor] } : null),\n }}\n testID=\"circular-timer-label\"\n >\n {showDone ? doneLabel : label}\n </Text>\n </CircularProgress>\n {controls}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, Pressable } from 'react-native'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { useTimer } from '../../../hooks/useTimer'\nimport { CircularTimer } from '../CircularTimer/CircularTimer'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** Default `ring` diameter (px) — the across-the-room wall rest treatment. */\nconst RING_DEFAULT_SIZE = 180\n\nexport interface RestTimerProps {\n totalSeconds: number\n elapsedMs: number\n onSkip: () => void\n onAddTime: () => void\n nextSetInfo?: string\n visible: boolean\n /** Passive/poll-only mode: hides the Skip and +30s controls, keeps the countdown, progress bar, and next-set line. */\n displayOnly?: boolean\n /**\n * `bar` (default) — the compact linear card (REST label + mm:ss + progress bar +\n * controls), the mobile bottom-bar treatment. `ring` — the across-the-room wall\n * treatment: a draining countdown ring (composes {@link CircularProgress}) with a\n * big remaining-seconds numeral, the next-set line, and the same controls.\n */\n variant?: 'bar' | 'ring'\n /** `ring` diameter in px. Default 180. */\n size?: number\n}\n\n/** The +30s / Skip control row — shared by both variants (hidden in `displayOnly`). */\nfunction RestActions({ onAddTime, onSkip }: { onAddTime: () => void; onSkip: () => void }) {\n return (\n <View style={{ flexDirection: 'row', gap: 8 }}>\n <Pressable\n onPress={onAddTime}\n style={{\n backgroundColor: 'rgba(255,255,255,0.06)',\n paddingVertical: 8,\n paddingHorizontal: 20,\n borderRadius: 8,\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add 30 seconds\"\n testID=\"rest-timer-add-time\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 11, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}\n >\n +30s\n </Text>\n </Pressable>\n <Pressable\n onPress={onSkip}\n style={{\n backgroundColor: 'rgba(255,121,0,0.12)',\n paddingVertical: 8,\n paddingHorizontal: 20,\n borderRadius: 8,\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Skip rest\"\n testID=\"rest-timer-skip\"\n >\n <Text\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: BRAND_PRIMARY,\n }}\n >\n Skip\n </Text>\n </Pressable>\n </View>\n )\n}\n\ninterface RestTimerRingProps {\n totalSeconds: number\n elapsedMs: number\n remainingSec: number\n done: boolean\n size: number\n nextSetInfo?: string\n displayOnly: boolean\n onSkip: () => void\n onAddTime: () => void\n}\n\n/**\n * The `ring` render: the wall rest treatment. Composes the generic {@link CircularTimer}\n * (which owns the arc + mm:ss readout + the fill-green \"GO\" done state), passing the\n * shared {@link RestActions} as its controls, and adds the rest-specific next-set footer\n * caption below. Rest-domain chrome only — the timer mechanics live in `CircularTimer`.\n */\nfunction RestTimerRing({\n totalSeconds,\n elapsedMs,\n remainingSec,\n done,\n size,\n nextSetInfo,\n displayOnly,\n onSkip,\n onAddTime,\n}: RestTimerRingProps) {\n const a11yLabel = done\n ? 'Rest complete, next set ready'\n : `Rest timer, ${Math.max(0, remainingSec)} seconds remaining`\n return (\n <View style={{ alignItems: 'center', gap: 16 }} testID=\"rest-timer\">\n <CircularTimer\n durationMs={totalSeconds * 1000}\n elapsedMs={elapsedMs}\n mode=\"down\"\n size={size}\n doneLabel=\"GO\"\n doneColor=\"success\"\n accessibilityLabel={a11yLabel}\n controls={!displayOnly ? <RestActions onAddTime={onAddTime} onSkip={onSkip} /> : undefined}\n testID=\"rest-timer-ring\"\n />\n {nextSetInfo != null && (\n <Text\n className=\"text-text-tertiary\"\n style={{ fontSize: 13, fontFamily: 'Inter, sans-serif' }}\n testID=\"rest-timer-next-set\"\n >\n {nextSetInfo}\n </Text>\n )}\n </View>\n )\n}\n\nexport function RestTimer({\n totalSeconds,\n elapsedMs,\n onSkip,\n onAddTime,\n nextSetInfo,\n visible,\n displayOnly = false,\n variant = 'bar',\n size = RING_DEFAULT_SIZE,\n}: RestTimerProps) {\n // useTimer owns the countdown math (remaining/progress/mm:ss); a zero-duration\n // timer is complete, which keeps the width out of the 0/0 === NaN case.\n const {\n remainingMs,\n progress,\n label: timeDisplay,\n done,\n } = useTimer({\n mode: 'down',\n durationMs: totalSeconds * 1000,\n elapsedMs,\n })\n const remainingSec = Math.ceil(remainingMs / 1000)\n const progressPct = progress * 100\n\n if (!visible) return null\n\n if (variant === 'ring') {\n return (\n <RestTimerRing\n totalSeconds={totalSeconds}\n elapsedMs={elapsedMs}\n remainingSec={remainingSec}\n done={done}\n size={size}\n nextSetInfo={nextSetInfo}\n displayOnly={displayOnly}\n onSkip={onSkip}\n onAddTime={onAddTime}\n />\n )\n }\n\n return (\n <View\n className=\"bg-surface-raised\"\n style={{\n width: '100%',\n borderTopWidth: 1,\n borderTopColor: resolveColor('border-default'),\n paddingVertical: 12,\n paddingHorizontal: 16,\n }}\n accessibilityRole=\"timer\"\n accessibilityLabel={`Rest timer, ${remainingSec} seconds remaining`}\n testID=\"rest-timer\"\n >\n {/* Top row */}\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n }}\n >\n {/* Left side */}\n <View style={{ flexDirection: 'column' }}>\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: 1,\n }}\n testID=\"rest-timer-label\"\n >\n REST\n </Text>\n {nextSetInfo != null && (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n marginTop: 2,\n }}\n testID=\"rest-timer-next-set\"\n >\n {nextSetInfo}\n </Text>\n )}\n </View>\n\n {/* Right side - time display */}\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 28,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n fontVariant: ['tabular-nums'],\n letterSpacing: -0.5,\n }}\n testID=\"rest-timer-time\"\n >\n {timeDisplay}\n </Text>\n </View>\n\n {/* Progress bar */}\n <View\n className=\"bg-border\"\n style={{\n height: 3,\n borderRadius: 2,\n marginBottom: 12,\n }}\n testID=\"rest-timer-progress-track\"\n >\n <View\n style={{\n height: '100%',\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 2,\n width: `${progressPct}%`,\n }}\n testID=\"rest-timer-progress-fill\"\n />\n </View>\n\n {/* Actions row — hidden in display-only (poll-only) mode */}\n {!displayOnly && <RestActions onAddTime={onAddTime} onSkip={onSkip} />}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport React from 'react'\nimport { View, Text } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport interface SupersetWrapperProps {\n label?: string\n color?: string\n children: React.ReactNode\n}\n\nconst DEFAULTS = {\n label: 'SS',\n color: getSemanticColors('dark')['brand-primary'],\n bgBase: '#101010',\n} as const\n\nexport function SupersetWrapper({\n label = DEFAULTS.label,\n color = DEFAULTS.color,\n children,\n}: SupersetWrapperProps) {\n return (\n <View\n style={{\n position: 'relative',\n borderLeftWidth: 3,\n borderLeftColor: color,\n paddingLeft: 8,\n marginHorizontal: 12,\n marginBottom: 8,\n overflow: 'visible',\n }}\n accessibilityRole={'group' as never}\n accessibilityLabel={`Superset: ${label}`}\n testID=\"superset-wrapper\"\n >\n <Text\n style={{\n position: 'absolute',\n top: -1,\n left: -3,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n backgroundColor: color,\n color: DEFAULTS.bgBase,\n paddingVertical: 2,\n paddingHorizontal: 6,\n borderBottomRightRadius: 4,\n letterSpacing: 0.5,\n zIndex: 2,\n }}\n testID=\"superset-label\"\n >\n {label}\n </Text>\n <View style={{ gap: 2 }} testID=\"superset-children\">\n {children}\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'\nimport { InputBar } from './InputBar'\nimport { RestTimer } from './RestTimer'\nimport { SupersetWrapper } from './SupersetWrapper'\nimport { type SetRowProps } from './SetRow'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** Where an exercise sits in the during-workout flow. */\nexport type ActiveExerciseStatus = 'completed' | 'active' | 'upcoming'\n\n/**\n * One exercise in the running workout. Projected onto an `ExerciseCard`, whose\n * visual state is driven by `status` and the page's zoom focus: completed and\n * active exercises collapse/expand, upcoming ones stay dimmed.\n */\nexport interface ActiveWorkoutExercise {\n /** Stable id for zoom-focus selection. */\n id: string\n /** Exercise name, e.g. \"Barbell Bench Press\". */\n name: string\n /** Position in the workout flow. */\n status: ActiveExerciseStatus\n /** Unit used for this exercise's loads. */\n unit: 'lbs' | 'kg'\n /** Total sets prescribed for this exercise. */\n totalPlannedSets: number\n /** Collapsed summary (sets × reps @ weight) for a completed exercise. */\n summary?: ExerciseCardProps['summary']\n /** Flags a personal-record exercise. */\n isPR?: boolean\n /** Prescribed tempo, revealed when expanded. */\n tempo?: ExerciseCardProps['tempo']\n /** Per-rep velocities for each logged set (drives collapsed strips + set count). */\n setVelocities?: number[][]\n /** Per-set breakdown revealed when expanded. */\n sets?: SetRowProps[]\n /** One-line prescription for an upcoming exercise. */\n prescription?: string\n /** Previous-best hint for an upcoming exercise. */\n previousBest?: string\n /** Groups consecutive exercises under a shared `SupersetWrapper`. */\n supersetId?: string\n}\n\n/** A superset grouping consecutive exercises that share its id. */\nexport interface ActiveWorkoutSuperset {\n /** Matches `ActiveWorkoutExercise.supersetId`. */\n id: string\n /** Corner badge label, e.g. \"SS1\". */\n label: string\n /** Accent color for the wrapper rail + label. */\n color?: string\n}\n\n/** Live-set inputs shown in the bottom `InputBar`. */\nexport interface ActiveWorkoutInput {\n /** Current reps field value. */\n reps: string\n /** Current weight field value. */\n weight: string\n}\n\n/** Rest-timer inputs shown in the bottom `RestTimer`. */\nexport interface ActiveWorkoutRest {\n /** Prescribed rest length, seconds. */\n totalSeconds: number\n /** Elapsed rest, milliseconds. */\n elapsedMs: number\n /** Next-set hint, e.g. \"Set 3 · 8 × 195 lbs\". */\n nextSetInfo?: string\n}\n\n/** Derived, page-level roll-up of workout progress. */\nexport interface WorkoutProgress {\n /** Number of exercises marked completed. */\n completedExercises: number\n /** Total exercises in the workout. */\n totalExercises: number\n /** Sets logged so far across all exercises. */\n completedSets: number\n /** Total sets prescribed across all exercises. */\n totalSets: number\n /** Fraction of prescribed sets logged, 0-1. */\n fraction: number\n}\n\n/** An ordered render group: a lone exercise or a superset of exercises. */\nexport type WorkoutGroup =\n | { type: 'single'; exercise: ActiveWorkoutExercise }\n | { type: 'superset'; superset: ActiveWorkoutSuperset; exercises: ActiveWorkoutExercise[] }\n\nexport interface ActiveWorkoutPageProps extends ViewProps {\n /** Workout name shown in the header. */\n title?: string\n /** Context line under the title, e.g. \"Push Day A · Week 6\". */\n subtitle?: string\n /** Exercises in flow order. */\n exercises: ActiveWorkoutExercise[]\n /** Superset groupings referenced by `exercise.supersetId`. */\n supersets?: ActiveWorkoutSuperset[]\n /** Seed reps/weight for the live `InputBar`. */\n input?: ActiveWorkoutInput\n /** Rest-timer state; when resting, the timer replaces the input bar. */\n rest?: ActiveWorkoutRest\n /** Start the page in the resting state (timer showing). */\n initialResting?: boolean\n className?: string\n}\n\n/** Count the sets logged for an exercise (pure). */\nexport function countCompletedSets(exercise: ActiveWorkoutExercise): number {\n if (exercise.setVelocities != null) return exercise.setVelocities.length\n if (exercise.status === 'completed') return exercise.totalPlannedSets\n return 0\n}\n\n/** Roll up the exercises into the header progress readout (pure, testable). */\nexport function deriveWorkoutProgress(exercises: ActiveWorkoutExercise[]): WorkoutProgress {\n let completedExercises = 0\n let completedSets = 0\n let totalSets = 0\n for (const exercise of exercises) {\n if (exercise.status === 'completed') completedExercises += 1\n completedSets += countCompletedSets(exercise)\n totalSets += exercise.totalPlannedSets\n }\n return {\n completedExercises,\n totalExercises: exercises.length,\n completedSets,\n totalSets,\n fraction: totalSets === 0 ? 0 : completedSets / totalSets,\n }\n}\n\n/** The active exercise anchors the bottom bar; find it, or null (pure). */\nexport function findActiveExercise(\n exercises: ActiveWorkoutExercise[]\n): ActiveWorkoutExercise | null {\n return exercises.find((exercise) => exercise.status === 'active') ?? null\n}\n\n/** Whether an exercise renders as the dimmed, not-yet-reached representation (pure). */\nexport function isUpcomingExercise(status: ActiveExerciseStatus): boolean {\n return status === 'upcoming'\n}\n\n/** Project an exercise onto ExerciseCard props, wiring zoom focus (pure). */\nexport function toActiveCardProps(\n exercise: ActiveWorkoutExercise,\n focused: boolean,\n onToggle: () => void,\n supersetPosition: ExerciseCardProps['supersetPosition'] = null,\n supersetColor?: string\n): ExerciseCardProps {\n const upcoming = isUpcomingExercise(exercise.status)\n return {\n name: exercise.name,\n upcoming,\n expanded: focused,\n onExpandedChange: onToggle,\n summary: exercise.summary,\n isPR: exercise.isPR,\n tempo: exercise.tempo,\n setVelocities: exercise.setVelocities,\n totalPlannedSets: exercise.totalPlannedSets,\n sets: focused ? exercise.sets : undefined,\n prescription: exercise.prescription,\n previousBest: exercise.previousBest,\n supersetPosition,\n supersetColor,\n }\n}\n\n/** Fold consecutive same-superset exercises into render groups (pure). */\nexport function groupExercises(\n exercises: ActiveWorkoutExercise[],\n supersets: ActiveWorkoutSuperset[]\n): WorkoutGroup[] {\n const byId = new Map(supersets.map((superset) => [superset.id, superset]))\n const groups: WorkoutGroup[] = []\n for (const exercise of exercises) {\n const superset = exercise.supersetId != null ? byId.get(exercise.supersetId) : undefined\n const last = groups[groups.length - 1]\n if (superset != null && last?.type === 'superset' && last.superset.id === superset.id) {\n last.exercises.push(exercise)\n } else if (superset != null) {\n groups.push({ type: 'superset', superset, exercises: [exercise] })\n } else {\n groups.push({ type: 'single', exercise })\n }\n }\n return groups\n}\n\n/** Position of an exercise within its superset, for corner-radius stitching. */\nfunction supersetPositionAt(index: number, length: number): ExerciseCardProps['supersetPosition'] {\n if (length === 1) return null\n if (index === 0) return 'first'\n if (index === length - 1) return 'last'\n return 'middle'\n}\n\nfunction WorkoutHeader({\n title,\n subtitle,\n progress,\n}: {\n title: string\n subtitle?: string\n progress: WorkoutProgress\n}) {\n return (\n <View style={{ gap: 10 }} testID=\"active-workout-page-header\">\n <View className=\"flex-row items-start justify-between\" style={{ gap: 8 }}>\n <View style={{ flexShrink: 1 }}>\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"active-workout-page-title\"\n >\n {title}\n </Text>\n {subtitle != null && (\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 2,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"active-workout-page-subtitle\"\n >\n {subtitle}\n </Text>\n )}\n </View>\n <View style={{ alignItems: 'flex-end' }} testID=\"active-workout-page-progress-count\">\n <Text\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n color: BRAND_PRIMARY,\n fontVariant: ['tabular-nums'],\n }}\n >\n {`${progress.completedExercises}/${progress.totalExercises}`}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {`${progress.completedSets}/${progress.totalSets} sets`}\n </Text>\n </View>\n </View>\n <View\n className=\"bg-border\"\n style={{ height: 4, borderRadius: 2 }}\n testID=\"active-workout-page-progress-track\"\n >\n <View\n style={{\n height: '100%',\n width: `${Math.round(progress.fraction * 100)}%`,\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 2,\n }}\n testID=\"active-workout-page-progress-fill\"\n />\n </View>\n </View>\n )\n}\n\ninterface ExerciseListProps {\n groups: WorkoutGroup[]\n focusedId: string | null\n onToggle: (id: string) => void\n}\n\nfunction ExerciseList({ groups, focusedId, onToggle }: ExerciseListProps) {\n return (\n <View style={{ gap: 10 }} testID=\"active-workout-page-exercises\">\n {groups.map((group) => {\n if (group.type === 'single') {\n return (\n <View\n key={group.exercise.id}\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n }}\n >\n <ExerciseCard\n {...toActiveCardProps(group.exercise, group.exercise.id === focusedId, () =>\n onToggle(group.exercise.id)\n )}\n />\n </View>\n )\n }\n return (\n <SupersetWrapper\n key={group.superset.id}\n label={group.superset.label}\n color={group.superset.color}\n >\n {group.exercises.map((exercise, index) => (\n <ExerciseCard\n key={exercise.id}\n {...toActiveCardProps(\n exercise,\n exercise.id === focusedId,\n () => onToggle(exercise.id),\n supersetPositionAt(index, group.exercises.length),\n group.superset.color\n )}\n />\n ))}\n </SupersetWrapper>\n )\n })}\n </View>\n )\n}\n\n/**\n * ActiveWorkoutPage — the during-workout screen, built as a zoom hierarchy over\n * `ExerciseCard`s. A header progress bar rolls up completed sets; the flow list\n * dims upcoming exercises, collapses finished ones to their velocity strips, and\n * expands exactly one focused exercise to its `SetRow` breakdown. Consecutive\n * superset exercises stitch together inside a `SupersetWrapper`. A pinned bottom\n * bar toggles between the live `InputBar` (log the next set) and the `RestTimer`.\n * Focus and rest are page-level state; children keep their own styles.\n *\n * @example\n * <ActiveWorkoutPage title=\"Push Day A\" exercises={exercises} />\n */\nexport function ActiveWorkoutPage({\n title = 'Active Workout',\n subtitle,\n exercises,\n supersets = [],\n input,\n rest,\n initialResting = false,\n className,\n ...props\n}: ActiveWorkoutPageProps) {\n const active = findActiveExercise(exercises)\n const [focusedId, setFocusedId] = useState<string | null>(active?.id ?? null)\n const [resting, setResting] = useState(initialResting)\n const [reps, setReps] = useState(input?.reps ?? '')\n const [weight, setWeight] = useState(input?.weight ?? '')\n\n const progress = useMemo(() => deriveWorkoutProgress(exercises), [exercises])\n const groups = useMemo(() => groupExercises(exercises, supersets), [exercises, supersets])\n\n const toggleFocus = (id: string) => setFocusedId((current) => (current === id ? null : id))\n\n const nextSetNumber = active != null ? countCompletedSets(active) + 1 : 1\n const canRecord = reps.trim() !== '' && weight.trim() !== ''\n const showRest = resting && rest != null\n const showInput = !showRest && active != null\n\n return (\n <View\n className={['bg-background-base', className].filter(Boolean).join(' ')}\n style={{ position: 'relative', width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={title}\n testID=\"active-workout-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"active-workout-page-content\">\n <WorkoutHeader title={title} subtitle={subtitle} progress={progress} />\n <ExerciseList groups={groups} focusedId={focusedId} onToggle={toggleFocus} />\n </View>\n\n {(showRest || showInput) && (\n <View\n style={{ borderTopWidth: 1, borderTopColor: resolveColor('border-default') }}\n testID=\"active-workout-page-bottom-bar\"\n >\n {showRest && rest != null ? (\n <RestTimer\n totalSeconds={rest.totalSeconds}\n elapsedMs={rest.elapsedMs}\n nextSetInfo={rest.nextSetInfo}\n onSkip={() => setResting(false)}\n onAddTime={() => undefined}\n visible\n />\n ) : (\n active != null && (\n <InputBar\n exerciseName={active.name}\n setNumber={nextSetNumber}\n totalSets={active.totalPlannedSets}\n reps={reps}\n weight={weight}\n unit={active.unit}\n onRepsChange={setReps}\n onWeightChange={setWeight}\n onRecord={() => {\n if (rest != null) setResting(true)\n }}\n canRecord={canRecord}\n visible\n />\n )\n )}\n </View>\n )}\n </View>\n )\n}\n","/**\n * Elevation System\n * \n * A unified depth system where each elevation level corresponds to:\n * - Calculated surface color (derived from base using lighten)\n * - Shadow intensity and style (raised/pressed)\n * - Dynamically calculated shadow colors (derived from surface color)\n * - Semantic name for reference\n * \n * Elevation range: -2 (deep inset) to +5 (floating overlay)\n * \n * Negative elevations: Inset/pressed elements (sunken into surface)\n * Zero elevation: Base surface (background/page level)\n * Positive elevations: Raised elements (floating above surface)\n * \n * All colors are calculated dynamically from a base surface color,\n * allowing for custom surfaces and consistent color relationships.\n * \n * Lighting Model: Light source from upper-right corner\n * - Raised elements are always lighter than base (consistent across themes)\n * - Base colors must allow sufficient lightening in both themes\n */\n\nimport { Platform, type ViewStyle } from 'react-native'\nimport { lighten, darken, hexToRgb, rgbToHsv, hsvToRgb, rgbToHex } from './shadows'\nimport { semanticColorsLight, semanticColorsDark } from './tokens/semantic'\n\nexport type ElevationLevel = -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5\n\nexport interface ElevationConfig {\n /** Semantic name for this elevation level */\n name: string\n /** Amount to lighten base color (0-1) */\n colorAdjustment: number\n /** Shadow intensity */\n shadowIntensity: 'subtle' | 'medium' | 'strong'\n /** Shadow style: raised (floating) or pressed (inset) */\n shadowStyle: 'raised' | 'pressed'\n /** Description of use case */\n description: string\n}\n\nexport const elevationSystem: Record<ElevationLevel, ElevationConfig> = {\n // Deep inset (recessed input fields, deeply pressed buttons)\n [-2]: {\n name: 'deep-inset',\n colorAdjustment: 0,\n shadowIntensity: 'strong',\n shadowStyle: 'pressed',\n description: 'Deeply recessed elements (e.g., input fields, deeply pressed buttons)',\n },\n \n // Shallow inset (pressed buttons, sunken panels)\n [-1]: {\n name: 'inset',\n colorAdjustment: 0,\n shadowIntensity: 'medium',\n shadowStyle: 'pressed',\n description: 'Shallow inset elements (e.g., pressed buttons, sunken panels within cards)',\n },\n \n // Base level (page background, default surface)\n [0]: {\n name: 'base',\n colorAdjustment: 0,\n shadowIntensity: 'subtle',\n shadowStyle: 'raised',\n description: 'Base surface level (page background, default containers)',\n },\n \n // Level 1: Subtle elevation (outline cards, subtle containers)\n [1]: {\n name: 'subtle',\n colorAdjustment: 0.01,\n shadowIntensity: 'subtle',\n shadowStyle: 'raised',\n description: 'Subtle elevation (outline cards, subtle containers)',\n },\n \n // Level 2: Standard elevation (default cards, buttons)\n [2]: {\n name: 'standard',\n colorAdjustment: 0.02,\n shadowIntensity: 'medium',\n shadowStyle: 'raised',\n description: 'Standard elevation (default cards, raised buttons)',\n },\n \n // Level 3: Prominent elevation (important cards, modals)\n [3]: {\n name: 'prominent',\n colorAdjustment: 0.04,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'Prominent elevation (important cards, modals, dropdowns)',\n },\n \n // Level 4: High elevation (overlays, popovers)\n [4]: {\n name: 'high',\n colorAdjustment: 0.06,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'High elevation (overlays, popovers, tooltips)',\n },\n \n // Level 5: Floating (toasts, floating action buttons)\n [5]: {\n name: 'floating',\n colorAdjustment: 0.08,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'Floating elevation (toasts, floating action buttons, highest z-index)',\n },\n}\n\n/**\n * Calculate rim light color from the BASE color.\n * Creates a consistent bright highlight with opacity that scales with elevation.\n * \n * The rim light represents light hitting the edge of raised elements from a \n * consistent light source. Uses ABSOLUTE HSV value (not relative lightening)\n * for consistent intensity across all surface colors.\n * \n * For colored surfaces: preserves hue/saturation, sets value to fixed bright level\n * For gray surfaces: uses white with appropriate opacity\n * \n * @param baseColor - The base surface color (hex)\n * @param level - Elevation level (used to scale opacity)\n */\nfunction calculateRimLightColor(baseColor: string, level: ElevationLevel): string {\n const rgb = hexToRgb(baseColor)\n if (!rgb) {\n return 'rgba(255, 255, 255, 0.5)'\n }\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const isLight = hsv.v > 0.6\n const isSaturated = hsv.s > 0.3 // Colored (not gray)\n \n // Opacity scales with elevation to compensate for lighter surfaces at higher levels\n // Range: +0% at level 1 to +20% at level 5\n const absLevel = Math.abs(level)\n const opacityBoost = Math.max(0, (absLevel - 1) * 0.05) // +5% per level above 1 (0% to 20%)\n \n if (isSaturated) {\n // For colored surfaces, preserve hue and saturation but set value to fixed bright level\n // This ensures consistent rim light intensity across all colored surfaces\n const rimLightValue = 0.95 // Fixed bright value for rim light\n const rimLightRgb = hsvToRgb(hsv.h, hsv.s * 0.3, rimLightValue) // Reduce saturation for brighter appearance\n \n // Base opacity + elevation boost, capped at 1.0\n const baseOpacity = isLight ? 0.9 : 0.5\n const finalOpacity = Math.min(1, baseOpacity + opacityBoost)\n return `rgba(${rimLightRgb.r}, ${rimLightRgb.g}, ${rimLightRgb.b}, ${finalOpacity.toFixed(2)})`\n } else {\n // For gray/neutral surfaces, use white with appropriate opacity\n const baseOpacity = isLight ? 0.9 : 0.12\n const finalOpacity = Math.min(1, baseOpacity + opacityBoost)\n return `rgba(255, 255, 255, ${finalOpacity.toFixed(2)})`\n }\n}\n\n/**\n * Calculate dark shadow colors from the surface color.\n * The dark shadow is cast BY the element, so it should match the surface color.\n * \n * Uses ABSOLUTE HSV value (not relative darkening) for consistent shadow intensity\n * across all surface colors - simulating a consistent light source.\n * \n * For colored surfaces: preserves hue/saturation, sets value to fixed dark level\n * For gray surfaces: uses black with appropriate opacity\n */\nfunction calculateDarkShadowColors(surfaceColor: string): {\n dark: string\n darker: string\n} {\n const rgb = hexToRgb(surfaceColor)\n if (!rgb) {\n return {\n dark: 'rgba(0, 0, 0, 0.3)',\n darker: 'rgba(0, 0, 0, 0.4)',\n }\n }\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const isLight = hsv.v > 0.6\n const isSaturated = hsv.s > 0.3\n \n if (isSaturated) {\n // For colored surfaces, preserve hue and saturation but set value to fixed dark level\n // This ensures consistent shadow intensity across all colored surfaces\n const darkShadowValue = 0.15 // Fixed dark value for shadows\n const darkShadowRgb = hsvToRgb(hsv.h, hsv.s, darkShadowValue)\n \n if (isLight) {\n return {\n dark: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.3)`,\n darker: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.4)`,\n }\n } else {\n return {\n dark: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.5)`,\n darker: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.6)`,\n }\n }\n } else {\n // For gray surfaces, use standard black shadows\n if (isLight) {\n return {\n dark: 'rgba(0, 0, 0, 0.2)',\n darker: 'rgba(0, 0, 0, 0.3)',\n }\n } else {\n return {\n dark: 'rgba(0, 0, 0, 0.5)',\n darker: 'rgba(0, 0, 0, 0.6)',\n }\n }\n }\n}\n\n/**\n * Get rim light size config.\n * Fixed 1px offset and blur for a consistent, crisp rim highlight.\n * Opacity scaling (in calculateRimLightColor) handles elevation differences.\n */\nfunction getRimLightConfig(): { offset: number; blur: number } {\n return {\n offset: 1, // Fixed 1px for crisp rim\n blur: 1, // Tight blur for crisp edge\n }\n}\n\n/**\n * Get elevation configuration for a given level\n */\nexport function getElevationConfig(level: ElevationLevel): ElevationConfig {\n return elevationSystem[level]\n}\n\n// Simple cache for elevation surface colors\nconst elevationSurfaceCache = new Map<string, string>()\nconst MAX_CACHE_SIZE = 100\n\nfunction getCacheKey(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark'): string {\n return `${baseColor}-${level}-${theme}`\n}\n\nfunction calculateElevationSurface(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark'\n): string {\n const config = elevationSystem[level]\n \n if (config.colorAdjustment === 0) {\n return baseColor\n }\n \n // For raised elevations (positive), always lighten (consistent lighting model)\n // Light source is from upper-right, so raised elements are always lighter\n // For inset elevations (negative), we keep base color (shadow creates depth)\n if (level < 0) {\n return baseColor // Inset elements use base color\n }\n \n // Always lighten for raised elements (consistent across themes)\n // Base colors must be chosen to allow sufficient lightening in dark mode\n return lighten(baseColor, config.colorAdjustment)\n}\n\n/**\n * Calculate surface color for an elevation level from a base color.\n * Results are cached to avoid redundant calculations.\n * \n * @param baseColor - Base surface color (hex)\n * @param level - Elevation level\n * @param theme - Current theme ('light' or 'dark')\n * @returns Calculated surface color (hex)\n */\nexport function getElevationSurface(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark'\n): string {\n const cacheKey = getCacheKey(baseColor, level, theme)\n \n // Check cache\n if (elevationSurfaceCache.has(cacheKey)) {\n return elevationSurfaceCache.get(cacheKey)!\n }\n \n // Calculate\n const result = calculateElevationSurface(baseColor, level, theme)\n \n // Cache result (with size limit to prevent memory leaks)\n if (elevationSurfaceCache.size >= MAX_CACHE_SIZE) {\n // Remove oldest entry (simple FIFO)\n const firstKey = elevationSurfaceCache.keys().next().value!\n elevationSurfaceCache.delete(firstKey)\n }\n elevationSurfaceCache.set(cacheKey, result)\n \n return result\n}\n\n// Cache for shadow styles (less frequently used, smaller cache)\nconst elevationShadowCache = new Map<string, ViewStyle>()\nconst MAX_SHADOW_CACHE_SIZE = 50\n\nfunction getShadowCacheKey(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark', isHovered: boolean): string {\n return `${baseColor}-${level}-${theme}-${isHovered}`\n}\n\nfunction calculateElevationShadow(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean = false\n): ViewStyle {\n const config = elevationSystem[level]\n \n // Base level has no shadow\n if (level === 0) {\n return {}\n }\n \n // Calculate the actual elevated surface color\n const elevatedSurfaceColor = calculateElevationSurface(baseColor, level, theme)\n \n // Rim light: calculated from BASE color (consistent across all elevations)\n // This represents a consistent light source - only size changes with elevation\n const rimLightColor = calculateRimLightColor(baseColor, level)\n \n // Dark shadow: calculated from ELEVATED surface color\n // The shadow is cast by the element, so it should match the surface\n const darkShadowColors = calculateDarkShadowColors(elevatedSurfaceColor)\n \n // Get shadow intensity config (for dark shadow)\n const intensityConfig = {\n subtle: { offset: 1, blur: 2 },\n medium: { offset: 2, blur: 4 },\n strong: { offset: 2, blur: 5 },\n }\n \n const { offset, blur } = intensityConfig[config.shadowIntensity]\n \n // Get rim light config (scales with elevation level)\n const rimConfig = getRimLightConfig()\n \n if (config.shadowStyle === 'pressed') {\n // Inset shadow (pressed elements)\n if (isHovered) {\n // Reduce shadow depth for hover\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n return Platform.select({\n web: {\n boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n }\n \n return Platform.select({\n web: {\n boxShadow: `inset ${offset}px ${offset}px ${blur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n } else {\n // Raised shadow (floating elements)\n if (isHovered) {\n // Reduce shadow depth for hover\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n return Platform.select({\n web: {\n boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: hoverOffset, height: hoverOffset },\n shadowOpacity: 0.2,\n shadowRadius: hoverBlur / 2,\n elevation: hoverOffset,\n },\n }) as ViewStyle\n }\n \n return Platform.select({\n web: {\n boxShadow: `${offset}px ${offset}px ${blur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: offset, height: offset },\n shadowOpacity: 0.3,\n shadowRadius: blur / 2,\n elevation: offset,\n },\n }) as ViewStyle\n }\n}\n\n/**\n * Get shadow style for an elevation level, calculated dynamically from surface color.\n * Results are cached to avoid redundant calculations.\n * \n * @param baseColor - Base surface color (hex)\n * @param level - Elevation level\n * @param theme - Current theme ('light' or 'dark')\n * @param isHovered - Whether element is hovered\n * @returns ViewStyle with shadow properties\n */\nexport function getElevationShadow(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean = false\n): ViewStyle {\n const cacheKey = getShadowCacheKey(baseColor, level, theme, isHovered)\n \n // Check cache\n if (elevationShadowCache.has(cacheKey)) {\n return elevationShadowCache.get(cacheKey)!\n }\n \n // Calculate shadow\n const result = calculateElevationShadow(baseColor, level, theme, isHovered)\n \n // Cache result\n if (elevationShadowCache.size >= MAX_SHADOW_CACHE_SIZE) {\n const firstKey = elevationShadowCache.keys().next().value!\n elevationShadowCache.delete(firstKey)\n }\n elevationShadowCache.set(cacheKey, result)\n \n return result\n}\n\n/**\n * Get base surface color from theme.\n * This is the foundation color that all elevations are calculated from.\n * \n * IMPORTANT: Base colors must be chosen to allow sufficient lightening.\n * \n * **Light Mode**: Cannot use `#FFFFFF` (white) - cannot lighten white!\n * - Use `#F3F4F6` (neutral[100]) - can lighten to `#FAFAFA` → `#FFFFFF`\n * - This allows raised elevations to be lighter (closer to white)\n * \n * **Dark Mode**: Need lighter base to allow sufficient lightening\n * - Use `#191919` (charcoal[600]) - allows lightening to `#2A2A2A` at max elevation\n * \n * Can be overridden to use custom base colors for special cases.\n */\nexport function getBaseSurfaceColor(theme: 'light' | 'dark'): string {\n // Use semantic token values so elevation colors stay in sync with the token pipeline.\n // Light mode: surface-raised (#F3F4F6 / neutral[100]) - NOT white, so we can lighten it\n // Dark mode: surface-elevated (#191919 / charcoal[600]) - allows sufficient lightening\n\n return theme === 'light'\n ? semanticColorsLight['surface-raised']\n : semanticColorsDark['surface-elevated']\n}\n\n/**\n * Component-specific elevation ranges\n * Defines which elevation levels each component type can use\n */\nexport const componentElevationRanges = {\n button: {\n allowed: [2] as const,\n default: 2 as const,\n hover: 3 as const,\n },\n card: {\n allowed: [1, 2, 3] as const,\n default: 2 as const,\n hover: 3 as const,\n },\n input: {\n allowed: [-2, -1, 0] as const,\n default: -1 as const,\n },\n overlay: {\n allowed: [4, 5] as const,\n default: 4 as const,\n },\n} as const\n\nexport type ComponentType = keyof typeof componentElevationRanges\n\n/**\n * Validate and clamp elevation to component's allowed range\n */\nexport function getValidatedElevation(\n component: ComponentType,\n requested: ElevationLevel\n): ElevationLevel {\n const range = componentElevationRanges[component]\n if ((range.allowed as readonly ElevationLevel[]).includes(requested)) {\n return requested\n }\n // Clamp to nearest allowed elevation\n const sorted = [...range.allowed].sort((a, b) => a - b)\n if (requested < sorted[0]) return sorted[0]\n if (requested > sorted[sorted.length - 1]) return sorted[sorted.length - 1]\n // Find closest\n return sorted.reduce((prev, curr) =>\n Math.abs(curr - requested) < Math.abs(prev - requested) ? curr : prev\n ) as ElevationLevel\n}\n\n// =============================================================================\n// Glow Shadow Support\n// =============================================================================\n\nexport type GlowIntensity = 'subtle' | 'medium' | 'strong'\n\nconst glowConfig: Record<GlowIntensity, { blur: number; spread: number; opacity: number }> = {\n subtle: { blur: 12, spread: 0, opacity: 0.25 },\n medium: { blur: 20, spread: 2, opacity: 0.4 },\n strong: { blur: 30, spread: 4, opacity: 0.55 },\n}\n\n/**\n * Get a glow shadow style for emphasis/active states.\n *\n * Creates a colored radial glow around an element, useful for:\n * - Active recording indicators (orange glow)\n * - Success states (green glow)\n * - Error/danger indicators (red glow)\n * - Focus rings and attention-drawing elements\n *\n * @param color - Glow color (hex string, e.g. '#FF7900')\n * @param intensity - Glow intensity level\n * @returns ViewStyle with platform-specific shadow properties\n */\nexport function getGlowShadow(\n color: string,\n intensity: GlowIntensity = 'medium'\n): ViewStyle {\n const config = glowConfig[intensity]\n const rgb = hexToRgb(color)\n if (!rgb) return {}\n\n return Platform.select({\n web: {\n boxShadow: `0 0 ${config.blur}px ${config.spread}px rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${config.opacity})`,\n } as any,\n default: {\n shadowColor: color,\n shadowOffset: { width: 0, height: 0 },\n shadowOpacity: config.opacity,\n shadowRadius: config.blur / 2,\n elevation: 0,\n },\n }) as ViewStyle\n}\n","import { useSyncExternalStore } from 'react'\n\n/**\n * Utility function to detect the current theme.\n * Checks for the 'light' class on the html element (set by Storybook's theme addon).\n * \n * NOTE: This function reads the theme at call time. For reactive theme detection\n * that re-renders when the theme changes, use the `useTheme` hook instead.\n * \n * @returns 'light' if light theme is active, 'dark' otherwise\n */\nexport function getTheme(): 'light' | 'dark' {\n if (typeof document === 'undefined') return 'dark'\n return document.documentElement.classList.contains('light') ? 'light' : 'dark'\n}\n\n// Subscribers for theme changes\nlet listeners: Array<() => void> = []\n\nfunction subscribe(listener: () => void) {\n listeners = [...listeners, listener]\n \n // Set up MutationObserver to watch for class changes on html element\n if (typeof document !== 'undefined' && listeners.length === 1) {\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n // Notify all listeners when class changes\n listeners.forEach(l => l())\n }\n }\n })\n \n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n \n // Store observer for cleanup\n ;(subscribe as any)._observer = observer\n }\n \n return () => {\n listeners = listeners.filter(l => l !== listener)\n \n // Clean up observer when no more listeners\n if (listeners.length === 0 && (subscribe as any)._observer) {\n ;(subscribe as any)._observer.disconnect()\n ;(subscribe as any)._observer = null\n }\n }\n}\n\nfunction getSnapshot(): 'light' | 'dark' {\n return getTheme()\n}\n\nfunction getServerSnapshot(): 'light' | 'dark' {\n return 'dark'\n}\n\n/**\n * React hook for reactive theme detection.\n * Automatically re-renders when the theme changes (via class changes on html element).\n * \n * Uses useSyncExternalStore for proper React 18 concurrent mode support.\n * \n * @returns 'light' if light theme is active, 'dark' otherwise\n */\nexport function useTheme(): 'light' | 'dark' {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","import React, { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { \n getElevationSurface, \n getElevationShadow, \n getBaseSurfaceColor,\n getValidatedElevation,\n type ElevationLevel \n} from '../../../theme'\nimport { useTheme } from '../../../utils/useTheme'\n\nexport type CardVariant = 'elevated' | 'outline' | 'filled' | 'accent' | 'subtle'\nexport type CardElevation = 1 | 2 | 3 // subtle, standard, prominent\n\nexport interface CardProps extends ViewProps {\n /** Visual variant */\n variant?: CardVariant\n /** Elevation level (1=subtle, 2=standard, 3=prominent) */\n elevation?: CardElevation\n /** Whether the card is interactive (hoverable/pressable) */\n isInteractive?: boolean\n /** Whether the card is in a loading state (renders skeleton) */\n isLoading?: boolean\n /** Callback when card is pressed (makes card interactive) */\n onPress?: () => void\n /** Custom border color (hex, rgb, or CSS color). Useful for status cards. */\n borderColor?: string\n /** Custom background color (hex, rgb, or CSS color). Useful for colored cards. */\n bgColor?: string\n /** Accent stripe color for accent variant (CSS color or hex) */\n accentColor?: string\n /** Accent stripe width for accent variant in pixels (default: 3) */\n accentWidth?: number\n /** Additional className */\n className?: string\n children?: React.ReactNode\n /** Show header skeleton when loading (default: true) */\n skeletonHasHeader?: boolean\n /** Show footer skeleton when loading (default: false) */\n skeletonHasFooter?: boolean\n /** Number of content lines in skeleton when loading (default: 3) */\n skeletonContentLines?: number\n}\n\nconst variantStyles: Record<CardVariant, string> = {\n elevated: '', // Will be set dynamically via elevation system\n outline: 'border-2 border-border-strong', // Thicker border with stronger contrast\n filled: '', // Will be set dynamically via elevation system\n accent: 'border border-border',\n subtle: 'border border-border-subtle',\n}\n\n/**\n * Card component for containing related content.\n *\n * @example\n * <Card>\n * <CardHeader>\n * <CardTitle>Card Title</CardTitle>\n * <CardDescription>Card description</CardDescription>\n * </CardHeader>\n * <CardContent>\n * <Text>Card content goes here</Text>\n * </CardContent>\n * <CardFooter>\n * <Button>Action</Button>\n * </CardFooter>\n * </Card>\n *\n * // Interactive card\n * <Card isInteractive onPress={() => console.log('pressed')}>\n * <CardContent>Click me</CardContent>\n * </Card>\n */\nexport function Card({\n variant = 'elevated',\n elevation = 2,\n isInteractive = false,\n isLoading = false,\n onPress,\n borderColor,\n bgColor,\n accentColor,\n accentWidth,\n className,\n children,\n style,\n skeletonHasHeader = true,\n skeletonHasFooter = false,\n skeletonContentLines = 3,\n ...props\n}: CardProps) {\n const isClickable = isInteractive || !!onPress\n const [isHovered, setIsHovered] = useState(false)\n const theme = useTheme()\n\n // Get elevation level (validate and clamp to card's allowed range)\n const elevationLevel = useMemo(() => {\n const validated = getValidatedElevation('card', elevation as ElevationLevel)\n // Map variant to elevation if needed\n if (variant === 'outline' || variant === 'accent' || variant === 'subtle') {\n return 1 as ElevationLevel // These border variants use subtle elevation\n }\n return validated\n }, [variant, elevation])\n\n // Get base surface color for theme\n const baseColor = useMemo(() => getBaseSurfaceColor(theme), [theme])\n\n // Calculate surface color and shadow from elevation\n const surfaceColor = useMemo(() => {\n // Outline variant in light mode uses a specific off-white for clear visibility\n if ((variant === 'outline' || variant === 'accent') && theme === 'light') {\n return '#FAFAFA' // Matches --color-surface-elevated in light mode\n }\n // Subtle variant uses the base surface color without elevation lift\n if (variant === 'subtle') {\n return getElevationSurface(baseColor, 0 as ElevationLevel, theme)\n }\n return getElevationSurface(baseColor, elevationLevel, theme)\n }, [baseColor, elevationLevel, theme, variant])\n\n const shadowStyle = useMemo(() => {\n // Only apply hover shadow if card is actually clickable\n const shouldHover = isHovered && isClickable\n return getElevationShadow(baseColor, elevationLevel, theme, shouldHover)\n }, [baseColor, elevationLevel, theme, isHovered, isClickable])\n\n // Render skeleton content when loading, otherwise render children\n const cardContent = isLoading ? (\n <>\n {skeletonHasHeader && (\n <CardHeader>\n <View className=\"h-5 w-1/3 bg-interactive-disabled rounded\" />\n <View className=\"mt-2 h-4 w-2/3 bg-interactive-disabled rounded\" />\n </CardHeader>\n )}\n <CardContent>\n {Array.from({ length: skeletonContentLines }).map((_, i) => (\n <View\n key={i}\n className={cn(\n 'h-4 bg-interactive-disabled rounded',\n i < skeletonContentLines - 1 ? 'mb-2 w-full' : 'w-4/5'\n )}\n />\n ))}\n </CardContent>\n {skeletonHasFooter && (\n <CardFooter>\n <View className=\"h-9 w-24 bg-interactive-disabled rounded\" />\n </CardFooter>\n )}\n </>\n ) : (\n children\n )\n\n const baseClassName = cn(\n 'rounded-lg overflow-hidden relative',\n // Apply variant styles, but only use default border color if no custom borderColor\n variant === 'outline'\n ? borderColor\n ? 'border-2' // Just the border width, color via style\n : variantStyles[variant] // Full variant styles including color\n : variantStyles[variant],\n // Remove Tailwind shadow classes - we're using elevation shadows via style prop\n isClickable && 'web:cursor-pointer web:transition-all web:duration-150',\n isClickable && 'web:hover:-translate-y-0.5 active:scale-[0.99]',\n isLoading && 'pointer-events-none animate-pulse',\n className\n )\n\n // Accent variant: left stripe via borderLeft override\n const accentStyle = useMemo(() => variant === 'accent' ? {\n borderLeftWidth: accentWidth ?? 3,\n borderLeftColor: accentColor ?? 'var(--color-brand-primary)',\n } : {}, [variant, accentWidth, accentColor])\n\n // Merge styles: background color from elevation + shadow style + custom colors + custom style\n const mergedStyle = useMemo(() => {\n const elevationStyle: Record<string, any> = {\n backgroundColor: bgColor || surfaceColor,\n borderRadius: 8,\n overflow: 'hidden' as const,\n ...shadowStyle,\n ...accentStyle,\n }\n\n // Add custom border color if provided\n if (borderColor) {\n elevationStyle.borderColor = borderColor\n }\n\n if (!style) return elevationStyle\n // User style takes precedence over elevation defaults (e.g. maxWidth, custom bg)\n return [elevationStyle, style]\n }, [style, surfaceColor, shadowStyle, borderColor, bgColor, accentStyle])\n\n if (isClickable) {\n return (\n <Pressable\n onPress={onPress}\n onHoverIn={() => setIsHovered(true)}\n onHoverOut={() => setIsHovered(false)}\n accessibilityRole=\"button\"\n className={baseClassName}\n style={mergedStyle}\n {...props}\n >\n {cardContent}\n </Pressable>\n )\n }\n\n return (\n <View className={baseClassName} style={mergedStyle} {...props}>\n {cardContent}\n </View>\n )\n}\n\nexport interface CardHeaderProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Header section of a Card.\n */\nexport function CardHeader({ children, className }: CardHeaderProps) {\n return (\n <View className={cn('px-6 py-6', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardTitleProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Title for CardHeader.\n */\nexport function CardTitle({ children, className }: CardTitleProps) {\n return (\n <Text\n accessibilityRole=\"header\"\n className={cn('text-lg font-semibold text-text-primary font-heading', className)}\n >\n {children}\n </Text>\n )\n}\n\nexport interface CardDescriptionProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Description for CardHeader.\n */\nexport function CardDescription({ children, className }: CardDescriptionProps) {\n return (\n <Text className={cn('mt-1.5 text-sm text-text-secondary', className)}>\n {children}\n </Text>\n )\n}\n\nexport interface CardContentProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Content section of a Card.\n */\nexport function CardContent({ children, className }: CardContentProps) {\n return (\n <View className={cn('px-6 py-4', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardFooterProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Footer section of a Card.\n */\nexport function CardFooter({ children, className }: CardFooterProps) {\n return (\n <View className={cn('px-6 py-4 flex-row items-center gap-2', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardSkeletonProps {\n /** Whether to show header skeleton */\n hasHeader?: boolean\n /** Whether to show footer skeleton */\n hasFooter?: boolean\n /** Number of content lines */\n contentLines?: number\n /** Additional className */\n className?: string\n}\n\n/**\n * Skeleton placeholder for Card loading state.\n */\nexport function CardSkeleton({\n hasHeader = true,\n hasFooter = false,\n contentLines = 3,\n className,\n}: CardSkeletonProps) {\n return (\n <Card variant=\"elevated\" elevation={2} className={cn('animate-pulse', className)}>\n {hasHeader && (\n <CardHeader>\n <View className=\"h-5 w-1/3 bg-interactive-disabled rounded\" />\n <View className=\"mt-2 h-4 w-2/3 bg-interactive-disabled rounded\" />\n </CardHeader>\n )}\n <CardContent>\n {Array.from({ length: contentLines }).map((_, i) => (\n <View\n key={i}\n className={cn(\n 'h-4 bg-interactive-disabled rounded',\n i < contentLines - 1 ? 'mb-2 w-full' : 'w-4/5'\n )}\n />\n ))}\n </CardContent>\n {hasFooter && (\n <CardFooter>\n <View className=\"h-9 w-24 bg-interactive-disabled rounded\" />\n </CardFooter>\n )}\n </Card>\n )\n}\n\nexport interface CardInsetProps extends ViewProps {\n /** Elevation level for inset (-2=deep, -1=shallow) */\n elevation?: -2 | -1\n /** Additional className */\n className?: string\n children?: React.ReactNode\n}\n\n/**\n * Inset element within a Card. Applies pressed neumorphic shadow\n * to create a sunken/recessed appearance.\n * \n * @example\n * <Card elevation={2}>\n * <CardContent>\n * <CardInset elevation={-1}>\n * <Text>This content appears inset/sunken</Text>\n * </CardInset>\n * </CardContent>\n * </Card>\n */\nexport function CardInset({\n elevation = -1,\n className,\n children,\n style,\n ...props\n}: CardInsetProps) {\n const theme = useTheme()\n const baseColor = useMemo(() => getBaseSurfaceColor(theme), [theme])\n const surfaceColor = useMemo(() => {\n return getElevationSurface(baseColor, elevation as ElevationLevel, theme)\n }, [baseColor, elevation, theme])\n const shadowStyle = useMemo(() => {\n return getElevationShadow(baseColor, elevation as ElevationLevel, theme)\n }, [baseColor, elevation, theme])\n \n return (\n <View\n className={cn('rounded', className)}\n style={[{ backgroundColor: surfaceColor }, shadowStyle, style]}\n {...props}\n >\n {children}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nexport type StatusDotVariant =\n | 'success'\n | 'warning'\n | 'error'\n | 'neutral'\n | 'on-track'\n | 'deviation'\n | 'future'\n\nexport interface StatusDotProps extends ViewProps {\n variant: StatusDotVariant\n /** Center glyph. Only rendered at size=\"md\"; the 8px \"sm\" dot is too small to fit one. */\n icon?: 'check' | 'exclamation' | 'dash'\n size?: 'sm' | 'md'\n /** Adds a subtle glow effect in the variant color */\n glow?: boolean\n label?: string\n className?: string\n}\n\nconst solidVariantColors: Record<string, string> = {\n success: t['status-success'],\n warning: t['status-warning'],\n error: t['status-error'],\n neutral: '#6B7280',\n}\n\nconst ringVariantStyles: Record<string, Record<string, unknown>> = {\n 'on-track': {\n backgroundColor: 'rgba(46,213,115,0.15)',\n borderWidth: 1,\n borderColor: 'rgba(46,213,115,0.3)',\n },\n deviation: {\n backgroundColor: 'rgba(245,158,11,0.15)',\n borderWidth: 1,\n borderColor: 'rgba(245,158,11,0.25)',\n },\n future: {\n backgroundColor: 'rgba(107,114,128,0.1)',\n borderWidth: 1,\n borderStyle: 'dashed',\n borderColor: 'rgba(107,114,128,0.2)',\n },\n}\n\nconst glowStyles: Record<StatusDotVariant, Record<string, unknown>> = {\n success: { boxShadow: '0 0 4px rgba(46,213,115,0.4)' },\n warning: { boxShadow: '0 0 4px rgba(245,158,11,0.4)' },\n error: { boxShadow: '0 0 4px rgba(239,68,68,0.4)' },\n neutral: { boxShadow: '0 0 4px rgba(107,114,128,0.4)' },\n 'on-track': { boxShadow: '0 0 4px rgba(46,213,115,0.4)' },\n deviation: { boxShadow: '0 0 4px rgba(245,158,11,0.4)' },\n future: { boxShadow: '0 0 4px rgba(107,114,128,0.4)' },\n}\n\nconst iconChars: Record<string, string> = {\n check: '\\u2713',\n exclamation: '!',\n dash: '\\u2014',\n}\n\n/** Color-matched icon colors: dark on solid bg, light on transparent bg */\nconst iconColors: Record<StatusDotVariant, string> = {\n success: '#0A5C52',\n warning: '#6B4000',\n error: '#5C1A1A',\n neutral: '#D1D5DB',\n 'on-track': t['status-success'],\n deviation: t['status-warning'],\n future: '#6B7280',\n}\n\nconst sizeDimensions = {\n sm: { size: 8, showIcon: false },\n md: { size: 18, showIcon: true },\n}\n\nfunction isSolidVariant(variant: StatusDotVariant): boolean {\n return variant in solidVariantColors\n}\n\nexport function StatusDot({\n variant,\n icon,\n size = 'sm',\n glow,\n label,\n className,\n ...props\n}: StatusDotProps) {\n const config = sizeDimensions[size]\n const solid = isSolidVariant(variant)\n const ring = ringVariantStyles[variant]\n\n const glowStyle = glow ? glowStyles[variant] : null\n\n const dot = (\n <View\n style={[\n {\n width: config.size,\n height: config.size,\n borderRadius: 9999,\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n },\n solid ? { backgroundColor: solidVariantColors[variant] } : undefined,\n ring ? (ring as Record<string, unknown>) : undefined,\n glowStyle ? (glowStyle as Record<string, unknown>) : undefined,\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={`${variant} status`}\n testID=\"status-dot\"\n >\n {config.showIcon && icon && (\n <Text\n style={{\n fontSize: 11,\n lineHeight: 11,\n fontWeight: '900',\n color: iconColors[variant],\n }}\n accessibilityElementsHidden\n >\n {iconChars[icon]}\n </Text>\n )}\n </View>\n )\n\n if (label) {\n return (\n <View\n className={className}\n style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}\n accessibilityLabel={`${variant} status: ${label}`}\n {...props}\n >\n <View accessibilityElementsHidden>{dot}</View>\n <Text\n style={{ fontSize: 12, lineHeight: 16, color: '#9CA3AF' }}\n accessibilityElementsHidden\n >\n {label}\n </Text>\n </View>\n )\n }\n\n return (\n <View className={className} {...props}>\n {dot}\n </View>\n )\n}\n","/**\n * Data-viz / status / brand fills, sourced from the color foundations.\n */\n\nimport { categoricalPalette, primitiveRamps as ramp } from './tokens/primitives'\n\n/**\n * Titan categorical fallback palette shared by Treemap and Scatter — the\n * canonical {@link categoricalPalette} (ordered, nested-stable, CVD-safe).\n * Components index into it modulo length, so the 7-color series is sufficient.\n */\nexport const DATAVIZ_CATEGORICAL_PALETTE = categoricalPalette.default\n\n/**\n * MesoCard / MesoStatusCard 3px top-accent gradient stops (dark → primary →\n * light), on the orange ramp that brand-primary (orange-400) lives in.\n */\nexport const MESO_ACCENT_GRADIENT_DARK = ramp.orange[500]\nexport const MESO_ACCENT_GRADIENT_LIGHT = ramp.orange[300]\n\nexport const WORKOUT_PILL_DELOAD = ramp.magenta[600]\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { Fragment, type ReactNode } from 'react'\nimport { View, Text, type ViewProps, type ViewStyle } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { StatusDot } from './StatusDot'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n MESO_ACCENT_GRADIENT_DARK,\n MESO_ACCENT_GRADIENT_LIGHT,\n} from '../../../theme/extracted-colors-dataviz'\n\nconst t = getSemanticColors('dark')\n\nconst BRAND_PRIMARY = t['brand-primary']\nconst BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK\nconst BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT\n\nconst SUCCESS = t['status-success']\nconst WARNING = t['status-warning']\nconst ERROR = t['status-error']\n\n/** Gradient stops for the 3px top accent: dark -> primary -> light (matches MesoCard). */\nconst ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY, BRAND_PRIMARY_LIGHT]\n\n/**\n * Card surface gradient: elevated -> raised at 135deg. Uses resolved dark-theme\n * hexes (a gradient string can't carry a className token, and var() renders\n * black on native).\n */\nconst CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor('surface-elevated')} 0%, ${resolveColor('surface-raised')} 100%)`\n\n/** Gauge track gradient (teal -> amber -> red) at 0.25 alpha. */\nconst GAUGE_GRADIENT =\n 'linear-gradient(90deg, rgba(46,213,115,0.25) 0%, rgba(249,180,21,0.25) 50%, rgba(209,67,67,0.25) 100%)'\n\nexport type MesoStatusBadgeVariant = 'success' | 'warning' | 'error'\n\nconst STATUS_VARIANTS: Record<\n MesoStatusBadgeVariant,\n { bg: string; border: string; text: string }\n> = {\n success: { bg: 'rgba(46,213,115,0.15)', border: 'rgba(46,213,115,0.3)', text: SUCCESS },\n warning: { bg: 'rgba(249,180,21,0.15)', border: 'rgba(249,180,21,0.3)', text: WARNING },\n error: { bg: 'rgba(209,67,67,0.15)', border: 'rgba(209,67,67,0.25)', text: ERROR },\n}\n\nexport interface MesoStatusBadge {\n /** Short status label, e.g. \"On Track\". */\n label: string\n /** Color treatment for the badge. */\n variant: MesoStatusBadgeVariant\n}\n\nexport interface MesoStatusMetric {\n /** Cell label, e.g. \"Prescribed\". */\n label: string\n /** Cell value, e.g. \"3×8 @ RPE 8\". */\n value: string\n}\n\nexport interface MesoStatusGauge {\n /** Gauge label, e.g. \"Intensity\". */\n label: string\n /** Fill position 0-1; the 14px marker sits at this level. */\n level: number\n /** Optional right-aligned sublabel, e.g. \"Prescribed\". */\n sublabel?: string\n}\n\nexport interface MesoStatusCoaching {\n /** Coaching recommendation copy. */\n text: string\n /** Substrings within `text` to render in bold. */\n highlights?: string[]\n}\n\nexport interface MesoStatusNextTarget {\n /** Leading glyph/emoji, e.g. \"→\" or \"🎯\". */\n icon: string\n /** Next-session target copy. */\n text: string\n}\n\nexport interface MesoStatusCardProps extends ViewProps {\n /** Mesocycle name, e.g. \"Hypertrophy Block\". */\n mesoName: string\n /** Context line, e.g. \"Week 6 of 8 · Upper/Lower\". */\n mesoSubtitle: string\n /** Status pill in the header. */\n statusBadge: MesoStatusBadge\n /** Prescription-vs-actual metrics rendered as a 2x2 grid. */\n metrics: MesoStatusMetric[]\n /** Intensity / volume gauges stacked vertically. */\n gauges: MesoStatusGauge[]\n /** Optional coaching recommendation box. */\n coaching?: MesoStatusCoaching\n /** Optional next-session target box. */\n nextTarget?: MesoStatusNextTarget\n className?: string\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\n/** Marker fill color by gauge zone: teal 0-0.4, amber 0.4-0.7, red 0.7-1.0. */\nfunction getGaugeZoneColor(level: number): string {\n if (level >= 0.7) return ERROR\n if (level >= 0.4) return WARNING\n return SUCCESS\n}\n\n/** Splits `text` into nodes, bolding any segment that exactly matches a highlight. */\nfunction renderCoachingText(text: string, highlights?: string[]): ReactNode {\n if (!highlights || highlights.length === 0) return text\n const escaped = highlights\n .filter(Boolean)\n .map((h) => h.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n if (escaped.length === 0) return text\n const regex = new RegExp(`(${escaped.join('|')})`, 'g')\n return text.split(regex).map((part, index) =>\n highlights.includes(part) ? (\n <Text\n key={`${part}-${index}`}\n className=\"text-text-primary\"\n style={{ fontWeight: '700' }}\n >\n {part}\n </Text>\n ) : (\n <Fragment key={`t-${index}`}>{part}</Fragment>\n ),\n )\n}\n\nfunction StatusPill({ badge }: { badge: MesoStatusBadge }) {\n const colors = STATUS_VARIANTS[badge.variant]\n return (\n <View\n className=\"flex-row items-center\"\n style={{\n gap: 5,\n paddingVertical: 3,\n paddingHorizontal: 8,\n borderRadius: 4,\n borderWidth: 1,\n backgroundColor: colors.bg,\n borderColor: colors.border,\n }}\n testID=\"meso-status-card-badge\"\n >\n <View accessibilityElementsHidden>\n <StatusDot variant={badge.variant} size=\"sm\" />\n </View>\n <Text\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n letterSpacing: 0.3,\n color: colors.text,\n }}\n >\n {badge.label}\n </Text>\n </View>\n )\n}\n\nfunction MetricCell({ metric }: { metric: MesoStatusMetric }) {\n return (\n <View style={{ width: '48%' }} testID=\"meso-status-card-metric\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n }}\n >\n {metric.label}\n </Text>\n <Text\n className=\"text-text-primary\"\n style={{\n marginTop: 2,\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n }}\n >\n {metric.value}\n </Text>\n </View>\n )\n}\n\nfunction Gauge({ gauge }: { gauge: MesoStatusGauge }) {\n const level = clamp01(gauge.level)\n const percentage = Math.round(level * 100)\n const markerColor = getGaugeZoneColor(level)\n return (\n <View\n style={{ gap: 6 }}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: 0, max: 100, now: percentage }}\n accessibilityLabel={`${gauge.label}: ${percentage}%`}\n aria-valuenow={percentage}\n aria-valuemin={0}\n aria-valuemax={100}\n testID=\"meso-status-card-gauge\"\n >\n <View\n className=\"flex-row items-center justify-between\"\n accessibilityElementsHidden\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n }}\n >\n {gauge.label}\n </Text>\n {gauge.sublabel != null && (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n }}\n >\n {gauge.sublabel}\n </Text>\n )}\n </View>\n\n <View\n style={\n {\n height: 8,\n borderRadius: 4,\n position: 'relative',\n backgroundImage: GAUGE_GRADIENT,\n } as ViewStyle\n }\n accessibilityElementsHidden\n >\n <View\n style={{\n position: 'absolute',\n left: '50%',\n top: 0,\n bottom: 0,\n width: 1,\n marginLeft: -0.5,\n backgroundColor: 'rgba(255,255,255,0.3)',\n }}\n testID=\"meso-status-card-gauge-center\"\n />\n <View\n className=\"border-text-primary\"\n style={{\n position: 'absolute',\n left: `${percentage}%`,\n top: -3,\n marginLeft: -7,\n width: 14,\n height: 14,\n borderRadius: 9999,\n borderWidth: 2,\n backgroundColor: markerColor,\n boxShadow: '0 0 4px rgba(0,0,0,0.5)',\n }}\n testID=\"meso-status-card-gauge-marker\"\n />\n </View>\n </View>\n )\n}\n\n/**\n * Mesocycle context card for a specific exercise: prescription vs actual\n * metrics, intensity/volume gauges, and coaching guidance. Composes the titan\n * `Card` plus the Workout `StatusDot`, and renders the §25 gauge (8px track,\n * 50% center line, 14px marker) inline since that visual differs from the\n * IntensityBar/DeviationBar primitives.\n *\n * @example\n * <MesoStatusCard\n * mesoName=\"Hypertrophy Block\"\n * mesoSubtitle=\"Week 6 of 8 · Upper/Lower\"\n * statusBadge={{ label: 'On Track', variant: 'success' }}\n * metrics={[\n * { label: 'Prescribed', value: '3×8 @ RPE 8' },\n * { label: 'Actual', value: '3×8 @ 185 lbs' },\n * ]}\n * gauges={[{ label: 'Intensity', level: 0.7, sublabel: 'Actual' }]}\n * coaching={{ text: 'Add load next session.', highlights: ['Add load'] }}\n * nextTarget={{ icon: '→', text: '190 lbs × 8' }}\n * />\n */\nexport function MesoStatusCard({\n mesoName,\n mesoSubtitle,\n statusBadge,\n metrics,\n gauges,\n coaching,\n nextTarget,\n className,\n ...props\n}: MesoStatusCardProps) {\n return (\n <Card\n variant=\"outline\"\n elevation={1}\n borderColor={BRAND_PRIMARY_DARK}\n className={className}\n style={\n {\n borderColor: BRAND_PRIMARY_DARK,\n borderWidth: 1,\n backgroundImage: CARD_GRADIENT,\n } as ViewStyle\n }\n role=\"article\"\n aria-label={`Mesocycle status for ${mesoName}`}\n testID=\"meso-status-card\"\n {...props}\n >\n <View\n className=\"flex-row\"\n style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 3, zIndex: 1 }}\n accessibilityElementsHidden\n testID=\"meso-status-card-accent\"\n >\n {ACCENT_STOPS.map((color) => (\n <View key={color} style={{ flex: 1, backgroundColor: color }} />\n ))}\n </View>\n\n <View style={{ padding: 14, gap: 14 }} testID=\"meso-status-card-body\">\n <View testID=\"meso-status-card-header\">\n <View\n className=\"flex-row items-center justify-between\"\n style={{ gap: 8 }}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n flexShrink: 1,\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"meso-status-card-name\"\n >\n {mesoName}\n </Text>\n <StatusPill badge={statusBadge} />\n </View>\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"meso-status-card-subtitle\"\n >\n {mesoSubtitle}\n </Text>\n </View>\n\n {metrics.length > 0 && (\n <View\n className=\"flex-row flex-wrap\"\n style={{ gap: 8 }}\n testID=\"meso-status-card-metrics\"\n >\n {metrics.map((metric, index) => (\n <MetricCell key={`${metric.label}-${index}`} metric={metric} />\n ))}\n </View>\n )}\n\n {gauges.length > 0 && (\n <View style={{ gap: 12 }} testID=\"meso-status-card-gauges\">\n {gauges.map((gauge, index) => (\n <Gauge key={`${gauge.label}-${index}`} gauge={gauge} />\n ))}\n </View>\n )}\n\n {coaching != null && (\n <View\n style={{\n backgroundColor: 'rgba(249,180,21,0.06)',\n borderWidth: 1,\n borderColor: 'rgba(249,180,21,0.15)',\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 12,\n }}\n testID=\"meso-status-card-coaching\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n lineHeight: 17,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {renderCoachingText(coaching.text, coaching.highlights)}\n </Text>\n </View>\n )}\n\n {nextTarget != null && (\n <View\n className=\"flex-row items-center\"\n style={{\n gap: 8,\n backgroundColor: 'rgba(46,213,115,0.06)',\n borderWidth: 1,\n borderColor: 'rgba(46,213,115,0.2)',\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 12,\n }}\n testID=\"meso-status-card-next-target\"\n >\n <Text style={{ fontSize: 14, color: SUCCESS }} accessibilityElementsHidden>\n {nextTarget.icon}\n </Text>\n <Text\n style={{\n flexShrink: 1,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: SUCCESS,\n }}\n >\n {nextTarget.text}\n </Text>\n </View>\n )}\n </View>\n </Card>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useMemo, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst sem = getSemanticColors('dark')\n\nconst BRAND_PRIMARY = sem['brand-primary']\n// Line/border color for the dashed projection, used where a className cannot\n// apply (passed as a prop into an inline style, and a per-edge borderTopColor).\nconst PROJECTION_LINE_COLOR = resolveColor('text-tertiary')\nconst STATUS_SUCCESS = sem['status-success']\nconst STATUS_ERROR = sem['status-error']\nconst STATUS_WARNING = sem['status-warning']\nconst GRID_LINE = 'rgba(255,255,255,0.06)'\nconst SUCCESS_PILL_BG = 'rgba(46,213,115,0.10)'\nconst SUCCESS_PILL_BORDER = 'rgba(46,213,115,0.20)'\nconst ERROR_PILL_BG = 'rgba(209,67,67,0.10)'\nconst ERROR_PILL_BORDER = 'rgba(209,67,67,0.20)'\n\n/** Left gutter reserved for y-axis value labels. */\nconst PLOT_LEFT = 26\n/** Approximate tooltip width used for edge clamping. */\nconst TOOLTIP_WIDTH = 124\n\nexport interface StrengthTrendDataPoint {\n /** ISO date string for the session. */\n date: string\n /** Estimated one-rep max in the chart's unit. */\n e1rm: number\n /** Marks a personal-record session (rendered with a star). */\n isPR?: boolean\n /** Optional human label shown in the tooltip instead of the raw date. */\n sessionLabel?: string\n}\n\nexport interface StrengthTrendChartMesoBoundary {\n /** ISO date where the mesocycle boundary falls. */\n date: string\n /** Short label, e.g. \"Hypertrophy\". */\n label: string\n}\n\nexport interface StrengthTrendChartProps extends ViewProps {\n /** Actual e1RM data points, chronological. */\n data: StrengthTrendDataPoint[]\n /** Projected/planned e1RM trajectory, drawn as a dashed line. */\n projection?: StrengthTrendDataPoint[]\n /** Chart plot width in pixels. */\n width: number\n /** Chart plot height in pixels (120-160 for the compact variant). */\n height: number\n /** Mesocycle boundary markers (vertical guides + labels). */\n mesoBoundaries?: StrengthTrendChartMesoBoundary[]\n /** Called when an actual data point is tapped. */\n onPointPress?: (point: StrengthTrendDataPoint) => void\n /** Unit for display and labels. */\n unit: 'lbs' | 'kg'\n /** Animate the left-to-right line draw on mount (default true). */\n animateOnMount?: boolean\n className?: string\n}\n\ninterface Coord {\n x: number\n y: number\n point: StrengthTrendDataPoint\n index: number\n}\n\ninterface Geometry {\n hasData: boolean\n toX: (time: number) => number\n toY: (value: number) => number\n actual: Coord[]\n projection: Coord[]\n gridLines: Array<{ y: number; label: string }>\n boundaries: Array<{ x: number; label: string }>\n}\n\nfunction timeOf(dateStr: string): number {\n const t = Date.parse(dateStr)\n return Number.isNaN(t) ? 0 : t\n}\n\nfunction formatValue(value: number): string {\n return `${Math.round(value)}`\n}\n\nfunction buildGeometry(\n data: StrengthTrendDataPoint[],\n projection: StrengthTrendDataPoint[],\n boundaries: StrengthTrendChartMesoBoundary[],\n width: number,\n height: number,\n): Geometry {\n const values = [...data, ...projection].map((p) => p.e1rm)\n // Empty state keys off actual data only: a projection with no measured\n // sessions still shows the placeholder rather than a \"Current: 0\" chart.\n if (data.length === 0) {\n return {\n hasData: false,\n toX: () => 0,\n toY: () => 0,\n actual: [],\n projection: [],\n gridLines: [],\n boundaries: [],\n }\n }\n\n const times = [\n ...data.map((p) => timeOf(p.date)),\n ...projection.map((p) => timeOf(p.date)),\n ...boundaries.map((b) => timeOf(b.date)),\n ]\n const tMin = Math.min(...times)\n const tMaxRaw = Math.max(...times)\n const tMax = tMaxRaw === tMin ? tMin + 1 : tMaxRaw\n\n const yMin = Math.min(...values)\n const yMax = Math.max(...values)\n const range = yMax - yMin || Math.max(1, yMax * 0.1)\n const padV = range * 0.15\n const domainMin = yMin - padV\n const domainMax = yMax + padV\n\n const innerW = Math.max(1, width - PLOT_LEFT)\n const toX = (time: number) =>\n PLOT_LEFT + ((time - tMin) / (tMax - tMin)) * innerW\n const toY = (value: number) =>\n height - ((value - domainMin) / (domainMax - domainMin)) * height\n\n const project = (points: StrengthTrendDataPoint[]): Coord[] =>\n points.map((point, index) => ({\n x: toX(timeOf(point.date)),\n y: toY(point.e1rm),\n point,\n index,\n }))\n\n const tickValues = Array.from(\n new Set([yMax, (yMin + yMax) / 2, yMin].map((v) => Math.round(v))),\n )\n const gridLines = tickValues.map((v) => ({ y: toY(v), label: formatValue(v) }))\n\n return {\n hasData: true,\n toX,\n toY,\n actual: project(data),\n projection: project(projection),\n gridLines,\n boundaries: boundaries.map((b) => ({\n x: toX(timeOf(b.date)),\n label: b.label,\n })),\n }\n}\n\nfunction computeTrend(\n data: StrengthTrendDataPoint[],\n boundaries: StrengthTrendChartMesoBoundary[],\n): { percent: number; positive: boolean } {\n if (data.length < 2) return { percent: 0, positive: true }\n let series = data\n if (boundaries.length > 0) {\n const lastBoundary = Math.max(...boundaries.map((b) => timeOf(b.date)))\n const filtered = data.filter((p) => timeOf(p.date) >= lastBoundary)\n // The pill is labelled \"this meso\"; if the current meso has <2 points\n // there is no meso trend to show — stay neutral rather than silently\n // reporting the whole-series change under a \"this meso\" label.\n if (filtered.length < 2) return { percent: 0, positive: true }\n series = filtered\n }\n const first = series[0].e1rm\n const last = series[series.length - 1].e1rm\n const percent = first ? ((last - first) / first) * 100 : 0\n return { percent, positive: percent >= 0 }\n}\n\nfunction ChartLine({\n coords,\n color,\n strokeWidth,\n dashed,\n testID,\n}: {\n coords: Coord[]\n color: string\n strokeWidth: number\n dashed?: boolean\n testID: string\n}) {\n return (\n <>\n {coords.map((c, i) => {\n if (i === 0) return null\n const prev = coords[i - 1]\n const dx = c.x - prev.x\n const dy = c.y - prev.y\n const length = Math.sqrt(dx * dx + dy * dy)\n const angle = Math.atan2(dy, dx) * (180 / Math.PI)\n return (\n <View\n key={`${testID}-${i}`}\n testID={testID}\n accessibilityElementsHidden\n style={[\n {\n position: 'absolute',\n left: prev.x,\n top: prev.y,\n width: length,\n transformOrigin: '0 0',\n transform: [{ rotate: `${angle}deg` }],\n },\n dashed\n ? {\n height: 0,\n borderTopWidth: strokeWidth,\n borderStyle: 'dashed',\n borderTopColor: color,\n }\n : {\n height: strokeWidth,\n borderRadius: strokeWidth / 2,\n backgroundColor: color,\n },\n ]}\n />\n )\n })}\n </>\n )\n}\n\n/**\n * Estimated-1RM line chart over time with an optional dashed plan-projection\n * line and PR star markers. Rendered entirely with absolutely-positioned\n * Views (no SVG), following the Sparkline approach. Tapping an actual point\n * opens a tooltip and fires `onPointPress`. A trend pill below the chart\n * summarizes the percentage change for the current mesocycle.\n *\n * @example\n * <StrengthTrendChart\n * data={[{ date: '2026-01-01', e1rm: 225 }, { date: '2026-02-01', e1rm: 245, isPR: true }]}\n * projection={[{ date: '2026-02-01', e1rm: 245 }, { date: '2026-03-01', e1rm: 260 }]}\n * width={320}\n * height={150}\n * unit=\"lbs\"\n * />\n */\nexport function StrengthTrendChart({\n data,\n projection = [],\n width,\n height,\n mesoBoundaries = [],\n onPointPress,\n unit,\n animateOnMount = true,\n className,\n ...props\n}: StrengthTrendChartProps) {\n const geometry = useMemo(\n () => buildGeometry(data, projection, mesoBoundaries, width, height),\n [data, projection, mesoBoundaries, width, height],\n )\n const trend = useMemo(\n () => computeTrend(data, mesoBoundaries),\n [data, mesoBoundaries],\n )\n\n const [reveal] = useState(() => new Animated.Value(animateOnMount ? 0 : 1))\n const [selected, setSelected] = useState<number | null>(null)\n\n useEffect(() => {\n if (!animateOnMount) return\n const animation = Animated.timing(reveal, {\n toValue: 1,\n duration: 600,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [animateOnMount, reveal])\n\n const current = data.length > 0 ? data[data.length - 1].e1rm : 0\n const trendSign = trend.percent >= 0 ? '+' : '-'\n const trendText = `${trendSign}${Math.abs(trend.percent).toFixed(1)}% this meso`\n const ariaLabel = geometry.hasData\n ? `Strength trend chart showing estimated one rep max over time. Current: ${formatValue(current)} ${unit}. Trend: ${trendSign}${Math.abs(trend.percent).toFixed(1)}%`\n : 'Strength trend chart, no data'\n\n if (!geometry.hasData) {\n return (\n <View\n style={{ width }}\n className={cn(className)}\n accessibilityRole=\"image\"\n accessibilityLabel={ariaLabel}\n testID=\"strength-trend-chart-empty\"\n {...props}\n >\n <View\n style={{\n width,\n height,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Text className=\"text-text-tertiary\" style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}>\n No strength data yet\n </Text>\n </View>\n </View>\n )\n }\n\n const revealWidth = reveal.interpolate({\n inputRange: [0, 1],\n outputRange: [0, width],\n })\n\n const selectedCoord =\n selected != null ? geometry.actual[selected] : undefined\n\n return (\n <View\n style={{ width }}\n className={cn(className)}\n testID=\"strength-trend-chart\"\n {...props}\n >\n <View style={{ width, height, position: 'relative' }}>\n {/* Labelled, non-interactive chart canvas (grid + lines + markers). */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n accessibilityRole=\"image\"\n accessibilityLabel={ariaLabel}\n testID=\"strength-trend-chart-canvas\"\n >\n {geometry.gridLines.map((line, i) => (\n <View\n key={`grid-${i}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-gridline\"\n style={{\n position: 'absolute',\n left: PLOT_LEFT,\n right: 0,\n top: line.y,\n height: 1,\n backgroundColor: GRID_LINE,\n }}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: -PLOT_LEFT,\n top: -6,\n width: PLOT_LEFT - 4,\n textAlign: 'right',\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {line.label}\n </Text>\n </View>\n ))}\n\n {geometry.boundaries.map((boundary, i) => (\n <View\n key={`boundary-${i}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-meso-boundary\"\n style={{\n position: 'absolute',\n left: boundary.x,\n top: 0,\n width: 0,\n height,\n borderLeftWidth: 1,\n borderStyle: 'dashed',\n borderLeftColor: 'rgba(255,255,255,0.10)',\n }}\n />\n ))}\n\n <Animated.View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: revealWidth,\n height,\n overflow: 'hidden',\n }}\n testID=\"strength-trend-chart-reveal\"\n >\n <View style={{ width, height, position: 'absolute', top: 0, left: 0 }}>\n <ChartLine\n coords={geometry.projection}\n color={PROJECTION_LINE_COLOR}\n strokeWidth={2}\n dashed\n testID=\"strength-trend-chart-projection-segment\"\n />\n <ChartLine\n coords={geometry.actual}\n color={BRAND_PRIMARY}\n strokeWidth={2.5}\n testID=\"strength-trend-chart-actual-segment\"\n />\n </View>\n </Animated.View>\n\n {geometry.actual.map((c) =>\n c.point.isPR ? (\n <Text\n key={`star-${c.index}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-pr-star\"\n style={{\n position: 'absolute',\n left: c.x - 7,\n top: c.y - 20,\n fontSize: 12,\n color: STATUS_WARNING,\n }}\n >\n ★\n </Text>\n ) : null,\n )}\n </View>\n\n {/* Interactive point overlay (kept out of the image-role canvas). */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n testID=\"strength-trend-chart-points\"\n >\n {geometry.actual.map((c) => {\n const label = c.point.sessionLabel ?? c.point.date\n return (\n <Pressable\n key={`point-${c.index}`}\n testID=\"strength-trend-chart-point\"\n accessibilityRole=\"button\"\n accessibilityLabel={`${label}: ${formatValue(c.point.e1rm)} ${unit}${c.point.isPR ? ', personal record' : ''}`}\n onPress={() => {\n setSelected(c.index)\n onPointPress?.(c.point)\n }}\n style={{\n position: 'absolute',\n left: c.x - 4,\n top: c.y - 4,\n width: 8,\n height: 8,\n borderRadius: 1,\n backgroundColor: BRAND_PRIMARY,\n }}\n />\n )\n })}\n </View>\n\n {selectedCoord && (\n <View\n testID=\"strength-trend-chart-tooltip\"\n accessibilityElementsHidden\n className=\"bg-surface-elevated border-border-strong\"\n style={{\n position: 'absolute',\n left: Math.max(\n 0,\n Math.min(width - TOOLTIP_WIDTH, selectedCoord.x - TOOLTIP_WIDTH / 2),\n ),\n top: Math.max(0, selectedCoord.y - 52),\n maxWidth: TOOLTIP_WIDTH,\n borderWidth: 1,\n borderRadius: 8,\n paddingVertical: 8,\n paddingHorizontal: 10,\n }}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {selectedCoord.point.sessionLabel ?? selectedCoord.point.date}\n </Text>\n <Text\n className=\"text-text-primary\"\n style={{\n marginTop: 2,\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n }}\n >\n {`${formatValue(selectedCoord.point.e1rm)} ${unit}`}\n </Text>\n {selected != null && selected > 0 && (\n <Text\n style={{\n marginTop: 1,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n color:\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0\n ? STATUS_SUCCESS\n : STATUS_ERROR,\n }}\n >\n {`${\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0\n ? '+'\n : '-'\n }${Math.abs(\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm,\n ).toFixed(1)} ${unit}`}\n </Text>\n )}\n </View>\n )}\n </View>\n\n {/* Meso boundary x-axis labels. */}\n {geometry.boundaries.length > 0 && (\n <View\n style={{ width, height: 14, position: 'relative', marginTop: 2 }}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-axis\"\n >\n {geometry.boundaries.map((boundary, i) => (\n <Text\n key={`axis-${i}`}\n testID=\"strength-trend-chart-axis-label\"\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: boundary.x - 24,\n width: 48,\n textAlign: 'center',\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {boundary.label}\n </Text>\n ))}\n </View>\n )}\n\n {/* Trend pill. */}\n <View className=\"flex-row\" style={{ marginTop: 8 }}>\n <View\n testID=\"strength-trend-chart-trend-pill\"\n accessibilityLabel={`Strength trend: ${trendText}`}\n style={{\n paddingVertical: 3,\n paddingHorizontal: 8,\n borderRadius: 4,\n borderWidth: 1,\n backgroundColor: trend.positive ? SUCCESS_PILL_BG : ERROR_PILL_BG,\n borderColor: trend.positive ? SUCCESS_PILL_BORDER : ERROR_PILL_BORDER,\n }}\n >\n <Text\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: trend.positive ? STATUS_SUCCESS : STATUS_ERROR,\n }}\n >\n {trendText}\n </Text>\n </View>\n </View>\n\n {/* Legend. */}\n <View\n className=\"flex-row items-center\"\n style={{ marginTop: 8, gap: 14 }}\n testID=\"strength-trend-chart-legend\"\n >\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <View style={{ width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY }} />\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n Actual\n </Text>\n </View>\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <View\n style={{\n width: 14,\n height: 0,\n borderTopWidth: 2,\n borderStyle: 'dashed',\n borderTopColor: PROJECTION_LINE_COLOR,\n }}\n />\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n Projected\n </Text>\n </View>\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <Text style={{ fontSize: 12, color: STATUS_WARNING }}>★</Text>\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n PR\n </Text>\n </View>\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState, useMemo } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nconst STATUS_SUCCESS = t['status-success']\nconst STATUS_WARNING = t['status-warning']\nconst STATUS_INFO = t['status-info']\n/** Dot outline: near-white ring so load dots read on the band fill and any\n * surface (matches the MesoStatusCard gauge-marker convention). */\nconst DOT_BORDER = '#F3F4F6'\nconst BAND_FILL = 'rgba(46,213,115,0.1)'\nconst BAND_EDGE = 'rgba(46,213,115,0.45)'\nconst PROJECTION_FILL = 'rgba(46,213,115,0.05)'\n\nconst PADDING_LEFT = 28\nconst PADDING_RIGHT = 10\nconst PADDING_TOP = 8\nconst PADDING_BOTTOM = 16\nconst COLUMN_STEP = 4\nconst DOT_SIZE = 8\n\nexport type WorkoutDotStatus = 'within' | 'above' | 'below'\n\nexport interface CapacityBandDataPoint {\n /** ISO-ish date string (e.g. \"2026-06-01\"). */\n date: string\n /** Lower bound of the capacity band (MEV equivalent). */\n bandLow: number\n /** Upper bound of the capacity band (MRV equivalent). */\n bandHigh: number\n}\n\nexport interface WorkoutDot {\n date: string\n /** Actual session load score. */\n load: number\n /** Position of the session relative to the band. */\n status: WorkoutDotStatus\n}\n\nexport interface CapacityBandProjection {\n /** Band shape over the next days if training continues (rises). */\n withTraining: CapacityBandDataPoint[]\n /** Band shape over the next days if resting (drops). */\n withRest: CapacityBandDataPoint[]\n}\n\nexport interface CapacityBandChartProps extends ViewProps {\n /** Capacity band shape over time. */\n band: CapacityBandDataPoint[]\n /** Workout sessions plotted as dots. */\n workouts: WorkoutDot[]\n /** Optional forward projection (next few days). */\n projection?: CapacityBandProjection\n /** Chart width in px. */\n width: number\n /** Chart height in px. */\n height: number\n /** Called when a workout dot is tapped. */\n onWorkoutPress?: (workout: WorkoutDot) => void\n className?: string\n}\n\ninterface PixelPoint {\n x: number\n yHigh: number\n yLow: number\n}\n\nconst DOT_COLORS: Record<WorkoutDotStatus, string> = {\n within: STATUS_SUCCESS,\n above: STATUS_WARNING,\n below: STATUS_INFO,\n}\n\nconst STATUS_PHRASES: Record<WorkoutDotStatus, string> = {\n within: 'within range',\n above: 'above range',\n below: 'below range',\n}\n\nfunction parseTime(date: string): number {\n const parts = date.split('-')\n if (parts.length === 3) {\n return Date.UTC(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2]))\n }\n const parsed = Date.parse(date)\n return Number.isNaN(parsed) ? 0 : parsed\n}\n\nfunction formatDate(date: string): string {\n const parts = date.split('-')\n if (parts.length === 3) return `${Number(parts[1])}/${Number(parts[2])}`\n const d = new Date(date)\n return Number.isNaN(d.getTime()) ? date : `${d.getMonth() + 1}/${d.getDate()}`\n}\n\nfunction toPixels(\n points: CapacityBandDataPoint[],\n toX: (date: string) => number,\n toY: (value: number) => number,\n): PixelPoint[] {\n return points\n .map((p) => ({ x: toX(p.date), yHigh: toY(p.bandHigh), yLow: toY(p.bandLow) }))\n .sort((a, b) => a.x - b.x)\n}\n\nfunction interpEdge(pixels: PixelPoint[], x: number, key: 'yHigh' | 'yLow'): number {\n for (let i = 0; i < pixels.length - 1; i++) {\n const a = pixels[i]\n const b = pixels[i + 1]\n if (x >= a.x && x <= b.x) {\n const t = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x)\n return a[key] + t * (b[key] - a[key])\n }\n }\n return pixels[pixels.length - 1][key]\n}\n\nfunction buildColumns(pixels: PixelPoint[], step: number) {\n if (pixels.length < 2) return []\n const start = pixels[0].x\n const end = pixels[pixels.length - 1].x\n const columns: Array<{ x: number; top: number; height: number }> = []\n for (let x = start; x < end; x += step) {\n const top = interpEdge(pixels, x, 'yHigh')\n const bottom = interpEdge(pixels, x, 'yLow')\n columns.push({ x, top, height: Math.max(0, bottom - top) })\n }\n return columns\n}\n\nfunction buildEdges(pixels: PixelPoint[], key: 'yHigh' | 'yLow') {\n const segments: Array<{ left: number; top: number; length: number; angle: number }> = []\n for (let i = 1; i < pixels.length; i++) {\n const a = pixels[i - 1]\n const b = pixels[i]\n const dx = b.x - a.x\n const dy = b[key] - a[key]\n segments.push({\n left: a.x,\n top: a[key],\n length: Math.sqrt(dx * dx + dy * dy),\n angle: Math.atan2(dy, dx) * (180 / Math.PI),\n })\n }\n return segments\n}\n\nfunction collectValues(\n band: CapacityBandDataPoint[],\n workouts: WorkoutDot[],\n projection?: CapacityBandProjection,\n): number[] {\n const values: number[] = []\n band.forEach((p) => values.push(p.bandLow, p.bandHigh))\n workouts.forEach((w) => values.push(w.load))\n projection?.withTraining.forEach((p) => values.push(p.bandLow, p.bandHigh))\n projection?.withRest.forEach((p) => values.push(p.bandLow, p.bandHigh))\n return values\n}\n\nfunction currentStatus(workouts: WorkoutDot[]): string {\n if (workouts.length === 0) return 'no recent sessions'\n const latest = [...workouts].sort((a, b) => parseTime(b.date) - parseTime(a.date))[0]\n return STATUS_PHRASES[latest.status]\n}\n\n/**\n * Gentler-Streak-inspired fatigue visualization. Renders a shaded capacity\n * band (between a rolling MEV/MRV estimate), workout sessions as colored dots\n * positioned by load, and an optional dashed forward projection that diverges\n * for \"keep training\" (rises) versus \"rest\" (drops). View-based, no SVG:\n * the band fill is a run of vertical columns and the edges/projection are\n * rotated line Views (same technique as Sparkline).\n *\n * @example\n * <CapacityBandChart\n * band={band}\n * workouts={workouts}\n * projection={{ withTraining, withRest }}\n * width={320}\n * height={180}\n * onWorkoutPress={(w) => openSession(w)}\n * />\n */\nexport function CapacityBandChart({\n band,\n workouts,\n projection,\n width,\n height,\n onWorkoutPress,\n className,\n ...props\n}: CapacityBandChartProps) {\n const [reveal] = useState(() => new Animated.Value(0))\n const dotAnims = useMemo(\n () => Array.from({ length: workouts.length }, () => new Animated.Value(0)),\n [workouts.length],\n )\n\n useEffect(() => {\n reveal.setValue(0)\n dotAnims.forEach((a) => a.setValue(0))\n const draw = Animated.timing(reveal, {\n toValue: 1,\n duration: 800,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n const pops = dotAnims.map((a) =>\n Animated.timing(a, {\n toValue: 1,\n duration: 200,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n }),\n )\n const animation = Animated.sequence([draw, Animated.stagger(200, pops)])\n animation.start()\n return () => animation.stop()\n }, [reveal, dotAnims, band.length, workouts.length])\n\n const plotWidth = width - PADDING_LEFT - PADDING_RIGHT\n const plotHeight = height - PADDING_TOP - PADDING_BOTTOM\n\n const scale = useMemo(() => {\n const times = band.map((p) => parseTime(p.date))\n projection?.withTraining.forEach((p) => times.push(parseTime(p.date)))\n projection?.withRest.forEach((p) => times.push(parseTime(p.date)))\n const minT = times.length ? Math.min(...times) : 0\n const maxT = times.length ? Math.max(...times) : 1\n const tRange = maxT - minT || 1\n\n const values = collectValues(band, workouts, projection)\n const minV = values.length ? Math.min(...values) : 0\n const maxV = values.length ? Math.max(...values) : 1\n const pad = (maxV - minV) * 0.1 || 1\n const domainMin = minV - pad\n const domainMax = maxV + pad\n const vRange = domainMax - domainMin || 1\n\n const toX = (date: string) =>\n PADDING_LEFT + ((parseTime(date) - minT) / tRange) * plotWidth\n const toY = (value: number) =>\n PADDING_TOP + (1 - (value - domainMin) / vRange) * plotHeight\n return { toX, toY }\n }, [band, workouts, projection, plotWidth, plotHeight])\n\n if (band.length === 0) {\n return (\n <View\n style={{ width, height }}\n className={className}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Training capacity band chart, no data\"\n testID=\"capacity-band-chart-empty\"\n {...props}\n />\n )\n }\n\n const { toX, toY } = scale\n const bandPixels = toPixels(band, toX, toY)\n const columns = buildColumns(bandPixels, COLUMN_STEP)\n const topEdge = buildEdges(bandPixels, 'yHigh')\n const bottomEdge = buildEdges(bandPixels, 'yLow')\n\n const lastBandPoint = band[band.length - 1]\n const trainingPixels = projection\n ? toPixels([lastBandPoint, ...projection.withTraining], toX, toY)\n : []\n const restPixels = projection\n ? toPixels([lastBandPoint, ...projection.withRest], toX, toY)\n : []\n\n const labelStride = Math.max(1, Math.ceil(band.length / 5))\n const revealWidth = reveal.interpolate({ inputRange: [0, 1], outputRange: [0, width] })\n\n const renderColumns = (cols: ReturnType<typeof buildColumns>, color: string, key: string) =>\n cols.map((col, i) => (\n <View\n key={`${key}-${i}`}\n style={{\n position: 'absolute',\n left: col.x,\n top: col.top,\n width: COLUMN_STEP + 0.5,\n height: col.height,\n backgroundColor: color,\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID={key}\n />\n ))\n\n const renderEdges = (\n segments: ReturnType<typeof buildEdges>,\n color: string,\n dashed: boolean,\n key: string,\n ) =>\n segments.map((seg, i) => (\n <View\n key={`${key}-${i}`}\n style={{\n position: 'absolute',\n left: seg.left,\n top: seg.top,\n width: seg.length,\n height: dashed ? 0 : 1.5,\n borderTopWidth: dashed ? 1 : 0,\n borderTopColor: dashed ? color : undefined,\n borderStyle: dashed ? 'dashed' : 'solid',\n backgroundColor: dashed ? undefined : color,\n opacity: dashed ? 0.7 : 1,\n transformOrigin: '0 0',\n transform: [{ rotate: `${seg.angle}deg` }],\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID={key}\n />\n ))\n\n return (\n <View\n style={{ width, height, position: 'relative' }}\n className={className}\n testID=\"capacity-band-chart-root\"\n {...props}\n >\n {/* Static visual layer carries the image role; interactive dots live as\n siblings so the image role has no focusable descendants. */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n accessibilityRole=\"image\"\n accessibilityLabel={`Training capacity band chart. Current capacity: ${currentStatus(\n workouts,\n )}. ${workouts.length} workout${workouts.length === 1 ? '' : 's'} shown.`}\n testID=\"capacity-band-chart\"\n >\n {/* Band + projection draw left-to-right via an animated clip. */}\n <Animated.View\n style={{ position: 'absolute', top: 0, left: 0, height, width: revealWidth, overflow: 'hidden' }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-reveal\"\n >\n <View style={{ width, height, position: 'relative' }}>\n {projection && (\n <View testID=\"capacity-band-chart-projection\">\n {renderColumns(buildColumns(trainingPixels, COLUMN_STEP), PROJECTION_FILL, 'capacity-band-chart-projection-fill')}\n {renderColumns(buildColumns(restPixels, COLUMN_STEP), PROJECTION_FILL, 'capacity-band-chart-projection-fill')}\n {renderEdges(buildEdges(trainingPixels, 'yHigh'), STATUS_SUCCESS, true, 'capacity-band-chart-projection-training')}\n {renderEdges(buildEdges(trainingPixels, 'yLow'), STATUS_SUCCESS, true, 'capacity-band-chart-projection-training')}\n {renderEdges(buildEdges(restPixels, 'yHigh'), STATUS_INFO, true, 'capacity-band-chart-projection-rest')}\n {renderEdges(buildEdges(restPixels, 'yLow'), STATUS_INFO, true, 'capacity-band-chart-projection-rest')}\n <Text\n style={{\n position: 'absolute',\n left: trainingPixels[trainingPixels.length - 1]?.x + 2,\n top: trainingPixels[trainingPixels.length - 1]?.yHigh - 12,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n color: STATUS_SUCCESS,\n }}\n testID=\"capacity-band-chart-projection-training-label\"\n >\n Training\n </Text>\n <Text\n style={{\n position: 'absolute',\n left: restPixels[restPixels.length - 1]?.x + 2,\n top: restPixels[restPixels.length - 1]?.yLow + 2,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n color: STATUS_INFO,\n }}\n testID=\"capacity-band-chart-projection-rest-label\"\n >\n Rest\n </Text>\n </View>\n )}\n\n <View testID=\"capacity-band-chart-band\">\n {renderColumns(columns, BAND_FILL, 'capacity-band-chart-band-cell')}\n </View>\n {renderEdges(topEdge, BAND_EDGE, false, 'capacity-band-chart-edge-top')}\n {renderEdges(bottomEdge, BAND_EDGE, false, 'capacity-band-chart-edge-bottom')}\n </View>\n </Animated.View>\n\n {/* Y axis conceptual label (no numbers). */}\n <Text\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: PADDING_LEFT / 2 - 14,\n top: PADDING_TOP + plotHeight / 2 - 7,\n width: 32,\n textAlign: 'center',\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n transform: [{ rotate: '-90deg' }],\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-y-axis-label\"\n >\n Load\n </Text>\n\n {/* X axis date labels (subset to avoid overlap). */}\n {band.map((point, i) => {\n if (i % labelStride !== 0 && i !== band.length - 1) return null\n return (\n <Text\n key={`x-${point.date}`}\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: toX(point.date) - 14,\n top: height - PADDING_BOTTOM + 2,\n width: 28,\n textAlign: 'center',\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-x-label\"\n >\n {formatDate(point.date)}\n </Text>\n )\n })}\n </View>\n\n {/* Workout dots — scale in after the band draws. */}\n {workouts.map((workout, i) => {\n const cx = toX(workout.date)\n const cy = toY(workout.load)\n const color = DOT_COLORS[workout.status]\n const dotStyle = {\n width: DOT_SIZE,\n height: DOT_SIZE,\n borderRadius: DOT_SIZE / 2,\n backgroundColor: color,\n borderWidth: 2,\n borderColor: DOT_BORDER,\n }\n const label = `Workout on ${formatDate(workout.date)}, load ${workout.load}, ${\n STATUS_PHRASES[workout.status]\n }`\n return (\n <Animated.View\n key={`dot-${workout.date}-${i}`}\n style={{\n position: 'absolute',\n left: cx - DOT_SIZE / 2,\n top: cy - DOT_SIZE / 2,\n transform: [{ scale: dotAnims[i] ?? 1 }],\n }}\n testID=\"capacity-band-chart-dot-wrapper\"\n >\n {onWorkoutPress ? (\n <Pressable\n onPress={() => onWorkoutPress(workout)}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={dotStyle}\n testID=\"capacity-band-chart-dot\"\n />\n ) : (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={dotStyle}\n testID=\"capacity-band-chart-dot\"\n />\n )}\n </Animated.View>\n )\n })}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { MesoStatusCard, type MesoStatusCardProps } from './MesoStatusCard'\nimport {\n StrengthTrendChart,\n type StrengthTrendDataPoint,\n type StrengthTrendChartMesoBoundary,\n} from './StrengthTrendChart'\nimport {\n CapacityBandChart,\n type CapacityBandDataPoint,\n type CapacityBandProjection,\n type WorkoutDot,\n} from './CapacityBandChart'\nimport { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'\nimport { type SetRowProps } from './SetRow'\nimport {\n VelocityStrip,\n calculateMeanVelocity,\n calculateVelocityLoss,\n type VelocityZoneBandProp,\n} from './VelocityStrip'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { cn } from '../../../utils/cn'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** Inner plot width: page width 390 − 16 page padding − 12 card padding on each side. */\nconst CHART_WIDTH = 326\nconst CHART_HEIGHT = 150\n\n/** Which tab of the exercise detail view is showing. */\nexport type ExerciseDetailTab = 'progress' | 'history' | 'advanced'\n\n/** Tabs in display order. */\nexport const EXERCISE_DETAIL_TABS: Array<{ key: ExerciseDetailTab; label: string }> = [\n { key: 'progress', label: 'Progress' },\n { key: 'history', label: 'History' },\n { key: 'advanced', label: 'Advanced' },\n]\n\n/** Identity + headline stats for the exercise being inspected. */\nexport interface ExerciseDetailHeader {\n /** Exercise name, e.g. \"Barbell Bench Press\". */\n name: string\n /** Context line, e.g. \"Chest · Barbell\". */\n subtitle: string\n /** Unit used across the page. */\n unit: 'lbs' | 'kg'\n /** Current estimated one-rep max, shown as a header pill. */\n currentE1rm?: number\n}\n\n/**\n * A single expandable entry — one progression week or one logged session.\n * Projected onto an `ExerciseCard`, so it collapses to a summary and expands\n * to its `SetRow` breakdown.\n */\nexport interface ExerciseDetailEntry {\n /** Stable id for inline-expansion selection. */\n id: string\n /** Row title, e.g. \"Week 3\" or \"Mon, Jun 16\". */\n title: string\n /** Collapsed summary (sets × reps @ weight). */\n summary?: ExerciseCardProps['summary']\n /** Estimated one-rep max, feeding the page's best-e1RM stat. */\n e1rm?: { value: number; unit: 'lbs' | 'kg' }\n /** Flags a personal-record entry. */\n isPR?: boolean\n /** Prescribed tempo, revealed when expanded. */\n tempo?: ExerciseCardProps['tempo']\n /** Per-set breakdown revealed when expanded. */\n sets: SetRowProps[]\n}\n\n/** Strength-trend inputs for the Progress tab chart. */\nexport interface ExerciseTrend {\n /** Measured e1RM data points, chronological. */\n data: StrengthTrendDataPoint[]\n /** Planned/projected trajectory (dashed line). */\n projection?: StrengthTrendDataPoint[]\n /** Mesocycle boundary guides. */\n mesoBoundaries?: StrengthTrendChartMesoBoundary[]\n}\n\n/** One set's velocity trace for the Advanced tab breakdown. */\nexport interface ExerciseVbtSet {\n /** Row label, e.g. \"Set 1\". */\n label: string\n /** Per-rep mean concentric velocities (m/s). */\n velocities: number[]\n}\n\n/** Velocity-based-training inputs for the Advanced tab. */\nexport interface ExerciseVbt {\n /** Capacity band shape over time. */\n band: CapacityBandDataPoint[]\n /** Sessions plotted against the band. */\n workouts: WorkoutDot[]\n /** Optional forward band projection. */\n projection?: CapacityBandProjection\n /** Per-set velocity traces for the most recent session. */\n sets: ExerciseVbtSet[]\n /** Optional velocity-zone bands for this exercise (WA `VelocityZones.bands`). */\n zones?: readonly VelocityZoneBandProp[]\n}\n\n/** Page-level roll-up of the logged sessions. */\nexport interface ExerciseDetailStats {\n /** Number of logged sessions. */\n sessions: number\n /** Best estimated one-rep max seen, or null if none recorded. */\n bestE1rm: number | null\n /** Count of PR entries. */\n prCount: number\n}\n\n/** Aggregate velocity readout for the Advanced tab. */\nexport interface VbtSummary {\n /** Mean concentric velocity across every logged rep. */\n meanVelocity: number\n /** Worst within-set velocity loss (%), i.e. the most-fatigued set. */\n velocityLoss: number\n}\n\nexport interface ExerciseDetailPageProps extends ViewProps {\n /** Exercise identity + headline stats. */\n exercise: ExerciseDetailHeader\n /** Mesocycle context banner (Progress tab). */\n meso: MesoStatusCardProps\n /** Strength trend inputs (Progress tab). */\n trend: ExerciseTrend\n /** Week-by-week progression entries (Progress tab). */\n progression: ExerciseDetailEntry[]\n /** All logged sessions (History tab). */\n history: ExerciseDetailEntry[]\n /** Velocity-based-training inputs (Advanced tab). */\n vbt: ExerciseVbt\n className?: string\n}\n\n/** Roll up logged sessions into the page summary (pure, testable). */\nexport function deriveExerciseStats(entries: ExerciseDetailEntry[]): ExerciseDetailStats {\n let bestE1rm: number | null = null\n let prCount = 0\n for (const entry of entries) {\n if (entry.e1rm != null && (bestE1rm == null || entry.e1rm.value > bestE1rm)) {\n bestE1rm = entry.e1rm.value\n }\n if (entry.isPR) prCount += 1\n }\n return { sessions: entries.length, bestE1rm, prCount }\n}\n\n/** Project an entry onto ExerciseCard props, wiring inline expansion (pure). */\nexport function toExerciseCardProps(\n entry: ExerciseDetailEntry,\n expanded: boolean,\n onToggle: () => void\n): ExerciseCardProps {\n return {\n name: entry.title,\n expanded,\n onExpandedChange: onToggle,\n summary: entry.summary,\n isPR: entry.isPR,\n tempo: entry.tempo,\n sets: expanded ? entry.sets : undefined,\n }\n}\n\n/** Aggregate per-set velocity traces into the Advanced readout (pure). */\nexport function summarizeVbt(sets: ExerciseVbtSet[]): VbtSummary {\n const allReps = sets.flatMap((set) => set.velocities)\n const meanVelocity = calculateMeanVelocity(allReps)\n let velocityLoss = 0\n for (const set of sets) {\n velocityLoss = Math.max(velocityLoss, calculateVelocityLoss(set.velocities))\n }\n return { meanVelocity, velocityLoss }\n}\n\ninterface TabBarProps {\n active: ExerciseDetailTab\n onSelect: (tab: ExerciseDetailTab) => void\n}\n\nfunction TabBar({ active, onSelect }: TabBarProps) {\n return (\n <View\n className=\"flex-row\"\n style={{\n borderBottomWidth: 1,\n borderBottomColor: resolveColor('border-default'),\n }}\n accessibilityRole={'tablist' as ViewProps['accessibilityRole']}\n testID=\"exercise-detail-page-tabs\"\n >\n {EXERCISE_DETAIL_TABS.map(({ key, label }) => {\n const isActive = key === active\n return (\n <Pressable\n key={key}\n onPress={() => onSelect(key)}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: isActive }}\n style={{\n flex: 1,\n alignItems: 'center',\n paddingVertical: 10,\n borderBottomWidth: 2,\n borderBottomColor: isActive ? BRAND_PRIMARY : 'transparent',\n }}\n testID={`exercise-detail-page-tab-${key}`}\n >\n <Text\n className={isActive ? 'text-text-primary' : 'text-text-tertiary'}\n style={{\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: isActive ? '700' : '500',\n }}\n >\n {label}\n </Text>\n </Pressable>\n )\n })}\n </View>\n )\n}\n\nconst STAT_CARDS: Array<{ key: keyof ExerciseDetailStats; label: string }> = [\n { key: 'sessions', label: 'Sessions' },\n { key: 'bestE1rm', label: 'Best e1RM' },\n { key: 'prCount', label: 'PRs' },\n]\n\nfunction StatStrip({ stats, unit }: { stats: ExerciseDetailStats; unit: 'lbs' | 'kg' }) {\n return (\n <View className=\"flex-row\" style={{ gap: 8 }} testID=\"exercise-detail-page-stats\">\n {STAT_CARDS.map(({ key, label }) => {\n const raw = stats[key]\n const value = key === 'bestE1rm' ? (raw == null ? '—' : `${raw} ${unit}`) : `${raw}`\n return (\n <View\n key={key}\n className=\"bg-surface-elevated border-border\"\n style={{\n flex: 1,\n padding: 12,\n borderRadius: 10,\n borderWidth: 1,\n }}\n testID={`exercise-detail-page-stat-${key}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 18,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n >\n {value}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n marginTop: 2,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {label}\n </Text>\n </View>\n )\n })}\n </View>\n )\n}\n\nfunction SectionCard({\n title,\n children,\n testID,\n}: {\n title: string\n children: React.ReactNode\n testID: string\n}) {\n return (\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n padding: 12,\n gap: 10,\n }}\n testID={testID}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n }}\n >\n {title}\n </Text>\n {children}\n </View>\n )\n}\n\ninterface EntryListProps {\n entries: ExerciseDetailEntry[]\n expandedId: string | null\n onToggle: (id: string) => void\n emptyLabel: string\n testID: string\n}\n\nfunction EntryList({ entries, expandedId, onToggle, emptyLabel, testID }: EntryListProps) {\n if (entries.length === 0) {\n return (\n <Text\n className=\"text-text-tertiary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID={`${testID}-empty`}\n >\n {emptyLabel}\n </Text>\n )\n }\n return (\n <View style={{ gap: 8 }} testID={testID}>\n {entries.map((entry) => (\n <ExerciseCard\n key={entry.id}\n {...toExerciseCardProps(entry, entry.id === expandedId, () => onToggle(entry.id))}\n />\n ))}\n </View>\n )\n}\n\nfunction VbtBreakdown({\n sets,\n zones,\n}: {\n sets: ExerciseVbtSet[]\n zones?: readonly VelocityZoneBandProp[]\n}) {\n return (\n <View style={{ gap: 10 }} testID=\"exercise-detail-page-vbt-breakdown\">\n {sets.map((set) => {\n const mean = calculateMeanVelocity(set.velocities)\n const loss = calculateVelocityLoss(set.velocities)\n return (\n <View\n key={set.label}\n className=\"flex-row items-center\"\n style={{ gap: 10 }}\n testID=\"exercise-detail-page-vbt-set\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n width: 44,\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n }}\n >\n {set.label}\n </Text>\n <View className=\"flex-1\" style={{ height: 8, justifyContent: 'center' }}>\n <VelocityStrip velocities={set.velocities} zones={zones} variant=\"mini\" />\n </View>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontVariant: ['tabular-nums'],\n }}\n >\n {`${mean.toFixed(2)} · -${loss}%`}\n </Text>\n </View>\n )\n })}\n </View>\n )\n}\n\nfunction VbtSummaryRow({ summary }: { summary: VbtSummary }) {\n const cells = [\n { label: 'Mean Velocity', value: `${summary.meanVelocity.toFixed(2)} m/s` },\n { label: 'Peak Vel. Loss', value: `-${summary.velocityLoss}%` },\n ]\n return (\n <View className=\"flex-row\" style={{ gap: 8 }} testID=\"exercise-detail-page-vbt-summary\">\n {cells.map((cell) => (\n <View\n key={cell.label}\n className=\"bg-surface-elevated border-border\"\n style={{\n flex: 1,\n padding: 12,\n borderRadius: 10,\n borderWidth: 1,\n }}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 16,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n >\n {cell.value}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n marginTop: 2,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {cell.label}\n </Text>\n </View>\n ))}\n </View>\n )\n}\n\n/**\n * ExerciseDetailPage — a tabbed per-exercise view. A shared header (name,\n * context line, current e1RM pill) sits above a Progress / History / Advanced\n * tab bar. Progress composes the `MesoStatusCard` context banner, a stats\n * strip, a `StrengthTrendChart`, and a week-by-week progression list with\n * inline `ExerciseCard` expansion. History lists every logged session with the\n * same inline expansion. Advanced surfaces VBT data via a `CapacityBandChart`,\n * a velocity summary, and a per-set `VelocityStrip` breakdown. Tab and\n * per-list expansion are page-level state; children keep their own styles.\n *\n * @example\n * <ExerciseDetailPage\n * exercise={exercise}\n * meso={meso}\n * trend={trend}\n * progression={progression}\n * history={history}\n * vbt={vbt}\n * />\n */\nexport function ExerciseDetailPage({\n exercise,\n meso,\n trend,\n progression,\n history,\n vbt,\n className,\n ...props\n}: ExerciseDetailPageProps) {\n const [tab, setTab] = useState<ExerciseDetailTab>('progress')\n const [expandedProgressId, setExpandedProgressId] = useState<string | null>(null)\n const [expandedHistoryId, setExpandedHistoryId] = useState<string | null>(null)\n\n const stats = useMemo(() => deriveExerciseStats(history), [history])\n const vbtSummary = useMemo(() => summarizeVbt(vbt.sets), [vbt.sets])\n\n const toggle =\n (setId: (updater: (current: string | null) => string | null) => void) => (id: string) =>\n setId((current) => (current === id ? null : id))\n\n return (\n <View\n className={cn('bg-background-base', className)}\n style={{ width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={exercise.name}\n testID=\"exercise-detail-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"exercise-detail-page-content\">\n <View\n className=\"flex-row items-start justify-between\"\n style={{ gap: 8 }}\n testID=\"exercise-detail-page-header\"\n >\n <View style={{ flexShrink: 1 }}>\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-detail-page-title\"\n >\n {exercise.name}\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 2,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"exercise-detail-page-subtitle\"\n >\n {exercise.subtitle}\n </Text>\n </View>\n {exercise.currentE1rm != null && (\n <View\n style={{\n paddingVertical: 4,\n paddingHorizontal: 10,\n borderRadius: 6,\n backgroundColor: 'rgba(255,121,0,0.10)',\n borderWidth: 1,\n borderColor: 'rgba(255,121,0,0.25)',\n }}\n testID=\"exercise-detail-page-e1rm\"\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n e1RM\n </Text>\n <Text\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n color: BRAND_PRIMARY,\n }}\n >\n {`${exercise.currentE1rm} ${exercise.unit}`}\n </Text>\n </View>\n )}\n </View>\n\n <TabBar active={tab} onSelect={setTab} />\n\n {tab === 'progress' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-progress\">\n <MesoStatusCard {...meso} />\n <StatStrip stats={stats} unit={exercise.unit} />\n <SectionCard title=\"Strength Trend\" testID=\"exercise-detail-page-trend\">\n <StrengthTrendChart\n data={trend.data}\n projection={trend.projection}\n mesoBoundaries={trend.mesoBoundaries}\n width={CHART_WIDTH}\n height={CHART_HEIGHT}\n unit={exercise.unit}\n animateOnMount={false}\n />\n </SectionCard>\n <SectionCard title=\"Week-by-Week\" testID=\"exercise-detail-page-progression\">\n <EntryList\n entries={progression}\n expandedId={expandedProgressId}\n onToggle={toggle(setExpandedProgressId)}\n emptyLabel=\"No progression logged yet\"\n testID=\"exercise-detail-page-progression-list\"\n />\n </SectionCard>\n </View>\n )}\n\n {tab === 'history' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-history\">\n <SectionCard title=\"All Sessions\" testID=\"exercise-detail-page-history\">\n <EntryList\n entries={history}\n expandedId={expandedHistoryId}\n onToggle={toggle(setExpandedHistoryId)}\n emptyLabel=\"No sessions logged yet\"\n testID=\"exercise-detail-page-history-list\"\n />\n </SectionCard>\n </View>\n )}\n\n {tab === 'advanced' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-advanced\">\n <SectionCard title=\"Capacity Band\" testID=\"exercise-detail-page-capacity\">\n <CapacityBandChart\n band={vbt.band}\n workouts={vbt.workouts}\n projection={vbt.projection}\n width={CHART_WIDTH}\n height={CHART_HEIGHT}\n />\n </SectionCard>\n <VbtSummaryRow summary={vbtSummary} />\n <SectionCard title=\"Velocity Breakdown\" testID=\"exercise-detail-page-velocity\">\n <VbtBreakdown sets={vbt.sets} zones={vbt.zones} />\n </SectionCard>\n </View>\n )}\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState } from 'react'\nimport { View, Pressable, Animated, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport type MesoStatus = 'completed' | 'current' | 'upcoming'\n\nexport interface Meso {\n id: string\n name: string\n weekCount: number\n status: MesoStatus\n /**\n * 1-based week index of progress within a `current` meso.\n * Drives the solid fill width. Ignored for non-current mesos.\n */\n currentWeek?: number\n}\n\nexport interface MesoProgressBarProps extends ViewProps {\n mesos: Meso[]\n activeMesoId: string | null\n onMesoPress: (mesoId: string) => void\n className?: string\n}\n\nconst segmentBgColors: Record<MesoStatus, string> = {\n completed: 'rgba(46,213,115,0.3)',\n current: 'rgba(255,121,0,0.5)',\n upcoming: 'rgba(255,255,255,0.06)',\n}\n\nfunction clampProgress(currentWeek: number | undefined, weekCount: number): number {\n if (currentWeek == null || weekCount <= 0) return 0\n const ratio = currentWeek / weekCount\n return Math.max(0, Math.min(1, ratio))\n}\n\ninterface SegmentProps {\n meso: Meso\n isActive: boolean\n onPress: (id: string) => void\n}\n\nfunction MesoSegment({ meso, isActive, onPress }: SegmentProps) {\n const [pressScale] = useState(() => new Animated.Value(1))\n\n const handlePressIn = () => {\n Animated.timing(pressScale, {\n toValue: 0.98,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const handlePressOut = () => {\n Animated.timing(pressScale, {\n toValue: 1,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const progress = meso.status === 'current'\n ? clampProgress(meso.currentWeek, meso.weekCount)\n : 0\n\n // weekCount drives the segment's flex width; guard 0 / negative so flex stays\n // a valid positive value and the segment never collapses out of the layout.\n const segmentFlex = Math.max(1, meso.weekCount)\n\n return (\n <Pressable\n style={{ flex: segmentFlex }}\n onPress={() => onPress(meso.id)}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n accessibilityRole=\"button\"\n accessibilityLabel={`${meso.name}, ${meso.status}`}\n testID={`meso-segment-${meso.id}`}\n >\n <Animated.View\n style={[\n {\n height: 8,\n borderRadius: 4,\n overflow: 'hidden',\n backgroundColor: segmentBgColors[meso.status],\n transform: [{ scale: pressScale }],\n },\n isActive\n ? {\n borderWidth: 2,\n borderColor: BRAND_PRIMARY,\n transform: [{ scale: 1.02 }, { scale: pressScale }],\n }\n : undefined,\n ]}\n testID={`meso-segment-inner-${meso.id}`}\n >\n {meso.status === 'current' && progress > 0 && (\n <View\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: `${progress * 100}%`,\n backgroundColor: BRAND_PRIMARY,\n }}\n testID={`meso-segment-fill-${meso.id}`}\n />\n )}\n </Animated.View>\n </Pressable>\n )\n}\n\n/**\n * Segmented horizontal bar of mesocycles. Each segment is tappable and its\n * flex width is proportional to the meso's `weekCount`. The active segment is\n * highlighted with a 2px brand border to stay in sync with MesoCard selection.\n *\n * @example\n * <MesoProgressBar\n * mesos={[\n * { id: 'm1', name: 'Accumulation', weekCount: 4, status: 'completed' },\n * { id: 'm2', name: 'Intensification', weekCount: 3, status: 'current', currentWeek: 2 },\n * { id: 'm3', name: 'Peak', weekCount: 2, status: 'upcoming' },\n * ]}\n * activeMesoId=\"m2\"\n * onMesoPress={(id) => console.log(id)}\n * />\n */\nexport function MesoProgressBar({\n mesos,\n activeMesoId,\n onMesoPress,\n className,\n ...props\n}: MesoProgressBarProps) {\n return (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n gap: 2,\n paddingHorizontal: 16,\n alignItems: 'center',\n }}\n testID=\"meso-progress-bar\"\n {...props}\n >\n {mesos.map((meso) => (\n <MesoSegment\n key={meso.id}\n meso={meso}\n isActive={meso.id === activeMesoId}\n onPress={onMesoPress}\n />\n ))}\n </View>\n )\n}\n","import { View, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\n\nexport type IndicatorSize = 'xs' | 'sm' | 'md' | 'lg'\nexport type IndicatorColor =\n | 'default'\n | 'primary'\n | 'success'\n | 'live'\n | 'error'\n | 'warning'\n | 'info'\n | 'error-vivid'\n\n/** How a pulsing indicator animates: a subtle opacity fade, or an expanding ring. */\nexport type IndicatorPulse = 'opacity' | 'ping'\n\nexport interface IndicatorProps extends ViewProps {\n /** Dot size */\n size?: IndicatorSize\n /** Semantic color */\n color?: IndicatorColor\n /** Custom hex color (overrides color prop) */\n customColor?: string\n /** Add a glow shadow effect */\n glow?: boolean\n /** Add a ring border */\n ring?: boolean\n /** Animate for live/active status. `true` = opacity fade; `'ping'` = expanding ring. */\n pulse?: boolean | IndicatorPulse\n /** Additional className */\n className?: string\n}\n\nconst sizeStyles: Record<IndicatorSize, string> = {\n xs: 'w-1 h-1',\n sm: 'w-1.5 h-1.5',\n md: 'w-2 h-2',\n lg: 'w-2.5 h-2.5',\n}\n\nconst colorStyles: Record<IndicatorColor, string> = {\n default: 'bg-text-tertiary',\n primary: 'bg-brand-primary',\n success: 'bg-status-success',\n live: 'bg-status-live',\n error: 'bg-status-error',\n warning: 'bg-status-warning',\n info: 'bg-status-info',\n 'error-vivid': 'bg-status-error-vivid',\n}\n\nexport function Indicator({\n size = 'sm',\n color = 'default',\n customColor,\n glow = false,\n ring = false,\n pulse = false,\n className,\n style,\n ...props\n}: IndicatorProps) {\n const pulseMode: IndicatorPulse | false = pulse === true ? 'opacity' : pulse || false\n const colorClass = !customColor ? colorStyles[color] : undefined\n const colorStyle = customColor ? { backgroundColor: customColor } : undefined\n\n // Expanding-ring pulse: a ping layer behind the solid dot (for live/active status).\n if (pulseMode === 'ping') {\n return (\n <View className={cn('relative', sizeStyles[size], className)} style={style} {...props}>\n <View\n className={cn('absolute inset-0 rounded-full animate-ping', colorClass)}\n style={colorStyle}\n />\n <View\n className={cn(\n 'relative rounded-full',\n sizeStyles[size],\n colorClass,\n ring && 'border-2 border-background-base'\n )}\n style={colorStyle}\n />\n </View>\n )\n }\n\n const dynamicStyle = {\n ...(typeof style === 'object' ? style : {}),\n ...(colorStyle ?? {}),\n ...(glow && customColor ? { boxShadow: `0 0 6px ${customColor}` } : {}),\n }\n\n return (\n <View\n className={cn(\n 'rounded-full shrink-0',\n sizeStyles[size],\n colorClass,\n pulseMode === 'opacity' && 'animate-pulse',\n ring && 'border-2 border-background-base',\n glow &&\n !customColor &&\n (color === 'success' || color === 'live') &&\n 'shadow-[0_0_6px_rgba(46,213,115,0.6)]',\n glow && !customColor && color === 'error' && 'shadow-[0_0_6px_rgba(239,68,68,0.6)]',\n glow && !customColor && color === 'warning' && 'shadow-[0_0_6px_rgba(245,158,11,0.6)]',\n glow && !customColor && color === 'primary' && 'shadow-[0_0_6px_rgba(255,121,0,0.6)]',\n glow && !customColor && color === 'error-vivid' && 'shadow-[0_0_6px_rgba(255,71,87,0.6)]',\n className\n )}\n style={Object.keys(dynamicStyle).length > 0 ? dynamicStyle : style}\n {...props}\n />\n )\n}\n","import React from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { Indicator, type IndicatorColor } from '../indicator'\n\nexport type BadgeVariant = 'solid' | 'subtle' | 'outline'\nexport type BadgeColor = 'default' | 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'\nexport type BadgeSize = 'sm' | 'md' | 'lg'\n\nexport interface BadgeProps extends ViewProps {\n /** Visual variant */\n variant?: BadgeVariant\n /** Color scheme */\n color?: BadgeColor\n /** Size */\n size?: BadgeSize\n /** Show a leading indicator dot */\n dot?: boolean\n /** Color for the dot indicator (defaults to match badge color) */\n dotColor?: IndicatorColor\n /** Additional className */\n className?: string\n children?: React.ReactNode\n}\n\nconst variantColorStyles: Record<BadgeVariant, Record<BadgeColor, string>> = {\n solid: {\n default: 'bg-border-strong text-text-inverse',\n primary: 'bg-brand-primary text-text-inverse',\n secondary: 'bg-brand-secondary text-text-inverse',\n success: 'bg-status-success text-text-inverse',\n error: 'bg-status-error text-text-inverse',\n warning: 'bg-status-warning text-text-inverse',\n info: 'bg-status-info text-text-inverse',\n },\n subtle: {\n default: 'bg-surface-raised text-text-secondary',\n primary: 'bg-brand-primary-subtle text-brand-primary',\n secondary: 'bg-brand-secondary-subtle text-brand-secondary',\n success: 'bg-status-success-subtle text-status-success',\n error: 'bg-status-error-subtle text-status-error',\n warning: 'bg-status-warning-subtle text-status-warning',\n info: 'bg-status-info-subtle text-status-info',\n },\n outline: {\n default: 'border border-border-strong text-text-secondary',\n primary: 'border border-brand-primary text-brand-primary',\n secondary: 'border border-brand-secondary text-brand-secondary',\n success: 'border border-status-success text-status-success',\n error: 'border border-status-error text-status-error',\n warning: 'border border-status-warning text-status-warning',\n info: 'border border-status-info text-status-info',\n },\n}\n\nconst sizeStyles: Record<BadgeSize, string> = {\n sm: 'px-1.5 py-0.5 text-xs',\n md: 'px-2 py-0.5 text-xs',\n lg: 'px-2.5 py-1 text-sm',\n}\n\n/**\n * Badge component for status indicators and labels.\n *\n * @example\n * <Badge color=\"success\">Active</Badge>\n * <Badge variant=\"outline\" color=\"warning\">Pending</Badge>\n */\nexport function Badge({\n variant = 'subtle',\n color = 'default',\n size = 'md',\n dot,\n dotColor,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <View\n className={cn(\n 'inline-flex items-center justify-center rounded-full font-medium',\n variantColorStyles[variant][color],\n sizeStyles[size],\n className\n )}\n {...props}\n >\n {dot && (\n <Indicator\n size=\"xs\"\n color={dotColor ?? (color === 'default' || color === 'secondary' ? 'default' : color as IndicatorColor)}\n className=\"mr-0.5\"\n />\n )}\n {typeof children === 'string' ? (\n <Text className=\"text-inherit font-medium\">{children}</Text>\n ) : (\n children\n )}\n </View>\n )\n}\n\nexport interface BadgeTextProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Text component for Badge content.\n */\nexport function BadgeText({ children, className }: BadgeTextProps) {\n return (\n <Text className={cn('text-inherit font-medium', className)}>\n {children}\n </Text>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { WORKOUT_PILL_DELOAD } from '../../../theme/extracted-colors-dataviz'\n\nconst t = getSemanticColors('dark')\n\n/**\n * Spec statuses: completed | current | upcoming | deload.\n * `next` and `missed` are additive extras supported by this implementation.\n */\nexport type WorkoutPillStatus = 'completed' | 'current' | 'upcoming' | 'deload' | 'next' | 'missed'\n\nexport interface WorkoutPillProps extends ViewProps {\n name: string\n status: WorkoutPillStatus\n /** Force pulsing animation. Defaults to pulsing only on `current` status. */\n pulse?: boolean\n onPress?: () => void\n highlighted?: boolean\n className?: string\n}\n\nconst statusBgColors: Record<WorkoutPillStatus, string> = {\n completed: 'rgba(46,213,115,0.15)',\n current: 'rgba(255,121,0,0.15)',\n next: 'transparent',\n upcoming: '#1C1C1C',\n missed: 'rgba(209,67,67,0.1)',\n deload: 'rgba(186,41,150,0.15)',\n}\n\nconst statusBorderStyles: Record<WorkoutPillStatus, Record<string, unknown>> = {\n completed: { borderWidth: 1, borderColor: 'rgba(46,213,115,0.3)' },\n current: { borderWidth: 1, borderColor: 'rgba(255,121,0,0.3)' },\n next: { borderWidth: 1, borderColor: 'rgba(255,121,0,0.4)' },\n upcoming: { borderWidth: 1, borderColor: '#1F1F1F' },\n missed: { borderWidth: 1, borderColor: 'rgba(209,67,67,0.25)' },\n deload: { borderWidth: 1, borderColor: 'rgba(186,41,150,0.3)' },\n}\n\nconst textColors: Record<WorkoutPillStatus, string> = {\n completed: t['status-success'],\n current: t['brand-primary'],\n next: t['brand-primary'],\n upcoming: '#6B7280',\n missed: 'rgba(209,67,67,0.7)',\n deload: WORKOUT_PILL_DELOAD,\n}\n\nfunction usePulse(enabled: boolean) {\n const [opacity] = useState(() => new Animated.Value(1))\n\n useEffect(() => {\n if (!enabled) {\n opacity.setValue(1)\n return\n }\n\n const animation = Animated.loop(\n Animated.sequence([\n Animated.timing(opacity, {\n toValue: 0.7,\n duration: 1000,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 1000,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n ]),\n )\n animation.start()\n\n return () => animation.stop()\n }, [enabled, opacity])\n\n return opacity\n}\n\nexport function WorkoutPill({\n name,\n status,\n pulse,\n onPress,\n highlighted = false,\n className,\n ...props\n}: WorkoutPillProps) {\n const shouldPulse = pulse ?? status === 'current'\n const pulseOpacity = usePulse(shouldPulse)\n const isCompleted = status === 'completed'\n const isMissed = status === 'missed'\n\n const pill = (\n <Animated.View\n style={shouldPulse ? { opacity: pulseOpacity } : undefined}\n testID=\"workout-pill\"\n >\n <View\n className={className}\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n paddingVertical: 4,\n borderRadius: 6,\n backgroundColor: statusBgColors[status],\n },\n statusBorderStyles[status] as Record<string, unknown>,\n highlighted ? { borderWidth: 2, transform: [{ scale: 1.02 }] } : undefined,\n ]}\n accessibilityLabel={onPress ? undefined : `${name} workout, ${status}`}\n {...props}\n >\n {isCompleted && (\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n marginRight: 4,\n }}\n accessibilityElementsHidden\n testID=\"workout-pill-check\"\n >\n {'\\u2713'}\n </Text>\n )}\n {isMissed && (\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n marginRight: 4,\n }}\n accessibilityElementsHidden\n testID=\"workout-pill-dash\"\n >\n {'\\u2014'}\n </Text>\n )}\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n }}\n accessibilityElementsHidden={onPress != null}\n testID=\"workout-pill-name\"\n >\n {name}\n </Text>\n </View>\n </Animated.View>\n )\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name} workout, ${status}`}\n testID=\"workout-pill-pressable\"\n >\n {pill}\n </Pressable>\n )\n }\n\n return pill\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport {\n View,\n Text,\n Animated,\n type ViewProps,\n type ViewStyle,\n type DimensionValue,\n} from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nconst t = getSemanticColors('dark')\n\nexport type IntensityBarOrientation = 'vertical' | 'horizontal'\n\nexport interface IntensityBarProps extends ViewProps {\n /** Current intensity level; 1 == 100% of target. Values >1 render as over-target. */\n level: number\n /** Target position 0-1. When the level sits at this target the fill gains an at-target glow. */\n threshold?: number\n /** Orientation */\n orientation?: IntensityBarOrientation\n /** Height for vertical (default 24px) or width for horizontal */\n size?: number\n /** Width for vertical (default 6px) or height for horizontal */\n thickness?: number\n /** Show the \"MRV\" threshold label under the bar */\n showThresholdLabel?: boolean\n className?: string\n}\n\nconst TRACK_BG = '#333333'\nconst LABEL_COLOR = '#6B7280'\nconst TARGET_LINE_COLOR = 'rgba(33, 150, 243, 0.5)'\nconst AT_TARGET_GLOW = '0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)'\n\n// Zone colors graded by TRUE percentage (level * 100).\nconst ZONE = {\n building: t['status-success'], // below target ramp-up\n approaching: t['status-warning'], // nearing target\n target: t['brand-primary'], // exactly at target\n over1: t['status-error'], // mild over-target\n over2: WORKOUT_TOKENS.intensity.over2, // moderate over-target\n over3: WORKOUT_TOKENS.intensity.over3, // severe over-target\n} as const\n\ntype OverTier = 0 | 1 | 2 | 3\n\ninterface Zone {\n color: string\n over: OverTier\n}\n\nconst BULGE_SIZE: Record<Exclude<OverTier, 0>, number> = { 1: 8, 2: 10, 3: 11 }\n\n/** Map a true percentage to its fill color and over-target tier. */\nfunction zoneForPct(pct: number): Zone {\n if (pct >= 125) return { color: ZONE.over3, over: 3 }\n if (pct >= 115) return { color: ZONE.over2, over: 2 }\n if (pct > 100) return { color: ZONE.over1, over: 1 }\n if (pct === 100) return { color: ZONE.target, over: 0 }\n if (pct >= 75) return { color: ZONE.approaching, over: 0 }\n return { color: ZONE.building, over: 0 }\n}\n\nfunction clampFill(value: number): number {\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\n/** True when the level rests on the supplied target (within 5%). */\nfunction isAtTarget(pct: number, threshold?: number): boolean {\n if (threshold == null) return false\n return Math.abs(pct - Math.round(threshold * 100)) <= 5\n}\n\nexport function IntensityBar({\n level,\n threshold,\n orientation = 'vertical',\n size = 24,\n thickness = 6,\n showThresholdLabel,\n className,\n ...props\n}: IntensityBarProps) {\n const isVertical = orientation === 'vertical'\n const fillLevel = clampFill(level)\n const pct = Math.round(Math.max(0, level) * 100)\n const zone = zoneForPct(pct)\n const atTarget = isAtTarget(pct, threshold)\n\n const [fillAnim] = useState(() => new Animated.Value(fillLevel))\n\n useEffect(() => {\n const animation = Animated.timing(fillAnim, {\n toValue: fillLevel,\n duration: 250,\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [fillLevel, fillAnim])\n\n const fillSizePercent = fillAnim.interpolate({\n inputRange: [0, 1],\n outputRange: ['0%', '100%'],\n })\n\n const trackStyle = isVertical\n ? { width: thickness, height: size }\n : { width: size, height: thickness }\n\n const fillStyle = isVertical\n ? { position: 'absolute' as const, bottom: 0, left: 0, right: 0, height: fillSizePercent }\n : { position: 'absolute' as const, top: 0, bottom: 0, left: 0, width: fillSizePercent }\n\n const bulgeSize = zone.over === 0 ? 0 : BULGE_SIZE[zone.over]\n const bulgeStyle: ViewStyle = {\n position: 'absolute',\n width: bulgeSize,\n height: bulgeSize,\n borderRadius: bulgeSize / 2,\n backgroundColor: zone.color,\n zIndex: 1,\n ...(isVertical\n ? { top: 0, left: '50%', transform: [{ translateX: -bulgeSize / 2 }] }\n : { right: 0, top: '50%', transform: [{ translateY: -bulgeSize / 2 }] }),\n }\n\n const targetPct: DimensionValue = `${clampFill(threshold ?? 0) * 100}%`\n const targetLineStyle: ViewStyle = isVertical\n ? {\n position: 'absolute',\n bottom: targetPct,\n left: -3,\n right: -3,\n height: 1.5,\n backgroundColor: TARGET_LINE_COLOR,\n zIndex: 4,\n }\n : {\n position: 'absolute',\n left: targetPct,\n top: -3,\n bottom: -3,\n width: 1.5,\n backgroundColor: TARGET_LINE_COLOR,\n zIndex: 4,\n }\n\n return (\n <View\n className={className}\n style={{ alignItems: 'center' }}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: 0, max: 100, now: pct }}\n accessibilityLabel={`Intensity level: ${pct}%`}\n testID=\"intensity-bar\"\n {...props}\n >\n <View\n style={{\n ...trackStyle,\n borderRadius: 3,\n backgroundColor: TRACK_BG,\n position: 'relative',\n overflow: 'visible',\n }}\n accessibilityElementsHidden\n >\n <Animated.View\n style={{\n ...fillStyle,\n borderRadius: 3,\n backgroundColor: zone.color,\n zIndex: 2,\n ...(atTarget ? { boxShadow: AT_TARGET_GLOW } : null),\n }}\n testID=\"intensity-fill\"\n />\n\n {zone.over !== 0 && <View style={bulgeStyle} testID=\"intensity-bulge\" />}\n\n {threshold != null && <View style={targetLineStyle} testID=\"intensity-target\" />}\n </View>\n\n <Text\n style={{\n fontSize: 8,\n color: LABEL_COLOR,\n fontFamily: '\"Nunito Sans\", sans-serif',\n marginTop: 6,\n }}\n accessibilityElementsHidden\n testID=\"intensity-label\"\n >\n {pct}%\n </Text>\n\n {showThresholdLabel && threshold != null && (\n <Text\n style={{\n fontSize: 8,\n fontWeight: '500',\n color: LABEL_COLOR,\n fontFamily: 'Inter, sans-serif',\n marginTop: 2,\n }}\n accessibilityElementsHidden\n testID=\"intensity-threshold-label\"\n >\n MRV\n </Text>\n )}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, type ViewProps } from 'react-native'\nimport { WorkoutPill, type WorkoutPillStatus } from './WorkoutPill'\nimport { IntensityBar } from './IntensityBar'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport interface WeekRowWorkout {\n name: string\n status: WorkoutPillStatus\n onPress?: () => void\n}\n\nexport interface WeekRowProps extends ViewProps {\n /** Week index within the mesocycle (1-based) */\n weekNumber: number\n /** Total weeks in the mesocycle */\n totalWeeks: number\n /** Workouts scheduled for this week */\n workouts: WeekRowWorkout[]\n /** Planned intensity for the week, 0-1 */\n intensityLevel: number\n /** Optional MRV/overexertion threshold, 0-1 */\n intensityThreshold?: number\n /** Highlights this row as the active week */\n isCurrent?: boolean\n /** Renders this row as a deload week (purple tint, deload pills) */\n isDeload?: boolean\n className?: string\n}\n\n/**\n * A single week within a mesocycle, showing the week number, its workout pills,\n * and a right-aligned vertical intensity indicator.\n *\n * @example\n * <WeekRow\n * weekNumber={1}\n * totalWeeks={4}\n * workouts={[\n * { name: 'Upper', status: 'completed' },\n * { name: 'Lower', status: 'current' },\n * ]}\n * intensityLevel={0.55}\n * intensityThreshold={0.8}\n * isCurrent\n * />\n */\nexport function WeekRow({\n weekNumber,\n totalWeeks,\n workouts,\n intensityLevel,\n intensityThreshold,\n isCurrent = false,\n isDeload = false,\n className,\n ...props\n}: WeekRowProps) {\n const rowStyle: Record<string, unknown> = {\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n paddingVertical: 10,\n paddingHorizontal: 12,\n gap: 12,\n }\n\n if (isDeload) {\n rowStyle.backgroundColor = 'rgba(186,41,150,0.06)'\n }\n\n if (isCurrent) {\n rowStyle.backgroundColor = 'rgba(255,121,0,0.04)'\n rowStyle.borderLeftWidth = 2\n rowStyle.borderLeftColor = BRAND_PRIMARY\n }\n\n return (\n <View\n className={className}\n style={rowStyle}\n accessibilityLabel={`Week ${weekNumber} of ${totalWeeks}, ${workouts.length} workouts`}\n testID=\"week-row\"\n {...props}\n >\n <View\n style={{ flexDirection: 'row', alignItems: 'center', width: 32, gap: 4 }}\n testID=\"week-row-number\"\n >\n {isCurrent && (\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: BRAND_PRIMARY,\n }}\n accessibilityElementsHidden\n testID=\"week-row-current-dot\"\n />\n )}\n <Text\n className={isCurrent ? undefined : 'text-text-primary'}\n style={{\n fontSize: 13,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n color: isCurrent ? BRAND_PRIMARY : undefined,\n }}\n accessibilityElementsHidden\n >\n {`W${weekNumber}`}\n </Text>\n </View>\n\n <View\n style={{ flex: 1, flexDirection: 'row', alignItems: 'center', flexWrap: 'wrap', gap: 6 }}\n testID=\"week-row-pills\"\n >\n {workouts.map((workout, i) => (\n <WorkoutPill\n key={i}\n name={workout.name}\n status={isDeload ? 'deload' : workout.status}\n onPress={workout.onPress}\n />\n ))}\n </View>\n\n <View testID=\"week-row-intensity\">\n <IntensityBar\n level={intensityLevel}\n threshold={intensityThreshold}\n orientation=\"vertical\"\n size={24}\n thickness={6}\n />\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { Badge } from '../../ui/badge'\nimport { WeekRow, type WeekRowProps } from './WeekRow'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n MESO_ACCENT_GRADIENT_DARK,\n MESO_ACCENT_GRADIENT_LIGHT,\n} from '../../../theme/extracted-colors-dataviz'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\nconst BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK\nconst BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT\nconst BORDER_DEFAULT = '#1F1F1F'\n\n/** Gradient stops for the 3px top accent: dark -> primary -> light. */\nconst ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY, BRAND_PRIMARY_LIGHT]\n\nexport interface MesoVolumeHeatmapEntry {\n /** Muscle group identifier (free-form to match plan data). */\n group: string\n /** Planned volume intensity for the group, 0-100. */\n percentage: number\n}\n\nexport interface MesoCardProps extends ViewProps {\n /** Mesocycle name, e.g. \"Accumulation\". */\n name: string\n /** Training goal, e.g. \"Hypertrophy\", \"Strength\", \"Peaking\". */\n goal: string\n /** Training split, e.g. \"Upper/Lower\", \"Push/Pull/Legs\". */\n split: string\n /** Week range label, e.g. \"Weeks 1-4\". */\n weekRange: string\n /** Current week within the mesocycle (1-based). */\n currentWeek?: number\n /** Total weeks in the mesocycle. */\n totalWeeks: number\n /** Weeks rendered as a WeekRow list when expanded. */\n weeks: WeekRowProps[]\n /** Whether the card is expanded to reveal the week list. */\n expanded?: boolean\n /** Toggles expansion; makes the header a button when provided. */\n onToggle?: () => void\n /** Whether this meso is highlighted in the MesoProgressBar. */\n highlighted?: boolean\n /** Volume heatmap data per muscle group for the meso. */\n volumeHeatmap?: MesoVolumeHeatmapEntry[]\n className?: string\n}\n\n/**\n * Maps a 0-100 volume percentage onto a brand-primary tint whose opacity\n * tracks intensity, keeping a visible floor so low-volume groups stay legible.\n */\nfunction heatmapColor(percentage: number): string {\n const clamped = Math.max(0, Math.min(100, percentage))\n const opacity = 0.12 + (clamped / 100) * 0.78\n return `rgba(255,121,0,${opacity.toFixed(3)})`\n}\n\n/**\n * A mesocycle card with name, goal, split, week range, an optional volume\n * heatmap strip, and an expandable WeekRow list. Highlighting animates the\n * border toward brand-primary with a subtle glow to stay in sync with the\n * MesoProgressBar.\n *\n * @example\n * <MesoCard\n * name=\"Accumulation\"\n * goal=\"Hypertrophy\"\n * split=\"Upper/Lower\"\n * weekRange=\"Weeks 1-4\"\n * currentWeek={2}\n * totalWeeks={4}\n * weeks={weeks}\n * volumeHeatmap={[{ group: 'chest', percentage: 80 }]}\n * expanded\n * onToggle={() => {}}\n * highlighted\n * />\n */\nexport function MesoCard({\n name,\n goal,\n split,\n weekRange,\n currentWeek,\n totalWeeks,\n weeks,\n expanded = false,\n onToggle,\n highlighted = false,\n volumeHeatmap,\n className,\n ...props\n}: MesoCardProps) {\n const isExpandable = onToggle != null\n const [highlight] = useState(() => new Animated.Value(highlighted ? 1 : 0))\n\n useEffect(() => {\n const animation = Animated.timing(highlight, {\n toValue: highlighted ? 1 : 0,\n duration: 250,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [highlighted, highlight])\n\n const borderColor = highlight.interpolate({\n inputRange: [0, 1],\n outputRange: [BORDER_DEFAULT, BRAND_PRIMARY],\n })\n\n const header = (\n <View style={{ paddingHorizontal: 14, paddingTop: 12, paddingBottom: 10 }} testID=\"meso-card-body\">\n <View className=\"flex-row items-center\" style={{ gap: 8 }} testID=\"meso-card-header\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"meso-card-name\"\n >\n {name}\n </Text>\n <Badge variant=\"subtle\" color=\"primary\" size=\"sm\" testID=\"meso-card-goal-badge\">\n {goal}\n </Badge>\n </View>\n\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"meso-card-subheader\"\n >\n {`${split} · ${weekRange}`}\n </Text>\n\n {volumeHeatmap && volumeHeatmap.length > 0 && (\n <View\n className=\"flex-row items-center\"\n style={{ marginTop: 10, gap: 3 }}\n accessibilityElementsHidden\n testID=\"meso-card-heatmap\"\n >\n {volumeHeatmap.map((entry) => (\n <View\n key={entry.group}\n style={{\n flex: 1,\n height: 8,\n borderRadius: 2,\n backgroundColor: heatmapColor(entry.percentage),\n }}\n testID=\"meso-card-heatmap-cell\"\n />\n ))}\n </View>\n )}\n </View>\n )\n\n return (\n <Animated.View style={highlighted ? { transform: [{ scale: 1.0 }] } : undefined} testID=\"meso-card-wrapper\">\n <Card\n variant=\"outline\"\n elevation={2}\n borderColor={highlighted ? BRAND_PRIMARY : BORDER_DEFAULT}\n className={className}\n style={[\n { borderColor: borderColor as unknown as string },\n highlighted\n ? { boxShadow: '0 0 12px 2px rgba(255,121,0,0.25)' }\n : undefined,\n ]}\n testID=\"meso-card\"\n {...props}\n >\n <View\n className=\"flex-row\"\n style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 3, zIndex: 1 }}\n accessibilityElementsHidden\n testID=\"meso-card-accent\"\n >\n {ACCENT_STOPS.map((color) => (\n <View key={color} style={{ flex: 1, backgroundColor: color }} />\n ))}\n </View>\n\n {isExpandable ? (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name}, ${goal}, ${weekRange}`}\n aria-expanded={expanded}\n testID=\"meso-card-toggle\"\n >\n {header}\n </Pressable>\n ) : (\n <View\n accessibilityLabel={`${name}, ${goal}, ${weekRange}`}\n testID=\"meso-card-static\"\n >\n {header}\n </View>\n )}\n\n {expanded && weeks.length > 0 && (\n <View\n style={{ borderTopWidth: 1, borderTopColor: BORDER_DEFAULT }}\n testID=\"meso-card-weeks\"\n >\n {weeks.map((week) => (\n <WeekRow\n key={week.weekNumber}\n {...week}\n totalWeeks={week.totalWeeks ?? totalWeeks}\n isCurrent={week.isCurrent ?? week.weekNumber === currentWeek}\n />\n ))}\n </View>\n )}\n </Card>\n </Animated.View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\n// Aliases for spec compatibility: under=behind, maintenance=ontrack, productive=target\nexport type VolumeStatus = 'untrained' | 'behind' | 'ontrack' | 'target' | 'over'\n\nexport interface MuscleGroupChipProps extends ViewProps {\n name: string\n volumeStatus?: VolumeStatus\n onPress?: () => void\n className?: string\n}\n\nconst dotColorMap: Record<VolumeStatus, string> = {\n untrained: '#2C2C2C',\n behind: t['brand-secondary'],\n ontrack: t['status-success'],\n target: t['brand-primary'],\n over: t['status-error'],\n}\n\nexport function MuscleGroupChip({\n name,\n volumeStatus,\n onPress,\n className,\n ...props\n}: MuscleGroupChipProps) {\n const dotColor = volumeStatus\n ? dotColorMap[volumeStatus]\n : '#2C2C2C'\n\n const statusLabel = volumeStatus ?? 'no status'\n\n const content = (\n <View\n className={['bg-surface-raised border-border', className].filter(Boolean).join(' ')}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 9999,\n paddingHorizontal: 9,\n paddingVertical: 3,\n borderWidth: 1,\n }}\n accessibilityLabel={onPress ? undefined : `${name}, volume status: ${statusLabel}`}\n testID=\"muscle-group-chip\"\n {...props}\n >\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 9999,\n marginRight: 5,\n flexShrink: 0,\n backgroundColor: dotColor,\n }}\n accessibilityElementsHidden\n testID=\"muscle-group-chip-dot\"\n />\n <Text\n className=\"text-text-secondary\"\n style={{\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n fontSize: 11,\n }}\n accessibilityElementsHidden\n >\n {name}\n </Text>\n </View>\n )\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name}, volume status: ${statusLabel}`}\n testID=\"muscle-group-chip-pressable\"\n >\n {content}\n </Pressable>\n )\n }\n\n return content\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, ScrollView, Pressable, type ViewProps } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'\nimport {\n MuscleGroupChip,\n type VolumeStatus,\n} from './MuscleGroupChip'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nexport type WorkoutStatus = 'completed' | 'today' | 'upcoming'\n\n/** Spec volume-status vocabulary; mapped to MuscleGroupChip's VolumeStatus internally. */\nexport type WorkoutMuscleVolumeStatus =\n | 'under'\n | 'maintenance'\n | 'productive'\n | 'over'\n\nexport interface WorkoutMuscleGroup {\n /** Muscle group identifier (free-form to match plan data). */\n group: string\n /** Display label, may be abbreviated. */\n label: string\n /** Volume status relative to landmarks. */\n volumeStatus?: WorkoutMuscleVolumeStatus\n}\n\nexport interface WorkoutCardProps extends ViewProps {\n name: string\n date: string\n /** e.g. \"45 min\" */\n duration?: string\n status: WorkoutStatus\n muscleGroups: WorkoutMuscleGroup[]\n totalSets: number\n /** Total lbs/kg moved across the workout. */\n totalVolume?: number\n unit: 'lbs' | 'kg'\n exercises?: ExerciseCardProps[]\n expanded?: boolean\n onToggle?: () => void\n className?: string\n}\n\nconst COLORS = {\n statusSuccess: t['status-success'],\n brandPrimary: t['brand-primary'],\n borderDefault: '#1F1F1F',\n brandPrimarySubtle: 'rgba(255,121,0,0.06)',\n}\n\nconst statusBorderColors: Record<WorkoutStatus, string> = {\n completed: COLORS.statusSuccess,\n today: COLORS.brandPrimary,\n upcoming: COLORS.borderDefault,\n}\n\n/** Maps the spec's volume-status vocabulary onto MuscleGroupChip's enum. */\nconst volumeStatusMap: Record<WorkoutMuscleVolumeStatus, VolumeStatus> = {\n under: 'behind',\n maintenance: 'ontrack',\n productive: 'target',\n over: 'over',\n}\n\nfunction formatStats(\n totalSets: number,\n totalVolume: number | undefined,\n unit: 'lbs' | 'kg',\n duration: string | undefined,\n): string {\n const parts = [`${totalSets} sets`]\n if (totalVolume != null) parts.push(`${totalVolume} ${unit}`)\n if (duration) parts.push(duration)\n return parts.join(' · ')\n}\n\n/**\n * A workout within a week: name, date, duration, muscle-group pills, and a\n * stats summary. When expandable it renders contained ExerciseCards on expand.\n * Status drives a colored left border, today adds a brand tint, and upcoming\n * is dimmed.\n *\n * @example\n * <WorkoutCard\n * name=\"Upper A\"\n * date=\"Mon, Jun 23\"\n * duration=\"45 min\"\n * status=\"today\"\n * muscleGroups={[{ group: 'chest', label: 'Chest', volumeStatus: 'productive' }]}\n * totalSets={18}\n * totalVolume={12450}\n * unit=\"lbs\"\n * expanded\n * onToggle={() => {}}\n * exercises={exercises}\n * />\n */\nexport function WorkoutCard({\n name,\n date,\n duration,\n status,\n muscleGroups,\n totalSets,\n totalVolume,\n unit,\n exercises,\n expanded = false,\n onToggle,\n className,\n ...props\n}: WorkoutCardProps) {\n const isExpandable = onToggle != null\n const isUpcoming = status === 'upcoming'\n const isToday = status === 'today'\n\n const summary = (\n <View style={{ padding: 14 }} testID=\"workout-card-body\">\n <View className=\"flex-row items-center\" testID=\"workout-card-header\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"workout-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"workout-card-date\"\n >\n {date}\n </Text>\n </View>\n\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"workout-card-stats\"\n >\n {formatStats(totalSets, totalVolume, unit, duration)}\n </Text>\n\n {muscleGroups.length > 0 && (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={{ gap: 5 }}\n style={{ marginTop: 8 }}\n testID=\"workout-card-muscle-groups\"\n >\n {muscleGroups.map((muscle) => (\n <MuscleGroupChip\n key={muscle.group}\n name={muscle.label}\n volumeStatus={\n muscle.volumeStatus\n ? volumeStatusMap[muscle.volumeStatus]\n : undefined\n }\n />\n ))}\n </ScrollView>\n )}\n </View>\n )\n\n return (\n <Card\n variant=\"accent\"\n elevation={1}\n accentColor={statusBorderColors[status]}\n bgColor={isToday ? COLORS.brandPrimarySubtle : undefined}\n className={className}\n style={isUpcoming ? { opacity: 0.6 } : undefined}\n testID=\"workout-card\"\n {...props}\n >\n {isExpandable ? (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name} workout, ${date}, ${status}`}\n aria-expanded={expanded}\n testID=\"workout-card-toggle\"\n >\n {summary}\n </Pressable>\n ) : (\n <View\n accessibilityLabel={`${name} workout, ${date}, ${status}`}\n testID=\"workout-card-static\"\n >\n {summary}\n </View>\n )}\n\n {expanded && exercises && exercises.length > 0 && (\n <View\n style={{ paddingHorizontal: 8, paddingBottom: 8, gap: 6 }}\n testID=\"workout-card-exercises\"\n >\n {exercises.map((exercise, i) => (\n <ExerciseCard key={i} {...exercise} />\n ))}\n </View>\n )}\n </Card>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { MesoProgressBar, type Meso, type MesoStatus } from './MesoProgressBar'\nimport { MesoCard, type MesoVolumeHeatmapEntry } from './MesoCard'\nimport { type WeekRowProps, type WeekRowWorkout } from './WeekRow'\nimport { WorkoutCard, type WorkoutStatus, type WorkoutMuscleGroup } from './WorkoutCard'\nimport { type WorkoutPillStatus } from './WorkoutPill'\nimport { type ExerciseCardProps } from './ExerciseCard'\nimport { cn } from '../../../utils/cn'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** A single workout within a planned week, plus its exercise breakdown. */\nexport interface PlanWorkout {\n /** Stable identifier used for drill-down selection. */\n id: string\n name: string\n date: string\n duration?: string\n status: WorkoutStatus\n muscleGroups: WorkoutMuscleGroup[]\n totalSets: number\n totalVolume?: number\n unit: 'lbs' | 'kg'\n /** Exercises revealed when the workout is opened. */\n exercises: ExerciseCardProps[]\n}\n\n/** A training week inside a mesocycle. */\nexport interface PlanWeek {\n /** 1-based week index within the mesocycle. */\n weekNumber: number\n /** Planned intensity for the week, 0-1. */\n intensityLevel: number\n /** Optional MRV/overexertion threshold, 0-1. */\n intensityThreshold?: number\n isDeload?: boolean\n isCurrent?: boolean\n workouts: PlanWorkout[]\n}\n\n/** A mesocycle: the top level of the drill-down. */\nexport interface PlanMeso {\n id: string\n name: string\n goal: string\n split: string\n weekRange: string\n weekCount: number\n currentWeek?: number\n status: MesoStatus\n volumeHeatmap?: MesoVolumeHeatmapEntry[]\n weeks: PlanWeek[]\n}\n\n/** Current depth of the meso -> week -> workout drill-down. */\nexport type ProgramNavLevel = 'meso' | 'week' | 'workout'\n\n/** The navigation cursor within the active mesocycle. */\nexport interface ProgramSelection {\n weekNumber: number | null\n workoutId: string | null\n}\n\n/** One tappable step in the breadcrumb trail. */\nexport interface ProgramBreadcrumb {\n key: string\n label: string\n level: ProgramNavLevel\n}\n\nexport interface ProgramPlanningPageProps extends ViewProps {\n /** Page heading. */\n title?: string\n /** Mesocycles that make up the program. */\n mesos: PlanMeso[]\n className?: string\n}\n\n/** Map a workout's lifecycle status onto a WorkoutPill status. */\nconst WORKOUT_PILL_STATUS: Record<WorkoutStatus, WorkoutPillStatus> = {\n completed: 'completed',\n today: 'current',\n upcoming: 'upcoming',\n}\n\n/** Derive the current drill-down level from the selection cursor (pure). */\nexport function deriveNavLevel(selection: ProgramSelection): ProgramNavLevel {\n if (selection.workoutId != null) return 'workout'\n if (selection.weekNumber != null) return 'week'\n return 'meso'\n}\n\n/** Project the mesocycles onto MesoProgressBar segment data (pure). */\nexport function toProgressBarMesos(mesos: PlanMeso[]): Meso[] {\n return mesos.map(({ id, name, weekCount, status, currentWeek }) => ({\n id,\n name,\n weekCount,\n status,\n currentWeek,\n }))\n}\n\n/** Look up a meso by id, or null. */\nexport function findMeso(mesos: PlanMeso[], id: string | null): PlanMeso | null {\n if (id == null) return null\n return mesos.find((meso) => meso.id === id) ?? null\n}\n\n/** Look up a week within a meso, or null. */\nexport function findWeek(meso: PlanMeso | null, weekNumber: number | null): PlanWeek | null {\n if (meso == null || weekNumber == null) return null\n return meso.weeks.find((week) => week.weekNumber === weekNumber) ?? null\n}\n\n/** Look up a workout within a week, or null. */\nexport function findWorkout(week: PlanWeek | null, workoutId: string | null): PlanWorkout | null {\n if (week == null || workoutId == null) return null\n return week.workouts.find((workout) => workout.id === workoutId) ?? null\n}\n\n/** Build the breadcrumb trail for the active drill path (pure). */\nexport function buildBreadcrumbs(\n meso: PlanMeso,\n weekNumber: number | null,\n workout: PlanWorkout | null\n): ProgramBreadcrumb[] {\n const crumbs: ProgramBreadcrumb[] = [{ key: 'meso', label: meso.name, level: 'meso' }]\n if (weekNumber != null) {\n crumbs.push({ key: 'week', label: `Week ${weekNumber}`, level: 'week' })\n }\n if (workout != null) {\n crumbs.push({ key: 'workout', label: workout.name, level: 'workout' })\n }\n return crumbs\n}\n\ninterface BreadcrumbsProps {\n crumbs: ProgramBreadcrumb[]\n onNavigate: (level: ProgramNavLevel) => void\n}\n\nfunction Breadcrumbs({ crumbs, onNavigate }: BreadcrumbsProps) {\n return (\n <View\n className=\"flex-row items-center flex-wrap\"\n style={{ gap: 4 }}\n testID=\"program-planning-page-breadcrumbs\"\n >\n {crumbs.map((crumb, index) => {\n const isLast = index === crumbs.length - 1\n return (\n <View key={crumb.key} className=\"flex-row items-center\" style={{ gap: 4 }}>\n {index > 0 && (\n <Text className=\"text-text-tertiary\" style={{ fontSize: 12 }}>\n {'›'}\n </Text>\n )}\n <Pressable\n onPress={() => onNavigate(crumb.level)}\n disabled={isLast}\n accessibilityRole=\"button\"\n testID={`program-planning-page-crumb-${crumb.key}`}\n >\n <Text\n className={isLast ? 'text-text-primary' : undefined}\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n fontWeight: isLast ? '700' : '500',\n color: isLast ? undefined : BRAND_PRIMARY,\n }}\n >\n {crumb.label}\n </Text>\n </Pressable>\n </View>\n )\n })}\n </View>\n )\n}\n\n/** Project a plan week onto WeekRow props, wiring pill taps to week selection. */\nfunction toWeekRow(\n week: PlanWeek,\n meso: PlanMeso,\n onSelectWeek: (weekNumber: number) => void\n): WeekRowProps {\n const workouts: WeekRowWorkout[] = week.workouts.map((workout) => ({\n name: workout.name,\n status: WORKOUT_PILL_STATUS[workout.status],\n onPress: () => onSelectWeek(week.weekNumber),\n }))\n return {\n weekNumber: week.weekNumber,\n totalWeeks: meso.weekCount,\n workouts,\n intensityLevel: week.intensityLevel,\n intensityThreshold: week.intensityThreshold,\n isCurrent: week.isCurrent ?? week.weekNumber === meso.currentWeek,\n isDeload: week.isDeload,\n }\n}\n\ninterface MesoLevelProps {\n mesos: PlanMeso[]\n activeMesoId: string | null\n onSelectMeso: (id: string) => void\n onSelectWeek: (weekNumber: number) => void\n}\n\nfunction MesoLevel({ mesos, activeMesoId, onSelectMeso, onSelectWeek }: MesoLevelProps) {\n return (\n <View style={{ gap: 12 }} testID=\"program-planning-page-meso-level\">\n {mesos.map((meso) => {\n const expanded = meso.id === activeMesoId\n return (\n <MesoCard\n key={meso.id}\n name={meso.name}\n goal={meso.goal}\n split={meso.split}\n weekRange={meso.weekRange}\n currentWeek={meso.currentWeek}\n totalWeeks={meso.weekCount}\n weeks={expanded ? meso.weeks.map((week) => toWeekRow(week, meso, onSelectWeek)) : []}\n volumeHeatmap={meso.volumeHeatmap}\n expanded={expanded}\n onToggle={() => onSelectMeso(meso.id)}\n highlighted={expanded}\n />\n )\n })}\n </View>\n )\n}\n\ninterface WeekLevelProps {\n week: PlanWeek\n onSelectWorkout: (id: string) => void\n}\n\nfunction WeekLevel({ week, onSelectWorkout }: WeekLevelProps) {\n return (\n <View style={{ gap: 10 }} testID=\"program-planning-page-week-level\">\n {week.workouts.map((workout) => (\n <WorkoutCard\n key={workout.id}\n name={workout.name}\n date={workout.date}\n duration={workout.duration}\n status={workout.status}\n muscleGroups={workout.muscleGroups}\n totalSets={workout.totalSets}\n totalVolume={workout.totalVolume}\n unit={workout.unit}\n exercises={workout.exercises}\n expanded={false}\n onToggle={() => onSelectWorkout(workout.id)}\n />\n ))}\n </View>\n )\n}\n\ninterface WorkoutLevelProps {\n workout: PlanWorkout\n expandedExercise: number | null\n onToggleExercise: (index: number) => void\n}\n\nfunction WorkoutLevel({ workout, expandedExercise, onToggleExercise }: WorkoutLevelProps) {\n // `upcoming` cards ignore `expanded`, so it's safe to wire the toggle uniformly.\n const exercises = workout.exercises.map((exercise, index) => ({\n ...exercise,\n expanded: index === expandedExercise,\n onExpandedChange: () => onToggleExercise(index),\n }))\n return (\n <View testID=\"program-planning-page-workout-level\">\n <WorkoutCard\n name={workout.name}\n date={workout.date}\n duration={workout.duration}\n status={workout.status}\n muscleGroups={workout.muscleGroups}\n totalSets={workout.totalSets}\n totalVolume={workout.totalVolume}\n unit={workout.unit}\n exercises={exercises}\n expanded\n onToggle={() => undefined}\n />\n </View>\n )\n}\n\n/**\n * ProgramPlanningPage — a meso -> week -> workout drill-down over an entire\n * training program. A `MesoProgressBar` pins the mesocycle timeline to the top;\n * the body swaps between three levels: expandable `MesoCard`s (with inline\n * `WeekRow`s), a week's `WorkoutCard` list, and a single opened `WorkoutCard`\n * with inline `ExerciseCard` expansion. A breadcrumb trail tracks and rewinds\n * the drill path. Selection is page-level state; children keep their own styles.\n *\n * @example\n * <ProgramPlanningPage mesos={mesos} />\n */\nexport function ProgramPlanningPage({\n title = 'Program Plan',\n mesos,\n className,\n ...props\n}: ProgramPlanningPageProps) {\n const [activeMesoId, setActiveMesoId] = useState<string | null>(mesos[0]?.id ?? null)\n const [selectedWeek, setSelectedWeek] = useState<number | null>(null)\n const [selectedWorkoutId, setSelectedWorkoutId] = useState<string | null>(null)\n const [expandedExercise, setExpandedExercise] = useState<number | null>(null)\n\n const progressMesos = useMemo(() => toProgressBarMesos(mesos), [mesos])\n const activeMeso = findMeso(mesos, activeMesoId)\n const level = deriveNavLevel({ weekNumber: selectedWeek, workoutId: selectedWorkoutId })\n const activeWeek = findWeek(activeMeso, selectedWeek)\n const activeWorkout = findWorkout(activeWeek, selectedWorkoutId)\n\n const selectMeso = (id: string) => {\n setActiveMesoId(id)\n setSelectedWeek(null)\n setSelectedWorkoutId(null)\n }\n const selectWeek = (weekNumber: number) => {\n setSelectedWeek(weekNumber)\n setSelectedWorkoutId(null)\n setExpandedExercise(null)\n }\n const selectWorkout = (id: string) => {\n setSelectedWorkoutId(id)\n setExpandedExercise(null)\n }\n const toggleExercise = (index: number) =>\n setExpandedExercise((current) => (current === index ? null : index))\n\n const navigateTo = (target: ProgramNavLevel) => {\n if (target === 'meso') selectMeso(activeMesoId ?? mesos[0]?.id)\n else if (target === 'week' && selectedWeek != null) selectWeek(selectedWeek)\n }\n\n return (\n <View\n className={cn(className, 'bg-background-base')}\n style={{ width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={title}\n testID=\"program-planning-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"program-planning-page-content\">\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"program-planning-page-title\"\n >\n {title}\n </Text>\n\n <View style={{ marginHorizontal: -16 }}>\n <MesoProgressBar\n mesos={progressMesos}\n activeMesoId={activeMesoId}\n onMesoPress={selectMeso}\n />\n </View>\n\n {activeMeso != null && (\n <Breadcrumbs\n crumbs={buildBreadcrumbs(activeMeso, selectedWeek, activeWorkout)}\n onNavigate={navigateTo}\n />\n )}\n\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n padding: 12,\n }}\n testID=\"program-planning-page-body\"\n >\n {level === 'meso' && (\n <MesoLevel\n mesos={mesos}\n activeMesoId={activeMesoId}\n onSelectMeso={selectMeso}\n onSelectWeek={selectWeek}\n />\n )}\n {level === 'week' && activeWeek != null && (\n <WeekLevel week={activeWeek} onSelectWorkout={selectWorkout} />\n )}\n {level === 'workout' && activeWorkout != null && (\n <WorkoutLevel\n workout={activeWorkout}\n expandedExercise={expandedExercise}\n onToggleExercise={toggleExercise}\n />\n )}\n </View>\n </View>\n </View>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/theme/tokens/primitives.ts","../src/theme/workout-tokens.ts","../src/utils/workout-format.ts","../src/web-jsx/jsx-runtime.ts","../src/components/custom/Workout/SegmentedBar.tsx","../src/components/custom/Workout/SetBar.tsx","../src/components/custom/Workout/SetStrip.tsx","../src/components/custom/Workout/VelocityStrip.tsx","../src/utils/cn.ts","../src/components/custom/Workout/PlaceholderStrip.tsx","../src/components/icons/SvgIcon.tsx","../src/components/icons/icons.tsx","../src/theme/tokens/semantic.ts","../src/components/custom/Workout/BaseBadge.tsx","../src/components/custom/Workout/PrBadge.tsx","../src/components/custom/Workout/SetRow.tsx","../src/components/custom/Workout/SetTableHeader.tsx","../src/components/custom/Workout/metricText.tsx","../src/components/custom/Workout/SetsRepsLoad.tsx","../src/theme/shadows.ts","../src/utils/colors.ts","../src/components/custom/Workout/TempoDisplay.tsx","../src/components/custom/Workout/ExerciseIndicator.tsx","../src/components/custom/Workout/ExerciseHeading.tsx","../src/components/custom/Workout/ExerciseCardHeading.tsx","../src/components/custom/Workout/ExerciseCard.tsx","../src/theme/resolve-color.ts","../src/components/custom/Workout/InputBar.tsx","../src/hooks/useTimer.ts","../src/components/ui/progress/Progress.tsx","../src/components/custom/CircularTimer/CircularTimer.tsx","../src/components/custom/Workout/RestTimer.tsx","../src/components/custom/Workout/SupersetWrapper.tsx","../src/components/custom/Workout/ActiveWorkoutPage.tsx","../src/theme/elevation.ts","../src/utils/useTheme.ts","../src/components/ui/card/Card.tsx","../src/components/custom/Workout/StatusDot.tsx","../src/theme/extracted-colors-dataviz.ts","../src/components/custom/Workout/MesoStatusCard.tsx","../src/components/custom/Workout/StrengthTrendChart.tsx","../src/components/custom/Workout/CapacityBandChart.tsx","../src/components/custom/Workout/ExerciseDetailPage.tsx","../src/components/custom/Workout/MesoProgressBar.tsx","../src/components/ui/indicator/Indicator.tsx","../src/components/ui/badge/Badge.tsx","../src/components/custom/Workout/WorkoutPill.tsx","../src/components/custom/Workout/IntensityBar.tsx","../src/components/custom/Workout/WeekRow.tsx","../src/components/custom/Workout/MesoCard.tsx","../src/components/custom/Workout/MuscleGroupChip.tsx","../src/components/custom/Workout/WorkoutCard.tsx","../src/components/custom/Workout/ProgramPlanningPage.tsx"],"names":["cn","reactJsx","reactJsxs","_","View","TODO_COLOR","useState","useEffect","Easing","Animated","Pressable","Text","t","DARK","Platform","BRAND_PRIMARY","formatValue","accessibilityLabel","intensityConfig","useMemo","Fragment","MetricCell","STATUS_SUCCESS","STATUS_ERROR","STATUS_WARNING","buildColumns","toX","toY","sizeStyles","usePulse","BRAND_PRIMARY_DARK","BRAND_PRIMARY_LIGHT","ACCENT_STOPS"],"mappings":";;;;;;;;;AAOO,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,IAAA,EAAM;AAAA,IAKJ,GAAA,EAAK,SAAA;AAAA,IAEL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAGP,CAAA;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IAMH,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAIP,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IAKR,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IAEL,GAAA,EAAK,SAGP,CAAA;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IAEL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IAGL,GAAA,EAAK,SAEP,CAAA;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,CAAA,EAAG,SAAA;AAAA,IAEH,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAKP,CAAA;AAAA;AAAA,EAGA,KAAA,EAAO,SAGT,CAAA;AAuBO,IAAM,eAAA,GAAkB;AAAA,EAC7B,KAAA,EAAO,SAAA;AAAA;AAAA,EACP,UAAA,EAAY,SAAA;AAAA;AAAA,EACZ,IAAA,EAAM,SAAA;AAAA;AAAA,EACN,QAAA,EAAU,SAAA;AAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA;AAAA,EACR,OAAA,EAAS;AAAA;AACX,CAAA;AAUO,IAAM,mBAAA,GAAsB,SAAA;AAY5B,IAAM,cAAA,GAAiB;AAAA,EAC5B,GAAA,EAAK;AAAA,IACH,EAAA,EAAI,SAAA;AAAA,IAKJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAGP,CAAA;AAAA,EACA,MAAA,EAAQ;AAAA,IAGN,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAKP,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IAEJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAMP,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IAEJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAKP,CAAA;AAAA,EACA,IAAA,EAAM;AAAA,IAIJ,GAAA,EAAK,SAAA;AAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAEP,CAAA;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IAGJ,GAAA,EAAK,SAAA;AAAA,IAEL,GAAA,EAAK,SAAA;AAAA;AAAA,IACL,GAAA,EAAK,SAKP,CAAA;AAAA,EACA,OAAA,EAAS;AAAA,IAKP,GAAA,EAAK,SAAA;AAAA,IAEL,GAAA,EAAK,SAKP;AACF,CAAA;AA+FO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,cAAA,CAAe,MAAM,GAAG,CAAA;AAAA,EACxB,cAAA,CAAe,MAAM,GAAG,CAAA;AAAA,EACxB,cAAA,CAAe,MAAM,GAAG,CAAA;AAAA,EACxB,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,EACzB,cAAA,CAAe,IAAI,GAAG,CAAA;AAAA,EACtB,cAAA,CAAe,IAAI,GAAG;AACxB,CAAA;AAmBO,IAAM,eAAA,GAAkB;AAAA,EAC7B,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;;;ACrXO,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW5B,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,iBAAiB,CAAC,CAAA;AAAA;AAAA,IACzB,MAAA,EAAQ,iBAAiB,CAAC,CAAA;AAAA;AAAA,IAC1B,MAAA,EAAQ,iBAAiB,CAAC,CAAA;AAAA;AAAA,IAC1B,GAAA,EAAK,iBAAiB,CAAC;AAAA;AAAA,GACzB;AAAA,EAea;AAAA;AAAA;AAAA;AAAA,EAOb,SAAA,EAAW;AAAA,IAEU;AAAA,IACnB,KAAA,EAAO,cAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,IACnB,KAAA,EAAO,cAAA,CAAK,GAAA,CAAI,GAAG,CAIrB,CAAA;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM;AAAA,GAOV,CAAA;;;AChDO,SAAS,SAAS,GAAA,EAAqB;AAC5C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,GAAI,CAAA;AAC/B;AAeO,SAAS,YAAY,MAAA,EAAwB;AAClD,EAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAC1B;AAGO,SAAS,eAAe,QAAA,EAA0B;AACvD,EAAA,OAAO,QAAA,CAAS,QAAQ,CAAC,CAAA;AAC3B;AAGO,SAAS,WACd,KAAA,EACkC;AAClC,EAAA,OAAO,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,KAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA,GAAI,EAAE,CAAA;AACjD;ACzBA,SAAS,QAAQ,EAAA,EAAkB;AACjC,EAAA,OAAO,SAAU,IAAA,EAAM,KAAA,EAAA,GAA+B,IAAA,EAAM;AAC1D,IAAA,IAAI,SAAS,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAAY,MAAM,SAAA,EAAW;AACnE,MAAA,MAAMA,MAAK,KAAA,CAAM,SAAA;AACjB,MAAA,MAAM,WAAW,EAAE,KAAA,EAAO,MAAM,CAACA,GAAE,GAAGA,GAAAA,EAAG;AACzC,MAAA,MAAM,WAAW,KAAA,CAAM,KAAA;AACvB,MAAA,KAAA,GAAQ;AAAA,QACN,GAAG,KAAA;AAAA,QACH,KAAA,EAAO,QAAA,GAAW,CAAC,QAAA,EAAU,QAAQ,CAAA,GAAI;AAAA,OAC3C;AACA,MAAA,OAAO,KAAA,CAAM,SAAA;AAAA,IACf;AACA,IAAA,OAAO,EAAA,CAAG,IAAA,EAAM,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,EAChC,CAAA;AACF;AAEA,IAAM,GAAA,GAAM,QAAQC,KAAQ,CAAA;AAC5B,IAAM,IAAA,GAAO,QAAQC,MAAS,CAAA;;;ACjC9B,IAAM,aAAA,GAAgB,GAAA;AAGtB,IAAM,iBAAA,GAAoB,IAAA;AAG1B,IAAM,iBAAA,GAAoB,CAAA;AAgD1B,SAAS,SAAS,MAAA,EAAiC;AACjD,EAAA,MAAM,CAAC,KAAK,CAAA,GAAI,QAAA,CAAS,MAAM,IAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAEpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AAAA,MACpB,SAAS,QAAA,CAAS;AAAA,QAChB,QAAA,CAAS,OAAO,KAAA,EAAO;AAAA,UACrB,OAAA,EAAS,CAAA;AAAA,UACT,QAAA,EAAU,aAAA;AAAA,UACV,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,UAChC,eAAA,EAAiB;AAAA,SAClB,CAAA;AAAA,QACD,QAAA,CAAS,OAAO,KAAA,EAAO;AAAA,UACrB,OAAA,EAAS,CAAA;AAAA,UACT,QAAA,EAAU,aAAA;AAAA,UACV,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,UAChC,eAAA,EAAiB;AAAA,SAClB;AAAA,OACF;AAAA,KACH;AACA,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,MAAM,KAAK,IAAA,EAAK;AAAA,EACzB,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAElB,EAAA,OAAO,KAAA;AACT;AASO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,MAAA,GAAS,CAAA;AAAA,EACT,GAAA,GAAM,iBAAA;AAAA,EACN,MAAA,GAAS,CAAA;AAAA,EACT,MAAA,GAAS,IAAA;AAAA,EACT,aAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAEpD,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,CAAC,EAAE,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,UAAU,UAAA,EAAW,EAAG,KAAK,CAAA,EAAI,GAAG,KAAA,EACpF,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AACxB,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,KAAA,EAAO,CAAA,EAAA,CAAI,GAAA,CAAI,IAAA,IAAQ,KAAK,GAAG,CAAA,CAAA,CAAA;AAAA,QAC/B,MAAA,EAAQ,MAAA;AAAA,QACR,iBAAiB,GAAA,CAAI,KAAA;AAAA,QACrB,SAAS,GAAA,CAAI;AAAA,OACf;AACA,MAAA,MAAM,MAAA,GAAS,aAAA,GAAgB,GAAA,EAAK,CAAC,CAAA,IAAK,uBAAA;AAC1C,MAAA,uBACE,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,IAAI,MAAA,IAAU,CAAA;AAAA,YACpB,QAAA,EAAU,CAAA;AAAA,YACV,MAAA,EAAQ,MAAA;AAAA,YACR,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,YAAA,EAAc,MAAA;AAAA,YACd,QAAA,EAAU;AAAA,WACZ;AAAA,UAEC,cAAI,KAAA,mBACH,GAAA;AAAA,YAAC,QAAA,CAAS,IAAA;AAAA,YAAT;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,GAAG,SAAA;AAAA,gBACH,GAAI,IAAI,UAAA,GACJ;AAAA,kBACE,eAAA,EAAiB,MAAM,WAAA,CAAY;AAAA,oBACjC,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,oBACjB,aAAa,GAAA,CAAI;AAAA,mBAClB;AAAA,iBACH,GACA;AAAA,kBACE,OAAA,EAAS,MAAM,WAAA,CAAY;AAAA,oBACzB,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,oBACjB,WAAA,EAAa,CAAC,iBAAA,EAAmB,CAAC;AAAA,mBACnC;AAAA;AACH,eACN;AAAA,cACA,2BAAA,EAA2B,IAAA;AAAA,cAC3B;AAAA;AAAA,8BAGF,GAAA,CAAC,IAAA,EAAA,EAAK,OAAO,SAAA,EAAW,2BAAA,EAA2B,MAAC,MAAA,EAAgB;AAAA,SAAA;AAAA,QAhCjE;AAAA,OAkCP;AAAA,IAEJ,CAAC,CAAA;AAAA,IACA,MAAA,mBACC,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,UAAA;AAAA,UACV,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,QAAA,GAAW,GAAG,CAAA,CAAA,CAAA;AAAA,UAC9B,GAAA,EAAK,CAAA;AAAA,UACL,MAAA,EAAQ,CAAA;AAAA,UACR,KAAA,EAAO,CAAA;AAAA,UACP,iBAAiB,MAAA,CAAO;AAAA,SAC1B;AAAA,QACA,2BAAA,EAA2B,IAAA;AAAA,QAC3B,MAAA,EAAO;AAAA;AAAA,KACT,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;;;ACnKO,IAAM,eAAA,GAAkB;AAAA,EAC7B,IAAA,EAAM,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AAAA,EAC5B,QAAA,EAAU,cAAA,CAAe,MAAA,CAAO,GAAG,CAAA;AAAA,EACnC,IAAA,EAAM,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA;AAAA,EAC9B,OAAA,EAAS,cAAA,CAAe,KAAA,CAAM,GAAG;AACnC,CAAA;AAGA,IAAM,UAAA,GAAa,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAA;AAOxC,IAAM,wBAAA,GAA2B,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAK/D,IAAM,SAAA,GAAY,CAAA;AAElB,IAAM,WAAA,GAAc,CAAA;AAGpB,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,wBAAA,GAA2B,CAAA;AAEjC,IAAM,iBAAA,GAAoB,GAAA;AAM1B,IAAM,WAAA,GAAgD;AAAA,EACpD,CAAC,eAAA,CAAgB,IAAI,GAAG,CAAC,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG,cAAA,CAAe,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACzE,CAAC,eAAA,CAAgB,QAAQ,GAAG,CAAC,cAAA,CAAe,MAAA,CAAO,GAAG,CAAA,EAAG,cAAA,CAAe,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACnF,CAAC,eAAA,CAAgB,IAAI,GAAG,CAAC,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA,EAAG,cAAA,CAAe,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EAC7E,CAAC,eAAA,CAAgB,OAAO,GAAG,CAAC,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA,EAAG,cAAA,CAAe,KAAA,CAAM,GAAG,CAAC;AAClF,CAAA;AAGO,SAAS,kBAAkB,CAAA,EAAmB;AACnD,EAAA,IAAI,CAAA,GAAI,GAAA,EAAK,OAAO,eAAA,CAAgB,IAAA;AACpC,EAAA,IAAI,CAAA,GAAI,IAAA,EAAM,OAAO,eAAA,CAAgB,QAAA;AACrC,EAAA,IAAI,CAAA,GAAI,CAAA,EAAK,OAAO,eAAA,CAAgB,IAAA;AACpC,EAAA,OAAO,eAAA,CAAgB,OAAA;AACzB;AAwBA,SAAS,eAAA,CAAgB,QAAoB,GAAA,EAAoC;AAC/E,EAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAAQ,CAAC,IAAA,EAAM,EAAA,KAC3B,KAAK,GAAA,CAAI,CAAC,GAAG,EAAA,MAAQ;AAAA,MACnB,KAAA,EAAO,kBAAkB,CAAC,CAAA;AAAA,MAC1B,GAAI,KAAK,CAAA,IAAK,EAAA,KAAO,IAAI,EAAE,UAAA,EAAY,GAAA,EAAI,GAAI;AAAC,KAClD,CAAE;AAAA,GACJ;AACF;AAGA,SAAS,aAAA,CAAc,KAAA,EAAe,GAAA,EAAa,QAAA,EAA2C;AAC5F,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,KAAI,EAAG,CAAC,GAAG,CAAA,KAAM;AAC3C,IAAA,IAAI,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,OAAO,EAAE,OAAO,iBAAA,CAAkB,QAAA,CAAS,CAAC,CAAC,CAAA,EAAE;AACxE,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,GAAI,KAAA,GAAQ,aAAa,wBAAA,EAAyB;AAAA,EACpE,CAAC,CAAA;AACH;AAGA,SAAS,mBAAA,CAAoB,eAAuB,YAAA,EAA6C;AAC/F,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,aAAA,EAAc,EAAG,OAAO,EAAE,KAAA,EAAO,UAAA,EAAW,CAAE,CAAA;AACtF,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA;AAAA,IAAK,EAAE,QAAQ,YAAA,EAAa;AAAA,IAAG,CAAC,CAAA,EAAG,EAAA,KACrD,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,wBAAA,EAAyB,EAAG,CAACC,EAAAA,EAAG,EAAA,MAAQ;AAAA,MAC3D,KAAA,EAAO,wBAAA;AAAA,MACP,SAAS,iBAAA,IAAqB,EAAA;AAAA,MAC9B,GAAI,EAAA,KAAO,CAAA,GAAI,EAAE,UAAA,EAAY,WAAA,KAAgB;AAAC,KAChD,CAAE;AAAA,IACF,IAAA,EAAK;AACP,EAAA,OAAO,CAAC,GAAG,UAAA,EAAY,GAAG,KAAK,CAAA;AACjC;AAGA,SAAS,YAAY,GAAA,EAAyC;AAC5D,EAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAQ;AACzB,IAAA,OAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAQ;AACzB,IAAA,OAAO,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,iBAAA,CAAkB,CAAC,CAAA,EAAE,CAAE,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,OAAA,EAAS;AAC1B,IAAA,OAAO,cAAc,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,GAAA,EAAK,IAAI,QAAQ,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAQ;AACzB,IAAA,OAAO,eAAA,CAAgB,GAAA,CAAI,QAAA,EAAU,SAAS,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,IAAA,OAAO,eAAA,CAAgB,CAAC,GAAA,CAAI,UAAA,EAAY,GAAG,GAAA,CAAI,QAAQ,GAAG,WAAW,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,cAAA,EAAgB;AACjC,IAAA,OAAO,mBAAA,CAAoB,GAAA,CAAI,aAAA,EAAe,GAAA,CAAI,gBAAgB,qBAAqB,CAAA;AAAA,EACzF;AACA,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1C,IAAA,MAAM,KAAA,GAAQ,kBAAkB,CAAC,CAAA;AACjC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAM,UAAA,EAAY,WAAA,CAAY,KAAK,CAAA,EAAE;AAAA,EAC9D,CAAC,CAAA;AACD,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,OAAA,GAAU,GAAA,CAAI,WAAW,MAAM,CAAA;AACjE,EAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,SAAA,IAAa,OAAO,EAAE,KAAA,EAAO,UAAA,GAAa,CAAC,CAAA;AAC3F;AAGA,SAAS,oBAAoB,GAAA,EAAkC;AAC7D,EAAA,IAAI,GAAA,CAAI,OAAO,OAAO,iBAAA;AACtB,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,wBAAA,EAA0B,OAAO,oBAAA;AACnD,EAAA,OAAO,GAAA,CAAI,KAAA,KAAU,UAAA,GAAa,iBAAA,GAAoB,gBAAA;AACxD;AAgBO,SAAS,MAAA,CAAO,EAAE,GAAA,EAAK,MAAA,GAAS,GAAE,EAAgB;AACvD,EAAA,uBACE,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,YAAY,GAAG,CAAA;AAAA,MACzB,MAAA;AAAA,MACA,GAAA,EAAK,CAAA;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,aAAA,EAAe,mBAAA;AAAA,MACf,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,UAAU,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,QAAA,EAAU,QAAA,EAAS;AAAA,MACnE,MAAA,EAAO;AAAA;AAAA,GACT;AAEJ;;;AC1JA,IAAM,aAAA,GAAgB,CAAA;AAGtB,SAAS,YAAY,GAAA,EAAkD;AACrE,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,GAAA,CAAI,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,UAAA;AAAA,IAC9C,KAAK,MAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,UAAA;AAAA;AAEb;AAEA,SAAS,aAAa,IAAA,EAA6B;AACjD,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,MAAM,CAAA,CAAE,MAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,CAAC,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,QAAQ,CAAA,CAAE,MAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,UAAU,CAAA,CAAE,MAAA;AACnE,EAAA,OAAO,CAAA,cAAA,EAAiB,IAAI,CAAA,OAAA,EAAU,MAAM,iBAAiB,QAAQ,CAAA,SAAA,CAAA;AACvE;AAeO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,GAAS,GAAG,SAAA,EAAW,GAAG,OAAM,EAAkB;AACjF,EAAA,uBACE,GAAA;AAAA,IAACC,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,aAAA,EAAe,KAAA,EAAO,OAAO,MAAA,EAAQ,MAAA,EAAQ,KAAK,aAAA,EAAc;AAAA,MACzE,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAoB,aAAa,IAAI,CAAA;AAAA,MACrC,MAAA,EAAO,WAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,yBACb,MAAA,EAAA,EAAe,GAAA,EAAU,MAAA,EAAA,EAAb,CAA6B,CAC3C;AAAA;AAAA,GACH;AAEJ;;;AC8CA,IAAM,aAAa,cAAA,CAAe,KAAA;AAgBlC,IAAM,mBAAA,GAA8C;AAAA,EAClD,KAAA,EAAO,iBAAiB,CAAC,CAAA;AAAA;AAAA,EACzB,KAAA,EAAO,iBAAiB,CAAC,CAAA;AAAA;AAAA,EACzB,aAAA,EAAe,iBAAiB,CAAC,CAAA;AAAA;AAAA,EACjC,eAAA,EAAiB,iBAAiB,CAAC,CAAA;AAAA;AAAA,EACnC,QAAA,EAAU,iBAAiB,CAAC;AAAA;AAC9B,CAAA;AAKO,SAAS,qBAAqB,QAAA,EAA0B;AAC7D,EAAA,IAAI,QAAA,IAAY,GAAK,OAAO,WAAA;AAC5B,EAAA,IAAI,QAAA,IAAY,MAAM,OAAO,YAAA;AAC7B,EAAA,IAAI,QAAA,IAAY,KAAK,OAAO,YAAA;AAC5B,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,oBAAoB,QAAA,EAA0B;AAC5D,EAAA,IAAI,QAAA,IAAY,GAAK,OAAO,OAAA;AAC5B,EAAA,IAAI,QAAA,IAAY,MAAM,OAAO,OAAA;AAC7B,EAAA,IAAI,QAAA,IAAY,KAAK,OAAO,gBAAA;AAC5B,EAAA,OAAO,UAAA;AACT;AAEA,IAAM,UAAA,GAAqC;AAAA,EACzC,aAAa,UAAA,CAAW,KAAA;AAAA,EACxB,cAAc,UAAA,CAAW,MAAA;AAAA,EACzB,cAAc,UAAA,CAAW,MAAA;AAAA,EACzB,WAAW,UAAA,CAAW;AACxB,CAAA;AAOO,SAAS,sBAAsB,UAAA,EAA8B;AAClE,EAAA,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,UAAU,CAAA;AACnC,EAAA,IAAI,IAAA,IAAQ,GAAG,OAAO,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC7C,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAQ,IAAA,GAAO,IAAA,IAAQ,IAAA,GAAQ,GAAG,CAAC,CAAA;AAC7D;AAGO,SAAS,sBAAsB,UAAA,EAA8B;AAClE,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AACpC,EAAA,MAAM,GAAA,GAAM,WAAW,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AACpD,EAAA,OAAO,MAAM,UAAA,CAAW,MAAA;AAC1B;AAGA,SAAS,YAAA,CACP,UACA,KAAA,EACkC;AAClC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,GAAA,KAAQ,IAAA,IAAQ,QAAA,GAAW,IAAA,CAAK,KAAK,OAAO,IAAA;AAAA,EACvD;AACA,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAC/B;AAEA,SAAS,UAAU,IAAA,EAAoC;AACrD,EAAA,OAAO,mBAAA,CAAoB,IAAA,CAAK,EAAE,CAAA,IAAK,UAAA,CAAW,KAAA;AACpD;AAEA,SAAS,aAAa,IAAA,EAA6C;AACjE,EAAA,IAAI,OAAO,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,WAAW,GAAA,EAAI;AAC9C,EAAA,IAAI,OAAO,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,WAAW,MAAA,EAAO;AACjD,EAAA,OAAO,IAAA;AACT;AAqCA,IAAM,OAAA,GAAU,CAAA;AAQhB,IAAM,QAAA,GAAW,CAAA;AAGjB,IAAMC,WAAAA,GAAa,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAA;AAE/C,IAAM,gBAAA,GAAmB,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAGhD,SAAS,qBAAqB,GAAA,EAA4B;AACxD,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,MAAA;AACH,MAAA,OAAO,GAAA,CAAI,SAAS,IAAA,EAAK;AAAA,IAC3B,KAAK,KAAA;AACH,MAAA,OAAO,CAAC,GAAG,GAAA,CAAI,UAAA,EAAY,GAAG,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AAAA,IACnD;AACE,MAAA,OAAO,GAAA,CAAI,UAAA;AAAA;AAEjB;AAGA,SAAS,gBAAgB,MAAA,EAAoC;AAC3D,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,QAAA,EAAU,EAAA,KAAO;AAC9B,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,KAAW,CAAA;AAC/B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,KAAA,GAAQ,CAAA,GAAI,EAAA,KAAO,CAAA,GAAI,QAAA,GAAW,OAAA,EAAS,CAAA;AAAA,IAC7F,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,WAAW,GAAA,EAAkC;AACpD,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,UAAA,CAAW,QAAQ,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA;AAClF,MAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,KAAM;AAC7C,QAAA,MAAM,IAAA,GAAO,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,MAAA;AAChC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,OAAO,KAAA,GAAQ,MAAA;AAAA,UACrB,QAAA,EAAU,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAAA,UACrC,UAAA,EAAY,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI;AAAA,SAC5B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,GAAA,EAAK,GAAA,CAAI,WAAW,MAAM,CAAA;AACrD,MAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,KAAM;AAC7C,QAAA,MAAM,IAAA,GACJ,IAAI,GAAA,CAAI,UAAA,CAAW,SAAS,KAAA,GAAQ,CAAA,GAAI,GAAA,CAAI,KAAA,GAAQ,MAAA,GAAS,UAAA;AAC/D,QAAA,OAAO;AAAA,UACL,IAAA;AAAA,UACA,UAAU,IAAA,KAAS,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAAA,UAC/C,UAAA,EAAY,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI;AAAA,SAC5B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,OAAO,GAAA,CAAI,UAAA,CAAW,GAAA,CAAkB,CAAC,UAAU,CAAA,MAAO;AAAA,QAC9D,IAAA,EAAM,KAAA;AAAA,QACN,QAAA;AAAA,QACA,UAAA,EAAY,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI;AAAA,OAC5B,CAAE,CAAA;AACF,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,KAAK,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,OAAA,EAAS,CAAA;AAC3E,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,eAAA,CAAgB,IAAI,QAAQ,CAAA;AAAA,IACrC,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,KAAA,GAAQ,gBAAgB,CAAC,GAAA,CAAI,YAAY,GAAG,GAAA,CAAI,QAAQ,CAAC,CAAA;AAC/D,MAAA,IAAI,GAAA,CAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,SAAS,CAAA;AAC3F,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,UAAA,CAAW,QAAQ,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA;AAClF,MAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,KAAM;AAC7C,QAAA,MAAM,IAAA,GAAO,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,MAAA;AAChC,QAAA,MAAM,QAAA,GAAW,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,IAAI,SAAA,KAAc,CAAA;AAChD,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,OAAO,KAAA,GAAQ,MAAA;AAAA,UACrB,QAAA,EAAU,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,GAAI,MAAA;AAAA,UACrC,UAAA,EAAY,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,WAAW,QAAA,GAAW;AAAA,SAClD;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA;AAEJ;AAGA,SAAS,qBAAA,CAAsB,KAAkB,QAAA,EAA0B;AACzE,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,UAAA;AACH,MAAA,OAAO,iCAAiC,QAAQ,CAAA,KAAA,CAAA;AAAA,IAClD,KAAK,OAAA;AACH,MAAA,OAAO,wCAAwC,GAAA,CAAI,KAAK,OAAO,GAAA,CAAI,GAAG,KAAK,QAAQ,CAAA,UAAA,CAAA;AAAA,IACrF,KAAK,OAAA;AACH,MAAA,OAAO,8BAA8B,QAAQ,CAAA,kBAAA,CAAA;AAAA,IAC/C,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,0BAAA,EAA6B,GAAA,CAAI,QAAA,CAAS,MAAM,WAAW,QAAQ,CAAA,KAAA,CAAA;AAAA,IAC5E,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,8BAAA,EAAiC,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,SAAA,EAAY,IAAI,IAAA,GAAO,QAAA,GAAW,EAAE,CAAA,EAAA,EAAK,QAAQ,CAAA,KAAA,CAAA;AAAA,IAC9G,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,uCAAA,EAA0C,GAAA,CAAI,SAAS,CAAA,EAAA,EAAK,QAAQ,CAAA,KAAA,CAAA;AAAA;AAEjF;AAGA,SAAS,sBAAA,CAAuB,MAAoB,KAAA,EAAuB;AACzE,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,QAAQ,CAAC,CAAA,EAAA,EAAK,eAAe,IAAA,CAAK,QAAA,IAAY,CAAC,CAAC,CAAA,kBAAA,CAAA;AAAA,IAChE,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,QAAQ,CAAC,CAAA,SAAA,CAAA;AAAA,IACzB,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,QAAQ,CAAC,CAAA,UAAA,CAAA;AAAA,IACzB,KAAK,UAAA;AACH,MAAA,OAAO,YAAA;AAAA;AAEb;AAGA,IAAM,sBAAA,GAAyB,EAAA;AAE/B,IAAM,oBAAA,GAAuB,EAAA;AAG7B,IAAM,eAAA,GAAkB,EAAA;AAMxB,IAAM,kBAAA,GAAqB,IAAA;AAE3B,IAAM,gBAAA,GAAmB,CAAA;AAQzB,IAAM,WAAA,GAAc,GAAA;AAEpB,IAAM,mBAAA,GAAsB,EAAA;AAE5B,IAAM,YAAA,GAAe,CAAA;AAErB,IAAM,kBAAA,GAAqB,GAAA;AAE3B,IAAM,wBAAA,GAA2B,EAAA;AAEjC,IAAM,eAAA,GAAkB,CAAA;AAExB,IAAM,mBAAA,GAAsB,CAAA;AAE5B,IAAM,kBAAA,GAAqB,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAA;AAEvD,IAAM,oBAAA,GAAuB,eAAA,CAAgB,QAAA,CAAS,CAAC,CAAA;AAMvD,IAAM,aAAA,GAAgB,IAAA;AAGtB,SAAS,gBAAA,CAAiB,OAAyB,WAAA,EAA6B;AAC9E,EAAA,OAAO,KAAA,KAAU,OAAA,GAAU,kBAAA,GAAqB,WAAA,GAAc,aAAA;AAChE;AAGA,SAAS,cAAA,CAAe,IAAA,EAAoB,MAAA,EAAgB,KAAA,EAAuB;AACjF,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,IAAS,KAAA,IAAS,GAAG,OAAO,gBAAA;AAC9C,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,QAAA,IAAY,KAAK,KAAK,CAAA;AACtD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,KAAA,GAAQ,MAAM,CAAA;AAClD;AAEA,SAAS,0BAAA,GAAsC;AAC7C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,UAAA,KAAe,YAAY,OAAO,KAAA;AACrF,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC/D;AAGA,SAAS,uBAAA,GAAmC;AAC1C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,SAAS,0BAA0B,CAAA;AACjE,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AAC9E,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,EAAA,CAAG,OAAO,CAAA;AAC3C,IAAA,OAAA,EAAQ;AACR,IAAA,EAAA,CAAG,gBAAA,GAAmB,UAAU,OAAO,CAAA;AACvC,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,GAAsB,QAAA,EAAU,OAAO,CAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,mBAAmBC,MAAAA,CAAO,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACvD,IAAM,aAAaA,MAAAA,CAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAQpD,SAAS,aAAA,CACP,MAAA,EACA,YAAA,EACA,YAAA,EACA,SAAA,EACgB;AAChB,EAAA,MAAM,uBAAuB,uBAAA,EAAwB;AACrD,EAAA,MAAM,CAAC,SAAS,CAAA,GAAIF,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AACxD,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,YAAA,IAAgB,IAAA,IAAQ,gBAAgB,IAAA,EAAM;AAC7D,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,SAAA,CAAU,SAAS,CAAC,CAAA;AACpB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,SAAS,CAAC,CAAA;AACpB,MAAAE,SAAS,QAAA,CAAS;AAAA,QAChBA,QAAAA,CAAS,OAAO,SAAA,EAAW;AAAA,UACzB,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,GAAA;AAAA,UACV,MAAA,EAAQD,MAAAA,CAAO,GAAA,CAAIA,MAAAA,CAAO,IAAI,CAAA;AAAA,UAC9B,eAAA,EAAiB;AAAA,SAClB,CAAA;AAAA,QACDC,QAAAA,CAAS,OAAO,SAAA,EAAW;AAAA,UACzB,OAAA,EAAS,CAAA;AAAA,UACT,QAAA,EAAU,CAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,eAAA,EAAiB;AAAA,SAClB;AAAA,OACF,EAAE,KAAA,EAAM;AAAA,IACX,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,SAAS,GAAG,CAAA;AACtB,MAAAA,QAAAA,CAAS,OAAO,SAAA,EAAW;AAAA,QACzB,OAAA,EAAS,CAAA;AAAA,QACT,QAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAQ,UAAA;AAAA,QACR,eAAA,EAAiB;AAAA,OAClB,EAAE,KAAA,EAAM;AAAA,IACX;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAA,EAAc,cAAc,SAAA,EAAW,oBAAA,EAAsB,SAAS,CAAC,CAAA;AACnF,EAAA,OAAO,SAAA;AACT;AAyBA,SAAS,iBAAA,CAAkB;AAAA,EACzB,cAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,YAAA,GAAe,YAAA,IAAgB,IAAA,GAAO,cAAA,CAAe,YAAY,CAAA,GAAI,MAAA;AAC3E,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,IAAA,EAAM,YAAA,EAAc,cAAc,SAAS,CAAA;AAI3E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,eAAe,CAAC,CAAA,KAAyB,SAAS,CAAA,CAAE,WAAA,CAAY,OAAO,KAAK,CAAA;AAGlF,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,mBAAmB,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,CAAC,QAAA,KACjB,UAAA,GAAa,IACT,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,GAAW,UAAU,CAAA,GAAI,UAAU,CAAA,GAC7E,mBAAA;AAEN,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,IAAI,UAAA,IAAc,CAAA,IAAK,eAAe,MAAM,CAAA;AAC1E,EAAA,MAAM,WAAA,GACJ,iBAAA,GAAoB,CAAA,IAAK,UAAA,GAAa,CAAA,GAClC,IAAA,CAAK,GAAA,CAAI,UAAA,EAAa,iBAAA,GAAoB,UAAA,GAAc,UAAU,CAAA,GAClE,CAAA;AAGN,EAAA,MAAM,UAAA,GAAa,eAAe,MAAA,GAAS,YAAA;AAC3C,EAAA,MAAM,QAAA,GACJ,KAAA,GAAQ,CAAA,IAAK,UAAA,GAAa,CAAA,GACtB,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAA,CAAqB,KAAA,GAAQ,YAAA,IAAgB,UAAA,GAAa,CAAA,CAAA,IAAM,UAAU,CAAA,GACnF,kBAAA;AACN,EAAA,MAAM,aAAA,GAAgB,KAAA,GAAQ,CAAA,IAAK,QAAA,GAAW,wBAAA;AAE9C,EAAA,MAAM,OAAA,GACJ,UAAU,CAAA,GAAI,YAAA,GAAe,WAAW,EAAA,GAAK,CAAA,GAAI,QAAA,GAAW,EAAA,GAAK,CAAA,GAAI,YAAA;AACvE,EAAA,MAAM,YAAY,cAAA,CAAe,MAAA;AAAA,IAC/B,CAAC,MAAM,CAAA,EAAG,CAAA,KAAO,IAAI,cAAA,CAAe,IAAI,IAAI,CAAA,GAAI,IAAA;AAAA,IAChD;AAAA,GACF;AACA,EAAA,MAAM,eAAe,CAAC,CAAA,KACpB,CAAC,aAAA,IAAiB,CAAA,KAAM,aAAa,CAAA,KAAM,YAAA;AAE7C,EAAA,MAAM,WAAW,cAAA,CAAe,MAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAc,QAAQ,CAAA;AACvD,EAAA,MAAM,KAAA,GACJ,iBAAA,GAAoB,CAAA,GAChB,CAAA,gBAAA,EAAmB,QAAQ,CAAA,IAAA,EAAO,KAAK,CAAA,YAAA,EAAe,cAAA,CAAe,iBAAiB,CAAC,CAAA,kBAAA,CAAA,GACvF,CAAA,gBAAA,EAAmB,QAAQ,OAAO,KAAK,CAAA,KAAA,CAAA;AAE7C,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,GAAG,WAAU,GAAI,SAAA;AAE/C,EAAA,uBACE,GAAA;AAAA,IAACF,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,CAAC,EAAE,MAAA,IAAU,aAAa,CAAA;AAAA,MACjC,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAoB,KAAA;AAAA,MACpB,MAAA,EAAO,qBAAA;AAAA,MACN,GAAG,SAAA;AAAA,MAEJ,QAAA,kBAAA,IAAA;AAAA,QAACA,IAAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,YAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,aAAA,EAAe,KAAA;AAAA,YACf,UAAA,EAAY,UAAA;AAAA,YACZ,GAAA,EAAK,OAAA;AAAA,YACL,QAAA,EAAU,UAAA;AAAA,YACV,iBAAA,EAAmB,CAAA;AAAA,YACnB,iBAAA,EAAmB;AAAA,WACrB;AAAA,UAUC,QAAA,EAAA;AAAA,YAAA,WAAA,GAAc,CAAA,oBACb,GAAA;AAAA,cAACA,IAAAA;AAAA,cAAA;AAAA,gBACC,2BAAA,EAA2B,IAAA;AAAA,gBAC3B,KAAA,EAAO;AAAA,kBACL,QAAA,EAAU,UAAA;AAAA,kBACV,IAAA,EAAM,CAAA;AAAA,kBACN,KAAA,EAAO,CAAA;AAAA,kBACP,MAAA,EAAQ,WAAA;AAAA,kBACR,cAAA,EAAgB,CAAA;AAAA,kBAChB,WAAA,EAAa,QAAA;AAAA,kBACb,WAAA,EAAa,oBAAA;AAAA,kBACb,aAAA,EAAe;AAAA,iBACjB;AAAA,gBACA,MAAA,EAAO;AAAA;AAAA,aACT;AAAA,YAGD,cAAA,CAAe,GAAA,CAAI,CAAC,QAAA,EAAU,CAAA,KAAM;AACnC,cAAA,MAAM,SAAS,YAAA,KAAiB,CAAA;AAChC,cAAA,uBACE,IAAA;AAAA,gBAACA,IAAAA;AAAA,gBAAA;AAAA,kBAEC,2BAAA,EAA2B,IAAA;AAAA,kBAC3B,KAAA,EAAO;AAAA,oBACL,IAAA,EAAM,CAAA;AAAA,oBACN,QAAA,EAAU,kBAAA;AAAA,oBACV,MAAA,EAAQ,MAAA;AAAA,oBACR,UAAA,EAAY,QAAA;AAAA,oBACZ,cAAA,EAAgB;AAAA,mBAClB;AAAA,kBAEC,QAAA,EAAA;AAAA,oBAAA,YAAA,CAAa,CAAC,CAAA,oBACb,GAAA;AAAA,sBAAC,IAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,mBAAA;AAAA,wBACV,OAAO,EAAE,QAAA,EAAU,IAAI,UAAA,EAAY,KAAA,EAAO,cAAc,CAAA,EAAE;AAAA,wBAC1D,MAAA,EAAQ,kBAAkB,CAAC,CAAA,CAAA;AAAA,wBAE1B,yBAAe,QAAQ;AAAA;AAAA,qBAC1B;AAAA,oCAEF,GAAA;AAAA,sBAACK,QAAAA,CAAS,IAAA;AAAA,sBAAT;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL;AAAA,4BACE,KAAA,EAAO,MAAA;AAAA,4BACP,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,4BAC1B,mBAAA,EAAqB,eAAA;AAAA,4BACrB,oBAAA,EAAsB,eAAA;AAAA,4BACtB,eAAA,EAAiB,YAAY,QAAQ;AAAA,2BACvC;AAAA,0BACA,MAAA,GAAS,EAAE,SAAA,EAAW,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA,EAAE,GAAI;AAAA,yBACnD;AAAA,wBACA,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AAAA;AAAA;AAC3B;AAAA,iBAAA;AAAA,gBA/BK;AAAA,eAgCP;AAAA,YAEJ,CAAC,CAAA;AAAA,YAEA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,cAAa,EAAG,CAAC,GAAG,CAAA,qBACxC,GAAA;AAAA,cAACL,IAAAA;AAAA,cAAA;AAAA,gBAEC,2BAAA,EAA2B,IAAA;AAAA,gBAC3B,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM,CAAA;AAAA,kBACN,QAAA,EAAU,kBAAA;AAAA,kBACV,MAAA,EAAQ,MAAA;AAAA,kBACR,UAAA,EAAY,QAAA;AAAA,kBACZ,cAAA,EAAgB;AAAA,iBAClB;AAAA,gBAEA,QAAA,kBAAA,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,KAAA,EAAO,MAAA;AAAA,sBACP,QAAQ,mBAAA,GAAsB,CAAA;AAAA,sBAC9B,WAAA,EAAa,CAAA;AAAA,sBACb,WAAA,EAAa,QAAA;AAAA,sBACb,WAAA,EAAa,kBAAA;AAAA,sBACb,mBAAA,EAAqB,eAAA;AAAA,sBACrB,oBAAA,EAAsB;AAAA,qBACxB;AAAA,oBACA,MAAA,EAAO;AAAA;AAAA;AACT,eAAA;AAAA,cArBK,WAAW,CAAC,CAAA;AAAA,aAuBpB;AAAA;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,UAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,UAAA;AAAA,EACV,MAAA,GAAS,eAAA;AAAA,EACT,UAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR,WAAA,GAAc,IAAA;AAAA,EACd,QAAA,GAAW,IAAA;AAAA,EACX,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuB;AAIrB,EAAA,MAAM,iBAAiB,GAAA,GAAM,oBAAA,CAAqB,GAAG,CAAA,GAAK,cAAc,EAAC;AACzE,EAAA,MAAM,KAAA,GAAwB,MAC1B,UAAA,CAAW,GAAG,IACd,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,IAC5B,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI;AAAA,GAC5B,CAAE,CAAA;AAEN,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,GAAG,gBAAgB,CAAC,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,sBAAsB,cAAc,CAAA;AACzD,EAAA,MAAM,IAAA,GAAO,sBAAsB,cAAc,CAAA;AAIjD,EAAA,MAAM,SAAS,WAAA,IAAe,QAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,EAAO,WAAW,CAAA;AAEtD,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,IAAA,IAAQ,KAAA,CAAM,MAAA,GAAS,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KACnB,QAAA,GAAW,SAAA,CAAU,YAAA,CAAa,CAAA,EAAG,KAAK,CAAE,CAAA,GAAI,UAAA,CAAW,oBAAA,CAAqB,CAAC,CAAC,CAAA;AACpF,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAA+B;AAChD,IAAA,IAAI,KAAK,IAAA,KAAS,KAAA,SAAc,WAAA,CAAY,IAAA,CAAK,YAAY,CAAC,CAAA;AAC9D,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,OAAOC,WAAAA;AACjC,IAAA,OAAO,wBAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,WACZ,YAAA,CAAa,YAAA,EAAc,KAAK,CAAA,EAAG,KAAA,IAAS,EAAA,GAC7C,mBAAA,CAAoB,YAAY,CAAA;AAEpC,EAAA,MAAM,CAAC,UAAU,CAAA,GAAIC,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,QAAA,GAAW,MAAA,GAAS,CAAC,CAAC,CAAA;AAC7E,EAAA,MAAM,CAAC,YAAY,CAAA,GAAIH,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,QAAA,GAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAC1E,EAAA,MAAM,CAAC,WAAW,CAAA,GAAIH,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,QAAA,GAAW,CAAA,GAAI,CAAC,CAAC,CAAA;AAGzE,EAAA,MAAM,YAAA,GAAe,YAAA,IAAgB,IAAA,GAAO,cAAA,CAAe,YAAY,CAAA,GAAI,MAAA;AAC3E,EAAA,MAAM,SAAA,GAAY,YAAA,IAAgB,IAAA,IAAQ,WAAA,GAAc,KAAK,YAAA,KAAiB,WAAA;AAC9E,EAAA,MAAM,SAAA,GAAY,aAAA;AAAA,IAChB,YAAY,UAAA,IAAc,MAAA;AAAA,IAC1B,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,KAAY,UAAA,IAAc,CAAC,MAAA,EAAQ;AAEvC,IAAAE,SAAS,QAAA,CAAS;AAAA,MAChBA,QAAAA,CAAS,OAAO,UAAA,EAAY;AAAA,QAC1B,OAAA,EAAS,WAAW,MAAA,GAAS,CAAA;AAAA,QAC7B,QAAA,EAAU,kBAAA;AAAA,QACV,MAAA,EAAQ,gBAAA;AAAA,QACR,eAAA,EAAiB;AAAA,OAClB,CAAA;AAAA,MACDA,QAAAA,CAAS,OAAO,YAAA,EAAc;AAAA,QAC5B,OAAA,EAAS,WAAW,CAAA,GAAI,CAAA;AAAA,QACxB,QAAA,EAAU,GAAA;AAAA,QACV,KAAA,EAAO,WAAW,GAAA,GAAM,CAAA;AAAA,QACxB,eAAA,EAAiB;AAAA,OAClB,CAAA;AAAA,MACDA,QAAAA,CAAS,OAAO,WAAA,EAAa;AAAA,QAC3B,OAAA,EAAS,WAAW,CAAA,GAAI,CAAA;AAAA,QACxB,QAAA,EAAU,GAAA;AAAA,QACV,KAAA,EAAO,WAAW,GAAA,GAAM,CAAA;AAAA,QACxB,eAAA,EAAiB;AAAA,OAClB;AAAA,KACF,EAAE,KAAA,EAAM;AAAA,EACX,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAc,WAAW,CAAC,CAAA;AAG7E,EAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,UAAA,IAAc,IAAA,EAAM,OAAO,IAAA;AAE9C,EAAA,MAAM,WAAW,cAAA,CAAe,MAAA;AAChC,EAAA,MAAM,YAAY,GAAA,GAAM,qBAAA,CAAsB,KAAK,QAAQ,CAAA,GAAI,mBAAmB,QAAQ,CAAA,KAAA,CAAA;AAE1F,EAAA,IAAI,YAAY,MAAA,EAAQ;AAGtB,IAAA,MAAM,UAAA,GAAa,MAAA,KAAW,eAAA,GAAkB,WAAA,GAAc,MAAA;AAC9D,IAAA,uBACE,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,cAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,iBAAA,EAAmB,WAAA;AAAA,QACnB,YAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,SAAA;AAAA,QACA,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,EAEJ;AAEA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,GAAG,WAAU,GAAI,KAAA;AAI/C,IAAA,uBACE,GAAA;AAAA,MAACL,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,EAAE,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,KAAK,OAAA,EAAS,YAAA,EAAc,CAAA,EAAG,QAAA,EAAU,QAAA,EAAS;AAAA,UACrF;AAAA,SACF;AAAA,QACA,iBAAA,EAAkB,OAAA;AAAA,QAClB,kBAAA,EAAoB,SAAA;AAAA,QACpB,MAAA,EAAO,qBAAA;AAAA,QACN,GAAG,SAAA;AAAA,QAEH,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChB,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,CAAA;AAAA,cACN,eAAA,EAAiB,UAAU,IAAI,CAAA;AAAA,cAC/B,YAAA,EAAc,CAAA;AAAA,cACd,QAAA,EAAU,CAAA;AAAA,cACV,MAAA,EAAQ,MAAA;AAAA;AAAA;AAAA,cAGR,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,cACjD,GAAI,IAAA,CAAK,IAAA,KAAS,UAAA,GACd,EAAE,aAAa,CAAA,EAAG,WAAA,EAAa,gBAAA,EAAiB,GAChD;AAAC,aACP;AAAA,YACA,2BAAA,EAA2B,IAAA;AAAA,YAC3B,MAAA,EAAQ,KAAK,IAAA,KAAS,KAAA,GAAQ,gBAAgB,CAAC,CAAA,CAAA,GAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA;AAAA,WAAA;AAAA,UAfzE;AAAA,SAiBR;AAAA;AAAA,KACH;AAAA,EAEJ;AAMA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,GAAG,WAAU,GAAI,KAAA;AAC/C,IAAA,uBACE,GAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,EAAE,aAAA,EAAe,KAAA,EAAO,QAAQ,GAAA,EAAK,OAAA,EAAS,YAAY,UAAA,EAAW;AAAA,UACrE;AAAA,SACF;AAAA,QACA,iBAAA,EAAkB,OAAA;AAAA,QAClB,kBAAA,EAAoB,SAAA;AAAA,QACpB,MAAA,EAAO,wBAAA;AAAA,QACN,GAAG,SAAA;AAAA,QAEH,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChB,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,CAAA;AAAA,cACN,QAAA,EAAU,CAAA;AAAA,cACV,MAAA,EAAQ,cAAA,CAAe,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAA;AAAA;AAAA;AAAA,cAG/C,mBAAA,EAAqB,CAAA;AAAA,cACrB,oBAAA,EAAsB,CAAA;AAAA,cACtB,eAAA,EAAiB,UAAU,IAAI,CAAA;AAAA,cAC/B,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,cACjD,GAAI,IAAA,CAAK,IAAA,KAAS,UAAA,GACd,EAAE,aAAa,CAAA,EAAG,WAAA,EAAa,gBAAA,EAAiB,GAChD;AAAC,aACP;AAAA,YACA,2BAAA,EAA2B,IAAA;AAAA,YAC3B,MAAA,EAAQ,KAAK,IAAA,KAAS,KAAA,GAAQ,gBAAgB,CAAC,CAAA,CAAA,GAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA;AAAA,WAAA;AAAA,UAhBzE;AAAA,SAkBR;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,aAAa,GAAA,GACf,CAAA,EAAG,qBAAA,CAAsB,GAAA,EAAK,QAAQ,CAAC,CAAA,SAAA,EAAY,QAAA,GAAW,UAAA,GAAa,QAAQ,CAAA,CAAA,GACnF,CAAA,wBAAA,EAA2B,QAAQ,CAAA,cAAA,EAAiB,QAAA,GAAW,aAAa,QAAQ,CAAA,CAAA;AAExF,EAAA,MAAM,0BAA0B,QAAA,IAAY,IAAA;AAC5C,EAAA,MAAM,kBAAA,GAAqB,cAAc,IAAA,IAAQ,QAAA;AAKjD,EAAA,MAAM,UACJ,GAAA,IAAO,IAAA,IACP,MAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACrB,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,IAAA,KAAS,UAAA,IAAc,KAAK,IAAA,KAAS,KAAA;AAC/D,IAAA,MAAM,YAAY,aAAA,GACd,UAAA,GAAa,CAAA,GACX,IAAA,CAAK,OAAQ,IAAA,CAAK,QAAA,IAAY,CAAA,IAAK,UAAA,GAAc,GAAG,CAAA,GACpD,CAAA,GACF,GAAA,CAAI,IAAA,KAAS,aACX,sBAAA,GACA,oBAAA;AACN,IAAA,uBACE,GAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QAEC,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,CAAA;AAAA,UACN,MAAA,EAAQ,MAAA;AAAA,UACR,cAAA,EAAgB,UAAA;AAAA,UAChB,YAAY,IAAA,CAAK;AAAA,SACnB;AAAA,QAEA,QAAA,kBAAA,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,MAAA,EAAQ,GAAG,SAAS,CAAA,CAAA,CAAA;AAAA,cACpB,SAAA,EAAW,CAAA;AAAA,cACX,mBAAA,EAAqB,CAAA;AAAA,cACrB,oBAAA,EAAsB,CAAA;AAAA,cACtB,eAAA,EAAiB,UAAU,IAAI,CAAA;AAAA,cAC/B,GAAI,IAAA,CAAK,IAAA,KAAS,UAAA,GACd,EAAE,aAAa,CAAA,EAAG,WAAA,EAAa,gBAAA,EAAiB,GAChD;AAAC,aACP;AAAA,YACA,MAAA,EAAQ,KAAK,IAAA,KAAS,KAAA,GAAQ,gBAAgB,CAAC,CAAA,CAAA,GAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,YAC9E,iBAAA,EAAkB,OAAA;AAAA,YAClB,kBAAA,EAAoB,sBAAA,CAAuB,IAAA,EAAM,CAAC;AAAA;AAAA;AACpD,OAAA;AAAA,MAtBK;AAAA,KAuBP;AAAA,EAEJ,CAAC,CAAA;AAEH,EAAA,MAAM,YAAA,mBACJ,IAAA;AAAA,IAACK,QAAAA,CAAS,IAAA;AAAA,IAAT;AAAA,MACC,SAAA,EAAW,CAAC,SAAA,EAAW,QAAA,GAAW,mBAAA,GAAsB,gBAAgB,CAAA,CACrE,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL;AAAA,UACE,MAAA,EAAQ,UAAA;AAAA,UACR,KAAA,EAAO,MAAA;AAAA,UACP,GAAA,EAAK,CAAA;AAAA,UACL,YAAA,EAAc,WAAW,CAAA,GAAI,CAAA;AAAA,UAC7B,UAAA,EAAY,WAAW,EAAA,GAAK,CAAA;AAAA,UAC5B,aAAA,EAAe,WAAW,EAAA,GAAK,CAAA;AAAA;AAAA;AAAA,UAG/B,iBAAA,EAAmB,CAAA;AAAA,UACnB,eAAA,EAAiB,WAAW,MAAA,GAAY,CAAA;AAAA,UACxC,QAAA,EAAU,WAAW,SAAA,GAAY;AAAA;AACnC,OACF;AAAA,MACA,iBAAA,EAAmB,uBAAA,IAA2B,kBAAA,GAAqB,MAAA,GAAS,QAAA;AAAA,MAC5E,kBAAA,EAAoB,uBAAA,IAA2B,kBAAA,GAAqB,MAAA,GAAY,UAAA;AAAA,MAChF,MAAA,EAAO,gBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAACL,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,eAAe,KAAA,EAAO,IAAA,EAAM,GAAG,GAAA,EAAK,GAAA,GAAM,IAAI,CAAA,EAAG,UAAA,EAAY,YAAW,EACpF,QAAA,EAAA,GAAA,GACG,UACA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,UAAA,MAAM,aAAA,GAAgB,YAAY,CAAC,CAAA;AAGnC,UAAA,MAAM,YAAA,GAAe,aAAa,CAAA,GAAI,IAAA,CAAK,MAAO,CAAA,GAAI,UAAA,GAAc,GAAG,CAAA,GAAI,CAAA;AAC3E,UAAA,MAAM,SAAS,YAAA,KAAiB,CAAA;AAChC,UAAA,MAAM,eAAA,GAAkB,MAAA,GACpB,SAAA,GACE,4BAAA,GACA,cAAA,GACF,EAAA;AAEJ,UAAA,MAAM,WAAsB,QAAA,GACxB;AAAA,YACE,MAAA,EAAQ,GAAG,YAAY,CAAA,CAAA,CAAA;AAAA,YACvB,SAAA,EAAW,CAAA;AAAA,YACX,mBAAA,EAAqB,CAAA;AAAA,YACrB,oBAAA,EAAsB,CAAA;AAAA,YACtB,eAAA,EAAiB;AAAA,WACnB,GACA;AAAA,YACE,SAAA,EAAW,MAAA;AAAA,YACX,mBAAA,EAAqB,CAAA;AAAA,YACrB,oBAAA,EAAsB,CAAA;AAAA,YACtB,sBAAA,EAAwB,CAAA;AAAA,YACxB,uBAAA,EAAyB,CAAA;AAAA,YACzB,eAAA,EAAiB;AAAA,WACnB;AAEJ,UAAA,MAAM,WAAW,MAAA,mBACf,GAAA;AAAA,YAACK,QAAAA,CAAS,IAAA;AAAA,YAAT;AAAA,cACC,KAAA,EAAO,CAAC,QAAA,EAAU,EAAE,SAAA,EAAW,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA,EAAG,CAAA;AAAA,cACvD,MAAA,EAAQ,gBAAgB,CAAC,CAAA,CAAA;AAAA,cACzB,iBAAA,EAAkB,OAAA;AAAA,cAClB,kBAAA,EAAoB,OAAO,CAAA,GAAI,CAAC,KAAK,cAAA,CAAe,CAAC,CAAC,CAAA,kBAAA,EAAqB,eAAe,CAAA;AAAA;AAAA,WAC5F,mBAEA,GAAA;AAAA,YAACL,IAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,QAAA;AAAA,cACP,MAAA,EAAQ,gBAAgB,CAAC,CAAA,CAAA;AAAA,cACzB,iBAAA,EAAkB,OAAA;AAAA,cAClB,oBAAoB,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,cAAA,CAAe,CAAC,CAAC,CAAA,kBAAA;AAAA;AAAA,WACxD;AAGF,UAAA,MAAM,GAAA,mBACJ,IAAA;AAAA,YAACA,IAAAA;AAAA,YAAA;AAAA,cAEC,KAAA,EAAO;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,MAAA,EAAQ,MAAA;AAAA,gBACR,cAAA,EAAgB,UAAA;AAAA,gBAChB,QAAA,EAAU;AAAA,eACZ;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,QAAA,IAAY,WAAA,oBACX,GAAA;AAAA,kBAACK,QAAAA,CAAS,IAAA;AAAA,kBAAT;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,OAAA,EAAS,YAAA;AAAA,sBACT,UAAA,EAAY,QAAA;AAAA,sBACZ,QAAA,EAAU,UAAA;AAAA,sBACV,GAAA,EAAK,GAAA;AAAA,sBACL,IAAA,EAAM,CAAA;AAAA,sBACN,KAAA,EAAO;AAAA,qBACT;AAAA,oBACA,2BAAA,EAA2B,IAAA;AAAA,oBAE3B,QAAA,kBAAA,GAAA;AAAA,sBAAC,IAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,qBAAA;AAAA,wBACV,KAAA,EAAO,EAAE,QAAA,EAAU,CAAA,EAAG,YAAY,KAAA,EAAM;AAAA,wBACxC,MAAA,EAAQ,kBAAkB,CAAC,CAAA,CAAA;AAAA,wBAE1B,yBAAe,CAAC;AAAA;AAAA;AACnB;AAAA,iBACF;AAAA,gBAED;AAAA;AAAA,aAAA;AAAA,YA7BI;AAAA,WA8BP;AAGF,UAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,YAAA,uBACE,GAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBAEC,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,gBACjC,OAAA,EAAS,MAAM,UAAA,CAAW,CAAA,EAAG,CAAC,CAAA;AAAA,gBAC9B,iBAAA,EAAkB,QAAA;AAAA,gBAClB,oBAAoB,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,cAAA,CAAe,CAAC,CAAC,CAAA,mCAAA,CAAA;AAAA,gBACtD,MAAA,EAAQ,0BAA0B,CAAC,CAAA,CAAA;AAAA,gBAElC,QAAA,EAAA;AAAA,eAAA;AAAA,cAPI;AAAA,aAQP;AAAA,UAEJ;AAEA,UAAA,OAAO,GAAA;AAAA,QACT,CAAC,CAAA,EACP,CAAA;AAAA,QACC,YAAY,QAAA,oBACX,IAAA;AAAA,UAACA,QAAAA,CAAS,IAAA;AAAA,UAAT;AAAA,YACC,KAAA,EAAO;AAAA,cACL,aAAA,EAAe,KAAA;AAAA,cACf,cAAA,EAAgB,eAAA;AAAA,cAChB,OAAA,EAAS,WAAA;AAAA,cACT,QAAA,EAAU,UAAA;AAAA,cACV,MAAA,EAAQ,CAAA;AAAA,cACR,IAAA,EAAM,CAAA;AAAA,cACN,KAAA,EAAO;AAAA,aACT;AAAA,YACA,MAAA,EAAO,mBAAA;AAAA,YAEP,QAAA,EAAA;AAAA,8BAAA,IAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA;AAAA,oBAAA,QAAA;AAAA,oBAAS,GAAA;AAAA,oBAAE,MAAA;AAAA,oBAAI,GAAA;AAAA,oBAAE,eAAe,YAAY,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA,eACjD;AAAA,8BACA,IAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,mBAAA;AAAA,oBACZ,GAAG,aAAa,IAAI;AAAA,mBACtB;AAAA,kBACD,QAAA,EAAA;AAAA,oBAAA,QAAA;AAAA,oBACQ,IAAA;AAAA,oBAAK;AAAA;AAAA;AAAA;AACd;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAGF,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACE,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAoB,UAAA;AAAA,QACpB,MAAA,EAAO,0BAAA;AAAA,QAEN,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,OAAO,YAAA;AACT;ACxlCO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;;;ACCA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqD;AACnD,EAAA,uBACE,GAAA;AAAA,IAACL,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL;AAAA,UACE,MAAA,EAAQ,CAAA;AAAA,UACR,eAAA,EAAiB,eAAe,WAAA,CAAY,IAAA;AAAA,UAC5C,YAAA,EAAc,CAAA;AAAA,UACd,OAAA,EAAS;AAAA,SACX;AAAA,QACA,SAAS,IAAA,GAAO,EAAE,OAAuB,GAAI,EAAE,MAAM,CAAA;AAAE,OACzD;AAAA,MACA,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAmB,gCAAA;AAAA,MACnB,MAAA,EAAO,mBAAA;AAAA,MACN,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,QAAA,GAAW,CAAA;AAAA,EACX,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwC;AACtC,EAAA,uBACE,GAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,MACnC,KAAA,EAAO;AAAA,QACL,EAAE,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,SAAS,GAAA,EAAI;AAAA,QAClC,SAAS,IAAA,GAAO,EAAE,OAAuB,GAAI,EAAE,MAAM,CAAA;AAAE,OACzD;AAAA,MACA,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAmB,gCAAA;AAAA,MACnB,MAAA,EAAO,mBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,UAAS,EAAG,CAAC,GAAG,CAAA,qBACpC,GAAA;AAAA,QAACA,IAAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,CAAA;AAAA,YACN,MAAA,EAAQ,CAAA;AAAA,YACR,eAAA,EAAiB,eAAe,WAAA,CAAY,IAAA;AAAA,YAC5C,YAAA,EAAc,CAAA;AAAA,YACd,QAAA,EAAU;AAAA,WACZ;AAAA,UACA,2BAAA,EAA2B,IAAA;AAAA,UAC3B,MAAA,EAAO;AAAA,SAAA;AAAA,QATF;AAAA,OAWR;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA,GAAO,QAAA;AAAA,EACP,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0B;AACxB,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,uBAAO,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAqB,GAAG,KAAA,EAAO,CAAA;AAAA,EACxD;AACA,EAAA,uBAAO,GAAA,CAAC,WAAA,EAAA,EAAa,GAAG,KAAA,EAAO,CAAA;AACjC;;;AC3DO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA,GAAO,EAAA;AAAA,EACP,KAAA,GAAQ,cAAA;AAAA,EACR,WAAA,GAAc,CAAA;AAAA,EACd,IAAA,GAAO,MAAA;AAAA,EACP,KAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA;AAAA,MACA,MAAA,EAAQ,KAAA;AAAA,MACR,WAAA;AAAA,MACA,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACd,GAAI,KAAA,GAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,cAAc,KAAA,EAAM,GAAI,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,MAEzE,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQ,GAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA,KAAA,EAAM,CAAA,GAAW,IAAA;AAAA,QACjC;AAAA;AAAA;AAAA,GACH;AAEJ;;;ACXO,SAAS,SAAS,KAAA,EAAkB;AACzC,EAAA,uBACE,GAAA,CAAC,WAAS,GAAG,KAAA,EACX,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gXAA+W,CAAA,EACzX,CAAA;AAEJ;AA8CO,SAAS,UAAU,KAAA,EAAkB;AAC1C,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EACX,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,kDAAA,EAAmD,CAAA;AAAA,oBAC3D,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iDAAA,EAAkD,CAAA;AAAA,oBAC1D,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBACnB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBACnB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kCAAA,EAAmC;AAAA,GAAA,EAC7C,CAAA;AAEJ;AAGO,SAAS,kBAAkB,KAAA,EAAkB;AAClD,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EACX,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,2EAAA,EAA4E,CAAA;AAAA,oBACpF,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,oBAClB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA,GAAA,EACvB,CAAA;AAEJ;AAGO,SAAS,iBAAiB,KAAA,EAAkB;AACjD,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EACX,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,aAAA,EAAc,CAAA;AAAA,oBACtB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wBAAA,EAAyB;AAAA,GAAA,EACnC,CAAA;AAEJ;AAGO,SAAS,gBAAgB,KAAA,EAAkB;AAChD,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EACX,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/B,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY;AAAA,GAAA,EACtB,CAAA;AAEJ;AAGO,SAAS,UAAU,KAAA,EAAkB;AAC1C,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EACX,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,wHAAA,EAAyH,CAAA;AAAA,wBAChI,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI;AAAA,GAAA,EAC/B,CAAA;AAEJ;AAGO,SAAS,SAAS,KAAA,EAAkB;AACzC,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAS,GAAG,KAAA,EACX,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/B,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY,CAAA;AAAA,oBACpB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY;AAAA,GAAA,EACtB,CAAA;AAEJ;;;AC5HO,IAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,eAAA,EAAiB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EAChC,qBAAA,EAAuB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EACtC,oBAAA,EAAsB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EACrC,sBAAA,EAAwB,yBAAA;AAAA,EACxB,qBAAA,EAAuB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EACtC,sBAAA,EAAwB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EAEvC,iBAAA,EAAmB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAChC,uBAAA,EAAyB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC,sBAAA,EAAwB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACrC,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,uBAAA,EAAyB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC,wBAAA,EAA0B,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA;AAAA,EAGvC,oBAAoB,eAAA,CAAE,KAAA;AAAA,EACtB,sBAAsB,eAAA,CAAE,KAAA;AAAA;AAAA,EAGxB,gBAAA,EAAkB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAChC,sBAAA,EAAwB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACtC,qBAAA,EAAuB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACrC,uBAAA,EAAyB,cAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAAA;AAAA,EAGtC,aAAA,EAAe,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAC7B,mBAAA,EAAqB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAEnC,cAAA,EAAgB,cAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EAC5B,oBAAA,EAAsB,cAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EAClC,mBAAA,EAAqB,cAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EACjC,qBAAA,EAAuB,cAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,EAElC,oBAAA,EAAsB,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA;AAAA,EACpC,0BAAA,EAA4B,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA,EAC1C,yBAAA,EAA2B,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA,EACzC,2BAAA,EAA6B,yBAAA;AAAA,EAE7B,gBAAA,EAAkB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAChC,sBAAA,EAAwB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACtC,qBAAA,EAAuB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACrC,uBAAA,EAAyB,cAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAAA,EAEtC,aAAA,EAAe,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAC5B,mBAAA,EAAqB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAClC,kBAAA,EAAoB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACjC,oBAAA,EAAsB,cAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AAAA;AAAA,EAGlC,qBAAqB,eAAA,CAAE,KAAA;AAAA,EACvB,mBAAmB,eAAA,CAAE,KAAA;AAAA,EACrB,qBAAqB,eAAA,CAAE,KAAA;AAAA,EACvB,kBAAkB,eAAA,CAAE,KAAA;AAAA;AAAA,EAGpB,gBAAA,EAAkB,SAAA;AAAA;AAAA,EAClB,sBAAA,EAAwB,yBAAA;AAAA,EACxB,qBAAA,EAAuB,SAAA;AAAA,EACvB,gBAAA,EAAkB,SAAA;AAAA;AAAA,EAClB,sBAAA,EAAwB,yBAAA;AAAA,EACxB,qBAAA,EAAuB,SAAA;AAAA,EACvB,qBAAA,EAAuB,SAAA;AAAA;AAAA,EACvB,2BAAA,EAA6B,2BAAA;AAAA,EAC7B,gBAAA,EAAkB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA;AAAA,EAG/B,qBAAqB,eAAA,CAAE,KAAA;AAAA,EACvB,qBAAqB,eAAA,CAAE,KAAA;AAAA,EACvB,0BAA0B,eAAA,CAAE,KAAA;AAAA;AAAA;AAAA,EAI5B,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAAA;AAAA,EAC3B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAAA;AAAA,EAC3B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAAA;AAAA,EAC3B,SAAA,EAAW,gBAAgB,EAAE,CAAA;AAAA;AAAA;AAAA,EAG7B,cAAA,EAAgB,SAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAClB,eAAA,EAAiB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC9B,eAAA,EAAiB,wBAAA;AAAA,EACjB,gBAAgB,eAAA,CAAE,KAAA;AAAA,EAClB,WAAA,EAAa,eAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EACvB,iBAAA,EAAmB,eAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA;AAAA,EAG7B,gBAAgB,eAAA,CAAE,KAAA;AAAA,EAClB,kBAAA,EAAoB,eAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAChC,gBAAA,EAAkB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,EAC/B,mBAAmB,eAAA,CAAE,KAAA;AAAA,EACrB,eAAA,EAAiB,eAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAI7B,eAAA,EAAiB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,EAG9B,iBAAA,EAAmB,SAAA;AAAA,EACnB,sBAAsB,eAAA,CAAE,KAAA;AAAA,EACxB,mBAAA,EAAqB,eAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjC,kBAAA,EAAoB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,EAGjC,gBAAA,EAAkB,SAAA;AAAA,EAClB,eAAA,EAAiB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC9B,eAAA,EAAiB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC9B,kBAAA,EAAoB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,EACjC,cAAA,EAAgB,eAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EAC1B,cAAA,EAAgB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,EAC7B,oBAAA,EAAsB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,EACnC,oBAAA,EAAsB,eAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA;AAAA,EAChC,oBAAA,EAAsB,eAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA,EAI/B,iBAAA,EAAmB,qBAAA;AAAA,EACnB,kBAAA,EAAoB,qBAAA;AAAA,EACpB,iBAAA,EAAmB,qBAAA;AAAA;AAAA,EAGnB,mBAAA,EAAqB,wBAAA;AAAA,EACrB,mBAAA,EAAqB,wBAAA;AAAA,EACrB,oBAAA,EAAsB,wBAAA;AAAA,EACtB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,2BAAA,EAA6B,wBAAA;AAAA;AAAA,EAG7B,SAAA,EAAW,SAAA;AAAA;AAAA,EAGX,mBAAA,EAAqB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAClC,eAAe,eAAA,CAAE;AACnB,CAAA;AAGO,IAAM,kBAAA,GAAqB;AAAA;AAAA,EAEhC,eAAA,EAAiB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EAChC,qBAAA,EAAuB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EACtC,oBAAA,EAAsB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EACrC,sBAAA,EAAwB,yBAAA;AAAA,EACxB,qBAAA,EAAuB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EACtC,sBAAA,EAAwB,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,EAEvC,iBAAA,EAAmB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAChC,uBAAA,EAAyB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC,sBAAA,EAAwB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACrC,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,uBAAA,EAAyB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC,wBAAA,EAA0B,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA;AAAA,EAGvC,oBAAoB,eAAA,CAAE,KAAA;AAAA,EACtB,sBAAsB,eAAA,CAAE,KAAA;AAAA;AAAA,EAGxB,gBAAA,EAAkB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAChC,sBAAA,EAAwB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACtC,qBAAA,EAAuB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACrC,uBAAA,EAAyB,0BAAA;AAAA;AAAA,EAGzB,aAAA,EAAe,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAC7B,mBAAA,EAAqB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAEnC,cAAA,EAAgB,cAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EAC5B,oBAAA,EAAsB,cAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EAClC,mBAAA,EAAqB,cAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EACjC,qBAAA,EAAuB,yBAAA;AAAA,EAEvB,oBAAA,EAAsB,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA,EACpC,0BAAA,EAA4B,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA,EAC1C,yBAAA,EAA2B,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA,EACzC,2BAAA,EAA6B,yBAAA;AAAA,EAE7B,gBAAA,EAAkB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAChC,sBAAA,EAAwB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACtC,qBAAA,EAAuB,cAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EACrC,uBAAA,EAAyB,0BAAA;AAAA,EAEzB,aAAA,EAAe,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAC5B,mBAAA,EAAqB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EAClC,kBAAA,EAAoB,cAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACjC,oBAAA,EAAsB,0BAAA;AAAA;AAAA,EAGtB,qBAAqB,eAAA,CAAE,KAAA;AAAA,EACvB,mBAAmB,eAAA,CAAE,KAAA;AAAA,EACrB,qBAAqB,eAAA,CAAE,KAAA;AAAA,EACvB,kBAAkB,eAAA,CAAE,KAAA;AAAA;AAAA,EAGpB,gBAAA,EAAkB,SAAA;AAAA,EAClB,sBAAA,EAAwB,yBAAA;AAAA,EACxB,qBAAA,EAAuB,SAAA;AAAA,EACvB,gBAAA,EAAkB,SAAA;AAAA,EAClB,sBAAA,EAAwB,yBAAA;AAAA,EACxB,qBAAA,EAAuB,SAAA;AAAA,EACvB,qBAAA,EAAuB,SAAA;AAAA,EACvB,2BAAA,EAA6B,2BAAA;AAAA,EAC7B,gBAAA,EAAkB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA;AAAA,EAG/B,qBAAqB,eAAA,CAAE,KAAA;AAAA,EACvB,qBAAqB,eAAA,CAAE,KAAA;AAAA,EACvB,0BAA0B,eAAA,CAAE,KAAA;AAAA;AAAA,EAG5B,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAAA,EAC3B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAAA,EAC3B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,EAAE,CAAA;AAAA,EAC5B,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAAA,EAC3B,SAAA,EAAW,gBAAgB,EAAE,CAAA;AAAA;AAAA,EAG7B,cAAA,EAAgB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC7B,gBAAA,EAAkB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC/B,eAAA,EAAiB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC9B,eAAA,EAAiB,2BAAA;AAAA,EACjB,cAAA,EAAgB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC7B,WAAA,EAAa,SAAA;AAAA,EACb,iBAAA,EAAmB,eAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY7B,gBAAgB,eAAA,CAAK,IAAA;AAAA;AAAA,EACrB,oBAAoB,eAAA,CAAK,QAAA;AAAA;AAAA,EACzB,kBAAkB,eAAA,CAAK,MAAA;AAAA;AAAA,EACvB,mBAAmB,eAAA,CAAK,OAAA;AAAA;AAAA,EACxB,iBAAiB,eAAA,CAAK,QAAA;AAAA;AAAA,EACtB,iBAAiB,eAAA,CAAK,KAAA;AAAA;AAAA;AAAA,EAGtB,mBAAmB,eAAA,CAAK,UAAA;AAAA;AAAA,EACxB,sBAAsB,eAAA,CAAK,IAAA;AAAA;AAAA,EAC3B,qBAAqB,eAAA,CAAK,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1B,kBAAA,EAAoB,mBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpB,gBAAA,EAAkB,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA;AAAA,EAChC,eAAA,EAAiB,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA;AAAA,EAC/B,eAAA,EAAiB,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA;AAAA,EAC/B,kBAAA,EAAoB,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA;AAAA,EAClC,cAAA,EAAgB,SAAA;AAAA,EAChB,cAAA,EAAgB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC7B,oBAAA,EAAsB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EACnC,oBAAA,EAAsB,SAAA;AAAA,EACtB,oBAAA,EAAsB,eAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/B,iBAAA,EAAmB,2BAAA;AAAA,EACnB,kBAAA,EAAoB,2BAAA;AAAA,EACpB,iBAAA,EAAmB,2BAAA;AAAA;AAAA,EAGnB,mBAAA,EAAqB,2BAAA;AAAA,EACrB,mBAAA,EAAqB,2BAAA;AAAA,EACrB,oBAAA,EAAsB,2BAAA;AAAA,EACtB,sBAAA,EAAwB,2BAAA;AAAA,EACxB,sBAAA,EAAwB,2BAAA;AAAA,EACxB,2BAAA,EAA6B,2BAAA;AAAA;AAAA,EAG7B,SAAA,EAAW,eAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAAA;AAAA;AAAA,EAGzB,mBAAA,EAAqB,eAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EAClC,eAAe,eAAA,CAAE;AACnB,CAAA;AAgHO,SAAS,kBAAkB,IAAA,EAAiB;AACjD,EAAA,OAAO,IAAA,KAAS,SAAS,kBAAA,GAAqB,mBAAA;AAChD;;;AC5bA,IAAM,CAAA,GAAI,kBAAkB,MAAM,CAAA;AAiB3B,IAAM,mBAAA,GAGT;AAAA,EACF,EAAA,EAAI,EAAE,QAAA,EAAU,CAAA,EAAG,UAAU,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,EAAA,EAAG;AAAA,EAC1D,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAI,UAAU,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,EAAA,EAAG;AAAA,EAC3D,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAI,UAAU,EAAA,EAAI,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,EAAA;AAC3D,CAAA;AAEA,IAAM,aAAA,GAA4F;AAAA,EAChG,OAAO,EAAE,eAAA,EAAiB,EAAE,gBAAgB,CAAA,EAAG,aAAa,SAAA,EAAU;AAAA,EACtE,EAAA,EAAI;AAAA,IACF,eAAA,EAAiB,yBAAA;AAAA,IACjB,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA,GAAU,OAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,SAAS,CAAA,GAAIE,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AACxD,EAAA,MAAM,MAAA,GAAS,oBAAoB,IAAI,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AAEpC,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAAA,QAAAA,CAAS,OAAO,SAAA,EAAW;AAAA,MACzB,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU,GAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KAClB,EAAE,KAAA,EAAM;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAAA,QAAAA,CAAS,OAAO,SAAA,EAAW;AAAA,MACzB,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,GAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KAClB,EAAE,KAAA,EAAM;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,KAAA,mBACJ,IAAA;AAAA,IAACL,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,CAAA;AAAA;AAAA,QAEL,YAAA,EAAc,CAAA;AAAA,QACd,WAAA,EAAa,CAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,iBAAiB,MAAA,CAAO,eAAA;AAAA,QACxB,mBAAmB,MAAA,CAAO,QAAA;AAAA,QAC1B,iBAAiB,MAAA,CAAO;AAAA,OAC1B;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA,IAAQ,IAAA,wBACNA,IAAAA,EAAA,EAAK,6BAA2B,IAAA,EAAC,MAAA,EAAO,mBACtC,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,QAED;AAAA;AAAA;AAAA,GACH;AAGF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA,CAACK,QAAAA,CAAS,IAAA,EAAT,EAAc,KAAA,EAAO,EAAE,SAAA,EAAW,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,GAAE,EACxD,QAAA,kBAAA,GAAA;AAAA,MAACC,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,SAAA,EAAW,aAAA;AAAA,QACX,UAAA,EAAY,cAAA;AAAA,QACZ,iBAAA,EAAkB,QAAA;AAAA,QAClB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,QAC1B,MAAA,EAAO,sBAAA;AAAA,QAEN,QAAA,EAAA;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,KAAA;AACT;;;ACzGA,IAAM,aAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAgB/D,IAAM,UAAA,GAAqC;AAAA,EACzC,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA,GAAO,MAAA;AAAA,EACP,KAAA,EAAO,SAAA;AAAA,EACP,OAAA,GAAU,KAAA;AAAA,EACV,OAAA,GAAU,IAAA;AAAA,EACV,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiB;AACf,EAAA,MAAM,aAAA,GAAgB,SAAA,IAAa,UAAA,CAAW,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,KAAK,CAAA,GAAIJ,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,OAAA,GAAU,GAAA,GAAM,CAAC,CAAC,CAAA;AACpE,EAAA,MAAM,CAAC,OAAO,CAAA,GAAIH,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,OAAA,GAAU,CAAA,GAAI,CAAC,CAAC,CAAA;AAEpE,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAGd,IAAAE,SAAS,QAAA,CAAS;AAAA,MAChBA,QAAAA,CAAS,OAAO,KAAA,EAAO;AAAA,QACrB,OAAA,EAAS,CAAA;AAAA,QACT,QAAA,EAAU,GAAA;AAAA,QACV,QAAQD,MAAAA,CAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACzC,eAAA,EAAiB;AAAA,OAClB,CAAA;AAAA,MACDC,QAAAA,CAAS,OAAO,OAAA,EAAS;AAAA,QACvB,OAAA,EAAS,CAAA;AAAA,QACT,QAAA,EAAU,GAAA;AAAA,QACV,QAAQD,MAAAA,CAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACzC,eAAA,EAAiB;AAAA,OAClB;AAAA,KACF,EAAE,KAAA,EAAM;AAAA,EACX,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,OAAO,CAAC,CAAA;AAE5B,EAAA,MAAM,QAAQ,OAAA,mBACZ,GAAA;AAAA,IAACJ,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAoB,oBAAoB,aAAa,CAAA,CAAA;AAAA,MACrD,MAAA,EAAO,eAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,YAAS,IAAA,EAAM,EAAA,EAAI,OAAO,aAAA,EAAe,IAAA,EAAM,aAAA,EAAe,WAAA,EAAa,CAAA,EAAG;AAAA;AAAA,GACjF,mBAEA,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,IAAA;AAAA,MACR,SAAA;AAAA,MACA,kBAAA,EAAoB,oBAAoB,aAAa,CAAA,CAAA;AAAA,MACpD,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,IAAA;AAAA,QAACO,IAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,EAAA;AAAA,YACV,KAAA,EAAO,aAAA;AAAA,YACP,UAAA,EAAY,KAAA;AAAA,YACZ,UAAA,EAAY;AAAA,WACd;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YAAS,GAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AACd;AAAA,GACF;AAGF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA;AAAA,MAACF,QAAAA,CAAS,IAAA;AAAA,MAAT;AAAA,QACC,KAAA,EAAO,EAAE,SAAA,EAAW,CAAC,EAAE,KAAA,EAAO,GAAG,OAAA,EAAQ;AAAA,QACzC,MAAA,EAAO,mBAAA;AAAA,QAEN,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,OAAO,KAAA;AACT;AC1CA,IAAM,IAAA,GAAO,kBAAkB,MAAM,CAAA;AAErC,IAAM,WAAA,GAAc,KAAK,cAAc,CAAA;AACvC,IAAM,UAAA,GAAa,KAAK,gBAAgB,CAAA;AAGxC,IAAM,GAAA,GAAM,EAAE,GAAA,EAAK,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,EAAA,EAAG;AACnD,IAAM,WAAW,EAAE,UAAA,EAAY,qBAAqB,QAAA,EAAU,EAAA,EAAI,YAAY,KAAA,EAAe;AAC7F,IAAM,SAAA,GAAY;AAAA,EAChB,QAAA,EAAU,EAAA;AAAA,EACV,UAAA,EAAY,KAAA;AAAA,EACZ,UAAA,EAAY,mBAAA;AAAA,EACZ,KAAA,EAAO,eAAe,KAAA,CAAM,MAAA;AAAA,EAC5B,eAAA,EAAiB,sBAAA;AAAA,EACjB,eAAA,EAAiB,CAAA;AAAA,EACjB,iBAAA,EAAmB,CAAA;AAAA,EACnB,YAAA,EAAc,CAAA;AAAA,EACd,QAAA,EAAU;AACZ,CAAA;AAGA,SAAS,YAAY,GAAA,EAA0B;AAC7C,EAAA,OAAO,IAAI,KAAA,KAAU,MAAA,GAAS,GAAA,CAAI,IAAA,GAAO,IAAI,MAAA,CAAO,IAAA;AACtD;AAEA,SAAS,cAAc,GAAA,EAA0B;AAC/C,EAAA,OAAO,IAAI,KAAA,KAAU,MAAA,GAAS,GAAA,CAAI,MAAA,GAAS,IAAI,MAAA,CAAO,MAAA;AACxD;AAGA,SAAS,YAAY,GAAA,EAA0B;AAC7C,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,EAAQ,OAAO,IAAI,UAAA,CAAW,MAAA;AAChD,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,EAAQ,OAAO,IAAI,MAAA,CAAO,IAAA;AAC5C,EAAA,OAAO,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,MAAA,CAAO,IAAA;AACnC;AAEA,SAAS,mBAAmB,GAAA,EAA0B;AACpD,EAAA,MAAM,OAAO,CAAA,IAAA,EAAO,GAAA,CAAI,SAAS,CAAA,EAAA,EAAK,YAAY,GAAG,CAAC,CAAA,SAAA,EAAY,WAAA,CAAY,cAAc,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAC7G,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,EAAQ,OAAO,GAAG,IAAI,CAAA,aAAA,CAAA;AACxC,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,EAAQ,OAAO,GAAG,IAAI,CAAA,UAAA,CAAA;AACxC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK;AAAA,EACZ,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACE,GAAA,CAACL,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,EAAS,EAAG,MAAA,EACrE,QAAA,EACH,CAAA;AAEJ;AAGA,SAAS,QAAA,CAAS,EAAE,GAAA,EAAI,EAAyB;AAC/C,EAAA,MAAM,QAAQ,GAAA,CAAI,aAAA;AAClB,EAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAQ;AAGxB,IAAA,uBACE,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,UAAA;AAAA,QACR,WAAA,EAAa,KAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAM,OAAA;AAAA,QACN,GAAA,EAAK,EAAE,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY,IAAI,UAAA,EAAY,OAAA,EAAS,GAAA,CAAI,MAAA,CAAO,IAAA,EAAK;AAAA,QAC9E;AAAA;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,MAAM,aAAa,GAAA,CAAI,KAAA,KAAU,MAAA,GAAS,GAAA,CAAI,aAAa,EAAC;AAC5D,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,MAAA;AAAA,MACR,GAAA,EAAK,EAAE,IAAA,EAAM,UAAA,EAAY,YAAY,OAAA,EAAS,WAAA,CAAY,GAAG,CAAA,EAAE;AAAA,MAC/D;AAAA;AAAA,GACF;AAEJ;AAQO,SAAS,OAAO,GAAA,EAAkB;AACvC,EAAA,MAAM,IAAA,GAAO,IAAI,KAAA,KAAU,MAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,OAAO,WAAA,GAAc,UAAA;AACxC,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,KAAU,MAAA,GAAS,OAAO,GAAA,CAAI,GAAA;AAE9C,EAAA,uBACE,IAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,EAAG,mBAAmB,CAAA,EAAE;AAAA,MAClD,kBAAA,EAAoB,mBAAmB,GAAG,CAAA;AAAA,MAC1C,MAAA,EAAO,SAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,OAAO,EAAE,cAAA,EAAgB,iBAAgB,EAC/E,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,GAAA,CAAI,GAAA,EAAK,QAAO,oBAAA,EAC1B,QAAA,EAAA,GAAA,CAAI,OAAA,mBACH,GAAA,CAACO,MAAA,EAAK,KAAA,EAAO,SAAA,EAAW,MAAA,EAAO,sBAC5B,QAAA,EAAA,GAAA,CAAI,OAAA,EACP,CAAA,mBAEA,GAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,UAAA,EAAY,OAAO,KAAA,GAAQ,KAAA,EAAM,EAC7E,QAAA,EAAA,GAAA,CAAI,WACP,CAAA,EAEJ,CAAA;AAAA,0BACA,GAAA,CAAC,QAAK,KAAA,EAAO,GAAA,CAAI,MAAM,MAAA,EAAO,cAAA,EAC5B,8BAACA,IAAAA,EAAA,EAAK,OAAO,EAAE,GAAG,UAAU,KAAA,EAAO,UAAA,IAAe,QAAA,EAAA,WAAA,CAAY,GAAG,GAAE,CAAA,EACrE,CAAA;AAAA,0BACA,GAAA,CAAC,QAAK,KAAA,EAAO,GAAA,CAAI,MAAM,MAAA,EAAO,gBAAA,EAC5B,QAAA,kBAAA,GAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,QAAA,EAAU,OAAO,UAAA,EAAW,EAAI,sBAAY,aAAA,CAAc,GAAG,CAAC,CAAA,EAAE,CAAA,EACpF,CAAA;AAAA,0BACA,GAAA,CAAC,QAAK,KAAA,EAAO,GAAA,CAAI,KAAK,MAAA,EAAO,aAAA,EAC3B,QAAA,kBAAA,GAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,UAAA,EAAW,EAC3C,QAAA,EAAA,GAAA,IAAO,OAAO,QAAA,CAAS,GAAG,CAAA,GAAI,QAAA,EACjC,CAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAACP,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,SAAA,EAAW,IAAA,GAAO,CAAA,GAAI,CAAA,IAAK,MAAA,EAAO,eAAA,EAC/C,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAU,CAAA,EACtB;AAAA;AAAA;AAAA,GACF;AAEJ;ACjLA,IAAM,WAAA,GAAsB,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAU;AAG9D,SAAS,YAAA,CAAa,MAAoB,YAAA,EAAiC;AACzE,EAAA,OAAO;AAAA,IACL,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,EAAA,EAAG;AAAA,IAC1B,GAAI,YAAA,GAAe,CAAC,WAAW,IAAI,EAAC;AAAA,IACpC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,EAAA,EAAG;AAAA,IAC3B,EAAE,KAAA,EAAO,IAAA,CAAK,WAAA,EAAY,EAAG,OAAO,EAAA,EAAG;AAAA,IACvC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,EAAA;AAAG,GAC5B;AACF;AAQO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA,GAAO,KAAA;AAAA,EACP,YAAA,GAAe,IAAA;AAAA,EACf,MAAA,GAAS;AACX,CAAA,EAAwB;AACtB,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,YAAY,CAAA;AAE/C,EAAA,uBACE,GAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,CAAA;AAAA,QACjB,iBAAA,EAAmB,CAAA;AAAA,QACnB,aAAA,EAAe,CAAA;AAAA,QACf,GAAI,YAAA,GAAe,EAAC,GAAI,EAAE,gBAAgB,eAAA;AAAgB,OAC5D;AAAA,MACA,MAAA;AAAA,MAEC,kBAAQ,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,OAAM,KAAM;AACjC,QAAA,MAAM,SAAS,KAAA,KAAU,MAAA;AAEzB,QAAA,uBACE,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO;AAAA,cACL,GAAI,SAAS,EAAE,QAAA,EAAU,IAAG,GAAI,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA,EAAE;AAAA,cACvD,UAAA,EAAY,QAAA;AAAA,cACZ,cAAA,EAAgB,QAAA;AAAA,cAChB,GAAA,EAAK;AAAA,aACP;AAAA,YACC,GAAI,MAAA,GAAS,EAAE,SAAA,EAAW,QAAA,KAAa,EAAC;AAAA,YAEzC,QAAA,kBAAA,GAAA;AAAA,cAACO,IAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,oBAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAY,KAAA;AAAA,kBACZ,UAAA,EAAY,mBAAA;AAAA,kBACZ,aAAA,EAAe,WAAA;AAAA,kBACf,aAAA,EAAe;AAAA,iBACjB;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA;AACH,WAAA;AAAA,UApBK;AAAA,SAqBP;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;AC7EO,IAAM,WAAA,GAAc,mBAAA;AASpB,SAAS,WAAW,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,GAAW,IAAG,EAAoB;AAC9E,EAAA,uBACE,GAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,WAAA;AAAA,QACZ,QAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA,EAAY,KAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACjB;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;;;AC5BA,IAAMC,EAAAA,GAAI,kBAAkB,MAAM,CAAA;AAElC,IAAM,KAAA,GAAQ,MAAA;AACd,IAAM,EAAA,GAAK,GAAA;AAmBJ,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,KAAA,GAAQA,GAAE,cAAc,CAAA;AAC9B,EAAA,MAAM,GAAA,GAAMA,GAAE,eAAe,CAAA;AAE7B,EAAA,uBACE,IAAA;AAAA,IAACR,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,aAAA,EAAe,KAAA,EAAO,YAAY,UAAA,EAAW;AAAA,MACtD,kBAAA,EAAoB,GAAG,IAAI,CAAA,SAAA,EAAY,IAAI,CAAA,SAAA,EAAY,IAAI,IAAI,IAAI,CAAA,CAAA;AAAA,MACnE,MAAA,EAAO,gBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAA,EAAO,QAAA,EACvB,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,4BACC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAK,QAAA,EAAqB,QAAA,EAAA,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,EAAI,CAAA;AAAA,wBAC1D,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAA,EAAO,UACvB,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,4BACC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAK,QAAA,EAAqB,QAAA,EAAA,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAA,EAAI,CAAA;AAAA,wBACvD,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAA,EAAO,UACvB,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,4BACC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAK,QAAA,EAAqB,QAAA,EAAA,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAG;AAAA;AAAA;AAAA,GAC1D;AAEJ;AC1CO,SAAS,SAAS,GAAA,EAAyD;AAChF,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAEnC,EAAA,IAAI,GAAW,CAAA,EAAW,CAAA;AAE1B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,CAAA,GAAI,SAAS,OAAA,CAAQ,CAAC,IAAI,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AACxC,IAAA,CAAA,GAAI,SAAS,OAAA,CAAQ,CAAC,IAAI,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AACxC,IAAA,CAAA,GAAI,SAAS,OAAA,CAAQ,CAAC,IAAI,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AAAA,EAC1C,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC/B,IAAA,CAAA,GAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,IAAA,CAAA,GAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,IAAA,CAAA,GAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAKO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAgD;AAC7F,EAAA,MAAM,QAAQ,CAAA,GAAI,GAAA;AAClB,EAAA,MAAM,QAAQ,CAAA,GAAI,GAAA;AAClB,EAAA,MAAM,QAAQ,CAAA,GAAI,GAAA;AAElB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAO,KAAK,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAO,KAAK,CAAA;AACxC,EAAA,MAAM,QAAQ,GAAA,GAAM,GAAA;AAGpB,EAAA,MAAM,CAAA,GAAI,GAAA;AAGV,EAAA,MAAM,CAAA,GAAI,GAAA,KAAQ,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,GAAA;AAGlC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,CAAA,GAAI,EAAA,IAAA,CAAQ,KAAA,GAAQ,KAAA,IAAS,KAAA,GAAS,CAAA,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,CAAA,GAAI,EAAA,IAAA,CAAO,KAAA,GAAQ,KAAA,IAAS,KAAA,GAAQ,CAAA,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,CAAA,GAAI,EAAA,IAAA,CAAO,KAAA,GAAQ,KAAA,IAAS,KAAA,GAAQ,CAAA,CAAA;AAAA,IACtC;AAAA,EACF;AACA,EAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,GAAA;AAEhB,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACnB;AAKO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAgD;AAC7F,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,CAAA,GAAI,KAAK,CAAA,GAAI,IAAA,CAAK,IAAK,CAAA,GAAI,EAAA,GAAM,IAAI,CAAC,CAAA,CAAA;AAC5C,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AAEd,EAAA,IAAI,QAAgB,MAAA,EAAgB,MAAA;AAEpC,EAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,EAAA,EAAI;AACpB,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAA,EACnC,CAAA,MAAA,IAAW,CAAA,IAAK,EAAA,IAAM,CAAA,GAAI,GAAA,EAAK;AAC7B,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAA,EACnC,CAAA,MAAA,IAAW,CAAA,IAAK,GAAA,IAAO,CAAA,GAAI,GAAA,EAAK;AAC9B,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAA,EACnC,CAAA,MAAA,IAAW,CAAA,IAAK,GAAA,IAAO,CAAA,GAAI,GAAA,EAAK;AAC9B,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAA,EACnC,CAAA,MAAA,IAAW,CAAA,IAAK,GAAA,IAAO,CAAA,GAAI,GAAA,EAAK;AAC9B,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAA,EACnC,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAG,IAAA,MAAA,GAAS,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,MAAA,GAAS,KAAK,GAAG,CAAA;AAAA,IAChC,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,MAAA,GAAS,KAAK,GAAG,CAAA;AAAA,IAChC,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,MAAA,GAAS,KAAK,GAAG;AAAA,GAClC;AACF;AAKO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAChE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACxD,IAAA,OAAO,QAAQ,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EAC7C,CAAA;AACA,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC3C;AAQO,SAAS,OAAA,CAAQ,GAAA,EAAa,MAAA,GAAiB,GAAA,EAAa;AACjE,EAAA,MAAM,GAAA,GAAM,SAAS,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,KAAK,OAAO,GAAA;AAEjB,EAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACxC,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,IAAI,MAAM,CAAA;AAEvC,EAAA,MAAM,SAAS,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,GAAG,IAAI,CAAA;AAC1C,EAAA,OAAO,SAAS,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,OAAO,CAAC,CAAA;AAC9C;AA+DO,IAAM,YAAA,GAAe;AAAA;AAAA,EAE1B,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO,2BAAA;AAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,qBAAA;AAAA;AAAA,IACN,KAAA,EAAO,wBAAA;AAAA;AAAA,IACP,MAAA,EAAQ;AAAA;AAAA;AAEZ,CAAA;AAUA,IAAM,eAAA,GAAyD;AAAA,EAC7D,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA;AAAA,EAC7B,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA;AAAA,EAC7B,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA;AAAE;AAC/B,CAAA;AAQO,SAAS,kBAAA,CACd,OAAA,GAAyB,UAAA,EACzB,SAAA,GAA6B,QAAA,EAClB;AACX,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,gBAAgB,SAAS,CAAA;AAGlD,EAAA,MAAM,OAAA,GAAU,CAAA;AAEhB,EAAA,OAAO,SAAS,MAAA,CAAO;AAAA,IACrB,GAAA,EAAK;AAAA,MACH,WAAW,CAAA,EAAG,MAAM,MAAM,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,GAAA,EAAM,MAAA,CAAO,IAAI,CAAA,GAAA,EAAM,MAAM,CAAA,IAAA,EAAO,MAAM,MAAM,OAAO,CAAA,GAAA,EAAM,OAAO,KAAK,CAAA;AAAA,KACrH;AAAA,IACA,OAAA,EAAS;AAAA;AAAA,MAEP,WAAA,EAAa,MAAA;AAAA,MACb,YAAA,EAAc,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,MAC9C,aAAA,EAAe,GAAA;AAAA,MACf,cAAc,IAAA,GAAO,CAAA;AAAA,MACrB,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACH;AAQO,SAAS,mBAAA,CACd,OAAA,GAAyB,UAAA,EACzB,SAAA,GAA6B,QAAA,EAClB;AACX,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,gBAAgB,SAAS,CAAA;AAGlD,EAAA,MAAM,SAAA,GAAY,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,CAAA;AAEhB,EAAA,OAAO,SAAS,MAAA,CAAO;AAAA,IACrB,GAAA,EAAK;AAAA,MACH,WAAW,CAAA,MAAA,EAAS,MAAM,MAAM,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,GAAA,EAAM,MAAA,CAAO,MAAM,CAAA,SAAA,EAAY,SAAS,CAAA,IAAA,EAAO,SAAS,MAAM,OAAO,CAAA,GAAA,EAAM,OAAO,KAAK,CAAA;AAAA,KACzI;AAAA,IACA,OAAA,EAAS;AAAA;AAAA,MAEP,aAAA,EAAe,CAAA;AAAA,MACf,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACH;AAKO,SAAS,gBAAA,GAA8B;AAC5C,EAAA,OAAO,SAAS,MAAA,CAAO;AAAA,IACrB,GAAA,EAAK;AAAA,MACH,SAAA,EAAW;AAAA,KACb;AAAA,IACA,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,CAAA;AAAA,MACf,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACH;AAMO,SAAS,uBAAA,CACd,OAAA,GAAyB,UAAA,EACzB,SAAA,GAA6B,QAAA,EAClB;AACX,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,gBAAgB,SAAS,CAAA;AAGlD,EAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAC,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,CAAA;AAEhB,EAAA,OAAO,SAAS,MAAA,CAAO;AAAA,IACrB,GAAA,EAAK;AAAA;AAAA,MAEH,WAAW,CAAA,EAAG,WAAW,MAAM,WAAW,CAAA,GAAA,EAAM,SAAS,CAAA,GAAA,EAAM,MAAA,CAAO,IAAI,CAAA,GAAA,EAAM,MAAM,CAAA,IAAA,EAAO,MAAM,MAAM,OAAO,CAAA,GAAA,EAAM,OAAO,KAAK,CAAA;AAAA,KACpI;AAAA,IACA,OAAA,EAAS;AAAA,MACP,WAAA,EAAa,MAAA;AAAA,MACb,YAAA,EAAc,EAAE,KAAA,EAAO,WAAA,EAAa,QAAQ,WAAA,EAAY;AAAA,MACxD,aAAA,EAAe,GAAA;AAAA,MACf,cAAc,SAAA,GAAY,CAAA;AAAA,MAC1B,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACH;AAMO,SAAS,wBAAA,CACd,OAAA,GAAyB,UAAA,EACzB,SAAA,GAA6B,QAAA,EAClB;AACX,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,gBAAgB,SAAS,CAAA;AAGlD,EAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAC,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,CAAA;AAEhB,EAAA,OAAO,SAAS,MAAA,CAAO;AAAA,IACrB,GAAA,EAAK;AAAA;AAAA,MAEH,SAAA,EAAW,CAAA,MAAA,EAAS,WAAW,CAAA,GAAA,EAAM,WAAW,CAAA,GAAA,EAAM,SAAS,CAAA,GAAA,EAAM,MAAA,CAAO,MAAM,CAAA,kBAAA,EAAqB,OAAO,CAAA,GAAA,EAAM,OAAO,KAAK,CAAA;AAAA,KAClI;AAAA,IACA,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,CAAA;AAAA,MACf,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACH;CAKiC;AAAA;AAAA,EAE/B,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,kBAAA,CAAmB,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC/C,MAAA,EAAQ,kBAAA,CAAmB,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC/C,MAAA,EAAQ,kBAAA,CAAmB,UAAA,EAAY,QAAQ;AAAA,KACjD;AAAA,IACA,WAAA,EAAa;AAAA,MACX,MAAA,EAAQ,uBAAA,CAAwB,UAAA,EAAY,QAAQ,CAAA;AAAA,MACpD,MAAA,EAAQ,uBAAA,CAAwB,UAAA,EAAY,QAAQ,CAAA;AAAA,MACpD,MAAA,EAAQ,uBAAA,CAAwB,UAAA,EAAY,QAAQ;AAAA,KACtD;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,mBAAA,CAAoB,UAAA,EAAY,QAAQ,CAAA;AAAA,MAChD,MAAA,EAAQ,mBAAA,CAAoB,UAAA,EAAY,QAAQ,CAAA;AAAA,MAChD,MAAA,EAAQ,mBAAA,CAAoB,UAAA,EAAY,QAAQ;AAAA,KAClD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,MAAA,EAAQ,wBAAA,CAAyB,UAAA,EAAY,QAAQ,CAAA;AAAA,MACrD,MAAA,EAAQ,wBAAA,CAAyB,UAAA,EAAY,QAAQ,CAAA;AAAA,MACrD,MAAA,EAAQ,wBAAA,CAAyB,UAAA,EAAY,QAAQ;AAAA,KACvD;AAAA,IACA,MAAM,gBAAA;AAAiB,GACzB;AAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,kBAAA,CAAmB,aAAA,EAAe,QAAQ,CAAA;AAAA,MAClD,MAAA,EAAQ,kBAAA,CAAmB,aAAA,EAAe,QAAQ,CAAA;AAAA,MAClD,MAAA,EAAQ,kBAAA,CAAmB,aAAA,EAAe,QAAQ;AAAA,KACpD;AAAA,IACA,WAAA,EAAa;AAAA,MACX,MAAA,EAAQ,uBAAA,CAAwB,aAAA,EAAe,QAAQ,CAAA;AAAA,MACvD,MAAA,EAAQ,uBAAA,CAAwB,aAAA,EAAe,QAAQ,CAAA;AAAA,MACvD,MAAA,EAAQ,uBAAA,CAAwB,aAAA,EAAe,QAAQ;AAAA,KACzD;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,mBAAA,CAAoB,aAAA,EAAe,QAAQ,CAAA;AAAA,MACnD,MAAA,EAAQ,mBAAA,CAAoB,aAAA,EAAe,QAAQ,CAAA;AAAA,MACnD,MAAA,EAAQ,mBAAA,CAAoB,aAAA,EAAe,QAAQ;AAAA,KACrD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,MAAA,EAAQ,wBAAA,CAAyB,aAAA,EAAe,QAAQ,CAAA;AAAA,MACxD,MAAA,EAAQ,wBAAA,CAAyB,aAAA,EAAe,QAAQ,CAAA;AAAA,MACxD,MAAA,EAAQ,wBAAA,CAAyB,aAAA,EAAe,QAAQ;AAAA,KAC1D;AAAA,IACA,MAAM,gBAAA;AAAiB,GACzB;AAAA;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,kBAAA,CAAmB,cAAA,EAAgB,QAAQ,CAAA;AAAA,MACnD,MAAA,EAAQ,kBAAA,CAAmB,cAAA,EAAgB,QAAQ,CAAA;AAAA,MACnD,MAAA,EAAQ,kBAAA,CAAmB,cAAA,EAAgB,QAAQ;AAAA,KACrD;AAAA,IACA,WAAA,EAAa;AAAA,MACX,MAAA,EAAQ,uBAAA,CAAwB,cAAA,EAAgB,QAAQ,CAAA;AAAA,MACxD,MAAA,EAAQ,uBAAA,CAAwB,cAAA,EAAgB,QAAQ,CAAA;AAAA,MACxD,MAAA,EAAQ,uBAAA,CAAwB,cAAA,EAAgB,QAAQ;AAAA,KAC1D;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,mBAAA,CAAoB,cAAA,EAAgB,QAAQ,CAAA;AAAA,MACpD,MAAA,EAAQ,mBAAA,CAAoB,cAAA,EAAgB,QAAQ,CAAA;AAAA,MACpD,MAAA,EAAQ,mBAAA,CAAoB,cAAA,EAAgB,QAAQ;AAAA,KACtD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,MAAA,EAAQ,wBAAA,CAAyB,cAAA,EAAgB,QAAQ,CAAA;AAAA,MACzD,MAAA,EAAQ,wBAAA,CAAyB,cAAA,EAAgB,QAAQ,CAAA;AAAA,MACzD,MAAA,EAAQ,wBAAA,CAAyB,cAAA,EAAgB,QAAQ;AAAA,KAC3D;AAAA,IACA,MAAM,gBAAA;AAAiB;AAE3B;;;ACpYO,SAAS,KAAA,CAAM,OAAe,OAAA,EAAyB;AAE5D,EAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAGvD,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AACzB,IAAA,IAAI,GAAW,CAAA,EAAW,CAAA;AAE1B,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,GAAG,EAAE,CAAA;AAChC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,GAAG,EAAE,CAAA;AAChC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,GAAG,EAAE,CAAA;AAAA,IAClC,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAChC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAChC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,cAAc,CAAA,CAAA,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,gCAAgC,CAAA;AAC7D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,QAAA;AACpB,IAAA,OAAO,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,cAAc,CAAA,CAAA,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,2CAA2C,CAAA;AACzE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,SAAA;AACpB,IAAA,OAAO,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,cAAc,CAAA,CAAA,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,KAAA;AACT;;;AChFA,IAAMQ,EAAAA,GAAI,kBAAkB,MAAM,CAAA;AA6ClC,IAAM,KAAA,GAAQ,mBAAA;AACd,IAAM,aAAA,GAAgB,SAAA;AACtB,IAAM,YAAA,GAAeA,GAAE,cAAc,CAAA;AACrC,IAAM,cAAA,GAAiBA,GAAE,gBAAgB,CAAA;AACzC,IAAM,cAAA,GAAiBA,GAAE,gBAAgB,CAAA;AAMzC,IAAM,YAAA,GAAe,GAAA;AAGrB,SAAS,eAAA,CAAgB,WAAmB,QAAA,EAAiC;AAC3E,EAAA,IAAI,CAAC,UAAU,OAAO,GAAA;AACtB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,SAAA,GAAY,WAAY,GAAG,CAAA;AACnD;AAOA,SAAS,gBAAA,CAAiB,WAAmB,QAAA,EAAiC;AAC5E,EAAA,IAAI,QAAA,IAAY,IAAA,EAAM,OAAOA,EAAAA,CAAE,cAAc,CAAA;AAC7C,EAAA,MAAM,cAAc,QAAA,GAAW,SAAA;AAC/B,EAAA,IAAI,WAAA,GAAc,cAAc,OAAO,cAAA;AACvC,EAAA,IAAI,WAAA,IAAe,CAAC,YAAA,EAAc,OAAO,cAAA;AACzC,EAAA,OAAO,YAAA;AACT;AAGA,SAAS,eAAA,CAAgB,SAAA,EAAmB,QAAA,EAAkB,OAAA,EAAmC;AAC/F,EAAA,MAAM,UAAU,OAAA,KAAY,SAAA,GAAY,SAAA,GAAY,GAAA,GAAA,CAAQ,WAAW,SAAA,IAAa,GAAA;AACpF,EAAA,OAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC1B;AAKA,IAAM,WAAA,GAAc;AAAA,EAClB,SAAA,EAAW,cAAA,CAAe,OAAA,CAAQ,GAAG,CAAA;AAAA,EACrC,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAAA,EACnC,QAAA,EAAU,aAAA;AAAA,EACV,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACE,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,QAAA,EACvB,QAAA,EAAA,KAAA,EACH,CAAA;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAS,EAAwC;AAChF,EAAA,uBACE,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,QAAA,EAAoB,QAAA,EAAA,GAAA,EAE9C,CAAA;AAEJ;AAGA,IAAM,WAAA,GAAwD;AAAA,EAC5D,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,YAAY,SAAA,EAAU;AAAA,EACjD,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,YAAY,WAAA,EAAY;AAAA,EACrD,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,YAAY,UAAA,EAAW;AAAA,EACnD,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,YAAY,QAAA;AACxC,CAAA;AAMA,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,GAAA,EAAI,EAAmC;AAChE,EAAA,uBACE,GAAA;AAAA,IAACR,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,MAAA,EAAQ,GAAG,GAAG,CAAA,CAAA,CAAA;AAAA,QACd,eAAA,EAAiB,KAAA,CAAM,KAAA,EAAO,IAAI,CAAA;AAAA,QAClC,YAAA,EAAc;AAAA;AAChB;AAAA,GACF;AAEJ;AAGA,IAAM,IAAA,GAAO,0DAAA;AAEb,IAAM,iBAAA,GAAoB,CAAA;AAE1B,SAAS,aAAA,CAAc;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,GAAA,GAAO,IAAA;AAG5C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,OAAO,iBAAiB,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,KAAA;AAAA,IACP,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,IAAI,CAAA;AAAA,IACrC,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB;AAAA,GAClB;AACA,EAAA,MAAM,MAAM,CAAC,CAAA,EAAW,IAAA,qBACtB,GAAA,CAACO,MAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,MAAM,QAAA,EAAU,KAAA,EAAO,GAAG,UAAA,EAAY,KAAA,IAAU,QAAA,EAAA,IAAA,EAAK,CAAA;AAKlF,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAM,UAAA,GAAa,YAAY,IAAA,GAAA,CAAQ,QAAA,GAAW,KAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AACjF,IAAA,uBAAO,GAAA,CAACP,MAAA,EAAK,KAAA,EAAO,MAAO,QAAA,EAAA,GAAA,CAAI,KAAA,EAAO,UAAU,CAAA,EAAE,CAAA;AAAA,EACpD;AAKA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,OAAA,GAAU,eAAe,QAAA,IAAY,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,YAAY,IAAA,GAAO,eAAA,CAAgB,SAAS,QAAA,EAAU,OAAO,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAC/F,IAAA,MAAM,YAAY,QAAA,IAAY,IAAA,GAAO,gBAAA,CAAiB,OAAA,EAAS,QAAQ,CAAA,GAAI,KAAA;AAC3E,IAAA,4BACGA,IAAAA,EAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAO,iBAAA,EACxB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAc,GAAA,EAAK,GAAA,EAAK,CAAA;AAAA,MACjC,GAAA,CAAI,WAAW,SAAS;AAAA,KAAA,EAC3B,CAAA;AAAA,EAEJ;AAIA,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,cAAA,EAAgB,QAAQ,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,cAAA,EAAgB,QAAQ,CAAA;AACxD,EAAA,MAAM,UAAA,GACJ,YAAY,IAAA,GAAO,eAAA,CAAgB,gBAAgB,QAAA,EAAU,OAAO,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AACtF,EAAA,4BACGA,IAAAA,EAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAO,mBAAA,EACxB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAc,GAAA,EAAK,OAAA,EAAS,CAAA;AAAA,IACrC,GAAA,CAAI,YAAY,UAAU;AAAA,GAAA,EAC7B,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,MAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AAGD,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,GACrB,WAAA,CAAY,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,WAAW,CAAA,GACvD,EAAA;AACJ,EAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,OAAO,CAAA,KAAM;AAC7B,IAAA,MAAM,MAAA,GACJ,cAAc,CAAA,IAAK,CAAA,GAAI,cAAc,UAAA,GAAa,CAAA,GAAI,cAAc,MAAA,GAAS,QAAA;AAC/E,IAAA,uBACE,IAAA,CAACA,MAAA,EAAqB,KAAA,EAAO,EAAE,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,QAAA,EAAS,EACvE,QAAA,EAAA;AAAA,MAAA,CAAA,GAAI,qBAAK,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,WAAA,CAAY,MAAM,QAAA,EAAoB,CAAA;AAAA,sBACvE,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,UACf,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,MAAA;AAAA,UACA,gBAAgB,IAAA,CAAK,cAAA;AAAA,UACrB,WAAA,EAAa,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,GAAG,CAAA;AAAA,UACvC,QAAA;AAAA,UACA;AAAA;AAAA;AACF,KAAA,EAAA,EAVS,MAAM,GAWjB,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA,EAAU,YAAA;AAAA,EACV,SAAA,GAAY,IAAA;AAAA,EACZ,QAAA,GAAW,IAAA;AAAA,EACX,IAAA;AAAA,EACA,WAAA,GAAc,WAAA;AAAA,EACd,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIE,SAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,CAAC,SAAA,EAAW,WAAA,EAAa,YAAY,QAAQ,CAAA,GAAI,WAAW,KAAK,CAAA;AACvE,EAAA,MAAM,OAAO,IAAA,KAAS,IAAA;AACtB,EAAA,MAAM,QAAA,GAAW,YAAA,KAAiB,IAAA,GAAO,CAAA,GAAI,EAAA,CAAA;AAG7C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAA;AAC5C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAC,CAAA;AAExD,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,EAAQ;AAAA,IACV;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtB,EAAA,MAAM,OAAA,mBACJ,IAAA;AAAA,IAACF,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,eAAA,EAAiBQ,GAAE,gBAAgB,CAAA;AAAA,QACnC,iBAAA,EAAmB,UAAA;AAAA,QACnB,eAAA,EAAiB,UAAA;AAAA,QACjB,YAAA,EAAc;AAAA,OAChB;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,SAAA,oBACC,GAAA;AAAA,UAACD,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,KAAA;AAAA,cACZ,QAAA,EAAU,SAAA;AAAA,cACV,UAAA,EAAY,KAAA;AAAA;AAAA,cAEZ,KAAA,EAAO,IAAA,GAAOC,EAAAA,CAAE,mBAAmB,CAAA,GAAI,aAAA;AAAA,cACvC,aAAA,EAAe,GAAA;AAAA,cACf,aAAA,EAAe,WAAA;AAAA,cACf,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG;AAAA,aACxC;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBAEF,GAAA,CAACR,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,eAAe,KAAA,EAAM,EAAG,MAAA,EAAO,aAAA,EAC3C,QAAA,EAAA,IAAA,mBACC,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,CAAC,SAAA,EAAW,WAAA,EAAa,YAAY,QAAQ,CAAA;AAAA,YACrD,IAAA;AAAA,YACA,QAAA;AAAA,YACA,OAAA,EAAS;AAAA;AAAA,SACX;AAAA;AAAA,0BAGA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,cAAW,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,WAAA,CAAY,WAAW,QAAA,EAAoB,CAAA;AAAA,4BAChF,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,WAAA,CAAY,MAAM,QAAA,EAAoB,CAAA;AAAA,gCAC5D,UAAA,EAAA,EAAW,KAAA,EAAO,aAAa,KAAA,EAAO,WAAA,CAAY,aAAa,QAAA,EAAoB,CAAA;AAAA,4BACpF,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,WAAA,CAAY,MAAM,QAAA,EAAoB,CAAA;AAAA,gCAC5D,UAAA,EAAA,EAAW,KAAA,EAAO,YAAY,KAAA,EAAO,WAAA,CAAY,YAAY,QAAA,EAAoB,CAAA;AAAA,4BAClF,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,WAAA,CAAY,MAAM,QAAA,EAAoB,CAAA;AAAA,gCAC5D,UAAA,EAAA,EAAW,KAAA,EAAO,UAAU,KAAA,EAAO,WAAA,CAAY,UAAU,QAAA,EAAoB;AAAA,WAAA,EAChF;AAAA,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAGF,EAAA,uBACE,IAAA;AAAA,IAACM,SAAAA;AAAA,IAAA;AAAA,MACC,kBAAA,EAAoB,UAAU,SAAS,CAAA,mBAAA,EAAsB,WAAW,CAAA,eAAA,EAAkB,UAAU,uBAAuB,QAAQ,CAAA,aAAA,CAAA;AAAA,MACnI,iBAAA,EAAkB,QAAA;AAAA,MAClB,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAO,eAAA;AAAA,MAEN,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACA,WAAA,oBACC,IAAA;AAAA,UAACN,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,UAAA;AAAA,cACV,MAAA,EAAQ,MAAA;AAAA,cACR,IAAA,EAAM,KAAA;AAAA,cACN,SAAA,EAAW,CAAC,EAAE,UAAA,EAAY,QAA6B,CAAA;AAAA,cACvD,YAAA,EAAc,CAAA;AAAA,cACd,MAAA,EAAQ,EAAA;AAAA,cACR,UAAA,EAAY;AAAA,aACd;AAAA,YACA,MAAA,EAAO,eAAA;AAAA,YAEP,QAAA,EAAA;AAAA,8BAAA,IAAA;AAAA,gBAACA,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,eAAA,EAAiBQ,GAAE,iBAAiB,CAAA;AAAA,oBACpC,YAAA,EAAc,CAAA;AAAA,oBACd,eAAA,EAAiB,CAAA;AAAA,oBACjB,iBAAA,EAAmB,EAAA;AAAA,oBACnB,WAAA,EAAa,CAAA;AAAA,oBACb,WAAA,EAAa;AAAA,mBACf;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAA,IAAA,CAACD,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,KAAA,EAAM,EAAG,QAAA,EAAA;AAAA,sBAAA,aAAA;AAAA,sBACtE,SAAA;AAAA,sBAAU;AAAA,qBAAA,EACxB,CAAA;AAAA,oCACA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,OAAM,EAAG,QAAA,EAAA;AAAA,sBAAA,kBAAA;AAAA,sBACjE,WAAA;AAAA,sBAAY;AAAA,qBAAA,EAC/B,CAAA;AAAA,oCACA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,OAAM,EAAG,QAAA,EAAA;AAAA,sBAAA,cAAA;AAAA,sBACrE,UAAA;AAAA,sBAAW;AAAA,qBAAA,EAC1B,CAAA;AAAA,oCACA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,OAAM,EAAG,QAAA,EAAA;AAAA,sBAAA,eAAA;AAAA,sBACpE,QAAA;AAAA,sBAAS;AAAA,qBAAA,EACzB;AAAA;AAAA;AAAA,eACF;AAAA,8BACA,GAAA;AAAA,gBAACP,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,KAAA,EAAO,CAAA;AAAA,oBACP,MAAA,EAAQ,CAAA;AAAA,oBACR,eAAA,EAAiB,CAAA;AAAA,oBACjB,gBAAA,EAAkB,CAAA;AAAA,oBAClB,cAAA,EAAgB,CAAA;AAAA,oBAChB,eAAA,EAAiB,aAAA;AAAA,oBACjB,gBAAA,EAAkB,aAAA;AAAA,oBAClB,cAAA,EAAgB;AAAA;AAClB;AAAA;AACF;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AC7YA,IAAMQ,EAAAA,GAAI,kBAAkB,MAAM,CAAA;AAyBlC,IAAM,gBAAA,GAAmE;AAAA,EACvE,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,OAAOA,EAAAA,CAAE,cAAc,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAuB;AAAA,EACtF,SAAA,EAAW,EAAE,IAAA,EAAM,iBAAA,EAAmB,OAAOA,EAAAA,CAAE,cAAc,CAAA,EAAG,KAAA,EAAO,gBAAA,EAAiB;AAAA,EACxF,eAAA,EAAiB,EAAE,IAAA,EAAM,gBAAA,EAAkB,OAAOA,EAAAA,CAAE,gBAAgB,CAAA,EAAG,KAAA,EAAO,eAAA,EAAgB;AAAA,EAC9F,aAAA,EAAe,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAOA,EAAAA,CAAE,gBAAgB,CAAA,EAAG,KAAA,EAAO,aAAA,EAAc;AAAA,EACzF,EAAA,EAAI,EAAE,IAAA,EAAM,SAAA,EAAW,OAAOA,EAAAA,CAAE,gBAAgB,CAAA,EAAG,KAAA,EAAO,iBAAA,EAAkB;AAAA,EAC5E,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAOA,EAAAA,CAAE,aAAa,CAAA,EAAG,KAAA,EAAO,WAAA;AAC1D,CAAA;AAuCO,SAAS,kBAAkB,EAAE,IAAA,EAAM,SAAS,SAAA,EAAW,GAAG,OAAM,EAA2B;AAChG,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM,GAAI,iBAAiB,IAAI,CAAA;AAEpD,EAAA,MAAM,IAAA,mBACJ,GAAA;AAAA,IAACR,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,YAAA,EAAc,CAAA;AAAA,QACd,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,KAAA;AAAA,QACb,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAoB,KAAA;AAAA,MACpB,MAAA,EAAO,oBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,KAAA,EAAc;AAAA;AAAA,GAChC;AAGF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA,CAACM,WAAA,EAAU,OAAA,EAAkB,mBAAkB,QAAA,EAAS,kBAAA,EAAoB,OACzE,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;;;AC9FA,SAAS,YAAA,CACP,IAAA,EACA,IAAA,EACA,IAAA,EACA,MACA,IAAA,EACA;AACA,EAAA,MAAM,YAAY,OAAO,IAAA,KAAS,QAAA,GAAW,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA;AACjE,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,OAAI,IAAI,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACxD;AASO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,uBACE,IAAA,CAACN,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,GAAS,IAAA,GAAO,CAAA,EAAE,EAAG,MAAA,EAAO,kBAAA,EAClD,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAACM,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,iBAAA,EAAkB,QAAA;AAAA,QAClB,oBAAoB,YAAA,CAAa,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,QAC7D,SAAA,EAAU,uBAAA;AAAA,QACV,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,QAChB,MAAA,EAAO,sBAAA;AAAA,QAEP,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAACC,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,mBAAA;AAAA,cACV,OAAO,EAAE,QAAA,EAAU,IAAI,UAAA,EAAY,6BAAA,EAA+B,YAAY,KAAA,EAAM;AAAA,cACpF,MAAA,EAAO,oBAAA;AAAA,cAEN,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA,CAACP,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UACxB,SAAA,oBAAa,GAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,SAAA,EAAW;AAAA;AAAA;AAAA,KACpD;AAAA,oBAEA,IAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,uBAAA;AAAA,QACV,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAG,WAAW,CAAA,EAAE;AAAA,QAC9B,MAAA,EAAO,uBAAA;AAAA,QAEP,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAY,IAAA,EAAY,IAAA,EAAY,IAAA,EAAY,CAAA;AAAA,0BAC9D,GAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UACxB,KAAA,wBAAU,YAAA,EAAA,EAAa,KAAA,EAAc,MAAK,IAAA,EAAK,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO;AAAA;AAAA;AAAA;AACrF,GAAA,EACF,CAAA;AAEJ;;;ACjEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,SAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EACd,MAAA;AAAA,EACA,MAAA,GAAS,eAAA;AAAA,EACT,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,uBACE,IAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,EAAG,mBAAmB,EAAA,EAAI,OAAA,EAAS,MAAA,GAAS,IAAA,GAAO,CAAA,EAAE;AAAA,MAC/E,MAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,eAAA,EAAA,EAAiB,GAAG,OAAA,EAAS,CAAA;AAAA,QAE7B,UAAU,MAAA,GAAS,CAAA,wBACjBA,IAAAA,EAAA,EAAK,OAAO,EAAE,SAAA,EAAW,GAAE,EAAG,MAAA,EAAO,uBACpC,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,MAAM,SAAA,EAAW,MAAA,EAAQ,aAAa,CAAA,EAClD;AAAA;AAAA;AAAA,GAEJ;AAEJ;;;ACoBA,SAAS,wBACP,QAAA,EACwB;AACxB,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,mBAAA,EAAqB,EAAA;AAAA,QACrB,oBAAA,EAAsB,EAAA;AAAA,QACtB,sBAAA,EAAwB,CAAA;AAAA,QACxB,uBAAA,EAAyB;AAAA,OAC3B;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,mBAAA,EAAqB,CAAA;AAAA,QACrB,oBAAA,EAAsB,CAAA;AAAA,QACtB,sBAAA,EAAwB,EAAA;AAAA,QACxB,uBAAA,EAAyB;AAAA,OAC3B;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,mBAAA,EAAqB,CAAA;AAAA,QACrB,oBAAA,EAAsB,CAAA;AAAA,QACtB,sBAAA,EAAwB,CAAA;AAAA,QACxB,uBAAA,EAAyB;AAAA,OAC3B;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,mBAAA,EAAqB,EAAA;AAAA,QACrB,oBAAA,EAAsB,EAAA;AAAA,QACtB,sBAAA,EAAwB,EAAA;AAAA,QACxB,uBAAA,EAAyB;AAAA,OAC3B;AAAA;AAEN;AAEA,SAAS,kBACP,QAAA,EACwB;AACxB,EAAA,IAAI,QAAA,KAAa,OAAA,IAAW,QAAA,KAAa,QAAA,EAAU;AACjD,IAAA,OAAO,EAAE,cAAc,CAAA,EAAE;AAAA,EAC3B;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,cAAc,OAAA,EAA+C;AACpE,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,GAAA,EAAM,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAA;AACzF;AAEA,SAAS,wBAAA,CACP,IAAA,EACA,OAAA,EACA,YAAA,EACQ;AACR,EAAA,IAAI,SAAS,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,aAAA,CAAc,OAAO,CAAC,CAAA,CAAA;AACtD,EAAA,IAAI,YAAA,EAAc,OAAO,CAAA,EAAG,IAAI,KAAK,YAAY,CAAA,CAAA;AACjD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIE,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,eAAe,MAAA,IAAU,CAAA;AAC/C,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,gBAAA,IAAoB,KAAK,aAAa,CAAA;AACrE,EAAA,MAAM,YAAA,GAAe,wBAAwB,gBAAgB,CAAA;AAC7D,EAAA,MAAM,cAAA,GAAiB,kBAAkB,gBAAgB,CAAA;AAEzD,EAAA,uBACE,GAAA;AAAA,IAACI,SAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,QAAA;AAAA,MACT,SAAA,EAAW,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,MAChC,UAAA,EAAY,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,MAClC,iBAAA,EAAkB,QAAA;AAAA,MAClB,kBAAA,EAAoB,wBAAA,CAAyB,IAAA,EAAM,OAAA,EAAS,MAAS,CAAA;AAAA,MACrE,MAAA,EAAO,eAAA;AAAA,MAEP,QAAA,kBAAA,IAAA;AAAA,QAACN,IAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,UAAU,mBAAA,GAAsB,MAAA;AAAA,UAC3C,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,EAAA;AAAA,YACT,iBAAA,EAAmB,EAAA;AAAA,YACnB,MAAA,EAAQ,SAAA;AAAA,YACR,GAAG,YAAA;AAAA,YACH,GAAG;AAAA,WACL;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAO,sBAAA,EAC7C,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAACO,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,mBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,6BAAA;AAAA,oBACZ,UAAA,EAAY;AAAA,mBACd;AAAA,kBACA,MAAA,EAAO,oBAAA;AAAA,kBAEN,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,8BACA,GAAA,CAACP,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,cACxB,OAAA,oBACC,GAAA;AAAA,gBAACO,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,mBAAA;AAAA,oBACZ,WAAA,EAAa;AAAA,mBACf;AAAA,kBACA,MAAA,EAAO,uBAAA;AAAA,kBAEN,wBAAc,OAAO;AAAA;AAAA,eACxB;AAAA,cAED,wBACC,GAAA,CAACP,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,EAAE,EAC3B,QAAA,kBAAA,GAAA,CAAC,WAAQ,IAAA,EAAK,MAAA,EAAO,SAAO,IAAA,EAAC,OAAA,EAAS,OAAO,CAAA,EAC/C;AAAA,aAAA,EAEJ,CAAA;AAAA,YAAA,CAEE,gBAAgB,CAAA,IAAK,SAAA,GAAY,CAAA,qBACjC,IAAA,CAACA,MAAA,EAAK,SAAA,EAAU,UAAA,EAAW,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,KAAK,CAAA,EAAE,EAAG,QAAO,sBAAA,EAChE,QAAA,EAAA;AAAA,cAAA,aAAA,EAAe,GAAA,CAAI,CAAC,UAAA,EAAY,CAAA,qBAC/B,GAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBAEC,UAAA;AAAA,kBACA,KAAA,EAAO,aAAA;AAAA,kBACP,OAAA,EAAQ,MAAA;AAAA,kBACR,MAAA,EAAQ,gCAAgC,CAAC,CAAA;AAAA,iBAAA;AAAA,gBAJpC;AAAA,eAMR,CAAA;AAAA,cACA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,WAAU,EAAG,CAAC,GAAG,CAAA,qBACrC,GAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBAEC,MAAA,EAAQ,6BAA6B,CAAC,CAAA;AAAA,iBAAA;AAAA,gBADjC,eAAe,CAAC,CAAA;AAAA,eAGxB;AAAA,aAAA,EACH;AAAA;AAAA;AAAA;AAEJ;AAAA,GACF;AAEJ;AAOA,IAAMS,KAAAA,GAAO,kBAAkB,MAAM,CAAA;AAErC,IAAM,YAAA,GAAeA,MAAK,eAAe,CAAA;AAGzC,SAAS,sBAAsB,IAAA,EAAoC;AACjE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAqB;AACpC,IAAA,QAAQ,IAAI,KAAA;AAAO,MACjB,KAAK,MAAA;AACH,QAAA,OAAO,EAAE,QAAQ,QAAA,EAAU,UAAA,EAAY,IAAI,UAAA,EAAY,OAAA,EAAS,GAAA,CAAI,MAAA,CAAO,IAAA,EAAK;AAAA,MAClF,KAAK,MAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,IAAI,UAAA,EAAW;AAAA,MACtD,KAAK,MAAA;AACH,QAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,OAAA,EAAS,IAAI,OAAA,IAAW,GAAA,CAAI,OAAO,IAAA,EAAK;AAAA;AACrE,EACF,CAAC,CAAA;AACH;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EACd,aAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,YAAA,GAAe,wBAAwB,gBAAgB,CAAA;AAC7D,EAAA,MAAM,cAAA,GAAiB,kBAAkB,gBAAgB,CAAA;AAGzD,EAAA,MAAM,OAAO,OAAA,EAAS,IAAA,IAAQ,IAAA,GAAO,CAAC,GAAG,IAAA,IAAQ,KAAA;AAIjD,EAAA,MAAM,eAAe,SAAA,KAAc,IAAA,GAAO,qBAAA,CAAsB,IAAI,IAAI,EAAC,CAAA;AACzE,EAAA,MAAM,eAAA,GAAkB,SAAA,KAAc,IAAA,GAAO,IAAA,GAAO,MAAA,CAAA;AAEpD,EAAA,uBACE,IAAA;AAAA,IAACT,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,mCAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,CAAA;AAAA,QACb,GAAG,YAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MACA,MAAA,EAAO,eAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,IAAA,EAAM,OAAA,EAAS,IAAA,IAAQ,IAAA,EAAM,MAAA,IAAU,CAAA;AAAA,YACvC,IAAA,EAAM,SAAS,IAAA,IAAQ,CAAA;AAAA,YACvB,IAAA,EAAM,SAAS,MAAA,IAAU,CAAA;AAAA,YACzB,IAAA;AAAA,YACA,KAAA;AAAA,YACA,SAAA,EAAW,eAAA;AAAA,YACX,SAAA,EAAW,YAAA;AAAA,YACX,WAAA;AAAA,YACA,OAAA,EAAS,QAAA;AAAA,YACT,MAAA,EAAO;AAAA;AAAA,SACT;AAAA,wBAEA,IAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,OAAO,EAAE,cAAA,EAAgB,GAAG,cAAA,EAAgB,YAAA,EAAc,eAAe,CAAA,EAAE;AAAA,YAC3E,MAAA,EAAO,oBAAA;AAAA,YAEP,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAY,YAAA,EAAc,KAAA,EAAO,QAAO,8BAAA,EAA+B,CAAA;AAAA,cAEtF,IAAA,wBACEA,IAAAA,EAAA,EAAK,QAAO,oBAAA,EACV,QAAA,EAAA,IAAA,CAAK,IAAI,CAAC,GAAA,EAAK,sBACd,GAAA,CAAC,MAAA,EAAA,EAAgB,GAAG,GAAA,EAAK,aAAA,EAAe,IAAI,aAAA,IAAiB,aAAA,EAAA,EAAhD,CAA+D,CAC7E,CAAA,EACH;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,IAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,YAAA,GAAe,wBAAwB,gBAAgB,CAAA;AAC7D,EAAA,MAAM,cAAA,GAAiB,kBAAkB,gBAAgB,CAAA;AAEzD,EAAA,2BACGM,SAAAA,EAAA,EAAU,OAAA,EAAS,QAAA,EAAU,mBAAkB,QAAA,EAC9C,QAAA,kBAAA,GAAA;AAAA,IAACN,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,GAAA;AAAA,QACT,OAAA,EAAS,EAAA;AAAA,QACT,iBAAA,EAAmB,EAAA;AAAA,QACnB,GAAG,YAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MACA,kBAAA,EAAoB,wBAAA,CAAyB,IAAA,EAAM,MAAA,EAAW,YAAY,CAAA;AAAA,MAC1E,MAAA,EAAO,eAAA;AAAA,MAEP,QAAA,kBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAEd,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,CAAA;AAAA,cACZ,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,6BAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YACA,MAAA,EAAO,oBAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QACC,YAAA,oBACC,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,aAAA,EAAe,CAAA;AAAA,YACf,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,CAAA;AAAA,cACZ,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,mBAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YACA,MAAA,EAAO,4BAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAEF,GAAA,CAACP,MAAA,EAAK,SAAA,EAAU,UAAS,KAAA,EAAO,EAAE,QAAA,EAAU,CAAA,EAAE,EAAG,CAAA;AAAA,QAChD,YAAA,oBACC,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oBAAA;AAAA,YACV,aAAA,EAAe,CAAA;AAAA,YACf,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,CAAA;AAAA,cACZ,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY;AAAA,aACd;AAAA,YACA,MAAA,EAAO,6BAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EAEJ;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAYO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIL,QAAAA,CAAS,mBAAmB,KAAK,CAAA;AACjF,EAAA,MAAM,eAAe,QAAA,KAAa,MAAA;AAClC,EAAA,MAAM,UAAA,GAAa,eAAe,QAAA,GAAW,gBAAA;AAE7C,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAM,OAAO,CAAC,UAAA;AACd,IAAA,gBAAA,GAAmB,IAAI,CAAA;AACvB,IAAA,IAAI,CAAC,YAAA,EAAc,mBAAA,CAAoB,IAAI,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,IAAI,UAAU,uBAAO,GAAA,CAAC,YAAA,EAAA,EAAc,GAAG,MAAM,QAAA,EAAoB,CAAA;AACjE,EAAA,OAAO,UAAA,mBACL,GAAA,CAAC,YAAA,EAAA,EAAc,GAAG,IAAA,EAAM,QAAA,EAAoB,CAAA,mBAE5C,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,IAAA,EAAM,QAAA,EAAoB,CAAA;AAEjD;ACxYO,SAAS,YAAA,CAAa,KAAA,EAAmB,IAAA,GAAkB,MAAA,EAAgB;AAChF,EAAA,OAAOQ,QAAAA,CAAS,OAAO,KAAA,GAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,CAAA,GAAM,iBAAA,CAAkB,IAAI,CAAA,CAAE,KAAK,CAAA;AACxF;;;ACEA,IAAMC,cAAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAC/D,IAAM,eAAA,GAAkB,0DAAA;AAExB,IAAM,UAAA,GAAa;AAAA,EACjB,QAAA,EAAU,EAAA;AAAA,EACV,UAAA,EAAY,KAAA;AAAA,EACZ,UAAA,EAAY,mBAAA;AAAA,EACZ,WAAA,EAAa,CAAA;AAAA,EACb,YAAA,EAAc,CAAA;AAAA,EACd,SAAA,EAAW,QAAA;AAAA,EACX,eAAA,EAAiB,CAAA;AAAA,EACjB,iBAAA,EAAmB;AACrB,CAAA;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,QAAA,GAAW,aAAa,IAAA,GAAO,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA;AAEvF,EAAA,uBACE,IAAA;AAAA,IAACX,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qBAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,cAAA,EAAgB,CAAA;AAAA,QAChB,cAAA,EAAgB,aAAa,gBAAgB,CAAA;AAAA,QAC7C,UAAA,EAAY,EAAA;AAAA,QACZ,iBAAA,EAAmB,EAAA;AAAA,QACnB,aAAA,EAAe,EAAA;AAAA,QACf,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK;AAAA,OACP;AAAA,MACA,iBAAA,EAAkB,SAAA;AAAA,MAClB,MAAA,EAAO,WAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,aAAA,EAAe,UAAS,EACnD,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAACO,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,KAAA;AAAA,gBACZ,UAAA,EAAY;AAAA,eACd;AAAA,cACA,MAAA,EAAO,yBAAA;AAAA,cACP,aAAA,EAAe,CAAA;AAAA,cAEd,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA;AAAA,YAACA,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY;AAAA,eACd;AAAA,cACA,MAAA,EAAO,oBAAA;AAAA,cAEN,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EACF,CAAA;AAAA,wBAEA,IAAA,CAACP,MAAA,EAAK,SAAA,EAAU,gCAA+B,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE,EAC7D,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,IAAA;AAAA,cACP,YAAA,EAAc,YAAA;AAAA,cACd,SAAA,EAAW,eAAA;AAAA,cACX,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,OAAO,EAAA,EAAG;AAAA,cAClC,kBAAA,EAAmB,MAAA;AAAA,cACnB,MAAA,EAAO,gBAAA;AAAA,cACP,YAAA,EAAa;AAAA;AAAA,WACf;AAAA,0BACA,GAAA;AAAA,YAACO,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,MAAA;AAAA,cACP,YAAA,EAAc,cAAA;AAAA,cACd,SAAA,EAAW,eAAA;AAAA,cACX,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,OAAO,EAAA,EAAG;AAAA,cAClC,kBAAA,EAAoB,aAAa,IAAI,CAAA,CAAA;AAAA,cACrC,MAAA,EAAO,kBAAA;AAAA,cACP,YAAA,EAAa;AAAA;AAAA,WACf;AAAA,0BACA,GAAA;AAAA,YAACA,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,KAAA;AAAA,gBACZ,UAAA,EAAY;AAAA,eACd;AAAA,cACA,MAAA,EAAO,gBAAA;AAAA,cAEN,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EACF,CAAA;AAAA,wBAEA,GAAA;AAAA,UAACD,SAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,QAAA;AAAA,YACT,UAAU,CAAC,SAAA;AAAA,YACX,KAAA,EAAO,CAAC,EAAE,OAAA,EAAQ,MAAO;AAAA,cACvB,eAAA,EAAiBK,cAAAA;AAAA,cACjB,YAAA,EAAc,CAAA;AAAA,cACd,eAAA,EAAiB,EAAA;AAAA,cACjB,iBAAA,EAAmB,EAAA;AAAA,cACnB,OAAA,EAAS,CAAC,SAAA,GAAY,GAAA,GAAM,UAAU,GAAA,GAAM;AAAA,aAC9C,CAAA;AAAA,YACA,iBAAA,EAAkB,QAAA;AAAA,YAClB,kBAAA,EAAmB,YAAA;AAAA,YACnB,MAAA,EAAO,kBAAA;AAAA,YAEP,QAAA,kBAAA,GAAA;AAAA,cAACJ,IAAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAY,KAAA;AAAA,kBACZ,UAAA,EAAY,mBAAA;AAAA,kBACZ,KAAA,EAAO;AAAA,iBACT;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AClIO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,EAAA,GAAK,GAAI,CAAC,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,EAAE,CAAA;AAC5C,EAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACvD;AAEO,SAAS,QAAA,CAAS,OAAA,GAA2B,EAAC,EAAe;AAClE,EAAA,MAAM;AAAA,IACJ,IAAA,GAAO,IAAA;AAAA,IACP,UAAA;AAAA,IACA,SAAA,EAAW,mBAAA;AAAA,IACX,OAAA,GAAU,KAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,MAAA,GAAS;AAAA,GACX,GAAI,OAAA;AAEJ,EAAA,MAAM,eAAe,mBAAA,IAAuB,IAAA;AAC5C,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIL,SAAS,CAAC,CAAA;AAE5D,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,YAAA,IAAgB,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS;AAC3C,IAAA,MAAM,EAAA,GAAK,YAAY,MAAM;AAC3B,MAAA,oBAAA,CAAqB,CAAC,IAAA,KAAS,IAAA,GAAO,MAAM,CAAA;AAAA,IAC9C,GAAG,MAAM,CAAA;AACT,IAAA,OAAO,MAAM,cAAc,EAAE,CAAA;AAAA,EAC/B,GAAG,CAAC,YAAA,EAAc,QAAA,EAAU,OAAA,EAAS,MAAM,CAAC,CAAA;AAE5C,EAAA,MAAM,SAAA,GAAY,eAAe,mBAAA,GAAsB,iBAAA;AAEvD,EAAA,MAAM,WAAA,GAAc,UAAA,IAAc,IAAA,IAAQ,UAAA,GAAa,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,cAAc,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,UAAA,GAAa,SAAS,CAAA,GAAI,CAAA;AAE/E,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,QAAA,GAAW,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,SAAA,GAAY,UAAU,CAAC,CAAA;AAAA,EAC5D,CAAA,MAAO;AAEL,IAAA,QAAA,GAAW,IAAA,KAAS,SAAS,CAAA,GAAI,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,KAAS,MAAA,GAAS,cAAc,SAAS,CAAA;AACtE,EAAA,MAAM,IAAA,GAAO,UAAA,IAAc,IAAA,IAAQ,SAAA,IAAa,UAAA;AAEhD,EAAA,OAAO,EAAE,SAAA,EAAW,WAAA,EAAa,QAAA,EAAU,OAAO,IAAA,EAAK;AACzD;ACnEO,IAAM,WAAA,GAA6C;AAAA,EACxD,OAAA,EAAS,4BAAA;AAAA,EACT,SAAA,EAAW,8BAAA;AAAA,EACX,OAAA,EAAS,6BAAA;AAAA,EACT,KAAA,EAAO,2BAAA;AAAA,EACP,OAAA,EAAS,6BAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAA;AAuKO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA,GAAQ,CAAA;AAAA,EACR,GAAA,GAAM,GAAA;AAAA,EACN,eAAA,GAAkB,KAAA;AAAA,EAClB,IAAA,GAAO,EAAA;AAAA,EACP,WAAA,GAAc,CAAA;AAAA,EACd,KAAA,GAAQ,SAAA;AAAA,EACR,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA,EAAAS,YAAAA,GAAc,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAO,CAAA,GAAI,CAAA,GAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EACpD,QAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0B;AACxB,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAK,QAAQ,GAAA,GAAO,GAAA,EAAK,CAAC,CAAA,EAAG,GAAG,CAAA;AACjE,EAAA,MAAM,MAAA,GAAA,CAAU,OAAO,WAAA,IAAe,CAAA;AACtC,EAAA,MAAM,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,MAAA;AACpC,EAAA,MAAM,gBAAA,GAAmB,aAAA,GAAiB,UAAA,GAAa,GAAA,GAAO,aAAA;AAC9D,EAAA,MAAM,SAAS,IAAA,GAAO,CAAA;AAGtB,EAAA,MAAM,QAAA,GAAW,IAAA,GAAO,EAAE,KAAA,EAAO,MAAA,EAAiB,WAAA,EAAa,CAAA,EAAE,GAAI,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAEjG,EAAA,uBACE,IAAA;AAAA,IAACZ,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA;AAAA,MACtD,KAAA,EAAO,QAAA;AAAA,MACP,iBAAA,EAAkB,aAAA;AAAA,MAClB,kBAAA,EAAoB;AAAA,QAClB,GAAA,EAAK,CAAA;AAAA,QACL,GAAA;AAAA,QACA,GAAA,EAAK,kBAAkB,MAAA,GAAY;AAAA,OACrC;AAAA,MACC,GAAG,KAAA;AAAA,MAGJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,mBAAmB,cAAc,CAAA,EAAG,OAAO,QAAA,EAC7D,QAAA,kBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,MAAA;AAAA,YACN,MAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,YAC5B,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAW;AAAA,YAG9B,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAI,MAAA;AAAA,kBACJ,EAAA,EAAI,MAAA;AAAA,kBACJ,CAAA,EAAG,MAAA;AAAA,kBACH,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAO,6BAAA;AAAA,kBACP;AAAA;AAAA,eACF;AAAA,8BAEA,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAI,MAAA;AAAA,kBACJ,EAAA,EAAI,MAAA;AAAA,kBACJ,CAAA,EAAG,MAAA;AAAA,kBACH,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAQ,YAAY,KAAK,CAAA;AAAA,kBACzB,WAAA;AAAA,kBACA,aAAA,EAAc,OAAA;AAAA,kBACd,eAAA,EAAiB,aAAA;AAAA,kBACjB,gBAAA,EAAkB,eAAA,GAAkB,aAAA,GAAgB,IAAA,GAAO,gBAAA;AAAA,kBAC3D,SAAA,EAAW,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAA;AAAA,kBACzC,KAAA,EAAO,EAAE,UAAA,EAAY,wDAAA;AAAyD;AAAA;AAChF;AAAA;AAAA,SACF,EACF,CAAA;AAAA,QAGC,YAAY,IAAA,mBACX,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,UAAA;AAAA,cACV,UAAA,EAAY,QAAA;AAAA,cACZ,cAAA,EAAgB,QAAA;AAAA,cAChB,aAAA,EAAe;AAAA,aACjB;AAAA,YAEC;AAAA;AAAA,SACH,GAEA,SAAA,IACA,CAAC,eAAA,oBACC,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kDAAA;AAAA,YACV,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA,EAAM,EAAE,CAAA,EAAE;AAAA,YAE5C,QAAA,EAAAK,YAAAA,CAAY,KAAA,EAAO,GAAG;AAAA;AAAA;AACzB;AAAA;AAAA,GAGN;AAEJ;;;ACxOO,SAAS,aAAA,CAAc;AAAA,EAC5B,UAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,IAAA,GAAO,GAAA;AAAA,EACP,WAAA,GAAc,CAAA;AAAA,EACd,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,SAAA;AAAA,EACR,SAAA;AAAA,EACA,SAAA,GAAY,SAAA;AAAA,EACZ,QAAA;AAAA,EACA,kBAAA,EAAAC,mBAAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,IAAA,EAAK,GAAI,QAAA,CAAS,EAAE,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,CAAA;AAEvF,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,KAAS,MAAA;AAChC,EAAA,MAAM,QAAA,GAAW,UAAU,SAAA,IAAa,IAAA;AAGxC,EAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,UAAU,CAAC,CAAA,GAAI,CAAA;AAC5F,EAAA,MAAM,GAAA,GAAM,IAAA,KAAS,MAAA,GAAU,QAAA,GAAW,IAAI,aAAA,GAAiB,QAAA;AAC/D,EAAA,MAAM,SAAA,GAA2B,WAAW,SAAA,GAAY,KAAA;AAExD,EAAA,MAAM,YAAA,GAAe,KAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,WAAW,IAAI,GAAI,CAAA;AAC9D,EAAA,MAAM,IAAA,GACJA,mBAAAA,KAAuB,MAAA,GAAS,gBAAA,GAAmB,GAAG,YAAY,CAAA,kBAAA,CAAA,CAAA;AAEpE,EAAA,uBACE,IAAA;AAAA,IAACb,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,UAAA,EAAY,QAAA,EAAU,KAAK,EAAA,EAAG;AAAA,MACvC,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAoB,IAAA;AAAA,MACpB,QAAQ,MAAA,IAAU,gBAAA;AAAA,MAElB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,GAAA;AAAA,YACP,GAAA,EAAK,CAAA;AAAA,YACL,IAAA;AAAA,YACA,WAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA,EAAO,SAAA;AAAA,YAIP,kBAAA,EAAmB,YAAA;AAAA,YACnB,MAAA,EAAO,qBAAA;AAAA,YAEP,QAAA,kBAAA,GAAA;AAAA,cAACO,IAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,WAAW,MAAA,GAAY,mBAAA;AAAA,gBAClC,KAAA,EAAO;AAAA,kBACL,UAAU,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,QAAA,GAAW,OAAO,IAAA,CAAK,CAAA;AAAA,kBACpD,UAAA,EAAY,6BAAA;AAAA,kBACZ,UAAA,EAAY,KAAA;AAAA,kBACZ,WAAA,EAAa,CAAC,cAAc,CAAA;AAAA,kBAC5B,aAAA,EAAe,WAAW,CAAA,GAAI,EAAA;AAAA,kBAC9B,GAAI,QAAA,GAAW,EAAE,OAAO,WAAA,CAAY,SAAS,GAAE,GAAI;AAAA,iBACrD;AAAA,gBACA,MAAA,EAAO,sBAAA;AAAA,gBAEN,qBAAW,SAAA,GAAY;AAAA;AAAA;AAC1B;AAAA,SACF;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;;;ACxGA,IAAMI,cAAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAG/D,IAAM,iBAAA,GAAoB,GAAA;AAuB1B,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,MAAA,EAAO,EAAkD;AACzF,EAAA,uBACE,IAAA,CAACX,MAAA,EAAK,KAAA,EAAO,EAAE,aAAA,EAAe,KAAA,EAAO,GAAA,EAAK,CAAA,EAAE,EAC1C,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAACM,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,SAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB,wBAAA;AAAA,UACjB,eAAA,EAAiB,CAAA;AAAA,UACjB,iBAAA,EAAmB,EAAA;AAAA,UACnB,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAmB,gBAAA;AAAA,QACnB,MAAA,EAAO,qBAAA;AAAA,QAEP,QAAA,kBAAA,GAAA;AAAA,UAACC,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,OAAO,EAAE,QAAA,EAAU,IAAI,UAAA,EAAY,mBAAA,EAAqB,YAAY,KAAA,EAAM;AAAA,YAC3E,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,KACF;AAAA,oBACA,GAAA;AAAA,MAACD,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB,sBAAA;AAAA,UACjB,eAAA,EAAiB,CAAA;AAAA,UACjB,iBAAA,EAAmB,EAAA;AAAA,UACnB,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAmB,WAAA;AAAA,QACnB,MAAA,EAAO,iBAAA;AAAA,QAEP,QAAA,kBAAA,GAAA;AAAA,UAACC,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,mBAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,KAAA,EAAOI;AAAA,aACT;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAoBA,SAAS,aAAA,CAAc;AAAA,EACrB,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,SAAA,GAAY,OACd,+BAAA,GACA,CAAA,YAAA,EAAe,KAAK,GAAA,CAAI,CAAA,EAAG,YAAY,CAAC,CAAA,kBAAA,CAAA;AAC5C,EAAA,uBACE,IAAA,CAACX,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,YAAA,EACrD,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,YAAY,YAAA,GAAe,GAAA;AAAA,QAC3B,SAAA;AAAA,QACA,IAAA,EAAK,MAAA;AAAA,QACL,IAAA;AAAA,QACA,SAAA,EAAU,IAAA;AAAA,QACV,SAAA,EAAU,SAAA;AAAA,QACV,kBAAA,EAAoB,SAAA;AAAA,QACpB,UAAU,CAAC,WAAA,uBAAe,WAAA,EAAA,EAAY,SAAA,EAAsB,QAAgB,CAAA,GAAK,MAAA;AAAA,QACjF,MAAA,EAAO;AAAA;AAAA,KACT;AAAA,IACC,eAAe,IAAA,oBACd,GAAA;AAAA,MAACO,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oBAAA;AAAA,QACV,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,YAAY,mBAAA,EAAoB;AAAA,QACvD,MAAA,EAAO,qBAAA;AAAA,QAEN,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,YAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,OAAA,GAAU,KAAA;AAAA,EACV,IAAA,GAAO;AACT,CAAA,EAAmB;AAGjB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,WAAA;AAAA,IACP;AAAA,MACE,QAAA,CAAS;AAAA,IACX,IAAA,EAAM,MAAA;AAAA,IACN,YAAY,YAAA,GAAe,GAAA;AAAA,IAC3B;AAAA,GACD,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,GAAI,CAAA;AACjD,EAAA,MAAM,cAAc,QAAA,GAAW,GAAA;AAE/B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,uBACE,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,YAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA;AAAA,IAACP,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,mBAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,cAAA,EAAgB,CAAA;AAAA,QAChB,cAAA,EAAgB,aAAa,gBAAgB,CAAA;AAAA,QAC7C,eAAA,EAAiB,EAAA;AAAA,QACjB,iBAAA,EAAmB;AAAA,OACrB;AAAA,MACA,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAoB,eAAe,YAAY,CAAA,kBAAA,CAAA;AAAA,MAC/C,MAAA,EAAO,YAAA;AAAA,MAGP,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,aAAA,EAAe,KAAA;AAAA,cACf,cAAA,EAAgB,eAAA;AAAA,cAChB,UAAA,EAAY,QAAA;AAAA,cACZ,YAAA,EAAc;AAAA,aAChB;AAAA,YAGA,QAAA,EAAA;AAAA,8BAAA,IAAA,CAACA,MAAA,EAAK,KAAA,EAAO,EAAE,aAAA,EAAe,UAAS,EACrC,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAACO,IAAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,qBAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY,mBAAA;AAAA,sBACZ,UAAA,EAAY,KAAA;AAAA,sBACZ,aAAA,EAAe,WAAA;AAAA,sBACf,aAAA,EAAe;AAAA,qBACjB;AAAA,oBACA,MAAA,EAAO,kBAAA;AAAA,oBACR,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gBACC,eAAe,IAAA,oBACd,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,oBAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY,mBAAA;AAAA,sBACZ,SAAA,EAAW;AAAA,qBACb;AAAA,oBACA,MAAA,EAAO,qBAAA;AAAA,oBAEN,QAAA,EAAA;AAAA;AAAA;AACH,eAAA,EAEJ,CAAA;AAAA,8BAGA,GAAA;AAAA,gBAACA,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,mBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,6BAAA;AAAA,oBACZ,UAAA,EAAY,KAAA;AAAA,oBACZ,WAAA,EAAa,CAAC,cAAc,CAAA;AAAA,oBAC5B,aAAA,EAAe;AAAA,mBACjB;AAAA,kBACA,MAAA,EAAO,iBAAA;AAAA,kBAEN,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,SACF;AAAA,wBAGA,GAAA;AAAA,UAACP,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,WAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,MAAA,EAAQ,CAAA;AAAA,cACR,YAAA,EAAc,CAAA;AAAA,cACd,YAAA,EAAc;AAAA,aAChB;AAAA,YACA,MAAA,EAAO,2BAAA;AAAA,YAEP,QAAA,kBAAA,GAAA;AAAA,cAACA,IAAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,MAAA,EAAQ,MAAA;AAAA,kBACR,eAAA,EAAiBW,cAAAA;AAAA,kBACjB,YAAA,EAAc,CAAA;AAAA,kBACd,KAAA,EAAO,GAAG,WAAW,CAAA,CAAA;AAAA,iBACvB;AAAA,gBACA,MAAA,EAAO;AAAA;AAAA;AACT;AAAA,SACF;AAAA,QAGC,CAAC,WAAA,oBAAe,GAAA,CAAC,WAAA,EAAA,EAAY,WAAsB,MAAA,EAAgB;AAAA;AAAA;AAAA,GACtE;AAEJ;AC3QA,IAAM,QAAA,GAAW;AAAA,EACf,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAAA,EAChD,MAAA,EAAQ,iBAAA,CAAkB,MAAM,CAAA,CAAE,iBAAiB;AACrD,CAAA;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAQ,QAAA,CAAS,KAAA;AAAA,EACjB,QAAQ,QAAA,CAAS,KAAA;AAAA,EACjB;AACF,CAAA,EAAyB;AACvB,EAAA,uBACE,IAAA;AAAA,IAACX,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,eAAA,EAAiB,CAAA;AAAA,QACjB,eAAA,EAAiB,KAAA;AAAA,QACjB,WAAA,EAAa,CAAA;AAAA,QACb,gBAAA,EAAkB,EAAA;AAAA,QAClB,YAAA,EAAc,CAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,iBAAA,EAAmB,OAAA;AAAA,MACnB,kBAAA,EAAoB,aAAa,KAAK,CAAA,CAAA;AAAA,MACtC,MAAA,EAAO,kBAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,UAAA;AAAA,cACV,GAAA,EAAK,EAAA;AAAA,cACL,IAAA,EAAM,EAAA;AAAA,cACN,QAAA,EAAU,CAAA;AAAA,cACV,UAAA,EAAY,mBAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,eAAA,EAAiB,KAAA;AAAA,cACjB,OAAO,QAAA,CAAS,MAAA;AAAA,cAChB,eAAA,EAAiB,CAAA;AAAA,cACjB,iBAAA,EAAmB,CAAA;AAAA,cACnB,uBAAA,EAAyB,CAAA;AAAA,cACzB,aAAA,EAAe,GAAA;AAAA,cACf,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,MAAA,EAAO,gBAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACA,GAAA,CAACP,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAK,CAAA,EAAE,EAAG,MAAA,EAAO,mBAAA,EAC7B,QAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ;;;ACnDA,IAAMW,cAAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAyGxD,SAAS,mBAAmB,QAAA,EAAyC;AAC1E,EAAA,IAAI,QAAA,CAAS,aAAA,IAAiB,IAAA,EAAM,OAAO,SAAS,aAAA,CAAc,MAAA;AAClE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,WAAA,EAAa,OAAO,QAAA,CAAS,gBAAA;AACrD,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,sBAAsB,SAAA,EAAqD;AACzF,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,WAAA,EAAa,kBAAA,IAAsB,CAAA;AAC3D,IAAA,aAAA,IAAiB,mBAAmB,QAAQ,CAAA;AAC5C,IAAA,SAAA,IAAa,QAAA,CAAS,gBAAA;AAAA,EACxB;AACA,EAAA,OAAO;AAAA,IACL,kBAAA;AAAA,IACA,gBAAgB,SAAA,CAAU,MAAA;AAAA,IAC1B,aAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA,EAAU,SAAA,KAAc,CAAA,GAAI,CAAA,GAAI,aAAA,GAAgB;AAAA,GAClD;AACF;AAGO,SAAS,mBACd,SAAA,EAC8B;AAC9B,EAAA,OAAO,UAAU,IAAA,CAAK,CAAC,aAAa,QAAA,CAAS,MAAA,KAAW,QAAQ,CAAA,IAAK,IAAA;AACvE;AAGO,SAAS,mBAAmB,MAAA,EAAuC;AACxE,EAAA,OAAO,MAAA,KAAW,UAAA;AACpB;AAGO,SAAS,kBACd,QAAA,EACA,OAAA,EACA,QAAA,EACA,gBAAA,GAA0D,MAC1D,aAAA,EACmB;AACnB,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,QAAA,CAAS,MAAM,CAAA;AACnD,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,QAAA;AAAA,IACA,QAAA,EAAU,OAAA;AAAA,IACV,gBAAA,EAAkB,QAAA;AAAA,IAClB,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,eAAe,QAAA,CAAS,aAAA;AAAA,IACxB,kBAAkB,QAAA,CAAS,gBAAA;AAAA,IAC3B,IAAA,EAAM,OAAA,GAAU,QAAA,CAAS,IAAA,GAAO,MAAA;AAAA,IAChC,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,cAAA,CACd,WACA,SAAA,EACgB;AAChB,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa,CAAC,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAC,CAAC,CAAA;AACzE,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,QAAA,GAAW,SAAS,UAAA,IAAc,IAAA,GAAO,KAAK,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA,GAAI,MAAA;AAC/E,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,QAAA,IAAY,QAAQ,IAAA,EAAM,IAAA,KAAS,cAAc,IAAA,CAAK,QAAA,CAAS,EAAA,KAAO,QAAA,CAAS,EAAA,EAAI;AACrF,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,YAAY,IAAA,EAAM;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA;AAAA,IACnE,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,kBAAA,CAAmB,OAAe,MAAA,EAAuD;AAChG,EAAA,IAAI,MAAA,KAAW,GAAG,OAAO,IAAA;AACzB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,OAAA;AACxB,EAAA,IAAI,KAAA,KAAU,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AACjC,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACE,IAAA,CAACX,MAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,4BAAA,EAC/B,QAAA,EAAA;AAAA,oBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EAAuC,OAAO,EAAE,GAAA,EAAK,GAAE,EACrE,QAAA,EAAA;AAAA,sBAAA,IAAA,CAACA,MAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,GAAE,EAC3B,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,iBAAA,EAAkB,QAAA;AAAA,YAClB,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,6BAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YACA,MAAA,EAAO,2BAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QACC,YAAY,IAAA,oBACX,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,SAAA,EAAW,CAAA;AAAA,cACX,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY;AAAA,aACd;AAAA,YACA,MAAA,EAAO,8BAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EAEJ,CAAA;AAAA,sBACA,IAAA,CAACP,MAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,UAAA,EAAW,EAAG,MAAA,EAAO,oCAAA,EAC9C,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,6BAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,KAAA,EAAOI,cAAAA;AAAA,cACP,WAAA,EAAa,CAAC,cAAc;AAAA,aAC9B;AAAA,YAEC,QAAA,EAAA,CAAA,EAAG,QAAA,CAAS,kBAAkB,CAAA,CAAA,EAAI,SAAS,cAAc,CAAA;AAAA;AAAA,SAC5D;AAAA,wBACA,GAAA;AAAA,UAACJ,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,mBAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAe,GAAA;AAAA,cACf,aAAA,EAAe;AAAA,aACjB;AAAA,YAEC,QAAA,EAAA,CAAA,EAAG,QAAA,CAAS,aAAa,CAAA,CAAA,EAAI,SAAS,SAAS,CAAA,KAAA;AAAA;AAAA;AAClD,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA;AAAA,MAACP,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,cAAc,CAAA,EAAE;AAAA,QACpC,MAAA,EAAO,oCAAA;AAAA,QAEP,QAAA,kBAAA,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,MAAA,EAAQ,MAAA;AAAA,cACR,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,QAAA,CAAS,QAAA,GAAW,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,cAC7C,eAAA,EAAiBW,cAAAA;AAAA,cACjB,YAAA,EAAc;AAAA,aAChB;AAAA,YACA,MAAA,EAAO;AAAA;AAAA;AACT;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAQA,SAAS,YAAA,CAAa,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAS,EAAsB;AACxE,EAAA,uBACE,GAAA,CAACX,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,+BAAA,EAC9B,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACrB,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,uBACE,GAAA;AAAA,QAACA,IAAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,mCAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,CAAA;AAAA,YACb,YAAA,EAAc;AAAA,WAChB;AAAA,UAEA,QAAA,kBAAA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACE,GAAG,iBAAA;AAAA,gBAAkB,KAAA,CAAM,QAAA;AAAA,gBAAU,KAAA,CAAM,SAAS,EAAA,KAAO,SAAA;AAAA,gBAAW,MACrE,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,EAAE;AAAA;AAC5B;AAAA;AACF,SAAA;AAAA,QAXK,MAAM,QAAA,CAAS;AAAA,OAYtB;AAAA,IAEJ;AACA,IAAA,uBACE,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QAEC,KAAA,EAAO,MAAM,QAAA,CAAS,KAAA;AAAA,QACtB,KAAA,EAAO,MAAM,QAAA,CAAS,KAAA;AAAA,QAErB,QAAA,EAAA,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,CAAC,UAAU,KAAA,qBAC9B,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YAEE,GAAG,iBAAA;AAAA,cACF,QAAA;AAAA,cACA,SAAS,EAAA,KAAO,SAAA;AAAA,cAChB,MAAM,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA;AAAA,cAC1B,kBAAA,CAAmB,KAAA,EAAO,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA;AAAA,cAChD,MAAM,QAAA,CAAS;AAAA;AACjB,WAAA;AAAA,UAPK,QAAA,CAAS;AAAA,SASjB;AAAA,OAAA;AAAA,MAfI,MAAM,QAAA,CAAS;AAAA,KAgBtB;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAcO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA,GAAQ,gBAAA;AAAA,EACR,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAY,EAAC;AAAA,EACb,KAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,MAAA,GAAS,mBAAmB,SAAS,CAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIE,QAAAA,CAAwB,MAAA,EAAQ,MAAM,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,cAAc,CAAA;AACrD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIA,QAAAA,CAAS,KAAA,EAAO,QAAQ,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAIA,QAAAA,CAAS,KAAA,EAAO,UAAU,EAAE,CAAA;AAExD,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM,qBAAA,CAAsB,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAC5E,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAM,cAAA,CAAe,SAAA,EAAW,SAAS,CAAA,EAAG,CAAC,SAAA,EAAW,SAAS,CAAC,CAAA;AAEzF,EAAA,MAAM,WAAA,GAAc,CAAC,EAAA,KAAe,YAAA,CAAa,CAAC,OAAA,KAAa,OAAA,KAAY,EAAA,GAAK,IAAA,GAAO,EAAG,CAAA;AAE1F,EAAA,MAAM,gBAAgB,MAAA,IAAU,IAAA,GAAO,kBAAA,CAAmB,MAAM,IAAI,CAAA,GAAI,CAAA;AACxE,EAAA,MAAM,YAAY,IAAA,CAAK,IAAA,OAAW,EAAA,IAAM,MAAA,CAAO,MAAK,KAAM,EAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,WAAW,IAAA,IAAQ,IAAA;AACpC,EAAA,MAAM,SAAA,GAAY,CAAC,QAAA,IAAY,MAAA,IAAU,IAAA;AAEzC,EAAA,uBACE,IAAA;AAAA,IAACF,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,oBAAA,EAAsB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACrE,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,OAAO,GAAA,EAAI;AAAA,MAC1C,iBAAA,EAAmB,MAAA;AAAA,MACnB,YAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAO,qBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,IAAI,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,6BAAA,EAC5C,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAc,QAAA,EAAoB,QAAA,EAAoB,CAAA;AAAA,0BACrE,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB,SAAA,EAAsB,UAAU,WAAA,EAAa;AAAA,SAAA,EAC7E,CAAA;AAAA,QAAA,CAEE,YAAY,SAAA,qBACZ,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,OAAO,EAAE,cAAA,EAAgB,GAAG,cAAA,EAAgB,YAAA,CAAa,gBAAgB,CAAA,EAAE;AAAA,YAC3E,MAAA,EAAO,gCAAA;AAAA,YAEN,QAAA,EAAA,QAAA,IAAY,QAAQ,IAAA,mBACnB,GAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,cAAc,IAAA,CAAK,YAAA;AAAA,gBACnB,WAAW,IAAA,CAAK,SAAA;AAAA,gBAChB,aAAa,IAAA,CAAK,WAAA;AAAA,gBAClB,MAAA,EAAQ,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,gBAC9B,WAAW,MAAM,MAAA;AAAA,gBACjB,OAAA,EAAO;AAAA;AAAA,aACT,GAEA,UAAU,IAAA,oBACR,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,cAAc,MAAA,CAAO,IAAA;AAAA,gBACrB,SAAA,EAAW,aAAA;AAAA,gBACX,WAAW,MAAA,CAAO,gBAAA;AAAA,gBAClB,IAAA;AAAA,gBACA,MAAA;AAAA,gBACA,MAAM,MAAA,CAAO,IAAA;AAAA,gBACb,YAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAgB,SAAA;AAAA,gBAChB,UAAU,MAAM;AACd,kBAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,UAAA,CAAW,IAAI,CAAA;AAAA,gBACnC,CAAA;AAAA,gBACA,SAAA;AAAA,gBACA,OAAA,EAAO;AAAA;AAAA;AACT;AAAA;AAGN;AAAA;AAAA,GAEJ;AAEJ;AC1YO,IAAM,eAAA,GAA2D;AAAA;AAAA,EAEtE,CAAC,EAAE,GAAG;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,eAAA,EAAiB,CAAA;AAAA,IACjB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,SAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA;AAAA,EAGA,CAAC,EAAE,GAAG;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,eAAA,EAAiB,CAAA;AAAA,IACjB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,SAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA;AAAA,EAGA,CAAC,CAAC,GAAG;AAAA,IACH,IAAA,EAAM,MAAA;AAAA,IACN,eAAA,EAAiB,CAAA;AAAA,IACjB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,QAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA;AAAA,EAGA,CAAC,CAAC,GAAG;AAAA,IACH,IAAA,EAAM,QAAA;AAAA,IACN,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,QAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA;AAAA,EAGA,CAAC,CAAC,GAAG;AAAA,IACH,IAAA,EAAM,UAAA;AAAA,IACN,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,QAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA;AAAA,EAGA,CAAC,CAAC,GAAG;AAAA,IACH,IAAA,EAAM,WAAA;AAAA,IACN,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,QAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA;AAAA,EAGA,CAAC,CAAC,GAAG;AAAA,IACH,IAAA,EAAM,MAAA;AAAA,IACN,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,QAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA;AAAA,EAGA,CAAC,CAAC,GAAG;AAAA,IACH,IAAA,EAAM,UAAA;AAAA,IACN,eAAA,EAAiB,IAAA;AAAA,IACjB,eAAA,EAAiB,QAAA;AAAA,IACjB,WAAA,EAAa,QAAA;AAAA,IACb,WAAA,EAAa;AAAA;AAEjB,CAAA;AAgBA,SAAS,sBAAA,CAAuB,WAAmB,KAAA,EAA+B;AAChF,EAAA,MAAM,GAAA,GAAM,SAAS,SAAS,CAAA;AAC9B,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,0BAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,IAAI,CAAA,GAAI,GAAA;AACxB,EAAA,MAAM,WAAA,GAAc,IAAI,CAAA,GAAI,GAAA;AAI5B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC/B,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,QAAA,GAAW,KAAK,IAAI,CAAA;AAEtD,EAAA,IAAI,WAAA,EAAa;AAGf,IAAA,MAAM,aAAA,GAAgB,IAAA;AACtB,IAAA,MAAM,cAAc,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,GAAI,KAAK,aAAa,CAAA;AAG9D,IAAA,MAAM,WAAA,GAAc,UAAU,GAAA,GAAM,GAAA;AACpC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,YAAY,CAAA;AAC3D,IAAA,OAAO,CAAA,KAAA,EAAQ,WAAA,CAAY,CAAC,CAAA,EAAA,EAAK,WAAA,CAAY,CAAC,CAAA,EAAA,EAAK,WAAA,CAAY,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAC9F,CAAA,MAAO;AAEL,IAAA,MAAM,WAAA,GAAc,UAAU,GAAA,GAAM,IAAA;AACpC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,YAAY,CAAA;AAC3D,IAAA,OAAO,CAAA,oBAAA,EAAuB,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EACvD;AACF;AAYA,SAAS,0BAA0B,YAAA,EAGjC;AACA,EAAA,MAAM,GAAA,GAAM,SAAS,YAAY,CAAA;AACjC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,oBAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAEA,EAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,IAAI,CAAA,GAAI,GAAA;AACxB,EAAA,MAAM,WAAA,GAAc,IAAI,CAAA,GAAI,GAAA;AAE5B,EAAA,IAAI,WAAA,EAAa;AAGf,IAAA,MAAM,eAAA,GAAkB,IAAA;AACxB,IAAA,MAAM,gBAAgB,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,GAAG,eAAe,CAAA;AAE5D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAQ,aAAA,CAAc,CAAC,KAAK,aAAA,CAAc,CAAC,CAAA,EAAA,EAAK,aAAA,CAAc,CAAC,CAAA,MAAA,CAAA;AAAA,QACrE,MAAA,EAAQ,QAAQ,aAAA,CAAc,CAAC,KAAK,aAAA,CAAc,CAAC,CAAA,EAAA,EAAK,aAAA,CAAc,CAAC,CAAA,MAAA;AAAA,OACzE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAQ,aAAA,CAAc,CAAC,KAAK,aAAA,CAAc,CAAC,CAAA,EAAA,EAAK,aAAA,CAAc,CAAC,CAAA,MAAA,CAAA;AAAA,QACrE,MAAA,EAAQ,QAAQ,aAAA,CAAc,CAAC,KAAK,aAAA,CAAc,CAAC,CAAA,EAAA,EAAK,aAAA,CAAc,CAAC,CAAA,MAAA;AAAA,OACzE;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,oBAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,oBAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AACF;AAOA,SAAS,iBAAA,GAAsD;AAC7D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,CAAA;AAAA;AAAA,IACR,IAAA,EAAM;AAAA;AAAA,GACR;AACF;AAUA,IAAM,qBAAA,uBAA4B,GAAA,EAAoB;AACtD,IAAM,cAAA,GAAiB,GAAA;AAEvB,SAAS,WAAA,CAAY,SAAA,EAAmB,KAAA,EAAuB,KAAA,EAAiC;AAC9F,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,IAAI,KAAK,CAAA,CAAA;AACvC;AAEA,SAAS,yBAAA,CACP,SAAA,EACA,KAAA,EACA,KAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,gBAAgB,KAAK,CAAA;AAEpC,EAAA,IAAI,MAAA,CAAO,oBAAoB,CAAA,EAAG;AAChC,IAAA,OAAO,SAAA;AAAA,EACT;AAKA,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,SAAA;AAAA,EACT;AAIA,EAAA,OAAO,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,eAAe,CAAA;AAClD;AAWO,SAAS,mBAAA,CACd,SAAA,EACA,KAAA,EACA,KAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AAGpD,EAAA,IAAI,qBAAA,CAAsB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACvC,IAAA,OAAO,qBAAA,CAAsB,IAAI,QAAQ,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,SAAA,EAAW,KAAY,CAAA;AAGhE,EAAA,IAAI,qBAAA,CAAsB,QAAQ,cAAA,EAAgB;AAEhD,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACrD,IAAA,qBAAA,CAAsB,OAAO,QAAQ,CAAA;AAAA,EACvC;AACA,EAAA,qBAAA,CAAsB,GAAA,CAAI,UAAU,MAAM,CAAA;AAE1C,EAAA,OAAO,MAAA;AACT;AAGA,IAAM,oBAAA,uBAA2B,GAAA,EAAuB;AACxD,IAAM,qBAAA,GAAwB,EAAA;AAE9B,SAAS,iBAAA,CACP,SAAA,EACA,KAAA,EACA,KAAA,EACA,SAAA,EACQ;AACR,EAAA,OAAO,GAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,KAAK,IAAI,SAAS,CAAA,CAAA;AACpD;AAEA,SAAS,wBAAA,CACP,SAAA,EACA,KAAA,EACA,KAAA,EACA,YAAqB,KAAA,EACV;AACX,EAAA,MAAM,MAAA,GAAS,gBAAgB,KAAK,CAAA;AAGpC,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,oBAAA,GAAuB,yBAAA,CAA0B,SAAA,EAAW,KAAY,CAAA;AAI9E,EAAA,MAAM,aAAA,GAAgB,sBAAA,CAAuB,SAAA,EAAW,KAAK,CAAA;AAI7D,EAAA,MAAM,gBAAA,GAAmB,0BAA0B,oBAAoB,CAAA;AAGvE,EAAA,MAAMc,gBAAAA,GAAkB;AAAA,IACtB,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,IAC7B,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,IAC7B,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA;AAAE,GAC/B;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAIA,gBAAAA,CAAgB,OAAO,eAAe,CAAA;AAG/D,EAAA,MAAM,YAAY,iBAAA,EAAkB;AAEpC,EAAA,IAAI,MAAA,CAAO,gBAAgB,SAAA,EAAW;AAEpC,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACtD,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAC,CAAA;AAClD,MAAA,OAAOJ,SAAS,MAAA,CAAO;AAAA,QACrB,GAAA,EAAK;AAAA,UACH,SAAA,EAAW,SAAS,WAAW,CAAA,GAAA,EAAM,WAAW,CAAA,GAAA,EAAM,SAAS,MAAM,gBAAA,CAAiB,MAAM,YAAY,SAAA,CAAU,MAAM,OAAO,SAAA,CAAU,MAAM,MAAM,SAAA,CAAU,IAAI,MAAM,aAAa,CAAA;AAAA,SACxL;AAAA,QACA,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,CAAA;AAAA,UACf,SAAA,EAAW;AAAA;AACb,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAOA,SAAS,MAAA,CAAO;AAAA,MACrB,GAAA,EAAK;AAAA,QACH,SAAA,EAAW,SAAS,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,GAAA,EAAM,IAAI,MAAM,gBAAA,CAAiB,MAAM,YAAY,SAAA,CAAU,MAAM,OAAO,SAAA,CAAU,MAAM,MAAM,SAAA,CAAU,IAAI,MAAM,aAAa,CAAA;AAAA,OACzK;AAAA,MACA,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,CAAA;AAAA,QACf,SAAA,EAAW;AAAA;AACb,KACD,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACtD,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAC,CAAA;AAClD,MAAA,OAAOA,SAAS,MAAA,CAAO;AAAA,QACrB,GAAA,EAAK;AAAA,UACH,SAAA,EAAW,GAAG,WAAW,CAAA,GAAA,EAAM,WAAW,CAAA,GAAA,EAAM,SAAS,MAAM,gBAAA,CAAiB,IAAI,MAAM,SAAA,CAAU,MAAM,OAAO,SAAA,CAAU,MAAM,MAAM,SAAA,CAAU,IAAI,MAAM,aAAa,CAAA;AAAA,SAC1K;AAAA,QACA,OAAA,EAAS;AAAA,UACP,WAAA,EAAa,MAAA;AAAA,UACb,YAAA,EAAc,EAAE,KAAA,EAAO,WAAA,EAAa,QAAQ,WAAA,EAAY;AAAA,UACxD,aAAA,EAAe,GAAA;AAAA,UACf,cAAc,SAAA,GAAY,CAAA;AAAA,UAC1B,SAAA,EAAW;AAAA;AACb,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAOA,SAAS,MAAA,CAAO;AAAA,MACrB,GAAA,EAAK;AAAA,QACH,SAAA,EAAW,GAAG,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,GAAA,EAAM,IAAI,MAAM,gBAAA,CAAiB,IAAI,MAAM,SAAA,CAAU,MAAM,OAAO,SAAA,CAAU,MAAM,MAAM,SAAA,CAAU,IAAI,MAAM,aAAa,CAAA;AAAA,OAC3J;AAAA,MACA,OAAA,EAAS;AAAA,QACP,WAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAc,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,QAC9C,aAAA,EAAe,GAAA;AAAA,QACf,cAAc,IAAA,GAAO,CAAA;AAAA,QACrB,SAAA,EAAW;AAAA;AACb,KACD,CAAA;AAAA,EACH;AACF;AAYO,SAAS,kBAAA,CACd,SAAA,EACA,KAAA,EACA,KAAA,EACA,YAAqB,KAAA,EACV;AACX,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,SAAA,EAAW,KAAA,EAAO,OAAO,SAAS,CAAA;AAGrE,EAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtC,IAAA,OAAO,oBAAA,CAAqB,IAAI,QAAQ,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,SAAA,EAAW,KAAA,EAAO,OAAO,SAAS,CAAA;AAG1E,EAAA,IAAI,oBAAA,CAAqB,QAAQ,qBAAA,EAAuB;AACtD,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACpD,IAAA,oBAAA,CAAqB,OAAO,QAAQ,CAAA;AAAA,EACtC;AACA,EAAA,oBAAA,CAAqB,GAAA,CAAI,UAAU,MAAM,CAAA;AAEzC,EAAA,OAAO,MAAA;AACT;AAsCO,SAAS,oBAAoB,KAAA,EAAiC;AAKnE,EAAA,OAAO,UAAU,OAAA,GACb,mBAAA,CAAoB,gBAAgB,CAAA,GACpC,mBAAmB,kBAAkB,CAAA;AAC3C;AAMO,IAAM,wBAAA,GAA2B;AAAA,EACtC,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,IACX,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IACjB,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,CAAC,EAAA,EAAI,EAAA,EAAI,CAAC,CAAA;AAAA,IACnB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACd,OAAA,EAAS;AAAA;AAEb,CAAA;AAOO,SAAS,qBAAA,CACd,WACA,SAAA,EACgB;AAChB,EAAA,MAAM,KAAA,GAAQ,yBAAyB,SAAS,CAAA;AAChD,EAAA,IAAK,KAAA,CAAM,OAAA,CAAsC,QAAA,CAAS,SAAS,CAAA,EAAG;AACpE,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACtD,EAAA,IAAI,YAAY,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,OAAO,CAAC,CAAA;AAC1C,EAAA,IAAI,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,GAAG,OAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAE1E,EAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IAAO,CAAC,IAAA,EAAM,IAAA,KAC1B,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,SAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,SAAS,IAAI,IAAA,GAAO;AAAA,GACnE;AACF;ACthBO,SAAS,QAAA,GAA6B;AAC3C,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,MAAA;AAC5C,EAAA,OAAO,SAAS,eAAA,CAAgB,SAAA,CAAU,QAAA,CAAS,OAAO,IAAI,OAAA,GAAU,MAAA;AAC1E;AAGA,IAAI,YAA+B,EAAC;AAEpC,SAAS,UAAU,QAAA,EAAsB;AACvC,EAAA,SAAA,GAAY,CAAC,GAAG,SAAA,EAAW,QAAQ,CAAA;AAGnC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,SAAA,CAAU,WAAW,CAAA,EAAG;AAC7D,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,CAAC,SAAA,KAAc;AACnD,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAI,QAAA,CAAS,IAAA,KAAS,YAAA,IAAgB,QAAA,CAAS,kBAAkB,OAAA,EAAS;AAExE,UAAA,SAAA,CAAU,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,OAAA,CAAQ,SAAS,eAAA,EAAiB;AAAA,MACzC,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB,CAAC,OAAO;AAAA,KAC1B,CAAA;AAGA,IAAC,UAAkB,SAAA,GAAY,QAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,GAAY,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,QAAQ,CAAA;AAGhD,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,IAAM,SAAA,CAAkB,SAAA,EAAW;AACzD,MAAC,SAAA,CAAkB,UAAU,UAAA,EAAW;AACxC,MAAC,UAAkB,SAAA,GAAY,IAAA;AAAA,IAClC;AAAA,EACF,CAAA;AACF;AAEA,SAAS,WAAA,GAAgC;AACvC,EAAA,OAAO,QAAA,EAAS;AAClB;AAEA,SAAS,iBAAA,GAAsC;AAC7C,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,QAAA,GAA6B;AAC3C,EAAA,OAAO,oBAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,iBAAiB,CAAA;AACvE;;;AC1BA,IAAM,aAAA,GAA6C;AAAA,EACjD,QAAA,EAAU,EAAA;AAAA;AAAA,EACV,OAAA,EAAS,+BAAA;AAAA;AAAA,EACT,MAAA,EAAQ,EAAA;AAAA;AAAA,EACR,MAAA,EAAQ,sBAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAwBO,SAAS,IAAA,CAAK;AAAA,EACnB,OAAA,GAAU,UAAA;AAAA,EACV,SAAA,GAAY,CAAA;AAAA,EACZ,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,iBAAA,GAAoB,IAAA;AAAA,EACpB,iBAAA,GAAoB,KAAA;AAAA,EACpB,oBAAA,GAAuB,CAAA;AAAA,EACvB,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,MAAM,WAAA,GAAc,aAAA,IAAiB,CAAC,CAAC,OAAA;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIR,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,QAAQ,QAAA,EAAS;AAGvB,EAAA,MAAM,cAAA,GAAiBa,QAAQ,MAAM;AACnC,IAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,MAAA,EAAQ,SAA2B,CAAA;AAE3E,IAAA,IAAI,OAAA,KAAY,SAAA,IAAa,OAAA,KAAY,QAAA,IAAY,YAAY,QAAA,EAAU;AACzE,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAGvB,EAAA,MAAM,SAAA,GAAYA,QAAQ,MAAM,mBAAA,CAAoB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGnE,EAAA,MAAM,YAAA,GAAeA,QAAQ,MAAM;AAEjC,IAAA,IAAA,CAAK,OAAA,KAAY,SAAA,IAAa,OAAA,KAAY,QAAA,KAAa,UAAU,OAAA,EAAS;AACxE,MAAA,OAAO,SAAA;AAAA,IACT;AAEA,IAAA,IAAI,YAAY,QAAA,EAAU;AACxB,MAAA,OAAO,mBAAA,CAAoB,SAAA,EAAW,CAAA,EAAqB,KAAK,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,mBAAA,CAAoB,SAAA,EAAW,cAAA,EAAgB,KAAK,CAAA;AAAA,EAC7D,GAAG,CAAC,SAAA,EAAW,cAAA,EAAgB,KAAA,EAAO,OAAO,CAAC,CAAA;AAE9C,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AAEhC,IAAA,MAAM,cAAc,SAAA,IAAa,WAAA;AACjC,IAAA,OAAO,kBAAA,CAAmB,SAAA,EAAW,cAAA,EAAgB,KAAA,EAAO,WAAW,CAAA;AAAA,EACzE,GAAG,CAAC,SAAA,EAAW,gBAAgB,KAAA,EAAO,SAAA,EAAW,WAAW,CAAC,CAAA;AAG7D,EAAA,MAAM,WAAA,GAAc,4BAClB,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,iBAAA,yBACE,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAACf,IAAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,CAAA;AAAA,sBAC5D,GAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAiD;AAAA,KAAA,EACnE,CAAA;AAAA,oBAEF,GAAA,CAAC,WAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,oBAAA,EAAsB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACpD,GAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,EAAA;AAAA,UACT,qCAAA;AAAA,UACA,CAAA,GAAI,oBAAA,GAAuB,CAAA,GAAI,aAAA,GAAgB;AAAA;AACjD,OAAA;AAAA,MAJK;AAAA,KAMR,CAAA,EACH,CAAA;AAAA,IACC,iBAAA,wBACE,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAACA,MAAA,EAAK,SAAA,EAAU,4CAA2C,CAAA,EAC7D;AAAA,GAAA,EAEJ,CAAA,GAEA,QAAA;AAGF,EAAA,MAAM,aAAA,GAAgB,EAAA;AAAA,IACpB,qCAAA;AAAA;AAAA,IAEA,OAAA,KAAY,YACR,WAAA,GACE,UAAA,GACA,cAAc,OAAO,CAAA,GACvB,cAAc,OAAO,CAAA;AAAA;AAAA,IAEzB,WAAA,IAAe,wDAAA;AAAA,IACf,WAAA,IAAe,gDAAA;AAAA,IACf,SAAA,IAAa,mCAAA;AAAA,IACb;AAAA,GACF;AAGA,EAAA,MAAM,WAAA,GAAce,OAAAA,CAAQ,MAAM,OAAA,KAAY,QAAA,GAAW;AAAA,IACvD,iBAAiB,WAAA,IAAe,CAAA;AAAA,IAChC,iBAAiB,WAAA,IAAe;AAAA,MAC9B,EAAC,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,WAAW,CAAC,CAAA;AAG3C,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AAChC,IAAA,MAAM,cAAA,GAAsC;AAAA,MAC1C,iBAAiB,OAAA,IAAW,YAAA;AAAA,MAC5B,YAAA,EAAc,CAAA;AAAA,MACd,QAAA,EAAU,QAAA;AAAA,MACV,GAAG,WAAA;AAAA,MACH,GAAG;AAAA,KACL;AAGA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,cAAA,CAAe,WAAA,GAAc,WAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,CAAC,OAAO,OAAO,cAAA;AAEnB,IAAA,OAAO,CAAC,gBAAgB,KAAK,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,KAAA,EAAO,YAAA,EAAc,aAAa,WAAA,EAAa,OAAA,EAAS,WAAW,CAAC,CAAA;AAExE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACE,GAAA;AAAA,MAACT,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,SAAA,EAAW,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,QAClC,UAAA,EAAY,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACpC,iBAAA,EAAkB,QAAA;AAAA,QAClB,SAAA,EAAW,aAAA;AAAA,QACX,KAAA,EAAO,WAAA;AAAA,QACN,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA,CAACN,MAAA,EAAK,SAAA,EAAW,eAAe,KAAA,EAAO,WAAA,EAAc,GAAG,KAAA,EACrD,QAAA,EAAA,WAAA,EACH,CAAA;AAEJ;AAUO,SAAS,UAAA,CAAW,EAAE,QAAA,EAAU,SAAA,EAAU,EAAoB;AACnE,EAAA,uBACE,GAAA,CAACA,MAAA,EAAK,SAAA,EAAW,GAAG,WAAA,EAAa,SAAS,GACvC,QAAA,EACH,CAAA;AAEJ;AA6CO,SAAS,WAAA,CAAY,EAAE,QAAA,EAAU,SAAA,EAAU,EAAqB;AACrE,EAAA,uBACE,GAAA,CAACA,MAAA,EAAK,SAAA,EAAW,GAAG,WAAA,EAAa,SAAS,GACvC,QAAA,EACH,CAAA;AAEJ;AAUO,SAAS,UAAA,CAAW,EAAE,QAAA,EAAU,SAAA,EAAU,EAAoB;AACnE,EAAA,uBACE,GAAA,CAACA,MAAA,EAAK,SAAA,EAAW,GAAG,uCAAA,EAAyC,SAAS,GACnE,QAAA,EACH,CAAA;AAEJ;AC5SA,IAAMQ,EAAAA,GAAI,kBAAkB,MAAM,CAAA;AAsBlC,IAAM,kBAAA,GAA6C;AAAA,EACjD,OAAA,EAASA,GAAE,gBAAgB,CAAA;AAAA,EAC3B,OAAA,EAASA,GAAE,gBAAgB,CAAA;AAAA,EAC3B,KAAA,EAAOA,GAAE,cAAc,CAAA;AAAA,EACvB,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,iBAAA,GAA6D;AAAA,EACjE,UAAA,EAAY;AAAA,IACV,eAAA,EAAiB,uBAAA;AAAA,IACjB,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,SAAA,EAAW;AAAA,IACT,eAAA,EAAiB,uBAAA;AAAA,IACjB,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,eAAA,EAAiB,uBAAA;AAAA,IACjB,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,QAAA;AAAA,IACb,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEA,IAAM,UAAA,GAAgE;AAAA,EACpE,OAAA,EAAS,EAAE,SAAA,EAAW,8BAAA,EAA+B;AAAA,EACrD,OAAA,EAAS,EAAE,SAAA,EAAW,8BAAA,EAA+B;AAAA,EACrD,KAAA,EAAO,EAAE,SAAA,EAAW,6BAAA,EAA8B;AAAA,EAClD,OAAA,EAAS,EAAE,SAAA,EAAW,+BAAA,EAAgC;AAAA,EACtD,UAAA,EAAY,EAAE,SAAA,EAAW,8BAAA,EAA+B;AAAA,EACxD,SAAA,EAAW,EAAE,SAAA,EAAW,8BAAA,EAA+B;AAAA,EACvD,MAAA,EAAQ,EAAE,SAAA,EAAW,+BAAA;AACvB,CAAA;AAEA,IAAM,SAAA,GAAoC;AAAA,EACxC,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa,GAAA;AAAA,EACb,IAAA,EAAM;AACR,CAAA;AAGA,IAAM,UAAA,GAA+C;AAAA,EACnD,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,SAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAYA,GAAE,gBAAgB,CAAA;AAAA,EAC9B,SAAA,EAAWA,GAAE,gBAAgB,CAAA;AAAA,EAC7B,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,cAAA,GAAiB;AAAA,EACrB,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA,EAAG,UAAU,KAAA,EAAM;AAAA,EAC/B,EAAA,EAAI,EAAE,IAAA,EAAM,EAAA,EAAI,UAAU,IAAA;AAC5B,CAAA;AAEA,SAAS,eAAe,OAAA,EAAoC;AAC1D,EAAA,OAAO,OAAA,IAAW,kBAAA;AACpB;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,eAAe,OAAO,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,kBAAkB,OAAO,CAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,IAAA,GAAO,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA;AAE/C,EAAA,MAAM,GAAA,mBACJ,GAAA;AAAA,IAACR,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,OAAO,MAAA,CAAO,IAAA;AAAA,UACd,QAAQ,MAAA,CAAO,IAAA;AAAA,UACf,YAAA,EAAc,IAAA;AAAA,UACd,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,UAAA,EAAY;AAAA,SACd;AAAA,QACA,QAAQ,EAAE,eAAA,EAAiB,kBAAA,CAAmB,OAAO,GAAE,GAAI,MAAA;AAAA,QAC3D,OAAQ,IAAA,GAAmC,MAAA;AAAA,QAC3C,YAAa,SAAA,GAAwC;AAAA,OACvD;AAAA,MACA,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA,EAAoB,GAAG,OAAO,CAAA,OAAA,CAAA;AAAA,MAC9B,MAAA,EAAO,YAAA;AAAA,MAEN,QAAA,EAAA,MAAA,CAAO,YAAY,IAAA,oBAClB,GAAA;AAAA,QAACO,IAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,EAAA;AAAA,YACV,UAAA,EAAY,EAAA;AAAA,YACZ,UAAA,EAAY,KAAA;AAAA,YACZ,KAAA,EAAO,WAAW,OAAO;AAAA,WAC3B;AAAA,UACA,2BAAA,EAA2B,IAAA;AAAA,UAE1B,oBAAU,IAAI;AAAA;AAAA;AACjB;AAAA,GAEJ;AAGF,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACE,IAAA;AAAA,MAACP,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,OAAO,EAAE,aAAA,EAAe,OAAO,UAAA,EAAY,QAAA,EAAU,KAAK,CAAA,EAAE;AAAA,QAC5D,kBAAA,EAAoB,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA;AAAA,QAC9C,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAACA,IAAAA,EAAA,EAAK,2BAAA,EAA2B,IAAA,EAAE,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,0BACvC,GAAA;AAAA,YAACO,IAAAA;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,QAAA,EAAU,IAAI,UAAA,EAAY,EAAA,EAAI,OAAO,SAAA,EAAU;AAAA,cACxD,2BAAA,EAA2B,IAAA;AAAA,cAE1B,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,2BACGP,IAAAA,EAAA,EAAK,SAAA,EAAuB,GAAG,OAC7B,QAAA,EAAA,GAAA,EACH,CAAA;AAEJ;ACjJO,IAAM,yBAAA,GAA4B,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AACjD,IAAM,0BAAA,GAA6B,cAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAElD,IAAM,mBAAA,GAAsB,cAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;;;ACRnD,IAAMQ,EAAAA,GAAI,kBAAkB,MAAM,CAAA;AAElC,IAAMG,cAAAA,GAAgBH,GAAE,eAAe,CAAA;AACvC,IAAM,kBAAA,GAAqB,yBAAA;AAC3B,IAAM,mBAAA,GAAsB,0BAAA;AAE5B,IAAM,OAAA,GAAUA,GAAE,gBAAgB,CAAA;AAClC,IAAM,OAAA,GAAUA,GAAE,gBAAgB,CAAA;AAClC,IAAM,KAAA,GAAQA,GAAE,cAAc,CAAA;AAG9B,IAAM,YAAA,GAAe,CAAC,kBAAA,EAAoBG,cAAAA,EAAe,mBAAmB,CAAA;AAO5E,IAAM,aAAA,GAAgB,2BAA2B,YAAA,CAAa,kBAAkB,CAAC,CAAA,KAAA,EAAQ,YAAA,CAAa,gBAAgB,CAAC,CAAA,MAAA,CAAA;AAGvH,IAAM,cAAA,GACJ,wGAAA;AAIF,IAAM,eAAA,GAGF;AAAA,EACF,SAAS,EAAE,EAAA,EAAI,yBAAyB,MAAA,EAAQ,sBAAA,EAAwB,MAAM,OAAA,EAAQ;AAAA,EACtF,SAAS,EAAE,EAAA,EAAI,yBAAyB,MAAA,EAAQ,sBAAA,EAAwB,MAAM,OAAA,EAAQ;AAAA,EACtF,OAAO,EAAE,EAAA,EAAI,wBAAwB,MAAA,EAAQ,sBAAA,EAAwB,MAAM,KAAA;AAC7E,CAAA;AAyDA,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,OAAO,CAAA;AACpC,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,CAAA;AACtB,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,CAAA;AACtB,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,IAAI,KAAA,IAAS,KAAK,OAAO,KAAA;AACzB,EAAA,IAAI,KAAA,IAAS,KAAK,OAAO,OAAA;AACzB,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,kBAAA,CAAmB,MAAc,UAAA,EAAkC;AAC1E,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,IAAA;AACnD,EAAA,MAAM,OAAA,GAAU,UAAA,CACb,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAC,CAAA;AACtD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,QAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AACtD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,KAAA,KAClC,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA,mBACtB,GAAA;AAAA,MAACJ,IAAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,mBAAA;AAAA,QACV,KAAA,EAAO,EAAE,UAAA,EAAY,KAAA,EAAM;AAAA,QAE1B,QAAA,EAAA;AAAA,OAAA;AAAA,MAJI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,wBAOvB,GAAA,CAACS,UAAAA,EAAA,EAA6B,QAAA,EAAA,IAAA,EAAA,EAAf,CAAA,EAAA,EAAK,KAAK,CAAA,CAAU;AAAA,GAEvC;AACF;AAEA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAM,EAA+B;AACzD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,CAAM,OAAO,CAAA;AAC5C,EAAA,uBACE,IAAA;AAAA,IAAChB,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,uBAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,GAAA,EAAK,CAAA;AAAA,QACL,eAAA,EAAiB,CAAA;AAAA,QACjB,iBAAA,EAAmB,CAAA;AAAA,QACnB,YAAA,EAAc,CAAA;AAAA,QACd,WAAA,EAAa,CAAA;AAAA,QACb,iBAAiB,MAAA,CAAO,EAAA;AAAA,QACxB,aAAa,MAAA,CAAO;AAAA,OACtB;AAAA,MACA,MAAA,EAAO,wBAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAA,GAAA,CAACA,IAAAA,EAAA,EAAK,2BAAA,EAA2B,IAAA,EAC/B,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,IAAA,EAAK,IAAA,EAAK,CAAA,EAC/C,CAAA;AAAA,wBACA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,mBAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAe,GAAA;AAAA,cACf,OAAO,MAAA,CAAO;AAAA,aAChB;AAAA,YAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA;AACT;AAAA;AAAA,GACF;AAEJ;AAEA,SAASU,WAAAA,CAAW,EAAE,MAAA,EAAO,EAAiC;AAC5D,EAAA,uBACE,IAAA,CAACjB,MAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG,MAAA,EAAO,yBAAA,EACpC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAACO,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oBAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,EAAA;AAAA,UACV,UAAA,EAAY,mBAAA;AAAA,UACZ,UAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAe,GAAA;AAAA,UACf,aAAA,EAAe;AAAA,SACjB;AAAA,QAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,KACV;AAAA,oBACA,GAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,mBAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,CAAA;AAAA,UACX,QAAA,EAAU,EAAA;AAAA,UACV,UAAA,EAAY,mBAAA;AAAA,UACZ,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,KAAA,CAAM,EAAE,KAAA,EAAM,EAA+B;AACpD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,kBAAkB,KAAK,CAAA;AAC3C,EAAA,uBACE,IAAA;AAAA,IAACP,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,MAChB,iBAAA,EAAkB,aAAA;AAAA,MAClB,oBAAoB,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,GAAA,EAAK,KAAK,UAAA,EAAW;AAAA,MACxD,kBAAA,EAAoB,CAAA,EAAG,KAAA,CAAM,KAAK,KAAK,UAAU,CAAA,CAAA,CAAA;AAAA,MACjD,eAAA,EAAe,UAAA;AAAA,MACf,eAAA,EAAe,CAAA;AAAA,MACf,eAAA,EAAe,GAAA;AAAA,MACf,MAAA,EAAO,wBAAA;AAAA,MAEP,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uCAAA;AAAA,YACV,2BAAA,EAA2B,IAAA;AAAA,YAE3B,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAACO,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,mBAAA;AAAA,oBACZ,UAAA,EAAY,KAAA;AAAA,oBACZ,aAAA,EAAe,GAAA;AAAA,oBACf,aAAA,EAAe;AAAA,mBACjB;AAAA,kBAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,eACT;AAAA,cACC,KAAA,CAAM,YAAY,IAAA,oBACjB,GAAA;AAAA,gBAACA,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,oBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,mBAAA;AAAA,oBACZ,UAAA,EAAY;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA;AACT;AAAA;AAAA,SAEJ;AAAA,wBAEA,IAAA;AAAA,UAACP,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EACE;AAAA,cACE,MAAA,EAAQ,CAAA;AAAA,cACR,YAAA,EAAc,CAAA;AAAA,cACd,QAAA,EAAU,UAAA;AAAA,cACV,eAAA,EAAiB;AAAA,aACnB;AAAA,YAEF,2BAAA,EAA2B,IAAA;AAAA,YAE3B,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAACA,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,UAAA;AAAA,oBACV,IAAA,EAAM,KAAA;AAAA,oBACN,GAAA,EAAK,CAAA;AAAA,oBACL,MAAA,EAAQ,CAAA;AAAA,oBACR,KAAA,EAAO,CAAA;AAAA,oBACP,UAAA,EAAY,IAAA;AAAA,oBACZ,eAAA,EAAiB;AAAA,mBACnB;AAAA,kBACA,MAAA,EAAO;AAAA;AAAA,eACT;AAAA,8BACA,GAAA;AAAA,gBAACA,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,UAAA;AAAA,oBACV,IAAA,EAAM,GAAG,UAAU,CAAA,CAAA,CAAA;AAAA,oBACnB,GAAA,EAAK,EAAA;AAAA,oBACL,UAAA,EAAY,EAAA;AAAA,oBACZ,KAAA,EAAO,EAAA;AAAA,oBACP,MAAA,EAAQ,EAAA;AAAA,oBACR,YAAA,EAAc,IAAA;AAAA,oBACd,WAAA,EAAa,CAAA;AAAA,oBACb,eAAA,EAAiB,WAAA;AAAA,oBACjB,SAAA,EAAW;AAAA,mBACb;AAAA,kBACA,MAAA,EAAO;AAAA;AAAA;AACT;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAuBO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,uBACE,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,CAAA;AAAA,MACX,WAAA,EAAa,kBAAA;AAAA,MACb,SAAA;AAAA,MACA,KAAA,EACE;AAAA,QACE,WAAA,EAAa,kBAAA;AAAA,QACb,WAAA,EAAa,CAAA;AAAA,QACb,eAAA,EAAiB;AAAA,OACnB;AAAA,MAEF,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,wBAAwB,QAAQ,CAAA,CAAA;AAAA,MAC5C,MAAA,EAAO,kBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,UAAA;AAAA,YACV,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,YAC/E,2BAAA,EAA2B,IAAA;AAAA,YAC3B,MAAA,EAAO,yBAAA;AAAA,YAEN,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,yBAChBA,IAAAA,EAAA,EAAiB,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,eAAA,EAAiB,KAAA,EAAM,EAAA,EAAhD,KAAmD,CAC/D;AAAA;AAAA,SACH;AAAA,wBAEA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,EAAA,EAAI,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,uBAAA,EAC5C,QAAA,EAAA;AAAA,0BAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,MAAA,EAAO,yBAAA,EACX,QAAA,EAAA;AAAA,4BAAA,IAAA;AAAA,cAACA,IAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uCAAA;AAAA,gBACV,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,gBAEhB,QAAA,EAAA;AAAA,kCAAA,GAAA;AAAA,oBAACO,IAAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,mBAAA;AAAA,sBACV,KAAA,EAAO;AAAA,wBACL,UAAA,EAAY,CAAA;AAAA,wBACZ,QAAA,EAAU,EAAA;AAAA,wBACV,UAAA,EAAY,6BAAA;AAAA,wBACZ,UAAA,EAAY;AAAA,uBACd;AAAA,sBACA,MAAA,EAAO,uBAAA;AAAA,sBAEN,QAAA,EAAA;AAAA;AAAA,mBACH;AAAA,kCACA,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,WAAA,EAAa;AAAA;AAAA;AAAA,aAClC;AAAA,4BACA,GAAA;AAAA,cAACA,IAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,qBAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,SAAA,EAAW,CAAA;AAAA,kBACX,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAY;AAAA,iBACd;AAAA,gBACA,MAAA,EAAO,2BAAA;AAAA,gBAEN,QAAA,EAAA;AAAA;AAAA;AACH,WAAA,EACF,CAAA;AAAA,UAEC,OAAA,CAAQ,SAAS,CAAA,oBAChB,GAAA;AAAA,YAACP,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oBAAA;AAAA,cACV,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,cAChB,MAAA,EAAO,0BAAA;AAAA,cAEN,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,0BACpB,GAAA,CAACiB,WAAAA,EAAA,EAA4C,MAAA,EAAA,EAA5B,GAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,KAAK,EAAoB,CAC9D;AAAA;AAAA,WACH;AAAA,UAGD,MAAA,CAAO,MAAA,GAAS,CAAA,oBACf,GAAA,CAACjB,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,yBAAA,EAC9B,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAClB,GAAA,CAAC,KAAA,EAAA,EAAsC,KAAA,EAAA,EAA3B,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAkB,CACtD,CAAA,EACH,CAAA;AAAA,UAGD,YAAY,IAAA,oBACX,GAAA;AAAA,YAACA,IAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,eAAA,EAAiB,uBAAA;AAAA,gBACjB,WAAA,EAAa,CAAA;AAAA,gBACb,WAAA,EAAa,uBAAA;AAAA,gBACb,YAAA,EAAc,CAAA;AAAA,gBACd,eAAA,EAAiB,EAAA;AAAA,gBACjB,iBAAA,EAAmB;AAAA,eACrB;AAAA,cACA,MAAA,EAAO,2BAAA;AAAA,cAEP,QAAA,kBAAA,GAAA;AAAA,gBAACO,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,EAAA;AAAA,oBACZ,UAAA,EAAY;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA,kBAAA,CAAmB,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,UAAU;AAAA;AAAA;AACxD;AAAA,WACF;AAAA,UAGD,cAAc,IAAA,oBACb,IAAA;AAAA,YAACP,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,uBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,eAAA,EAAiB,uBAAA;AAAA,gBACjB,WAAA,EAAa,CAAA;AAAA,gBACb,WAAA,EAAa,sBAAA;AAAA,gBACb,YAAA,EAAc,CAAA;AAAA,gBACd,eAAA,EAAiB,EAAA;AAAA,gBACjB,iBAAA,EAAmB;AAAA,eACrB;AAAA,cACA,MAAA,EAAO,8BAAA;AAAA,cAEP,QAAA,EAAA;AAAA,gCAAA,GAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,OAAA,EAAQ,EAAG,2BAAA,EAA2B,IAAA,EACvE,QAAA,EAAA,UAAA,CAAW,IAAA,EACd,CAAA;AAAA,gCACA,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,UAAA,EAAY,CAAA;AAAA,sBACZ,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY,mBAAA;AAAA,sBACZ,UAAA,EAAY,KAAA;AAAA,sBACZ,KAAA,EAAO;AAAA,qBACT;AAAA,oBAEC,QAAA,EAAA,UAAA,CAAW;AAAA;AAAA;AACd;AAAA;AAAA;AACF,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;ACzcA,IAAM,GAAA,GAAM,kBAAkB,MAAM,CAAA;AAEpC,IAAMI,cAAAA,GAAgB,IAAI,eAAe,CAAA;AAGzC,IAAM,qBAAA,GAAwB,aAAa,eAAe,CAAA;AAC1D,IAAMO,eAAAA,GAAiB,IAAI,gBAAgB,CAAA;AAC3C,IAAMC,aAAAA,GAAe,IAAI,cAAc,CAAA;AACvC,IAAMC,eAAAA,GAAiB,IAAI,gBAAgB,CAAA;AAC3C,IAAM,SAAA,GAAY,wBAAA;AAClB,IAAM,eAAA,GAAkB,uBAAA;AACxB,IAAM,mBAAA,GAAsB,uBAAA;AAC5B,IAAM,aAAA,GAAgB,sBAAA;AACtB,IAAM,iBAAA,GAAoB,sBAAA;AAG1B,IAAM,SAAA,GAAY,EAAA;AAElB,IAAM,aAAA,GAAgB,GAAA;AAyDtB,SAAS,OAAO,OAAA,EAAyB;AACvC,EAAA,MAAMZ,GAAAA,GAAI,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC5B,EAAA,OAAO,MAAA,CAAO,KAAA,CAAMA,GAAC,CAAA,GAAI,CAAA,GAAIA,GAAAA;AAC/B;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAC7B;AAEA,SAAS,aAAA,CACP,IAAA,EACA,UAAA,EACA,UAAA,EACA,OACA,MAAA,EACU;AACV,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,EAAM,GAAG,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAGzD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAK,MAAM,CAAA;AAAA,MACX,KAAK,MAAM,CAAA;AAAA,MACX,QAAQ,EAAC;AAAA,MACT,YAAY,EAAC;AAAA,MACb,WAAW,EAAC;AAAA,MACZ,YAAY;AAAC,KACf;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAG,KAAK,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IACjC,GAAG,WAAW,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IACvC,GAAG,WAAW,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC;AAAA,GACzC;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,OAAA,KAAY,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,OAAA;AAE3C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAC/B,EAAA,MAAM,QAAQ,IAAA,GAAO,IAAA,IAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,GAAG,CAAA;AACnD,EAAA,MAAM,OAAO,KAAA,GAAQ,IAAA;AACrB,EAAA,MAAM,YAAY,IAAA,GAAO,IAAA;AACzB,EAAA,MAAM,YAAY,IAAA,GAAO,IAAA;AAEzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,SAAS,CAAA;AAC5C,EAAA,MAAM,MAAM,CAAC,IAAA,KACX,aAAc,IAAA,GAAO,IAAA,KAAS,OAAO,IAAA,CAAA,GAAS,MAAA;AAChD,EAAA,MAAM,MAAM,CAAC,KAAA,KACX,UAAW,KAAA,GAAQ,SAAA,KAAc,YAAY,SAAA,CAAA,GAAc,MAAA;AAE7D,EAAA,MAAM,UAAU,CAAC,MAAA,KACf,OAAO,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW;AAAA,IAC5B,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IACzB,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAAA,IACjB,KAAA;AAAA,IACA;AAAA,GACF,CAAE,CAAA;AAEJ,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA;AAAA,IACvB,IAAI,GAAA,CAAI,CAAC,IAAA,EAAA,CAAO,IAAA,GAAO,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC;AAAA,GACnE;AACA,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,CAAC,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,EAAO,WAAA,CAAY,CAAC,GAAE,CAAE,CAAA;AAE9E,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,GAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAAA,IACpB,UAAA,EAAY,QAAQ,UAAU,CAAA;AAAA,IAC9B,SAAA;AAAA,IACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACjC,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,MACrB,OAAO,CAAA,CAAE;AAAA,KACX,CAAE;AAAA,GACJ;AACF;AAEA,SAAS,YAAA,CACP,MACA,UAAA,EACwC;AACxC,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,UAAU,IAAA,EAAK;AACzD,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,GAAG,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AACtE,IAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,IAAK,YAAY,CAAA;AAIlE,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,UAAU,IAAA,EAAK;AAC7D,IAAA,MAAA,GAAS,QAAA;AAAA,EACX;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA;AACxB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE,IAAA;AACvC,EAAA,MAAM,OAAA,GAAU,KAAA,GAAA,CAAU,IAAA,GAAO,KAAA,IAAS,QAAS,GAAA,GAAM,CAAA;AACzD,EAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,OAAA,IAAW,CAAA,EAAE;AAC3C;AAEA,SAAS,SAAA,CAAU;AAAA,EACjB,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACpB,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAA;AACtB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAA;AACtB,IAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAC1C,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA,IAAK,MAAM,IAAA,CAAK,EAAA,CAAA;AAC/C,IAAA,uBACE,GAAA;AAAA,MAACR,IAAAA;AAAA,MAAA;AAAA,QAEC,MAAA;AAAA,QACA,2BAAA,EAA2B,IAAA;AAAA,QAC3B,KAAA,EAAO;AAAA,UACL;AAAA,YACE,QAAA,EAAU,UAAA;AAAA,YACV,MAAM,IAAA,CAAK,CAAA;AAAA,YACX,KAAK,IAAA,CAAK,CAAA;AAAA,YACV,KAAA,EAAO,MAAA;AAAA,YACP,eAAA,EAAiB,KAAA;AAAA,YACjB,WAAW,CAAC,EAAE,QAAQ,CAAA,EAAG,KAAK,OAAO;AAAA,WACvC;AAAA,UACA,MAAA,GACI;AAAA,YACE,MAAA,EAAQ,CAAA;AAAA,YACR,cAAA,EAAgB,WAAA;AAAA,YAChB,WAAA,EAAa,QAAA;AAAA,YACb,cAAA,EAAgB;AAAA,WAClB,GACA;AAAA,YACE,MAAA,EAAQ,WAAA;AAAA,YACR,cAAc,WAAA,GAAc,CAAA;AAAA,YAC5B,eAAA,EAAiB;AAAA;AACnB;AACN,OAAA;AAAA,MAxBK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,KAyBrB;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAkBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,IAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,KAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAiB,EAAC;AAAA,EAClB,YAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4B;AAC1B,EAAA,MAAM,QAAA,GAAWe,OAAAA;AAAA,IACf,MAAM,aAAA,CAAc,IAAA,EAAM,UAAA,EAAY,cAAA,EAAgB,OAAO,MAAM,CAAA;AAAA,IACnE,CAAC,IAAA,EAAM,UAAA,EAAY,cAAA,EAAgB,OAAO,MAAM;AAAA,GAClD;AACA,EAAA,MAAM,KAAA,GAAQA,OAAAA;AAAA,IACZ,MAAM,YAAA,CAAa,IAAA,EAAM,cAAc,CAAA;AAAA,IACvC,CAAC,MAAM,cAAc;AAAA,GACvB;AAEA,EAAA,MAAM,CAAC,MAAM,CAAA,GAAIb,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,cAAA,GAAiB,CAAA,GAAI,CAAC,CAAC,CAAA;AAC1E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,SAAwB,IAAI,CAAA;AAE5D,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,MAAM,SAAA,GAAYE,QAAAA,CAAS,MAAA,CAAO,MAAA,EAAQ;AAAA,MACxC,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,GAAA;AAAA,MACV,MAAA,EAAQD,MAAAA,CAAO,GAAA,CAAIA,MAAAA,CAAO,IAAI,CAAA;AAAA,MAC9B,eAAA,EAAiB;AAAA,KAClB,CAAA;AACD,IAAA,SAAA,CAAU,KAAA,EAAM;AAChB,IAAA,OAAO,MAAM,UAAU,IAAA,EAAK;AAAA,EAC9B,CAAA,EAAG,CAAC,cAAA,EAAgB,MAAM,CAAC,CAAA;AAE3B,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,GAAS,CAAA,GAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,IAAA,GAAO,CAAA;AAC/D,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,IAAW,CAAA,GAAI,GAAA,GAAM,GAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,SAAS,OAAA,GACvB,CAAA,uEAAA,EAA0E,YAAY,OAAO,CAAC,IAAI,IAAI,CAAA,SAAA,EAAY,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,KAAA,CAAM,OAAO,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAChK,+BAAA;AAEJ,EAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,IAAA,uBACE,GAAA;AAAA,MAACJ,IAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,QACf,SAAA,EAAW,GAAG,SAAS,CAAA;AAAA,QACvB,iBAAA,EAAkB,OAAA;AAAA,QAClB,kBAAA,EAAoB,SAAA;AAAA,QACpB,MAAA,EAAO,4BAAA;AAAA,QACN,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAA,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,KAAA;AAAA,cACA,MAAA;AAAA,cACA,UAAA,EAAY,QAAA;AAAA,cACZ,cAAA,EAAgB;AAAA,aAClB;AAAA,YAEA,QAAA,kBAAA,GAAA,CAACO,IAAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,mBAAA,EAAoB,EAAG,QAAA,EAAA,sBAAA,EAE/F;AAAA;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,CAAY;AAAA,IACrC,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACjB,WAAA,EAAa,CAAC,CAAA,EAAG,KAAK;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,gBACJ,QAAA,IAAY,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAEjD,EAAA,uBACE,IAAA;AAAA,IAACP,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,MACf,SAAA,EAAW,GAAG,SAAS,CAAA;AAAA,MACvB,MAAA,EAAO,sBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAO,MAAA,EAAQ,QAAA,EAAU,YAAW,EAEjD,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAACA,IAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAO;AAAA,cAC9D,iBAAA,EAAkB,OAAA;AAAA,cAClB,kBAAA,EAAoB,SAAA;AAAA,cACpB,MAAA,EAAO,6BAAA;AAAA,cAEN,QAAA,EAAA;AAAA,gBAAA,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAC7B,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBAEC,2BAAA,EAA2B,IAAA;AAAA,oBAC3B,MAAA,EAAO,+BAAA;AAAA,oBACP,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,UAAA;AAAA,sBACV,IAAA,EAAM,SAAA;AAAA,sBACN,KAAA,EAAO,CAAA;AAAA,sBACP,KAAK,IAAA,CAAK,CAAA;AAAA,sBACV,MAAA,EAAQ,CAAA;AAAA,sBACR,eAAA,EAAiB;AAAA,qBACnB;AAAA,oBAEA,QAAA,kBAAA,GAAA;AAAA,sBAACO,IAAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,oBAAA;AAAA,wBACV,KAAA,EAAO;AAAA,0BACL,QAAA,EAAU,UAAA;AAAA,0BACV,MAAM,CAAC,SAAA;AAAA,0BACP,GAAA,EAAK,EAAA;AAAA,0BACL,OAAO,SAAA,GAAY,CAAA;AAAA,0BACnB,SAAA,EAAW,OAAA;AAAA,0BACX,QAAA,EAAU,CAAA;AAAA,0BACV,UAAA,EAAY;AAAA,yBACd;AAAA,wBAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR,mBAAA;AAAA,kBAzBK,QAAQ,CAAC,CAAA;AAAA,iBA2BjB,CAAA;AAAA,gBAEA,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAC,UAAU,CAAA,qBAClC,GAAA;AAAA,kBAACP,IAAAA;AAAA,kBAAA;AAAA,oBAEC,2BAAA,EAA2B,IAAA;AAAA,oBAC3B,MAAA,EAAO,oCAAA;AAAA,oBACP,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,UAAA;AAAA,sBACV,MAAM,QAAA,CAAS,CAAA;AAAA,sBACf,GAAA,EAAK,CAAA;AAAA,sBACL,KAAA,EAAO,CAAA;AAAA,sBACP,MAAA;AAAA,sBACA,eAAA,EAAiB,CAAA;AAAA,sBACjB,WAAA,EAAa,QAAA;AAAA,sBACb,eAAA,EAAiB;AAAA;AACnB,mBAAA;AAAA,kBAZK,YAAY,CAAC,CAAA;AAAA,iBAcrB,CAAA;AAAA,gCAED,GAAA;AAAA,kBAACK,QAAAA,CAAS,IAAA;AAAA,kBAAT;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,UAAA;AAAA,sBACV,GAAA,EAAK,CAAA;AAAA,sBACL,IAAA,EAAM,CAAA;AAAA,sBACN,KAAA,EAAO,WAAA;AAAA,sBACP,MAAA;AAAA,sBACA,QAAA,EAAU;AAAA,qBACZ;AAAA,oBACA,MAAA,EAAO,6BAAA;AAAA,oBAEP,QAAA,kBAAA,IAAA,CAACL,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,GAAE,EAClE,QAAA,EAAA;AAAA,sCAAA,GAAA;AAAA,wBAAC,SAAA;AAAA,wBAAA;AAAA,0BACC,QAAQ,QAAA,CAAS,UAAA;AAAA,0BACjB,KAAA,EAAO,qBAAA;AAAA,0BACP,WAAA,EAAa,CAAA;AAAA,0BACb,MAAA,EAAM,IAAA;AAAA,0BACN,MAAA,EAAO;AAAA;AAAA,uBACT;AAAA,sCACA,GAAA;AAAA,wBAAC,SAAA;AAAA,wBAAA;AAAA,0BACC,QAAQ,QAAA,CAAS,MAAA;AAAA,0BACjB,KAAA,EAAOW,cAAAA;AAAA,0BACP,WAAA,EAAa,GAAA;AAAA,0BACb,MAAA,EAAO;AAAA;AAAA;AACT,qBAAA,EACF;AAAA;AAAA,iBACF;AAAA,gBAEC,SAAS,MAAA,CAAO,GAAA;AAAA,kBAAI,CAAC,CAAA,KACpB,CAAA,CAAE,KAAA,CAAM,IAAA,mBACN,GAAA;AAAA,oBAACJ,IAAAA;AAAA,oBAAA;AAAA,sBAEC,2BAAA,EAA2B,IAAA;AAAA,sBAC3B,MAAA,EAAO,8BAAA;AAAA,sBACP,KAAA,EAAO;AAAA,wBACL,QAAA,EAAU,UAAA;AAAA,wBACV,IAAA,EAAM,EAAE,CAAA,GAAI,CAAA;AAAA,wBACZ,GAAA,EAAK,EAAE,CAAA,GAAI,EAAA;AAAA,wBACX,QAAA,EAAU,EAAA;AAAA,wBACV,KAAA,EAAOa;AAAA,uBACT;AAAA,sBACD,QAAA,EAAA;AAAA,qBAAA;AAAA,oBAVM,CAAA,KAAA,EAAQ,EAAE,KAAK,CAAA;AAAA,mBAYtB,GACE;AAAA;AACN;AAAA;AAAA,WACF;AAAA,0BAGA,GAAA;AAAA,YAACpB,IAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAO;AAAA,cAC9D,MAAA,EAAO,6BAAA;AAAA,cAEN,QAAA,EAAA,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1B,gBAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,YAAA,IAAgB,EAAE,KAAA,CAAM,IAAA;AAC9C,gBAAA,uBACE,GAAA;AAAA,kBAACM,SAAAA;AAAA,kBAAA;AAAA,oBAEC,MAAA,EAAO,4BAAA;AAAA,oBACP,iBAAA,EAAkB,QAAA;AAAA,oBAClB,oBAAoB,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,WAAA,CAAY,EAAE,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,IAAA,GAAO,sBAAsB,EAAE,CAAA,CAAA;AAAA,oBAC5G,SAAS,MAAM;AACb,sBAAA,WAAA,CAAY,EAAE,KAAK,CAAA;AACnB,sBAAA,YAAA,GAAe,EAAE,KAAK,CAAA;AAAA,oBACxB,CAAA;AAAA,oBACA,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,UAAA;AAAA,sBACV,IAAA,EAAM,EAAE,CAAA,GAAI,CAAA;AAAA,sBACZ,GAAA,EAAK,EAAE,CAAA,GAAI,CAAA;AAAA,sBACX,KAAA,EAAO,CAAA;AAAA,sBACP,MAAA,EAAQ,CAAA;AAAA,sBACR,YAAA,EAAc,CAAA;AAAA,sBACd,eAAA,EAAiBK;AAAA;AACnB,mBAAA;AAAA,kBAhBK,CAAA,MAAA,EAAS,EAAE,KAAK,CAAA;AAAA,iBAiBvB;AAAA,cAEJ,CAAC;AAAA;AAAA,WACH;AAAA,UAEC,aAAA,oBACC,IAAA;AAAA,YAACX,IAAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAO,8BAAA;AAAA,cACP,2BAAA,EAA2B,IAAA;AAAA,cAC3B,SAAA,EAAU,0CAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBACV,MAAM,IAAA,CAAK,GAAA;AAAA,kBACT,CAAA;AAAA,kBACA,KAAK,GAAA,CAAI,KAAA,GAAQ,eAAe,aAAA,CAAc,CAAA,GAAI,gBAAgB,CAAC;AAAA,iBACrE;AAAA,gBACA,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAA,CAAc,IAAI,EAAE,CAAA;AAAA,gBACrC,QAAA,EAAU,aAAA;AAAA,gBACV,WAAA,EAAa,CAAA;AAAA,gBACb,YAAA,EAAc,CAAA;AAAA,gBACd,eAAA,EAAiB,CAAA;AAAA,gBACjB,iBAAA,EAAmB;AAAA,eACrB;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAACO,IAAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,oBAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY;AAAA,qBACd;AAAA,oBAEC,QAAA,EAAA,aAAA,CAAc,KAAA,CAAM,YAAA,IAAgB,aAAA,CAAc,KAAA,CAAM;AAAA;AAAA,iBAC3D;AAAA,gCACA,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,mBAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,SAAA,EAAW,CAAA;AAAA,sBACX,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY,mBAAA;AAAA,sBACZ,UAAA,EAAY;AAAA,qBACd;AAAA,oBAEC,aAAG,WAAA,CAAY,aAAA,CAAc,MAAM,IAAI,CAAC,IAAI,IAAI,CAAA;AAAA;AAAA,iBACnD;AAAA,gBACC,QAAA,IAAY,IAAA,IAAQ,QAAA,GAAW,CAAA,oBAC9B,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,SAAA,EAAW,CAAA;AAAA,sBACX,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY,mBAAA;AAAA,sBACZ,KAAA,EACE,aAAA,CAAc,KAAA,CAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,CAAE,KAAA,CAAM,IAAA,IAAQ,CAAA,GACnEW,eAAAA,GACAC;AAAA,qBACR;AAAA,oBAEC,QAAA,EAAA,CAAA,EACC,aAAA,CAAc,KAAA,CAAM,IAAA,GAAO,SAAS,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,CAAE,MAAM,IAAA,IAAQ,CAAA,GACnE,GAAA,GACA,GACN,GAAG,IAAA,CAAK,GAAA;AAAA,sBACN,aAAA,CAAc,MAAM,IAAA,GAAO,QAAA,CAAS,OAAO,QAAA,GAAW,CAAC,EAAE,KAAA,CAAM;AAAA,qBACjE,CAAE,OAAA,CAAQ,CAAC,CAAC,IAAI,IAAI,CAAA;AAAA;AAAA;AACtB;AAAA;AAAA;AAEJ,SAAA,EAEJ,CAAA;AAAA,QAGC,QAAA,CAAS,UAAA,CAAW,MAAA,GAAS,CAAA,oBAC5B,GAAA;AAAA,UAACnB,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAI,QAAA,EAAU,UAAA,EAAY,WAAW,CAAA,EAAE;AAAA,YAC/D,2BAAA,EAA2B,IAAA;AAAA,YAC3B,MAAA,EAAO,2BAAA;AAAA,YAEN,QAAA,EAAA,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAC,UAAU,CAAA,qBAClC,GAAA;AAAA,cAACO,IAAAA;AAAA,cAAA;AAAA,gBAEC,MAAA,EAAO,iCAAA;AAAA,gBACP,SAAA,EAAU,oBAAA;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,QAAA,EAAU,UAAA;AAAA,kBACV,IAAA,EAAM,SAAS,CAAA,GAAI,EAAA;AAAA,kBACnB,KAAA,EAAO,EAAA;AAAA,kBACP,SAAA,EAAW,QAAA;AAAA,kBACX,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAY;AAAA,iBACd;AAAA,gBAEC,QAAA,EAAA,QAAA,CAAS;AAAA,eAAA;AAAA,cAZL,QAAQ,CAAC,CAAA;AAAA,aAcjB;AAAA;AAAA,SACH;AAAA,wBAIF,GAAA,CAACP,MAAA,EAAK,SAAA,EAAU,YAAW,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAE,EAC/C,QAAA,kBAAA,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAO,iCAAA;AAAA,YACP,kBAAA,EAAoB,mBAAmB,SAAS,CAAA,CAAA;AAAA,YAChD,KAAA,EAAO;AAAA,cACL,eAAA,EAAiB,CAAA;AAAA,cACjB,iBAAA,EAAmB,CAAA;AAAA,cACnB,YAAA,EAAc,CAAA;AAAA,cACd,WAAA,EAAa,CAAA;AAAA,cACb,eAAA,EAAiB,KAAA,CAAM,QAAA,GAAW,eAAA,GAAkB,aAAA;AAAA,cACpD,WAAA,EAAa,KAAA,CAAM,QAAA,GAAW,mBAAA,GAAsB;AAAA,aACtD;AAAA,YAEA,QAAA,kBAAA,GAAA;AAAA,cAACO,IAAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAY,mBAAA;AAAA,kBACZ,UAAA,EAAY,KAAA;AAAA,kBACZ,KAAA,EAAO,KAAA,CAAM,QAAA,GAAWW,eAAAA,GAAiBC;AAAA,iBAC3C;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA,SACF,EACF,CAAA;AAAA,wBAGA,IAAA;AAAA,UAACnB,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,KAAK,EAAA,EAAG;AAAA,YAC/B,MAAA,EAAO,6BAAA;AAAA,YAEP,QAAA,EAAA;AAAA,8BAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,OAAO,EAAE,GAAA,EAAK,GAAE,EACtD,QAAA,EAAA;AAAA,gCAAA,GAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,GAAA,EAAK,YAAA,EAAc,GAAA,EAAK,eAAA,EAAiBW,cAAAA,EAAc,EAAG,CAAA;AAAA,gCAC5F,GAAA,CAACJ,IAAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,mBAAA,EAAoB,EAAG,QAAA,EAAA,QAAA,EAEhG;AAAA,eAAA,EACF,CAAA;AAAA,8BACA,IAAA,CAACP,MAAA,EAAK,SAAA,EAAU,yBAAwB,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE,EACtD,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,KAAA,EAAO,EAAA;AAAA,sBACP,MAAA,EAAQ,CAAA;AAAA,sBACR,cAAA,EAAgB,CAAA;AAAA,sBAChB,WAAA,EAAa,QAAA;AAAA,sBACb,cAAA,EAAgB;AAAA;AAClB;AAAA,iBACF;AAAA,gCACA,GAAA,CAACO,IAAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,mBAAA,EAAoB,EAAG,QAAA,EAAA,WAAA,EAEhG;AAAA,eAAA,EACF,CAAA;AAAA,8BACA,IAAA,CAACP,MAAA,EAAK,SAAA,EAAU,yBAAwB,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE,EACtD,QAAA,EAAA;AAAA,gCAAA,GAAA,CAACO,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,KAAA,EAAOa,eAAAA,EAAe,EAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,gCACvD,GAAA,CAACb,IAAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,mBAAA,EAAoB,EAAG,QAAA,EAAA,IAAA,EAEhG;AAAA,eAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AC/mBA,IAAMC,EAAAA,GAAI,kBAAkB,MAAM,CAAA;AAElC,IAAMU,eAAAA,GAAiBV,GAAE,gBAAgB,CAAA;AACzC,IAAMY,eAAAA,GAAiBZ,GAAE,gBAAgB,CAAA;AACzC,IAAM,WAAA,GAAcA,GAAE,aAAa,CAAA;AAGnC,IAAM,UAAA,GAAa,SAAA;AACnB,IAAM,SAAA,GAAY,sBAAA;AAClB,IAAM,SAAA,GAAY,uBAAA;AAClB,IAAM,eAAA,GAAkB,uBAAA;AAExB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,cAAA,GAAiB,EAAA;AACvB,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,QAAA,GAAW,CAAA;AAkDjB,IAAM,UAAA,GAA+C;AAAA,EACnD,MAAA,EAAQU,eAAAA;AAAA,EACR,KAAA,EAAOE,eAAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,cAAA,GAAmD;AAAA,EACvD,MAAA,EAAQ,cAAA;AAAA,EACR,KAAA,EAAO,aAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,KAAK,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAAA,EAC1E;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,GAAI,CAAA,GAAI,MAAA;AACpC;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,GAAG,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA;AACtE,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,IAAI,CAAA;AACvB,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,CAAA,CAAE,UAAS,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA,CAAA;AAC9E;AAEA,SAAS,QAAA,CACP,MAAA,EACA,GAAA,EACA,GAAA,EACc;AACd,EAAA,OAAO,MAAA,CACJ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,CAAA,EAAG,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA,EAAG,IAAA,EAAM,GAAA,CAAI,CAAA,CAAE,OAAO,CAAA,EAAE,CAAE,CAAA,CAC7E,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAC7B;AAEA,SAAS,UAAA,CAAW,MAAA,EAAsB,CAAA,EAAW,GAAA,EAA+B;AAClF,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACtB,IAAA,IAAI,CAAA,IAAK,CAAA,CAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,EAAG;AACxB,MAAA,MAAMZ,GAAAA,GAAI,CAAA,CAAE,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,CAAE,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,CAAA;AACjD,MAAA,OAAO,CAAA,CAAE,GAAG,CAAA,GAAIA,GAAAA,IAAK,EAAE,GAAG,CAAA,GAAI,EAAE,GAAG,CAAA,CAAA;AAAA,IACrC;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,EAAE,GAAG,CAAA;AACtC;AAEA,SAASa,aAAAA,CAAa,QAAsB,IAAA,EAAc;AACxD,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAC/B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA;AACtC,EAAA,MAAM,UAA6D,EAAC;AACpE,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,KAAK,IAAA,EAAM;AACtC,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,GAAS,GAAG,CAAA,EAAG,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,UAAA,CAAW,QAAsB,GAAA,EAAuB;AAC/D,EAAA,MAAM,WAAgF,EAAC;AACvF,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACtB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA;AACnB,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAG,CAAA,GAAI,EAAE,GAAG,CAAA;AACzB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,MAAM,CAAA,CAAE,CAAA;AAAA,MACR,GAAA,EAAK,EAAE,GAAG,CAAA;AAAA,MACV,QAAQ,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAAA,MACnC,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA,IAAK,MAAM,IAAA,CAAK,EAAA;AAAA,KACzC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,aAAA,CACP,IAAA,EACA,QAAA,EACA,UAAA,EACU;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAQ,CAAC,CAAA;AACtD,EAAA,QAAA,CAAS,QAAQ,CAAC,CAAA,KAAM,OAAO,IAAA,CAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAC3C,EAAA,UAAA,EAAY,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC1E,EAAA,UAAA,EAAY,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAQ,CAAC,CAAA;AACtE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,QAAA,EAAgC;AACrD,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,oBAAA;AAClC,EAAA,MAAM,SAAS,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,IAAI,CAAA,GAAI,SAAA,CAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;AACpF,EAAA,OAAO,cAAA,CAAe,OAAO,MAAM,CAAA;AACrC;AAoBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,CAAC,MAAM,CAAA,GAAInB,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,QAAA,GAAWU,OAAAA;AAAA,IACf,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAO,EAAG,MAAM,IAAIV,QAAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACzE,CAAC,SAAS,MAAM;AAAA,GAClB;AAEA,EAAAF,UAAU,MAAM;AACd,IAAA,MAAA,CAAO,SAAS,CAAC,CAAA;AACjB,IAAA,QAAA,CAAS,QAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AACrC,IAAA,MAAM,IAAA,GAAOE,QAAAA,CAAS,MAAA,CAAO,MAAA,EAAQ;AAAA,MACnC,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,GAAA;AAAA,MACV,MAAA,EAAQD,MAAAA,CAAO,GAAA,CAAIA,MAAAA,CAAO,IAAI,CAAA;AAAA,MAC9B,eAAA,EAAiB;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,OAAO,QAAA,CAAS,GAAA;AAAA,MAAI,CAAC,CAAA,KACzBC,QAAAA,CAAS,MAAA,CAAO,CAAA,EAAG;AAAA,QACjB,OAAA,EAAS,CAAA;AAAA,QACT,QAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAQD,MAAAA,CAAO,GAAA,CAAIA,MAAAA,CAAO,IAAI,CAAA;AAAA,QAC9B,eAAA,EAAiB;AAAA,OAClB;AAAA,KACH;AACA,IAAA,MAAM,SAAA,GAAYC,QAAAA,CAAS,QAAA,CAAS,CAAC,IAAA,EAAMA,SAAS,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAC,CAAC,CAAA;AACvE,IAAA,SAAA,CAAU,KAAA,EAAM;AAChB,IAAA,OAAO,MAAM,UAAU,IAAA,EAAK;AAAA,EAC9B,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAC,CAAA;AAEnD,EAAA,MAAM,SAAA,GAAY,QAAQ,YAAA,GAAe,aAAA;AACzC,EAAA,MAAM,UAAA,GAAa,SAAS,WAAA,GAAc,cAAA;AAE1C,EAAA,MAAM,KAAA,GAAQU,QAAQ,MAAM;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAC,MAAM,SAAA,CAAU,CAAA,CAAE,IAAI,CAAC,CAAA;AAC/C,IAAA,UAAA,EAAY,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAA,CAAM,KAAK,SAAA,CAAU,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AACrE,IAAA,UAAA,EAAY,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAA,CAAM,KAAK,SAAA,CAAU,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AACjE,IAAA,MAAM,OAAO,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,KAAK,CAAA,GAAI,CAAA;AACjD,IAAA,MAAM,OAAO,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,KAAK,CAAA,GAAI,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,IAAQ,CAAA;AAE9B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AACvD,IAAA,MAAM,OAAO,MAAA,CAAO,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,MAAM,CAAA,GAAI,CAAA;AACnD,IAAA,MAAM,OAAO,MAAA,CAAO,MAAA,GAAS,KAAK,GAAA,CAAI,GAAG,MAAM,CAAA,GAAI,CAAA;AACnD,IAAA,MAAM,GAAA,GAAA,CAAO,IAAA,GAAO,IAAA,IAAQ,GAAA,IAAO,CAAA;AACnC,IAAA,MAAM,YAAY,IAAA,GAAO,GAAA;AACzB,IAAA,MAAM,YAAY,IAAA,GAAO,GAAA;AACzB,IAAA,MAAM,MAAA,GAAS,YAAY,SAAA,IAAa,CAAA;AAExC,IAAA,MAAMO,IAAAA,GAAM,CAAC,IAAA,KACX,YAAA,GAAA,CAAiB,UAAU,IAAI,CAAA,GAAI,QAAQ,MAAA,GAAU,SAAA;AACvD,IAAA,MAAMC,OAAM,CAAC,KAAA,KACX,eAAe,CAAA,GAAA,CAAK,KAAA,GAAQ,aAAa,MAAA,IAAU,UAAA;AACrD,IAAA,OAAO,EAAE,GAAA,EAAAD,IAAAA,EAAK,GAAA,EAAAC,IAAAA,EAAI;AAAA,EACpB,GAAG,CAAC,IAAA,EAAM,UAAU,UAAA,EAAY,SAAA,EAAW,UAAU,CAAC,CAAA;AAEtD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,uBACE,GAAA;AAAA,MAACvB,IAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,QACvB,SAAA;AAAA,QACA,iBAAA,EAAkB,OAAA;AAAA,QAClB,kBAAA,EAAmB,uCAAA;AAAA,QACnB,MAAA,EAAO,2BAAA;AAAA,QACN,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AAEA,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,KAAA;AACrB,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAUqB,aAAAA,CAAa,UAAA,EAAY,WAAW,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,EAAY,OAAO,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,UAAA,EAAY,MAAM,CAAA;AAEhD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,cAAA,GAAiB,UAAA,GACnB,QAAA,CAAS,CAAC,aAAA,EAAe,GAAG,UAAA,CAAW,YAAY,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,GAC9D,EAAC;AACL,EAAA,MAAM,UAAA,GAAa,UAAA,GACf,QAAA,CAAS,CAAC,aAAA,EAAe,GAAG,UAAA,CAAW,QAAQ,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA,GAC1D,EAAC;AAEL,EAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,CAAY,EAAE,YAAY,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,WAAA,EAAa,CAAC,CAAA,EAAG,KAAK,GAAG,CAAA;AAEtF,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,EAAuC,KAAA,EAAe,QAC3E,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,qBACb,GAAA;AAAA,IAACrB,IAAAA;AAAA,IAAA;AAAA,MAEC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,MAAM,GAAA,CAAI,CAAA;AAAA,QACV,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,OAAO,WAAA,GAAc,GAAA;AAAA,QACrB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,eAAA,EAAiB;AAAA,OACnB;AAAA,MACA,2BAAA,EAA2B,IAAA;AAAA,MAC3B,yBAAA,EAA0B,qBAAA;AAAA,MAC1B,MAAA,EAAQ;AAAA,KAAA;AAAA,IAXH,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,GAanB,CAAA;AAEH,EAAA,MAAM,WAAA,GAAc,CAClB,QAAA,EACA,KAAA,EACA,MAAA,EACA,QAEA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,qBACjB,GAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MAEC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,OAAO,GAAA,CAAI,MAAA;AAAA,QACX,MAAA,EAAQ,SAAS,CAAA,GAAI,GAAA;AAAA,QACrB,cAAA,EAAgB,SAAS,CAAA,GAAI,CAAA;AAAA,QAC7B,cAAA,EAAgB,SAAS,KAAA,GAAQ,MAAA;AAAA,QACjC,WAAA,EAAa,SAAS,QAAA,GAAW,OAAA;AAAA,QACjC,eAAA,EAAiB,SAAS,MAAA,GAAY,KAAA;AAAA,QACtC,OAAA,EAAS,SAAS,GAAA,GAAM,CAAA;AAAA,QACxB,eAAA,EAAiB,KAAA;AAAA,QACjB,SAAA,EAAW,CAAC,EAAE,MAAA,EAAQ,GAAG,GAAA,CAAI,KAAK,OAAO;AAAA,OAC3C;AAAA,MACA,2BAAA,EAA2B,IAAA;AAAA,MAC3B,yBAAA,EAA0B,qBAAA;AAAA,MAC1B,MAAA,EAAQ;AAAA,KAAA;AAAA,IAjBH,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,GAmBnB,CAAA;AAEH,EAAA,uBACE,IAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,UAAA,EAAW;AAAA,MAC7C,SAAA;AAAA,MACA,MAAA,EAAO,0BAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAIJ,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAO;AAAA,YAC9D,iBAAA,EAAkB,OAAA;AAAA,YAClB,oBAAoB,CAAA,gDAAA,EAAmD,aAAA;AAAA,cACrE;AAAA,aACD,KAAK,QAAA,CAAS,MAAM,WAAW,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,OAAA,CAAA;AAAA,YAChE,MAAA,EAAO,qBAAA;AAAA,YAGT,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAACK,QAAAA,CAAS,IAAA;AAAA,gBAAT;AAAA,kBACC,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,QAAA,EAAS;AAAA,kBAC/F,2BAAA,EAA2B,IAAA;AAAA,kBAC3B,yBAAA,EAA0B,qBAAA;AAAA,kBAC1B,MAAA,EAAO,4BAAA;AAAA,kBAEP,QAAA,kBAAA,IAAA,CAACL,MAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAW,EAChD,QAAA,EAAA;AAAA,oBAAA,UAAA,oBACC,IAAA,CAACA,IAAAA,EAAA,EAAK,MAAA,EAAO,gCAAA,EACV,QAAA,EAAA;AAAA,sBAAA,aAAA,CAAcqB,aAAAA,CAAa,cAAA,EAAgB,WAAW,CAAA,EAAG,iBAAiB,qCAAqC,CAAA;AAAA,sBAC/G,cAAcA,aAAAA,CAAa,UAAA,EAAY,WAAW,CAAA,EAAG,iBAAiB,qCAAqC,CAAA;AAAA,sBAC3G,YAAY,UAAA,CAAW,cAAA,EAAgB,OAAO,CAAA,EAAGH,eAAAA,EAAgB,MAAM,yCAAyC,CAAA;AAAA,sBAChH,YAAY,UAAA,CAAW,cAAA,EAAgB,MAAM,CAAA,EAAGA,eAAAA,EAAgB,MAAM,yCAAyC,CAAA;AAAA,sBAC/G,YAAY,UAAA,CAAW,UAAA,EAAY,OAAO,CAAA,EAAG,WAAA,EAAa,MAAM,qCAAqC,CAAA;AAAA,sBACrG,YAAY,UAAA,CAAW,UAAA,EAAY,MAAM,CAAA,EAAG,WAAA,EAAa,MAAM,qCAAqC,CAAA;AAAA,sCACrG,GAAA;AAAA,wBAACX,IAAAA;AAAA,wBAAA;AAAA,0BACC,KAAA,EAAO;AAAA,4BACL,QAAA,EAAU,UAAA;AAAA,4BACV,MAAM,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,GAAG,CAAA,GAAI,CAAA;AAAA,4BACrD,KAAK,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,GAAG,KAAA,GAAQ,EAAA;AAAA,4BACxD,QAAA,EAAU,CAAA;AAAA,4BACV,UAAA,EAAY,mBAAA;AAAA,4BACZ,KAAA,EAAOW;AAAA,2BACT;AAAA,0BACA,MAAA,EAAO,+CAAA;AAAA,0BACR,QAAA,EAAA;AAAA;AAAA,uBAED;AAAA,sCACA,GAAA;AAAA,wBAACX,IAAAA;AAAA,wBAAA;AAAA,0BACC,KAAA,EAAO;AAAA,4BACL,QAAA,EAAU,UAAA;AAAA,4BACV,MAAM,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,GAAG,CAAA,GAAI,CAAA;AAAA,4BAC7C,KAAK,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,GAAG,IAAA,GAAO,CAAA;AAAA,4BAC/C,QAAA,EAAU,CAAA;AAAA,4BACV,UAAA,EAAY,mBAAA;AAAA,4BACZ,KAAA,EAAO;AAAA,2BACT;AAAA,0BACA,MAAA,EAAO,2CAAA;AAAA,0BACR,QAAA,EAAA;AAAA;AAAA;AAED,qBAAA,EACF,CAAA;AAAA,oCAGF,GAAA,CAACP,MAAA,EAAK,MAAA,EAAO,4BACV,QAAA,EAAA,aAAA,CAAc,OAAA,EAAS,SAAA,EAAW,+BAA+B,CAAA,EACpE,CAAA;AAAA,oBACC,WAAA,CAAY,OAAA,EAAS,SAAA,EAAW,KAAA,EAAO,8BAA8B,CAAA;AAAA,oBACrE,WAAA,CAAY,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,iCAAiC;AAAA,mBAAA,EAC9E;AAAA;AAAA,eACF;AAAA,8BAGA,GAAA;AAAA,gBAACO,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,oBAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,UAAA;AAAA,oBACV,IAAA,EAAM,eAAe,CAAA,GAAI,EAAA;AAAA,oBACzB,GAAA,EAAK,WAAA,GAAc,UAAA,GAAa,CAAA,GAAI,CAAA;AAAA,oBACpC,KAAA,EAAO,EAAA;AAAA,oBACP,SAAA,EAAW,QAAA;AAAA,oBACX,QAAA,EAAU,CAAA;AAAA,oBACV,UAAA,EAAY,mBAAA;AAAA,oBACZ,SAAA,EAAW,CAAC,EAAE,MAAA,EAAQ,UAAU;AAAA,mBAClC;AAAA,kBACA,2BAAA,EAA2B,IAAA;AAAA,kBAC3B,yBAAA,EAA0B,qBAAA;AAAA,kBAC1B,MAAA,EAAO,kCAAA;AAAA,kBACR,QAAA,EAAA;AAAA;AAAA,eAED;AAAA,cAGC,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM;AACtB,gBAAA,IAAI,IAAI,WAAA,KAAgB,CAAA,IAAK,MAAM,IAAA,CAAK,MAAA,GAAS,GAAG,OAAO,IAAA;AAC3D,gBAAA,uBACE,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBAEC,SAAA,EAAU,oBAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,UAAA;AAAA,sBACV,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,GAAI,EAAA;AAAA,sBACxB,GAAA,EAAK,SAAS,cAAA,GAAiB,CAAA;AAAA,sBAC/B,KAAA,EAAO,EAAA;AAAA,sBACP,SAAA,EAAW,QAAA;AAAA,sBACX,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY;AAAA,qBACd;AAAA,oBACA,2BAAA,EAA2B,IAAA;AAAA,oBAC3B,yBAAA,EAA0B,qBAAA;AAAA,oBAC1B,MAAA,EAAO,6BAAA;AAAA,oBAEN,QAAA,EAAA,UAAA,CAAW,MAAM,IAAI;AAAA,mBAAA;AAAA,kBAfjB,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA;AAAA,iBAgBtB;AAAA,cAEJ,CAAC;AAAA;AAAA;AAAA,SACD;AAAA,QAGC,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,KAAM;AAC5B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAC3B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAC3B,UAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AACvC,UAAA,MAAM,QAAA,GAAW;AAAA,YACf,KAAA,EAAO,QAAA;AAAA,YACP,MAAA,EAAQ,QAAA;AAAA,YACR,cAAc,QAAA,GAAW,CAAA;AAAA,YACzB,eAAA,EAAiB,KAAA;AAAA,YACjB,WAAA,EAAa,CAAA;AAAA,YACb,WAAA,EAAa;AAAA,WACf;AACA,UAAA,MAAM,KAAA,GAAQ,CAAA,WAAA,EAAc,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAC,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAI,CAAA,EAAA,EACxE,cAAA,CAAe,OAAA,CAAQ,MAAM,CAC/B,CAAA,CAAA;AACA,UAAA,uBACE,GAAA;AAAA,YAACF,QAAAA,CAAS,IAAA;AAAA,YAAT;AAAA,cAEC,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBACV,IAAA,EAAM,KAAK,QAAA,GAAW,CAAA;AAAA,gBACtB,GAAA,EAAK,KAAK,QAAA,GAAW,CAAA;AAAA,gBACrB,SAAA,EAAW,CAAC,EAAE,KAAA,EAAO,SAAS,CAAC,CAAA,IAAK,GAAG;AAAA,eACzC;AAAA,cACA,MAAA,EAAO,iCAAA;AAAA,cAEN,QAAA,EAAA,cAAA,mBACC,GAAA;AAAA,gBAACC,SAAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,cAAA,CAAe,OAAO,CAAA;AAAA,kBACrC,iBAAA,EAAkB,QAAA;AAAA,kBAClB,kBAAA,EAAoB,KAAA;AAAA,kBACpB,KAAA,EAAO,QAAA;AAAA,kBACP,MAAA,EAAO;AAAA;AAAA,eACT,mBAEA,GAAA;AAAA,gBAACN,IAAAA;AAAA,gBAAA;AAAA,kBACC,2BAAA,EAA2B,IAAA;AAAA,kBAC3B,yBAAA,EAA0B,qBAAA;AAAA,kBAC1B,KAAA,EAAO,QAAA;AAAA,kBACP,MAAA,EAAO;AAAA;AAAA;AACT,aAAA;AAAA,YAvBG,CAAA,IAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,WAyB/B;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,GACH;AAEJ;;;ACndA,IAAMW,cAAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAG/D,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,YAAA,GAAe,GAAA;AAMd,IAAM,oBAAA,GAAyE;AAAA,EACpF,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACrC,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACnC,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA;AAC5B;AAuGO,SAAS,oBAAoB,OAAA,EAAqD;AACvF,EAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,CAAM,QAAQ,IAAA,KAAS,QAAA,IAAY,QAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ,QAAA,CAAA,EAAW;AAC3E,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA;AAAA,IACxB;AACA,IAAA,IAAI,KAAA,CAAM,MAAM,OAAA,IAAW,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,MAAA,EAAQ,UAAU,OAAA,EAAQ;AACvD;AAGO,SAAS,mBAAA,CACd,KAAA,EACA,QAAA,EACA,QAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,KAAA;AAAA,IACZ,QAAA;AAAA,IACA,gBAAA,EAAkB,QAAA;AAAA,IAClB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,IAAA,EAAM,QAAA,GAAW,KAAA,CAAM,IAAA,GAAO;AAAA,GAChC;AACF;AAGO,SAAS,aAAa,IAAA,EAAoC;AAC/D,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ,IAAI,UAAU,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,sBAAsB,OAAO,CAAA;AAClD,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,YAAA,GAAe,KAAK,GAAA,CAAI,YAAA,EAAc,qBAAA,CAAsB,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,EAAE,cAAc,YAAA,EAAa;AACtC;AAOA,SAAS,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAA,EAAS,EAAgB;AACjD,EAAA,uBACE,GAAA;AAAA,IAACX,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,iBAAA,EAAmB,CAAA;AAAA,QACnB,iBAAA,EAAmB,aAAa,gBAAgB;AAAA,OAClD;AAAA,MACA,iBAAA,EAAmB,SAAA;AAAA,MACnB,MAAA,EAAO,2BAAA;AAAA,MAEN,+BAAqB,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,OAAM,KAAM;AAC5C,QAAA,MAAM,WAAW,GAAA,KAAQ,MAAA;AACzB,QAAA,uBACE,GAAA;AAAA,UAACM,SAAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AAAA,YAC3B,iBAAA,EAAkB,KAAA;AAAA,YAClB,kBAAA,EAAoB,EAAE,QAAA,EAAU,QAAA,EAAS;AAAA,YACzC,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,CAAA;AAAA,cACN,UAAA,EAAY,QAAA;AAAA,cACZ,eAAA,EAAiB,EAAA;AAAA,cACjB,iBAAA,EAAmB,CAAA;AAAA,cACnB,iBAAA,EAAmB,WAAWK,cAAAA,GAAgB;AAAA,aAChD;AAAA,YACA,MAAA,EAAQ,4BAA4B,GAAG,CAAA,CAAA;AAAA,YAEvC,QAAA,kBAAA,GAAA;AAAA,cAACJ,IAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,WAAW,mBAAA,GAAsB,oBAAA;AAAA,gBAC5C,KAAA,EAAO;AAAA,kBACL,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAY,mBAAA;AAAA,kBACZ,UAAA,EAAY,WAAW,KAAA,GAAQ;AAAA,iBACjC;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA;AACH,WAAA;AAAA,UAtBK;AAAA,SAuBP;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;AAEA,IAAM,UAAA,GAAuE;AAAA,EAC3E,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACrC,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,WAAA,EAAY;AAAA,EACtC,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,KAAA;AAC3B,CAAA;AAEA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,EAAK,EAAuD;AACtF,EAAA,2BACGP,IAAAA,EAAA,EAAK,WAAU,UAAA,EAAW,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE,EAAG,MAAA,EAAO,8BAClD,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,OAAM,KAAM;AAClC,IAAA,MAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,UAAA,GAAc,GAAA,IAAO,IAAA,GAAO,QAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA;AAClF,IAAA,uBACE,IAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,mCAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,CAAA;AAAA,UACN,OAAA,EAAS,EAAA;AAAA,UACT,YAAA,EAAc,EAAA;AAAA,UACd,WAAA,EAAa;AAAA,SACf;AAAA,QACA,MAAA,EAAQ,6BAA6B,GAAG,CAAA,CAAA;AAAA,QAExC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAACO,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,6BAAA;AAAA,gBACZ,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACA,GAAA;AAAA,YAACA,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,SAAA,EAAW,CAAA;AAAA,gBACX,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,mBAAA;AAAA,gBACZ,UAAA,EAAY,KAAA;AAAA,gBACZ,aAAA,EAAe,GAAA;AAAA,gBACf,aAAA,EAAe;AAAA,eACjB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA,OAAA;AAAA,MAhCK;AAAA,KAiCP;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACE,IAAA;AAAA,IAACP,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,mCAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,CAAA;AAAA,QACb,YAAA,EAAc,EAAA;AAAA,QACd,OAAA,EAAS,EAAA;AAAA,QACT,GAAA,EAAK;AAAA,OACP;AAAA,MACA,MAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,mBAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAe,GAAA;AAAA,cACf,aAAA,EAAe;AAAA,aACjB;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;AAUA,SAAS,UAAU,EAAE,OAAA,EAAS,YAAY,QAAA,EAAU,UAAA,EAAY,QAAO,EAAmB;AACxF,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACE,GAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oBAAA;AAAA,QACV,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,YAAY,mBAAA,EAAoB;AAAA,QACvD,MAAA,EAAQ,GAAG,MAAM,CAAA,MAAA,CAAA;AAAA,QAEhB,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACA,EAAA,uBACE,GAAA,CAACP,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE,EAAG,MAAA,EACtB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,qBACZ,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MAEE,GAAG,mBAAA,CAAoB,KAAA,EAAO,KAAA,CAAM,EAAA,KAAO,YAAY,MAAM,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC;AAAA,KAAA;AAAA,IAD3E,KAAA,CAAM;AAAA,GAGd,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,IAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACE,GAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,oCAAA,EAC9B,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,GAAA,CAAI,UAAU,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,GAAA,CAAI,UAAU,CAAA;AACjD,IAAA,uBACE,IAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,uBAAA;AAAA,QACV,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG;AAAA,QACjB,MAAA,EAAO,8BAAA;AAAA,QAEP,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAACO,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,qBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,EAAA;AAAA,gBACP,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,mBAAA;AAAA,gBACZ,UAAA,EAAY;AAAA,eACd;AAAA,cAEC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA,WACP;AAAA,0BACA,GAAA,CAACP,MAAA,EAAK,SAAA,EAAU,UAAS,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,cAAA,EAAgB,UAAS,EACpE,QAAA,kBAAA,GAAA,CAAC,iBAAc,UAAA,EAAY,GAAA,CAAI,YAAY,KAAA,EAAc,OAAA,EAAQ,QAAO,CAAA,EAC1E,CAAA;AAAA,0BACA,GAAA;AAAA,YAACO,IAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oBAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,UAAA,EAAY,mBAAA;AAAA,gBACZ,WAAA,EAAa,CAAC,cAAc;AAAA,eAC9B;AAAA,cAEC,aAAG,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,UAAO,IAAI,CAAA,CAAA;AAAA;AAAA;AAChC;AAAA,OAAA;AAAA,MA5BK,GAAA,CAAI;AAAA,KA6BX;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc,EAAE,OAAA,EAAQ,EAA4B;AAC3D,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,CAAA,EAAG,QAAQ,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA,EAAO;AAAA,IAC1E,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,YAAY,CAAA,CAAA,CAAA;AAAI,GAChE;AACA,EAAA,uBACE,GAAA,CAACP,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAW,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,IAAK,MAAA,EAAO,kCAAA,EAClD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,IAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAU,mCAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,YAAA,EAAc,EAAA;AAAA,QACd,WAAA,EAAa;AAAA,OACf;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,6BAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,SACR;AAAA,wBACA,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,SAAA,EAAW,CAAA;AAAA,cACX,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,mBAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAe,GAAA;AAAA,cACf,aAAA,EAAe;AAAA,aACjB;AAAA,YAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR;AAAA,KAAA;AAAA,IA/BK,IAAA,CAAK;AAAA,GAiCb,CAAA,EACH,CAAA;AAEJ;AAsBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIL,SAA4B,UAAU,CAAA;AAC5D,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAChF,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE9E,EAAA,MAAM,KAAA,GAAQa,QAAQ,MAAM,mBAAA,CAAoB,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACnE,EAAA,MAAM,UAAA,GAAaA,OAAAA,CAAQ,MAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG,CAAC,GAAA,CAAI,IAAI,CAAC,CAAA;AAEnE,EAAA,MAAM,MAAA,GACJ,CAAC,KAAA,KAAwE,CAAC,EAAA,KACxE,KAAA,CAAM,CAAC,OAAA,KAAa,OAAA,KAAY,EAAA,GAAK,IAAA,GAAO,EAAG,CAAA;AAEnD,EAAA,uBACE,GAAA;AAAA,IAACf,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA;AAAA,MAC7C,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAI;AAAA,MACpB,iBAAA,EAAmB,MAAA;AAAA,MACnB,cAAY,QAAA,CAAS,IAAA;AAAA,MACrB,MAAA,EAAO,sBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,EAAA,EAAI,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,8BAAA,EAC5C,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,sCAAA;AAAA,YACV,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,YAChB,MAAA,EAAO,6BAAA;AAAA,YAEP,QAAA,EAAA;AAAA,8BAAA,IAAA,CAACA,MAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,GAAE,EAC3B,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAACO,IAAAA;AAAA,kBAAA;AAAA,oBACC,iBAAA,EAAkB,QAAA;AAAA,oBAClB,SAAA,EAAU,mBAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY,6BAAA;AAAA,sBACZ,UAAA,EAAY;AAAA,qBACd;AAAA,oBACA,MAAA,EAAO,4BAAA;AAAA,oBAEN,QAAA,EAAA,QAAA,CAAS;AAAA;AAAA,iBACZ;AAAA,gCACA,GAAA;AAAA,kBAACA,IAAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,qBAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,SAAA,EAAW,CAAA;AAAA,sBACX,QAAA,EAAU,EAAA;AAAA,sBACV,UAAA,EAAY;AAAA,qBACd;AAAA,oBACA,MAAA,EAAO,+BAAA;AAAA,oBAEN,QAAA,EAAA,QAAA,CAAS;AAAA;AAAA;AACZ,eAAA,EACF,CAAA;AAAA,cACC,QAAA,CAAS,eAAe,IAAA,oBACvB,IAAA;AAAA,gBAACP,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,eAAA,EAAiB,CAAA;AAAA,oBACjB,iBAAA,EAAmB,EAAA;AAAA,oBACnB,YAAA,EAAc,CAAA;AAAA,oBACd,eAAA,EAAiB,sBAAA;AAAA,oBACjB,WAAA,EAAa,CAAA;AAAA,oBACb,WAAA,EAAa;AAAA,mBACf;AAAA,kBACA,MAAA,EAAO,2BAAA;AAAA,kBAEP,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAACO,IAAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,oBAAA;AAAA,wBACV,KAAA,EAAO;AAAA,0BACL,QAAA,EAAU,CAAA;AAAA,0BACV,UAAA,EAAY,mBAAA;AAAA,0BACZ,UAAA,EAAY,KAAA;AAAA,0BACZ,aAAA,EAAe,GAAA;AAAA,0BACf,aAAA,EAAe;AAAA,yBACjB;AAAA,wBACD,QAAA,EAAA;AAAA;AAAA,qBAED;AAAA,oCACA,GAAA;AAAA,sBAACA,IAAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,QAAA,EAAU,EAAA;AAAA,0BACV,UAAA,EAAY,6BAAA;AAAA,0BACZ,UAAA,EAAY,KAAA;AAAA,0BACZ,KAAA,EAAOI;AAAA,yBACT;AAAA,wBAEC,QAAA,EAAA,CAAA,EAAG,QAAA,CAAS,WAAW,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA;AAAA;AAAA;AAC3C;AAAA;AAAA;AACF;AAAA;AAAA,SAEJ;AAAA,wBAEA,GAAA,CAAC,MAAA,EAAA,EAAO,MAAA,EAAQ,GAAA,EAAK,UAAU,MAAA,EAAQ,CAAA;AAAA,QAEtC,GAAA,KAAQ,UAAA,oBACP,IAAA,CAACX,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,qCAAA,EAC/B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAA,EAAA,EAAgB,GAAG,IAAA,EAAM,CAAA;AAAA,0BAC1B,GAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,IAAA,EAAM,SAAS,IAAA,EAAM,CAAA;AAAA,0BAC9C,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,gBAAA,EAAiB,QAAO,4BAAA,EACzC,QAAA,kBAAA,GAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,YAAY,KAAA,CAAM,UAAA;AAAA,cAClB,gBAAgB,KAAA,CAAM,cAAA;AAAA,cACtB,KAAA,EAAO,WAAA;AAAA,cACP,MAAA,EAAQ,YAAA;AAAA,cACR,MAAM,QAAA,CAAS,IAAA;AAAA,cACf,cAAA,EAAgB;AAAA;AAAA,WAClB,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,cAAA,EAAe,QAAO,kCAAA,EACvC,QAAA,kBAAA,GAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,WAAA;AAAA,cACT,UAAA,EAAY,kBAAA;AAAA,cACZ,QAAA,EAAU,OAAO,qBAAqB,CAAA;AAAA,cACtC,UAAA,EAAW,2BAAA;AAAA,cACX,MAAA,EAAO;AAAA;AAAA,WACT,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QAGD,QAAQ,SAAA,oBACP,GAAA,CAACA,IAAAA,EAAA,EAAK,OAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,QAAO,oCAAA,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAY,KAAA,EAAM,cAAA,EAAe,QAAO,8BAAA,EACvC,QAAA,kBAAA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,OAAA;AAAA,YACT,UAAA,EAAY,iBAAA;AAAA,YACZ,QAAA,EAAU,OAAO,oBAAoB,CAAA;AAAA,YACrC,UAAA,EAAW,wBAAA;AAAA,YACX,MAAA,EAAO;AAAA;AAAA,WAEX,CAAA,EACF,CAAA;AAAA,QAGD,GAAA,KAAQ,UAAA,oBACP,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,qCAAA,EAC/B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,eAAA,EAAgB,MAAA,EAAO,+BAAA,EACxC,QAAA,kBAAA,GAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,MAAM,GAAA,CAAI,IAAA;AAAA,cACV,UAAU,GAAA,CAAI,QAAA;AAAA,cACd,YAAY,GAAA,CAAI,UAAA;AAAA,cAChB,KAAA,EAAO,WAAA;AAAA,cACP,MAAA,EAAQ;AAAA;AAAA,WACV,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,0BACpC,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,oBAAA,EAAqB,QAAO,+BAAA,EAC7C,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,EAClD;AAAA,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;ACvnBA,IAAMW,cAAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAuB/D,IAAM,eAAA,GAA8C;AAAA,EAClD,SAAA,EAAW,sBAAA;AAAA,EACX,OAAA,EAAS,qBAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,aAAA,CAAc,aAAiC,SAAA,EAA2B;AACjF,EAAA,IAAI,WAAA,IAAe,IAAA,IAAQ,SAAA,IAAa,CAAA,EAAG,OAAO,CAAA;AAClD,EAAA,MAAM,QAAQ,WAAA,GAAc,SAAA;AAC5B,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACvC;AAQA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,QAAA,EAAU,SAAQ,EAAiB;AAC9D,EAAA,MAAM,CAAC,UAAU,CAAA,GAAIT,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAEzD,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAAA,QAAAA,CAAS,OAAO,UAAA,EAAY;AAAA,MAC1B,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU,GAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KAClB,EAAE,KAAA,EAAM;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAAA,QAAAA,CAAS,OAAO,UAAA,EAAY;AAAA,MAC1B,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,GAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KAClB,EAAE,KAAA,EAAM;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,KAAW,SAAA,GAC7B,cAAc,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,SAAS,CAAA,GAC9C,CAAA;AAIJ,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,SAAS,CAAA;AAE9C,EAAA,uBACE,GAAA;AAAA,IAACC,SAAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,IAAA,EAAM,WAAA,EAAY;AAAA,MAC3B,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AAAA,MAC9B,SAAA,EAAW,aAAA;AAAA,MACX,UAAA,EAAY,cAAA;AAAA,MACZ,iBAAA,EAAkB,QAAA;AAAA,MAClB,oBAAoB,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,KAAK,MAAM,CAAA,CAAA;AAAA,MAChD,MAAA,EAAQ,CAAA,aAAA,EAAgB,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,MAE/B,QAAA,kBAAA,GAAA;AAAA,QAACD,QAAAA,CAAS,IAAA;AAAA,QAAT;AAAA,UACC,KAAA,EAAO;AAAA,YACL;AAAA,cACE,MAAA,EAAQ,CAAA;AAAA,cACR,YAAA,EAAc,CAAA;AAAA,cACd,QAAA,EAAU,QAAA;AAAA,cACV,eAAA,EAAiB,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAAA,cAC5C,SAAA,EAAW,CAAC,EAAE,KAAA,EAAO,YAAY;AAAA,aACnC;AAAA,YACA,QAAA,GACI;AAAA,cACE,WAAA,EAAa,CAAA;AAAA,cACb,WAAA,EAAaM,cAAAA;AAAA,cACb,SAAA,EAAW,CAAC,EAAE,KAAA,EAAO,MAAK,EAAG,EAAE,KAAA,EAAO,UAAA,EAAY;AAAA,aACpD,GACA;AAAA,WACN;AAAA,UACA,MAAA,EAAQ,CAAA,mBAAA,EAAsB,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,UAEpC,QAAA,EAAA,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,QAAA,GAAW,CAAA,oBACvC,GAAA;AAAA,YAACX,IAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,UAAA;AAAA,gBACV,IAAA,EAAM,CAAA;AAAA,gBACN,GAAA,EAAK,CAAA;AAAA,gBACL,MAAA,EAAQ,CAAA;AAAA,gBACR,KAAA,EAAO,CAAA,EAAG,QAAA,GAAW,GAAG,CAAA,CAAA,CAAA;AAAA,gBACxB,eAAA,EAAiBW;AAAA,eACnB;AAAA,cACA,MAAA,EAAQ,CAAA,kBAAA,EAAqB,IAAA,CAAK,EAAE,CAAA;AAAA;AAAA;AACtC;AAAA;AAEJ;AAAA,GACF;AAEJ;AAkBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,uBACE,GAAA;AAAA,IAACX,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,GAAA,EAAK,CAAA;AAAA,QACL,iBAAA,EAAmB,EAAA;AAAA,QACnB,UAAA,EAAY;AAAA,OACd;AAAA,MACA,MAAA,EAAO,mBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,QAAA,EAAU,KAAK,EAAA,KAAO,YAAA;AAAA,UACtB,OAAA,EAAS;AAAA,SAAA;AAAA,QAHJ,IAAA,CAAK;AAAA,OAKb;AAAA;AAAA,GACH;AAEJ;ACnIA,IAAM,UAAA,GAA4C;AAAA,EAChD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,WAAA,GAA8C;AAAA,EAClD,OAAA,EAAS,kBAAA;AAAA,EACT,OAAA,EAAS,kBAAA;AAAA,EACT,OAAA,EAAS,mBAAA;AAAA,EACT,IAAA,EAAM,gBAAA;AAAA,EACN,KAAA,EAAO,iBAAA;AAAA,EACP,OAAA,EAAS,mBAAA;AAAA,EACT,IAAA,EAAM,gBAAA;AAAA,EACN,aAAA,EAAe;AACjB,CAAA;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA,GAAO,IAAA;AAAA,EACP,KAAA,GAAQ,SAAA;AAAA,EACR,WAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,KAAA;AAAA,EACR,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAM,SAAA,GAAoC,KAAA,KAAU,IAAA,GAAO,SAAA,GAAY,KAAA,IAAS,KAAA;AAChF,EAAA,MAAM,UAAA,GAAa,CAAC,WAAA,GAAc,WAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AACvD,EAAA,MAAM,UAAA,GAAa,WAAA,GAAc,EAAE,eAAA,EAAiB,aAAY,GAAI,MAAA;AAGpE,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA,uBACE,IAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,UAAA,CAAW,IAAI,CAAA,EAAG,SAAS,CAAA,EAAG,KAAA,EAAe,GAAG,KAAA,EAC9E,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAACA,IAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,UAAU,CAAA;AAAA,UACtE,KAAA,EAAO;AAAA;AAAA,OACT;AAAA,sBACA,GAAA;AAAA,QAACA,IAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT,uBAAA;AAAA,YACA,WAAW,IAAI,CAAA;AAAA,YACf,UAAA;AAAA,YACA,IAAA,IAAQ;AAAA,WACV;AAAA,UACA,KAAA,EAAO;AAAA;AAAA;AACT,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,EAAC;AAAA,IACzC,GAAI,cAAc,EAAC;AAAA,IACnB,GAAI,QAAQ,WAAA,GAAc,EAAE,WAAW,CAAA,QAAA,EAAW,WAAW,CAAA,CAAA,EAAG,GAAI;AAAC,GACvE;AAEA,EAAA,uBACE,GAAA;AAAA,IAACA,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,uBAAA;AAAA,QACA,WAAW,IAAI,CAAA;AAAA,QACf,UAAA;AAAA,QACA,cAAc,SAAA,IAAa,eAAA;AAAA,QAC3B,IAAA,IAAQ,iCAAA;AAAA,QACR,QACE,CAAC,WAAA,KACA,KAAA,KAAU,SAAA,IAAa,UAAU,MAAA,CAAA,IAClC,uCAAA;AAAA,QACF,IAAA,IAAQ,CAAC,WAAA,IAAe,KAAA,KAAU,OAAA,IAAW,sCAAA;AAAA,QAC7C,IAAA,IAAQ,CAAC,WAAA,IAAe,KAAA,KAAU,SAAA,IAAa,uCAAA;AAAA,QAC/C,IAAA,IAAQ,CAAC,WAAA,IAAe,KAAA,KAAU,SAAA,IAAa,sCAAA;AAAA,QAC/C,IAAA,IAAQ,CAAC,WAAA,IAAe,KAAA,KAAU,aAAA,IAAiB,sCAAA;AAAA,QACnD;AAAA,OACF;AAAA,MACA,OAAO,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,MAAA,GAAS,IAAI,YAAA,GAAe,KAAA;AAAA,MAC5D,GAAG;AAAA;AAAA,GACN;AAEJ;;;AC3FA,IAAM,kBAAA,GAAuE;AAAA,EAC3E,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,oCAAA;AAAA,IACT,OAAA,EAAS,oCAAA;AAAA,IACT,SAAA,EAAW,sCAAA;AAAA,IACX,OAAA,EAAS,qCAAA;AAAA,IACT,KAAA,EAAO,mCAAA;AAAA,IACP,OAAA,EAAS,qCAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,uCAAA;AAAA,IACT,OAAA,EAAS,4CAAA;AAAA,IACT,SAAA,EAAW,gDAAA;AAAA,IACX,OAAA,EAAS,8CAAA;AAAA,IACT,KAAA,EAAO,0CAAA;AAAA,IACP,OAAA,EAAS,8CAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,iDAAA;AAAA,IACT,OAAA,EAAS,gDAAA;AAAA,IACT,SAAA,EAAW,oDAAA;AAAA,IACX,OAAA,EAAS,kDAAA;AAAA,IACT,KAAA,EAAO,8CAAA;AAAA,IACP,OAAA,EAAS,kDAAA;AAAA,IACT,IAAA,EAAM;AAAA;AAEV,CAAA;AAEA,IAAMwB,WAAAA,GAAwC;AAAA,EAC5C,EAAA,EAAI,uBAAA;AAAA,EACJ,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AASO,SAAS,KAAA,CAAM;AAAA,EACpB,OAAA,GAAU,QAAA;AAAA,EACV,KAAA,GAAQ,SAAA;AAAA,EACR,IAAA,GAAO,IAAA;AAAA,EACP,GAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAe;AACb,EAAA,uBACE,IAAA;AAAA,IAACxB,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kEAAA;AAAA,QACA,kBAAA,CAAmB,OAAO,CAAA,CAAE,KAAK,CAAA;AAAA,QACjCwB,YAAW,IAAI,CAAA;AAAA,QACf;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,GAAA,oBACC,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAO,QAAA,KAAa,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,cAAc,SAAA,GAAY,KAAA,CAAA;AAAA,YAC/E,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QAED,OAAO,aAAa,QAAA,mBACnB,GAAA,CAACjB,MAAA,EAAK,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAS,CAAA,GAErD;AAAA;AAAA;AAAA,GAEJ;AAEJ;AChGA,IAAMC,EAAAA,GAAI,kBAAkB,MAAM,CAAA;AAkBlC,IAAM,cAAA,GAAoD;AAAA,EACxD,SAAA,EAAW,uBAAA;AAAA,EACX,OAAA,EAAS,sBAAA;AAAA,EACT,IAAA,EAAM,aAAA;AAAA,EACN,QAAA,EAAUA,GAAE,gBAAgB,CAAA;AAAA,EAC5B,MAAA,EAAQ,qBAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,kBAAA,GAAyE;AAAA,EAC7E,SAAA,EAAW,EAAE,WAAA,EAAa,CAAA,EAAG,aAAa,sBAAA,EAAuB;AAAA,EACjE,OAAA,EAAS,EAAE,WAAA,EAAa,CAAA,EAAG,aAAa,qBAAA,EAAsB;AAAA,EAC9D,IAAA,EAAM,EAAE,WAAA,EAAa,CAAA,EAAG,aAAa,qBAAA,EAAsB;AAAA,EAC3D,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,EAAG,aAAa,SAAA,EAAU;AAAA,EACnD,MAAA,EAAQ,EAAE,WAAA,EAAa,CAAA,EAAG,aAAa,sBAAA,EAAuB;AAAA,EAC9D,MAAA,EAAQ,EAAE,WAAA,EAAa,CAAA,EAAG,aAAa,sBAAA;AACzC,CAAA;AAEA,IAAM,UAAA,GAAgD;AAAA,EACpD,SAAA,EAAWA,GAAE,gBAAgB,CAAA;AAAA,EAC7B,OAAA,EAASA,GAAE,eAAe,CAAA;AAAA,EAC1B,IAAA,EAAMA,GAAE,eAAe,CAAA;AAAA,EACvB,QAAA,EAAU,SAAA;AAAA,EACV,MAAA,EAAQ,qBAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEA,SAASiB,UAAS,OAAA,EAAkB;AAClC,EAAA,MAAM,CAAC,OAAO,CAAA,GAAIvB,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAEtD,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAYE,QAAAA,CAAS,IAAA;AAAA,MACzBA,SAAS,QAAA,CAAS;AAAA,QAChBA,QAAAA,CAAS,OAAO,OAAA,EAAS;AAAA,UACvB,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU,GAAA;AAAA,UACV,MAAA,EAAQD,MAAAA,CAAO,KAAA,CAAMA,MAAAA,CAAO,IAAI,CAAA;AAAA,UAChC,eAAA,EAAiB;AAAA,SAClB,CAAA;AAAA,QACDC,QAAAA,CAAS,OAAO,OAAA,EAAS;AAAA,UACvB,OAAA,EAAS,CAAA;AAAA,UACT,QAAA,EAAU,GAAA;AAAA,UACV,MAAA,EAAQD,MAAAA,CAAO,KAAA,CAAMA,MAAAA,CAAO,IAAI,CAAA;AAAA,UAChC,eAAA,EAAiB;AAAA,SAClB;AAAA,OACF;AAAA,KACH;AACA,IAAA,SAAA,CAAU,KAAA,EAAM;AAEhB,IAAA,OAAO,MAAM,UAAU,IAAA,EAAK;AAAA,EAC9B,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAErB,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM,WAAA,GAAc,SAAS,MAAA,KAAW,SAAA;AACxC,EAAA,MAAM,YAAA,GAAeqB,UAAS,WAAW,CAAA;AACzC,EAAA,MAAM,cAAc,MAAA,KAAW,WAAA;AAC/B,EAAA,MAAM,WAAW,MAAA,KAAW,QAAA;AAE5B,EAAA,MAAM,IAAA,mBACJ,GAAA;AAAA,IAACpB,QAAAA,CAAS,IAAA;AAAA,IAAT;AAAA,MACC,KAAA,EAAO,WAAA,GAAc,EAAE,OAAA,EAAS,cAAa,GAAI,MAAA;AAAA,MACjD,MAAA,EAAO,cAAA;AAAA,MAEP,QAAA,kBAAA,IAAA;AAAA,QAACL,IAAAA;AAAA,QAAA;AAAA,UACC,SAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL;AAAA,cACE,aAAA,EAAe,KAAA;AAAA,cACf,UAAA,EAAY,QAAA;AAAA,cACZ,iBAAA,EAAmB,EAAA;AAAA,cACnB,eAAA,EAAiB,CAAA;AAAA,cACjB,YAAA,EAAc,CAAA;AAAA,cACd,eAAA,EAAiB,eAAe,MAAM;AAAA,aACxC;AAAA,YACA,mBAAmB,MAAM,CAAA;AAAA,YACzB,WAAA,GAAc,EAAE,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,EAAE,GAAI;AAAA,WACnE;AAAA,UACA,oBAAoB,OAAA,GAAU,MAAA,GAAY,CAAA,EAAG,IAAI,aAAa,MAAM,CAAA,CAAA;AAAA,UACnE,GAAG,KAAA;AAAA,UAEH,QAAA,EAAA;AAAA,YAAA,WAAA,oBACC,GAAA;AAAA,cAACO,IAAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,UAAA,EAAY,KAAA;AAAA,kBACZ,UAAA,EAAY,2BAAA;AAAA,kBACZ,QAAA,EAAU,EAAA;AAAA,kBACV,KAAA,EAAO,WAAW,MAAM,CAAA;AAAA,kBACxB,WAAA,EAAa;AAAA,iBACf;AAAA,gBACA,2BAAA,EAA2B,IAAA;AAAA,gBAC3B,MAAA,EAAO,oBAAA;AAAA,gBAEN,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,YAED,QAAA,oBACC,GAAA;AAAA,cAACA,IAAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,UAAA,EAAY,KAAA;AAAA,kBACZ,UAAA,EAAY,2BAAA;AAAA,kBACZ,QAAA,EAAU,EAAA;AAAA,kBACV,KAAA,EAAO,WAAW,MAAM,CAAA;AAAA,kBACxB,WAAA,EAAa;AAAA,iBACf;AAAA,gBACA,2BAAA,EAA2B,IAAA;AAAA,gBAC3B,MAAA,EAAO,mBAAA;AAAA,gBAEN,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,4BAEF,GAAA;AAAA,cAACA,IAAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,UAAA,EAAY,KAAA;AAAA,kBACZ,UAAA,EAAY,2BAAA;AAAA,kBACZ,QAAA,EAAU,EAAA;AAAA,kBACV,KAAA,EAAO,WAAW,MAAM;AAAA,iBAC1B;AAAA,gBACA,6BAA6B,OAAA,IAAW,IAAA;AAAA,gBACxC,MAAA,EAAO,mBAAA;AAAA,gBAEN,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA;AACF;AAAA,GACF;AAGF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA;AAAA,MAACD,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAoB,CAAA,EAAG,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA;AAAA,QAC9C,MAAA,EAAO,wBAAA;AAAA,QAEN,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,OAAO,IAAA;AACT;ACvKA,IAAME,EAAAA,GAAI,kBAAkB,MAAM,CAAA;AAoBlC,IAAM,QAAA,GAAW,SAAA;AACjB,IAAM,WAAA,GAAc,SAAA;AACpB,IAAM,iBAAA,GAAoB,yBAAA;AAC1B,IAAM,cAAA,GAAiB,6EAAA;AAGvB,IAAM,IAAA,GAAO;AAAA,EACX,QAAA,EAAUA,GAAE,gBAAgB,CAAA;AAAA;AAAA,EAC5B,WAAA,EAAaA,GAAE,gBAAgB,CAAA;AAAA;AAAA,EAC/B,MAAA,EAAQA,GAAE,eAAe,CAAA;AAAA;AAAA,EACzB,KAAA,EAAOA,GAAE,cAAc,CAAA;AAAA;AAAA,EACvB,KAAA,EAAO,eAAe,SAAA,CAAU,KAAA;AAAA;AAAA,EAChC,KAAA,EAAO,eAAe,SAAA,CAAU;AAAA;AAClC,CAAA;AASA,IAAM,aAAmD,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAG9E,SAAS,WAAW,GAAA,EAAmB;AACrC,EAAA,IAAI,GAAA,IAAO,KAAK,OAAO,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,EAAE;AACpD,EAAA,IAAI,GAAA,IAAO,KAAK,OAAO,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,EAAE;AACpD,EAAA,IAAI,GAAA,GAAM,KAAK,OAAO,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,EAAE;AACnD,EAAA,IAAI,GAAA,KAAQ,KAAK,OAAO,EAAE,OAAO,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA,EAAE;AACtD,EAAA,IAAI,GAAA,IAAO,IAAI,OAAO,EAAE,OAAO,IAAA,CAAK,WAAA,EAAa,MAAM,CAAA,EAAE;AACzD,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA,EAAE;AACzC;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,CAAA;AACtB,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,CAAA;AACtB,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,UAAA,CAAW,KAAa,SAAA,EAA6B;AAC5D,EAAA,IAAI,SAAA,IAAa,MAAM,OAAO,KAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,IAAI,GAAA,GAAM,IAAA,CAAK,MAAM,SAAA,GAAY,GAAG,CAAC,CAAA,IAAK,CAAA;AACxD;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,IAAA,GAAO,EAAA;AAAA,EACP,SAAA,GAAY,CAAA;AAAA,EACZ,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,aAAa,WAAA,KAAgB,UAAA;AACnC,EAAA,MAAM,SAAA,GAAY,UAAU,KAAK,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,KAAK,IAAI,GAAG,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,WAAW,GAAG,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,EAAK,SAAS,CAAA;AAE1C,EAAA,MAAM,CAAC,QAAQ,CAAA,GAAIN,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,SAAS,CAAC,CAAA;AAE/D,EAAAF,UAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAYE,QAAAA,CAAS,MAAA,CAAO,QAAA,EAAU;AAAA,MAC1C,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU,GAAA;AAAA,MACV,eAAA,EAAiB;AAAA,KAClB,CAAA;AACD,IAAA,SAAA,CAAU,KAAA,EAAM;AAChB,IAAA,OAAO,MAAM,UAAU,IAAA,EAAK;AAAA,EAC9B,CAAA,EAAG,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAExB,EAAA,MAAM,eAAA,GAAkB,SAAS,WAAA,CAAY;AAAA,IAC3C,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACjB,WAAA,EAAa,CAAC,IAAA,EAAM,MAAM;AAAA,GAC3B,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,UAAA,GACf,EAAE,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAK,GACjC,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAU;AAErC,EAAA,MAAM,SAAA,GAAY,UAAA,GACd,EAAE,QAAA,EAAU,UAAA,EAAqB,QAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,iBAAgB,GACvF,EAAE,QAAA,EAAU,UAAA,EAAqB,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,eAAA,EAAgB;AAExF,EAAA,MAAM,YAAY,IAAA,CAAK,IAAA,KAAS,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,IAAI,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAwB;AAAA,IAC5B,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,cAAc,SAAA,GAAY,CAAA;AAAA,IAC1B,iBAAiB,IAAA,CAAK,KAAA;AAAA,IACtB,MAAA,EAAQ,CAAA;AAAA,IACR,GAAI,UAAA,GACA,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,CAAC,EAAE,UAAA,EAAY,CAAC,YAAY,CAAA,EAAG,CAAA,EAAE,GACnE,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,CAAC,EAAE,UAAA,EAAY,CAAC,SAAA,GAAY,CAAA,EAAG,CAAA;AAAE,GAC1E;AAEA,EAAA,MAAM,YAA4B,CAAA,EAAG,SAAA,CAAU,SAAA,IAAa,CAAC,IAAI,GAAG,CAAA,CAAA,CAAA;AACpE,EAAA,MAAM,kBAA6B,UAAA,GAC/B;AAAA,IACE,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,eAAA,EAAiB,iBAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,GACV,GACA;AAAA,IACE,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,SAAA;AAAA,IACN,GAAA,EAAK,EAAA;AAAA,IACL,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO,GAAA;AAAA,IACP,eAAA,EAAiB,iBAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,GACV;AAEJ,EAAA,uBACE,IAAA;AAAA,IAACL,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,EAAE,UAAA,EAAY,QAAA,EAAS;AAAA,MAC9B,iBAAA,EAAkB,aAAA;AAAA,MAClB,oBAAoB,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAI;AAAA,MACjD,kBAAA,EAAoB,oBAAoB,GAAG,CAAA,CAAA,CAAA;AAAA,MAC3C,MAAA,EAAO,eAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,GAAG,UAAA;AAAA,cACH,YAAA,EAAc,CAAA;AAAA,cACd,eAAA,EAAiB,QAAA;AAAA,cACjB,QAAA,EAAU,UAAA;AAAA,cACV,QAAA,EAAU;AAAA,aACZ;AAAA,YACA,2BAAA,EAA2B,IAAA;AAAA,YAE3B,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAACK,QAAAA,CAAS,IAAA;AAAA,gBAAT;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,GAAG,SAAA;AAAA,oBACH,YAAA,EAAc,CAAA;AAAA,oBACd,iBAAiB,IAAA,CAAK,KAAA;AAAA,oBACtB,MAAA,EAAQ,CAAA;AAAA,oBACR,GAAI,QAAA,GAAW,EAAE,SAAA,EAAW,gBAAe,GAAI;AAAA,mBACjD;AAAA,kBACA,MAAA,EAAO;AAAA;AAAA,eACT;AAAA,cAEC,IAAA,CAAK,SAAS,CAAA,oBAAK,GAAA,CAACL,MAAA,EAAK,KAAA,EAAO,UAAA,EAAY,MAAA,EAAO,iBAAA,EAAkB,CAAA;AAAA,cAErE,SAAA,IAAa,wBAAQ,GAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,eAAA,EAAiB,QAAO,kBAAA,EAAmB;AAAA;AAAA;AAAA,SAChF;AAAA,wBAEA,IAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,CAAA;AAAA,cACV,KAAA,EAAO,WAAA;AAAA,cACP,UAAA,EAAY,2BAAA;AAAA,cACZ,SAAA,EAAW;AAAA,aACb;AAAA,YACA,2BAAA,EAA2B,IAAA;AAAA,YAC3B,MAAA,EAAO,iBAAA;AAAA,YAEN,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAI;AAAA;AAAA;AAAA,SACP;AAAA,QAEC,kBAAA,IAAsB,aAAa,IAAA,oBAClC,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,CAAA;AAAA,cACV,UAAA,EAAY,KAAA;AAAA,cACZ,KAAA,EAAO,WAAA;AAAA,cACP,UAAA,EAAY,mBAAA;AAAA,cACZ,SAAA,EAAW;AAAA,aACb;AAAA,YACA,2BAAA,EAA2B,IAAA;AAAA,YAC3B,MAAA,EAAO,2BAAA;AAAA,YACR,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GAEJ;AAEJ;;;ACtNA,IAAMI,cAAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AA2CxD,SAAS,OAAA,CAAQ;AAAA,EACtB,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiB;AACf,EAAA,MAAM,QAAA,GAAoC;AAAA,IACxC,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,eAAA,EAAiB,EAAA;AAAA,IACjB,iBAAA,EAAmB,EAAA;AAAA,IACnB,GAAA,EAAK;AAAA,GACP;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,eAAA,GAAkB,uBAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,QAAA,CAAS,eAAA,GAAkB,sBAAA;AAC3B,IAAA,QAAA,CAAS,eAAA,GAAkB,CAAA;AAC3B,IAAA,QAAA,CAAS,eAAA,GAAkBA,cAAAA;AAAA,EAC7B;AAEA,EAAA,uBACE,IAAA;AAAA,IAACX,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,oBAAoB,CAAA,KAAA,EAAQ,UAAU,OAAO,UAAU,CAAA,EAAA,EAAK,SAAS,MAAM,CAAA,SAAA,CAAA;AAAA,MAC3E,MAAA,EAAO,UAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,aAAA,EAAe,KAAA,EAAO,YAAY,QAAA,EAAU,KAAA,EAAO,EAAA,EAAI,GAAA,EAAK,CAAA,EAAE;AAAA,YACvE,MAAA,EAAO,iBAAA;AAAA,YAEN,QAAA,EAAA;AAAA,cAAA,SAAA,oBACC,GAAA;AAAA,gBAACA,IAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,KAAA,EAAO,CAAA;AAAA,oBACP,MAAA,EAAQ,CAAA;AAAA,oBACR,YAAA,EAAc,CAAA;AAAA,oBACd,eAAA,EAAiBW;AAAA,mBACnB;AAAA,kBACA,2BAAA,EAA2B,IAAA;AAAA,kBAC3B,MAAA,EAAO;AAAA;AAAA,eACT;AAAA,8BAEF,GAAA;AAAA,gBAACJ,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,YAAY,MAAA,GAAY,mBAAA;AAAA,kBACnC,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,KAAA;AAAA,oBACZ,UAAA,EAAY,mBAAA;AAAA,oBACZ,KAAA,EAAO,YAAYI,cAAAA,GAAgB;AAAA,mBACrC;AAAA,kBACA,2BAAA,EAA2B,IAAA;AAAA,kBAE1B,cAAI,UAAU,CAAA;AAAA;AAAA;AACjB;AAAA;AAAA,SACF;AAAA,wBAEA,GAAA;AAAA,UAACX,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAE;AAAA,YACvF,MAAA,EAAO,gBAAA;AAAA,YAEN,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,qBACtB,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBAEC,MAAM,OAAA,CAAQ,IAAA;AAAA,gBACd,MAAA,EAAQ,QAAA,GAAW,QAAA,GAAW,OAAA,CAAQ,MAAA;AAAA,gBACtC,SAAS,OAAA,CAAQ;AAAA,eAAA;AAAA,cAHZ;AAAA,aAKR;AAAA;AAAA,SACH;AAAA,wBAEA,GAAA,CAACA,IAAAA,EAAA,EAAK,MAAA,EAAO,oBAAA,EACX,QAAA,kBAAA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,cAAA;AAAA,YACP,SAAA,EAAW,kBAAA;AAAA,YACX,WAAA,EAAY,UAAA;AAAA,YACZ,IAAA,EAAM,EAAA;AAAA,YACN,SAAA,EAAW;AAAA;AAAA,SACb,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;ACjIA,IAAMW,eAAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAC/D,IAAMe,mBAAAA,GAAqB,yBAAA;AAC3B,IAAMC,oBAAAA,GAAsB,0BAAA;AAC5B,IAAM,cAAA,GAAiB,SAAA;AAGvB,IAAMC,aAAAA,GAAe,CAACF,mBAAAA,EAAoBf,eAAAA,EAAegB,oBAAmB,CAAA;AAuC5E,SAAS,aAAa,UAAA,EAA4B;AAChD,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,UAAU,CAAC,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,IAAA,GAAQ,OAAA,GAAU,GAAA,GAAO,IAAA;AACzC,EAAA,OAAO,CAAA,eAAA,EAAkB,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC7C;AAuBO,SAAS,QAAA,CAAS;AAAA,EACvB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,aAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,MAAM,eAAe,QAAA,IAAY,IAAA;AACjC,EAAA,MAAM,CAAC,SAAS,CAAA,GAAIzB,QAAAA,CAAS,MAAM,IAAIG,QAAAA,CAAS,KAAA,CAAM,WAAA,GAAc,CAAA,GAAI,CAAC,CAAC,CAAA;AAE1E,EAAAF,UAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAYE,QAAAA,CAAS,MAAA,CAAO,SAAA,EAAW;AAAA,MAC3C,OAAA,EAAS,cAAc,CAAA,GAAI,CAAA;AAAA,MAC3B,QAAA,EAAU,GAAA;AAAA,MACV,MAAA,EAAQD,MAAAA,CAAO,GAAA,CAAIA,MAAAA,CAAO,IAAI,CAAA;AAAA,MAC9B,eAAA,EAAiB;AAAA,KAClB,CAAA;AACD,IAAA,SAAA,CAAU,KAAA,EAAM;AAChB,IAAA,OAAO,MAAM,UAAU,IAAA,EAAK;AAAA,EAC9B,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,WAAA,GAAc,UAAU,WAAA,CAAY;AAAA,IACxC,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,IACjB,WAAA,EAAa,CAAC,cAAA,EAAgBO,eAAa;AAAA,GAC5C,CAAA;AAED,EAAA,MAAM,MAAA,mBACJ,IAAA,CAACX,IAAAA,EAAA,EAAK,OAAO,EAAE,iBAAA,EAAmB,EAAA,EAAI,UAAA,EAAY,EAAA,EAAI,aAAA,EAAe,EAAA,EAAG,EAAG,QAAO,gBAAA,EAChF,QAAA,EAAA;AAAA,oBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE,EAAG,MAAA,EAAO,kBAAA,EAChE,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAACO,IAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,mBAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,EAAA;AAAA,YACV,UAAA,EAAY,6BAAA;AAAA,YACZ,UAAA,EAAY;AAAA,WACd;AAAA,UACA,MAAA,EAAO,gBAAA;AAAA,UAEN,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,QAAA,EAAS,KAAA,EAAM,WAAU,IAAA,EAAK,IAAA,EAAK,MAAA,EAAO,sBAAA,EACtD,QAAA,EAAA,IAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,GAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,qBAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,CAAA;AAAA,UACX,QAAA,EAAU,EAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAO,qBAAA;AAAA,QAEN,QAAA,EAAA,CAAA,EAAG,KAAK,CAAA,MAAA,EAAM,SAAS,CAAA;AAAA;AAAA,KAC1B;AAAA,IAEC,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAS,CAAA,oBACvC,GAAA;AAAA,MAACP,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,uBAAA;AAAA,QACV,KAAA,EAAO,EAAE,SAAA,EAAW,EAAA,EAAI,KAAK,CAAA,EAAE;AAAA,QAC/B,2BAAA,EAA2B,IAAA;AAAA,QAC3B,MAAA,EAAO,mBAAA;AAAA,QAEN,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,qBAClB,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,CAAA;AAAA,cACN,MAAA,EAAQ,CAAA;AAAA,cACR,YAAA,EAAc,CAAA;AAAA,cACd,eAAA,EAAiB,YAAA,CAAa,KAAA,CAAM,UAAU;AAAA,aAChD;AAAA,YACA,MAAA,EAAO;AAAA,WAAA;AAAA,UAPF,KAAA,CAAM;AAAA,SASd;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAGF,EAAA,2BACGK,QAAAA,CAAS,IAAA,EAAT,EAAc,KAAA,EAAO,cAAc,EAAE,SAAA,EAAW,CAAC,EAAE,OAAO,CAAA,EAAK,GAAE,GAAI,MAAA,EAAW,QAAO,mBAAA,EACtF,QAAA,kBAAA,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,CAAA;AAAA,MACX,WAAA,EAAa,cAAcM,eAAAA,GAAgB,cAAA;AAAA,MAC3C,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,EAAE,WAAA,EAA8C;AAAA,QAChD,WAAA,GACI,EAAE,SAAA,EAAW,mCAAA,EAAoC,GACjD;AAAA,OACN;AAAA,MACA,MAAA,EAAO,WAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACX,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,UAAA;AAAA,YACV,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,YAC/E,2BAAA,EAA2B,IAAA;AAAA,YAC3B,MAAA,EAAO,kBAAA;AAAA,YAEN,UAAA4B,aAAAA,CAAa,GAAA,CAAI,CAAC,KAAA,yBAChB5B,IAAAA,EAAA,EAAiB,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,eAAA,EAAiB,KAAA,EAAM,EAAA,EAAhD,KAAmD,CAC/D;AAAA;AAAA,SACH;AAAA,QAEC,YAAA,mBACC,GAAA;AAAA,UAACM,SAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,QAAA;AAAA,YACT,iBAAA,EAAkB,QAAA;AAAA,YAClB,oBAAoB,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,KAAK,SAAS,CAAA,CAAA;AAAA,YAClD,eAAA,EAAe,QAAA;AAAA,YACf,MAAA,EAAO,kBAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH,mBAEA,GAAA;AAAA,UAACN,IAAAA;AAAA,UAAA;AAAA,YACC,oBAAoB,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,KAAK,SAAS,CAAA,CAAA;AAAA,YAClD,MAAA,EAAO,kBAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGD,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA,oBAC1B,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,cAAA,EAAgB,CAAA,EAAG,gBAAgB,cAAA,EAAe;AAAA,YAC3D,MAAA,EAAO,iBAAA;AAAA,YAEN,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACV,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBAEE,GAAG,IAAA;AAAA,gBACJ,UAAA,EAAY,KAAK,UAAA,IAAc,UAAA;AAAA,gBAC/B,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAA,KAAe;AAAA,eAAA;AAAA,cAH5C,IAAA,CAAK;AAAA,aAKb;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ,EACF,CAAA;AAEJ;ACzOA,IAAMQ,GAAAA,GAAI,kBAAkB,MAAM,CAAA;AAYlC,IAAM,WAAA,GAA4C;AAAA,EAChD,SAAA,EAAW,SAAA;AAAA,EACX,MAAA,EAAQA,IAAE,iBAAiB,CAAA;AAAA,EAC3B,OAAA,EAASA,IAAE,gBAAgB,CAAA;AAAA,EAC3B,MAAA,EAAQA,IAAE,eAAe,CAAA;AAAA,EACzB,IAAA,EAAMA,IAAE,cAAc;AACxB,CAAA;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,QAAA,GAAW,YAAA,GACb,WAAA,CAAY,YAAY,CAAA,GACxB,SAAA;AAEJ,EAAA,MAAM,cAAc,YAAA,IAAgB,WAAA;AAEpC,EAAA,MAAM,OAAA,mBACJ,IAAA;AAAA,IAACR,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,iCAAA,EAAmC,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAClF,KAAA,EAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,YAAA,EAAc,IAAA;AAAA,QACd,iBAAA,EAAmB,CAAA;AAAA,QACnB,eAAA,EAAiB,CAAA;AAAA,QACjB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,oBAAoB,OAAA,GAAU,MAAA,GAAY,CAAA,EAAG,IAAI,oBAAoB,WAAW,CAAA,CAAA;AAAA,MAChF,MAAA,EAAO,mBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,CAAA;AAAA,cACP,MAAA,EAAQ,CAAA;AAAA,cACR,YAAA,EAAc,IAAA;AAAA,cACd,WAAA,EAAa,CAAA;AAAA,cACb,UAAA,EAAY,CAAA;AAAA,cACZ,eAAA,EAAiB;AAAA,aACnB;AAAA,YACA,2BAAA,EAA2B,IAAA;AAAA,YAC3B,MAAA,EAAO;AAAA;AAAA,SACT;AAAA,wBACA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,mBAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,QAAA,EAAU;AAAA,aACZ;AAAA,YACA,2BAAA,EAA2B,IAAA;AAAA,YAE1B,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAGF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA;AAAA,MAACD,SAAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAoB,CAAA,EAAG,IAAI,CAAA,iBAAA,EAAoB,WAAW,CAAA,CAAA;AAAA,QAC1D,MAAA,EAAO,6BAAA;AAAA,QAEN,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,OAAO,OAAA;AACT;;;AClFA,IAAME,GAAAA,GAAI,kBAAkB,MAAM,CAAA;AAqClC,IAAM,MAAA,GAAS;AAAA,EACb,aAAA,EAAeA,IAAE,gBAAgB,CAAA;AAAA,EACjC,YAAA,EAAcA,IAAE,eAAe,CAAA;AAAA,EAC/B,aAAA,EAAe,SAAA;AAAA,EACf,kBAAA,EAAoB;AACtB,CAAA;AAEA,IAAM,kBAAA,GAAoD;AAAA,EACxD,WAAW,MAAA,CAAO,aAAA;AAAA,EAClB,OAAO,MAAA,CAAO,YAAA;AAAA,EACd,UAAU,MAAA,CAAO;AACnB,CAAA;AAGA,IAAM,eAAA,GAAmE;AAAA,EACvE,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa,SAAA;AAAA,EACb,UAAA,EAAY,QAAA;AAAA,EACZ,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,WAAA,CACP,SAAA,EACA,WAAA,EACA,IAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;AAClC,EAAA,IAAI,WAAA,IAAe,MAAM,KAAA,CAAM,IAAA,CAAK,GAAG,WAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAC5D,EAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACjC,EAAA,OAAO,KAAA,CAAM,KAAK,QAAK,CAAA;AACzB;AAuBO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM,eAAe,QAAA,IAAY,IAAA;AACjC,EAAA,MAAM,aAAa,MAAA,KAAW,UAAA;AAC9B,EAAA,MAAM,UAAU,MAAA,KAAW,OAAA;AAE3B,EAAA,MAAM,OAAA,mBACJ,IAAA,CAACR,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,EAAA,EAAG,EAAG,MAAA,EAAO,mBAAA,EACnC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAO,qBAAA,EAC7C,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAACO,IAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,mBAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,EAAA;AAAA,YACV,UAAA,EAAY,6BAAA;AAAA,YACZ,UAAA,EAAY;AAAA,WACd;AAAA,UACA,MAAA,EAAO,mBAAA;AAAA,UAEN,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,sBACA,GAAA,CAACP,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACzB,GAAA;AAAA,QAACO,IAAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,oBAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,EAAA;AAAA,YACV,UAAA,EAAY;AAAA,WACd;AAAA,UACA,MAAA,EAAO,mBAAA;AAAA,UAEN,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,oBAEA,GAAA;AAAA,MAACA,IAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,qBAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,CAAA;AAAA,UACX,QAAA,EAAU,EAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAO,oBAAA;AAAA,QAEN,QAAA,EAAA,WAAA,CAAY,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,QAAQ;AAAA;AAAA,KACrD;AAAA,IAEC,YAAA,CAAa,SAAS,CAAA,oBACrB,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAU,IAAA;AAAA,QACV,8BAAA,EAAgC,KAAA;AAAA,QAChC,qBAAA,EAAuB,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,QAChC,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAE;AAAA,QACtB,MAAA,EAAO,4BAAA;AAAA,QAEN,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,qBACjB,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YAEC,MAAM,MAAA,CAAO,KAAA;AAAA,YACb,cACE,MAAA,CAAO,YAAA,GACH,eAAA,CAAgB,MAAA,CAAO,YAAY,CAAA,GACnC;AAAA,WAAA;AAAA,UALD,MAAA,CAAO;AAAA,SAQf;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAGF,EAAA,uBACE,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,QAAA;AAAA,MACR,SAAA,EAAW,CAAA;AAAA,MACX,WAAA,EAAa,mBAAmB,MAAM,CAAA;AAAA,MACtC,OAAA,EAAS,OAAA,GAAU,MAAA,CAAO,kBAAA,GAAqB,MAAA;AAAA,MAC/C,SAAA;AAAA,MACA,KAAA,EAAO,UAAA,GAAa,EAAE,OAAA,EAAS,KAAI,GAAI,MAAA;AAAA,MACvC,MAAA,EAAO,cAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,YAAA,mBACC,GAAA;AAAA,UAACD,SAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,QAAA;AAAA,YACT,iBAAA,EAAkB,QAAA;AAAA,YAClB,oBAAoB,CAAA,EAAG,IAAI,CAAA,UAAA,EAAa,IAAI,KAAK,MAAM,CAAA,CAAA;AAAA,YACvD,eAAA,EAAe,QAAA;AAAA,YACf,MAAA,EAAO,qBAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH,mBAEA,GAAA;AAAA,UAACN,IAAAA;AAAA,UAAA;AAAA,YACC,oBAAoB,CAAA,EAAG,IAAI,CAAA,UAAA,EAAa,IAAI,KAAK,MAAM,CAAA,CAAA;AAAA,YACvD,MAAA,EAAO,qBAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGD,QAAA,IAAY,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,oBAC3C,GAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,OAAO,EAAE,iBAAA,EAAmB,GAAG,aAAA,EAAe,CAAA,EAAG,KAAK,CAAA,EAAE;AAAA,YACxD,MAAA,EAAO,wBAAA;AAAA,YAEN,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,CAAA,yBACvB,YAAA,EAAA,EAAsB,GAAG,QAAA,EAAA,EAAP,CAAiB,CACrC;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ;;;ACrNA,IAAMW,eAAAA,GAAgB,iBAAA,CAAkB,MAAM,CAAA,CAAE,eAAe,CAAA;AAsE/D,IAAM,mBAAA,GAAgE;AAAA,EACpE,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAGO,SAAS,eAAe,SAAA,EAA8C;AAC3E,EAAA,IAAI,SAAA,CAAU,SAAA,IAAa,IAAA,EAAM,OAAO,SAAA;AACxC,EAAA,IAAI,SAAA,CAAU,UAAA,IAAc,IAAA,EAAM,OAAO,MAAA;AACzC,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,mBAAmB,KAAA,EAA2B;AAC5D,EAAA,OAAO,KAAA,CAAM,IAAI,CAAC,EAAE,IAAI,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAY,MAAO;AAAA,IAClE,EAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,CAAE,CAAA;AACJ;AAGO,SAAS,QAAA,CAAS,OAAmB,EAAA,EAAoC;AAC9E,EAAA,IAAI,EAAA,IAAM,MAAM,OAAO,IAAA;AACvB,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AACjD;AAGO,SAAS,QAAA,CAAS,MAAuB,UAAA,EAA4C;AAC1F,EAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,UAAA,IAAc,IAAA,EAAM,OAAO,IAAA;AAC/C,EAAA,OAAO,IAAA,CAAK,MAAM,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,UAAA,KAAe,UAAU,CAAA,IAAK,IAAA;AACtE;AAGO,SAAS,WAAA,CAAY,MAAuB,SAAA,EAA8C;AAC/F,EAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,SAAA,IAAa,IAAA,EAAM,OAAO,IAAA;AAC9C,EAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,EAAA,KAAO,SAAS,CAAA,IAAK,IAAA;AACtE;AAGO,SAAS,gBAAA,CACd,IAAA,EACA,UAAA,EACA,OAAA,EACqB;AACrB,EAAA,MAAM,MAAA,GAA8B,CAAC,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,CAAA;AACrF,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,UAAU,CAAA,CAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EACzE;AACA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,UAAA,EAAW,EAAqB;AAC7D,EAAA,uBACE,GAAA;AAAA,IAACX,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iCAAA;AAAA,MACV,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE;AAAA,MAChB,MAAA,EAAO,mCAAA;AAAA,MAEN,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC5B,QAAA,MAAM,MAAA,GAAS,KAAA,KAAU,MAAA,CAAO,MAAA,GAAS,CAAA;AACzC,QAAA,uBACE,IAAA,CAACA,MAAA,EAAqB,SAAA,EAAU,yBAAwB,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,EAAE,EACrE,QAAA,EAAA;AAAA,UAAA,KAAA,GAAQ,CAAA,oBACP,GAAA,CAACO,IAAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAG,EACxD,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,0BAEF,GAAA;AAAA,YAACD,SAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AAAA,cACrC,QAAA,EAAU,MAAA;AAAA,cACV,iBAAA,EAAkB,QAAA;AAAA,cAClB,MAAA,EAAQ,CAAA,4BAAA,EAA+B,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,cAEhD,QAAA,kBAAA,GAAA;AAAA,gBAACC,IAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,SAAS,mBAAA,GAAsB,MAAA;AAAA,kBAC1C,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,EAAA;AAAA,oBACV,UAAA,EAAY,mBAAA;AAAA,oBACZ,UAAA,EAAY,SAAS,KAAA,GAAQ,KAAA;AAAA,oBAC7B,KAAA,EAAO,SAAS,MAAA,GAAYI;AAAA,mBAC9B;AAAA,kBAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA;AACT;AAAA;AACF,SAAA,EAAA,EAvBS,MAAM,GAwBjB,CAAA;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;AAGA,SAAS,SAAA,CACP,IAAA,EACA,IAAA,EACA,YAAA,EACc;AACd,EAAA,MAAM,QAAA,GAA6B,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,IACjE,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,MAAA,EAAQ,mBAAA,CAAoB,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC1C,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,CAAK,UAAU;AAAA,GAC7C,CAAE,CAAA;AACF,EAAA,OAAO;AAAA,IACL,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,YAAY,IAAA,CAAK,SAAA;AAAA,IACjB,QAAA;AAAA,IACA,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA;AAAA,IACtD,UAAU,IAAA,CAAK;AAAA,GACjB;AACF;AASA,SAAS,UAAU,EAAE,KAAA,EAAO,YAAA,EAAc,YAAA,EAAc,cAAa,EAAmB;AACtF,EAAA,uBACE,GAAA,CAACX,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,kCAAA,EAC9B,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,IAAA,MAAM,QAAA,GAAW,KAAK,EAAA,KAAO,YAAA;AAC7B,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,YAAY,IAAA,CAAK,SAAA;AAAA,QACjB,KAAA,EAAO,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,YAAY,CAAC,IAAI,EAAC;AAAA,QACnF,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,QAAA;AAAA,QACA,QAAA,EAAU,MAAM,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA;AAAA,QACpC,WAAA,EAAa;AAAA,OAAA;AAAA,MAXR,IAAA,CAAK;AAAA,KAYZ;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAOA,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,eAAA,EAAgB,EAAmB;AAC5D,EAAA,uBACE,GAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,kCAAA,EAC9B,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBAClB,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MAEC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU,MAAM,eAAA,CAAgB,OAAA,CAAQ,EAAE;AAAA,KAAA;AAAA,IAXrC,OAAA,CAAQ;AAAA,GAahB,CAAA,EACH,CAAA;AAEJ;AAQA,SAAS,YAAA,CAAa,EAAE,OAAA,EAAS,gBAAA,EAAkB,kBAAiB,EAAsB;AAExF,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,CAAC,UAAU,KAAA,MAAW;AAAA,IAC5D,GAAG,QAAA;AAAA,IACH,UAAU,KAAA,KAAU,gBAAA;AAAA,IACpB,gBAAA,EAAkB,MAAM,gBAAA,CAAiB,KAAK;AAAA,GAChD,CAAE,CAAA;AACF,EAAA,uBACE,GAAA,CAACA,IAAAA,EAAA,EAAK,MAAA,EAAO,qCAAA,EACX,QAAA,kBAAA,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAA;AAAA,MACA,QAAA,EAAQ,IAAA;AAAA,MACR,UAAU,MAAM;AAAA;AAAA,GAClB,EACF,CAAA;AAEJ;AAaO,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA,GAAQ,cAAA;AAAA,EACR,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,cAAc,eAAe,CAAA,GAAIE,SAAwB,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,IAAM,IAAI,CAAA;AACpF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC9E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE5E,EAAA,MAAM,aAAA,GAAgBa,QAAQ,MAAM,kBAAA,CAAmB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACtE,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,EAAO,YAAY,CAAA;AAC/C,EAAA,MAAM,QAAQ,cAAA,CAAe,EAAE,YAAY,YAAA,EAAc,SAAA,EAAW,mBAAmB,CAAA;AACvF,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,YAAY,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,UAAA,EAAY,iBAAiB,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAe;AACjC,IAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,EAC3B,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,UAAA,KAAuB;AACzC,IAAA,eAAA,CAAgB,UAAU,CAAA;AAC1B,IAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,IAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,EAC1B,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAe;AACpC,IAAA,oBAAA,CAAqB,EAAE,CAAA;AACvB,IAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,EAC1B,CAAA;AACA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KACtB,mBAAA,CAAoB,CAAC,OAAA,KAAa,OAAA,KAAY,KAAA,GAAQ,IAAA,GAAO,KAAM,CAAA;AAErE,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAA4B;AAC9C,IAAA,IAAI,WAAW,MAAA,EAAQ,UAAA,CAAW,gBAAgB,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAAA,SAAA,IACrD,MAAA,KAAW,MAAA,IAAU,YAAA,IAAgB,IAAA,aAAiB,YAAY,CAAA;AAAA,EAC7E,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAACf,IAAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,oBAAoB,CAAA;AAAA,MAC7C,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAI;AAAA,MACpB,iBAAA,EAAmB,MAAA;AAAA,MACnB,YAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAO,uBAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,IAAA,CAACA,IAAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,EAAA,EAAI,GAAA,EAAK,EAAA,EAAG,EAAG,MAAA,EAAO,+BAAA,EAC5C,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACO,IAAAA;AAAA,UAAA;AAAA,YACC,iBAAA,EAAkB,QAAA;AAAA,YAClB,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,UAAA,EAAY,6BAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YACA,MAAA,EAAO,6BAAA;AAAA,YAEN,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,4BAECP,IAAAA,EAAA,EAAK,OAAO,EAAE,gBAAA,EAAkB,KAAI,EACnC,QAAA,kBAAA,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,aAAA;AAAA,YACP,YAAA;AAAA,YACA,WAAA,EAAa;AAAA;AAAA,SACf,EACF,CAAA;AAAA,QAEC,cAAc,IAAA,oBACb,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,gBAAA,CAAiB,UAAA,EAAY,YAAA,EAAc,aAAa,CAAA;AAAA,YAChE,UAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBAGF,IAAA;AAAA,UAACA,IAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mCAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,WAAA,EAAa,CAAA;AAAA,cACb,YAAA,EAAc,EAAA;AAAA,cACd,OAAA,EAAS;AAAA,aACX;AAAA,YACA,MAAA,EAAO,4BAAA;AAAA,YAEN,QAAA,EAAA;AAAA,cAAA,KAAA,KAAU,MAAA,oBACT,GAAA;AAAA,gBAAC,SAAA;AAAA,gBAAA;AAAA,kBACC,KAAA;AAAA,kBACA,YAAA;AAAA,kBACA,YAAA,EAAc,UAAA;AAAA,kBACd,YAAA,EAAc;AAAA;AAAA,eAChB;AAAA,cAED,KAAA,KAAU,UAAU,UAAA,IAAc,IAAA,wBAChC,SAAA,EAAA,EAAU,IAAA,EAAM,UAAA,EAAY,eAAA,EAAiB,aAAA,EAAe,CAAA;AAAA,cAE9D,KAAA,KAAU,SAAA,IAAa,aAAA,IAAiB,IAAA,oBACvC,GAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,aAAA;AAAA,kBACT,gBAAA;AAAA,kBACA,gBAAA,EAAkB;AAAA;AAAA;AACpB;AAAA;AAAA;AAEJ,OAAA,EACF;AAAA;AAAA,GACF;AAEJ","file":"pages.mjs","sourcesContent":["/**\n * Primitive Design Tokens\n *\n * Raw values with no semantic meaning. These are the foundation of the design system\n * and should rarely be used directly in components. Use semantic tokens instead.\n */\n\nexport const primitiveColors = {\n // Blue scale\n blue: {\n 50: '#EFF6FF',\n 100: '#DBEAFE',\n 200: '#BFDBFE',\n 300: '#93C5FD',\n 400: '#60A5FA',\n 500: '#3B82F6',\n 600: '#5048E5',\n 700: '#3832A0',\n 800: '#1E40AF',\n 900: '#1E3A8A',\n },\n\n // Red scale\n red: {\n 50: '#FEF2F2',\n 100: '#FEE2E2',\n 200: '#FECACA',\n 300: '#FCA5A5',\n 400: '#DA6868',\n 500: '#EF4444',\n 600: '#D14343',\n 700: '#922E2E',\n 800: '#991B1B',\n 900: '#7F1D1D',\n },\n\n // Vivid red scale\n redVivid: {\n 50: '#FFECEE',\n 100: '#FFD6DB',\n 200: '#FFB3BC',\n 300: '#FF8593',\n 400: '#FF6070',\n 500: '#FF4757',\n 600: '#E63548',\n 700: '#C42539',\n 800: '#9E1C2C',\n 900: '#7A1520',\n },\n\n // Neutral/Gray scale\n neutral: {\n 50: '#FAFAFA',\n 100: '#F3F4F6',\n 200: '#E5E7EB',\n 300: '#D1D5DB',\n 400: '#9CA3AF',\n 500: '#6B7280',\n 600: '#4B5563',\n 700: '#374151',\n 800: '#1F2937',\n 900: '#111827',\n 950: '#030712',\n },\n\n // Charcoal scale (dark backgrounds)\n charcoal: {\n 0: '#6E6E6E',\n 50: '#5D5D5D',\n 100: '#4C4C4C',\n 200: '#3C3C3C',\n 300: '#2C2C2C',\n 400: '#1F1F1F',\n 500: '#1C1C1C',\n 600: '#191919',\n 700: '#161616',\n 800: '#131313',\n 900: '#101010',\n },\n\n // Pure colors\n white: '#FFFFFF',\n black: '#000000',\n transparent: 'transparent',\n} as const\n\n/**\n * Surface ramp — dark mode (TD-surface-tokens, S-1, re-spaced S-3)\n *\n * Warm-tapered, DERIVED ramp — NOT hand-picked. Shipped verbatim as the output of\n * `deriveSurfaceRamp(shellL=9, steps=[4.5,3.5,3,2.5], rbShadow=6, rbHilite=1.5)`\n * (see `packages/ui/src/components/ui/surface/surface-lab-shared.tsx` on branch\n * `feat/TD-unified-lab`, story `Lab/Surface Exploration -> Surface Ramp System`\n * — that lab default is `[4.5,2.5,2,1.5]` as of this writing and should be\n * updated to match on that branch, follow-up, not done here).\n * Lightness is CIELAB L* off the shell, with DIMINISHING steps (4.5/3.5/3/2.5) —\n * the frame->content jump is biggest, each plane above adds less, but the top\n * three planes (elevated/raised/overlay) were re-spaced WIDER (S-3) than the\n * original 2.5/2/1.5 taper so they read as distinct planes without leaning on\n * the hairline alone. `background`/`base`/`inset` are unchanged by the re-space.\n * Warmth (R-B) tapers 6 -> 1.5 from frame to hero so bright content planes stay\n * near-neutral.\n * Kept separate from the `charcoal` scale above (which several existing\n * components reference directly for unrelated shadow/track tints) so this\n * change is additive and doesn't ripple into those consumers.\n * See coordination/design-explorations/surface-system-north-star.md.\n */\nexport const surfaceRampDark = {\n inset: '#13100D', // L*4.5 — sub-shell well / pressed\n background: '#1C1916', // L*9 — shell / frame\n base: '#252321', // L*13.5 — main content plane\n elevated: '#2C2A28', // L*17 — nav / rail\n raised: '#31302F', // L*20 — cards\n overlay: '#373635', // L*22.5 — hero / popover\n} as const\n\n/**\n * Frame/bezel primitive — dark mode (TD-surface-tokens, S-3)\n *\n * The chrome that \"exits the content ramp\" entirely: the top bar + side nav\n * shell. Sits ONE STEP BELOW `surfaceRampDark.background` (L*9), darker even\n * than `surfaceRampDark.inset` (L*4.5) — it isn't a plane IN the ramp, it's\n * the bezel the ramp sits inside. Literal, not `deriveSurfaceRamp()` output.\n */\nexport const backgroundFrameDark = '#100D0A' // L*3.79\n\n/**\n * Derived tonal ramps (TD-05.09 color foundations)\n *\n * Seven OKLCH-generated hue ramps, 11 perceptual lightness steps each (50 -> 950).\n * Built with hue-torsion + a chroma arc, anchored through existing brand/semantic\n * hexes. `pin` marks the step each ramp flows through its anchor.\n * This is the single source of truth for chromatic hexes — the categorical palette\n * below references these steps rather than duplicating values.\n * See coordination/design-explorations/foundations.\n */\nexport const primitiveRamps = {\n red: {\n 50: '#FFF4F4',\n 100: '#FFE3E5',\n 200: '#FFC2C5',\n 300: '#FF9A9D',\n 400: '#F77175',\n 500: '#E05254',\n 600: '#D14343', // pin\n 700: '#A4221C',\n 800: '#7E1002',\n 900: '#5A0900',\n 950: '#3D0400',\n },\n orange: {\n 50: '#FFF5ED',\n 100: '#FFE6D4',\n 200: '#FFC7A2',\n 300: '#FFA063',\n 400: '#FF7900', // pin\n 500: '#DA5F00',\n 600: '#B94A00',\n 700: '#983804',\n 800: '#6F290F',\n 900: '#4E1C0C',\n 950: '#331107',\n },\n amber: {\n 50: '#FFF7DD',\n 100: '#FFEAA9',\n 200: '#FFD352',\n 300: '#F9B415', // pin\n 400: '#E08C00',\n 500: '#C27400',\n 600: '#A45E00',\n 700: '#814D14',\n 800: '#5B3A1A',\n 900: '#442503',\n 950: '#301500',\n },\n green: {\n 50: '#E3FFEE',\n 100: '#B5FFD2',\n 200: '#58F69E',\n 300: '#2ED573', // pin\n 400: '#21C05D',\n 500: '#22A444',\n 600: '#298732',\n 700: '#2B6B25',\n 800: '#264D1C',\n 900: '#1B3515',\n 950: '#11220D',\n },\n cyan: {\n 50: '#E6FBFF',\n 100: '#C2F6FF',\n 200: '#62EAFF',\n 300: '#22D3EE', // pin\n 400: '#01B5D1',\n 500: '#2697B7',\n 600: '#307B9B',\n 700: '#2A617F',\n 800: '#22465F',\n 900: '#0B3149',\n 950: '#001F36',\n },\n blue: {\n 50: '#EFF8FF',\n 100: '#D9EFFF',\n 200: '#ACDBFF',\n 300: '#78C2FF',\n 400: '#3CA8FF',\n 500: '#2196F3', // pin\n 600: '#1072CB',\n 700: '#135AA8',\n 800: '#14407E',\n 900: '#112C5A',\n 950: '#091B3C',\n },\n magenta: {\n 50: '#FFF3F9',\n 100: '#FFE2F1',\n 200: '#FFBDE2',\n 300: '#FF8FD5',\n 400: '#ED69C3',\n 500: '#D548AF',\n 600: '#BA2996',\n 700: '#9C0D7A', // pin\n 800: '#77005A',\n 900: '#56003F',\n 950: '#3B0029',\n },\n} as const\n\n/**\n * Categorical (qualitative) palette — an ordered, CVD-safe series expressed as\n * references into {@link primitiveRamps} (one source of truth; the palette moves\n * with the ramps).\n *\n * Design: a single canonical hue order (blue, magenta, red, orange, green, cyan,\n * amber), with steps chosen vivid-midtone-first and fanned lighter/darker as the\n * series grows to preserve separation. The sequence is nested-stable — a chart\n * with N series uses the first N colors, and the series index is stable as N\n * changes. Colorblind-safe worst-case deuteranopia/protanopia floor 8 holds\n * through {@link CATEGORICAL_CVD_SAFE_MAX} colors; the 7th is an extended color\n * that should be paired with a legend or other secondary encoding.\n *\n * Two variants: `default` (vivid, sits on neutral/light surfaces, legible under\n * black text) and `dark` (deeper shades legible under white text on a fill). A\n * separate \"light\" variant was dropped — the vivid `default` picks already clear\n * black-text contrast, so it doubles as the light-context palette.\n */\nexport const categoricalPalette = {\n default: [\n primitiveRamps.blue[500],\n primitiveRamps.magenta[500],\n primitiveRamps.red[500],\n primitiveRamps.orange[400],\n primitiveRamps.green[300],\n primitiveRamps.cyan[300],\n primitiveRamps.amber[600], // extended (7th) — pair with a legend\n ],\n dark: [\n primitiveRamps.blue[600],\n primitiveRamps.magenta[600],\n primitiveRamps.red[500],\n primitiveRamps.orange[600],\n primitiveRamps.green[800],\n primitiveRamps.cyan[800],\n primitiveRamps.amber[500], // extended (7th) — pair with a legend\n ],\n} as const\n\n/** Largest series count that holds the CVD floor without a legend. */\nexport const CATEGORICAL_CVD_SAFE_MAX = 6\n\n/**\n * Categorical palette variant.\n * - `default` : vivid; neutral/light surfaces, legible under black text\n * - `dark` : deeper shades, legible under white text on a filled swatch\n */\nexport type CategoricalVariant = keyof typeof categoricalPalette\n\n/**\n * Get a color from the ordered categorical palette by series index.\n * The palette is nested-stable, so the color for a given index does not change\n * with the total series count; `index` simply wraps past the end.\n *\n * @param index - 0-based series index (wraps past the end)\n * @param variant - `default` (black-text / light surfaces) or `dark` (white text)\n * @returns The hex color string\n */\nexport function getCategoricalColor(index: number, variant: CategoricalVariant = 'default'): string {\n const palette = categoricalPalette[variant]\n index = Math.max(0, Math.floor(index))\n return palette[index % palette.length]\n}\n\n/**\n * Diverging status scale (BodyMap training-status: under → optimal → over) as\n * references into {@link primitiveRamps}. A true diverging shape — `optimal` is\n * the lightest center, the extremes go darker — so the signal reads in lightness\n * (colorblind-robust; worst-case deut/protanopia min ΔE ~10.9) and the direction\n * reads in the blue↔red axis (the CVD-safe hue pair).\n *\n * Tuned so every stop is dark enough for the fill yet light enough that BLACK\n * text clears 4.5:1 on all five — no per-cell white/black flipping. The value\n * valley is symmetric: the two mid-arms (maintenance / approaching) sit at equal\n * lightness (both ~0.53 relative luminance), the ends darker.\n */\nexport const divergingScale = [\n primitiveRamps.blue[500], // under\n primitiveRamps.cyan[300], // maintenance\n primitiveRamps.green[200], // optimal (light center)\n primitiveRamps.amber[300], // approaching\n primitiveRamps.red[600], // over\n] as const\n\n/**\n * Sequential \"effort\" scale (low → high intensity: green → yellow → orange → red)\n * as references into {@link primitiveRamps}. A 6-stop ordinal palette; the\n * velocity/RPE strip sub-samples it. Every adjacent pair clears the CVD floor\n * (min deut/protan ΔE ≥ 4.5), and within that the hue walk is kept smooth —\n * the amber-200 → amber-300 → orange-400 run steps the yellow→orange transition\n * gradually rather than lurching. Order encodes magnitude, so it tolerates the\n * green↔red CVD pair. Stops 0–3 take black text; the dark reds take white.\n */\nexport const sequentialEffort = [\n primitiveRamps.green[300],\n primitiveRamps.amber[200],\n primitiveRamps.amber[300],\n primitiveRamps.orange[400],\n primitiveRamps.red[600],\n primitiveRamps.red[700],\n] as const\n\n/**\n * Best-contrast text color (black or white) for a solid fill — for labels sitting\n * on categorical/diverging/effort swatches. Uses the WCAG relative-luminance ratio.\n */\nexport function bestTextColor(hex: string): '#000000' | '#FFFFFF' {\n const [r, g, b] = [0, 2, 4].map((i) => {\n const c = parseInt(hex.replace('#', '').slice(i, i + 2), 16) / 255\n return c >= 0.04045 ? ((c + 0.055) / 1.055) ** 2.4 : c / 12.92\n })\n const l = 0.2126 * r + 0.7152 * g + 0.0722 * b\n return (l + 0.05) / 0.05 >= 1.05 / (l + 0.05) ? '#000000' : '#FFFFFF'\n}\n\n/**\n * Discrete rainbow palette for data visualization\n * Based on Paul Tol's color schemes: https://personal.sron.nl/~pault/#fig:scheme_rainbow_discrete\n */\nexport const discreteRainbow = [\n '#E8ECFB',\n '#D9CCE3',\n '#D1BBD7',\n '#CAACCB',\n '#BA8DB4',\n '#AE76A3',\n '#AA6F9E',\n '#994F88',\n '#882E72',\n '#1965B0',\n '#437DBF',\n '#5289C7',\n '#6195CF',\n '#7BAFDE',\n '#4EB265',\n '#90C987',\n '#CAE0AB',\n '#F7F056',\n '#F7CB45',\n '#F6C141',\n '#F4A736',\n '#F1932D',\n '#EE8026',\n '#E8601C',\n '#E65518',\n '#DC050C',\n '#A5170E',\n '#72190E',\n '#42150A',\n] as const\n\n/**\n * Palette indices for discrete rainbow colors at different palette sizes.\n * For a given palette size (index + 1), returns the indices of colors to use.\n */\nconst discreteRainbowPalettes: number[][] = [\n [10],\n [10, 26],\n [10, 18, 26],\n [10, 15, 18, 26],\n [10, 14, 15, 18, 26],\n [10, 14, 15, 17, 18, 26],\n [9, 10, 14, 15, 17, 18, 26],\n [9, 10, 14, 15, 17, 18, 23, 26],\n [9, 10, 14, 15, 17, 18, 23, 26, 28],\n [9, 10, 14, 15, 17, 18, 21, 24, 26, 28],\n [9, 10, 12, 14, 15, 17, 18, 21, 24, 26, 28],\n [3, 6, 9, 10, 12, 14, 15, 17, 18, 21, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 21, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28, 29],\n [1, 2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28, 29],\n]\n\n/**\n * Get a color from the discrete rainbow palette for a given index and palette size.\n * Colors are optimized for visual distinction at each palette size.\n *\n * @param index - The index of the color in the series (0-based)\n * @param size - The total number of colors needed (1-23)\n * @returns The hex color string\n */\nexport function getDiscreteRainbowColor(index: number, size: number): string {\n index = Math.max(0, index)\n size = Math.min(Math.max(1, size), discreteRainbowPalettes.length)\n\n const palette = discreteRainbowPalettes[size - 1]\n if (index >= palette.length) index = index % palette.length\n\n return discreteRainbow[palette[index] - 1]\n}\n\nexport const primitiveTypography = {\n fontFamilies: {\n sans: ['Inter', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Helvetica', 'Arial', 'sans-serif'],\n body: ['Nunito Sans', 'sans-serif'],\n heading: ['Space Grotesk', 'sans-serif'],\n mono: ['SF Mono', 'Monaco', 'Inconsolata', 'Fira Mono', 'Droid Sans Mono', 'Source Code Pro', 'monospace'],\n },\n fontSizes: {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n base: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.5rem', // 24px\n '2xl': '2rem', // 32px\n '3xl': '2.25rem', // 36px\n '4xl': '3rem', // 48px\n '5xl': '3.5rem', // 56px\n },\n fontWeights: {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeights: {\n none: 1,\n tight: 1.375,\n snug: 1.5,\n normal: 1.57,\n relaxed: 1.66,\n loose: 1.75,\n },\n letterSpacing: {\n tighter: '-0.05em',\n tight: '-0.025em',\n normal: '0em',\n wide: '0.025em',\n wider: '0.05em',\n widest: '0.5px',\n },\n} as const\n\nexport const primitiveSpacing = {\n 0: '0',\n px: '1px',\n 0.5: '0.125rem', // 2px\n 1: '0.25rem', // 4px\n 1.5: '0.375rem', // 6px\n 2: '0.5rem', // 8px\n 2.5: '0.625rem', // 10px\n 3: '0.75rem', // 12px\n 3.5: '0.875rem', // 14px\n 4: '1rem', // 16px\n 5: '1.25rem', // 20px\n 6: '1.5rem', // 24px\n 7: '1.75rem', // 28px\n 8: '2rem', // 32px\n 9: '2.25rem', // 36px\n 10: '2.5rem', // 40px\n 11: '2.75rem', // 44px\n 12: '3rem', // 48px\n 14: '3.5rem', // 56px\n 16: '4rem', // 64px\n 20: '5rem', // 80px\n 24: '6rem', // 96px\n 28: '7rem', // 112px\n 32: '8rem', // 128px\n} as const\n\nexport const primitiveBorderRadius = {\n none: '0',\n sm: '4px',\n DEFAULT: '8px',\n md: '8px',\n lg: '12px',\n xl: '16px',\n '2xl': '24px',\n full: '9999px',\n} as const\n\nexport const primitiveShadows = {\n none: 'none',\n sm: '0px 1px 2px rgba(100, 116, 139, 0.12)',\n DEFAULT: '0px 1px 3px rgba(100, 116, 139, 0.12), 0px 1px 2px rgba(100, 116, 139, 0.24)',\n md: '0px 4px 6px rgba(100, 116, 139, 0.12)',\n lg: '0px 10px 15px rgba(100, 116, 139, 0.12)',\n xl: '0px 20px 25px rgba(100, 116, 139, 0.12)',\n '2xl': '0px 25px 50px rgba(100, 116, 139, 0.25)',\n inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',\n} as const\n\nexport const primitiveBreakpoints = {\n xs: 0,\n sm: 600,\n md: 1000,\n lg: 1200,\n xl: 1920,\n} as const\n\nexport const primitiveZIndex = {\n hide: -1,\n auto: 'auto',\n base: 0,\n docked: 10,\n dropdown: 1000,\n sticky: 1100,\n drawer: 1100,\n banner: 1200,\n appBar: 1200,\n overlay: 1300,\n modal: 1400,\n popover: 1500,\n skipLink: 1600,\n toast: 1700,\n tooltip: 1800,\n} as const\n","/**\n * Workout-specific tokens not yet in the main Tailwind config.\n * Use these inline instead of Tailwind classes.\n */\nimport { divergingScale, sequentialEffort, primitiveRamps as ramp } from './tokens/primitives'\n\nexport const WORKOUT_TOKENS = {\n // Canonical 4-band performance scale — the single source for BOTH the\n // VelocityStrip zone bars and the SetRow RPE color (TD-03.43). The direction\n // is intentionally inverted between the two consumers: for velocity, green =\n // fastest/best; for RPE, green = easiest. This is the [0,2,3,4] subsample of\n // the canonical `sequentialEffort` primitive: an EVEN hue walk across the ramp\n // (green → gold → orange → red). The earlier [0,1,2,4] spent two of its four\n // bands on adjacent yellows (amber-200 + amber-300) and skipped orange, reading\n // yellow-heavy with an abrupt jump to red; sampling amber-300 + orange-400\n // instead gives four cleanly separable bands that hold at 3px strip scale.\n // Consumed inline (RN).\n scale: {\n green: sequentialEffort[0], // green-300\n yellow: sequentialEffort[2], // amber-300 (gold)\n orange: sequentialEffort[3], // orange-400 (true orange)\n red: sequentialEffort[4], // red-600\n },\n\n // BodyMap volume heatmap — the canonical `divergingScale` (under → optimal →\n // over): a true diverging shape with a light green center, cool-blue under-\n // trained end and warm-red over-reaching end (colorblind-robust in lightness).\n heatmap: {\n none: '#E0E0E0', // no training data\n under: divergingScale[0], // below MEV\n maintenance: divergingScale[1], // MEV to MAV\n productive: divergingScale[2], // optimal center — MAV to MRV\n approaching: divergingScale[3], // near MRV\n over: divergingScale[4], // over MRV\n },\n\n // Badge border-radius (rounded-sm is 4px, we need 2px)\n badgeRadius: 2,\n\n // Surface and border colors were removed here: those flip with the theme, so\n // components use the CSS custom properties (var(--color-surface-*/border-*))\n // directly. Only theme-independent data-viz values remain below.\n\n // Intensity bar specific — over-target tiers deepen along the red ramp.\n intensity: {\n track: '#333333',\n over1: ramp.red[600], // matches status-error\n over2: ramp.red[700],\n over3: ramp.red[800],\n targetLine: 'rgba(33, 150, 243, 0.5)',\n atTargetGlow:\n '0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)',\n },\n\n // Placeholder strip\n placeholder: {\n fill: '#3A3A3A',\n },\n\n // Deviation bar\n deviation: {\n track: '#333333',\n },\n} as const\n","// Font mapping context: presentation-only helpers, no rendering.\nimport { WORKOUT_TOKENS } from '../theme/workout-tokens'\n\n/**\n * Presentation helpers for workout metrics.\n *\n * The data layer (`@voltras/workout-analytics` view-model derivations) supplies\n * EXACT, unrounded values; these turn them into the rounded / banded / formatted\n * forms a view renders. Keeping display munging here — in the design system, not\n * the analytics layer — is the render half of the model↔render split: one view\n * can round while another (or a hover) shows the exact value from the same real\n * data. Workout components consume these so the rules live in one place.\n */\n\n/** Round an exact RPE onto its conventional 0.5 granularity for display. */\nexport function roundRpe(rpe: number): number {\n return Math.round(rpe * 2) / 2\n}\n\n/**\n * Color band for an RPE on the canonical performance scale. Higher RPE = harder\n * = red (direction inverted vs velocity, which shares the same scale). Bands:\n * `<7` green, `7–8.5` yellow, `8.5–9.5` orange, `≥9.5` red.\n */\nexport function rpeColor(rpe: number): string {\n if (rpe >= 9.5) return WORKOUT_TOKENS.scale.red\n if (rpe >= 8.5) return WORKOUT_TOKENS.scale.orange\n if (rpe >= 7) return WORKOUT_TOKENS.scale.yellow\n return WORKOUT_TOKENS.scale.green\n}\n\n/** Round a weight or e1RM to a whole unit for compact display. */\nexport function roundWeight(weight: number): number {\n return Math.round(weight)\n}\n\n/** Format an exact velocity (m/s) to the 2-dp string shown on the velocity strip. */\nexport function formatVelocity(velocity: number): string {\n return velocity.toFixed(2)\n}\n\n/** Round an exact tempo tuple (seconds) to 1 dp per phase for display. */\nexport function roundTempo(\n tempo: [number, number, number, number]\n): [number, number, number, number] {\n return tempo.map((v) => Math.round(v * 10) / 10) as [number, number, number, number]\n}\n\n/** Signed percentage label for a deviation ratio, e.g. `+9%` / `-5%` / `0%`. */\nexport function formatSignedPct(ratio: number): string {\n const pct = Math.round(ratio * 100)\n return `${pct > 0 ? '+' : ''}${pct}%`\n}\n\n/** Structured prescription for the active exercise (from the plan). */\nexport interface PrescriptionInput {\n repsLow?: number\n repsHigh?: number\n weightLbs?: number\n rpe?: number\n}\n\n/**\n * Human prescription string, e.g. `\"8–10 @ 62 lb · RPE 8\"`. `null` when there is\n * nothing to show. Presentation-only: the plan supplies the numbers, this shapes\n * the label.\n */\nexport function formatPrescription(p: PrescriptionInput | null | undefined): string | null {\n if (p == null) return null\n let reps: string | null = null\n if (p.repsLow != null && p.repsHigh != null) {\n reps = p.repsLow === p.repsHigh ? `${p.repsLow}` : `${p.repsLow}–${p.repsHigh}`\n } else if (p.repsLow != null) {\n reps = `${p.repsLow}`\n }\n const weight = p.weightLbs != null ? `${p.weightLbs} lb` : null\n const head = [reps, weight].filter((s): s is string => s != null).join(' @ ')\n const rpe = p.rpe != null ? `RPE ${p.rpe}` : null\n const full = [head.length > 0 ? head : null, rpe]\n .filter((s): s is string => s != null)\n .join(' · ')\n return full.length > 0 ? full : null\n}\n","/**\n * Custom JSX runtime for titan-design's web distribution.\n *\n * Converts className props to $$css style objects at build time,\n * eliminating the need for NativeWind's runtime interopComponents\n * Map lookup. RNW's styleq recognizes $$css objects and applies\n * their values as CSS class names on DOM elements.\n *\n * This file is NOT used by source builds (specimen, storybook,\n * native Metro). It is only inlined into the dist by tsup via\n * an esbuild onResolve plugin.\n */\nimport {\n jsx as reactJsx,\n jsxs as reactJsxs,\n Fragment,\n} from 'react/jsx-runtime'\nimport type { StyleProp } from 'react-native'\n\ntype JsxFn = typeof reactJsx\n\nfunction wrapJsx(fn: JsxFn): JsxFn {\n return function (type, props: Record<string, any>, ...rest) {\n if (props && typeof props.className === 'string' && props.className) {\n const cn = props.className\n const cssStyle = { $$css: true, [cn]: cn } as unknown as StyleProp<any>\n const existing = props.style\n props = {\n ...props,\n style: existing ? [cssStyle, existing] : cssStyle,\n }\n delete props.className\n }\n return fn(type, props, ...rest)\n } as JsxFn\n}\n\nconst jsx = wrapJsx(reactJsx)\nconst jsxs = wrapJsx(reactJsxs)\n\nexport { jsx, jsxs, Fragment }\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Animated, Easing, type ViewProps, type DimensionValue } from 'react-native'\n\n/** ~1.9s full cycle: a pulsing segment eases up then back down (2 × half). */\nconst PULSE_HALF_MS = 950\n\n/** Pulsing segments breathe their opacity between this floor and full. */\nconst PULSE_MIN_OPACITY = 0.45\n\n/** Default between-segment gap — matches SetStrip's between-set gap so strips read the same. */\nconst SEGMENTED_BAR_GAP = 5\n\nexport interface SegmentedBarSegment {\n /** Flex weight of this segment's slot. Default 1 (all segments equal width). */\n weight?: number\n /** Fraction 0..1 of the slot the coloured fill covers, left-aligned. Default 1 (full). */\n fill?: number\n /** Fill colour — a literal hex (RNW-safe), never a `var()` token ref. */\n color: string\n /** When true the fill animates on the shared active-pulse loop. */\n pulse?: boolean\n /**\n * When pulsing, interpolate the fill's `backgroundColor` from→to over the loop\n * (full opacity). Omit to fall back to the default opacity breathe.\n */\n pulseColor?: [from: string, to: string]\n /**\n * A fixed gap (px) carved in before this segment's slot — lets a composer split\n * an otherwise-butted bar into sub-structure (drop notch, myo cluster) without a\n * uniform {@link SegmentedBarProps.gap}. Default 0 (butted against the previous).\n */\n leadingGap?: number\n /**\n * Static fill opacity 0..1 for a non-pulsing segment (e.g. a fading \"count\n * unknown\" trail). Ignored for `pulse` segments, which drive their own opacity.\n */\n opacity?: number\n}\n\nexport interface SegmentedBarProps extends ViewProps {\n /** The weighted segments, laid left-to-right. */\n segments: SegmentedBarSegment[]\n /** Track height in px. Default 8. */\n height?: number\n /** Gap between segment slots in px. Default 5 (SetStrip's between-set gap). */\n gap?: number\n /** Corner radius of each segment slot in px. Default 2. */\n radius?: number\n /** An absolutely-positioned vertical marker line at `position` (0..1 of total width). */\n marker?: { position: number; color: string } | null\n /**\n * Resolve the testID of a segment's fill element. Lets a composing component\n * (e.g. SetBar) preserve its own test hooks; defaults to `segmented-bar-segment`.\n */\n segmentTestID?: (segment: SegmentedBarSegment, index: number) => string | undefined\n}\n\n/** The shared active-pulse loop: a single 0→1→0 value driving every pulsing segment. */\nfunction usePulse(active: boolean): Animated.Value {\n const [value] = useState(() => new Animated.Value(0))\n\n useEffect(() => {\n if (!active) return\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(value, {\n toValue: 1,\n duration: PULSE_HALF_MS,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: false,\n }),\n Animated.timing(value, {\n toValue: 0,\n duration: PULSE_HALF_MS,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: false,\n }),\n ])\n )\n loop.start()\n return () => loop.stop()\n }, [active, value])\n\n return value\n}\n\n/**\n * A horizontal track split into weighted, individually-fillable segments — the\n * presentational atom the per-set strips are built from. Each segment is a flex\n * slot (flex = `weight`) holding a left-aligned fill (`fill` fraction, `color`);\n * `pulse` segments breathe on a shared active-pulse loop, and `marker` drops a\n * vertical line at a fraction of the total width. Colours are passed-in literal hex.\n */\nexport function SegmentedBar({\n segments,\n height = 8,\n gap = SEGMENTED_BAR_GAP,\n radius = 2,\n marker = null,\n segmentTestID,\n style,\n ...props\n}: SegmentedBarProps) {\n const pulse = usePulse(segments.some((s) => s.pulse))\n\n return (\n <View style={[{ flexDirection: 'row', height, gap, position: 'relative' }, style]} {...props}>\n {segments.map((seg, i) => {\n const fillStyle = {\n width: `${(seg.fill ?? 1) * 100}%` as DimensionValue,\n height: '100%' as DimensionValue,\n backgroundColor: seg.color,\n opacity: seg.opacity,\n }\n const testID = segmentTestID?.(seg, i) ?? 'segmented-bar-segment'\n return (\n <View\n key={i}\n style={{\n flex: seg.weight ?? 1,\n minWidth: 0,\n height: '100%',\n marginLeft: seg.leadingGap,\n borderRadius: radius,\n overflow: 'hidden',\n }}\n >\n {seg.pulse ? (\n <Animated.View\n style={{\n ...fillStyle,\n ...(seg.pulseColor\n ? {\n backgroundColor: pulse.interpolate({\n inputRange: [0, 1],\n outputRange: seg.pulseColor,\n }),\n }\n : {\n opacity: pulse.interpolate({\n inputRange: [0, 1],\n outputRange: [PULSE_MIN_OPACITY, 1],\n }),\n }),\n }}\n accessibilityElementsHidden\n testID={testID}\n />\n ) : (\n <View style={fillStyle} accessibilityElementsHidden testID={testID} />\n )}\n </View>\n )\n })}\n {marker ? (\n <View\n style={{\n position: 'absolute',\n left: `${marker.position * 100}%` as DimensionValue,\n top: 0,\n bottom: 0,\n width: 2,\n backgroundColor: marker.color,\n }}\n accessibilityElementsHidden\n testID=\"segmented-bar-marker\"\n />\n ) : null}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { primitiveColors, primitiveRamps } from '../../../theme/tokens/primitives'\nimport { SegmentedBar, type SegmentedBarSegment } from './SegmentedBar'\n\n/**\n * The four canonical rep-intensity zone pins (real titan ramp pins). A rep's mean\n * velocity ratio maps to one of these; butted together they form a set's bar.\n */\nexport const SET_STRIP_ZONES = {\n slow: primitiveRamps.red[600],\n moderate: primitiveRamps.orange[400],\n fast: primitiveRamps.amber[300],\n fastest: primitiveRamps.green[300],\n} as const\n\n/** Grey fill for planned-but-unperformed reps / upcoming sets (charcoal placeholder). */\nconst TODO_COLOR = primitiveColors.charcoal[300]\n\n/**\n * The learned \"variable / unknown / opportunity\" semantic (cyan-900, a real ramp\n * pin): an unperformed rep in a range's variable zone, and the fading trail of a\n * myo set whose cluster count isn't yet known.\n */\nexport const SET_STRIP_VARIABLE_COLOR = primitiveRamps.cyan[900]\n\n// Gap hierarchy — the chunk-size *pattern* carries set-type identity:\n// butted reps (0) < NOTCH (drop sub-load) < CLUSTER (myo rest-pause) < SET_GAP (5, between sets).\n/** Drop-set sub-load divider — a thin notch, narrower than a myo cluster gap. */\nconst NOTCH_GAP = 2\n/** Myo rest-pause divider between the activation chunk and each mini-cluster. */\nconst CLUSTER_GAP = 3\n\n/** myo-upcoming trail defaults: N fading expected clusters, each this many reps. */\nconst MYO_UPCOMING_CLUSTERS = 3\nconst MYO_UPCOMING_CLUSTER_LEN = 5\n/** Per-cluster opacity decay along the \"count unknown\" trail (1 · 0.6 · 0.36 · …). */\nconst MYO_UPCOMING_FADE = 0.6\n\n/**\n * Active-set pulse range per zone: each segment eases between its pin's adjacent\n * lighter/darker ramp steps, keeping the intensity reading while signalling \"live\".\n */\nconst PULSE_RANGE: Record<string, [string, string]> = {\n [SET_STRIP_ZONES.slow]: [primitiveRamps.red[500], primitiveRamps.red[700]],\n [SET_STRIP_ZONES.moderate]: [primitiveRamps.orange[300], primitiveRamps.orange[500]],\n [SET_STRIP_ZONES.fast]: [primitiveRamps.amber[200], primitiveRamps.amber[400]],\n [SET_STRIP_ZONES.fastest]: [primitiveRamps.green[200], primitiveRamps.green[400]],\n}\n\n/** Map a per-rep mean-velocity ratio to its zone pin (fastest = green, slowest = red). */\nexport function velocityZoneColor(v: number): string {\n if (v < 0.5) return SET_STRIP_ZONES.slow\n if (v < 0.75) return SET_STRIP_ZONES.moderate\n if (v < 1.0) return SET_STRIP_ZONES.fast\n return SET_STRIP_ZONES.fastest\n}\n\n/**\n * One set's data. Flat variants: `done` = every rep performed; `active` = reps-so-far\n * performed against a planned count (remainder greyed, performed reps pulse); `todo` =\n * a planned but unstarted set (solid grey bar). Set-type variants:\n * - `range` — variable rep-range (e.g. 15–20): `max` segments; committed zone\n * `0..floor` (done = velocity, todo = grey), variable zone `floor..max` (done =\n * velocity, todo = the variable/opportunity cyan). `doneVels` may run past `floor`.\n * - `drop` — one set, no rest: `subloads` butted internally, split by 2px notches.\n * - `myo` — done rest-pause: `activation` chunk + `clusters`, split by 3px cluster gaps.\n * - `myo-upcoming` — planned myo, length unknown: grey activation (`activationLen`) +\n * a fading cyan \"clusters-to-failure\" trail with the right edge left open.\n */\nexport type SetStripSet =\n | { status: 'done'; velocities: number[] }\n | { status: 'active'; velocities: number[]; planned: number }\n | { status: 'todo'; planned: number }\n | { status: 'range'; floor: number; max: number; doneVels: number[] }\n | { status: 'drop'; subloads: number[][] }\n | { status: 'myo'; activation: number[]; clusters: number[][] }\n | { status: 'myo-upcoming'; activationLen: number; clusterCount?: number }\n\n/** Flatten velocity chunks into butted segments, carving `gap` before each chunk but the first. */\nfunction chunkedSegments(chunks: number[][], gap: number): SegmentedBarSegment[] {\n return chunks.flatMap((vels, ci) =>\n vels.map((v, ri) => ({\n color: velocityZoneColor(v),\n ...(ci > 0 && ri === 0 ? { leadingGap: gap } : {}),\n }))\n )\n}\n\n/** The variable rep-range's `max` segments: velocity where done, else grey (committed) / cyan (variable). */\nfunction rangeSegments(floor: number, max: number, doneVels: number[]): SegmentedBarSegment[] {\n return Array.from({ length: max }, (_, i) => {\n if (i < doneVels.length) return { color: velocityZoneColor(doneVels[i]) }\n return { color: i < floor ? TODO_COLOR : SET_STRIP_VARIABLE_COLOR }\n })\n}\n\n/** Grey activation chunk + a fading, right-open cyan trail of expected rest-pause clusters. */\nfunction myoUpcomingSegments(activationLen: number, clusterCount: number): SegmentedBarSegment[] {\n const activation = Array.from({ length: activationLen }, () => ({ color: TODO_COLOR }))\n const trail = Array.from({ length: clusterCount }, (_, ci) =>\n Array.from({ length: MYO_UPCOMING_CLUSTER_LEN }, (_, ri) => ({\n color: SET_STRIP_VARIABLE_COLOR,\n opacity: MYO_UPCOMING_FADE ** ci,\n ...(ri === 0 ? { leadingGap: CLUSTER_GAP } : {}),\n }))\n ).flat()\n return [...activation, ...trail]\n}\n\n/** Map a set's performance state to the butted per-rep segments of its bar. */\nfunction setSegments(set: SetStripSet): SegmentedBarSegment[] {\n if (set.status === 'todo') {\n return [{ color: TODO_COLOR }]\n }\n if (set.status === 'done') {\n return set.velocities.map((v) => ({ color: velocityZoneColor(v) }))\n }\n if (set.status === 'range') {\n return rangeSegments(set.floor, set.max, set.doneVels)\n }\n if (set.status === 'drop') {\n return chunkedSegments(set.subloads, NOTCH_GAP)\n }\n if (set.status === 'myo') {\n return chunkedSegments([set.activation, ...set.clusters], CLUSTER_GAP)\n }\n if (set.status === 'myo-upcoming') {\n return myoUpcomingSegments(set.activationLen, set.clusterCount ?? MYO_UPCOMING_CLUSTERS)\n }\n const performed = set.velocities.map((v) => {\n const color = velocityZoneColor(v)\n return { color, pulse: true, pulseColor: PULSE_RANGE[color] }\n })\n const remaining = Math.max(0, set.planned - set.velocities.length)\n return [...performed, ...Array.from({ length: remaining }, () => ({ color: TODO_COLOR }))]\n}\n\n/** Preserve SetBar's per-segment test hooks over the generic SegmentedBar fills. */\nfunction setBarSegmentTestID(seg: SegmentedBarSegment): string {\n if (seg.pulse) return 'set-strip-pulse'\n if (seg.color === SET_STRIP_VARIABLE_COLOR) return 'set-strip-variable'\n return seg.color === TODO_COLOR ? 'set-strip-empty' : 'set-strip-fill'\n}\n\nexport interface SetBarProps {\n /** One set's performance state (done / active / todo). */\n set: SetStripSet\n /** Bar height in px. Default 8. */\n height?: number\n}\n\n/**\n * ONE set's multi-coloured bar: the butted per-rep colour segments for a single\n * set (`done` = velocity-coloured reps · `active` = performed reps pulsing + grey\n * remainder · `todo` = a solid grey bar), composed over {@link SegmentedBar}.\n * Fills its flex slot; {@link SetStrip} lays several side by side. Colours are the\n * real titan ramp pins.\n */\nexport function SetBar({ set, height = 8 }: SetBarProps) {\n return (\n <SegmentedBar\n segments={setSegments(set)}\n height={height}\n gap={0}\n radius={0}\n segmentTestID={setBarSegmentTestID}\n style={{ flex: 1, minWidth: 0, borderRadius: 2, overflow: 'hidden' }}\n testID=\"set-strip-set\"\n />\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, type ViewProps } from 'react-native'\nimport { SetBar, type SetStripSet } from './SetBar'\n\n// Re-exported so the per-set colour vocabulary stays importable from either the\n// molecule (SetStrip) or the atom (SetBar) it now lives in.\nexport {\n SET_STRIP_ZONES,\n SET_STRIP_VARIABLE_COLOR,\n velocityZoneColor,\n SetBar,\n type SetBarProps,\n} from './SetBar'\nexport type { SetStripSet } from './SetBar'\n\n/** Gap between set bars — ~2× the (zero) rep gap, so sets read as discrete units. */\nconst SET_STRIP_GAP = 5\n\n/** Collapse a set (flat or set-type) to its glance category for the progress summary. */\nfunction setCategory(set: SetStripSet): 'done' | 'active' | 'upcoming' {\n switch (set.status) {\n case 'done':\n case 'drop':\n case 'myo':\n return 'done'\n case 'active':\n return 'active'\n case 'range':\n return set.doneVels.length > 0 ? 'active' : 'upcoming'\n case 'todo':\n case 'myo-upcoming':\n return 'upcoming'\n }\n}\n\nfunction describeSets(sets: SetStripSet[]): string {\n const done = sets.filter((s) => setCategory(s) === 'done').length\n const active = sets.filter((s) => setCategory(s) === 'active').length\n const upcoming = sets.filter((s) => setCategory(s) === 'upcoming').length\n return `Set progress: ${done} done, ${active} in progress, ${upcoming} upcoming`\n}\n\nexport interface SetStripProps extends ViewProps {\n /** Per-set performance data, in set order. */\n sets: SetStripSet[]\n /** Bar height in px. Default 8. */\n height?: number\n className?: string\n}\n\n/**\n * The per-set segmented performance strip: one continuous {@link SetBar} per set\n * (rep intensities as butted color segments, no rep gaps), sets separated by a\n * fixed gap. Fills its container width. Colors are the real titan ramp pins.\n */\nexport function SetStrip({ sets, height = 8, className, ...props }: SetStripProps) {\n return (\n <View\n className={className}\n style={{ flexDirection: 'row', width: '100%', height, gap: SET_STRIP_GAP }}\n accessibilityRole=\"image\"\n accessibilityLabel={describeSets(sets)}\n testID=\"set-strip\"\n {...props}\n >\n {sets.map((set, i) => (\n <SetBar key={i} set={set} height={height} />\n ))}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport {\n View,\n Text,\n Pressable,\n Animated,\n Easing,\n type ViewProps,\n type ViewStyle,\n type LayoutChangeEvent,\n} from 'react-native'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\nimport { primitiveColors, primitiveRamps, sequentialEffort } from '../../../theme/tokens/primitives'\nimport { formatVelocity } from '../../../utils/workout-format'\nimport { SET_STRIP_VARIABLE_COLOR } from './SetStrip'\n\n/**\n * Structural velocity-zone band accepted from an upstream analytics source\n * (e.g. workout-analytics' `VelocityZones.bands`).\n *\n * Deliberately a plain structural shape — titan never imports the analytics\n * package (the same presentational-only policy the Workout family follows). Any object with\n * this shape can be passed, so `zones={waVelocityZones.bands}` works directly.\n * Bands are ordered slow → fast, contiguous, and cover `[0, ∞)` with the top\n * band's `max === null`. Bands carry NO color — color is a UI concern resolved\n * here via {@link zoneIdToScaleToken}.\n */\nexport interface VelocityZoneBandProp {\n /** Stable zone identity (e.g. WA's `VelocityZoneId`). Drives color mapping. */\n id: string\n /** Human-readable label shown in the summary row. */\n label: string\n /** Inclusive lower bound (m/s mean concentric velocity). */\n min: number\n /** Exclusive upper bound (m/s); `null` marks the open top band. */\n max: number | null\n}\n\nexport interface VelocityStripProps extends ViewProps {\n /**\n * Per-rep MEAN concentric velocity (m/s), one entry per rep (brain WA-D02).\n * Drives both bar height and — in the default path — zone color. Callers must\n * feed mean (not peak) concentric velocity so bar color, height, and the\n * summary label all describe one metric.\n *\n * Optional: provide exactly one of `velocities` or {@link VelocityStripProps.set}.\n * When neither is given the strip renders nothing.\n */\n velocities?: number[]\n /**\n * Optional structured strength-training set descriptor (see {@link VelocitySet}).\n * When present it supersedes `velocities`: the done-velocity array is derived\n * from the set (so mean / loss / zone summaries still work) and the strip is\n * drawn as a typed slot list — grey todo, cyan variable / continue windows and\n * the wide-gap chunking that distinguishes drop / myo / cluster sets. Provide\n * exactly one of `velocities` or `set`.\n */\n set?: VelocitySet\n /**\n * Optional velocity-zone bands (shape-compatible with WA's\n * `VelocityZones.bands`). When provided, bar color and the summary zone label\n * come from these bands via {@link zoneIdToScaleToken}. When omitted, the\n * built-in default scale (≥1.0 / ≥0.75 / ≥0.5) is used — identical to prior\n * releases. Colors NEVER come from the bands themselves.\n */\n zones?: readonly VelocityZoneBandProp[]\n /**\n * Live mode: index of the most-recently-completed rep. That bar animates in\n * with a \"pop\"; if it is also the current set peak (a new best), it \"bounces\"\n * instead. Only the latest bar animates. Honors `prefers-reduced-motion`.\n * Framed `expanded` chart only (interactive tap-to-expand use).\n */\n liveRepIndex?: number\n /**\n * `expanded` variant: whether the chart is OPEN. Default true (the variant shows\n * its chart). Toggle it (with {@link onToggle}) for the interactive tap-to-expand\n * collapse↔chart animation; a static open chart (no `onToggle`) does not animate.\n */\n expanded?: boolean\n onToggle?: () => void\n onRepPress?: (index: number, velocity: number) => void\n /**\n * `mini` — a flat 3px static strip (set-type aware). `expanded` — the velocity-\n * HEIGHT bar chart (rounded tops), whose chrome is prop-driven: with\n * {@link showNumbers} or {@link showInfo} on it's the framed chart (raised surface,\n * padding, per-bar m/s labels, mean/loss info row, interactive collapse); with both\n * off it's a bare strip — the active-set \"spotlight\" of {@link ExerciseCard}. `hero`\n * — the across-the-room, single-set wall treatment: tall bars, a per-bar m/s value\n * label, a dashed running-best reference line, and dashed placeholders for the reps\n * still to come (see {@link targetReps}). Reuses the zone scale and the live-rep pop.\n */\n variant?: 'mini' | 'expanded' | 'hero'\n /** `expanded` / `hero` plot height in px (bars scale to this). Default 60 (`expanded`) / 220 (`hero`). */\n height?: number\n /**\n * `hero` only: the set's planned rep count. Reps beyond {@link velocities} draw as\n * dashed placeholder stubs so the wall reads \"3 of 8 done\" at a glance. Ignored\n * (and no placeholders drawn) when absent or ≤ the performed-rep count.\n */\n targetReps?: number\n /**\n * `expanded` / `hero` bar scaling. `peak` (default) scales to the set's own max\n * (+15% headroom). `fixed` scales to a fixed velocity ceiling so bar heights read\n * the same absolute velocity across sets (the spotlight).\n */\n scale?: 'peak' | 'fixed'\n /** `expanded` framed chart: per-bar m/s labels. Default true. */\n showNumbers?: boolean\n /** `expanded` framed chart: the mean/loss info row. Default true. */\n showInfo?: boolean\n className?: string\n}\n\n// Canonical 4-color performance scale shared with SetRow's RPE color\n// (see theme/workout-tokens.ts). green = fastest, red = slowest/grinding.\nconst VEL_COLORS = WORKOUT_TOKENS.scale\n\n/**\n * Map a velocity-zone id (WA's 5-band taxonomy) directly onto the 6-stop\n * `sequentialEffort` ramp. The default strip uses the 4-color {@link VEL_COLORS}\n * scale (a subsample of the same ramp), but the 5-band taxonomy has one more\n * level than that scale carries, so it samples 5 stops: the top four align with\n * the default scale (speed/power/strengthSpeed/maximalStrength = green/gold/\n * orange/red) and `grinding` takes the ramp's darker red. `maximalStrength` and\n * `grinding` therefore stay DISTINCT — they no longer collapse onto one red for\n * lack of a 5th hue. An exercise moving from default to profile-derived zones\n * never shifts its fast-end colors.\n *\n * Unknown ids fall back to `green` (matching the historical default-path\n * fallback), so a forward-compatible band id never renders an empty bar.\n */\nconst bandIdToEffortColor: Record<string, string> = {\n speed: sequentialEffort[0], // green-300\n power: sequentialEffort[2], // amber-300 (gold)\n strengthSpeed: sequentialEffort[3], // orange-400\n maximalStrength: sequentialEffort[4], // red-600\n grinding: sequentialEffort[5], // red-700 — the distinct 5th band\n}\n\n// --- Default (no-zones) scale ------------------------------------------------\n// Retained as named exports for back-compat; they define the default path.\n\nexport function getVelocityZoneColor(velocity: number): string {\n if (velocity >= 1.0) return 'vel-green'\n if (velocity >= 0.75) return 'vel-yellow'\n if (velocity >= 0.5) return 'vel-orange'\n return 'vel-red'\n}\n\nexport function getVelocityZoneName(velocity: number): string {\n if (velocity >= 1.0) return 'Speed'\n if (velocity >= 0.75) return 'Power'\n if (velocity >= 0.5) return 'Strength-Speed'\n return 'Strength'\n}\n\nconst zoneHexMap: Record<string, string> = {\n 'vel-green': VEL_COLORS.green,\n 'vel-yellow': VEL_COLORS.yellow,\n 'vel-orange': VEL_COLORS.orange,\n 'vel-red': VEL_COLORS.red,\n}\n\n/**\n * Velocity loss for a set, as a whole percentage. Uses the running-best rep as\n * the reference (matching WA-02.05 / brain WA-D01): `(vBest − vLast) / vBest`,\n * clamped to ≥ 0 so a set that ends on its best rep reports 0 loss.\n */\nexport function calculateVelocityLoss(velocities: number[]): number {\n if (velocities.length < 2) return 0\n const best = Math.max(...velocities)\n if (best <= 0) return 0\n const last = velocities[velocities.length - 1]\n return Math.max(0, Math.round(((best - last) / best) * 100))\n}\n\n/** Arithmetic mean of the per-rep mean-concentric velocities. */\nexport function calculateMeanVelocity(velocities: number[]): number {\n if (velocities.length === 0) return 0\n const sum = velocities.reduce((acc, v) => acc + v, 0)\n return sum / velocities.length\n}\n\n/** Classify a velocity into its band (slow → fast, min inclusive / max exclusive). */\nfunction classifyBand(\n velocity: number,\n bands: readonly VelocityZoneBandProp[]\n): VelocityZoneBandProp | undefined {\n for (const band of bands) {\n if (band.max === null || velocity < band.max) return band\n }\n return bands[bands.length - 1]\n}\n\nfunction bandColor(band: VelocityZoneBandProp): string {\n return bandIdToEffortColor[band.id] ?? VEL_COLORS.green\n}\n\nfunction getLossStyle(loss: number): Record<string, string> | null {\n if (loss > 25) return { color: VEL_COLORS.red }\n if (loss > 20) return { color: VEL_COLORS.orange }\n return null\n}\n\n// --- Set-type slot model -----------------------------------------------------\n// The strength-training set vocabulary (operator-approved in the Set Modalities\n// exploration): one strip encoding for every per-rep set type. A set resolves to\n// an ordered list of slots; the slot `kind` picks the color and `leadingGap`\n// encodes the chunk pattern (rep gap vs the wide notch that splits drop sub-loads\n// / myo clusters / cluster intra-rests). Set-LEVEL types (pyramid / superset /\n// tempo) belong to the heading, not the strip.\n\n/**\n * A structured strength-training set. Supply as {@link VelocityStripProps.set} to\n * render its set-type encoding; the done-velocity array (used for the mean / loss\n * / zone summary) is derived from the type's velocity fields.\n */\nexport type VelocitySet =\n /** Fixed reps at a fixed load: done reps colored + a grey todo remainder to `planned`. */\n | { type: 'straight'; velocities: number[]; planned?: number }\n /** Bounded reps: committed slots `0..floor`, then a cyan variable window `floor..max`. */\n | { type: 'range'; velocities: number[]; floor: number; max: number }\n /** As-many-reps-as-possible: done reps + a trailing cyan \"continue\" slot that never closes. */\n | { type: 'amrap'; velocities: number[]; target?: number }\n /** Load drops with no rest: each sub-load's reps, split by a WIDE notch gap. */\n | { type: 'drop'; subloads: number[][] }\n /** Rest-pause: an activation chunk + mini-clusters split by WIDE gaps; `open` adds a cyan continue. */\n | { type: 'myo'; activation: number[]; clusters: number[][]; open?: boolean }\n /** Fixed count broken by intra-set rests: reps grouped by `groupSize` with WIDE intra-rest gaps. */\n | { type: 'cluster'; velocities: number[]; groupSize: number; planned?: number }\n\n/** One drawn cell of the strip. `kind` picks the color; `leadingGap` the spacing before it. */\ninterface VelocitySlot {\n kind: 'rep' | 'todo' | 'variable' | 'continue'\n velocity?: number\n leadingGap: number\n}\n\n/** Butted reps carry this gap; chunk boundaries carry {@link WIDE_GAP}. */\nconst REP_GAP = 2\n/**\n * The between-group notch (drop sub-loads / myo clusters / cluster intra-rests): a\n * fixed 8px total gap that reads as a group break without dominating a narrow strip.\n * 4× the rep gap — enough to separate groups at session-rail scale AND wall scale\n * without the notch ballooning at large widths. In the mini variant the container's\n * 2px gap covers part of it, so per-slot margin adds the remaining 6px (2 + 6 = 8).\n */\nconst WIDE_GAP = 8\n\n/** Grey fill for planned-but-unperformed reps (charcoal placeholder, literal hex). */\nconst TODO_COLOR = primitiveColors.charcoal[300]\n/** The thin cyan-800 outline on the open-ended \"continue\" slot — reads as \"keep going\". */\nconst CONTINUE_OUTLINE = primitiveRamps.cyan[800]\n\n/** The done-velocity array a set contributes to the mean / loss / zone summary. */\nfunction deriveDoneVelocities(set: VelocitySet): number[] {\n switch (set.type) {\n case 'drop':\n return set.subloads.flat()\n case 'myo':\n return [...set.activation, ...set.clusters.flat()]\n default:\n return set.velocities\n }\n}\n\n/** Flatten velocity chunks into rep slots, carving a WIDE gap before each chunk but the first. */\nfunction chunkedRepSlots(chunks: number[][]): VelocitySlot[] {\n const slots: VelocitySlot[] = []\n chunks.forEach((chunk) => {\n chunk.forEach((velocity, ri) => {\n const first = slots.length === 0\n slots.push({ kind: 'rep', velocity, leadingGap: first ? 0 : ri === 0 ? WIDE_GAP : REP_GAP })\n })\n })\n return slots\n}\n\n/** Resolve a set to its ordered slot list — the exact vocabulary of the Set Modalities sheet. */\nfunction buildSlots(set: VelocitySet): VelocitySlot[] {\n switch (set.type) {\n case 'straight': {\n const total = Math.max(set.velocities.length, set.planned ?? set.velocities.length)\n return Array.from({ length: total }, (_, i) => {\n const done = i < set.velocities.length\n return {\n kind: done ? 'rep' : 'todo',\n velocity: done ? set.velocities[i] : undefined,\n leadingGap: i === 0 ? 0 : REP_GAP,\n }\n })\n }\n case 'range': {\n const total = Math.max(set.max, set.velocities.length)\n return Array.from({ length: total }, (_, i) => {\n const kind: VelocitySlot['kind'] =\n i < set.velocities.length ? 'rep' : i < set.floor ? 'todo' : 'variable'\n return {\n kind,\n velocity: kind === 'rep' ? set.velocities[i] : undefined,\n leadingGap: i === 0 ? 0 : REP_GAP,\n }\n })\n }\n case 'amrap': {\n const reps = set.velocities.map<VelocitySlot>((velocity, i) => ({\n kind: 'rep',\n velocity,\n leadingGap: i === 0 ? 0 : REP_GAP,\n }))\n reps.push({ kind: 'continue', leadingGap: reps.length === 0 ? 0 : REP_GAP })\n return reps\n }\n case 'drop':\n return chunkedRepSlots(set.subloads)\n case 'myo': {\n const slots = chunkedRepSlots([set.activation, ...set.clusters])\n if (set.open) slots.push({ kind: 'continue', leadingGap: slots.length === 0 ? 0 : REP_GAP })\n return slots\n }\n case 'cluster': {\n const total = Math.max(set.velocities.length, set.planned ?? set.velocities.length)\n return Array.from({ length: total }, (_, i) => {\n const done = i < set.velocities.length\n const boundary = i > 0 && i % set.groupSize === 0\n return {\n kind: done ? 'rep' : 'todo',\n velocity: done ? set.velocities[i] : undefined,\n leadingGap: i === 0 ? 0 : boundary ? WIDE_GAP : REP_GAP,\n }\n })\n }\n }\n}\n\n/** A concise, set-type-aware summary for the strip's accessibility label. */\nfunction setAccessibilityLabel(set: VelocitySet, repCount: number): string {\n switch (set.type) {\n case 'straight':\n return `Velocity strip, straight set, ${repCount} reps`\n case 'range':\n return `Velocity strip, rep-range set, floor ${set.floor} to ${set.max}, ${repCount} reps done`\n case 'amrap':\n return `Velocity strip, AMRAP set, ${repCount} reps and counting`\n case 'drop':\n return `Velocity strip, drop set, ${set.subloads.length} loads, ${repCount} reps`\n case 'myo':\n return `Velocity strip, myo-reps set, ${set.clusters.length} clusters${set.open ? ', open' : ''}, ${repCount} reps`\n case 'cluster':\n return `Velocity strip, cluster set, groups of ${set.groupSize}, ${repCount} reps`\n }\n}\n\n/** Per-slot accessibility label for the expanded set-type bars. */\nfunction slotAccessibilityLabel(slot: VelocitySlot, index: number): string {\n switch (slot.kind) {\n case 'rep':\n return `Rep ${index + 1}: ${formatVelocity(slot.velocity ?? 0)} meters per second`\n case 'todo':\n return `Rep ${index + 1}: planned`\n case 'variable':\n return `Rep ${index + 1}: variable`\n case 'continue':\n return 'Keep going'\n }\n}\n\n/** Straight-set expanded stub height for a planned (todo) rep, as a % of the plot. */\nconst EXPANDED_TODO_STUB_PCT = 16\n/** Expanded height for advanced set-types (drop / myo / cluster / range / amrap): a short mini-style bar. */\nconst EXPANDED_ENCODED_PCT = 45\n\n/** Default framed `expanded` chart height (px). */\nconst EXPANDED_HEIGHT = 60\n/**\n * The `scale=\"fixed\"` velocity ceiling (m/s). `peak` scales to the set's own max\n * (+15% headroom); `fixed` uses this constant so a bar's height reads the same\n * absolute velocity across sets (the spotlight).\n */\nconst FIXED_MAX_VELOCITY = 1.15\n/** Minimum bare-strip bar height (px) — a planned / variable / continue stub, or a near-zero rep. */\nconst BARE_STUB_HEIGHT = 3\n\n// --- Hero variant ------------------------------------------------------------\n// The across-the-room, single-set wall treatment. Absorbs the R2 \"HeroVelocityBars\"\n// candidate into VelocityStrip: tall bars + per-bar value labels + a dashed\n// running-best reference line + dashed placeholders for the reps still to come.\n\n/** Default `hero` plot height (px) — tall enough to read a set's velocity shape across a room. */\nconst HERO_HEIGHT = 220\n/** Vertical band reserved above the tallest bar for its value label (px). */\nconst HERO_LABEL_HEADROOM = 20\n/** Gap between hero bars (px) — a group-notch-free even rhythm at wall scale. */\nconst HERO_BAR_GAP = 8\n/** Cap on a single hero bar's width so a 2–3 rep set doesn't render slab-wide bars (px). */\nconst HERO_BAR_MAX_WIDTH = 120\n/** Below this per-bar width the value labels collide, so all but the peak + live rep are dropped. */\nconst HERO_LABEL_MIN_BAR_WIDTH = 30\n/** Top-corner radius on hero bars (px). */\nconst HERO_BAR_RADIUS = 5\n/** Minimum drawn height of a performed hero bar (px) — a near-zero rep still reads as a rep. */\nconst HERO_MIN_BAR_HEIGHT = 4\n/** Dashed-stub border for a planned-but-unperformed hero rep (charcoal, reads on a dark wall). */\nconst HERO_PENDING_COLOR = primitiveColors.charcoal[100]\n/** The dashed running-best reference line + its label (the lightest charcoal step). */\nconst HERO_REFERENCE_COLOR = primitiveColors.charcoal[0]\n\n/**\n * Headroom above the peak bar: just enough to seat its value label without a big empty\n * band at the top (was 1.15 — too airy for the wall hero).\n */\nconst PEAK_HEADROOM = 1.06\n\n/** The bar-height scaling denominator for the given `scale` (guarded ≥ 0 by callers). */\nfunction scaleDenominator(scale: 'peak' | 'fixed', maxVelocity: number): number {\n return scale === 'fixed' ? FIXED_MAX_VELOCITY : maxVelocity * PEAK_HEADROOM\n}\n\n/** Bare-strip bar height (px): velocity-scaled for a performed rep, a short stub otherwise. */\nfunction bareSlotHeight(slot: VelocitySlot, height: number, denom: number): number {\n if (slot.kind !== 'rep' || denom <= 0) return BARE_STUB_HEIGHT\n const ratio = Math.min(1, (slot.velocity ?? 0) / denom)\n return Math.max(BARE_STUB_HEIGHT, ratio * height)\n}\n\nfunction getReducedMotionPreference(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** Track the OS \"reduce motion\" preference; falls back to `false` (jsdom/SSR). */\nfunction usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(getReducedMotionPreference)\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)')\n const handler = () => setReduced(mq.matches)\n handler()\n mq.addEventListener?.('change', handler)\n return () => mq.removeEventListener?.('change', handler)\n }, [])\n return reduced\n}\n\nconst ANIMATION_DURATION = 400\nconst ANIMATION_EASING = Easing.bezier(0.22, 1, 0.36, 1)\nconst POP_EASING = Easing.bezier(0.34, 1.56, 0.64, 1)\n\n/**\n * The newest-rep entrance shared by the framed `expanded` chart and `hero`: a\n * bounce when the rep is a new set peak, a pop otherwise. Honors reduced motion.\n * Returns the scale `Animated.Value` for the live bar; inert while `active` is\n * false or no live rep is present.\n */\nfunction useLiveRepPop(\n active: boolean,\n liveRepIndex: number | undefined,\n liveVelocity: number | undefined,\n isNewPeak: boolean\n): Animated.Value {\n const prefersReducedMotion = usePrefersReducedMotion()\n const [liveScale] = useState(() => new Animated.Value(1))\n useEffect(() => {\n if (!active || liveRepIndex == null || liveVelocity == null) return\n if (prefersReducedMotion) {\n liveScale.setValue(1)\n return\n }\n if (isNewPeak) {\n liveScale.setValue(1)\n Animated.sequence([\n Animated.timing(liveScale, {\n toValue: 1.25,\n duration: 150,\n easing: Easing.out(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.spring(liveScale, {\n toValue: 1,\n friction: 3,\n tension: 140,\n useNativeDriver: true,\n }),\n ]).start()\n } else {\n liveScale.setValue(0.8)\n Animated.timing(liveScale, {\n toValue: 1,\n duration: 300,\n easing: POP_EASING,\n useNativeDriver: true,\n }).start()\n }\n }, [active, liveRepIndex, liveVelocity, isNewPeak, prefersReducedMotion, liveScale])\n return liveScale\n}\n\ninterface HeroVelocityChartProps {\n /** Performed per-rep mean concentric velocities (m/s). */\n doneVelocities: number[]\n /** Zone → color resolver, shared with the other variants (single-sources the scale). */\n barColorFor: (velocity: number) => string\n /** Bar-height scaling denominator (`peak` set-max or `fixed` ceiling). */\n scaleDenom: number\n /** Running-best velocity (the set peak) — drives the dashed reference line. */\n referenceVelocity: number\n liveRepIndex?: number\n isNewPeak: boolean\n targetReps?: number\n height: number\n className?: string\n viewProps: ViewProps\n}\n\n/**\n * The `hero` render: the across-the-room, single-set wall treatment. Tall bars +\n * a per-bar value label + a dashed running-best reference line + dashed placeholders\n * for the reps still to come. Reuses {@link barColorFor} (zone scale) and the\n * {@link useLiveRepPop} entrance so it stays consistent with the framed chart.\n */\nfunction HeroVelocityChart({\n doneVelocities,\n barColorFor,\n scaleDenom,\n referenceVelocity,\n liveRepIndex,\n isNewPeak,\n targetReps,\n height,\n className,\n viewProps,\n}: HeroVelocityChartProps) {\n const liveVelocity = liveRepIndex != null ? doneVelocities[liveRepIndex] : undefined\n const liveScale = useLiveRepPop(true, liveRepIndex, liveVelocity, isNewPeak)\n\n // Measure the plot so per-bar value labels can thin on a narrow chart (they collide once\n // bars get thin). Width 0 (unmeasured) → show all, so test/server renders are unchanged.\n const [plotW, setPlotW] = useState(0)\n const onPlotLayout = (e: LayoutChangeEvent) => setPlotW(e.nativeEvent.layout.width)\n\n // Reserve a band above the tallest bar for its value label so a peak bar never clips.\n const plotHeight = Math.max(0, height - HERO_LABEL_HEADROOM)\n const barHeight = (velocity: number): number =>\n scaleDenom > 0\n ? Math.max(HERO_MIN_BAR_HEIGHT, Math.min(1, velocity / scaleDenom) * plotHeight)\n : HERO_MIN_BAR_HEIGHT\n\n const pendingCount = Math.max(0, (targetReps ?? 0) - doneVelocities.length)\n const referencePx =\n referenceVelocity > 0 && scaleDenom > 0\n ? Math.min(plotHeight, (referenceVelocity / scaleDenom) * plotHeight)\n : 0\n\n // When bars get too thin, keep only the peak + live-rep labels so the rest don't overlap.\n const totalSlots = doneVelocities.length + pendingCount\n const barWidth =\n plotW > 0 && totalSlots > 0\n ? Math.min(HERO_BAR_MAX_WIDTH, (plotW - HERO_BAR_GAP * (totalSlots - 1)) / totalSlots)\n : HERO_BAR_MAX_WIDTH\n const labelsCrowded = plotW > 0 && barWidth < HERO_LABEL_MIN_BAR_WIDTH\n // Step the inter-bar gap down with the bars so the gaps never dwarf the bars themselves.\n const heroGap =\n plotW === 0 ? HERO_BAR_GAP : barWidth < 16 ? 2 : barWidth < 28 ? 4 : HERO_BAR_GAP\n const peakIndex = doneVelocities.reduce(\n (best, v, i) => (v > doneVelocities[best] ? i : best),\n 0,\n )\n const showBarLabel = (i: number): boolean =>\n !labelsCrowded || i === peakIndex || i === liveRepIndex\n\n const repCount = doneVelocities.length\n const total = Math.max(repCount, targetReps ?? repCount)\n const label =\n referenceVelocity > 0\n ? `Velocity chart, ${repCount} of ${total} reps, best ${formatVelocity(referenceVelocity)} meters per second`\n : `Velocity chart, ${repCount} of ${total} reps`\n\n const { style: externalStyle, ...restProps } = viewProps\n\n return (\n <View\n className={className}\n style={[{ height }, externalStyle]}\n accessibilityRole=\"image\"\n accessibilityLabel={label}\n testID=\"velocity-strip-hero\"\n {...restProps}\n >\n <View\n onLayout={onPlotLayout}\n style={{\n flex: 1,\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: heroGap,\n position: 'relative',\n borderBottomWidth: 2,\n borderBottomColor: HERO_PENDING_COLOR,\n }}\n >\n {/*\n * Running-best reference line. Deliberately unlabeled: it sits at the tallest\n * bar's top, and that bar already displays its velocity as its own value label,\n * so a \"best X.XX\" tag would duplicate it — and would collide with that label\n * whenever the peak bar is on the same side (declines peak-left, ends-on-best\n * peak-right). The line alone reads as \"how far has velocity fallen from best\".\n * The numeric best is in the container's accessibility label.\n */}\n {referencePx > 0 && (\n <View\n accessibilityElementsHidden\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: referencePx,\n borderTopWidth: 1,\n borderStyle: 'dashed',\n borderColor: HERO_REFERENCE_COLOR,\n pointerEvents: 'none',\n }}\n testID=\"velocity-hero-reference\"\n />\n )}\n\n {doneVelocities.map((velocity, i) => {\n const isLive = liveRepIndex === i\n return (\n <View\n key={i}\n accessibilityElementsHidden\n style={{\n flex: 1,\n maxWidth: HERO_BAR_MAX_WIDTH,\n height: '100%',\n alignItems: 'center',\n justifyContent: 'flex-end',\n }}\n >\n {showBarLabel(i) && (\n <Text\n className=\"text-text-primary\"\n style={{ fontSize: 12, fontWeight: '800', marginBottom: 4 }}\n testID={`velocity-label-${i}`}\n >\n {formatVelocity(velocity)}\n </Text>\n )}\n <Animated.View\n style={[\n {\n width: '100%',\n height: barHeight(velocity),\n borderTopLeftRadius: HERO_BAR_RADIUS,\n borderTopRightRadius: HERO_BAR_RADIUS,\n backgroundColor: barColorFor(velocity),\n },\n isLive ? { transform: [{ scale: liveScale }] } : null,\n ]}\n testID={`velocity-bar-${i}`}\n />\n </View>\n )\n })}\n\n {Array.from({ length: pendingCount }, (_, i) => (\n <View\n key={`pending-${i}`}\n accessibilityElementsHidden\n style={{\n flex: 1,\n maxWidth: HERO_BAR_MAX_WIDTH,\n height: '100%',\n alignItems: 'center',\n justifyContent: 'flex-end',\n }}\n >\n <View\n style={{\n width: '100%',\n height: HERO_MIN_BAR_HEIGHT * 3,\n borderWidth: 1,\n borderStyle: 'dashed',\n borderColor: HERO_PENDING_COLOR,\n borderTopLeftRadius: HERO_BAR_RADIUS,\n borderTopRightRadius: HERO_BAR_RADIUS,\n }}\n testID=\"velocity-slot-todo\"\n />\n </View>\n ))}\n </View>\n </View>\n )\n}\n\nexport function VelocityStrip({\n velocities,\n set,\n zones,\n liveRepIndex,\n expanded = true,\n onToggle,\n onRepPress,\n variant = 'expanded',\n height = EXPANDED_HEIGHT,\n targetReps,\n scale = 'peak',\n showNumbers = true,\n showInfo = true,\n className,\n ...props\n}: VelocityStripProps) {\n // A `set` descriptor derives its own done-velocity array; the legacy\n // `velocities` path stays the source of truth otherwise. Every summary calc\n // (mean / loss / zone) runs on this one array so the info row works either way.\n const doneVelocities = set ? deriveDoneVelocities(set) : (velocities ?? [])\n const slots: VelocitySlot[] = set\n ? buildSlots(set)\n : doneVelocities.map((v, i) => ({\n kind: 'rep',\n velocity: v,\n leadingGap: i === 0 ? 0 : REP_GAP,\n }))\n\n const maxVelocity = Math.max(...doneVelocities, 0)\n const meanVelocity = calculateMeanVelocity(doneVelocities)\n const loss = calculateVelocityLoss(doneVelocities)\n\n // The framed chart (raised box, labels, info) vs the bare spotlight strip is the\n // only fork in the `expanded` variant — keyed by whether any chrome is requested.\n const framed = showNumbers || showInfo\n const scaleDenom = scaleDenominator(scale, maxVelocity)\n\n const hasZones = zones != null && zones.length > 0\n const barColorFor = (v: number): string =>\n hasZones ? bandColor(classifyBand(v, zones)!) : zoneHexMap[getVelocityZoneColor(v)]\n const slotColor = (slot: VelocitySlot): string => {\n if (slot.kind === 'rep') return barColorFor(slot.velocity ?? 0)\n if (slot.kind === 'todo') return TODO_COLOR\n return SET_STRIP_VARIABLE_COLOR\n }\n const meanZone = hasZones\n ? (classifyBand(meanVelocity, zones)?.label ?? '')\n : getVelocityZoneName(meanVelocity)\n\n const [heightAnim] = useState(() => new Animated.Value(expanded ? height : 3))\n const [labelOpacity] = useState(() => new Animated.Value(expanded ? 1 : 0))\n const [infoOpacity] = useState(() => new Animated.Value(expanded ? 1 : 0))\n\n // Newest-rep animation: pop for a normal rep, bounce when it sets a new peak.\n const liveVelocity = liveRepIndex != null ? doneVelocities[liveRepIndex] : undefined\n const isNewPeak = liveVelocity != null && maxVelocity > 0 && liveVelocity === maxVelocity\n const liveScale = useLiveRepPop(\n variant === 'expanded' && framed,\n liveRepIndex,\n liveVelocity,\n isNewPeak\n )\n\n useEffect(() => {\n if (variant !== 'expanded' || !framed) return\n\n Animated.parallel([\n Animated.timing(heightAnim, {\n toValue: expanded ? height : 3,\n duration: ANIMATION_DURATION,\n easing: ANIMATION_EASING,\n useNativeDriver: false,\n }),\n Animated.timing(labelOpacity, {\n toValue: expanded ? 1 : 0,\n duration: 300,\n delay: expanded ? 150 : 0,\n useNativeDriver: false,\n }),\n Animated.timing(infoOpacity, {\n toValue: expanded ? 1 : 0,\n duration: 300,\n delay: expanded ? 200 : 0,\n useNativeDriver: false,\n }),\n ]).start()\n }, [expanded, variant, framed, height, heightAnim, labelOpacity, infoOpacity])\n\n // Nothing to draw: neither a legacy velocity array nor a set descriptor.\n if (set == null && velocities == null) return null\n\n const repCount = doneVelocities.length\n const miniLabel = set ? setAccessibilityLabel(set, repCount) : `Velocity strip, ${repCount} reps`\n\n if (variant === 'hero') {\n // Hero's plot is far taller than the expanded chart; apply its own default when\n // the caller left `height` at the shared 60px default.\n const heroHeight = height === EXPANDED_HEIGHT ? HERO_HEIGHT : height\n return (\n <HeroVelocityChart\n doneVelocities={doneVelocities}\n barColorFor={barColorFor}\n scaleDenom={scaleDenom}\n referenceVelocity={maxVelocity}\n liveRepIndex={liveRepIndex}\n isNewPeak={isNewPeak}\n targetReps={targetReps}\n height={heroHeight}\n className={className}\n viewProps={props}\n />\n )\n }\n\n if (variant === 'mini') {\n const { style: externalStyle, ...restProps } = props\n // The container keeps the uniform REP_GAP (so a no-`set` strip is byte-identical\n // to prior releases and holds HTML-parity); per-slot `marginLeft` carries only\n // the EXTRA spacing for the WIDE notch that chunks drop / myo / cluster sets.\n return (\n <View\n className={className}\n style={[\n { flexDirection: 'row', height: 3, gap: REP_GAP, borderRadius: 2, overflow: 'hidden' },\n externalStyle,\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={miniLabel}\n testID=\"velocity-strip-mini\"\n {...restProps}\n >\n {slots.map((slot, i) => (\n <View\n key={i}\n style={{\n flex: 1,\n backgroundColor: slotColor(slot),\n borderRadius: 1,\n minWidth: 4,\n height: '100%' as unknown as number,\n // The container's uniform 2px gap covers rep spacing; a wide slot adds\n // only the EXTRA (WIDE_GAP − REP_GAP) so the notch totals WIDE_GAP.\n marginLeft: Math.max(0, slot.leadingGap - REP_GAP),\n ...(slot.kind === 'continue'\n ? { borderWidth: 1, borderColor: CONTINUE_OUTLINE }\n : {}),\n }}\n accessibilityElementsHidden\n testID={slot.kind === 'rep' ? `velocity-bar-${i}` : `velocity-slot-${slot.kind}`}\n />\n ))}\n </View>\n )\n }\n\n // Bare `expanded` strip (both chrome flags off): the velocity-HEIGHT spotlight —\n // px bar heights, no raised box / labels / info row / animation. Set-type gaps carry\n // over from the slot model exactly as in `mini` (container REP_GAP + per-slot extra\n // for a WIDE notch); planned / variable / continue slots draw as stubs.\n if (!framed) {\n const { style: externalStyle, ...restProps } = props\n return (\n <View\n className={className}\n style={[\n { flexDirection: 'row', height, gap: REP_GAP, alignItems: 'flex-end' },\n externalStyle,\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={miniLabel}\n testID=\"velocity-strip-compact\"\n {...restProps}\n >\n {slots.map((slot, i) => (\n <View\n key={i}\n style={{\n flex: 1,\n minWidth: 4,\n height: bareSlotHeight(slot, height, scaleDenom),\n // Top-rounded to match the framed chart's bars (the \"rounded tops from\n // the numbers one\"); square bottoms since bars sit on the baseline.\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n backgroundColor: slotColor(slot),\n marginLeft: Math.max(0, slot.leadingGap - REP_GAP),\n ...(slot.kind === 'continue'\n ? { borderWidth: 1, borderColor: CONTINUE_OUTLINE }\n : {}),\n }}\n accessibilityElementsHidden\n testID={slot.kind === 'rep' ? `velocity-bar-${i}` : `velocity-slot-${slot.kind}`}\n />\n ))}\n </View>\n )\n }\n\n const stripLabel = set\n ? `${setAccessibilityLabel(set, repCount)}, tap to ${expanded ? 'collapse' : 'expand'}`\n : `Velocity chart for set, ${repCount} reps, tap to ${expanded ? 'collapse' : 'expand'}`\n // When onToggle wraps the strip or individual reps are interactive, the container itself is not a button\n const hasInteractiveContainer = onToggle != null\n const hasInteractiveReps = onRepPress != null && expanded\n\n // Expanded set-type bars: `straight` is the active-set spotlight (velocity-height\n // done reps + short grey planned stubs); the advanced types render as a short,\n // mini-style encoding (the gaps + colors carry identity, height is uniform).\n const setBars =\n set != null &&\n slots.map((slot, i) => {\n const isStraightRep = set.type === 'straight' && slot.kind === 'rep'\n const heightPct = isStraightRep\n ? scaleDenom > 0\n ? Math.round(((slot.velocity ?? 0) / scaleDenom) * 100)\n : 0\n : set.type === 'straight'\n ? EXPANDED_TODO_STUB_PCT\n : EXPANDED_ENCODED_PCT\n return (\n <View\n key={i}\n style={{\n flex: 1,\n height: '100%',\n justifyContent: 'flex-end',\n marginLeft: slot.leadingGap,\n }}\n >\n <View\n style={{\n height: `${heightPct}%`,\n minHeight: 2,\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n backgroundColor: slotColor(slot),\n ...(slot.kind === 'continue'\n ? { borderWidth: 1, borderColor: CONTINUE_OUTLINE }\n : {}),\n }}\n testID={slot.kind === 'rep' ? `velocity-bar-${i}` : `velocity-slot-${slot.kind}`}\n accessibilityRole=\"image\"\n accessibilityLabel={slotAccessibilityLabel(slot, i)}\n />\n </View>\n )\n })\n\n const stripContent = (\n <Animated.View\n className={[className, expanded ? 'bg-surface-raised' : 'bg-transparent']\n .filter(Boolean)\n .join(' ')}\n style={[\n {\n height: heightAnim,\n width: '100%',\n gap: 2,\n borderRadius: expanded ? 6 : 2,\n paddingTop: expanded ? 16 : 0,\n paddingBottom: expanded ? 24 : 0,\n // No horizontal inset — the framed chart's bars span full width, matching\n // the bare spotlight and mini. Numbers/info sit in the vertical padding.\n paddingHorizontal: 0,\n paddingVertical: expanded ? undefined : 8,\n overflow: expanded ? 'visible' : 'hidden',\n },\n ]}\n accessibilityRole={hasInteractiveContainer || hasInteractiveReps ? 'none' : 'button'}\n accessibilityLabel={hasInteractiveContainer || hasInteractiveReps ? undefined : stripLabel}\n testID=\"velocity-strip\"\n {...props}\n >\n <View style={{ flexDirection: 'row', flex: 1, gap: set ? 0 : 2, alignItems: 'flex-end' }}>\n {set\n ? setBars\n : doneVelocities.map((v, i) => {\n const barBackground = barColorFor(v)\n // Guard all-zero velocities (idle / pre-rep): a 0 denominator makes\n // this 0 / 0 === NaN and emits height:'NaN%'. Flatten the bars instead.\n const barHeightPct = scaleDenom > 0 ? Math.round((v / scaleDenom) * 100) : 0\n const isLive = liveRepIndex === i\n const liveLabelSuffix = isLive\n ? isNewPeak\n ? ', latest rep, new set peak'\n : ', latest rep'\n : ''\n\n const barStyle: ViewStyle = expanded\n ? {\n height: `${barHeightPct}%`,\n minHeight: 2,\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n backgroundColor: barBackground,\n }\n : {\n minHeight: '100%' as unknown as number,\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n backgroundColor: barBackground,\n }\n\n const barInner = isLive ? (\n <Animated.View\n style={[barStyle, { transform: [{ scale: liveScale }] }]}\n testID={`velocity-bar-${i}`}\n accessibilityRole=\"image\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second${liveLabelSuffix}`}\n />\n ) : (\n <View\n style={barStyle}\n testID={`velocity-bar-${i}`}\n accessibilityRole=\"image\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second`}\n />\n )\n\n const bar = (\n <View\n key={i}\n style={{\n flex: 1,\n height: '100%',\n justifyContent: 'flex-end',\n position: 'relative',\n }}\n >\n {expanded && showNumbers && (\n <Animated.View\n style={{\n opacity: labelOpacity,\n alignItems: 'center',\n position: 'absolute',\n top: -13,\n left: 0,\n right: 0,\n }}\n accessibilityElementsHidden\n >\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 8, fontWeight: '600' }}\n testID={`velocity-label-${i}`}\n >\n {formatVelocity(v)}\n </Text>\n </Animated.View>\n )}\n {barInner}\n </View>\n )\n\n if (onRepPress && expanded) {\n return (\n <Pressable\n key={i}\n style={{ flex: 1, height: '100%' }}\n onPress={() => onRepPress(i, v)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second, tap for details`}\n testID={`velocity-bar-pressable-${i}`}\n >\n {bar}\n </Pressable>\n )\n }\n\n return bar\n })}\n </View>\n {expanded && showInfo && (\n <Animated.View\n style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n opacity: infoOpacity,\n position: 'absolute',\n bottom: 4,\n left: 6,\n right: 6,\n }}\n testID=\"velocity-info-row\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {meanZone} {'·'} {formatVelocity(meanVelocity)} m/s\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n ...getLossStyle(loss),\n }}\n >\n Loss: {loss}%\n </Text>\n </Animated.View>\n )}\n </Animated.View>\n )\n\n if (onToggle) {\n return (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={stripLabel}\n testID=\"velocity-strip-pressable\"\n >\n {stripContent}\n </Pressable>\n )\n }\n\n return stripContent\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Utility function to merge Tailwind CSS classes with proper conflict resolution.\n * Combines clsx for conditional classes with tailwind-merge for deduplication.\n *\n * @example\n * cn('p-4 bg-red-500', isActive && 'bg-blue-500', className)\n * // If isActive is true, returns 'p-4 bg-blue-500' (not 'p-4 bg-red-500 bg-blue-500')\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nexport interface PlaceholderStripProps extends ViewProps {\n width?: number | string\n /** Render as single solid strip or segmented mini-strip */\n mode?: 'single' | 'segmented'\n /** Number of segments when mode is 'segmented' */\n segments?: number\n className?: string\n}\n\nfunction SingleStrip({\n width,\n className,\n ...props\n}: Omit<PlaceholderStripProps, 'mode' | 'segments'>) {\n return (\n <View\n className={className}\n style={[\n {\n height: 3,\n backgroundColor: WORKOUT_TOKENS.placeholder.fill,\n borderRadius: 2,\n opacity: 0.5,\n },\n width != null ? { width: width as number } : { flex: 1 },\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Planned set, not yet completed\"\n testID=\"placeholder-strip\"\n {...props}\n />\n )\n}\n\nfunction SegmentedStrip({\n segments = 3,\n width,\n className,\n ...props\n}: Omit<PlaceholderStripProps, 'mode'>) {\n return (\n <View\n className={cn('flex-row', className)}\n style={[\n { height: 3, gap: 2, opacity: 0.5 },\n width != null ? { width: width as number } : { flex: 1 },\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Planned set, not yet completed\"\n testID=\"placeholder-strip\"\n {...props}\n >\n {Array.from({ length: segments }, (_, i) => (\n <View\n key={i}\n style={{\n flex: 1,\n height: 3,\n backgroundColor: WORKOUT_TOKENS.placeholder.fill,\n borderRadius: 1,\n minWidth: 4,\n }}\n accessibilityElementsHidden\n testID=\"placeholder-segment\"\n />\n ))}\n </View>\n )\n}\n\nexport function PlaceholderStrip({\n mode = 'single',\n segments,\n ...props\n}: PlaceholderStripProps) {\n if (mode === 'segmented') {\n return <SegmentedStrip segments={segments} {...props} />\n }\n return <SingleStrip {...props} />\n}\n","import type { ReactNode } from 'react'\n\nexport interface IconProps {\n /** Rendered width/height in px (viewBox is fixed 24×24). */\n size?: number\n /** Stroke color (or fill, for solid icons). Defaults to `currentColor` so a wrapper's text token drives it. */\n color?: string\n /** Stroke width for outline icons. */\n strokeWidth?: number\n /** Fill color; defaults to `none` (outline). */\n fill?: string\n /** Accessible title — sets `role=\"img\"` + `<title>`. Omit for a decorative icon (hidden from AT). */\n title?: string\n}\n\nexport interface SvgIconProps extends IconProps {\n children: ReactNode\n}\n\n/**\n * Base SVG wrapper for the titan icon set — a 24×24 web-`<svg>` with the shared\n * accessibility contract (titled → `role=\"img\"` + `<title>`; untitled →\n * `aria-hidden`) and `currentColor` inheritance. Icons pass their paths as\n * children plus their stroke/fill defaults.\n */\nexport function SvgIcon({\n size = 24,\n color = 'currentColor',\n strokeWidth = 2,\n fill = 'none',\n title,\n children,\n}: SvgIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={fill}\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...(title ? { role: 'img', 'aria-label': title } : { 'aria-hidden': true })}\n >\n {title ? <title>{title}</title> : null}\n {children}\n </svg>\n )\n}\n","import { SvgIcon, type IconProps } from './SvgIcon'\n\n/**\n * Voltras brand mark — the ◇ diamond (outline). Pass `fill` for a solid mark.\n */\nexport function VoltrasMark({ size = 14, ...props }: IconProps) {\n return (\n <SvgIcon size={size} {...props}>\n <path d=\"M12 2 22 12 12 22 2 12Z\" />\n </SvgIcon>\n )\n}\n\n/**\n * Bluetooth glyph (stroked) — e.g. device-connection state (color via `currentColor`).\n */\nexport function BluetoothIcon({ size = 18, ...props }: IconProps) {\n return (\n <SvgIcon size={size} {...props}>\n <path d=\"M7 7 17 17 12 22 12 2 17 7 7 17\" />\n </SvgIcon>\n )\n}\n\n/** Dumbbell glyph (mirrors lucide-react `Dumbbell`). Outline-only by default. */\nexport function DumbbellIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M14.4 14.4 9.6 9.6\" />\n <path d=\"M18.657 21.485a2 2 0 1 1-2.829-2.828l-1.767 1.768a2 2 0 1 1-2.829-2.829l6.364-6.364a2 2 0 1 1 2.829 2.829l-1.768 1.767a2 2 0 1 1 2.828 2.829z\" />\n <path d=\"m21.5 21.5-1.4-1.4\" />\n <path d=\"M3.9 3.9 2.5 2.5\" />\n <path d=\"M6.404 12.768a2 2 0 1 1-2.829-2.829l1.768-1.767a2 2 0 1 1-2.828-2.829l2.828-2.828a2 2 0 1 1 2.829 2.828l1.767-1.768a2 2 0 1 1 2.829 2.829z\" />\n </SvgIcon>\n )\n}\n\n/** Star glyph (mirrors lucide-react `Star`). Pass `fill` for a solid star. */\nexport function StarIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </SvgIcon>\n )\n}\n\n/** Activity / pulse-line glyph (mirrors lucide-react `Activity`). Shell S2 nav → Live. */\nexport function ActivityIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </SvgIcon>\n )\n}\n\n/** History / clock-arrow glyph (mirrors lucide-react `History`). Shell S2 nav → Review. */\nexport function HistoryIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M12 7v5l4 2\" />\n </SvgIcon>\n )\n}\n\n/** Layers / stack glyph (mirrors lucide-react `Layers`). Shell S2 nav → Program (mesocycle stack). */\nexport function LayersIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z\" />\n <path d=\"m6.08 9.5-3.49 1.59a1 1 0 0 0 0 1.81l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9a1 1 0 0 0 0-1.83l-3.5-1.59\" />\n <path d=\"m6.08 14.5-3.49 1.59a1 1 0 0 0 0 1.81l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9a1 1 0 0 0 0-1.83l-3.5-1.59\" />\n </SvgIcon>\n )\n}\n\n/** Standing-figure glyph (mirrors lucide-react `PersonStanding`). Shell S2 nav → Body (muscle map). */\nexport function PersonStandingIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <path d=\"m9 20 3-6 3 6\" />\n <path d=\"m6 8 6 2 6-2\" />\n <path d=\"M12 10v4\" />\n </SvgIcon>\n )\n}\n\n/** Balance-scale glyph (mirrors lucide-react `Scale`). ExerciseIndicator → `imbalance`. */\nexport function ScaleIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z\" />\n <path d=\"m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z\" />\n <path d=\"M7 21h10\" />\n <path d=\"M12 3v18\" />\n <path d=\"M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2\" />\n </SvgIcon>\n )\n}\n\n/** Warning-triangle glyph (mirrors lucide-react `AlertTriangle`). ExerciseIndicator → `overshoot`. */\nexport function AlertTriangleIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </SvgIcon>\n )\n}\n\n/** Down-trend glyph (mirrors lucide-react `TrendingDown`). ExerciseIndicator → `velocity-loss`. */\nexport function TrendingDownIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M16 17h6v-6\" />\n <path d=\"m22 17-8.5-8.5-5 5L2 7\" />\n </SvgIcon>\n )\n}\n\n/** Slashed-circle glyph (mirrors lucide-react `CircleSlash`). ExerciseIndicator → `missed-reps`. */\nexport function CircleSlashIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 15 6-6\" />\n </SvgIcon>\n )\n}\n\n/** Medal glyph (mirrors lucide-react `Award`). ExerciseIndicator → `pr`. */\nexport function AwardIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526\" />\n <circle cx=\"12\" cy=\"8\" r=\"6\" />\n </SvgIcon>\n )\n}\n\n/** Info-circle glyph (mirrors lucide-react `Info`). ExerciseIndicator → `info`. */\nexport function InfoIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </SvgIcon>\n )\n}\n","/**\n * Semantic Design Tokens\n *\n * Meaningful tokens following DTCG (Design Tokens Community Group) naming conventions.\n * Pattern: {category}-{intent}-{variant?}-{state?}\n *\n * Categories:\n * - brand-* : Brand colors (primary, secondary, accent)\n * - status-* : Feedback colors (success, error, warning, info)\n * - result-* : Outcome indicators (improve, degrade, inconclusive, neutral)\n * - data-* : Data visualization colors (chart series)\n * - on-* : Text on colored backgrounds\n * - surface-* : Elevated containers (NOT \"paper\")\n * - background-* : Page backgrounds\n * - text-* : Text colors\n * - border-* : Border colors\n * - interactive-* : Hover/focus/active/disabled states\n */\n\nimport {\n primitiveColors as p,\n primitiveRamps as ramp,\n discreteRainbow,\n surfaceRampDark as surf,\n backgroundFrameDark,\n} from './primitives'\n\n// Light mode semantic colors (default)\nexport const semanticColorsLight = {\n // Brand colors (brand-*)\n 'brand-primary': ramp.orange[400],\n 'brand-primary-light': ramp.orange[300],\n 'brand-primary-dark': ramp.orange[500],\n 'brand-primary-subtle': 'rgba(255, 121, 0, 0.08)',\n 'brand-primary-hover': ramp.orange[500],\n 'brand-primary-active': ramp.orange[600],\n\n 'brand-secondary': ramp.cyan[600],\n 'brand-secondary-light': ramp.cyan[500],\n 'brand-secondary-dark': ramp.cyan[700],\n 'brand-secondary-subtle': 'rgba(48, 123, 155, 0.08)',\n 'brand-secondary-hover': ramp.cyan[700],\n 'brand-secondary-active': ramp.cyan[800],\n\n // Text on brand backgrounds (on-*)\n 'on-brand-primary': p.white,\n 'on-brand-secondary': p.white,\n\n // Status colors (status-*)\n 'status-success': ramp.green[300],\n 'status-success-light': ramp.green[200],\n 'status-success-dark': ramp.green[600],\n 'status-success-subtle': ramp.green[50],\n\n // Live-session accent — its OWN role, decoupled from success so the two can diverge\n 'status-live': ramp.green[300],\n 'status-live-muted': ramp.green[500],\n\n 'status-error': ramp.red[600],\n 'status-error-light': ramp.red[500],\n 'status-error-dark': ramp.red[700],\n 'status-error-subtle': ramp.red[50],\n\n 'status-error-vivid': p.redVivid[500], // vivid alert red\n 'status-error-vivid-light': p.redVivid[400],\n 'status-error-vivid-dark': p.redVivid[700],\n 'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',\n\n 'status-warning': ramp.amber[300],\n 'status-warning-light': ramp.amber[200],\n 'status-warning-dark': ramp.amber[500],\n 'status-warning-subtle': ramp.amber[50],\n\n 'status-info': ramp.blue[500],\n 'status-info-light': ramp.blue[300],\n 'status-info-dark': ramp.blue[600],\n 'status-info-subtle': ramp.blue[50],\n\n // Text on status backgrounds (on-status-*)\n 'on-status-success': p.white,\n 'on-status-error': p.white,\n 'on-status-warning': p.white,\n 'on-status-info': p.white,\n\n // Result/outcome indicators (result-*)\n 'result-improve': '#4caf50', // Green - positive outcome\n 'result-improve-light': 'rgba(76, 175, 80, 0.12)',\n 'result-improve-dark': '#248a24',\n 'result-degrade': '#ef5350', // Red - negative outcome\n 'result-degrade-light': 'rgba(239, 83, 80, 0.12)',\n 'result-degrade-dark': '#b30000',\n 'result-inconclusive': '#9E9A97', // Gray - no clear result\n 'result-inconclusive-light': 'rgba(158, 154, 151, 0.12)',\n 'result-neutral': p.neutral[500], // Neutral baseline\n\n // Text on result backgrounds (on-result-*)\n 'on-result-improve': p.white,\n 'on-result-degrade': p.white,\n 'on-result-inconclusive': p.white,\n\n // Data visualization colors (data-*)\n // First 10 colors from discrete rainbow optimized for charts\n 'data-1': discreteRainbow[9], // Blue\n 'data-2': discreteRainbow[14], // Green\n 'data-3': discreteRainbow[17], // Yellow\n 'data-4': discreteRainbow[25], // Red\n 'data-5': discreteRainbow[8], // Purple\n 'data-6': discreteRainbow[20], // Orange\n 'data-7': discreteRainbow[13], // Light Blue\n 'data-8': discreteRainbow[15], // Light Green\n 'data-9': discreteRainbow[3], // Lavender\n 'data-10': discreteRainbow[22], // Dark Orange\n\n // Text colors (text-*)\n 'text-primary': '#121828',\n 'text-secondary': '#65748B',\n 'text-tertiary': p.neutral[400],\n 'text-disabled': 'rgba(55, 65, 81, 0.48)',\n 'text-inverse': p.white,\n 'text-link': p.blue[600],\n 'text-link-hover': p.blue[700],\n\n // Surface colors (surface-*) - for elevated containers\n 'surface-base': p.white,\n 'surface-elevated': p.neutral[50], // slightly off-white for elevated cards\n 'surface-raised': p.neutral[100], // light gray for raised cards\n 'surface-overlay': p.white,\n 'surface-input': p.neutral[50], // Input field background (filled variant)\n // Deepest pressed pit (TD-surface-tokens, S-3) — light-mode counterpart of\n // the dark ramp's `inset` plane; a placeholder pairing, not part of the\n // dark-ramp investigation (surface.contract.test.ts is dark-mode only).\n 'surface-inset': p.neutral[300],\n\n // Background colors (background-*)\n 'background-base': '#EBEBEB',\n 'background-default': p.white,\n 'background-subtle': p.neutral[50],\n // Frame/bezel chrome (TD-surface-tokens, S-3) — top bar + side nav shell,\n // one step below `background-base` (darker still than `surface-inset`\n // above, mirroring the dark-mode ordering). Placeholder pairing for light\n // mode (see dark-mode note on `surface-inset` above).\n 'background-frame': p.neutral[400],\n\n // Border colors (border-*)\n 'border-default': '#E8E9EB',\n 'border-subtle': p.neutral[100],\n 'border-strong': p.neutral[300],\n 'border-prominent': p.neutral[400], // high-visibility divider\n 'border-focus': p.blue[600],\n 'border-input': p.neutral[300], // Input field border\n 'border-input-hover': p.neutral[400], // Input field border on hover\n 'border-input-focus': p.blue[600], // Input field border on focus\n 'border-input-error': p.red[600], // Input field border on error\n\n // Alpha hairline separators (surface-independent — composite toward black on\n // light surfaces, mirroring the dark-mode white-alpha family). See §4/S-2.\n 'hairline-subtle': 'rgba(0, 0, 0, 0.06)',\n 'hairline-default': 'rgba(0, 0, 0, 0.09)',\n 'hairline-strong': 'rgba(0, 0, 0, 0.14)',\n\n // Interactive states (interactive-*)\n 'interactive-hover': 'rgba(55, 65, 81, 0.04)',\n 'interactive-focus': 'rgba(55, 65, 81, 0.12)',\n 'interactive-active': 'rgba(55, 65, 81, 0.16)',\n 'interactive-selected': 'rgba(55, 65, 81, 0.08)',\n 'interactive-disabled': 'rgba(55, 65, 81, 0.12)',\n 'interactive-disabled-text': 'rgba(55, 65, 81, 0.26)',\n\n // Divider\n 'divider': '#E8E9EB',\n\n // Avatar default\n 'avatar-background': p.neutral[500],\n 'avatar-text': p.white,\n} as const\n\n// Dark mode semantic colors\nexport const semanticColorsDark = {\n // Brand colors stay the same in dark mode\n 'brand-primary': ramp.orange[400],\n 'brand-primary-light': ramp.orange[300],\n 'brand-primary-dark': ramp.orange[500],\n 'brand-primary-subtle': 'rgba(255, 121, 0, 0.12)',\n 'brand-primary-hover': ramp.orange[300],\n 'brand-primary-active': ramp.orange[200],\n\n 'brand-secondary': ramp.cyan[600],\n 'brand-secondary-light': ramp.cyan[500],\n 'brand-secondary-dark': ramp.cyan[700],\n 'brand-secondary-subtle': 'rgba(48, 123, 155, 0.12)',\n 'brand-secondary-hover': ramp.cyan[500],\n 'brand-secondary-active': ramp.cyan[400],\n\n // Text on brand backgrounds\n 'on-brand-primary': p.white,\n 'on-brand-secondary': p.white,\n\n // Status colors\n 'status-success': ramp.green[300],\n 'status-success-light': ramp.green[200],\n 'status-success-dark': ramp.green[600],\n 'status-success-subtle': 'rgba(46, 213, 115, 0.12)',\n\n // Live-session accent — its OWN role, decoupled from success so the two can diverge\n 'status-live': ramp.green[300],\n 'status-live-muted': ramp.green[500],\n\n 'status-error': ramp.red[600],\n 'status-error-light': ramp.red[500],\n 'status-error-dark': ramp.red[700],\n 'status-error-subtle': 'rgba(209, 67, 67, 0.12)',\n\n 'status-error-vivid': p.redVivid[500],\n 'status-error-vivid-light': p.redVivid[400],\n 'status-error-vivid-dark': p.redVivid[700],\n 'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',\n\n 'status-warning': ramp.amber[300],\n 'status-warning-light': ramp.amber[200],\n 'status-warning-dark': ramp.amber[500],\n 'status-warning-subtle': 'rgba(249, 180, 21, 0.12)',\n\n 'status-info': ramp.blue[500],\n 'status-info-light': ramp.blue[300],\n 'status-info-dark': ramp.blue[600],\n 'status-info-subtle': 'rgba(33, 150, 243, 0.12)',\n\n // Text on status backgrounds\n 'on-status-success': p.white,\n 'on-status-error': p.white,\n 'on-status-warning': p.white,\n 'on-status-info': p.white,\n\n // Result/outcome indicators (result-*)\n 'result-improve': '#4caf50',\n 'result-improve-light': 'rgba(76, 175, 80, 0.16)',\n 'result-improve-dark': '#248a24',\n 'result-degrade': '#ef5350',\n 'result-degrade-light': 'rgba(239, 83, 80, 0.16)',\n 'result-degrade-dark': '#b30000',\n 'result-inconclusive': '#9E9A97',\n 'result-inconclusive-light': 'rgba(158, 154, 151, 0.16)',\n 'result-neutral': p.neutral[400],\n\n // Text on result backgrounds\n 'on-result-improve': p.white,\n 'on-result-degrade': p.white,\n 'on-result-inconclusive': p.white,\n\n // Data visualization colors (same in dark mode for consistency)\n 'data-1': discreteRainbow[9],\n 'data-2': discreteRainbow[14],\n 'data-3': discreteRainbow[17],\n 'data-4': discreteRainbow[25],\n 'data-5': discreteRainbow[8],\n 'data-6': discreteRainbow[20],\n 'data-7': discreteRainbow[13],\n 'data-8': discreteRainbow[15],\n 'data-9': discreteRainbow[3],\n 'data-10': discreteRainbow[22],\n\n // Text colors - inverted for dark mode\n 'text-primary': p.neutral[100],\n 'text-secondary': p.neutral[400],\n 'text-tertiary': p.neutral[500],\n 'text-disabled': 'rgba(255, 255, 255, 0.38)',\n 'text-inverse': p.neutral[900],\n 'text-link': '#828DF8',\n 'text-link-hover': p.blue[400],\n\n // Surface colors - dark backgrounds — warm-tapered DERIVED ramp (TD-surface-tokens,\n // S-1, re-spaced S-3). Shipped verbatim from `deriveSurfaceRamp()` — see\n // `surfaceRampDark` in primitives.ts for the full derivation note. `surface-overlay`\n // and `surface-elevated` are distinct (were both #191919 pre-S-1); `surface-input`\n // tracks one plane above `surface-base`, same relative position as before the remap.\n // `background-base` backs `Surface level=\"background\"` (SurfaceContext.SURFACE_LEVEL_TOKEN),\n // so it takes the ramp's `background` (shell/frame) role, NOT `inset`. The ramp's\n // deepest `inset` plane is now promoted to `surface-inset` below (S-3) — still no\n // `SurfaceLevel` member for it (follow-up, alongside the elevation.ts -1/-2 pressed\n // levels — parallel workstream, not this branch).\n 'surface-base': surf.base, // main surface (#252321, L*13.5)\n 'surface-elevated': surf.elevated, // elevated surface (#2C2A28, L*17 — nav/rail)\n 'surface-raised': surf.raised, // raised surface (#31302F, L*20 — cards)\n 'surface-overlay': surf.overlay, // overlay surface (#373635, L*22.5 — hero/popover)\n 'surface-input': surf.elevated, // input surface (#2C2A28 — one plane above base)\n 'surface-inset': surf.inset, // deepest pressed pit (#13100D, L*4.5 — sub-shell well)\n\n // Background colors — same ramp, the frame/shell end of it.\n 'background-base': surf.background, // shell / frame (#1C1916, L*9 — Surface level=\"background\")\n 'background-default': surf.base, // main background (#252321, L*13.5 — matches surface-base)\n 'background-subtle': surf.elevated, // subtle background (#2C2A28, L*17 — matches surface-elevated)\n // Frame/bezel chrome (S-3) — the top bar + side nav shell; one step BELOW\n // `background-base`, darker even than `surface-inset` — it exits the content\n // ramp entirely rather than sitting in it. See `backgroundFrameDark` in\n // primitives.ts.\n 'background-frame': backgroundFrameDark, // frame / bezel (#100D0A, L*3.79)\n\n // Border colors — `border-subtle` (#1C1C1C) previously collided with\n // `surface-raised` (also #1C1C1C, an invisible border on raised cards). The\n // re-spaced ramp above moved `surface-raised` to #2D2C2B, so this value is now\n // distinct from every surface hex without needing to change it — see\n // `surface.contract.test.ts` R2/R4.\n 'border-default': p.charcoal[400], // default border\n 'border-subtle': p.charcoal[500], // subtle border\n 'border-strong': p.charcoal[300], // strong border\n 'border-prominent': p.charcoal[200], // high-visibility divider\n 'border-focus': '#828DF8',\n 'border-input': p.neutral[600],\n 'border-input-hover': p.neutral[500],\n 'border-input-focus': '#828DF8',\n 'border-input-error': p.red[500],\n\n // Alpha hairline separators — the primary separation cue (§4/S-2). Self-\n // normalizing: composites toward white by ~the same amount on ANY plane, so\n // one family works at every elevation instead of per-surface border tokens.\n // Shadows are demoted to floating-overlay use only (not shipped as a fill\n // separator here — see elevation.ts, follow-up S-4).\n 'hairline-subtle': 'rgba(255, 255, 255, 0.06)',\n 'hairline-default': 'rgba(255, 255, 255, 0.09)',\n 'hairline-strong': 'rgba(255, 255, 255, 0.14)',\n\n // Interactive states\n 'interactive-hover': 'rgba(255, 255, 255, 0.04)',\n 'interactive-focus': 'rgba(255, 255, 255, 0.12)',\n 'interactive-active': 'rgba(255, 255, 255, 0.16)',\n 'interactive-selected': 'rgba(255, 255, 255, 0.08)',\n 'interactive-disabled': 'rgba(255, 255, 255, 0.12)',\n 'interactive-disabled-text': 'rgba(255, 255, 255, 0.26)',\n\n // Divider\n 'divider': p.charcoal[400], // divider color\n\n // Avatar default\n 'avatar-background': p.neutral[600],\n 'avatar-text': p.white,\n} as const\n\n// Typography tokens matching existing app\nexport const semanticTypography = {\n // Headings (Space Grotesk)\n h1: {\n fontFamily: 'heading',\n fontSize: '3.5rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h2: {\n fontFamily: 'heading',\n fontSize: '3rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h3: {\n fontFamily: 'heading',\n fontSize: '2.25rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h4: {\n fontFamily: 'heading',\n fontSize: '2rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h5: {\n fontFamily: 'heading',\n fontSize: '1.5rem',\n fontWeight: 600,\n lineHeight: 1.375,\n },\n h6: {\n fontFamily: 'heading',\n fontSize: '1.125rem',\n fontWeight: 600,\n lineHeight: 1.375,\n },\n\n // Body text (Nunito Sans)\n body1: {\n fontFamily: 'body',\n fontSize: '1rem',\n fontWeight: 400,\n lineHeight: 1.5,\n },\n body2: {\n fontFamily: 'body',\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: 1.57,\n },\n subtitle1: {\n fontFamily: 'body',\n fontSize: '1rem',\n fontWeight: 500,\n lineHeight: 1.75,\n },\n subtitle2: {\n fontFamily: 'body',\n fontSize: '0.875rem',\n fontWeight: 500,\n lineHeight: 1.57,\n },\n caption: {\n fontFamily: 'body',\n fontSize: '0.75rem',\n fontWeight: 400,\n lineHeight: 1.66,\n },\n overline: {\n fontFamily: 'body',\n fontSize: '0.75rem',\n fontWeight: 600,\n lineHeight: 2.5,\n letterSpacing: '0.5px',\n textTransform: 'uppercase' as const,\n },\n button: {\n fontFamily: 'sans',\n fontSize: '0.875rem',\n fontWeight: 600,\n lineHeight: 1.75,\n },\n} as const\n\n// Button size tokens\nexport const buttonSizes = {\n sm: {\n paddingX: '16px',\n paddingY: '6px',\n fontSize: '0.875rem',\n },\n md: {\n paddingX: '20px',\n paddingY: '8px',\n fontSize: '0.875rem',\n },\n lg: {\n paddingX: '24px',\n paddingY: '11px',\n fontSize: '1rem',\n },\n} as const\n\n// Export type for theme mode\nexport type ThemeMode = 'light' | 'dark'\n\n// Helper to get semantic colors based on mode\nexport function getSemanticColors(mode: ThemeMode) {\n return mode === 'dark' ? semanticColorsDark : semanticColorsLight\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState, type ReactNode } from 'react'\nimport { View, Pressable, Animated, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nexport type BaseBadgeVariant = 'plain' | 'pr'\nexport type BaseBadgeSize = 'sm' | 'md' | 'lg'\n\nexport interface BaseBadgeProps extends ViewProps {\n /** Visual variant — plain (neutral) or pr (brand-primary-subtle) */\n variant?: BaseBadgeVariant\n /** Size variant */\n size?: BaseBadgeSize\n /** Optional icon rendered left of children; hidden from a11y tree */\n icon?: ReactNode\n onPress?: () => void\n className?: string\n children?: ReactNode\n}\n\nexport const baseBadgeSizeConfig: Record<\n BaseBadgeSize,\n { fontSize: number; paddingH: number; paddingV: number; iconSize: number }\n> = {\n sm: { fontSize: 9, paddingH: 6, paddingV: 2, iconSize: 10 },\n md: { fontSize: 10, paddingH: 8, paddingV: 2, iconSize: 12 },\n lg: { fontSize: 12, paddingH: 10, paddingV: 4, iconSize: 14 },\n}\n\nconst variantColors: Record<BaseBadgeVariant, { backgroundColor: string; borderColor: string }> = {\n plain: { backgroundColor: t['surface-raised'], borderColor: '#1F1F1F' },\n pr: {\n backgroundColor: 'rgba(255, 121, 0, 0.12)',\n borderColor: 'rgba(255, 121, 0, 0.3)',\n },\n}\n\nexport function BaseBadge({\n variant = 'plain',\n size = 'md',\n icon,\n onPress,\n className,\n children,\n ...props\n}: BaseBadgeProps) {\n const [scaleAnim] = useState(() => new Animated.Value(1))\n const config = baseBadgeSizeConfig[size]\n const colors = variantColors[variant]\n\n const handlePressIn = () => {\n Animated.timing(scaleAnim, {\n toValue: 0.97,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const handlePressOut = () => {\n Animated.timing(scaleAnim, {\n toValue: 1,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const badge = (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 3,\n // borderRadius 2 is intentional per workout-tokens.ts (squared-off pill)\n borderRadius: 2,\n borderWidth: 1,\n borderColor: colors.borderColor,\n backgroundColor: colors.backgroundColor,\n paddingHorizontal: config.paddingH,\n paddingVertical: config.paddingV,\n }}\n {...props}\n >\n {icon != null && (\n <View accessibilityElementsHidden testID=\"base-badge-icon\">\n {icon}\n </View>\n )}\n {children}\n </View>\n )\n\n if (onPress) {\n return (\n <Animated.View style={{ transform: [{ scale: scaleAnim }] }}>\n <Pressable\n onPress={onPress}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n accessibilityRole=\"button\"\n accessibilityLabel={props.accessibilityLabel}\n testID=\"base-badge-pressable\"\n >\n {badge}\n </Pressable>\n </Animated.View>\n )\n }\n\n return badge\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Animated, Easing, type ViewProps } from 'react-native'\nimport { StarIcon } from './icons'\nimport { BaseBadge } from './BaseBadge'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport type PRType = 'e1rm' | 'weight' | 'reps' | 'volume' | 'velocity'\n\nexport interface PrBadgeProps extends ViewProps {\n /** PR type determines auto-generated label */\n type?: PRType\n /** Display label (e.g., \"PR e1RM\", \"PR 5RM\"). Auto-generated from type if omitted. */\n label?: string\n /** Show only the star icon, no text label */\n compact?: boolean\n /** Trigger pop animation on mount */\n animate?: boolean\n className?: string\n}\n\nconst typeLabels: Record<PRType, string> = {\n e1rm: 'PR e1RM',\n weight: 'PR Weight',\n reps: 'PR Reps',\n volume: 'PR Volume',\n velocity: 'PR Velocity',\n}\n\nexport function PrBadge({\n type = 'e1rm',\n label: labelProp,\n compact = false,\n animate = true,\n className,\n ...props\n}: PrBadgeProps) {\n const resolvedLabel = labelProp ?? typeLabels[type]\n const [scale] = useState(() => new Animated.Value(animate ? 0.8 : 1))\n const [opacity] = useState(() => new Animated.Value(animate ? 0 : 1))\n\n useEffect(() => {\n if (!animate) return\n\n // HTML demo uses a 3-keyframe sequence; bezier approximation is close enough for native\n Animated.parallel([\n Animated.timing(scale, {\n toValue: 1,\n duration: 400,\n easing: Easing.bezier(0.34, 1.56, 0.64, 1),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 400,\n easing: Easing.bezier(0.34, 1.56, 0.64, 1),\n useNativeDriver: true,\n }),\n ]).start()\n }, [animate, scale, opacity])\n\n const badge = compact ? (\n <View\n className={className}\n accessibilityRole=\"image\"\n accessibilityLabel={`Personal record: ${resolvedLabel}`}\n testID=\"pr-badge-star\"\n {...props}\n >\n <StarIcon size={14} color={BRAND_PRIMARY} fill={BRAND_PRIMARY} strokeWidth={2} />\n </View>\n ) : (\n <BaseBadge\n variant=\"pr\"\n className={className}\n accessibilityLabel={`Personal record: ${resolvedLabel}`}\n {...props}\n >\n <Text\n style={{\n fontSize: 12,\n color: BRAND_PRIMARY,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {'\\u2605'} {resolvedLabel}\n </Text>\n </BaseBadge>\n )\n\n if (animate) {\n return (\n <Animated.View\n style={{ transform: [{ scale }], opacity }}\n testID=\"pr-badge-animated\"\n >\n {badge}\n </Animated.View>\n )\n }\n\n return badge\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { type ReactNode } from 'react'\nimport { View, Text } from 'react-native'\nimport { VelocityStrip, type VelocityZoneBandProp } from './VelocityStrip'\nimport { roundWeight, roundRpe } from '../../../utils/workout-format'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nexport type SetRowUnit = 'lbs' | 'kg'\n\n/** A set's lifecycle: logged (`done`), being performed now (`live`), or planned (`todo`). */\nexport type SetRowState = 'done' | 'live' | 'todo'\n\ninterface SetRowBase {\n setNumber: number\n unit: SetRowUnit\n /** Optional set-type marker (e.g. \"DROP\", \"AMRAP\") shown in the SET cell. */\n setType?: string\n /** Optional velocity-zone bands (WA `VelocityZones.bands`); default scale when absent. */\n velocityZones?: readonly VelocityZoneBandProp[]\n}\n\n/**\n * One row of the unified expanded exercise table (SET · REPS · LBS · RPE + a\n * per-row velocity strip), as a lifecycle discriminated union:\n * - `done` — a logged set: recorded reps / weight / rpe, a flat `mini` strip.\n * - `live` — performed right now: shows its TARGET (never \"reps-done/target\"),\n * stands out by brightness, and a compact velocity-HEIGHT spotlight strip.\n * - `todo` — planned: shows its target, muted, a flat grey `mini` stub strip.\n *\n * `done` + `todo` share ONE muted treatment; only `live` is brightened. There is\n * no PREV column (dropped in the unified design).\n */\nexport type SetRowProps =\n | (SetRowBase & {\n state: 'done'\n reps: number\n weight: number\n rpe?: number | null\n /** Per-rep MEAN concentric velocities (m/s). */\n velocities: number[]\n })\n | (SetRowBase & {\n state: 'live'\n /** The prescribed target shown in the REPS / LBS cells (no live \"5/10\"). */\n target: { reps: number; weight: number }\n /** Reps / weight committed so far (available to hosts; the display shows `target`). */\n reps: number\n weight: number\n rpe?: number | null\n /** Per-rep MEAN concentric velocities logged so far this set. */\n velocities: number[]\n /** Newest rep index — reserved; the compact spotlight strip is static. */\n liveRepIndex?: number\n })\n | (SetRowBase & {\n state: 'todo'\n /** The prescribed target shown in the REPS / LBS cells. */\n target: { reps: number; weight: number }\n /** Planned rep count backing the grey stub strip. Default `target.reps`. */\n planned?: number\n })\n\nconst DARK = getSemanticColors('dark')\n/** Live set — brightest (neutral 100). Done + upcoming share the muted neutral 400. */\nconst TEXT_ACTIVE = DARK['text-primary']\nconst TEXT_MUTED = DARK['text-secondary']\n\n/** Column widths mirror SetTableHeader(showPrevious=false) so cells align under it. */\nconst COL = { set: 36, reps: 44, load: 56, rpe: 36 } as const\nconst cellText = { fontFamily: 'Inter, sans-serif', fontSize: 13, fontWeight: '600' as const }\nconst typeBadge = {\n fontSize: 10,\n fontWeight: '700' as const,\n fontFamily: 'Inter, sans-serif',\n color: WORKOUT_TOKENS.scale.orange,\n backgroundColor: 'rgba(255,165,2,0.12)',\n paddingVertical: 1,\n paddingHorizontal: 5,\n borderRadius: 3,\n overflow: 'hidden' as const,\n}\n\n/** Reps to show: recorded for a `done` set, else the prescribed target. */\nfunction displayReps(set: SetRowProps): number {\n return set.state === 'done' ? set.reps : set.target.reps\n}\n\nfunction displayWeight(set: SetRowProps): number {\n return set.state === 'done' ? set.weight : set.target.weight\n}\n\n/** Planned rep count backing the row's strip. */\nfunction plannedReps(set: SetRowProps): number {\n if (set.state === 'done') return set.velocities.length\n if (set.state === 'live') return set.target.reps\n return set.planned ?? set.target.reps\n}\n\nfunction accessibilityLabel(set: SetRowProps): string {\n const base = `Set ${set.setNumber}: ${displayReps(set)} reps at ${roundWeight(displayWeight(set))} ${set.unit}`\n if (set.state === 'live') return `${base}, in progress`\n if (set.state === 'todo') return `${base}, upcoming`\n return base\n}\n\nfunction Cell({\n width,\n children,\n testID,\n}: {\n width: number\n children: ReactNode\n testID?: string\n}) {\n return (\n <View style={{ width, alignItems: 'center', justifyContent: 'center' }} testID={testID}>\n {children}\n </View>\n )\n}\n\n/** The per-row velocity strip: compact spotlight for the live set, flat mini otherwise. */\nfunction RowStrip({ set }: { set: SetRowProps }) {\n const zones = set.velocityZones\n if (set.state === 'live') {\n // The active-set spotlight: the bare velocity-height `expanded` chart at 24px,\n // fixed scale, no labels / info (both chrome flags off → the bare strip).\n return (\n <VelocityStrip\n variant=\"expanded\"\n showNumbers={false}\n showInfo={false}\n height={24}\n scale=\"fixed\"\n set={{ type: 'straight', velocities: set.velocities, planned: set.target.reps }}\n zones={zones}\n />\n )\n }\n const velocities = set.state === 'done' ? set.velocities : []\n return (\n <VelocityStrip\n variant=\"mini\"\n set={{ type: 'straight', velocities, planned: plannedReps(set) }}\n zones={zones}\n />\n )\n}\n\n/**\n * ONE set row of the unified expanded exercise table. SET · REPS · LBS · RPE over\n * a per-row {@link VelocityStrip}; `live` stands out by brightness with a compact\n * velocity-height spotlight, `done`/`todo` are muted with a flat mini strip. Its\n * column widths mirror {@link SetTableHeader}(`showPrevious={false}`).\n */\nexport function SetRow(set: SetRowProps) {\n const live = set.state === 'live'\n const valueColor = live ? TEXT_ACTIVE : TEXT_MUTED\n const rpe = set.state === 'todo' ? null : set.rpe\n\n return (\n <View\n style={{ paddingVertical: 6, paddingHorizontal: 8 }}\n accessibilityLabel={accessibilityLabel(set)}\n testID=\"set-row\"\n >\n <View className=\"flex-row items-center\" style={{ justifyContent: 'space-between' }}>\n <Cell width={COL.set} testID=\"set-row-set-number\">\n {set.setType ? (\n <Text style={typeBadge} testID=\"set-row-type-badge\">\n {set.setType}\n </Text>\n ) : (\n <Text style={{ ...cellText, color: valueColor, fontWeight: live ? '700' : '600' }}>\n {set.setNumber}\n </Text>\n )}\n </Cell>\n <Cell width={COL.reps} testID=\"set-row-reps\">\n <Text style={{ ...cellText, color: valueColor }}>{displayReps(set)}</Text>\n </Cell>\n <Cell width={COL.load} testID=\"set-row-weight\">\n <Text style={{ ...cellText, color: valueColor }}>{roundWeight(displayWeight(set))}</Text>\n </Cell>\n <Cell width={COL.rpe} testID=\"set-row-rpe\">\n <Text style={{ ...cellText, color: TEXT_MUTED }}>\n {rpe != null ? roundRpe(rpe) : '—'}\n </Text>\n </Cell>\n </View>\n <View style={{ marginTop: live ? 6 : 4 }} testID=\"set-row-strip\">\n <RowStrip set={set} />\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text } from 'react-native'\n\n// One header column: its label and its fixed width (PREV is the lone flex column,\n// `undefined`). Order + widths mirror SetRow's cells so headers align over rows.\ntype Column = { label: string; width: number | undefined }\n\nexport interface SetTableHeaderProps {\n /** Weight-column label: LBS / KG. Default lbs. */\n unit?: 'lbs' | 'kg'\n /** Show the PREV (previous-best) column. Default true; false drops it for rail density. */\n showPrevious?: boolean\n /** Overridable so a host card can keep its own testID. Default \"table-header\". */\n testID?: string\n}\n\n// The previous-best column is the lone flex column (`undefined` width). When hidden\n// it is dropped entirely (not blanked to a spacer) and the four fixed columns\n// distribute across the full strip width via `justifyContent: space-between`.\nconst PREV_COLUMN: Column = { label: 'PREV', width: undefined }\n\n/** Columns in order, with the weight column reflecting `unit`; PREV dropped when hidden. */\nfunction buildColumns(unit: 'lbs' | 'kg', showPrevious: boolean): Column[] {\n return [\n { label: 'SET', width: 36 },\n ...(showPrevious ? [PREV_COLUMN] : []),\n { label: 'REPS', width: 44 },\n { label: unit.toUpperCase(), width: 56 },\n { label: 'RPE', width: 36 },\n ]\n}\n\n/**\n * The expanded-set-table column-header row: SET · PREV · REPS · LOAD · RPE, with\n * the weight column reflecting `unit`. `showPrevious={false}` drops PREV (rail\n * density). Its per-column widths mirror {@link SetRow} so headers align over the\n * rows. Extracted from {@link ExerciseCard}'s expanded state for reuse.\n */\nexport function SetTableHeader({\n unit = 'lbs',\n showPrevious = true,\n testID = 'table-header',\n}: SetTableHeaderProps) {\n const columns = buildColumns(unit, showPrevious)\n\n return (\n <View\n className=\"flex-row\"\n style={{\n paddingVertical: 8,\n paddingHorizontal: 8,\n paddingBottom: 4,\n ...(showPrevious ? {} : { justifyContent: 'space-between' }),\n }}\n testID={testID}\n >\n {columns.map(({ label, width }) => {\n const isFlex = width === undefined\n\n return (\n <View\n key={label}\n style={{\n ...(isFlex ? { minWidth: 44 } : { width, flexShrink: 1 }),\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n }}\n {...(isFlex ? { className: 'flex-1' } : {})}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontWeight: '600',\n fontFamily: 'Inter, sans-serif',\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n }}\n >\n {label}\n </Text>\n </View>\n )\n })}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport type { ReactNode } from 'react'\nimport { Text } from 'react-native'\n\n/**\n * Shared \"segmented metric\" typography primitive — the Inter · 600 · letter-spacing 1\n * value/separator cell used by both {@link TempoDisplay} (tempo digits + dashes) and\n * {@link SetsRepsLoad} (sets × reps @ load). Extracted so the two read as one visual\n * language instead of drifting copies.\n */\nexport const METRIC_FONT = 'Inter, sans-serif'\n\nexport interface MetricCellProps {\n children: ReactNode\n /** Cell text color — value cells take a primary color, separators a muted one. */\n color: string\n fontSize?: number\n}\n\nexport function MetricCell({ children, color, fontSize = 11 }: MetricCellProps) {\n return (\n <Text\n style={{\n fontFamily: METRIC_FONT,\n fontSize,\n color,\n fontWeight: '600',\n letterSpacing: 1,\n }}\n >\n {children}\n </Text>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { MetricCell } from './metricText'\n\nconst t = getSemanticColors('dark')\n\nconst TIMES = '×' // × multiplication sign, padded by muted separators\nconst AT = '@'\n\nexport interface SetsRepsLoadProps extends ViewProps {\n sets: number\n reps: number | string\n /** Load value; a string (e.g. \"—\") passes through verbatim for an unset/discovery load. */\n load: number | string\n /** Displayed load unit label (e.g. \"lb\", \"kg\"). */\n unit?: string\n /** Cell font size (px). Default 11 — the compact rail/card scale. Raise for a wall read-out. */\n fontSize?: number\n className?: string\n}\n\n/**\n * The `sets × reps @ load` prescription line, in the TempoDisplay visual language\n * (Inter · 600 · letter-spacing 1 · value cells with muted `×` / `@` separators).\n * Shares the {@link MetricCell} primitive with TempoDisplay so the two stay in step.\n */\nexport function SetsRepsLoad({\n sets,\n reps,\n load,\n unit = 'lb',\n fontSize,\n className,\n ...props\n}: SetsRepsLoadProps) {\n const value = t['text-primary']\n const sep = t['text-tertiary']\n\n return (\n <View\n className={className}\n style={{ flexDirection: 'row', alignItems: 'baseline' }}\n accessibilityLabel={`${sets} sets of ${reps} reps at ${load} ${unit}`}\n testID=\"sets-reps-load\"\n {...props}\n >\n <MetricCell color={value} fontSize={fontSize}>\n {sets}\n </MetricCell>\n <MetricCell color={sep} fontSize={fontSize}>{` ${TIMES} `}</MetricCell>\n <MetricCell color={value} fontSize={fontSize}>\n {reps}\n </MetricCell>\n <MetricCell color={sep} fontSize={fontSize}>{` ${AT} `}</MetricCell>\n <MetricCell color={value} fontSize={fontSize}>\n {load}\n </MetricCell>\n <MetricCell color={sep} fontSize={fontSize}>{` ${unit}`}</MetricCell>\n </View>\n )\n}\n","/**\n * Neumorphic Shadow Utilities\n * \n * Neumorphism creates soft, extruded UI using dual opposing shadows.\n * - Light source assumed from top-left\n * - Raised elements: dark shadow bottom-right, light highlight top-left\n * - Pressed elements: inverted with `inset` shadows\n */\n\nimport { Platform, type ViewStyle } from 'react-native'\n\n// ============================================================================\n// Color Math Utilities\n// ============================================================================\n\n/**\n * Parse a hex color to RGB values (0-255).\n * Supports both #RGB and #RRGGBB formats.\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const cleaned = hex.replace('#', '')\n \n let r: number, g: number, b: number\n \n if (cleaned.length === 3) {\n r = parseInt(cleaned[0] + cleaned[0], 16)\n g = parseInt(cleaned[1] + cleaned[1], 16)\n b = parseInt(cleaned[2] + cleaned[2], 16)\n } else if (cleaned.length === 6) {\n r = parseInt(cleaned.slice(0, 2), 16)\n g = parseInt(cleaned.slice(2, 4), 16)\n b = parseInt(cleaned.slice(4, 6), 16)\n } else {\n return null\n }\n \n return { r, g, b }\n}\n\n/**\n * Convert RGB (0-255) to HSV (h: 0-360, s: 0-1, v: 0-1).\n */\nexport function rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n const rNorm = r / 255\n const gNorm = g / 255\n const bNorm = b / 255\n \n const max = Math.max(rNorm, gNorm, bNorm)\n const min = Math.min(rNorm, gNorm, bNorm)\n const delta = max - min\n \n // Value\n const v = max\n \n // Saturation\n const s = max === 0 ? 0 : delta / max\n \n // Hue\n let h = 0\n if (delta !== 0) {\n if (max === rNorm) {\n h = 60 * (((gNorm - bNorm) / delta) % 6)\n } else if (max === gNorm) {\n h = 60 * ((bNorm - rNorm) / delta + 2)\n } else {\n h = 60 * ((rNorm - gNorm) / delta + 4)\n }\n }\n if (h < 0) h += 360\n \n return { h, s, v }\n}\n\n/**\n * Convert HSV (h: 0-360, s: 0-1, v: 0-1) to RGB (0-255).\n */\nexport function hsvToRgb(h: number, s: number, v: number): { r: number; g: number; b: number } {\n const c = v * s\n const x = c * (1 - Math.abs((h / 60) % 2 - 1))\n const m = v - c\n \n let rPrime: number, gPrime: number, bPrime: number\n\n if (h >= 0 && h < 60) {\n rPrime = c; gPrime = x; bPrime = 0\n } else if (h >= 60 && h < 120) {\n rPrime = x; gPrime = c; bPrime = 0\n } else if (h >= 120 && h < 180) {\n rPrime = 0; gPrime = c; bPrime = x\n } else if (h >= 180 && h < 240) {\n rPrime = 0; gPrime = x; bPrime = c\n } else if (h >= 240 && h < 300) {\n rPrime = x; gPrime = 0; bPrime = c\n } else {\n rPrime = c; gPrime = 0; bPrime = x\n }\n \n return {\n r: Math.round((rPrime + m) * 255),\n g: Math.round((gPrime + m) * 255),\n b: Math.round((bPrime + m) * 255),\n }\n}\n\n/**\n * Convert RGB values to hex string.\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const toHex = (n: number) => {\n const clamped = Math.max(0, Math.min(255, Math.round(n)))\n return clamped.toString(16).padStart(2, '0')\n }\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`\n}\n\n/**\n * Lighten a color by increasing its HSV Value component.\n * \n * @param hex - The hex color to lighten\n * @param amount - Amount to increase V by (0-1)\n */\nexport function lighten(hex: string, amount: number = 0.1): string {\n const rgb = hexToRgb(hex)\n if (!rgb) return hex\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const newV = Math.min(1, hsv.v + amount)\n \n const newRgb = hsvToRgb(hsv.h, hsv.s, newV)\n return rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n}\n\n/**\n * Darken a color by decreasing its HSV Value component.\n * \n * @param hex - The hex color to darken\n * @param amount - Amount to decrease V by (0-1)\n */\nexport function darken(hex: string, amount: number = 0.1): string {\n const rgb = hexToRgb(hex)\n if (!rgb) return hex\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const newV = Math.max(0, hsv.v - amount)\n \n const newRgb = hsvToRgb(hsv.h, hsv.s, newV)\n return rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n}\n\n/**\n * Get hover colors for a button based on its background color.\n * Automatically adapts intensity based on the color's luminance.\n * \n * @param bgColor - The button's background color (hex)\n * @param intensity - How strong the hover effect should be ('subtle' | 'medium' | 'strong')\n */\nexport function getHoverColors(\n bgColor: string, \n intensity: 'subtle' | 'medium' | 'strong' = 'medium'\n): { raised: string; pressed: string } {\n const amounts = {\n subtle: 0.01,\n medium: 0.02,\n strong: 0.03,\n }\n \n const amount = amounts[intensity]\n \n return {\n raised: lighten(bgColor, amount), // Raised hover: lighten (lifting up)\n pressed: darken(bgColor, amount), // Pressed hover: darken (pressing down)\n }\n}\n\n/**\n * Check if a color is considered \"dark\" (for choosing text color).\n * Uses HSV Value component for simplicity.\n */\nexport function isDark(hex: string): boolean {\n const rgb = hexToRgb(hex)\n if (!rgb) return true\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n return hsv.v < 0.6\n}\n\n/**\n * Shadow configuration for different surface colors.\n * Each surface needs calibrated light/dark shadow colors.\n * \n * - dark: soft shadow for depth (bottom-right)\n * - light: sharp rim highlight (top-left) - higher opacity for crisp edge\n * - darker: deeper shadow for pressed/inset states\n */\nexport const shadowColors = {\n // For charcoal surfaces (~#2C2C2C to #3C3C3C)\n charcoal: {\n dark: 'rgba(0, 0, 0, 0.5)',\n light: 'rgba(255, 255, 255, 0.12)', // brighter for crisp rim light\n darker: 'rgba(0, 0, 0, 0.6)',\n },\n // For neutral dark surfaces (~#1F2937)\n neutralDark: {\n dark: 'rgba(0, 0, 0, 0.4)',\n light: 'rgba(255, 255, 255, 0.08)',\n darker: 'rgba(0, 0, 0, 0.5)',\n },\n // For light surfaces (white/light gray backgrounds)\n neutralLight: {\n dark: 'rgba(0, 0, 0, 0.15)', // Visible dark shadow for depth on light backgrounds\n light: 'rgba(255, 255, 255, 1)', // Bright highlight for raised effect (visible on light gray)\n darker: 'rgba(0, 0, 0, 0.2)', // Deeper shadow for pressed states\n },\n}\n\nexport type ShadowIntensity = 'subtle' | 'medium' | 'strong'\nexport type ShadowSurface = keyof typeof shadowColors\n\ninterface ShadowConfig {\n offset: number\n blur: number\n}\n\nconst intensityConfig: Record<ShadowIntensity, ShadowConfig> = {\n subtle: { offset: 1, blur: 2 }, // very light, barely visible\n medium: { offset: 2, blur: 4 }, // noticeable but restrained\n strong: { offset: 2, blur: 5 }, // slightly deeper blur, same offset as medium\n}\n\n/**\n * Creates a raised (elevated) neumorphic shadow.\n * Element appears to float above the surface.\n * \n * Uses a soft dark shadow (bottom-right) and a sharp rim light (top-left).\n */\nexport function createRaisedShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Rim light is sharper: same offset as shadow, but minimal blur for crisp edge\n const rimBlur = 1 // Very tight blur for crisp rim\n \n return Platform.select({\n web: {\n boxShadow: `${offset}px ${offset}px ${blur}px ${colors.dark}, -${offset}px -${offset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n // React Native shadow approximation (limited compared to web)\n shadowColor: '#000',\n shadowOffset: { width: offset, height: offset },\n shadowOpacity: 0.3,\n shadowRadius: blur / 2,\n elevation: offset,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a pressed (inset) neumorphic shadow.\n * Element appears pushed into the surface.\n * \n * Uses a soft dark inset shadow (top-left) and a thin sharp rim light (bottom-right).\n */\nexport function createPressedShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Rim light is always thin and subtle for pressed states\n const rimOffset = 1 // Fixed thin rim\n const rimBlur = 1 // Very tight blur for crisp edge\n \n return Platform.select({\n web: {\n boxShadow: `inset ${offset}px ${offset}px ${blur}px ${colors.darker}, inset -${rimOffset}px -${rimOffset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n // React Native doesn't support inset shadows, approximate with darker bg\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a flat (no shadow) style for hover states.\n */\nexport function createFlatShadow(): ViewStyle {\n return Platform.select({\n web: {\n boxShadow: 'none',\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a hover shadow for raised elements.\n * Reduces shadow depth but keeps a subtle rim light to maintain visual boundary.\n */\nexport function createRaisedHoverShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Reduce shadow depth by half for hover, keep minimal rim light\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n const rimBlur = 1\n \n return Platform.select({\n web: {\n // Keep same offsets as normal state for rim to prevent \"shrinking\" effect\n boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${colors.dark}, -${offset}px -${offset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: hoverOffset, height: hoverOffset },\n shadowOpacity: 0.2,\n shadowRadius: hoverBlur / 2,\n elevation: hoverOffset,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a hover shadow for pressed elements.\n * Reduces shadow depth but keeps a subtle rim light to maintain visual boundary.\n */\nexport function createPressedHoverShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Reduce shadow depth by half for hover, keep minimal rim light\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n const rimBlur = 1\n \n return Platform.select({\n web: {\n // Keep rim offset at 1px (same as pressed normal) to prevent \"shrinking\" effect\n boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${colors.darker}, inset -1px -1px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Pre-built shadow presets for common use cases.\n */\nexport const neumorphicShadows = {\n // Charcoal surface shadows (for dark toolbars, cards)\n charcoal: {\n raised: {\n subtle: createRaisedShadow('charcoal', 'subtle'),\n medium: createRaisedShadow('charcoal', 'medium'),\n strong: createRaisedShadow('charcoal', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('charcoal', 'subtle'),\n medium: createRaisedHoverShadow('charcoal', 'medium'),\n strong: createRaisedHoverShadow('charcoal', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('charcoal', 'subtle'),\n medium: createPressedShadow('charcoal', 'medium'),\n strong: createPressedShadow('charcoal', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('charcoal', 'subtle'),\n medium: createPressedHoverShadow('charcoal', 'medium'),\n strong: createPressedHoverShadow('charcoal', 'strong'),\n },\n flat: createFlatShadow(),\n },\n // Neutral dark surface shadows\n neutralDark: {\n raised: {\n subtle: createRaisedShadow('neutralDark', 'subtle'),\n medium: createRaisedShadow('neutralDark', 'medium'),\n strong: createRaisedShadow('neutralDark', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('neutralDark', 'subtle'),\n medium: createRaisedHoverShadow('neutralDark', 'medium'),\n strong: createRaisedHoverShadow('neutralDark', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('neutralDark', 'subtle'),\n medium: createPressedShadow('neutralDark', 'medium'),\n strong: createPressedShadow('neutralDark', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('neutralDark', 'subtle'),\n medium: createPressedHoverShadow('neutralDark', 'medium'),\n strong: createPressedHoverShadow('neutralDark', 'strong'),\n },\n flat: createFlatShadow(),\n },\n // Neutral light surface shadows\n neutralLight: {\n raised: {\n subtle: createRaisedShadow('neutralLight', 'subtle'),\n medium: createRaisedShadow('neutralLight', 'medium'),\n strong: createRaisedShadow('neutralLight', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('neutralLight', 'subtle'),\n medium: createRaisedHoverShadow('neutralLight', 'medium'),\n strong: createRaisedHoverShadow('neutralLight', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('neutralLight', 'subtle'),\n medium: createPressedShadow('neutralLight', 'medium'),\n strong: createPressedShadow('neutralLight', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('neutralLight', 'subtle'),\n medium: createPressedHoverShadow('neutralLight', 'medium'),\n strong: createPressedHoverShadow('neutralLight', 'strong'),\n },\n flat: createFlatShadow(),\n },\n}\n","/**\n * Color utility functions for the design system\n *\n * lighten/darken are re-exported from shadows.ts which uses HSV-based\n * color math for more perceptually consistent results across hues.\n */\n\nexport { lighten, darken } from '../theme/shadows'\n\nexport type StatusType = 'success' | 'error' | 'warning' | 'info'\nexport type ResultType = 'improve' | 'degrade' | 'inconclusive' | 'neutral'\n\n/**\n * Get the semantic color token for a status type.\n *\n * @param status - The status type\n * @returns The CSS variable reference for the status color\n *\n * @example\n * const color = getStatusColor('success') // 'var(--color-status-success)'\n */\nexport function getStatusColor(status: StatusType): string {\n return `var(--color-status-${status})`\n}\n\n/**\n * Get the semantic color token for a result type.\n *\n * @param result - The result type\n * @returns The CSS variable reference for the result color\n *\n * @example\n * const color = getResultColor('improve') // 'var(--color-result-improve)'\n */\nexport function getResultColor(result: ResultType): string {\n return `var(--color-result-${result})`\n}\n\n/**\n * Apply alpha/opacity to a color.\n * Works with hex colors and rgb values.\n *\n * @param color - The color value (hex or rgb)\n * @param opacity - Opacity value between 0 and 1\n * @returns The color with alpha applied\n *\n * @example\n * alpha('#5048E5', 0.5) // 'rgba(80, 72, 229, 0.5)'\n * alpha('rgb(80, 72, 229)', 0.5) // 'rgba(80, 72, 229, 0.5)'\n */\nexport function alpha(color: string, opacity: number): string {\n // Clamp opacity between 0 and 1\n const clampedOpacity = Math.max(0, Math.min(1, opacity))\n\n // Handle hex colors\n if (color.startsWith('#')) {\n const hex = color.slice(1)\n let r: number, g: number, b: number\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16)\n g = parseInt(hex[1] + hex[1], 16)\n b = parseInt(hex[2] + hex[2], 16)\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16)\n g = parseInt(hex.slice(2, 4), 16)\n b = parseInt(hex.slice(4, 6), 16)\n } else {\n return color\n }\n\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n // Handle rgb colors\n const rgbMatch = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/)\n if (rgbMatch) {\n const [, r, g, b] = rgbMatch\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n // Handle rgba colors - replace the alpha value\n const rgbaMatch = color.match(/rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*[\\d.]+\\)/)\n if (rgbaMatch) {\n const [, r, g, b] = rgbaMatch\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n return color\n}\n\n/**\n * Determine if a color is light or dark.\n * Useful for determining text color contrast.\n *\n * @param color - Hex color value\n * @returns 'light' or 'dark'\n *\n * @example\n * getLuminance('#FFFFFF') // 'light'\n * getLuminance('#000000') // 'dark'\n */\nexport function getLuminance(color: string): 'light' | 'dark' {\n if (!color.startsWith('#')) return 'dark'\n\n const hex = color.slice(1)\n let r: number, g: number, b: number\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16)\n g = parseInt(hex[1] + hex[1], 16)\n b = parseInt(hex[2] + hex[2], 16)\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16)\n g = parseInt(hex.slice(2, 4), 16)\n b = parseInt(hex.slice(4, 6), 16)\n } else {\n return 'dark'\n }\n\n // Calculate relative luminance using sRGB\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n\n return luminance > 0.5 ? 'light' : 'dark'\n}\n\n/**\n * Get a contrasting text color for a given background.\n *\n * @param backgroundColor - The background color (hex)\n * @returns 'white' or 'black' for contrast\n *\n * @example\n * getContrastText('#5048E5') // 'white'\n * getContrastText('#FFFFFF') // 'black'\n */\nexport function getContrastText(backgroundColor: string): string {\n return getLuminance(backgroundColor) === 'light' ? '#000000' : '#FFFFFF'\n}\n\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState, useCallback } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { roundTempo } from '../../../utils/workout-format'\nimport { alpha } from '../../../utils/colors'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { primitiveRamps } from '../../../theme/tokens/primitives'\nimport { MetricCell } from './metricText'\n\nconst t = getSemanticColors('dark')\n\n/** The four tempo phases, in the order the display renders them. */\nexport type TempoLivePhase = 'eccentric' | 'pauseBottom' | 'concentric' | 'pauseTop'\n\n/**\n * Live rep state driving the phase-fill overlay. Controlled by the consumer\n * (matching titan's `elapsedMs`-in convention) so the same real timer feeds\n * both web dashboard and native app — TempoDisplay owns rendering only.\n */\nexport interface TempoLiveState {\n /** Phase currently in progress, or null when idle/at rest. */\n activePhase: TempoLivePhase | null\n /** Elapsed time (ms) within the active phase. */\n phaseElapsedMs: number\n /**\n * Actual completed durations (ms) for phases finished earlier THIS rep. A done cell\n * freezes at its final readout (not the target) until the next rep resets the row.\n * Omit a phase to fall back to its target (assume it completed on pace).\n */\n completed?: Partial<Record<TempoLivePhase, number>>\n}\n\nexport interface TempoDisplayProps extends ViewProps {\n /** Tempo values: [eccentric, pauseBottom, concentric, pauseTop] in seconds */\n tempo: [number, number, number, number]\n size?: 'sm' | 'md'\n /** Override the digit font size (px). Defaults from `size` (9 sm / 11 md); raise for a wall read-out. */\n fontSize?: number\n /** Show the \"TEMPO\" caption before the values. Default true. */\n showLabel?: boolean\n /** Show info tooltip on press */\n showInfo?: boolean\n /**\n * When set, renders a live phase-fill: the active phase digit fills against\n * its prescribed duration and inactive phases dim. Omit for the static\n * prescription string (default, backward compatible).\n */\n live?: TempoLiveState\n /** Active-phase readout when `live`: `countdown` remaining to 0.0 (default), or `countup` elapsed. */\n liveReadout?: TempoLiveReadout\n onPress?: () => void\n className?: string\n}\n\nconst INTER = 'Inter, sans-serif'\nconst TEXT_TERTIARY = '#6B7280'\nconst STATUS_ERROR = t['status-error'] // slow — over the target time\nconst STATUS_SUCCESS = t['status-success'] // on target (within the band of 0.0)\nconst STATUS_WARNING = t['status-warning'] // ahead — still time left to the target\n\n/** Live active-phase readout: `countdown` remaining to 0.0, or `countup` elapsed to target. */\nexport type TempoLiveReadout = 'countdown' | 'countup'\n\n/** ± this window (ms) around the target still counts as on target (0.0 ± 0.1s). */\nconst ON_TARGET_MS = 100\n\n/** Phase-progress fill percent (0–100): how far the active phase has run toward its target. */\nfunction getTempoFillPct(elapsedMs: number, targetMs: number | null): number {\n if (!targetMs) return 100\n return Math.min(100, (elapsedMs / targetMs) * 100)\n}\n\n/**\n * Semantic pacing tone for the active/completed phase's NUMBER (the fill bar carries phase\n * identity, so the number is free to carry pacing). Keyed on time remaining to target:\n * ahead of target (still counting) → warning; within ±0.1s of 0.0 → success; over → error.\n */\nfunction activeNumberTone(elapsedMs: number, targetMs: number | null): string {\n if (targetMs == null) return t['text-primary']\n const remainingMs = targetMs - elapsedMs\n if (remainingMs > ON_TARGET_MS) return STATUS_WARNING\n if (remainingMs >= -ON_TARGET_MS) return STATUS_SUCCESS\n return STATUS_ERROR\n}\n\n/** The active number: `countup` elapsed (→ target) or `countdown` remaining (→ 0.0, then −). */\nfunction liveReadoutText(elapsedMs: number, targetMs: number, readout: TempoLiveReadout): string {\n const seconds = readout === 'countup' ? elapsedMs / 1000 : (targetMs - elapsedMs) / 1000\n return seconds.toFixed(1)\n}\n\n// Phase IDENTITY colours — deliberately NON-semantic (magenta ecc / cyan con) so the\n// phase hue never collides with the semantic pacing tones (success/error) the active\n// number carries. Pauses stay neutral grey. [eccentric, pauseBottom, concentric, pauseTop]\nconst phaseColors = {\n eccentric: primitiveRamps.magenta[400],\n pauseBottom: TEXT_TERTIARY,\n concentric: primitiveRamps.cyan[300],\n pauseTop: TEXT_TERTIARY,\n dash: TEXT_TERTIARY,\n}\n\nfunction TempoValue({\n value,\n color,\n fontSize,\n}: {\n value: number\n color: string\n fontSize: number\n}) {\n return (\n <MetricCell color={color} fontSize={fontSize}>\n {value}\n </MetricCell>\n )\n}\n\nfunction TempoSeparator({ color, fontSize }: { color: string; fontSize: number }) {\n return (\n <MetricCell color={color} fontSize={fontSize}>\n -\n </MetricCell>\n )\n}\n\n// Phase order + color matching the tempo tuple, for the live phase-fill row.\nconst LIVE_PHASES: { key: TempoLivePhase; color: string }[] = [\n { key: 'eccentric', color: phaseColors.eccentric },\n { key: 'pauseBottom', color: phaseColors.pauseBottom },\n { key: 'concentric', color: phaseColors.concentric },\n { key: 'pauseTop', color: phaseColors.pauseTop },\n]\n\n/** A phase's place in the current rep: already done (locked full), filling now, or still to come. */\ntype LiveCellStatus = 'done' | 'active' | 'upcoming'\n\n/** A bottom-anchored vertical fill behind the number (the phase-progress bar). */\nfunction CellFill({ color, pct }: { color: string; pct: number }) {\n return (\n <View\n style={{\n position: 'absolute',\n left: 2,\n right: 2,\n bottom: 0,\n height: `${pct}%`,\n backgroundColor: alpha(color, 0.28),\n borderRadius: 3,\n }}\n />\n )\n}\n\n/** Monospace stack for the live readout so digit widths never shift. */\nconst MONO = 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace'\n/** Widest readout the cell must hold: sign · two whole digits · point · tenths, e.g. \"-12.3\". */\nconst READOUT_MAX_CHARS = 5\n\nfunction LiveTempoCell({\n value,\n color,\n status,\n phaseElapsedMs,\n completedMs,\n fontSize,\n readout,\n}: {\n value: number\n color: string\n status: LiveCellStatus\n phaseElapsedMs: number\n completedMs: number | undefined\n fontSize: number\n readout: TempoLiveReadout\n}) {\n const targetMs = value > 0 ? value * 1000 : null\n // Fixed, monospace-width cell sized to the widest readout — a phase activating or its\n // number changing never shifts the layout (the fill bar stays put too).\n const cellW = Math.ceil(fontSize * 0.62 * READOUT_MAX_CHARS)\n const wrap = {\n position: 'relative' as const,\n width: cellW,\n minHeight: Math.round(fontSize * 1.25),\n alignItems: 'center' as const,\n justifyContent: 'center' as const,\n }\n const num = (c: string, text: string) => (\n <Text style={{ fontFamily: MONO, fontSize, color: c, fontWeight: '700' }}>{text}</Text>\n )\n\n // Upcoming / idle: the phase's prescribed time in the FULL phase colour, no fill — so a\n // not-yet-started (or fully idle) row just reads as the base tempo lockup, not a dim mode.\n if (status === 'upcoming') {\n const targetText = targetMs != null ? (targetMs / 1000).toFixed(1) : String(value)\n return <View style={wrap}>{num(color, targetText)}</View>\n }\n\n // Done: FROZEN at the phase's final readout (its actual completed time, not the target),\n // fill locked full in the phase colour. The number keeps its SEMANTIC pacing tone (it is\n // showing the final time, not the target) — banked progress until the next rep resets.\n if (status === 'done') {\n const finalMs = completedMs ?? targetMs ?? 0\n const finalText = targetMs != null ? liveReadoutText(finalMs, targetMs, readout) : String(value)\n const finalTone = targetMs != null ? activeNumberTone(finalMs, targetMs) : color\n return (\n <View style={wrap} testID=\"tempo-live-done\">\n <CellFill color={color} pct={100} />\n {num(finalTone, finalText)}\n </View>\n )\n }\n\n // Active: the phase-hued fill grows with the phase; the number reads the live time\n // (countdown/countup) to 0.1s, coloured SEMANTICALLY by pacing (neutral/on-target/behind).\n const numberTone = activeNumberTone(phaseElapsedMs, targetMs)\n const fillPct = getTempoFillPct(phaseElapsedMs, targetMs)\n const activeText =\n targetMs != null ? liveReadoutText(phaseElapsedMs, targetMs, readout) : String(value)\n return (\n <View style={wrap} testID=\"tempo-live-active\">\n <CellFill color={color} pct={fillPct} />\n {num(numberTone, activeText)}\n </View>\n )\n}\n\nfunction LiveTempoRow({\n values,\n live,\n fontSize,\n readout,\n}: {\n values: [number, number, number, number]\n live: TempoLiveState\n fontSize: number\n readout: TempoLiveReadout\n}) {\n // Phases run in a fixed order within a rep, so the active phase's position tells us which\n // phases are already done (locked). When it wraps back to the first phase, the row resets.\n const activeIndex = live.activePhase\n ? LIVE_PHASES.findIndex((p) => p.key === live.activePhase)\n : -1\n return (\n <>\n {LIVE_PHASES.map((phase, i) => {\n const status: LiveCellStatus =\n activeIndex < 0 || i > activeIndex ? 'upcoming' : i < activeIndex ? 'done' : 'active'\n return (\n <View key={phase.key} style={{ flexDirection: 'row', alignItems: 'center' }}>\n {i > 0 && <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />}\n <LiveTempoCell\n value={values[i]}\n color={phase.color}\n status={status}\n phaseElapsedMs={live.phaseElapsedMs}\n completedMs={live.completed?.[phase.key]}\n fontSize={fontSize}\n readout={readout}\n />\n </View>\n )\n })}\n </>\n )\n}\n\nexport function TempoDisplay({\n tempo,\n size = 'md',\n fontSize: fontSizeProp,\n showLabel = true,\n showInfo = true,\n live,\n liveReadout = 'countdown',\n onPress,\n className,\n ...props\n}: TempoDisplayProps) {\n const [showTooltip, setShowTooltip] = useState(false)\n // Round exact (unrounded) tempo seconds to the 1-dp display granularity.\n const [eccentric, pauseBottom, concentric, pauseTop] = roundTempo(tempo)\n const isSm = size === 'sm'\n const fontSize = fontSizeProp ?? (isSm ? 9 : 11)\n // The chrome (padding, radius, label) scales with the digit size so the whole view stays\n // proportional at any form factor — a compact rail chip up to a wall read-out.\n const chromePadX = Math.round(fontSize * 0.6)\n const chromePadY = Math.round(fontSize * 0.3)\n const chromeRadius = Math.round(fontSize * 0.4)\n const labelFont = Math.max(9, Math.round(fontSize * 0.5))\n\n const handlePress = useCallback(() => {\n if (onPress) {\n onPress()\n }\n if (showInfo) {\n setShowTooltip((prev) => !prev)\n }\n }, [onPress, showInfo])\n\n const content = (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: t['surface-raised'],\n paddingHorizontal: chromePadX,\n paddingVertical: chromePadY,\n borderRadius: chromeRadius,\n }}\n {...props}\n >\n {showLabel && (\n <Text\n style={{\n fontFamily: INTER,\n fontSize: labelFont,\n fontWeight: '500',\n // Live-muted green while a rep is running, tertiary at rest.\n color: live ? t['status-live-muted'] : TEXT_TERTIARY,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n marginRight: Math.round(fontSize * 0.5),\n }}\n >\n TEMPO\n </Text>\n )}\n <View style={{ flexDirection: 'row' }} testID=\"tempo-value\">\n {live ? (\n <LiveTempoRow\n values={[eccentric, pauseBottom, concentric, pauseTop]}\n live={live}\n fontSize={fontSize}\n readout={liveReadout}\n />\n ) : (\n // Static prescription: the phase-coloured lockup (the same colours the live row rests at).\n <>\n <TempoValue value={eccentric} color={phaseColors.eccentric} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={pauseBottom} color={phaseColors.pauseBottom} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={concentric} color={phaseColors.concentric} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={pauseTop} color={phaseColors.pauseTop} fontSize={fontSize} />\n </>\n )}\n </View>\n </View>\n )\n\n return (\n <Pressable\n accessibilityLabel={`Tempo: ${eccentric} second eccentric, ${pauseBottom} second pause, ${concentric} second concentric, ${pauseTop} second pause`}\n accessibilityRole=\"button\"\n onPress={handlePress}\n testID=\"tempo-display\"\n >\n {content}\n {showTooltip && (\n <View\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: [{ translateX: '-50%' as unknown as number }],\n marginBottom: 8,\n zIndex: 20,\n alignItems: 'center',\n }}\n testID=\"tempo-tooltip\"\n >\n <View\n style={{\n backgroundColor: t['surface-overlay'],\n borderRadius: 6,\n paddingVertical: 8,\n paddingHorizontal: 12,\n borderWidth: 1,\n borderColor: '#2C2C2C',\n }}\n >\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Eccentric: {eccentric}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Pause (bottom): {pauseBottom}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Concentric: {concentric}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Pause (top): {pauseTop}s\n </Text>\n </View>\n <View\n style={{\n width: 0,\n height: 0,\n borderLeftWidth: 5,\n borderRightWidth: 5,\n borderTopWidth: 5,\n borderLeftColor: 'transparent',\n borderRightColor: 'transparent',\n borderTopColor: '#2C2C2C',\n }}\n />\n </View>\n )}\n </Pressable>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport type { ComponentType } from 'react'\nimport { View, Pressable, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n ScaleIcon,\n AlertTriangleIcon,\n TrendingDownIcon,\n CircleSlashIcon,\n AwardIcon,\n InfoIcon,\n type IconProps,\n} from '../../icons'\n\n// Literal-hex status pins (getSemanticColors, not resolveColor) — `resolveColor()` yields a\n// `var(...)` under the RNW vitest alias, which breaks `toHaveStyle` in tests.\nconst t = getSemanticColors('dark')\n\n/**\n * The LOCKED 6-kind indicator taxonomy (TD-03.51). One precedence-ranked slot is\n * ever shown per exercise, resolved by {@link resolveIndicator}. Glyph = the\n * specific signal; color = the severity tier (danger/warning/success/info, bound\n * to titan status tokens). Outlined (border + glyph, no fill) so a chip never\n * collides with the filled velocity strip beside it.\n */\nexport type ExerciseIndicatorKind =\n | 'imbalance'\n | 'overshoot'\n | 'velocity-loss'\n | 'missed-reps'\n | 'pr'\n | 'info'\n\ninterface IndicatorConfig {\n Icon: ComponentType<IconProps>\n /** Tier color — a titan status semantic token (literal hex on `t`). */\n color: string\n /** Accessible description (also the intended tooltip subject). */\n label: string\n}\n\nconst INDICATOR_CONFIG: Record<ExerciseIndicatorKind, IndicatorConfig> = {\n imbalance: { Icon: ScaleIcon, color: t['status-error'], label: 'Left/right imbalance' },\n overshoot: { Icon: AlertTriangleIcon, color: t['status-error'], label: 'Load overshoot' },\n 'velocity-loss': { Icon: TrendingDownIcon, color: t['status-warning'], label: 'Velocity loss' },\n 'missed-reps': { Icon: CircleSlashIcon, color: t['status-warning'], label: 'Missed reps' },\n pr: { Icon: AwardIcon, color: t['status-success'], label: 'Personal record' },\n info: { Icon: InfoIcon, color: t['status-info'], label: 'More info' },\n}\n\n/**\n * Precedence order (1=highest → last=lowest). A single chip is shown, so when\n * several signals are true the highest-ranked wins. Alerts outrank `pr`; `info`\n * is the floor. This ordering is LOCKED — do not reshuffle.\n */\nexport const INDICATOR_PRECEDENCE: readonly ExerciseIndicatorKind[] = [\n 'imbalance',\n 'overshoot',\n 'velocity-loss',\n 'missed-reps',\n 'pr',\n 'info',\n]\n\n/**\n * Given the signals currently true for an exercise, pick the single\n * highest-precedence kind to surface (or `undefined` when none apply). Order and\n * duplicates in `candidates` don't matter — {@link INDICATOR_PRECEDENCE} decides.\n */\nexport function resolveIndicator(\n candidates: ExerciseIndicatorKind[],\n): ExerciseIndicatorKind | undefined {\n return INDICATOR_PRECEDENCE.find((kind) => candidates.includes(kind))\n}\n\nexport interface ExerciseIndicatorProps extends Omit<ViewProps, 'children'> {\n kind: ExerciseIndicatorKind\n /** Optional tap handler (surfaces detail — PR history / alert / info). */\n onPress?: () => void\n className?: string\n}\n\n/**\n * A small circular outlined chip for an exercise heading. Presentational and\n * static (chips are chrome — no pulse); the tap detail (tooltip/sheet) is wired\n * by the consumer.\n */\nexport function ExerciseIndicator({ kind, onPress, className, ...props }: ExerciseIndicatorProps) {\n const { Icon, color, label } = INDICATOR_CONFIG[kind]\n\n const chip = (\n <View\n className={className}\n style={{\n width: 16,\n height: 16,\n borderRadius: 8,\n borderWidth: 1,\n borderColor: color,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n accessibilityRole=\"image\"\n accessibilityLabel={label}\n testID=\"exercise-indicator\"\n {...props}\n >\n <Icon size={11} color={color} />\n </View>\n )\n\n if (onPress) {\n return (\n <Pressable onPress={onPress} accessibilityRole=\"button\" accessibilityLabel={label}>\n {chip}\n </Pressable>\n )\n }\n return chip\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, Pressable } from 'react-native'\nimport { roundWeight } from '../../../utils/workout-format'\nimport { SetsRepsLoad } from './SetsRepsLoad'\nimport { TempoDisplay } from './TempoDisplay'\nimport { ExerciseIndicator, type ExerciseIndicatorKind } from './ExerciseIndicator'\n\nexport interface ExerciseHeadingProps {\n name: string\n /** Prescription line values (sets × reps @ load). */\n sets: number\n reps: number | string\n /** Load value; a string (e.g. \"—\") passes through verbatim for an unset/discovery load. */\n load: number | string\n unit?: 'lbs' | 'kg'\n /** Tempo tuple [eccentric, pauseBottom, concentric, pauseTop]; hidden when absent. */\n tempo?: [number, number, number, number]\n /** Small PR / issue / info chip in the title row. */\n indicator?: ExerciseIndicatorKind\n /** Dim the block as a not-yet-reached exercise (standalone use). */\n dimmed?: boolean\n /** Press target for the name row (expand / select). */\n onPress?: () => void\n}\n\nfunction headingLabel(\n name: string,\n sets: number,\n reps: number | string,\n load: number | string,\n unit: string\n) {\n const loadLabel = typeof load === 'number' ? roundWeight(load) : load\n return `${name}, ${sets}×${reps} @ ${loadLabel} ${unit}`\n}\n\n/**\n * The exercise-heading info block (no strip): the name + {@link ExerciseIndicator}\n * title row over a tight {@link SetsRepsLoad} prescription line beside the real\n * {@link TempoDisplay} (`showLabel={false}`). The name row is the sole press\n * target — TempoDisplay is a sibling, never a descendant, since it is itself a\n * Pressable (nesting would be an a11y nested-interactive violation).\n */\nexport function ExerciseHeading({\n name,\n sets,\n reps,\n load,\n unit = 'lbs',\n tempo,\n indicator,\n dimmed,\n onPress,\n}: ExerciseHeadingProps) {\n return (\n <View style={{ opacity: dimmed ? 0.55 : 1 }} testID=\"exercise-heading\">\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={headingLabel(name, sets, reps, load, unit)}\n className=\"flex-row items-center\"\n style={{ gap: 8 }}\n testID=\"exercise-card-header\"\n >\n <Text\n className=\"text-text-primary\"\n style={{ fontSize: 14, fontFamily: '\"Space Grotesk\", sans-serif', fontWeight: '700' }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n {indicator && <ExerciseIndicator kind={indicator} />}\n </Pressable>\n\n <View\n className=\"flex-row items-center\"\n style={{ gap: 8, marginTop: 1 }}\n testID=\"exercise-card-summary\"\n >\n <SetsRepsLoad sets={sets} reps={reps} load={load} unit={unit} />\n <View className=\"flex-1\" />\n {tempo && <TempoDisplay tempo={tempo} size=\"sm\" showLabel={false} showInfo={false} />}\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View } from 'react-native'\nimport { ExerciseHeading, type ExerciseHeadingProps } from './ExerciseHeading'\nimport { SetStrip, type SetStripSet } from './SetStrip'\n\nexport interface ExerciseCardHeadingProps extends ExerciseHeadingProps {\n /** Per-set performance data driving the strip; an empty list renders no strip. */\n setStates: SetStripSet[]\n /** Strip height in px. Default 8. */\n stripHeight?: number\n /** Root testID. Default \"exercise-card\"; override when nested inside another card. */\n testID?: string\n}\n\n/**\n * The complete, standalone session-rail heading: an {@link ExerciseHeading} info\n * block over its per-set {@link SetStrip}. The unit the rail lists — self-contained\n * and independent of {@link ExerciseCard} (whose `rail` state delegates here).\n * e1RM is intentionally dropped (a planning / live-panel concern). Dimming lives on\n * the outer wrapper so the strip dims with the heading.\n */\nexport function ExerciseCardHeading({\n setStates,\n stripHeight = 8,\n dimmed,\n testID = 'exercise-card',\n ...heading\n}: ExerciseCardHeadingProps) {\n return (\n <View\n style={{ paddingVertical: 9, paddingHorizontal: 12, opacity: dimmed ? 0.55 : 1 }}\n testID={testID}\n >\n <ExerciseHeading {...heading} />\n\n {setStates.length > 0 && (\n <View style={{ marginTop: 7 }} testID=\"exercise-card-strip\">\n <SetStrip sets={setStates} height={stripHeight} />\n </View>\n )}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState } from 'react'\nimport { View, Text, Pressable } from 'react-native'\nimport { VelocityStrip, type VelocityZoneBandProp } from './VelocityStrip'\nimport { PlaceholderStrip } from './PlaceholderStrip'\nimport { PrBadge } from './PrBadge'\nimport { SetRow, type SetRowProps } from './SetRow'\nimport { type SetStripSet } from './SetStrip'\nimport { SetTableHeader } from './SetTableHeader'\nimport { ExerciseCardHeading } from './ExerciseCardHeading'\nimport { type ExerciseIndicatorKind } from './ExerciseIndicator'\nimport { roundWeight } from '../../../utils/workout-format'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport interface ExerciseCardProps {\n name: string\n /**\n * The dimmed, not-yet-reached representation (prescription + previous-best line).\n * Overrides the expand state — an upcoming card never expands.\n */\n upcoming?: boolean\n /** Controlled expand state. Omit to run uncontrolled (see {@link defaultExpanded}). */\n expanded?: boolean\n /** Uncontrolled initial expand state. Default false. Ignored when `expanded` is set. */\n defaultExpanded?: boolean\n /** Notified when the user toggles the card between collapsed and expanded. */\n onExpandedChange?: (expanded: boolean) => void\n onNavigateDetail?: () => void\n summary?: {\n sets: number\n reps: number | string\n weight: number\n unit: 'lbs' | 'kg'\n }\n isPR?: boolean\n /** Collapsed glance: per-set logged velocities (drives the mini strips). */\n setVelocities?: number[][]\n /** Optional velocity-zone bands shared across this exercise's sets (WA bands). */\n velocityZones?: readonly VelocityZoneBandProp[]\n /** Collapsed glance: total planned sets (placeholder strips fill the remainder). */\n totalPlannedSets?: number\n /** Expanded body: the per-set rows (done / live / todo). */\n sets?: SetRowProps[]\n tempo?: [number, number, number, number]\n prescription?: string\n previousBest?: string\n supersetPosition?: 'first' | 'last' | 'middle' | null\n supersetColor?: string\n /** Expanded header per-set strip override; derived from `sets` when omitted. */\n setStates?: SetStripSet[]\n /** A small PR / issue / info chip in the title line (expanded header). */\n indicator?: ExerciseIndicatorKind\n /** Expanded header strip height in px. Default 8. */\n stripHeight?: number\n}\n\n/** The sub-card render props: everything but the expand-control surface, plus a resolved toggle. */\ntype CardBodyProps = Omit<\n ExerciseCardProps,\n 'upcoming' | 'expanded' | 'defaultExpanded' | 'onExpandedChange'\n> & { onToggle: () => void }\n\nfunction getSupersetBorderRadius(\n position: ExerciseCardProps['supersetPosition']\n): Record<string, number> {\n switch (position) {\n case 'first':\n return {\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderBottomLeftRadius: 8,\n borderBottomRightRadius: 8,\n }\n case 'last':\n return {\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n borderBottomLeftRadius: 12,\n borderBottomRightRadius: 12,\n }\n case 'middle':\n return {\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n borderBottomLeftRadius: 8,\n borderBottomRightRadius: 8,\n }\n default:\n return {\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderBottomLeftRadius: 12,\n borderBottomRightRadius: 12,\n }\n }\n}\n\nfunction getSupersetMargin(\n position: ExerciseCardProps['supersetPosition']\n): Record<string, number> {\n if (position === 'first' || position === 'middle') {\n return { marginBottom: 2 }\n }\n return {}\n}\n\nfunction formatSummary(summary: ExerciseCardProps['summary']): string {\n if (!summary) return ''\n return `${summary.sets}×${summary.reps} @ ${roundWeight(summary.weight)} ${summary.unit}`\n}\n\nfunction formatAccessibilityLabel(\n name: string,\n summary: ExerciseCardProps['summary'],\n prescription: ExerciseCardProps['prescription']\n): string {\n if (summary) return `${name}, ${formatSummary(summary)}`\n if (prescription) return `${name}, ${prescription}`\n return name\n}\n\nfunction CollapsedCard({\n name,\n onToggle,\n summary,\n isPR,\n setVelocities,\n velocityZones,\n totalPlannedSets,\n supersetPosition,\n}: CardBodyProps) {\n const [pressed, setPressed] = useState(false)\n const completedSets = setVelocities?.length ?? 0\n const remaining = Math.max(0, (totalPlannedSets ?? 0) - completedSets)\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n\n return (\n <Pressable\n onPress={onToggle}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n accessibilityRole=\"button\"\n accessibilityLabel={formatAccessibilityLabel(name, summary, undefined)}\n testID=\"exercise-card\"\n >\n <View\n className={pressed ? 'bg-surface-raised' : undefined}\n style={{\n padding: 12,\n paddingHorizontal: 14,\n cursor: 'pointer',\n ...borderRadius,\n ...supersetMargin,\n }}\n >\n <View className=\"flex-row items-center\" testID=\"exercise-card-header\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 14,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n {summary && (\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n marginRight: 8,\n }}\n testID=\"exercise-card-summary\"\n >\n {formatSummary(summary)}\n </Text>\n )}\n {isPR && (\n <View style={{ marginLeft: 4 }}>\n <PrBadge type=\"e1rm\" compact animate={false} />\n </View>\n )}\n </View>\n\n {(completedSets > 0 || remaining > 0) && (\n <View className=\"flex-row\" style={{ marginTop: 6, gap: 4 }} testID=\"exercise-card-strips\">\n {setVelocities?.map((velocities, i) => (\n <VelocityStrip\n key={i}\n velocities={velocities}\n zones={velocityZones}\n variant=\"mini\"\n testID={`exercise-card-velocity-strip-${i}`}\n />\n ))}\n {Array.from({ length: remaining }, (_, i) => (\n <PlaceholderStrip\n key={`placeholder-${i}`}\n testID={`exercise-card-placeholder-${i}`}\n />\n ))}\n </View>\n )}\n </View>\n </Pressable>\n )\n}\n\n// --- Unified expanded card ---------------------------------------------------\n// The expanded card is \"one object\" with its rail heading: the persistent header\n// is the real ExerciseCardHeading, and the revealed body drops PREV and renders\n// one real SetRow per set (muted done/todo, brightened live spotlight).\n\nconst DARK = getSemanticColors('dark')\n/** The header↔body seam. */\nconst BODY_DIVIDER = DARK['border-subtle']\n\n/** Project the set rows onto the heading strip's per-set state (done / active / todo). */\nfunction deriveHeaderSetStates(sets: SetRowProps[]): SetStripSet[] {\n return sets.map((set): SetStripSet => {\n switch (set.state) {\n case 'live':\n return { status: 'active', velocities: set.velocities, planned: set.target.reps }\n case 'done':\n return { status: 'done', velocities: set.velocities }\n case 'todo':\n return { status: 'todo', planned: set.planned ?? set.target.reps }\n }\n })\n}\n\nfunction ExpandedCard({\n name,\n onToggle,\n summary,\n isPR,\n sets,\n tempo,\n indicator,\n setStates,\n stripHeight = 8,\n velocityZones,\n supersetPosition,\n}: CardBodyProps) {\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n // Summary is the card-level authority for the weight column; fall back to the\n // first set's unit, then lbs. (Mixed per-set units keep the card-level label.)\n const unit = summary?.unit ?? sets?.[0]?.unit ?? 'lbs'\n // The rail heading IS the header: its per-set strip comes from an explicit\n // `setStates` when supplied, else it's derived from the set rows. e1RM is dropped\n // entirely; a PR surfaces via the chip.\n const headerStates = setStates ?? (sets ? deriveHeaderSetStates(sets) : [])\n const headerIndicator = indicator ?? (isPR ? 'pr' : undefined)\n\n return (\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n ...borderRadius,\n ...supersetMargin,\n }}\n testID=\"exercise-card\"\n >\n <ExerciseCardHeading\n name={name}\n sets={summary?.sets ?? sets?.length ?? 0}\n reps={summary?.reps ?? 0}\n load={summary?.weight ?? 0}\n unit={unit}\n tempo={tempo}\n indicator={headerIndicator}\n setStates={headerStates}\n stripHeight={stripHeight}\n onPress={onToggle}\n testID=\"exercise-card-heading\"\n />\n\n <View\n style={{ borderTopWidth: 1, borderTopColor: BODY_DIVIDER, paddingBottom: 6 }}\n testID=\"exercise-card-body\"\n >\n <SetTableHeader unit={unit} showPrevious={false} testID=\"exercise-card-column-headers\" />\n\n {sets && (\n <View testID=\"exercise-card-sets\">\n {sets.map((set, i) => (\n <SetRow key={i} {...set} velocityZones={set.velocityZones ?? velocityZones} />\n ))}\n </View>\n )}\n </View>\n </View>\n )\n}\n\nfunction UpcomingCard({\n name,\n prescription,\n previousBest,\n supersetPosition,\n onToggle,\n}: CardBodyProps) {\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n\n return (\n <Pressable onPress={onToggle} accessibilityRole=\"button\">\n <View\n style={{\n opacity: 0.6,\n padding: 12,\n paddingHorizontal: 14,\n ...borderRadius,\n ...supersetMargin,\n }}\n accessibilityLabel={formatAccessibilityLabel(name, undefined, prescription)}\n testID=\"exercise-card\"\n >\n <View className=\"flex-row items-center\">\n {/* Name never truncates (no numberOfLines); prescription + previousBest ellipsize first. */}\n <Text\n className=\"text-text-primary\"\n style={{\n flexShrink: 0,\n fontSize: 14,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n {prescription && (\n <Text\n className=\"text-text-secondary\"\n numberOfLines={1}\n style={{\n flexShrink: 1,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n marginLeft: 8,\n }}\n testID=\"exercise-card-prescription\"\n >\n {prescription}\n </Text>\n )}\n <View className=\"flex-1\" style={{ minWidth: 8 }} />\n {previousBest && (\n <Text\n className=\"text-text-tertiary\"\n numberOfLines={1}\n style={{\n flexShrink: 1,\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"exercise-card-previous-best\"\n >\n {previousBest}\n </Text>\n )}\n </View>\n </View>\n </Pressable>\n )\n}\n\n/**\n * The data-contract exercise card, in three representations:\n * - `upcoming` — a dimmed, not-yet-reached row (prescription + previous best).\n * - collapsed — a glance: name + summary + per-set velocity strips.\n * - expanded — the unified card: the real {@link ExerciseCardHeading} header over\n * the SET · REPS · LBS · RPE body (one {@link SetRow} per set).\n *\n * Expand is controlled (`expanded` + `onExpandedChange`) or uncontrolled\n * (`defaultExpanded`, internal state). `upcoming` overrides expand.\n */\nexport function ExerciseCard({\n upcoming,\n expanded,\n defaultExpanded,\n onExpandedChange,\n ...rest\n}: ExerciseCardProps) {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded ?? false)\n const isControlled = expanded !== undefined\n const isExpanded = isControlled ? expanded : internalExpanded\n\n const onToggle = () => {\n const next = !isExpanded\n onExpandedChange?.(next)\n if (!isControlled) setInternalExpanded(next)\n }\n\n if (upcoming) return <UpcomingCard {...rest} onToggle={onToggle} />\n return isExpanded ? (\n <ExpandedCard {...rest} onToggle={onToggle} />\n ) : (\n <CollapsedCard {...rest} onToggle={onToggle} />\n )\n}\n","import { Platform } from 'react-native'\nimport { getSemanticColors, type ThemeMode } from './tokens/semantic'\n\ntype ColorToken = keyof ReturnType<typeof getSemanticColors>\n\n/**\n * Resolve a semantic color token for an inline style where a nativewind\n * className can't apply — gradients (`backgroundImage`), per-edge borders\n * (`borderTopColor`, …), SVG attributes, and conditional hex/token mixes.\n *\n * The companion to className color tokens: on **web** it returns the CSS\n * variable (`var(--color-…)`), so the dashboard's light/dark switching keeps\n * working exactly as `global.css` intends; on **native** it returns the\n * resolved hex from `getSemanticColors` (mobile is dark-only). This is why\n * these spots stay theme-correct on web while also rendering on-device.\n */\nexport function resolveColor(token: ColorToken, mode: ThemeMode = 'dark'): string {\n return Platform.OS === 'web' ? `var(--color-${token})` : getSemanticColors(mode)[token]\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport React from 'react'\nimport { View, Text, Pressable, TextInput } from 'react-native'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport interface InputBarProps {\n exerciseName: string\n setNumber: number\n totalSets: number | null\n reps: string\n weight: string\n unit: 'lbs' | 'kg'\n onRepsChange: (value: string) => void\n onWeightChange: (value: string) => void\n onRecord: () => void\n canRecord: boolean\n visible: boolean\n}\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\nconst INPUT_CLASSNAME = 'bg-surface-raised border-border-strong text-text-primary'\n\nconst inputStyle = {\n fontSize: 14,\n fontWeight: '600' as const,\n fontFamily: 'Inter, sans-serif',\n borderWidth: 1,\n borderRadius: 6,\n textAlign: 'center' as const,\n paddingVertical: 5,\n paddingHorizontal: 2,\n}\n\nexport function InputBar({\n exerciseName,\n setNumber,\n totalSets,\n reps,\n weight,\n unit,\n onRepsChange,\n onWeightChange,\n onRecord,\n canRecord,\n visible,\n}: InputBarProps) {\n if (!visible) return null\n\n const setLabel = totalSets != null ? `Set ${setNumber}/${totalSets}` : `Set ${setNumber}`\n\n return (\n <View\n className=\"bg-surface-elevated\"\n style={{\n width: '100%',\n borderTopWidth: 1,\n borderTopColor: resolveColor('border-default'),\n paddingTop: 10,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n }}\n accessibilityRole=\"toolbar\"\n testID=\"input-bar\"\n >\n <View style={{ minWidth: 80, flexDirection: 'column' }}>\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 12,\n fontWeight: '700',\n fontFamily: '\"Space Grotesk\", sans-serif',\n }}\n testID=\"input-bar-exercise-name\"\n numberOfLines={1}\n >\n {exerciseName}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"input-bar-set-info\"\n >\n {setLabel}\n </Text>\n </View>\n\n <View className=\"flex-1 flex-row items-center\" style={{ gap: 4 }}>\n <TextInput\n value={reps}\n onChangeText={onRepsChange}\n className={INPUT_CLASSNAME}\n style={{ ...inputStyle, width: 36 }}\n accessibilityLabel=\"Reps\"\n testID=\"input-bar-reps\"\n keyboardType=\"numeric\"\n />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {'\\u00D7'}\n </Text>\n <TextInput\n value={weight}\n onChangeText={onWeightChange}\n className={INPUT_CLASSNAME}\n style={{ ...inputStyle, width: 52 }}\n accessibilityLabel={`Weight in ${unit}`}\n testID=\"input-bar-weight\"\n keyboardType=\"numeric\"\n />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 12,\n fontWeight: '500',\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"input-bar-unit\"\n >\n {unit}\n </Text>\n </View>\n\n <Pressable\n onPress={onRecord}\n disabled={!canRecord}\n style={({ pressed }) => ({\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 16,\n opacity: !canRecord ? 0.4 : pressed ? 0.8 : 1,\n })}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Record set\"\n testID=\"input-bar-record\"\n >\n <Text\n style={{\n fontSize: 13,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n color: '#FFFFFF',\n }}\n >\n Record\n </Text>\n </Pressable>\n </View>\n )\n}\n","import { useEffect, useState } from 'react'\n\nexport type TimerMode = 'up' | 'down'\n\nexport interface UseTimerOptions {\n /** 'up' counts elapsed upward; 'down' counts remaining toward 0. Default 'up'. */\n mode?: TimerMode\n /** Total duration in ms. Required for 'down' mode and for progress in 'up' mode. */\n durationMs?: number\n /** Controlled elapsed time in ms. When provided, the hook derives everything from it and never ticks. */\n elapsedMs?: number\n /** Self-tick only advances while running. */\n running?: boolean\n /** Enable the internal interval. Ignored when `elapsedMs` is controlled. */\n autoTick?: boolean\n /** Interval step in ms. Default 1000. */\n tickMs?: number\n}\n\nexport interface TimerState {\n elapsedMs: number\n remainingMs: number\n /** 0..1, clamped. */\n progress: number\n /** mm:ss for the active direction (remaining when 'down', elapsed when 'up'). */\n label: string\n /** True once a down-timer reaches 0 (or an up-timer passes its duration). */\n done: boolean\n}\n\n/** Format a millisecond duration as mm:ss, rounding partial seconds up. */\nexport function formatDuration(ms: number): string {\n const totalSeconds = Math.max(0, Math.ceil(ms / 1000))\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n return `${minutes}:${String(seconds).padStart(2, '0')}`\n}\n\nexport function useTimer(options: UseTimerOptions = {}): TimerState {\n const {\n mode = 'up',\n durationMs,\n elapsedMs: controlledElapsedMs,\n running = false,\n autoTick = false,\n tickMs = 1000,\n } = options\n\n const isControlled = controlledElapsedMs != null\n const [internalElapsedMs, setInternalElapsedMs] = useState(0)\n\n useEffect(() => {\n if (isControlled || !autoTick || !running) return\n const id = setInterval(() => {\n setInternalElapsedMs((prev) => prev + tickMs)\n }, tickMs)\n return () => clearInterval(id)\n }, [isControlled, autoTick, running, tickMs])\n\n const elapsedMs = isControlled ? controlledElapsedMs : internalElapsedMs\n\n const hasDuration = durationMs != null && durationMs > 0\n const remainingMs = durationMs != null ? Math.max(0, durationMs - elapsedMs) : 0\n\n let progress: number\n if (hasDuration) {\n progress = Math.min(1, Math.max(0, elapsedMs / durationMs))\n } else {\n // A zero/undefined duration is trivially complete for a countdown, empty for a stopwatch.\n progress = mode === 'down' ? 1 : 0\n }\n\n const label = formatDuration(mode === 'down' ? remainingMs : elapsedMs)\n const done = durationMs != null && elapsedMs >= durationMs\n\n return { elapsedMs, remainingMs, progress, label, done }\n}\n","import React from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\n\nexport type ProgressSize = 'sm' | 'md' | 'lg'\nexport type ProgressColor = 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'\nexport type ProgressVariant = 'linear' | 'circular'\n\n/** Maps the color prop to a CSS variable reference for inline styles */\nexport const colorVarMap: Record<ProgressColor, string> = {\n primary: 'var(--color-brand-primary)',\n secondary: 'var(--color-brand-secondary)',\n success: 'var(--color-status-success)',\n error: 'var(--color-status-error)',\n warning: 'var(--color-status-warning)',\n info: 'var(--color-status-info)',\n}\n\nexport interface ProgressProps extends ViewProps {\n /** Current value (0-100) */\n value?: number\n /** Maximum value */\n max?: number\n /** Whether the progress is indeterminate */\n isIndeterminate?: boolean\n /** Size of the progress bar */\n size?: ProgressSize\n /** Color of the progress */\n color?: ProgressColor\n /** Whether to show the value label */\n showValue?: boolean\n /** Custom value format function */\n formatValue?: (value: number, max: number) => string\n /** Label text */\n label?: string\n /** Fixed track width in pixels (default: full width) */\n trackWidth?: number\n /** Custom hex color override for the fill bar */\n customColor?: string\n /** Additional className */\n className?: string\n}\n\nconst sizeStyles: Record<ProgressSize, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n}\n\nconst colorStyles: Record<ProgressColor, string> = {\n primary: 'bg-brand-primary',\n secondary: 'bg-brand-secondary',\n success: 'bg-status-success',\n error: 'bg-status-error',\n warning: 'bg-status-warning',\n info: 'bg-status-info',\n}\n\nconst trackColorStyles: Record<ProgressColor, string> = {\n primary: 'bg-brand-primary/20',\n secondary: 'bg-brand-secondary/20',\n success: 'bg-status-success/20',\n error: 'bg-status-error/20',\n warning: 'bg-status-warning/20',\n info: 'bg-status-info/20',\n}\n\n/**\n * Linear progress bar component.\n *\n * @example\n * // Determinate progress\n * <Progress value={75} />\n *\n * @example\n * // With label and value\n * <Progress value={45} label=\"Uploading...\" showValue />\n *\n * @example\n * // Indeterminate progress\n * <Progress isIndeterminate />\n */\nexport function Progress({\n value = 0,\n max = 100,\n isIndeterminate = false,\n size = 'md',\n color = 'primary',\n showValue = false,\n formatValue = (v, m) => `${Math.round((v / m) * 100)}%`,\n label,\n trackWidth,\n customColor,\n className,\n ...props\n}: ProgressProps) {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <View className={cn('w-full', className)} {...props}>\n {/* Label and Value Row */}\n {(label || showValue) && (\n <View className=\"flex-row justify-between items-center mb-1\">\n {label && <Text className=\"text-sm text-text-secondary\">{label}</Text>}\n {showValue && !isIndeterminate && (\n <Text className=\"text-sm font-medium text-text-primary\">{formatValue(value, max)}</Text>\n )}\n </View>\n )}\n\n {/* Progress Track */}\n <View\n className={cn(\n 'rounded-full overflow-hidden',\n trackWidth ? undefined : 'w-full',\n trackColorStyles[color],\n sizeStyles[size]\n )}\n style={trackWidth ? { width: trackWidth } : undefined}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{\n min: 0,\n max: max,\n now: isIndeterminate ? undefined : value,\n }}\n >\n {/* Progress Fill */}\n <View\n className={cn(\n 'h-full rounded-full',\n !customColor && colorStyles[color],\n isIndeterminate && 'animate-pulse w-1/3'\n )}\n style={{\n ...(isIndeterminate ? {} : { width: `${percentage}%` }),\n ...(customColor ? { backgroundColor: customColor } : {}),\n }}\n />\n </View>\n </View>\n )\n}\n\nexport interface CircularProgressProps extends ViewProps {\n /** Current value (0-100) */\n value?: number\n /** Maximum value */\n max?: number\n /** Whether the progress is indeterminate */\n isIndeterminate?: boolean\n /** Size of the progress circle (diameter) */\n size?: number\n /** Stroke width */\n strokeWidth?: number\n /** Color of the progress */\n color?: ProgressColor\n /** Whether to show the value in center */\n showValue?: boolean\n /** Custom value format function */\n formatValue?: (value: number, max: number) => string\n /**\n * Custom center content (a numeral, a timer readout, an icon). When provided it\n * replaces the {@link showValue} text — the ring becomes a generic container for\n * any centered element. See {@link CircularTimer} for the batteries-included timer.\n */\n children?: React.ReactNode\n /**\n * Fill the parent container (responsive) instead of drawing a fixed `size` box.\n * The SVG uses a `0 0 size size` viewBox scaled to the container, so `size` still\n * sets the geometry proportions (radius, stroke) while the ring grows/shrinks with\n * its parent — e.g. a wall column. Default false (fixed `size` px).\n */\n fill?: boolean\n /** Additional className */\n className?: string\n}\n\n/**\n * Circular progress indicator component.\n *\n * @example\n * <CircularProgress value={75} showValue />\n */\nexport function CircularProgress({\n value = 0,\n max = 100,\n isIndeterminate = false,\n size = 48,\n strokeWidth = 4,\n color = 'primary',\n showValue = false,\n formatValue = (v, m) => `${Math.round((v / m) * 100)}%`,\n children,\n fill = false,\n className,\n ...props\n}: CircularProgressProps) {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n const radius = (size - strokeWidth) / 2\n const circumference = 2 * Math.PI * radius\n const strokeDashoffset = circumference - (percentage / 100) * circumference\n const center = size / 2\n // Fixed: a `size × size` px box. Fill: fill the parent, staying square, and let\n // the `0 0 size size` viewBox scale the geometry to fit (a responsive ring).\n const boxStyle = fill ? { width: '100%' as const, aspectRatio: 1 } : { width: size, height: size }\n\n return (\n <View\n className={cn('items-center justify-center', className)}\n style={boxStyle}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{\n min: 0,\n max: max,\n now: isIndeterminate ? undefined : value,\n }}\n {...props}\n >\n {/* SVG implementation for web — width/height 100% so it scales with `boxStyle`. */}\n <View className={cn(isIndeterminate && 'animate-spin')} style={boxStyle}>\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${size} ${size}`}\n style={{ position: 'absolute' }}\n >\n {/* Background track */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke=\"var(--color-border-default)\"\n strokeWidth={strokeWidth}\n />\n {/* Progress arc */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke={colorVarMap[color]}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={isIndeterminate ? circumference * 0.75 : strokeDashoffset}\n transform={`rotate(-90 ${center} ${center})`}\n style={{ transition: 'stroke-dashoffset 300ms cubic-bezier(0.22, 1, 0.36, 1)' }}\n />\n </svg>\n </View>\n\n {/* Center: custom children take precedence over the showValue readout. */}\n {children != null ? (\n <View\n style={{\n position: 'absolute',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n }}\n >\n {children}\n </View>\n ) : (\n showValue &&\n !isIndeterminate && (\n <Text\n className=\"text-xs font-semibold text-text-primary absolute\"\n style={{ fontSize: Math.max(size * 0.22, 10) }}\n >\n {formatValue(value, max)}\n </Text>\n )\n )}\n </View>\n )\n}\n\nexport interface ProgressStepsProps extends ViewProps {\n /** Current step (0-indexed) */\n currentStep: number\n /** Total number of steps */\n totalSteps: number\n /** Color of completed steps */\n color?: ProgressColor\n /** Size of step indicators */\n size?: ProgressSize\n /** Labels for each step */\n labels?: string[]\n /** Additional className */\n className?: string\n}\n\nconst stepSizeStyles: Record<ProgressSize, { dot: string; connector: string }> = {\n sm: { dot: 'w-2 h-2', connector: 'h-0.5' },\n md: { dot: 'w-3 h-3', connector: 'h-1' },\n lg: { dot: 'w-4 h-4', connector: 'h-1.5' },\n}\n\n/**\n * Step-based progress indicator.\n *\n * @example\n * <ProgressSteps currentStep={2} totalSteps={4} labels={['Cart', 'Shipping', 'Payment', 'Done']} />\n */\nexport function ProgressSteps({\n currentStep,\n totalSteps,\n color = 'primary',\n size = 'md',\n labels,\n className,\n ...props\n}: ProgressStepsProps) {\n const { dot, connector } = stepSizeStyles[size]\n\n return (\n <View className={cn('w-full', className)} {...props}>\n <View className=\"flex-row items-center\">\n {Array.from({ length: totalSteps }).map((_, index) => (\n <React.Fragment key={index}>\n {/* Step dot */}\n <View\n className={cn(\n 'rounded-full',\n dot,\n index <= currentStep ? colorStyles[color] : 'bg-border-strong'\n )}\n />\n\n {/* Connector line */}\n {index < totalSteps - 1 && (\n <View\n className={cn(\n 'flex-1 mx-1',\n connector,\n index < currentStep ? colorStyles[color] : 'bg-border-strong'\n )}\n />\n )}\n </React.Fragment>\n ))}\n </View>\n\n {/* Labels */}\n {labels && labels.length > 0 && (\n <View className=\"flex-row mt-2\">\n {labels.map((label, index) => (\n <Text\n key={index}\n className={cn(\n 'flex-1 text-xs text-center',\n index <= currentStep ? 'text-text-primary font-medium' : 'text-text-tertiary'\n )}\n >\n {label}\n </Text>\n ))}\n </View>\n )}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport type { ReactNode } from 'react'\nimport { View, Text } from 'react-native'\nimport { CircularProgress, colorVarMap, type ProgressColor } from '../../ui/progress/Progress'\nimport { useTimer, type TimerMode } from '../../../hooks/useTimer'\n\nexport interface CircularTimerProps {\n /** Total duration (ms). `down`: the countdown length; `up`: the target for progress. */\n durationMs: number\n /** Controlled elapsed time (ms). */\n elapsedMs: number\n /** `down` (default) counts remaining toward 0 (ring drains); `up` counts elapsed up (ring fills). */\n mode?: TimerMode\n /** Ring diameter (px) — the geometry/stroke reference. Default 160. */\n size?: number\n /** Ring stroke width (px). Default 8. */\n strokeWidth?: number\n /** Fill the parent container (responsive) instead of a fixed `size` box. */\n fill?: boolean\n /** Ring color while running. Default `primary`. */\n color?: ProgressColor\n /**\n * `down` mode: the text shown in the center — and the color the ring fills to — when\n * the countdown completes (e.g. `doneLabel=\"GO\"`). Omit to keep showing `0:00`.\n */\n doneLabel?: string\n /** Ring + center color when complete (with {@link doneLabel}). Default `success`. */\n doneColor?: ProgressColor\n /** Optional controls rendered below the ring (e.g. +30s / Skip). */\n controls?: ReactNode\n /** Accessibility label for the timer. Defaults to a seconds-remaining description. */\n accessibilityLabel?: string\n testID?: string\n}\n\n/**\n * A circular countdown / countup with a time readout in the center — the graphical\n * sibling of {@link TimerReadout}. Batteries-included: owns {@link useTimer} (pass\n * controlled `durationMs` + `elapsedMs`) and composes {@link CircularProgress} for the\n * arc (`down` drains as time runs out, `up` fills), rendering the mm:ss label in its\n * center slot. On completion (`down` + {@link doneLabel}) the ring fills fully in\n * {@link doneColor} and the center reads the done label — the \"go\" moment. An optional\n * {@link controls} node renders below the ring. Consumers (e.g. `RestTimer`'s `ring`\n * variant) wrap this and add their own domain chrome.\n */\nexport function CircularTimer({\n durationMs,\n elapsedMs,\n mode = 'down',\n size = 160,\n strokeWidth = 8,\n fill = false,\n color = 'primary',\n doneLabel,\n doneColor = 'success',\n controls,\n accessibilityLabel,\n testID,\n}: CircularTimerProps) {\n const { remainingMs, progress, label, done } = useTimer({ mode, durationMs, elapsedMs })\n\n const isDone = done && mode === 'down'\n const showDone = isDone && doneLabel != null\n // Down → the remaining fraction (ring drains); up → elapsed progress (ring fills).\n // A completed countdown with a done label fills fully to signal \"go\".\n const remainingFrac = durationMs > 0 ? Math.max(0, Math.min(1, remainingMs / durationMs)) : 0\n const arc = mode === 'down' ? (showDone ? 1 : remainingFrac) : progress\n const ringColor: ProgressColor = showDone ? doneColor : color\n\n const remainingSec = Math.ceil(Math.max(0, remainingMs) / 1000)\n const a11y =\n accessibilityLabel ?? (isDone ? 'Timer complete' : `${remainingSec} seconds remaining`)\n\n return (\n <View\n style={{ alignItems: 'center', gap: 16 }}\n accessibilityRole=\"timer\"\n accessibilityLabel={a11y}\n testID={testID ?? 'circular-timer'}\n >\n <CircularProgress\n value={arc}\n max={1}\n size={size}\n strokeWidth={strokeWidth}\n fill={fill}\n color={ringColor}\n // A distinct static name for the ring (the live countdown text lives on the\n // enclosing timer role) — satisfies the progressbar-name a11y rule without\n // duplicating the timer label.\n accessibilityLabel=\"Timer ring\"\n testID=\"circular-timer-ring\"\n >\n <Text\n className={showDone ? undefined : 'text-text-primary'}\n style={{\n fontSize: Math.round(size * (showDone ? 0.28 : 0.24)),\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '800',\n fontVariant: ['tabular-nums'],\n letterSpacing: showDone ? 1 : -1,\n ...(showDone ? { color: colorVarMap[doneColor] } : null),\n }}\n testID=\"circular-timer-label\"\n >\n {showDone ? doneLabel : label}\n </Text>\n </CircularProgress>\n {controls}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, Pressable } from 'react-native'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { useTimer } from '../../../hooks/useTimer'\nimport { CircularTimer } from '../CircularTimer/CircularTimer'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** Default `ring` diameter (px) — the across-the-room wall rest treatment. */\nconst RING_DEFAULT_SIZE = 180\n\nexport interface RestTimerProps {\n totalSeconds: number\n elapsedMs: number\n onSkip: () => void\n onAddTime: () => void\n nextSetInfo?: string\n visible: boolean\n /** Passive/poll-only mode: hides the Skip and +30s controls, keeps the countdown, progress bar, and next-set line. */\n displayOnly?: boolean\n /**\n * `bar` (default) — the compact linear card (REST label + mm:ss + progress bar +\n * controls), the mobile bottom-bar treatment. `ring` — the across-the-room wall\n * treatment: a draining countdown ring (composes {@link CircularProgress}) with a\n * big remaining-seconds numeral, the next-set line, and the same controls.\n */\n variant?: 'bar' | 'ring'\n /** `ring` diameter in px. Default 180. */\n size?: number\n}\n\n/** The +30s / Skip control row — shared by both variants (hidden in `displayOnly`). */\nfunction RestActions({ onAddTime, onSkip }: { onAddTime: () => void; onSkip: () => void }) {\n return (\n <View style={{ flexDirection: 'row', gap: 8 }}>\n <Pressable\n onPress={onAddTime}\n style={{\n backgroundColor: 'rgba(255,255,255,0.06)',\n paddingVertical: 8,\n paddingHorizontal: 20,\n borderRadius: 8,\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add 30 seconds\"\n testID=\"rest-timer-add-time\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 11, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}\n >\n +30s\n </Text>\n </Pressable>\n <Pressable\n onPress={onSkip}\n style={{\n backgroundColor: 'rgba(255,121,0,0.12)',\n paddingVertical: 8,\n paddingHorizontal: 20,\n borderRadius: 8,\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Skip rest\"\n testID=\"rest-timer-skip\"\n >\n <Text\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: BRAND_PRIMARY,\n }}\n >\n Skip\n </Text>\n </Pressable>\n </View>\n )\n}\n\ninterface RestTimerRingProps {\n totalSeconds: number\n elapsedMs: number\n remainingSec: number\n done: boolean\n size: number\n nextSetInfo?: string\n displayOnly: boolean\n onSkip: () => void\n onAddTime: () => void\n}\n\n/**\n * The `ring` render: the wall rest treatment. Composes the generic {@link CircularTimer}\n * (which owns the arc + mm:ss readout + the fill-green \"GO\" done state), passing the\n * shared {@link RestActions} as its controls, and adds the rest-specific next-set footer\n * caption below. Rest-domain chrome only — the timer mechanics live in `CircularTimer`.\n */\nfunction RestTimerRing({\n totalSeconds,\n elapsedMs,\n remainingSec,\n done,\n size,\n nextSetInfo,\n displayOnly,\n onSkip,\n onAddTime,\n}: RestTimerRingProps) {\n const a11yLabel = done\n ? 'Rest complete, next set ready'\n : `Rest timer, ${Math.max(0, remainingSec)} seconds remaining`\n return (\n <View style={{ alignItems: 'center', gap: 16 }} testID=\"rest-timer\">\n <CircularTimer\n durationMs={totalSeconds * 1000}\n elapsedMs={elapsedMs}\n mode=\"down\"\n size={size}\n doneLabel=\"GO\"\n doneColor=\"success\"\n accessibilityLabel={a11yLabel}\n controls={!displayOnly ? <RestActions onAddTime={onAddTime} onSkip={onSkip} /> : undefined}\n testID=\"rest-timer-ring\"\n />\n {nextSetInfo != null && (\n <Text\n className=\"text-text-tertiary\"\n style={{ fontSize: 13, fontFamily: 'Inter, sans-serif' }}\n testID=\"rest-timer-next-set\"\n >\n {nextSetInfo}\n </Text>\n )}\n </View>\n )\n}\n\nexport function RestTimer({\n totalSeconds,\n elapsedMs,\n onSkip,\n onAddTime,\n nextSetInfo,\n visible,\n displayOnly = false,\n variant = 'bar',\n size = RING_DEFAULT_SIZE,\n}: RestTimerProps) {\n // useTimer owns the countdown math (remaining/progress/mm:ss); a zero-duration\n // timer is complete, which keeps the width out of the 0/0 === NaN case.\n const {\n remainingMs,\n progress,\n label: timeDisplay,\n done,\n } = useTimer({\n mode: 'down',\n durationMs: totalSeconds * 1000,\n elapsedMs,\n })\n const remainingSec = Math.ceil(remainingMs / 1000)\n const progressPct = progress * 100\n\n if (!visible) return null\n\n if (variant === 'ring') {\n return (\n <RestTimerRing\n totalSeconds={totalSeconds}\n elapsedMs={elapsedMs}\n remainingSec={remainingSec}\n done={done}\n size={size}\n nextSetInfo={nextSetInfo}\n displayOnly={displayOnly}\n onSkip={onSkip}\n onAddTime={onAddTime}\n />\n )\n }\n\n return (\n <View\n className=\"bg-surface-raised\"\n style={{\n width: '100%',\n borderTopWidth: 1,\n borderTopColor: resolveColor('border-default'),\n paddingVertical: 12,\n paddingHorizontal: 16,\n }}\n accessibilityRole=\"timer\"\n accessibilityLabel={`Rest timer, ${remainingSec} seconds remaining`}\n testID=\"rest-timer\"\n >\n {/* Top row */}\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n }}\n >\n {/* Left side */}\n <View style={{ flexDirection: 'column' }}>\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: 1,\n }}\n testID=\"rest-timer-label\"\n >\n REST\n </Text>\n {nextSetInfo != null && (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n marginTop: 2,\n }}\n testID=\"rest-timer-next-set\"\n >\n {nextSetInfo}\n </Text>\n )}\n </View>\n\n {/* Right side - time display */}\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 28,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n fontVariant: ['tabular-nums'],\n letterSpacing: -0.5,\n }}\n testID=\"rest-timer-time\"\n >\n {timeDisplay}\n </Text>\n </View>\n\n {/* Progress bar */}\n <View\n className=\"bg-border\"\n style={{\n height: 3,\n borderRadius: 2,\n marginBottom: 12,\n }}\n testID=\"rest-timer-progress-track\"\n >\n <View\n style={{\n height: '100%',\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 2,\n width: `${progressPct}%`,\n }}\n testID=\"rest-timer-progress-fill\"\n />\n </View>\n\n {/* Actions row — hidden in display-only (poll-only) mode */}\n {!displayOnly && <RestActions onAddTime={onAddTime} onSkip={onSkip} />}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport React from 'react'\nimport { View, Text } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport interface SupersetWrapperProps {\n label?: string\n color?: string\n children: React.ReactNode\n}\n\nconst DEFAULTS = {\n label: 'SS',\n color: getSemanticColors('dark')['brand-primary'],\n bgBase: getSemanticColors('dark')['background-base'],\n} as const\n\nexport function SupersetWrapper({\n label = DEFAULTS.label,\n color = DEFAULTS.color,\n children,\n}: SupersetWrapperProps) {\n return (\n <View\n style={{\n position: 'relative',\n borderLeftWidth: 3,\n borderLeftColor: color,\n paddingLeft: 8,\n marginHorizontal: 12,\n marginBottom: 8,\n overflow: 'visible',\n }}\n accessibilityRole={'group' as never}\n accessibilityLabel={`Superset: ${label}`}\n testID=\"superset-wrapper\"\n >\n <Text\n style={{\n position: 'absolute',\n top: -1,\n left: -3,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n backgroundColor: color,\n color: DEFAULTS.bgBase,\n paddingVertical: 2,\n paddingHorizontal: 6,\n borderBottomRightRadius: 4,\n letterSpacing: 0.5,\n zIndex: 2,\n }}\n testID=\"superset-label\"\n >\n {label}\n </Text>\n <View style={{ gap: 2 }} testID=\"superset-children\">\n {children}\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'\nimport { InputBar } from './InputBar'\nimport { RestTimer } from './RestTimer'\nimport { SupersetWrapper } from './SupersetWrapper'\nimport { type SetRowProps } from './SetRow'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** Where an exercise sits in the during-workout flow. */\nexport type ActiveExerciseStatus = 'completed' | 'active' | 'upcoming'\n\n/**\n * One exercise in the running workout. Projected onto an `ExerciseCard`, whose\n * visual state is driven by `status` and the page's zoom focus: completed and\n * active exercises collapse/expand, upcoming ones stay dimmed.\n */\nexport interface ActiveWorkoutExercise {\n /** Stable id for zoom-focus selection. */\n id: string\n /** Exercise name, e.g. \"Barbell Bench Press\". */\n name: string\n /** Position in the workout flow. */\n status: ActiveExerciseStatus\n /** Unit used for this exercise's loads. */\n unit: 'lbs' | 'kg'\n /** Total sets prescribed for this exercise. */\n totalPlannedSets: number\n /** Collapsed summary (sets × reps @ weight) for a completed exercise. */\n summary?: ExerciseCardProps['summary']\n /** Flags a personal-record exercise. */\n isPR?: boolean\n /** Prescribed tempo, revealed when expanded. */\n tempo?: ExerciseCardProps['tempo']\n /** Per-rep velocities for each logged set (drives collapsed strips + set count). */\n setVelocities?: number[][]\n /** Per-set breakdown revealed when expanded. */\n sets?: SetRowProps[]\n /** One-line prescription for an upcoming exercise. */\n prescription?: string\n /** Previous-best hint for an upcoming exercise. */\n previousBest?: string\n /** Groups consecutive exercises under a shared `SupersetWrapper`. */\n supersetId?: string\n}\n\n/** A superset grouping consecutive exercises that share its id. */\nexport interface ActiveWorkoutSuperset {\n /** Matches `ActiveWorkoutExercise.supersetId`. */\n id: string\n /** Corner badge label, e.g. \"SS1\". */\n label: string\n /** Accent color for the wrapper rail + label. */\n color?: string\n}\n\n/** Live-set inputs shown in the bottom `InputBar`. */\nexport interface ActiveWorkoutInput {\n /** Current reps field value. */\n reps: string\n /** Current weight field value. */\n weight: string\n}\n\n/** Rest-timer inputs shown in the bottom `RestTimer`. */\nexport interface ActiveWorkoutRest {\n /** Prescribed rest length, seconds. */\n totalSeconds: number\n /** Elapsed rest, milliseconds. */\n elapsedMs: number\n /** Next-set hint, e.g. \"Set 3 · 8 × 195 lbs\". */\n nextSetInfo?: string\n}\n\n/** Derived, page-level roll-up of workout progress. */\nexport interface WorkoutProgress {\n /** Number of exercises marked completed. */\n completedExercises: number\n /** Total exercises in the workout. */\n totalExercises: number\n /** Sets logged so far across all exercises. */\n completedSets: number\n /** Total sets prescribed across all exercises. */\n totalSets: number\n /** Fraction of prescribed sets logged, 0-1. */\n fraction: number\n}\n\n/** An ordered render group: a lone exercise or a superset of exercises. */\nexport type WorkoutGroup =\n | { type: 'single'; exercise: ActiveWorkoutExercise }\n | { type: 'superset'; superset: ActiveWorkoutSuperset; exercises: ActiveWorkoutExercise[] }\n\nexport interface ActiveWorkoutPageProps extends ViewProps {\n /** Workout name shown in the header. */\n title?: string\n /** Context line under the title, e.g. \"Push Day A · Week 6\". */\n subtitle?: string\n /** Exercises in flow order. */\n exercises: ActiveWorkoutExercise[]\n /** Superset groupings referenced by `exercise.supersetId`. */\n supersets?: ActiveWorkoutSuperset[]\n /** Seed reps/weight for the live `InputBar`. */\n input?: ActiveWorkoutInput\n /** Rest-timer state; when resting, the timer replaces the input bar. */\n rest?: ActiveWorkoutRest\n /** Start the page in the resting state (timer showing). */\n initialResting?: boolean\n className?: string\n}\n\n/** Count the sets logged for an exercise (pure). */\nexport function countCompletedSets(exercise: ActiveWorkoutExercise): number {\n if (exercise.setVelocities != null) return exercise.setVelocities.length\n if (exercise.status === 'completed') return exercise.totalPlannedSets\n return 0\n}\n\n/** Roll up the exercises into the header progress readout (pure, testable). */\nexport function deriveWorkoutProgress(exercises: ActiveWorkoutExercise[]): WorkoutProgress {\n let completedExercises = 0\n let completedSets = 0\n let totalSets = 0\n for (const exercise of exercises) {\n if (exercise.status === 'completed') completedExercises += 1\n completedSets += countCompletedSets(exercise)\n totalSets += exercise.totalPlannedSets\n }\n return {\n completedExercises,\n totalExercises: exercises.length,\n completedSets,\n totalSets,\n fraction: totalSets === 0 ? 0 : completedSets / totalSets,\n }\n}\n\n/** The active exercise anchors the bottom bar; find it, or null (pure). */\nexport function findActiveExercise(\n exercises: ActiveWorkoutExercise[]\n): ActiveWorkoutExercise | null {\n return exercises.find((exercise) => exercise.status === 'active') ?? null\n}\n\n/** Whether an exercise renders as the dimmed, not-yet-reached representation (pure). */\nexport function isUpcomingExercise(status: ActiveExerciseStatus): boolean {\n return status === 'upcoming'\n}\n\n/** Project an exercise onto ExerciseCard props, wiring zoom focus (pure). */\nexport function toActiveCardProps(\n exercise: ActiveWorkoutExercise,\n focused: boolean,\n onToggle: () => void,\n supersetPosition: ExerciseCardProps['supersetPosition'] = null,\n supersetColor?: string\n): ExerciseCardProps {\n const upcoming = isUpcomingExercise(exercise.status)\n return {\n name: exercise.name,\n upcoming,\n expanded: focused,\n onExpandedChange: onToggle,\n summary: exercise.summary,\n isPR: exercise.isPR,\n tempo: exercise.tempo,\n setVelocities: exercise.setVelocities,\n totalPlannedSets: exercise.totalPlannedSets,\n sets: focused ? exercise.sets : undefined,\n prescription: exercise.prescription,\n previousBest: exercise.previousBest,\n supersetPosition,\n supersetColor,\n }\n}\n\n/** Fold consecutive same-superset exercises into render groups (pure). */\nexport function groupExercises(\n exercises: ActiveWorkoutExercise[],\n supersets: ActiveWorkoutSuperset[]\n): WorkoutGroup[] {\n const byId = new Map(supersets.map((superset) => [superset.id, superset]))\n const groups: WorkoutGroup[] = []\n for (const exercise of exercises) {\n const superset = exercise.supersetId != null ? byId.get(exercise.supersetId) : undefined\n const last = groups[groups.length - 1]\n if (superset != null && last?.type === 'superset' && last.superset.id === superset.id) {\n last.exercises.push(exercise)\n } else if (superset != null) {\n groups.push({ type: 'superset', superset, exercises: [exercise] })\n } else {\n groups.push({ type: 'single', exercise })\n }\n }\n return groups\n}\n\n/** Position of an exercise within its superset, for corner-radius stitching. */\nfunction supersetPositionAt(index: number, length: number): ExerciseCardProps['supersetPosition'] {\n if (length === 1) return null\n if (index === 0) return 'first'\n if (index === length - 1) return 'last'\n return 'middle'\n}\n\nfunction WorkoutHeader({\n title,\n subtitle,\n progress,\n}: {\n title: string\n subtitle?: string\n progress: WorkoutProgress\n}) {\n return (\n <View style={{ gap: 10 }} testID=\"active-workout-page-header\">\n <View className=\"flex-row items-start justify-between\" style={{ gap: 8 }}>\n <View style={{ flexShrink: 1 }}>\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"active-workout-page-title\"\n >\n {title}\n </Text>\n {subtitle != null && (\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 2,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"active-workout-page-subtitle\"\n >\n {subtitle}\n </Text>\n )}\n </View>\n <View style={{ alignItems: 'flex-end' }} testID=\"active-workout-page-progress-count\">\n <Text\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n color: BRAND_PRIMARY,\n fontVariant: ['tabular-nums'],\n }}\n >\n {`${progress.completedExercises}/${progress.totalExercises}`}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {`${progress.completedSets}/${progress.totalSets} sets`}\n </Text>\n </View>\n </View>\n <View\n className=\"bg-border\"\n style={{ height: 4, borderRadius: 2 }}\n testID=\"active-workout-page-progress-track\"\n >\n <View\n style={{\n height: '100%',\n width: `${Math.round(progress.fraction * 100)}%`,\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 2,\n }}\n testID=\"active-workout-page-progress-fill\"\n />\n </View>\n </View>\n )\n}\n\ninterface ExerciseListProps {\n groups: WorkoutGroup[]\n focusedId: string | null\n onToggle: (id: string) => void\n}\n\nfunction ExerciseList({ groups, focusedId, onToggle }: ExerciseListProps) {\n return (\n <View style={{ gap: 10 }} testID=\"active-workout-page-exercises\">\n {groups.map((group) => {\n if (group.type === 'single') {\n return (\n <View\n key={group.exercise.id}\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n }}\n >\n <ExerciseCard\n {...toActiveCardProps(group.exercise, group.exercise.id === focusedId, () =>\n onToggle(group.exercise.id)\n )}\n />\n </View>\n )\n }\n return (\n <SupersetWrapper\n key={group.superset.id}\n label={group.superset.label}\n color={group.superset.color}\n >\n {group.exercises.map((exercise, index) => (\n <ExerciseCard\n key={exercise.id}\n {...toActiveCardProps(\n exercise,\n exercise.id === focusedId,\n () => onToggle(exercise.id),\n supersetPositionAt(index, group.exercises.length),\n group.superset.color\n )}\n />\n ))}\n </SupersetWrapper>\n )\n })}\n </View>\n )\n}\n\n/**\n * ActiveWorkoutPage — the during-workout screen, built as a zoom hierarchy over\n * `ExerciseCard`s. A header progress bar rolls up completed sets; the flow list\n * dims upcoming exercises, collapses finished ones to their velocity strips, and\n * expands exactly one focused exercise to its `SetRow` breakdown. Consecutive\n * superset exercises stitch together inside a `SupersetWrapper`. A pinned bottom\n * bar toggles between the live `InputBar` (log the next set) and the `RestTimer`.\n * Focus and rest are page-level state; children keep their own styles.\n *\n * @example\n * <ActiveWorkoutPage title=\"Push Day A\" exercises={exercises} />\n */\nexport function ActiveWorkoutPage({\n title = 'Active Workout',\n subtitle,\n exercises,\n supersets = [],\n input,\n rest,\n initialResting = false,\n className,\n ...props\n}: ActiveWorkoutPageProps) {\n const active = findActiveExercise(exercises)\n const [focusedId, setFocusedId] = useState<string | null>(active?.id ?? null)\n const [resting, setResting] = useState(initialResting)\n const [reps, setReps] = useState(input?.reps ?? '')\n const [weight, setWeight] = useState(input?.weight ?? '')\n\n const progress = useMemo(() => deriveWorkoutProgress(exercises), [exercises])\n const groups = useMemo(() => groupExercises(exercises, supersets), [exercises, supersets])\n\n const toggleFocus = (id: string) => setFocusedId((current) => (current === id ? null : id))\n\n const nextSetNumber = active != null ? countCompletedSets(active) + 1 : 1\n const canRecord = reps.trim() !== '' && weight.trim() !== ''\n const showRest = resting && rest != null\n const showInput = !showRest && active != null\n\n return (\n <View\n className={['bg-background-base', className].filter(Boolean).join(' ')}\n style={{ position: 'relative', width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={title}\n testID=\"active-workout-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"active-workout-page-content\">\n <WorkoutHeader title={title} subtitle={subtitle} progress={progress} />\n <ExerciseList groups={groups} focusedId={focusedId} onToggle={toggleFocus} />\n </View>\n\n {(showRest || showInput) && (\n <View\n style={{ borderTopWidth: 1, borderTopColor: resolveColor('border-default') }}\n testID=\"active-workout-page-bottom-bar\"\n >\n {showRest && rest != null ? (\n <RestTimer\n totalSeconds={rest.totalSeconds}\n elapsedMs={rest.elapsedMs}\n nextSetInfo={rest.nextSetInfo}\n onSkip={() => setResting(false)}\n onAddTime={() => undefined}\n visible\n />\n ) : (\n active != null && (\n <InputBar\n exerciseName={active.name}\n setNumber={nextSetNumber}\n totalSets={active.totalPlannedSets}\n reps={reps}\n weight={weight}\n unit={active.unit}\n onRepsChange={setReps}\n onWeightChange={setWeight}\n onRecord={() => {\n if (rest != null) setResting(true)\n }}\n canRecord={canRecord}\n visible\n />\n )\n )}\n </View>\n )}\n </View>\n )\n}\n","/**\n * Elevation System\n *\n * A unified depth system where each elevation level corresponds to:\n * - Calculated surface color (derived from base using lighten)\n * - Shadow intensity and style (raised/pressed)\n * - Dynamically calculated shadow colors (derived from surface color)\n * - Semantic name for reference\n *\n * Elevation range: -2 (deep inset) to +5 (floating overlay)\n *\n * Negative elevations: Inset/pressed elements (sunken into surface)\n * Zero elevation: Base surface (background/page level)\n * Positive elevations: Raised elements (floating above surface)\n *\n * All colors are calculated dynamically from a base surface color,\n * allowing for custom surfaces and consistent color relationships.\n *\n * Lighting Model: Light source from upper-right corner\n * - Raised elements are always lighter than base (consistent across themes)\n * - Base colors must allow sufficient lightening in both themes\n */\n\nimport { Platform, type ViewStyle } from 'react-native'\nimport { lighten, darken, hexToRgb, rgbToHsv, hsvToRgb, rgbToHex } from './shadows'\nimport { semanticColorsLight, semanticColorsDark } from './tokens/semantic'\n\nexport type ElevationLevel = -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5\n\nexport interface ElevationConfig {\n /** Semantic name for this elevation level */\n name: string\n /** Amount to lighten base color (0-1) */\n colorAdjustment: number\n /** Shadow intensity */\n shadowIntensity: 'subtle' | 'medium' | 'strong'\n /** Shadow style: raised (floating) or pressed (inset) */\n shadowStyle: 'raised' | 'pressed'\n /** Description of use case */\n description: string\n}\n\nexport const elevationSystem: Record<ElevationLevel, ElevationConfig> = {\n // Deep inset (recessed input fields, deeply pressed buttons)\n [-2]: {\n name: 'deep-inset',\n colorAdjustment: 0,\n shadowIntensity: 'strong',\n shadowStyle: 'pressed',\n description: 'Deeply recessed elements (e.g., input fields, deeply pressed buttons)',\n },\n\n // Shallow inset (pressed buttons, sunken panels)\n [-1]: {\n name: 'inset',\n colorAdjustment: 0,\n shadowIntensity: 'medium',\n shadowStyle: 'pressed',\n description: 'Shallow inset elements (e.g., pressed buttons, sunken panels within cards)',\n },\n\n // Base level (page background, default surface)\n [0]: {\n name: 'base',\n colorAdjustment: 0,\n shadowIntensity: 'subtle',\n shadowStyle: 'raised',\n description: 'Base surface level (page background, default containers)',\n },\n\n // Level 1: Subtle elevation (outline cards, subtle containers)\n [1]: {\n name: 'subtle',\n colorAdjustment: 0.01,\n shadowIntensity: 'subtle',\n shadowStyle: 'raised',\n description: 'Subtle elevation (outline cards, subtle containers)',\n },\n\n // Level 2: Standard elevation (default cards, buttons)\n [2]: {\n name: 'standard',\n colorAdjustment: 0.02,\n shadowIntensity: 'medium',\n shadowStyle: 'raised',\n description: 'Standard elevation (default cards, raised buttons)',\n },\n\n // Level 3: Prominent elevation (important cards, modals)\n [3]: {\n name: 'prominent',\n colorAdjustment: 0.04,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'Prominent elevation (important cards, modals, dropdowns)',\n },\n\n // Level 4: High elevation (overlays, popovers)\n [4]: {\n name: 'high',\n colorAdjustment: 0.06,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'High elevation (overlays, popovers, tooltips)',\n },\n\n // Level 5: Floating (toasts, floating action buttons)\n [5]: {\n name: 'floating',\n colorAdjustment: 0.08,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'Floating elevation (toasts, floating action buttons, highest z-index)',\n },\n}\n\n/**\n * Calculate rim light color from the BASE color.\n * Creates a consistent bright highlight with opacity that scales with elevation.\n *\n * The rim light represents light hitting the edge of raised elements from a\n * consistent light source. Uses ABSOLUTE HSV value (not relative lightening)\n * for consistent intensity across all surface colors.\n *\n * For colored surfaces: preserves hue/saturation, sets value to fixed bright level\n * For gray surfaces: uses white with appropriate opacity\n *\n * @param baseColor - The base surface color (hex)\n * @param level - Elevation level (used to scale opacity)\n */\nfunction calculateRimLightColor(baseColor: string, level: ElevationLevel): string {\n const rgb = hexToRgb(baseColor)\n if (!rgb) {\n return 'rgba(255, 255, 255, 0.5)'\n }\n\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const isLight = hsv.v > 0.6\n const isSaturated = hsv.s > 0.3 // Colored (not gray)\n\n // Opacity scales with elevation to compensate for lighter surfaces at higher levels\n // Range: +0% at level 1 to +20% at level 5\n const absLevel = Math.abs(level)\n const opacityBoost = Math.max(0, (absLevel - 1) * 0.05) // +5% per level above 1 (0% to 20%)\n\n if (isSaturated) {\n // For colored surfaces, preserve hue and saturation but set value to fixed bright level\n // This ensures consistent rim light intensity across all colored surfaces\n const rimLightValue = 0.95 // Fixed bright value for rim light\n const rimLightRgb = hsvToRgb(hsv.h, hsv.s * 0.3, rimLightValue) // Reduce saturation for brighter appearance\n\n // Base opacity + elevation boost, capped at 1.0\n const baseOpacity = isLight ? 0.9 : 0.5\n const finalOpacity = Math.min(1, baseOpacity + opacityBoost)\n return `rgba(${rimLightRgb.r}, ${rimLightRgb.g}, ${rimLightRgb.b}, ${finalOpacity.toFixed(2)})`\n } else {\n // For gray/neutral surfaces, use white with appropriate opacity\n const baseOpacity = isLight ? 0.9 : 0.12\n const finalOpacity = Math.min(1, baseOpacity + opacityBoost)\n return `rgba(255, 255, 255, ${finalOpacity.toFixed(2)})`\n }\n}\n\n/**\n * Calculate dark shadow colors from the surface color.\n * The dark shadow is cast BY the element, so it should match the surface color.\n *\n * Uses ABSOLUTE HSV value (not relative darkening) for consistent shadow intensity\n * across all surface colors - simulating a consistent light source.\n *\n * For colored surfaces: preserves hue/saturation, sets value to fixed dark level\n * For gray surfaces: uses black with appropriate opacity\n */\nfunction calculateDarkShadowColors(surfaceColor: string): {\n dark: string\n darker: string\n} {\n const rgb = hexToRgb(surfaceColor)\n if (!rgb) {\n return {\n dark: 'rgba(0, 0, 0, 0.3)',\n darker: 'rgba(0, 0, 0, 0.4)',\n }\n }\n\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const isLight = hsv.v > 0.6\n const isSaturated = hsv.s > 0.3\n\n if (isSaturated) {\n // For colored surfaces, preserve hue and saturation but set value to fixed dark level\n // This ensures consistent shadow intensity across all colored surfaces\n const darkShadowValue = 0.15 // Fixed dark value for shadows\n const darkShadowRgb = hsvToRgb(hsv.h, hsv.s, darkShadowValue)\n\n if (isLight) {\n return {\n dark: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.3)`,\n darker: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.4)`,\n }\n } else {\n return {\n dark: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.5)`,\n darker: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.6)`,\n }\n }\n } else {\n // For gray surfaces, use standard black shadows\n if (isLight) {\n return {\n dark: 'rgba(0, 0, 0, 0.2)',\n darker: 'rgba(0, 0, 0, 0.3)',\n }\n } else {\n return {\n dark: 'rgba(0, 0, 0, 0.5)',\n darker: 'rgba(0, 0, 0, 0.6)',\n }\n }\n }\n}\n\n/**\n * Get rim light size config.\n * Fixed 1px offset and blur for a consistent, crisp rim highlight.\n * Opacity scaling (in calculateRimLightColor) handles elevation differences.\n */\nfunction getRimLightConfig(): { offset: number; blur: number } {\n return {\n offset: 1, // Fixed 1px for crisp rim\n blur: 1, // Tight blur for crisp edge\n }\n}\n\n/**\n * Get elevation configuration for a given level\n */\nexport function getElevationConfig(level: ElevationLevel): ElevationConfig {\n return elevationSystem[level]\n}\n\n// Simple cache for elevation surface colors\nconst elevationSurfaceCache = new Map<string, string>()\nconst MAX_CACHE_SIZE = 100\n\nfunction getCacheKey(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark'): string {\n return `${baseColor}-${level}-${theme}`\n}\n\nfunction calculateElevationSurface(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark'\n): string {\n const config = elevationSystem[level]\n\n if (config.colorAdjustment === 0) {\n return baseColor\n }\n\n // For raised elevations (positive), always lighten (consistent lighting model)\n // Light source is from upper-right, so raised elements are always lighter\n // For inset elevations (negative), we keep base color (shadow creates depth)\n if (level < 0) {\n return baseColor // Inset elements use base color\n }\n\n // Always lighten for raised elements (consistent across themes)\n // Base colors must be chosen to allow sufficient lightening in dark mode\n return lighten(baseColor, config.colorAdjustment)\n}\n\n/**\n * Calculate surface color for an elevation level from a base color.\n * Results are cached to avoid redundant calculations.\n *\n * @param baseColor - Base surface color (hex)\n * @param level - Elevation level\n * @param theme - Current theme ('light' or 'dark')\n * @returns Calculated surface color (hex)\n */\nexport function getElevationSurface(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark'\n): string {\n const cacheKey = getCacheKey(baseColor, level, theme)\n\n // Check cache\n if (elevationSurfaceCache.has(cacheKey)) {\n return elevationSurfaceCache.get(cacheKey)!\n }\n\n // Calculate\n const result = calculateElevationSurface(baseColor, level, theme)\n\n // Cache result (with size limit to prevent memory leaks)\n if (elevationSurfaceCache.size >= MAX_CACHE_SIZE) {\n // Remove oldest entry (simple FIFO)\n const firstKey = elevationSurfaceCache.keys().next().value!\n elevationSurfaceCache.delete(firstKey)\n }\n elevationSurfaceCache.set(cacheKey, result)\n\n return result\n}\n\n// Cache for shadow styles (less frequently used, smaller cache)\nconst elevationShadowCache = new Map<string, ViewStyle>()\nconst MAX_SHADOW_CACHE_SIZE = 50\n\nfunction getShadowCacheKey(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean\n): string {\n return `${baseColor}-${level}-${theme}-${isHovered}`\n}\n\nfunction calculateElevationShadow(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean = false\n): ViewStyle {\n const config = elevationSystem[level]\n\n // Base level has no shadow\n if (level === 0) {\n return {}\n }\n\n // Calculate the actual elevated surface color\n const elevatedSurfaceColor = calculateElevationSurface(baseColor, level, theme)\n\n // Rim light: calculated from BASE color (consistent across all elevations)\n // This represents a consistent light source - only size changes with elevation\n const rimLightColor = calculateRimLightColor(baseColor, level)\n\n // Dark shadow: calculated from ELEVATED surface color\n // The shadow is cast by the element, so it should match the surface\n const darkShadowColors = calculateDarkShadowColors(elevatedSurfaceColor)\n\n // Get shadow intensity config (for dark shadow)\n const intensityConfig = {\n subtle: { offset: 1, blur: 2 },\n medium: { offset: 2, blur: 4 },\n strong: { offset: 2, blur: 5 },\n }\n\n const { offset, blur } = intensityConfig[config.shadowIntensity]\n\n // Get rim light config (scales with elevation level)\n const rimConfig = getRimLightConfig()\n\n if (config.shadowStyle === 'pressed') {\n // Inset shadow (pressed elements)\n if (isHovered) {\n // Reduce shadow depth for hover\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n return Platform.select({\n web: {\n boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n }\n\n return Platform.select({\n web: {\n boxShadow: `inset ${offset}px ${offset}px ${blur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n } else {\n // Raised shadow (floating elements)\n if (isHovered) {\n // Reduce shadow depth for hover\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n return Platform.select({\n web: {\n boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: hoverOffset, height: hoverOffset },\n shadowOpacity: 0.2,\n shadowRadius: hoverBlur / 2,\n elevation: hoverOffset,\n },\n }) as ViewStyle\n }\n\n return Platform.select({\n web: {\n boxShadow: `${offset}px ${offset}px ${blur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: offset, height: offset },\n shadowOpacity: 0.3,\n shadowRadius: blur / 2,\n elevation: offset,\n },\n }) as ViewStyle\n }\n}\n\n/**\n * Get shadow style for an elevation level, calculated dynamically from surface color.\n * Results are cached to avoid redundant calculations.\n *\n * @param baseColor - Base surface color (hex)\n * @param level - Elevation level\n * @param theme - Current theme ('light' or 'dark')\n * @param isHovered - Whether element is hovered\n * @returns ViewStyle with shadow properties\n */\nexport function getElevationShadow(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean = false\n): ViewStyle {\n const cacheKey = getShadowCacheKey(baseColor, level, theme, isHovered)\n\n // Check cache\n if (elevationShadowCache.has(cacheKey)) {\n return elevationShadowCache.get(cacheKey)!\n }\n\n // Calculate shadow\n const result = calculateElevationShadow(baseColor, level, theme, isHovered)\n\n // Cache result\n if (elevationShadowCache.size >= MAX_SHADOW_CACHE_SIZE) {\n const firstKey = elevationShadowCache.keys().next().value!\n elevationShadowCache.delete(firstKey)\n }\n elevationShadowCache.set(cacheKey, result)\n\n return result\n}\n\n/**\n * Elevation level backing a `<Surface pressed>` recess: the shallow `inset`\n * (-1) step. Pressed exposes ONE level of depth — pressed-2 is intentionally\n * not surfaced (the deeper `-2` deep-inset stays available to `elevation`).\n */\nexport const PRESSED_ELEVATION_LEVEL: ElevationLevel = -1\n\n/**\n * Inner-shadow recess for a pressed (sunken) surface, tuned to the well's own\n * fill colour so the rim/shadow tints track the darker fill. Composes WITH the\n * darker pressed fill: on web it adds an inset boxShadow; on the native path\n * (no inset-shadow support) it's a no-op and the recess reads via the fill\n * alone — so a pressed surface stays legibly sunken with or without the shadow.\n *\n * @param fillColor - The pressed surface's own fill (one ramp step down).\n * @param theme - Current theme ('light' or 'dark').\n */\nexport function getPressedRecessShadow(fillColor: string, theme: 'light' | 'dark'): ViewStyle {\n return getElevationShadow(fillColor, PRESSED_ELEVATION_LEVEL, theme)\n}\n\n/**\n * Get base surface color from theme.\n * This is the foundation color that all elevations are calculated from.\n *\n * IMPORTANT: Base colors must be chosen to allow sufficient lightening.\n *\n * **Light Mode**: Cannot use `#FFFFFF` (white) - cannot lighten white!\n * - Use `#F3F4F6` (neutral[100]) - can lighten to `#FAFAFA` → `#FFFFFF`\n * - This allows raised elevations to be lighter (closer to white)\n *\n * **Dark Mode**: Need lighter base to allow sufficient lightening\n * - Use `surface-elevated` (#2A2827, TD-surface-tokens ramp) - allows further lightening\n *\n * Can be overridden to use custom base colors for special cases.\n */\nexport function getBaseSurfaceColor(theme: 'light' | 'dark'): string {\n // Use semantic token values so elevation colors stay in sync with the token pipeline.\n // Light mode: surface-raised (#F3F4F6 / neutral[100]) - NOT white, so we can lighten it\n // Dark mode: surface-elevated (#2A2827, TD-surface-tokens ramp) - allows sufficient lightening\n\n return theme === 'light'\n ? semanticColorsLight['surface-raised']\n : semanticColorsDark['surface-elevated']\n}\n\n/**\n * Component-specific elevation ranges\n * Defines which elevation levels each component type can use\n */\nexport const componentElevationRanges = {\n button: {\n allowed: [2] as const,\n default: 2 as const,\n hover: 3 as const,\n },\n card: {\n allowed: [1, 2, 3] as const,\n default: 2 as const,\n hover: 3 as const,\n },\n input: {\n allowed: [-2, -1, 0] as const,\n default: -1 as const,\n },\n overlay: {\n allowed: [4, 5] as const,\n default: 4 as const,\n },\n} as const\n\nexport type ComponentType = keyof typeof componentElevationRanges\n\n/**\n * Validate and clamp elevation to component's allowed range\n */\nexport function getValidatedElevation(\n component: ComponentType,\n requested: ElevationLevel\n): ElevationLevel {\n const range = componentElevationRanges[component]\n if ((range.allowed as readonly ElevationLevel[]).includes(requested)) {\n return requested\n }\n // Clamp to nearest allowed elevation\n const sorted = [...range.allowed].sort((a, b) => a - b)\n if (requested < sorted[0]) return sorted[0]\n if (requested > sorted[sorted.length - 1]) return sorted[sorted.length - 1]\n // Find closest\n return sorted.reduce((prev, curr) =>\n Math.abs(curr - requested) < Math.abs(prev - requested) ? curr : prev\n ) as ElevationLevel\n}\n\n// =============================================================================\n// Glow Shadow Support\n// =============================================================================\n\nexport type GlowIntensity = 'subtle' | 'medium' | 'strong'\n\nconst glowConfig: Record<GlowIntensity, { blur: number; spread: number; opacity: number }> = {\n subtle: { blur: 12, spread: 0, opacity: 0.25 },\n medium: { blur: 20, spread: 2, opacity: 0.4 },\n strong: { blur: 30, spread: 4, opacity: 0.55 },\n}\n\n/**\n * Get a glow shadow style for emphasis/active states.\n *\n * Creates a colored radial glow around an element, useful for:\n * - Active recording indicators (orange glow)\n * - Success states (green glow)\n * - Error/danger indicators (red glow)\n * - Focus rings and attention-drawing elements\n *\n * @param color - Glow color (hex string, e.g. '#FF7900')\n * @param intensity - Glow intensity level\n * @returns ViewStyle with platform-specific shadow properties\n */\nexport function getGlowShadow(color: string, intensity: GlowIntensity = 'medium'): ViewStyle {\n const config = glowConfig[intensity]\n const rgb = hexToRgb(color)\n if (!rgb) return {}\n\n return Platform.select({\n web: {\n boxShadow: `0 0 ${config.blur}px ${config.spread}px rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${config.opacity})`,\n } as any,\n default: {\n shadowColor: color,\n shadowOffset: { width: 0, height: 0 },\n shadowOpacity: config.opacity,\n shadowRadius: config.blur / 2,\n elevation: 0,\n },\n }) as ViewStyle\n}\n","import { useSyncExternalStore } from 'react'\n\n/**\n * Utility function to detect the current theme.\n * Checks for the 'light' class on the html element (set by Storybook's theme addon).\n * \n * NOTE: This function reads the theme at call time. For reactive theme detection\n * that re-renders when the theme changes, use the `useTheme` hook instead.\n * \n * @returns 'light' if light theme is active, 'dark' otherwise\n */\nexport function getTheme(): 'light' | 'dark' {\n if (typeof document === 'undefined') return 'dark'\n return document.documentElement.classList.contains('light') ? 'light' : 'dark'\n}\n\n// Subscribers for theme changes\nlet listeners: Array<() => void> = []\n\nfunction subscribe(listener: () => void) {\n listeners = [...listeners, listener]\n \n // Set up MutationObserver to watch for class changes on html element\n if (typeof document !== 'undefined' && listeners.length === 1) {\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n // Notify all listeners when class changes\n listeners.forEach(l => l())\n }\n }\n })\n \n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n \n // Store observer for cleanup\n ;(subscribe as any)._observer = observer\n }\n \n return () => {\n listeners = listeners.filter(l => l !== listener)\n \n // Clean up observer when no more listeners\n if (listeners.length === 0 && (subscribe as any)._observer) {\n ;(subscribe as any)._observer.disconnect()\n ;(subscribe as any)._observer = null\n }\n }\n}\n\nfunction getSnapshot(): 'light' | 'dark' {\n return getTheme()\n}\n\nfunction getServerSnapshot(): 'light' | 'dark' {\n return 'dark'\n}\n\n/**\n * React hook for reactive theme detection.\n * Automatically re-renders when the theme changes (via class changes on html element).\n * \n * Uses useSyncExternalStore for proper React 18 concurrent mode support.\n * \n * @returns 'light' if light theme is active, 'dark' otherwise\n */\nexport function useTheme(): 'light' | 'dark' {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","import React, { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { \n getElevationSurface, \n getElevationShadow, \n getBaseSurfaceColor,\n getValidatedElevation,\n type ElevationLevel \n} from '../../../theme'\nimport { useTheme } from '../../../utils/useTheme'\n\nexport type CardVariant = 'elevated' | 'outline' | 'filled' | 'accent' | 'subtle'\nexport type CardElevation = 1 | 2 | 3 // subtle, standard, prominent\n\nexport interface CardProps extends ViewProps {\n /** Visual variant */\n variant?: CardVariant\n /** Elevation level (1=subtle, 2=standard, 3=prominent) */\n elevation?: CardElevation\n /** Whether the card is interactive (hoverable/pressable) */\n isInteractive?: boolean\n /** Whether the card is in a loading state (renders skeleton) */\n isLoading?: boolean\n /** Callback when card is pressed (makes card interactive) */\n onPress?: () => void\n /** Custom border color (hex, rgb, or CSS color). Useful for status cards. */\n borderColor?: string\n /** Custom background color (hex, rgb, or CSS color). Useful for colored cards. */\n bgColor?: string\n /** Accent stripe color for accent variant (CSS color or hex) */\n accentColor?: string\n /** Accent stripe width for accent variant in pixels (default: 3) */\n accentWidth?: number\n /** Additional className */\n className?: string\n children?: React.ReactNode\n /** Show header skeleton when loading (default: true) */\n skeletonHasHeader?: boolean\n /** Show footer skeleton when loading (default: false) */\n skeletonHasFooter?: boolean\n /** Number of content lines in skeleton when loading (default: 3) */\n skeletonContentLines?: number\n}\n\nconst variantStyles: Record<CardVariant, string> = {\n elevated: '', // Will be set dynamically via elevation system\n outline: 'border-2 border-border-strong', // Thicker border with stronger contrast\n filled: '', // Will be set dynamically via elevation system\n accent: 'border border-border',\n subtle: 'border border-border-subtle',\n}\n\n/**\n * Card component for containing related content.\n *\n * @example\n * <Card>\n * <CardHeader>\n * <CardTitle>Card Title</CardTitle>\n * <CardDescription>Card description</CardDescription>\n * </CardHeader>\n * <CardContent>\n * <Text>Card content goes here</Text>\n * </CardContent>\n * <CardFooter>\n * <Button>Action</Button>\n * </CardFooter>\n * </Card>\n *\n * // Interactive card\n * <Card isInteractive onPress={() => console.log('pressed')}>\n * <CardContent>Click me</CardContent>\n * </Card>\n */\nexport function Card({\n variant = 'elevated',\n elevation = 2,\n isInteractive = false,\n isLoading = false,\n onPress,\n borderColor,\n bgColor,\n accentColor,\n accentWidth,\n className,\n children,\n style,\n skeletonHasHeader = true,\n skeletonHasFooter = false,\n skeletonContentLines = 3,\n ...props\n}: CardProps) {\n const isClickable = isInteractive || !!onPress\n const [isHovered, setIsHovered] = useState(false)\n const theme = useTheme()\n\n // Get elevation level (validate and clamp to card's allowed range)\n const elevationLevel = useMemo(() => {\n const validated = getValidatedElevation('card', elevation as ElevationLevel)\n // Map variant to elevation if needed\n if (variant === 'outline' || variant === 'accent' || variant === 'subtle') {\n return 1 as ElevationLevel // These border variants use subtle elevation\n }\n return validated\n }, [variant, elevation])\n\n // Get base surface color for theme\n const baseColor = useMemo(() => getBaseSurfaceColor(theme), [theme])\n\n // Calculate surface color and shadow from elevation\n const surfaceColor = useMemo(() => {\n // Outline variant in light mode uses a specific off-white for clear visibility\n if ((variant === 'outline' || variant === 'accent') && theme === 'light') {\n return '#FAFAFA' // Matches --color-surface-elevated in light mode\n }\n // Subtle variant uses the base surface color without elevation lift\n if (variant === 'subtle') {\n return getElevationSurface(baseColor, 0 as ElevationLevel, theme)\n }\n return getElevationSurface(baseColor, elevationLevel, theme)\n }, [baseColor, elevationLevel, theme, variant])\n\n const shadowStyle = useMemo(() => {\n // Only apply hover shadow if card is actually clickable\n const shouldHover = isHovered && isClickable\n return getElevationShadow(baseColor, elevationLevel, theme, shouldHover)\n }, [baseColor, elevationLevel, theme, isHovered, isClickable])\n\n // Render skeleton content when loading, otherwise render children\n const cardContent = isLoading ? (\n <>\n {skeletonHasHeader && (\n <CardHeader>\n <View className=\"h-5 w-1/3 bg-interactive-disabled rounded\" />\n <View className=\"mt-2 h-4 w-2/3 bg-interactive-disabled rounded\" />\n </CardHeader>\n )}\n <CardContent>\n {Array.from({ length: skeletonContentLines }).map((_, i) => (\n <View\n key={i}\n className={cn(\n 'h-4 bg-interactive-disabled rounded',\n i < skeletonContentLines - 1 ? 'mb-2 w-full' : 'w-4/5'\n )}\n />\n ))}\n </CardContent>\n {skeletonHasFooter && (\n <CardFooter>\n <View className=\"h-9 w-24 bg-interactive-disabled rounded\" />\n </CardFooter>\n )}\n </>\n ) : (\n children\n )\n\n const baseClassName = cn(\n 'rounded-lg overflow-hidden relative',\n // Apply variant styles, but only use default border color if no custom borderColor\n variant === 'outline'\n ? borderColor\n ? 'border-2' // Just the border width, color via style\n : variantStyles[variant] // Full variant styles including color\n : variantStyles[variant],\n // Remove Tailwind shadow classes - we're using elevation shadows via style prop\n isClickable && 'web:cursor-pointer web:transition-all web:duration-150',\n isClickable && 'web:hover:-translate-y-0.5 active:scale-[0.99]',\n isLoading && 'pointer-events-none animate-pulse',\n className\n )\n\n // Accent variant: left stripe via borderLeft override\n const accentStyle = useMemo(() => variant === 'accent' ? {\n borderLeftWidth: accentWidth ?? 3,\n borderLeftColor: accentColor ?? 'var(--color-brand-primary)',\n } : {}, [variant, accentWidth, accentColor])\n\n // Merge styles: background color from elevation + shadow style + custom colors + custom style\n const mergedStyle = useMemo(() => {\n const elevationStyle: Record<string, any> = {\n backgroundColor: bgColor || surfaceColor,\n borderRadius: 8,\n overflow: 'hidden' as const,\n ...shadowStyle,\n ...accentStyle,\n }\n\n // Add custom border color if provided\n if (borderColor) {\n elevationStyle.borderColor = borderColor\n }\n\n if (!style) return elevationStyle\n // User style takes precedence over elevation defaults (e.g. maxWidth, custom bg)\n return [elevationStyle, style]\n }, [style, surfaceColor, shadowStyle, borderColor, bgColor, accentStyle])\n\n if (isClickable) {\n return (\n <Pressable\n onPress={onPress}\n onHoverIn={() => setIsHovered(true)}\n onHoverOut={() => setIsHovered(false)}\n accessibilityRole=\"button\"\n className={baseClassName}\n style={mergedStyle}\n {...props}\n >\n {cardContent}\n </Pressable>\n )\n }\n\n return (\n <View className={baseClassName} style={mergedStyle} {...props}>\n {cardContent}\n </View>\n )\n}\n\nexport interface CardHeaderProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Header section of a Card.\n */\nexport function CardHeader({ children, className }: CardHeaderProps) {\n return (\n <View className={cn('px-6 py-6', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardTitleProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Title for CardHeader.\n */\nexport function CardTitle({ children, className }: CardTitleProps) {\n return (\n <Text\n accessibilityRole=\"header\"\n className={cn('text-lg font-semibold text-text-primary font-heading', className)}\n >\n {children}\n </Text>\n )\n}\n\nexport interface CardDescriptionProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Description for CardHeader.\n */\nexport function CardDescription({ children, className }: CardDescriptionProps) {\n return (\n <Text className={cn('mt-1.5 text-sm text-text-secondary', className)}>\n {children}\n </Text>\n )\n}\n\nexport interface CardContentProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Content section of a Card.\n */\nexport function CardContent({ children, className }: CardContentProps) {\n return (\n <View className={cn('px-6 py-4', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardFooterProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Footer section of a Card.\n */\nexport function CardFooter({ children, className }: CardFooterProps) {\n return (\n <View className={cn('px-6 py-4 flex-row items-center gap-2', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardSkeletonProps {\n /** Whether to show header skeleton */\n hasHeader?: boolean\n /** Whether to show footer skeleton */\n hasFooter?: boolean\n /** Number of content lines */\n contentLines?: number\n /** Additional className */\n className?: string\n}\n\n/**\n * Skeleton placeholder for Card loading state.\n */\nexport function CardSkeleton({\n hasHeader = true,\n hasFooter = false,\n contentLines = 3,\n className,\n}: CardSkeletonProps) {\n return (\n <Card variant=\"elevated\" elevation={2} className={cn('animate-pulse', className)}>\n {hasHeader && (\n <CardHeader>\n <View className=\"h-5 w-1/3 bg-interactive-disabled rounded\" />\n <View className=\"mt-2 h-4 w-2/3 bg-interactive-disabled rounded\" />\n </CardHeader>\n )}\n <CardContent>\n {Array.from({ length: contentLines }).map((_, i) => (\n <View\n key={i}\n className={cn(\n 'h-4 bg-interactive-disabled rounded',\n i < contentLines - 1 ? 'mb-2 w-full' : 'w-4/5'\n )}\n />\n ))}\n </CardContent>\n {hasFooter && (\n <CardFooter>\n <View className=\"h-9 w-24 bg-interactive-disabled rounded\" />\n </CardFooter>\n )}\n </Card>\n )\n}\n\nexport interface CardInsetProps extends ViewProps {\n /** Elevation level for inset (-2=deep, -1=shallow) */\n elevation?: -2 | -1\n /** Additional className */\n className?: string\n children?: React.ReactNode\n}\n\n/**\n * Inset element within a Card. Applies pressed neumorphic shadow\n * to create a sunken/recessed appearance.\n * \n * @example\n * <Card elevation={2}>\n * <CardContent>\n * <CardInset elevation={-1}>\n * <Text>This content appears inset/sunken</Text>\n * </CardInset>\n * </CardContent>\n * </Card>\n */\nexport function CardInset({\n elevation = -1,\n className,\n children,\n style,\n ...props\n}: CardInsetProps) {\n const theme = useTheme()\n const baseColor = useMemo(() => getBaseSurfaceColor(theme), [theme])\n const surfaceColor = useMemo(() => {\n return getElevationSurface(baseColor, elevation as ElevationLevel, theme)\n }, [baseColor, elevation, theme])\n const shadowStyle = useMemo(() => {\n return getElevationShadow(baseColor, elevation as ElevationLevel, theme)\n }, [baseColor, elevation, theme])\n \n return (\n <View\n className={cn('rounded', className)}\n style={[{ backgroundColor: surfaceColor }, shadowStyle, style]}\n {...props}\n >\n {children}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nexport type StatusDotVariant =\n | 'success'\n | 'warning'\n | 'error'\n | 'neutral'\n | 'on-track'\n | 'deviation'\n | 'future'\n\nexport interface StatusDotProps extends ViewProps {\n variant: StatusDotVariant\n /** Center glyph. Only rendered at size=\"md\"; the 8px \"sm\" dot is too small to fit one. */\n icon?: 'check' | 'exclamation' | 'dash'\n size?: 'sm' | 'md'\n /** Adds a subtle glow effect in the variant color */\n glow?: boolean\n label?: string\n className?: string\n}\n\nconst solidVariantColors: Record<string, string> = {\n success: t['status-success'],\n warning: t['status-warning'],\n error: t['status-error'],\n neutral: '#6B7280',\n}\n\nconst ringVariantStyles: Record<string, Record<string, unknown>> = {\n 'on-track': {\n backgroundColor: 'rgba(46,213,115,0.15)',\n borderWidth: 1,\n borderColor: 'rgba(46,213,115,0.3)',\n },\n deviation: {\n backgroundColor: 'rgba(245,158,11,0.15)',\n borderWidth: 1,\n borderColor: 'rgba(245,158,11,0.25)',\n },\n future: {\n backgroundColor: 'rgba(107,114,128,0.1)',\n borderWidth: 1,\n borderStyle: 'dashed',\n borderColor: 'rgba(107,114,128,0.2)',\n },\n}\n\nconst glowStyles: Record<StatusDotVariant, Record<string, unknown>> = {\n success: { boxShadow: '0 0 4px rgba(46,213,115,0.4)' },\n warning: { boxShadow: '0 0 4px rgba(245,158,11,0.4)' },\n error: { boxShadow: '0 0 4px rgba(239,68,68,0.4)' },\n neutral: { boxShadow: '0 0 4px rgba(107,114,128,0.4)' },\n 'on-track': { boxShadow: '0 0 4px rgba(46,213,115,0.4)' },\n deviation: { boxShadow: '0 0 4px rgba(245,158,11,0.4)' },\n future: { boxShadow: '0 0 4px rgba(107,114,128,0.4)' },\n}\n\nconst iconChars: Record<string, string> = {\n check: '\\u2713',\n exclamation: '!',\n dash: '\\u2014',\n}\n\n/** Color-matched icon colors: dark on solid bg, light on transparent bg */\nconst iconColors: Record<StatusDotVariant, string> = {\n success: '#0A5C52',\n warning: '#6B4000',\n error: '#5C1A1A',\n neutral: '#D1D5DB',\n 'on-track': t['status-success'],\n deviation: t['status-warning'],\n future: '#6B7280',\n}\n\nconst sizeDimensions = {\n sm: { size: 8, showIcon: false },\n md: { size: 18, showIcon: true },\n}\n\nfunction isSolidVariant(variant: StatusDotVariant): boolean {\n return variant in solidVariantColors\n}\n\nexport function StatusDot({\n variant,\n icon,\n size = 'sm',\n glow,\n label,\n className,\n ...props\n}: StatusDotProps) {\n const config = sizeDimensions[size]\n const solid = isSolidVariant(variant)\n const ring = ringVariantStyles[variant]\n\n const glowStyle = glow ? glowStyles[variant] : null\n\n const dot = (\n <View\n style={[\n {\n width: config.size,\n height: config.size,\n borderRadius: 9999,\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n },\n solid ? { backgroundColor: solidVariantColors[variant] } : undefined,\n ring ? (ring as Record<string, unknown>) : undefined,\n glowStyle ? (glowStyle as Record<string, unknown>) : undefined,\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={`${variant} status`}\n testID=\"status-dot\"\n >\n {config.showIcon && icon && (\n <Text\n style={{\n fontSize: 11,\n lineHeight: 11,\n fontWeight: '900',\n color: iconColors[variant],\n }}\n accessibilityElementsHidden\n >\n {iconChars[icon]}\n </Text>\n )}\n </View>\n )\n\n if (label) {\n return (\n <View\n className={className}\n style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}\n accessibilityLabel={`${variant} status: ${label}`}\n {...props}\n >\n <View accessibilityElementsHidden>{dot}</View>\n <Text\n style={{ fontSize: 12, lineHeight: 16, color: '#9CA3AF' }}\n accessibilityElementsHidden\n >\n {label}\n </Text>\n </View>\n )\n }\n\n return (\n <View className={className} {...props}>\n {dot}\n </View>\n )\n}\n","/**\n * Data-viz / status / brand fills, sourced from the color foundations.\n */\n\nimport { categoricalPalette, primitiveRamps as ramp } from './tokens/primitives'\n\n/**\n * Titan categorical fallback palette shared by Treemap and Scatter — the\n * canonical {@link categoricalPalette} (ordered, nested-stable, CVD-safe).\n * Components index into it modulo length, so the 7-color series is sufficient.\n */\nexport const DATAVIZ_CATEGORICAL_PALETTE = categoricalPalette.default\n\n/**\n * MesoCard / MesoStatusCard 3px top-accent gradient stops (dark → primary →\n * light), on the orange ramp that brand-primary (orange-400) lives in.\n */\nexport const MESO_ACCENT_GRADIENT_DARK = ramp.orange[500]\nexport const MESO_ACCENT_GRADIENT_LIGHT = ramp.orange[300]\n\nexport const WORKOUT_PILL_DELOAD = ramp.magenta[600]\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { Fragment, type ReactNode } from 'react'\nimport { View, Text, type ViewProps, type ViewStyle } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { StatusDot } from './StatusDot'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n MESO_ACCENT_GRADIENT_DARK,\n MESO_ACCENT_GRADIENT_LIGHT,\n} from '../../../theme/extracted-colors-dataviz'\n\nconst t = getSemanticColors('dark')\n\nconst BRAND_PRIMARY = t['brand-primary']\nconst BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK\nconst BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT\n\nconst SUCCESS = t['status-success']\nconst WARNING = t['status-warning']\nconst ERROR = t['status-error']\n\n/** Gradient stops for the 3px top accent: dark -> primary -> light (matches MesoCard). */\nconst ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY, BRAND_PRIMARY_LIGHT]\n\n/**\n * Card surface gradient: elevated -> raised at 135deg. Uses resolved dark-theme\n * hexes (a gradient string can't carry a className token, and var() renders\n * black on native).\n */\nconst CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor('surface-elevated')} 0%, ${resolveColor('surface-raised')} 100%)`\n\n/** Gauge track gradient (teal -> amber -> red) at 0.25 alpha. */\nconst GAUGE_GRADIENT =\n 'linear-gradient(90deg, rgba(46,213,115,0.25) 0%, rgba(249,180,21,0.25) 50%, rgba(209,67,67,0.25) 100%)'\n\nexport type MesoStatusBadgeVariant = 'success' | 'warning' | 'error'\n\nconst STATUS_VARIANTS: Record<\n MesoStatusBadgeVariant,\n { bg: string; border: string; text: string }\n> = {\n success: { bg: 'rgba(46,213,115,0.15)', border: 'rgba(46,213,115,0.3)', text: SUCCESS },\n warning: { bg: 'rgba(249,180,21,0.15)', border: 'rgba(249,180,21,0.3)', text: WARNING },\n error: { bg: 'rgba(209,67,67,0.15)', border: 'rgba(209,67,67,0.25)', text: ERROR },\n}\n\nexport interface MesoStatusBadge {\n /** Short status label, e.g. \"On Track\". */\n label: string\n /** Color treatment for the badge. */\n variant: MesoStatusBadgeVariant\n}\n\nexport interface MesoStatusMetric {\n /** Cell label, e.g. \"Prescribed\". */\n label: string\n /** Cell value, e.g. \"3×8 @ RPE 8\". */\n value: string\n}\n\nexport interface MesoStatusGauge {\n /** Gauge label, e.g. \"Intensity\". */\n label: string\n /** Fill position 0-1; the 14px marker sits at this level. */\n level: number\n /** Optional right-aligned sublabel, e.g. \"Prescribed\". */\n sublabel?: string\n}\n\nexport interface MesoStatusCoaching {\n /** Coaching recommendation copy. */\n text: string\n /** Substrings within `text` to render in bold. */\n highlights?: string[]\n}\n\nexport interface MesoStatusNextTarget {\n /** Leading glyph/emoji, e.g. \"→\" or \"🎯\". */\n icon: string\n /** Next-session target copy. */\n text: string\n}\n\nexport interface MesoStatusCardProps extends ViewProps {\n /** Mesocycle name, e.g. \"Hypertrophy Block\". */\n mesoName: string\n /** Context line, e.g. \"Week 6 of 8 · Upper/Lower\". */\n mesoSubtitle: string\n /** Status pill in the header. */\n statusBadge: MesoStatusBadge\n /** Prescription-vs-actual metrics rendered as a 2x2 grid. */\n metrics: MesoStatusMetric[]\n /** Intensity / volume gauges stacked vertically. */\n gauges: MesoStatusGauge[]\n /** Optional coaching recommendation box. */\n coaching?: MesoStatusCoaching\n /** Optional next-session target box. */\n nextTarget?: MesoStatusNextTarget\n className?: string\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\n/** Marker fill color by gauge zone: teal 0-0.4, amber 0.4-0.7, red 0.7-1.0. */\nfunction getGaugeZoneColor(level: number): string {\n if (level >= 0.7) return ERROR\n if (level >= 0.4) return WARNING\n return SUCCESS\n}\n\n/** Splits `text` into nodes, bolding any segment that exactly matches a highlight. */\nfunction renderCoachingText(text: string, highlights?: string[]): ReactNode {\n if (!highlights || highlights.length === 0) return text\n const escaped = highlights\n .filter(Boolean)\n .map((h) => h.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n if (escaped.length === 0) return text\n const regex = new RegExp(`(${escaped.join('|')})`, 'g')\n return text.split(regex).map((part, index) =>\n highlights.includes(part) ? (\n <Text\n key={`${part}-${index}`}\n className=\"text-text-primary\"\n style={{ fontWeight: '700' }}\n >\n {part}\n </Text>\n ) : (\n <Fragment key={`t-${index}`}>{part}</Fragment>\n ),\n )\n}\n\nfunction StatusPill({ badge }: { badge: MesoStatusBadge }) {\n const colors = STATUS_VARIANTS[badge.variant]\n return (\n <View\n className=\"flex-row items-center\"\n style={{\n gap: 5,\n paddingVertical: 3,\n paddingHorizontal: 8,\n borderRadius: 4,\n borderWidth: 1,\n backgroundColor: colors.bg,\n borderColor: colors.border,\n }}\n testID=\"meso-status-card-badge\"\n >\n <View accessibilityElementsHidden>\n <StatusDot variant={badge.variant} size=\"sm\" />\n </View>\n <Text\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n letterSpacing: 0.3,\n color: colors.text,\n }}\n >\n {badge.label}\n </Text>\n </View>\n )\n}\n\nfunction MetricCell({ metric }: { metric: MesoStatusMetric }) {\n return (\n <View style={{ width: '48%' }} testID=\"meso-status-card-metric\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n }}\n >\n {metric.label}\n </Text>\n <Text\n className=\"text-text-primary\"\n style={{\n marginTop: 2,\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n }}\n >\n {metric.value}\n </Text>\n </View>\n )\n}\n\nfunction Gauge({ gauge }: { gauge: MesoStatusGauge }) {\n const level = clamp01(gauge.level)\n const percentage = Math.round(level * 100)\n const markerColor = getGaugeZoneColor(level)\n return (\n <View\n style={{ gap: 6 }}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: 0, max: 100, now: percentage }}\n accessibilityLabel={`${gauge.label}: ${percentage}%`}\n aria-valuenow={percentage}\n aria-valuemin={0}\n aria-valuemax={100}\n testID=\"meso-status-card-gauge\"\n >\n <View\n className=\"flex-row items-center justify-between\"\n accessibilityElementsHidden\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n }}\n >\n {gauge.label}\n </Text>\n {gauge.sublabel != null && (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n }}\n >\n {gauge.sublabel}\n </Text>\n )}\n </View>\n\n <View\n style={\n {\n height: 8,\n borderRadius: 4,\n position: 'relative',\n backgroundImage: GAUGE_GRADIENT,\n } as ViewStyle\n }\n accessibilityElementsHidden\n >\n <View\n style={{\n position: 'absolute',\n left: '50%',\n top: 0,\n bottom: 0,\n width: 1,\n marginLeft: -0.5,\n backgroundColor: 'rgba(255,255,255,0.3)',\n }}\n testID=\"meso-status-card-gauge-center\"\n />\n <View\n className=\"border-text-primary\"\n style={{\n position: 'absolute',\n left: `${percentage}%`,\n top: -3,\n marginLeft: -7,\n width: 14,\n height: 14,\n borderRadius: 9999,\n borderWidth: 2,\n backgroundColor: markerColor,\n boxShadow: '0 0 4px rgba(0,0,0,0.5)',\n }}\n testID=\"meso-status-card-gauge-marker\"\n />\n </View>\n </View>\n )\n}\n\n/**\n * Mesocycle context card for a specific exercise: prescription vs actual\n * metrics, intensity/volume gauges, and coaching guidance. Composes the titan\n * `Card` plus the Workout `StatusDot`, and renders the §25 gauge (8px track,\n * 50% center line, 14px marker) inline since that visual differs from the\n * IntensityBar/DeviationBar primitives.\n *\n * @example\n * <MesoStatusCard\n * mesoName=\"Hypertrophy Block\"\n * mesoSubtitle=\"Week 6 of 8 · Upper/Lower\"\n * statusBadge={{ label: 'On Track', variant: 'success' }}\n * metrics={[\n * { label: 'Prescribed', value: '3×8 @ RPE 8' },\n * { label: 'Actual', value: '3×8 @ 185 lbs' },\n * ]}\n * gauges={[{ label: 'Intensity', level: 0.7, sublabel: 'Actual' }]}\n * coaching={{ text: 'Add load next session.', highlights: ['Add load'] }}\n * nextTarget={{ icon: '→', text: '190 lbs × 8' }}\n * />\n */\nexport function MesoStatusCard({\n mesoName,\n mesoSubtitle,\n statusBadge,\n metrics,\n gauges,\n coaching,\n nextTarget,\n className,\n ...props\n}: MesoStatusCardProps) {\n return (\n <Card\n variant=\"outline\"\n elevation={1}\n borderColor={BRAND_PRIMARY_DARK}\n className={className}\n style={\n {\n borderColor: BRAND_PRIMARY_DARK,\n borderWidth: 1,\n backgroundImage: CARD_GRADIENT,\n } as ViewStyle\n }\n role=\"article\"\n aria-label={`Mesocycle status for ${mesoName}`}\n testID=\"meso-status-card\"\n {...props}\n >\n <View\n className=\"flex-row\"\n style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 3, zIndex: 1 }}\n accessibilityElementsHidden\n testID=\"meso-status-card-accent\"\n >\n {ACCENT_STOPS.map((color) => (\n <View key={color} style={{ flex: 1, backgroundColor: color }} />\n ))}\n </View>\n\n <View style={{ padding: 14, gap: 14 }} testID=\"meso-status-card-body\">\n <View testID=\"meso-status-card-header\">\n <View\n className=\"flex-row items-center justify-between\"\n style={{ gap: 8 }}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n flexShrink: 1,\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"meso-status-card-name\"\n >\n {mesoName}\n </Text>\n <StatusPill badge={statusBadge} />\n </View>\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"meso-status-card-subtitle\"\n >\n {mesoSubtitle}\n </Text>\n </View>\n\n {metrics.length > 0 && (\n <View\n className=\"flex-row flex-wrap\"\n style={{ gap: 8 }}\n testID=\"meso-status-card-metrics\"\n >\n {metrics.map((metric, index) => (\n <MetricCell key={`${metric.label}-${index}`} metric={metric} />\n ))}\n </View>\n )}\n\n {gauges.length > 0 && (\n <View style={{ gap: 12 }} testID=\"meso-status-card-gauges\">\n {gauges.map((gauge, index) => (\n <Gauge key={`${gauge.label}-${index}`} gauge={gauge} />\n ))}\n </View>\n )}\n\n {coaching != null && (\n <View\n style={{\n backgroundColor: 'rgba(249,180,21,0.06)',\n borderWidth: 1,\n borderColor: 'rgba(249,180,21,0.15)',\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 12,\n }}\n testID=\"meso-status-card-coaching\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n lineHeight: 17,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {renderCoachingText(coaching.text, coaching.highlights)}\n </Text>\n </View>\n )}\n\n {nextTarget != null && (\n <View\n className=\"flex-row items-center\"\n style={{\n gap: 8,\n backgroundColor: 'rgba(46,213,115,0.06)',\n borderWidth: 1,\n borderColor: 'rgba(46,213,115,0.2)',\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 12,\n }}\n testID=\"meso-status-card-next-target\"\n >\n <Text style={{ fontSize: 14, color: SUCCESS }} accessibilityElementsHidden>\n {nextTarget.icon}\n </Text>\n <Text\n style={{\n flexShrink: 1,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: SUCCESS,\n }}\n >\n {nextTarget.text}\n </Text>\n </View>\n )}\n </View>\n </Card>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useMemo, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst sem = getSemanticColors('dark')\n\nconst BRAND_PRIMARY = sem['brand-primary']\n// Line/border color for the dashed projection, used where a className cannot\n// apply (passed as a prop into an inline style, and a per-edge borderTopColor).\nconst PROJECTION_LINE_COLOR = resolveColor('text-tertiary')\nconst STATUS_SUCCESS = sem['status-success']\nconst STATUS_ERROR = sem['status-error']\nconst STATUS_WARNING = sem['status-warning']\nconst GRID_LINE = 'rgba(255,255,255,0.06)'\nconst SUCCESS_PILL_BG = 'rgba(46,213,115,0.10)'\nconst SUCCESS_PILL_BORDER = 'rgba(46,213,115,0.20)'\nconst ERROR_PILL_BG = 'rgba(209,67,67,0.10)'\nconst ERROR_PILL_BORDER = 'rgba(209,67,67,0.20)'\n\n/** Left gutter reserved for y-axis value labels. */\nconst PLOT_LEFT = 26\n/** Approximate tooltip width used for edge clamping. */\nconst TOOLTIP_WIDTH = 124\n\nexport interface StrengthTrendDataPoint {\n /** ISO date string for the session. */\n date: string\n /** Estimated one-rep max in the chart's unit. */\n e1rm: number\n /** Marks a personal-record session (rendered with a star). */\n isPR?: boolean\n /** Optional human label shown in the tooltip instead of the raw date. */\n sessionLabel?: string\n}\n\nexport interface StrengthTrendChartMesoBoundary {\n /** ISO date where the mesocycle boundary falls. */\n date: string\n /** Short label, e.g. \"Hypertrophy\". */\n label: string\n}\n\nexport interface StrengthTrendChartProps extends ViewProps {\n /** Actual e1RM data points, chronological. */\n data: StrengthTrendDataPoint[]\n /** Projected/planned e1RM trajectory, drawn as a dashed line. */\n projection?: StrengthTrendDataPoint[]\n /** Chart plot width in pixels. */\n width: number\n /** Chart plot height in pixels (120-160 for the compact variant). */\n height: number\n /** Mesocycle boundary markers (vertical guides + labels). */\n mesoBoundaries?: StrengthTrendChartMesoBoundary[]\n /** Called when an actual data point is tapped. */\n onPointPress?: (point: StrengthTrendDataPoint) => void\n /** Unit for display and labels. */\n unit: 'lbs' | 'kg'\n /** Animate the left-to-right line draw on mount (default true). */\n animateOnMount?: boolean\n className?: string\n}\n\ninterface Coord {\n x: number\n y: number\n point: StrengthTrendDataPoint\n index: number\n}\n\ninterface Geometry {\n hasData: boolean\n toX: (time: number) => number\n toY: (value: number) => number\n actual: Coord[]\n projection: Coord[]\n gridLines: Array<{ y: number; label: string }>\n boundaries: Array<{ x: number; label: string }>\n}\n\nfunction timeOf(dateStr: string): number {\n const t = Date.parse(dateStr)\n return Number.isNaN(t) ? 0 : t\n}\n\nfunction formatValue(value: number): string {\n return `${Math.round(value)}`\n}\n\nfunction buildGeometry(\n data: StrengthTrendDataPoint[],\n projection: StrengthTrendDataPoint[],\n boundaries: StrengthTrendChartMesoBoundary[],\n width: number,\n height: number,\n): Geometry {\n const values = [...data, ...projection].map((p) => p.e1rm)\n // Empty state keys off actual data only: a projection with no measured\n // sessions still shows the placeholder rather than a \"Current: 0\" chart.\n if (data.length === 0) {\n return {\n hasData: false,\n toX: () => 0,\n toY: () => 0,\n actual: [],\n projection: [],\n gridLines: [],\n boundaries: [],\n }\n }\n\n const times = [\n ...data.map((p) => timeOf(p.date)),\n ...projection.map((p) => timeOf(p.date)),\n ...boundaries.map((b) => timeOf(b.date)),\n ]\n const tMin = Math.min(...times)\n const tMaxRaw = Math.max(...times)\n const tMax = tMaxRaw === tMin ? tMin + 1 : tMaxRaw\n\n const yMin = Math.min(...values)\n const yMax = Math.max(...values)\n const range = yMax - yMin || Math.max(1, yMax * 0.1)\n const padV = range * 0.15\n const domainMin = yMin - padV\n const domainMax = yMax + padV\n\n const innerW = Math.max(1, width - PLOT_LEFT)\n const toX = (time: number) =>\n PLOT_LEFT + ((time - tMin) / (tMax - tMin)) * innerW\n const toY = (value: number) =>\n height - ((value - domainMin) / (domainMax - domainMin)) * height\n\n const project = (points: StrengthTrendDataPoint[]): Coord[] =>\n points.map((point, index) => ({\n x: toX(timeOf(point.date)),\n y: toY(point.e1rm),\n point,\n index,\n }))\n\n const tickValues = Array.from(\n new Set([yMax, (yMin + yMax) / 2, yMin].map((v) => Math.round(v))),\n )\n const gridLines = tickValues.map((v) => ({ y: toY(v), label: formatValue(v) }))\n\n return {\n hasData: true,\n toX,\n toY,\n actual: project(data),\n projection: project(projection),\n gridLines,\n boundaries: boundaries.map((b) => ({\n x: toX(timeOf(b.date)),\n label: b.label,\n })),\n }\n}\n\nfunction computeTrend(\n data: StrengthTrendDataPoint[],\n boundaries: StrengthTrendChartMesoBoundary[],\n): { percent: number; positive: boolean } {\n if (data.length < 2) return { percent: 0, positive: true }\n let series = data\n if (boundaries.length > 0) {\n const lastBoundary = Math.max(...boundaries.map((b) => timeOf(b.date)))\n const filtered = data.filter((p) => timeOf(p.date) >= lastBoundary)\n // The pill is labelled \"this meso\"; if the current meso has <2 points\n // there is no meso trend to show — stay neutral rather than silently\n // reporting the whole-series change under a \"this meso\" label.\n if (filtered.length < 2) return { percent: 0, positive: true }\n series = filtered\n }\n const first = series[0].e1rm\n const last = series[series.length - 1].e1rm\n const percent = first ? ((last - first) / first) * 100 : 0\n return { percent, positive: percent >= 0 }\n}\n\nfunction ChartLine({\n coords,\n color,\n strokeWidth,\n dashed,\n testID,\n}: {\n coords: Coord[]\n color: string\n strokeWidth: number\n dashed?: boolean\n testID: string\n}) {\n return (\n <>\n {coords.map((c, i) => {\n if (i === 0) return null\n const prev = coords[i - 1]\n const dx = c.x - prev.x\n const dy = c.y - prev.y\n const length = Math.sqrt(dx * dx + dy * dy)\n const angle = Math.atan2(dy, dx) * (180 / Math.PI)\n return (\n <View\n key={`${testID}-${i}`}\n testID={testID}\n accessibilityElementsHidden\n style={[\n {\n position: 'absolute',\n left: prev.x,\n top: prev.y,\n width: length,\n transformOrigin: '0 0',\n transform: [{ rotate: `${angle}deg` }],\n },\n dashed\n ? {\n height: 0,\n borderTopWidth: strokeWidth,\n borderStyle: 'dashed',\n borderTopColor: color,\n }\n : {\n height: strokeWidth,\n borderRadius: strokeWidth / 2,\n backgroundColor: color,\n },\n ]}\n />\n )\n })}\n </>\n )\n}\n\n/**\n * Estimated-1RM line chart over time with an optional dashed plan-projection\n * line and PR star markers. Rendered entirely with absolutely-positioned\n * Views (no SVG), following the Sparkline approach. Tapping an actual point\n * opens a tooltip and fires `onPointPress`. A trend pill below the chart\n * summarizes the percentage change for the current mesocycle.\n *\n * @example\n * <StrengthTrendChart\n * data={[{ date: '2026-01-01', e1rm: 225 }, { date: '2026-02-01', e1rm: 245, isPR: true }]}\n * projection={[{ date: '2026-02-01', e1rm: 245 }, { date: '2026-03-01', e1rm: 260 }]}\n * width={320}\n * height={150}\n * unit=\"lbs\"\n * />\n */\nexport function StrengthTrendChart({\n data,\n projection = [],\n width,\n height,\n mesoBoundaries = [],\n onPointPress,\n unit,\n animateOnMount = true,\n className,\n ...props\n}: StrengthTrendChartProps) {\n const geometry = useMemo(\n () => buildGeometry(data, projection, mesoBoundaries, width, height),\n [data, projection, mesoBoundaries, width, height],\n )\n const trend = useMemo(\n () => computeTrend(data, mesoBoundaries),\n [data, mesoBoundaries],\n )\n\n const [reveal] = useState(() => new Animated.Value(animateOnMount ? 0 : 1))\n const [selected, setSelected] = useState<number | null>(null)\n\n useEffect(() => {\n if (!animateOnMount) return\n const animation = Animated.timing(reveal, {\n toValue: 1,\n duration: 600,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [animateOnMount, reveal])\n\n const current = data.length > 0 ? data[data.length - 1].e1rm : 0\n const trendSign = trend.percent >= 0 ? '+' : '-'\n const trendText = `${trendSign}${Math.abs(trend.percent).toFixed(1)}% this meso`\n const ariaLabel = geometry.hasData\n ? `Strength trend chart showing estimated one rep max over time. Current: ${formatValue(current)} ${unit}. Trend: ${trendSign}${Math.abs(trend.percent).toFixed(1)}%`\n : 'Strength trend chart, no data'\n\n if (!geometry.hasData) {\n return (\n <View\n style={{ width }}\n className={cn(className)}\n accessibilityRole=\"image\"\n accessibilityLabel={ariaLabel}\n testID=\"strength-trend-chart-empty\"\n {...props}\n >\n <View\n style={{\n width,\n height,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Text className=\"text-text-tertiary\" style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}>\n No strength data yet\n </Text>\n </View>\n </View>\n )\n }\n\n const revealWidth = reveal.interpolate({\n inputRange: [0, 1],\n outputRange: [0, width],\n })\n\n const selectedCoord =\n selected != null ? geometry.actual[selected] : undefined\n\n return (\n <View\n style={{ width }}\n className={cn(className)}\n testID=\"strength-trend-chart\"\n {...props}\n >\n <View style={{ width, height, position: 'relative' }}>\n {/* Labelled, non-interactive chart canvas (grid + lines + markers). */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n accessibilityRole=\"image\"\n accessibilityLabel={ariaLabel}\n testID=\"strength-trend-chart-canvas\"\n >\n {geometry.gridLines.map((line, i) => (\n <View\n key={`grid-${i}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-gridline\"\n style={{\n position: 'absolute',\n left: PLOT_LEFT,\n right: 0,\n top: line.y,\n height: 1,\n backgroundColor: GRID_LINE,\n }}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: -PLOT_LEFT,\n top: -6,\n width: PLOT_LEFT - 4,\n textAlign: 'right',\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {line.label}\n </Text>\n </View>\n ))}\n\n {geometry.boundaries.map((boundary, i) => (\n <View\n key={`boundary-${i}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-meso-boundary\"\n style={{\n position: 'absolute',\n left: boundary.x,\n top: 0,\n width: 0,\n height,\n borderLeftWidth: 1,\n borderStyle: 'dashed',\n borderLeftColor: 'rgba(255,255,255,0.10)',\n }}\n />\n ))}\n\n <Animated.View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: revealWidth,\n height,\n overflow: 'hidden',\n }}\n testID=\"strength-trend-chart-reveal\"\n >\n <View style={{ width, height, position: 'absolute', top: 0, left: 0 }}>\n <ChartLine\n coords={geometry.projection}\n color={PROJECTION_LINE_COLOR}\n strokeWidth={2}\n dashed\n testID=\"strength-trend-chart-projection-segment\"\n />\n <ChartLine\n coords={geometry.actual}\n color={BRAND_PRIMARY}\n strokeWidth={2.5}\n testID=\"strength-trend-chart-actual-segment\"\n />\n </View>\n </Animated.View>\n\n {geometry.actual.map((c) =>\n c.point.isPR ? (\n <Text\n key={`star-${c.index}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-pr-star\"\n style={{\n position: 'absolute',\n left: c.x - 7,\n top: c.y - 20,\n fontSize: 12,\n color: STATUS_WARNING,\n }}\n >\n ★\n </Text>\n ) : null,\n )}\n </View>\n\n {/* Interactive point overlay (kept out of the image-role canvas). */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n testID=\"strength-trend-chart-points\"\n >\n {geometry.actual.map((c) => {\n const label = c.point.sessionLabel ?? c.point.date\n return (\n <Pressable\n key={`point-${c.index}`}\n testID=\"strength-trend-chart-point\"\n accessibilityRole=\"button\"\n accessibilityLabel={`${label}: ${formatValue(c.point.e1rm)} ${unit}${c.point.isPR ? ', personal record' : ''}`}\n onPress={() => {\n setSelected(c.index)\n onPointPress?.(c.point)\n }}\n style={{\n position: 'absolute',\n left: c.x - 4,\n top: c.y - 4,\n width: 8,\n height: 8,\n borderRadius: 1,\n backgroundColor: BRAND_PRIMARY,\n }}\n />\n )\n })}\n </View>\n\n {selectedCoord && (\n <View\n testID=\"strength-trend-chart-tooltip\"\n accessibilityElementsHidden\n className=\"bg-surface-elevated border-border-strong\"\n style={{\n position: 'absolute',\n left: Math.max(\n 0,\n Math.min(width - TOOLTIP_WIDTH, selectedCoord.x - TOOLTIP_WIDTH / 2),\n ),\n top: Math.max(0, selectedCoord.y - 52),\n maxWidth: TOOLTIP_WIDTH,\n borderWidth: 1,\n borderRadius: 8,\n paddingVertical: 8,\n paddingHorizontal: 10,\n }}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {selectedCoord.point.sessionLabel ?? selectedCoord.point.date}\n </Text>\n <Text\n className=\"text-text-primary\"\n style={{\n marginTop: 2,\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n }}\n >\n {`${formatValue(selectedCoord.point.e1rm)} ${unit}`}\n </Text>\n {selected != null && selected > 0 && (\n <Text\n style={{\n marginTop: 1,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n color:\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0\n ? STATUS_SUCCESS\n : STATUS_ERROR,\n }}\n >\n {`${\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0\n ? '+'\n : '-'\n }${Math.abs(\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm,\n ).toFixed(1)} ${unit}`}\n </Text>\n )}\n </View>\n )}\n </View>\n\n {/* Meso boundary x-axis labels. */}\n {geometry.boundaries.length > 0 && (\n <View\n style={{ width, height: 14, position: 'relative', marginTop: 2 }}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-axis\"\n >\n {geometry.boundaries.map((boundary, i) => (\n <Text\n key={`axis-${i}`}\n testID=\"strength-trend-chart-axis-label\"\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: boundary.x - 24,\n width: 48,\n textAlign: 'center',\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {boundary.label}\n </Text>\n ))}\n </View>\n )}\n\n {/* Trend pill. */}\n <View className=\"flex-row\" style={{ marginTop: 8 }}>\n <View\n testID=\"strength-trend-chart-trend-pill\"\n accessibilityLabel={`Strength trend: ${trendText}`}\n style={{\n paddingVertical: 3,\n paddingHorizontal: 8,\n borderRadius: 4,\n borderWidth: 1,\n backgroundColor: trend.positive ? SUCCESS_PILL_BG : ERROR_PILL_BG,\n borderColor: trend.positive ? SUCCESS_PILL_BORDER : ERROR_PILL_BORDER,\n }}\n >\n <Text\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: trend.positive ? STATUS_SUCCESS : STATUS_ERROR,\n }}\n >\n {trendText}\n </Text>\n </View>\n </View>\n\n {/* Legend. */}\n <View\n className=\"flex-row items-center\"\n style={{ marginTop: 8, gap: 14 }}\n testID=\"strength-trend-chart-legend\"\n >\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <View style={{ width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY }} />\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n Actual\n </Text>\n </View>\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <View\n style={{\n width: 14,\n height: 0,\n borderTopWidth: 2,\n borderStyle: 'dashed',\n borderTopColor: PROJECTION_LINE_COLOR,\n }}\n />\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n Projected\n </Text>\n </View>\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <Text style={{ fontSize: 12, color: STATUS_WARNING }}>★</Text>\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n PR\n </Text>\n </View>\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState, useMemo } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nconst STATUS_SUCCESS = t['status-success']\nconst STATUS_WARNING = t['status-warning']\nconst STATUS_INFO = t['status-info']\n/** Dot outline: near-white ring so load dots read on the band fill and any\n * surface (matches the MesoStatusCard gauge-marker convention). */\nconst DOT_BORDER = '#F3F4F6'\nconst BAND_FILL = 'rgba(46,213,115,0.1)'\nconst BAND_EDGE = 'rgba(46,213,115,0.45)'\nconst PROJECTION_FILL = 'rgba(46,213,115,0.05)'\n\nconst PADDING_LEFT = 28\nconst PADDING_RIGHT = 10\nconst PADDING_TOP = 8\nconst PADDING_BOTTOM = 16\nconst COLUMN_STEP = 4\nconst DOT_SIZE = 8\n\nexport type WorkoutDotStatus = 'within' | 'above' | 'below'\n\nexport interface CapacityBandDataPoint {\n /** ISO-ish date string (e.g. \"2026-06-01\"). */\n date: string\n /** Lower bound of the capacity band (MEV equivalent). */\n bandLow: number\n /** Upper bound of the capacity band (MRV equivalent). */\n bandHigh: number\n}\n\nexport interface WorkoutDot {\n date: string\n /** Actual session load score. */\n load: number\n /** Position of the session relative to the band. */\n status: WorkoutDotStatus\n}\n\nexport interface CapacityBandProjection {\n /** Band shape over the next days if training continues (rises). */\n withTraining: CapacityBandDataPoint[]\n /** Band shape over the next days if resting (drops). */\n withRest: CapacityBandDataPoint[]\n}\n\nexport interface CapacityBandChartProps extends ViewProps {\n /** Capacity band shape over time. */\n band: CapacityBandDataPoint[]\n /** Workout sessions plotted as dots. */\n workouts: WorkoutDot[]\n /** Optional forward projection (next few days). */\n projection?: CapacityBandProjection\n /** Chart width in px. */\n width: number\n /** Chart height in px. */\n height: number\n /** Called when a workout dot is tapped. */\n onWorkoutPress?: (workout: WorkoutDot) => void\n className?: string\n}\n\ninterface PixelPoint {\n x: number\n yHigh: number\n yLow: number\n}\n\nconst DOT_COLORS: Record<WorkoutDotStatus, string> = {\n within: STATUS_SUCCESS,\n above: STATUS_WARNING,\n below: STATUS_INFO,\n}\n\nconst STATUS_PHRASES: Record<WorkoutDotStatus, string> = {\n within: 'within range',\n above: 'above range',\n below: 'below range',\n}\n\nfunction parseTime(date: string): number {\n const parts = date.split('-')\n if (parts.length === 3) {\n return Date.UTC(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2]))\n }\n const parsed = Date.parse(date)\n return Number.isNaN(parsed) ? 0 : parsed\n}\n\nfunction formatDate(date: string): string {\n const parts = date.split('-')\n if (parts.length === 3) return `${Number(parts[1])}/${Number(parts[2])}`\n const d = new Date(date)\n return Number.isNaN(d.getTime()) ? date : `${d.getMonth() + 1}/${d.getDate()}`\n}\n\nfunction toPixels(\n points: CapacityBandDataPoint[],\n toX: (date: string) => number,\n toY: (value: number) => number,\n): PixelPoint[] {\n return points\n .map((p) => ({ x: toX(p.date), yHigh: toY(p.bandHigh), yLow: toY(p.bandLow) }))\n .sort((a, b) => a.x - b.x)\n}\n\nfunction interpEdge(pixels: PixelPoint[], x: number, key: 'yHigh' | 'yLow'): number {\n for (let i = 0; i < pixels.length - 1; i++) {\n const a = pixels[i]\n const b = pixels[i + 1]\n if (x >= a.x && x <= b.x) {\n const t = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x)\n return a[key] + t * (b[key] - a[key])\n }\n }\n return pixels[pixels.length - 1][key]\n}\n\nfunction buildColumns(pixels: PixelPoint[], step: number) {\n if (pixels.length < 2) return []\n const start = pixels[0].x\n const end = pixels[pixels.length - 1].x\n const columns: Array<{ x: number; top: number; height: number }> = []\n for (let x = start; x < end; x += step) {\n const top = interpEdge(pixels, x, 'yHigh')\n const bottom = interpEdge(pixels, x, 'yLow')\n columns.push({ x, top, height: Math.max(0, bottom - top) })\n }\n return columns\n}\n\nfunction buildEdges(pixels: PixelPoint[], key: 'yHigh' | 'yLow') {\n const segments: Array<{ left: number; top: number; length: number; angle: number }> = []\n for (let i = 1; i < pixels.length; i++) {\n const a = pixels[i - 1]\n const b = pixels[i]\n const dx = b.x - a.x\n const dy = b[key] - a[key]\n segments.push({\n left: a.x,\n top: a[key],\n length: Math.sqrt(dx * dx + dy * dy),\n angle: Math.atan2(dy, dx) * (180 / Math.PI),\n })\n }\n return segments\n}\n\nfunction collectValues(\n band: CapacityBandDataPoint[],\n workouts: WorkoutDot[],\n projection?: CapacityBandProjection,\n): number[] {\n const values: number[] = []\n band.forEach((p) => values.push(p.bandLow, p.bandHigh))\n workouts.forEach((w) => values.push(w.load))\n projection?.withTraining.forEach((p) => values.push(p.bandLow, p.bandHigh))\n projection?.withRest.forEach((p) => values.push(p.bandLow, p.bandHigh))\n return values\n}\n\nfunction currentStatus(workouts: WorkoutDot[]): string {\n if (workouts.length === 0) return 'no recent sessions'\n const latest = [...workouts].sort((a, b) => parseTime(b.date) - parseTime(a.date))[0]\n return STATUS_PHRASES[latest.status]\n}\n\n/**\n * Gentler-Streak-inspired fatigue visualization. Renders a shaded capacity\n * band (between a rolling MEV/MRV estimate), workout sessions as colored dots\n * positioned by load, and an optional dashed forward projection that diverges\n * for \"keep training\" (rises) versus \"rest\" (drops). View-based, no SVG:\n * the band fill is a run of vertical columns and the edges/projection are\n * rotated line Views (same technique as Sparkline).\n *\n * @example\n * <CapacityBandChart\n * band={band}\n * workouts={workouts}\n * projection={{ withTraining, withRest }}\n * width={320}\n * height={180}\n * onWorkoutPress={(w) => openSession(w)}\n * />\n */\nexport function CapacityBandChart({\n band,\n workouts,\n projection,\n width,\n height,\n onWorkoutPress,\n className,\n ...props\n}: CapacityBandChartProps) {\n const [reveal] = useState(() => new Animated.Value(0))\n const dotAnims = useMemo(\n () => Array.from({ length: workouts.length }, () => new Animated.Value(0)),\n [workouts.length],\n )\n\n useEffect(() => {\n reveal.setValue(0)\n dotAnims.forEach((a) => a.setValue(0))\n const draw = Animated.timing(reveal, {\n toValue: 1,\n duration: 800,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n const pops = dotAnims.map((a) =>\n Animated.timing(a, {\n toValue: 1,\n duration: 200,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n }),\n )\n const animation = Animated.sequence([draw, Animated.stagger(200, pops)])\n animation.start()\n return () => animation.stop()\n }, [reveal, dotAnims, band.length, workouts.length])\n\n const plotWidth = width - PADDING_LEFT - PADDING_RIGHT\n const plotHeight = height - PADDING_TOP - PADDING_BOTTOM\n\n const scale = useMemo(() => {\n const times = band.map((p) => parseTime(p.date))\n projection?.withTraining.forEach((p) => times.push(parseTime(p.date)))\n projection?.withRest.forEach((p) => times.push(parseTime(p.date)))\n const minT = times.length ? Math.min(...times) : 0\n const maxT = times.length ? Math.max(...times) : 1\n const tRange = maxT - minT || 1\n\n const values = collectValues(band, workouts, projection)\n const minV = values.length ? Math.min(...values) : 0\n const maxV = values.length ? Math.max(...values) : 1\n const pad = (maxV - minV) * 0.1 || 1\n const domainMin = minV - pad\n const domainMax = maxV + pad\n const vRange = domainMax - domainMin || 1\n\n const toX = (date: string) =>\n PADDING_LEFT + ((parseTime(date) - minT) / tRange) * plotWidth\n const toY = (value: number) =>\n PADDING_TOP + (1 - (value - domainMin) / vRange) * plotHeight\n return { toX, toY }\n }, [band, workouts, projection, plotWidth, plotHeight])\n\n if (band.length === 0) {\n return (\n <View\n style={{ width, height }}\n className={className}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Training capacity band chart, no data\"\n testID=\"capacity-band-chart-empty\"\n {...props}\n />\n )\n }\n\n const { toX, toY } = scale\n const bandPixels = toPixels(band, toX, toY)\n const columns = buildColumns(bandPixels, COLUMN_STEP)\n const topEdge = buildEdges(bandPixels, 'yHigh')\n const bottomEdge = buildEdges(bandPixels, 'yLow')\n\n const lastBandPoint = band[band.length - 1]\n const trainingPixels = projection\n ? toPixels([lastBandPoint, ...projection.withTraining], toX, toY)\n : []\n const restPixels = projection\n ? toPixels([lastBandPoint, ...projection.withRest], toX, toY)\n : []\n\n const labelStride = Math.max(1, Math.ceil(band.length / 5))\n const revealWidth = reveal.interpolate({ inputRange: [0, 1], outputRange: [0, width] })\n\n const renderColumns = (cols: ReturnType<typeof buildColumns>, color: string, key: string) =>\n cols.map((col, i) => (\n <View\n key={`${key}-${i}`}\n style={{\n position: 'absolute',\n left: col.x,\n top: col.top,\n width: COLUMN_STEP + 0.5,\n height: col.height,\n backgroundColor: color,\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID={key}\n />\n ))\n\n const renderEdges = (\n segments: ReturnType<typeof buildEdges>,\n color: string,\n dashed: boolean,\n key: string,\n ) =>\n segments.map((seg, i) => (\n <View\n key={`${key}-${i}`}\n style={{\n position: 'absolute',\n left: seg.left,\n top: seg.top,\n width: seg.length,\n height: dashed ? 0 : 1.5,\n borderTopWidth: dashed ? 1 : 0,\n borderTopColor: dashed ? color : undefined,\n borderStyle: dashed ? 'dashed' : 'solid',\n backgroundColor: dashed ? undefined : color,\n opacity: dashed ? 0.7 : 1,\n transformOrigin: '0 0',\n transform: [{ rotate: `${seg.angle}deg` }],\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID={key}\n />\n ))\n\n return (\n <View\n style={{ width, height, position: 'relative' }}\n className={className}\n testID=\"capacity-band-chart-root\"\n {...props}\n >\n {/* Static visual layer carries the image role; interactive dots live as\n siblings so the image role has no focusable descendants. */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n accessibilityRole=\"image\"\n accessibilityLabel={`Training capacity band chart. Current capacity: ${currentStatus(\n workouts,\n )}. ${workouts.length} workout${workouts.length === 1 ? '' : 's'} shown.`}\n testID=\"capacity-band-chart\"\n >\n {/* Band + projection draw left-to-right via an animated clip. */}\n <Animated.View\n style={{ position: 'absolute', top: 0, left: 0, height, width: revealWidth, overflow: 'hidden' }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-reveal\"\n >\n <View style={{ width, height, position: 'relative' }}>\n {projection && (\n <View testID=\"capacity-band-chart-projection\">\n {renderColumns(buildColumns(trainingPixels, COLUMN_STEP), PROJECTION_FILL, 'capacity-band-chart-projection-fill')}\n {renderColumns(buildColumns(restPixels, COLUMN_STEP), PROJECTION_FILL, 'capacity-band-chart-projection-fill')}\n {renderEdges(buildEdges(trainingPixels, 'yHigh'), STATUS_SUCCESS, true, 'capacity-band-chart-projection-training')}\n {renderEdges(buildEdges(trainingPixels, 'yLow'), STATUS_SUCCESS, true, 'capacity-band-chart-projection-training')}\n {renderEdges(buildEdges(restPixels, 'yHigh'), STATUS_INFO, true, 'capacity-band-chart-projection-rest')}\n {renderEdges(buildEdges(restPixels, 'yLow'), STATUS_INFO, true, 'capacity-band-chart-projection-rest')}\n <Text\n style={{\n position: 'absolute',\n left: trainingPixels[trainingPixels.length - 1]?.x + 2,\n top: trainingPixels[trainingPixels.length - 1]?.yHigh - 12,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n color: STATUS_SUCCESS,\n }}\n testID=\"capacity-band-chart-projection-training-label\"\n >\n Training\n </Text>\n <Text\n style={{\n position: 'absolute',\n left: restPixels[restPixels.length - 1]?.x + 2,\n top: restPixels[restPixels.length - 1]?.yLow + 2,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n color: STATUS_INFO,\n }}\n testID=\"capacity-band-chart-projection-rest-label\"\n >\n Rest\n </Text>\n </View>\n )}\n\n <View testID=\"capacity-band-chart-band\">\n {renderColumns(columns, BAND_FILL, 'capacity-band-chart-band-cell')}\n </View>\n {renderEdges(topEdge, BAND_EDGE, false, 'capacity-band-chart-edge-top')}\n {renderEdges(bottomEdge, BAND_EDGE, false, 'capacity-band-chart-edge-bottom')}\n </View>\n </Animated.View>\n\n {/* Y axis conceptual label (no numbers). */}\n <Text\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: PADDING_LEFT / 2 - 14,\n top: PADDING_TOP + plotHeight / 2 - 7,\n width: 32,\n textAlign: 'center',\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n transform: [{ rotate: '-90deg' }],\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-y-axis-label\"\n >\n Load\n </Text>\n\n {/* X axis date labels (subset to avoid overlap). */}\n {band.map((point, i) => {\n if (i % labelStride !== 0 && i !== band.length - 1) return null\n return (\n <Text\n key={`x-${point.date}`}\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: toX(point.date) - 14,\n top: height - PADDING_BOTTOM + 2,\n width: 28,\n textAlign: 'center',\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-x-label\"\n >\n {formatDate(point.date)}\n </Text>\n )\n })}\n </View>\n\n {/* Workout dots — scale in after the band draws. */}\n {workouts.map((workout, i) => {\n const cx = toX(workout.date)\n const cy = toY(workout.load)\n const color = DOT_COLORS[workout.status]\n const dotStyle = {\n width: DOT_SIZE,\n height: DOT_SIZE,\n borderRadius: DOT_SIZE / 2,\n backgroundColor: color,\n borderWidth: 2,\n borderColor: DOT_BORDER,\n }\n const label = `Workout on ${formatDate(workout.date)}, load ${workout.load}, ${\n STATUS_PHRASES[workout.status]\n }`\n return (\n <Animated.View\n key={`dot-${workout.date}-${i}`}\n style={{\n position: 'absolute',\n left: cx - DOT_SIZE / 2,\n top: cy - DOT_SIZE / 2,\n transform: [{ scale: dotAnims[i] ?? 1 }],\n }}\n testID=\"capacity-band-chart-dot-wrapper\"\n >\n {onWorkoutPress ? (\n <Pressable\n onPress={() => onWorkoutPress(workout)}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={dotStyle}\n testID=\"capacity-band-chart-dot\"\n />\n ) : (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={dotStyle}\n testID=\"capacity-band-chart-dot\"\n />\n )}\n </Animated.View>\n )\n })}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { MesoStatusCard, type MesoStatusCardProps } from './MesoStatusCard'\nimport {\n StrengthTrendChart,\n type StrengthTrendDataPoint,\n type StrengthTrendChartMesoBoundary,\n} from './StrengthTrendChart'\nimport {\n CapacityBandChart,\n type CapacityBandDataPoint,\n type CapacityBandProjection,\n type WorkoutDot,\n} from './CapacityBandChart'\nimport { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'\nimport { type SetRowProps } from './SetRow'\nimport {\n VelocityStrip,\n calculateMeanVelocity,\n calculateVelocityLoss,\n type VelocityZoneBandProp,\n} from './VelocityStrip'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { cn } from '../../../utils/cn'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** Inner plot width: page width 390 − 16 page padding − 12 card padding on each side. */\nconst CHART_WIDTH = 326\nconst CHART_HEIGHT = 150\n\n/** Which tab of the exercise detail view is showing. */\nexport type ExerciseDetailTab = 'progress' | 'history' | 'advanced'\n\n/** Tabs in display order. */\nexport const EXERCISE_DETAIL_TABS: Array<{ key: ExerciseDetailTab; label: string }> = [\n { key: 'progress', label: 'Progress' },\n { key: 'history', label: 'History' },\n { key: 'advanced', label: 'Advanced' },\n]\n\n/** Identity + headline stats for the exercise being inspected. */\nexport interface ExerciseDetailHeader {\n /** Exercise name, e.g. \"Barbell Bench Press\". */\n name: string\n /** Context line, e.g. \"Chest · Barbell\". */\n subtitle: string\n /** Unit used across the page. */\n unit: 'lbs' | 'kg'\n /** Current estimated one-rep max, shown as a header pill. */\n currentE1rm?: number\n}\n\n/**\n * A single expandable entry — one progression week or one logged session.\n * Projected onto an `ExerciseCard`, so it collapses to a summary and expands\n * to its `SetRow` breakdown.\n */\nexport interface ExerciseDetailEntry {\n /** Stable id for inline-expansion selection. */\n id: string\n /** Row title, e.g. \"Week 3\" or \"Mon, Jun 16\". */\n title: string\n /** Collapsed summary (sets × reps @ weight). */\n summary?: ExerciseCardProps['summary']\n /** Estimated one-rep max, feeding the page's best-e1RM stat. */\n e1rm?: { value: number; unit: 'lbs' | 'kg' }\n /** Flags a personal-record entry. */\n isPR?: boolean\n /** Prescribed tempo, revealed when expanded. */\n tempo?: ExerciseCardProps['tempo']\n /** Per-set breakdown revealed when expanded. */\n sets: SetRowProps[]\n}\n\n/** Strength-trend inputs for the Progress tab chart. */\nexport interface ExerciseTrend {\n /** Measured e1RM data points, chronological. */\n data: StrengthTrendDataPoint[]\n /** Planned/projected trajectory (dashed line). */\n projection?: StrengthTrendDataPoint[]\n /** Mesocycle boundary guides. */\n mesoBoundaries?: StrengthTrendChartMesoBoundary[]\n}\n\n/** One set's velocity trace for the Advanced tab breakdown. */\nexport interface ExerciseVbtSet {\n /** Row label, e.g. \"Set 1\". */\n label: string\n /** Per-rep mean concentric velocities (m/s). */\n velocities: number[]\n}\n\n/** Velocity-based-training inputs for the Advanced tab. */\nexport interface ExerciseVbt {\n /** Capacity band shape over time. */\n band: CapacityBandDataPoint[]\n /** Sessions plotted against the band. */\n workouts: WorkoutDot[]\n /** Optional forward band projection. */\n projection?: CapacityBandProjection\n /** Per-set velocity traces for the most recent session. */\n sets: ExerciseVbtSet[]\n /** Optional velocity-zone bands for this exercise (WA `VelocityZones.bands`). */\n zones?: readonly VelocityZoneBandProp[]\n}\n\n/** Page-level roll-up of the logged sessions. */\nexport interface ExerciseDetailStats {\n /** Number of logged sessions. */\n sessions: number\n /** Best estimated one-rep max seen, or null if none recorded. */\n bestE1rm: number | null\n /** Count of PR entries. */\n prCount: number\n}\n\n/** Aggregate velocity readout for the Advanced tab. */\nexport interface VbtSummary {\n /** Mean concentric velocity across every logged rep. */\n meanVelocity: number\n /** Worst within-set velocity loss (%), i.e. the most-fatigued set. */\n velocityLoss: number\n}\n\nexport interface ExerciseDetailPageProps extends ViewProps {\n /** Exercise identity + headline stats. */\n exercise: ExerciseDetailHeader\n /** Mesocycle context banner (Progress tab). */\n meso: MesoStatusCardProps\n /** Strength trend inputs (Progress tab). */\n trend: ExerciseTrend\n /** Week-by-week progression entries (Progress tab). */\n progression: ExerciseDetailEntry[]\n /** All logged sessions (History tab). */\n history: ExerciseDetailEntry[]\n /** Velocity-based-training inputs (Advanced tab). */\n vbt: ExerciseVbt\n className?: string\n}\n\n/** Roll up logged sessions into the page summary (pure, testable). */\nexport function deriveExerciseStats(entries: ExerciseDetailEntry[]): ExerciseDetailStats {\n let bestE1rm: number | null = null\n let prCount = 0\n for (const entry of entries) {\n if (entry.e1rm != null && (bestE1rm == null || entry.e1rm.value > bestE1rm)) {\n bestE1rm = entry.e1rm.value\n }\n if (entry.isPR) prCount += 1\n }\n return { sessions: entries.length, bestE1rm, prCount }\n}\n\n/** Project an entry onto ExerciseCard props, wiring inline expansion (pure). */\nexport function toExerciseCardProps(\n entry: ExerciseDetailEntry,\n expanded: boolean,\n onToggle: () => void\n): ExerciseCardProps {\n return {\n name: entry.title,\n expanded,\n onExpandedChange: onToggle,\n summary: entry.summary,\n isPR: entry.isPR,\n tempo: entry.tempo,\n sets: expanded ? entry.sets : undefined,\n }\n}\n\n/** Aggregate per-set velocity traces into the Advanced readout (pure). */\nexport function summarizeVbt(sets: ExerciseVbtSet[]): VbtSummary {\n const allReps = sets.flatMap((set) => set.velocities)\n const meanVelocity = calculateMeanVelocity(allReps)\n let velocityLoss = 0\n for (const set of sets) {\n velocityLoss = Math.max(velocityLoss, calculateVelocityLoss(set.velocities))\n }\n return { meanVelocity, velocityLoss }\n}\n\ninterface TabBarProps {\n active: ExerciseDetailTab\n onSelect: (tab: ExerciseDetailTab) => void\n}\n\nfunction TabBar({ active, onSelect }: TabBarProps) {\n return (\n <View\n className=\"flex-row\"\n style={{\n borderBottomWidth: 1,\n borderBottomColor: resolveColor('border-default'),\n }}\n accessibilityRole={'tablist' as ViewProps['accessibilityRole']}\n testID=\"exercise-detail-page-tabs\"\n >\n {EXERCISE_DETAIL_TABS.map(({ key, label }) => {\n const isActive = key === active\n return (\n <Pressable\n key={key}\n onPress={() => onSelect(key)}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: isActive }}\n style={{\n flex: 1,\n alignItems: 'center',\n paddingVertical: 10,\n borderBottomWidth: 2,\n borderBottomColor: isActive ? BRAND_PRIMARY : 'transparent',\n }}\n testID={`exercise-detail-page-tab-${key}`}\n >\n <Text\n className={isActive ? 'text-text-primary' : 'text-text-tertiary'}\n style={{\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: isActive ? '700' : '500',\n }}\n >\n {label}\n </Text>\n </Pressable>\n )\n })}\n </View>\n )\n}\n\nconst STAT_CARDS: Array<{ key: keyof ExerciseDetailStats; label: string }> = [\n { key: 'sessions', label: 'Sessions' },\n { key: 'bestE1rm', label: 'Best e1RM' },\n { key: 'prCount', label: 'PRs' },\n]\n\nfunction StatStrip({ stats, unit }: { stats: ExerciseDetailStats; unit: 'lbs' | 'kg' }) {\n return (\n <View className=\"flex-row\" style={{ gap: 8 }} testID=\"exercise-detail-page-stats\">\n {STAT_CARDS.map(({ key, label }) => {\n const raw = stats[key]\n const value = key === 'bestE1rm' ? (raw == null ? '—' : `${raw} ${unit}`) : `${raw}`\n return (\n <View\n key={key}\n className=\"bg-surface-elevated border-border\"\n style={{\n flex: 1,\n padding: 12,\n borderRadius: 10,\n borderWidth: 1,\n }}\n testID={`exercise-detail-page-stat-${key}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 18,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n >\n {value}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n marginTop: 2,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {label}\n </Text>\n </View>\n )\n })}\n </View>\n )\n}\n\nfunction SectionCard({\n title,\n children,\n testID,\n}: {\n title: string\n children: React.ReactNode\n testID: string\n}) {\n return (\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n padding: 12,\n gap: 10,\n }}\n testID={testID}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n }}\n >\n {title}\n </Text>\n {children}\n </View>\n )\n}\n\ninterface EntryListProps {\n entries: ExerciseDetailEntry[]\n expandedId: string | null\n onToggle: (id: string) => void\n emptyLabel: string\n testID: string\n}\n\nfunction EntryList({ entries, expandedId, onToggle, emptyLabel, testID }: EntryListProps) {\n if (entries.length === 0) {\n return (\n <Text\n className=\"text-text-tertiary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID={`${testID}-empty`}\n >\n {emptyLabel}\n </Text>\n )\n }\n return (\n <View style={{ gap: 8 }} testID={testID}>\n {entries.map((entry) => (\n <ExerciseCard\n key={entry.id}\n {...toExerciseCardProps(entry, entry.id === expandedId, () => onToggle(entry.id))}\n />\n ))}\n </View>\n )\n}\n\nfunction VbtBreakdown({\n sets,\n zones,\n}: {\n sets: ExerciseVbtSet[]\n zones?: readonly VelocityZoneBandProp[]\n}) {\n return (\n <View style={{ gap: 10 }} testID=\"exercise-detail-page-vbt-breakdown\">\n {sets.map((set) => {\n const mean = calculateMeanVelocity(set.velocities)\n const loss = calculateVelocityLoss(set.velocities)\n return (\n <View\n key={set.label}\n className=\"flex-row items-center\"\n style={{ gap: 10 }}\n testID=\"exercise-detail-page-vbt-set\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n width: 44,\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n }}\n >\n {set.label}\n </Text>\n <View className=\"flex-1\" style={{ height: 8, justifyContent: 'center' }}>\n <VelocityStrip velocities={set.velocities} zones={zones} variant=\"mini\" />\n </View>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontVariant: ['tabular-nums'],\n }}\n >\n {`${mean.toFixed(2)} · -${loss}%`}\n </Text>\n </View>\n )\n })}\n </View>\n )\n}\n\nfunction VbtSummaryRow({ summary }: { summary: VbtSummary }) {\n const cells = [\n { label: 'Mean Velocity', value: `${summary.meanVelocity.toFixed(2)} m/s` },\n { label: 'Peak Vel. Loss', value: `-${summary.velocityLoss}%` },\n ]\n return (\n <View className=\"flex-row\" style={{ gap: 8 }} testID=\"exercise-detail-page-vbt-summary\">\n {cells.map((cell) => (\n <View\n key={cell.label}\n className=\"bg-surface-elevated border-border\"\n style={{\n flex: 1,\n padding: 12,\n borderRadius: 10,\n borderWidth: 1,\n }}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 16,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n >\n {cell.value}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n marginTop: 2,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {cell.label}\n </Text>\n </View>\n ))}\n </View>\n )\n}\n\n/**\n * ExerciseDetailPage — a tabbed per-exercise view. A shared header (name,\n * context line, current e1RM pill) sits above a Progress / History / Advanced\n * tab bar. Progress composes the `MesoStatusCard` context banner, a stats\n * strip, a `StrengthTrendChart`, and a week-by-week progression list with\n * inline `ExerciseCard` expansion. History lists every logged session with the\n * same inline expansion. Advanced surfaces VBT data via a `CapacityBandChart`,\n * a velocity summary, and a per-set `VelocityStrip` breakdown. Tab and\n * per-list expansion are page-level state; children keep their own styles.\n *\n * @example\n * <ExerciseDetailPage\n * exercise={exercise}\n * meso={meso}\n * trend={trend}\n * progression={progression}\n * history={history}\n * vbt={vbt}\n * />\n */\nexport function ExerciseDetailPage({\n exercise,\n meso,\n trend,\n progression,\n history,\n vbt,\n className,\n ...props\n}: ExerciseDetailPageProps) {\n const [tab, setTab] = useState<ExerciseDetailTab>('progress')\n const [expandedProgressId, setExpandedProgressId] = useState<string | null>(null)\n const [expandedHistoryId, setExpandedHistoryId] = useState<string | null>(null)\n\n const stats = useMemo(() => deriveExerciseStats(history), [history])\n const vbtSummary = useMemo(() => summarizeVbt(vbt.sets), [vbt.sets])\n\n const toggle =\n (setId: (updater: (current: string | null) => string | null) => void) => (id: string) =>\n setId((current) => (current === id ? null : id))\n\n return (\n <View\n className={cn('bg-background-base', className)}\n style={{ width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={exercise.name}\n testID=\"exercise-detail-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"exercise-detail-page-content\">\n <View\n className=\"flex-row items-start justify-between\"\n style={{ gap: 8 }}\n testID=\"exercise-detail-page-header\"\n >\n <View style={{ flexShrink: 1 }}>\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-detail-page-title\"\n >\n {exercise.name}\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 2,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"exercise-detail-page-subtitle\"\n >\n {exercise.subtitle}\n </Text>\n </View>\n {exercise.currentE1rm != null && (\n <View\n style={{\n paddingVertical: 4,\n paddingHorizontal: 10,\n borderRadius: 6,\n backgroundColor: 'rgba(255,121,0,0.10)',\n borderWidth: 1,\n borderColor: 'rgba(255,121,0,0.25)',\n }}\n testID=\"exercise-detail-page-e1rm\"\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n e1RM\n </Text>\n <Text\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n color: BRAND_PRIMARY,\n }}\n >\n {`${exercise.currentE1rm} ${exercise.unit}`}\n </Text>\n </View>\n )}\n </View>\n\n <TabBar active={tab} onSelect={setTab} />\n\n {tab === 'progress' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-progress\">\n <MesoStatusCard {...meso} />\n <StatStrip stats={stats} unit={exercise.unit} />\n <SectionCard title=\"Strength Trend\" testID=\"exercise-detail-page-trend\">\n <StrengthTrendChart\n data={trend.data}\n projection={trend.projection}\n mesoBoundaries={trend.mesoBoundaries}\n width={CHART_WIDTH}\n height={CHART_HEIGHT}\n unit={exercise.unit}\n animateOnMount={false}\n />\n </SectionCard>\n <SectionCard title=\"Week-by-Week\" testID=\"exercise-detail-page-progression\">\n <EntryList\n entries={progression}\n expandedId={expandedProgressId}\n onToggle={toggle(setExpandedProgressId)}\n emptyLabel=\"No progression logged yet\"\n testID=\"exercise-detail-page-progression-list\"\n />\n </SectionCard>\n </View>\n )}\n\n {tab === 'history' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-history\">\n <SectionCard title=\"All Sessions\" testID=\"exercise-detail-page-history\">\n <EntryList\n entries={history}\n expandedId={expandedHistoryId}\n onToggle={toggle(setExpandedHistoryId)}\n emptyLabel=\"No sessions logged yet\"\n testID=\"exercise-detail-page-history-list\"\n />\n </SectionCard>\n </View>\n )}\n\n {tab === 'advanced' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-advanced\">\n <SectionCard title=\"Capacity Band\" testID=\"exercise-detail-page-capacity\">\n <CapacityBandChart\n band={vbt.band}\n workouts={vbt.workouts}\n projection={vbt.projection}\n width={CHART_WIDTH}\n height={CHART_HEIGHT}\n />\n </SectionCard>\n <VbtSummaryRow summary={vbtSummary} />\n <SectionCard title=\"Velocity Breakdown\" testID=\"exercise-detail-page-velocity\">\n <VbtBreakdown sets={vbt.sets} zones={vbt.zones} />\n </SectionCard>\n </View>\n )}\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState } from 'react'\nimport { View, Pressable, Animated, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport type MesoStatus = 'completed' | 'current' | 'upcoming'\n\nexport interface Meso {\n id: string\n name: string\n weekCount: number\n status: MesoStatus\n /**\n * 1-based week index of progress within a `current` meso.\n * Drives the solid fill width. Ignored for non-current mesos.\n */\n currentWeek?: number\n}\n\nexport interface MesoProgressBarProps extends ViewProps {\n mesos: Meso[]\n activeMesoId: string | null\n onMesoPress: (mesoId: string) => void\n className?: string\n}\n\nconst segmentBgColors: Record<MesoStatus, string> = {\n completed: 'rgba(46,213,115,0.3)',\n current: 'rgba(255,121,0,0.5)',\n upcoming: 'rgba(255,255,255,0.06)',\n}\n\nfunction clampProgress(currentWeek: number | undefined, weekCount: number): number {\n if (currentWeek == null || weekCount <= 0) return 0\n const ratio = currentWeek / weekCount\n return Math.max(0, Math.min(1, ratio))\n}\n\ninterface SegmentProps {\n meso: Meso\n isActive: boolean\n onPress: (id: string) => void\n}\n\nfunction MesoSegment({ meso, isActive, onPress }: SegmentProps) {\n const [pressScale] = useState(() => new Animated.Value(1))\n\n const handlePressIn = () => {\n Animated.timing(pressScale, {\n toValue: 0.98,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const handlePressOut = () => {\n Animated.timing(pressScale, {\n toValue: 1,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const progress = meso.status === 'current'\n ? clampProgress(meso.currentWeek, meso.weekCount)\n : 0\n\n // weekCount drives the segment's flex width; guard 0 / negative so flex stays\n // a valid positive value and the segment never collapses out of the layout.\n const segmentFlex = Math.max(1, meso.weekCount)\n\n return (\n <Pressable\n style={{ flex: segmentFlex }}\n onPress={() => onPress(meso.id)}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n accessibilityRole=\"button\"\n accessibilityLabel={`${meso.name}, ${meso.status}`}\n testID={`meso-segment-${meso.id}`}\n >\n <Animated.View\n style={[\n {\n height: 8,\n borderRadius: 4,\n overflow: 'hidden',\n backgroundColor: segmentBgColors[meso.status],\n transform: [{ scale: pressScale }],\n },\n isActive\n ? {\n borderWidth: 2,\n borderColor: BRAND_PRIMARY,\n transform: [{ scale: 1.02 }, { scale: pressScale }],\n }\n : undefined,\n ]}\n testID={`meso-segment-inner-${meso.id}`}\n >\n {meso.status === 'current' && progress > 0 && (\n <View\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: `${progress * 100}%`,\n backgroundColor: BRAND_PRIMARY,\n }}\n testID={`meso-segment-fill-${meso.id}`}\n />\n )}\n </Animated.View>\n </Pressable>\n )\n}\n\n/**\n * Segmented horizontal bar of mesocycles. Each segment is tappable and its\n * flex width is proportional to the meso's `weekCount`. The active segment is\n * highlighted with a 2px brand border to stay in sync with MesoCard selection.\n *\n * @example\n * <MesoProgressBar\n * mesos={[\n * { id: 'm1', name: 'Accumulation', weekCount: 4, status: 'completed' },\n * { id: 'm2', name: 'Intensification', weekCount: 3, status: 'current', currentWeek: 2 },\n * { id: 'm3', name: 'Peak', weekCount: 2, status: 'upcoming' },\n * ]}\n * activeMesoId=\"m2\"\n * onMesoPress={(id) => console.log(id)}\n * />\n */\nexport function MesoProgressBar({\n mesos,\n activeMesoId,\n onMesoPress,\n className,\n ...props\n}: MesoProgressBarProps) {\n return (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n gap: 2,\n paddingHorizontal: 16,\n alignItems: 'center',\n }}\n testID=\"meso-progress-bar\"\n {...props}\n >\n {mesos.map((meso) => (\n <MesoSegment\n key={meso.id}\n meso={meso}\n isActive={meso.id === activeMesoId}\n onPress={onMesoPress}\n />\n ))}\n </View>\n )\n}\n","import { View, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\n\nexport type IndicatorSize = 'xs' | 'sm' | 'md' | 'lg'\nexport type IndicatorColor =\n | 'default'\n | 'primary'\n | 'success'\n | 'live'\n | 'error'\n | 'warning'\n | 'info'\n | 'error-vivid'\n\n/** How a pulsing indicator animates: a subtle opacity fade, or an expanding ring. */\nexport type IndicatorPulse = 'opacity' | 'ping'\n\nexport interface IndicatorProps extends ViewProps {\n /** Dot size */\n size?: IndicatorSize\n /** Semantic color */\n color?: IndicatorColor\n /** Custom hex color (overrides color prop) */\n customColor?: string\n /** Add a glow shadow effect */\n glow?: boolean\n /** Add a ring border */\n ring?: boolean\n /** Animate for live/active status. `true` = opacity fade; `'ping'` = expanding ring. */\n pulse?: boolean | IndicatorPulse\n /** Additional className */\n className?: string\n}\n\nconst sizeStyles: Record<IndicatorSize, string> = {\n xs: 'w-1 h-1',\n sm: 'w-1.5 h-1.5',\n md: 'w-2 h-2',\n lg: 'w-2.5 h-2.5',\n}\n\nconst colorStyles: Record<IndicatorColor, string> = {\n default: 'bg-text-tertiary',\n primary: 'bg-brand-primary',\n success: 'bg-status-success',\n live: 'bg-status-live',\n error: 'bg-status-error',\n warning: 'bg-status-warning',\n info: 'bg-status-info',\n 'error-vivid': 'bg-status-error-vivid',\n}\n\nexport function Indicator({\n size = 'sm',\n color = 'default',\n customColor,\n glow = false,\n ring = false,\n pulse = false,\n className,\n style,\n ...props\n}: IndicatorProps) {\n const pulseMode: IndicatorPulse | false = pulse === true ? 'opacity' : pulse || false\n const colorClass = !customColor ? colorStyles[color] : undefined\n const colorStyle = customColor ? { backgroundColor: customColor } : undefined\n\n // Expanding-ring pulse: a ping layer behind the solid dot (for live/active status).\n if (pulseMode === 'ping') {\n return (\n <View className={cn('relative', sizeStyles[size], className)} style={style} {...props}>\n <View\n className={cn('absolute inset-0 rounded-full animate-ping', colorClass)}\n style={colorStyle}\n />\n <View\n className={cn(\n 'relative rounded-full',\n sizeStyles[size],\n colorClass,\n ring && 'border-2 border-background-base'\n )}\n style={colorStyle}\n />\n </View>\n )\n }\n\n const dynamicStyle = {\n ...(typeof style === 'object' ? style : {}),\n ...(colorStyle ?? {}),\n ...(glow && customColor ? { boxShadow: `0 0 6px ${customColor}` } : {}),\n }\n\n return (\n <View\n className={cn(\n 'rounded-full shrink-0',\n sizeStyles[size],\n colorClass,\n pulseMode === 'opacity' && 'animate-pulse',\n ring && 'border-2 border-background-base',\n glow &&\n !customColor &&\n (color === 'success' || color === 'live') &&\n 'shadow-[0_0_6px_rgba(46,213,115,0.6)]',\n glow && !customColor && color === 'error' && 'shadow-[0_0_6px_rgba(239,68,68,0.6)]',\n glow && !customColor && color === 'warning' && 'shadow-[0_0_6px_rgba(245,158,11,0.6)]',\n glow && !customColor && color === 'primary' && 'shadow-[0_0_6px_rgba(255,121,0,0.6)]',\n glow && !customColor && color === 'error-vivid' && 'shadow-[0_0_6px_rgba(255,71,87,0.6)]',\n className\n )}\n style={Object.keys(dynamicStyle).length > 0 ? dynamicStyle : style}\n {...props}\n />\n )\n}\n","import React from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { Indicator, type IndicatorColor } from '../indicator'\n\nexport type BadgeVariant = 'solid' | 'subtle' | 'outline'\nexport type BadgeColor = 'default' | 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'\nexport type BadgeSize = 'sm' | 'md' | 'lg'\n\nexport interface BadgeProps extends ViewProps {\n /** Visual variant */\n variant?: BadgeVariant\n /** Color scheme */\n color?: BadgeColor\n /** Size */\n size?: BadgeSize\n /** Show a leading indicator dot */\n dot?: boolean\n /** Color for the dot indicator (defaults to match badge color) */\n dotColor?: IndicatorColor\n /** Additional className */\n className?: string\n children?: React.ReactNode\n}\n\nconst variantColorStyles: Record<BadgeVariant, Record<BadgeColor, string>> = {\n solid: {\n default: 'bg-border-strong text-text-inverse',\n primary: 'bg-brand-primary text-text-inverse',\n secondary: 'bg-brand-secondary text-text-inverse',\n success: 'bg-status-success text-text-inverse',\n error: 'bg-status-error text-text-inverse',\n warning: 'bg-status-warning text-text-inverse',\n info: 'bg-status-info text-text-inverse',\n },\n subtle: {\n default: 'bg-surface-raised text-text-secondary',\n primary: 'bg-brand-primary-subtle text-brand-primary',\n secondary: 'bg-brand-secondary-subtle text-brand-secondary',\n success: 'bg-status-success-subtle text-status-success',\n error: 'bg-status-error-subtle text-status-error',\n warning: 'bg-status-warning-subtle text-status-warning',\n info: 'bg-status-info-subtle text-status-info',\n },\n outline: {\n default: 'border border-border-strong text-text-secondary',\n primary: 'border border-brand-primary text-brand-primary',\n secondary: 'border border-brand-secondary text-brand-secondary',\n success: 'border border-status-success text-status-success',\n error: 'border border-status-error text-status-error',\n warning: 'border border-status-warning text-status-warning',\n info: 'border border-status-info text-status-info',\n },\n}\n\nconst sizeStyles: Record<BadgeSize, string> = {\n sm: 'px-1.5 py-0.5 text-xs',\n md: 'px-2 py-0.5 text-xs',\n lg: 'px-2.5 py-1 text-sm',\n}\n\n/**\n * Badge component for status indicators and labels.\n *\n * @example\n * <Badge color=\"success\">Active</Badge>\n * <Badge variant=\"outline\" color=\"warning\">Pending</Badge>\n */\nexport function Badge({\n variant = 'subtle',\n color = 'default',\n size = 'md',\n dot,\n dotColor,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <View\n className={cn(\n 'inline-flex items-center justify-center rounded-full font-medium',\n variantColorStyles[variant][color],\n sizeStyles[size],\n className\n )}\n {...props}\n >\n {dot && (\n <Indicator\n size=\"xs\"\n color={dotColor ?? (color === 'default' || color === 'secondary' ? 'default' : color as IndicatorColor)}\n className=\"mr-0.5\"\n />\n )}\n {typeof children === 'string' ? (\n <Text className=\"text-inherit font-medium\">{children}</Text>\n ) : (\n children\n )}\n </View>\n )\n}\n\nexport interface BadgeTextProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Text component for Badge content.\n */\nexport function BadgeText({ children, className }: BadgeTextProps) {\n return (\n <Text className={cn('text-inherit font-medium', className)}>\n {children}\n </Text>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { WORKOUT_PILL_DELOAD } from '../../../theme/extracted-colors-dataviz'\n\nconst t = getSemanticColors('dark')\n\n/**\n * Spec statuses: completed | current | upcoming | deload.\n * `next` and `missed` are additive extras supported by this implementation.\n */\nexport type WorkoutPillStatus = 'completed' | 'current' | 'upcoming' | 'deload' | 'next' | 'missed'\n\nexport interface WorkoutPillProps extends ViewProps {\n name: string\n status: WorkoutPillStatus\n /** Force pulsing animation. Defaults to pulsing only on `current` status. */\n pulse?: boolean\n onPress?: () => void\n highlighted?: boolean\n className?: string\n}\n\nconst statusBgColors: Record<WorkoutPillStatus, string> = {\n completed: 'rgba(46,213,115,0.15)',\n current: 'rgba(255,121,0,0.15)',\n next: 'transparent',\n upcoming: t['surface-raised'],\n missed: 'rgba(209,67,67,0.1)',\n deload: 'rgba(186,41,150,0.15)',\n}\n\nconst statusBorderStyles: Record<WorkoutPillStatus, Record<string, unknown>> = {\n completed: { borderWidth: 1, borderColor: 'rgba(46,213,115,0.3)' },\n current: { borderWidth: 1, borderColor: 'rgba(255,121,0,0.3)' },\n next: { borderWidth: 1, borderColor: 'rgba(255,121,0,0.4)' },\n upcoming: { borderWidth: 1, borderColor: '#1F1F1F' },\n missed: { borderWidth: 1, borderColor: 'rgba(209,67,67,0.25)' },\n deload: { borderWidth: 1, borderColor: 'rgba(186,41,150,0.3)' },\n}\n\nconst textColors: Record<WorkoutPillStatus, string> = {\n completed: t['status-success'],\n current: t['brand-primary'],\n next: t['brand-primary'],\n upcoming: '#6B7280',\n missed: 'rgba(209,67,67,0.7)',\n deload: WORKOUT_PILL_DELOAD,\n}\n\nfunction usePulse(enabled: boolean) {\n const [opacity] = useState(() => new Animated.Value(1))\n\n useEffect(() => {\n if (!enabled) {\n opacity.setValue(1)\n return\n }\n\n const animation = Animated.loop(\n Animated.sequence([\n Animated.timing(opacity, {\n toValue: 0.7,\n duration: 1000,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 1000,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n ])\n )\n animation.start()\n\n return () => animation.stop()\n }, [enabled, opacity])\n\n return opacity\n}\n\nexport function WorkoutPill({\n name,\n status,\n pulse,\n onPress,\n highlighted = false,\n className,\n ...props\n}: WorkoutPillProps) {\n const shouldPulse = pulse ?? status === 'current'\n const pulseOpacity = usePulse(shouldPulse)\n const isCompleted = status === 'completed'\n const isMissed = status === 'missed'\n\n const pill = (\n <Animated.View\n style={shouldPulse ? { opacity: pulseOpacity } : undefined}\n testID=\"workout-pill\"\n >\n <View\n className={className}\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n paddingVertical: 4,\n borderRadius: 6,\n backgroundColor: statusBgColors[status],\n },\n statusBorderStyles[status] as Record<string, unknown>,\n highlighted ? { borderWidth: 2, transform: [{ scale: 1.02 }] } : undefined,\n ]}\n accessibilityLabel={onPress ? undefined : `${name} workout, ${status}`}\n {...props}\n >\n {isCompleted && (\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n marginRight: 4,\n }}\n accessibilityElementsHidden\n testID=\"workout-pill-check\"\n >\n {'\\u2713'}\n </Text>\n )}\n {isMissed && (\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n marginRight: 4,\n }}\n accessibilityElementsHidden\n testID=\"workout-pill-dash\"\n >\n {'\\u2014'}\n </Text>\n )}\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n }}\n accessibilityElementsHidden={onPress != null}\n testID=\"workout-pill-name\"\n >\n {name}\n </Text>\n </View>\n </Animated.View>\n )\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name} workout, ${status}`}\n testID=\"workout-pill-pressable\"\n >\n {pill}\n </Pressable>\n )\n }\n\n return pill\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport {\n View,\n Text,\n Animated,\n type ViewProps,\n type ViewStyle,\n type DimensionValue,\n} from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nconst t = getSemanticColors('dark')\n\nexport type IntensityBarOrientation = 'vertical' | 'horizontal'\n\nexport interface IntensityBarProps extends ViewProps {\n /** Current intensity level; 1 == 100% of target. Values >1 render as over-target. */\n level: number\n /** Target position 0-1. When the level sits at this target the fill gains an at-target glow. */\n threshold?: number\n /** Orientation */\n orientation?: IntensityBarOrientation\n /** Height for vertical (default 24px) or width for horizontal */\n size?: number\n /** Width for vertical (default 6px) or height for horizontal */\n thickness?: number\n /** Show the \"MRV\" threshold label under the bar */\n showThresholdLabel?: boolean\n className?: string\n}\n\nconst TRACK_BG = '#333333'\nconst LABEL_COLOR = '#6B7280'\nconst TARGET_LINE_COLOR = 'rgba(33, 150, 243, 0.5)'\nconst AT_TARGET_GLOW = '0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)'\n\n// Zone colors graded by TRUE percentage (level * 100).\nconst ZONE = {\n building: t['status-success'], // below target ramp-up\n approaching: t['status-warning'], // nearing target\n target: t['brand-primary'], // exactly at target\n over1: t['status-error'], // mild over-target\n over2: WORKOUT_TOKENS.intensity.over2, // moderate over-target\n over3: WORKOUT_TOKENS.intensity.over3, // severe over-target\n} as const\n\ntype OverTier = 0 | 1 | 2 | 3\n\ninterface Zone {\n color: string\n over: OverTier\n}\n\nconst BULGE_SIZE: Record<Exclude<OverTier, 0>, number> = { 1: 8, 2: 10, 3: 11 }\n\n/** Map a true percentage to its fill color and over-target tier. */\nfunction zoneForPct(pct: number): Zone {\n if (pct >= 125) return { color: ZONE.over3, over: 3 }\n if (pct >= 115) return { color: ZONE.over2, over: 2 }\n if (pct > 100) return { color: ZONE.over1, over: 1 }\n if (pct === 100) return { color: ZONE.target, over: 0 }\n if (pct >= 75) return { color: ZONE.approaching, over: 0 }\n return { color: ZONE.building, over: 0 }\n}\n\nfunction clampFill(value: number): number {\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\n/** True when the level rests on the supplied target (within 5%). */\nfunction isAtTarget(pct: number, threshold?: number): boolean {\n if (threshold == null) return false\n return Math.abs(pct - Math.round(threshold * 100)) <= 5\n}\n\nexport function IntensityBar({\n level,\n threshold,\n orientation = 'vertical',\n size = 24,\n thickness = 6,\n showThresholdLabel,\n className,\n ...props\n}: IntensityBarProps) {\n const isVertical = orientation === 'vertical'\n const fillLevel = clampFill(level)\n const pct = Math.round(Math.max(0, level) * 100)\n const zone = zoneForPct(pct)\n const atTarget = isAtTarget(pct, threshold)\n\n const [fillAnim] = useState(() => new Animated.Value(fillLevel))\n\n useEffect(() => {\n const animation = Animated.timing(fillAnim, {\n toValue: fillLevel,\n duration: 250,\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [fillLevel, fillAnim])\n\n const fillSizePercent = fillAnim.interpolate({\n inputRange: [0, 1],\n outputRange: ['0%', '100%'],\n })\n\n const trackStyle = isVertical\n ? { width: thickness, height: size }\n : { width: size, height: thickness }\n\n const fillStyle = isVertical\n ? { position: 'absolute' as const, bottom: 0, left: 0, right: 0, height: fillSizePercent }\n : { position: 'absolute' as const, top: 0, bottom: 0, left: 0, width: fillSizePercent }\n\n const bulgeSize = zone.over === 0 ? 0 : BULGE_SIZE[zone.over]\n const bulgeStyle: ViewStyle = {\n position: 'absolute',\n width: bulgeSize,\n height: bulgeSize,\n borderRadius: bulgeSize / 2,\n backgroundColor: zone.color,\n zIndex: 1,\n ...(isVertical\n ? { top: 0, left: '50%', transform: [{ translateX: -bulgeSize / 2 }] }\n : { right: 0, top: '50%', transform: [{ translateY: -bulgeSize / 2 }] }),\n }\n\n const targetPct: DimensionValue = `${clampFill(threshold ?? 0) * 100}%`\n const targetLineStyle: ViewStyle = isVertical\n ? {\n position: 'absolute',\n bottom: targetPct,\n left: -3,\n right: -3,\n height: 1.5,\n backgroundColor: TARGET_LINE_COLOR,\n zIndex: 4,\n }\n : {\n position: 'absolute',\n left: targetPct,\n top: -3,\n bottom: -3,\n width: 1.5,\n backgroundColor: TARGET_LINE_COLOR,\n zIndex: 4,\n }\n\n return (\n <View\n className={className}\n style={{ alignItems: 'center' }}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: 0, max: 100, now: pct }}\n accessibilityLabel={`Intensity level: ${pct}%`}\n testID=\"intensity-bar\"\n {...props}\n >\n <View\n style={{\n ...trackStyle,\n borderRadius: 3,\n backgroundColor: TRACK_BG,\n position: 'relative',\n overflow: 'visible',\n }}\n accessibilityElementsHidden\n >\n <Animated.View\n style={{\n ...fillStyle,\n borderRadius: 3,\n backgroundColor: zone.color,\n zIndex: 2,\n ...(atTarget ? { boxShadow: AT_TARGET_GLOW } : null),\n }}\n testID=\"intensity-fill\"\n />\n\n {zone.over !== 0 && <View style={bulgeStyle} testID=\"intensity-bulge\" />}\n\n {threshold != null && <View style={targetLineStyle} testID=\"intensity-target\" />}\n </View>\n\n <Text\n style={{\n fontSize: 8,\n color: LABEL_COLOR,\n fontFamily: '\"Nunito Sans\", sans-serif',\n marginTop: 6,\n }}\n accessibilityElementsHidden\n testID=\"intensity-label\"\n >\n {pct}%\n </Text>\n\n {showThresholdLabel && threshold != null && (\n <Text\n style={{\n fontSize: 8,\n fontWeight: '500',\n color: LABEL_COLOR,\n fontFamily: 'Inter, sans-serif',\n marginTop: 2,\n }}\n accessibilityElementsHidden\n testID=\"intensity-threshold-label\"\n >\n MRV\n </Text>\n )}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, type ViewProps } from 'react-native'\nimport { WorkoutPill, type WorkoutPillStatus } from './WorkoutPill'\nimport { IntensityBar } from './IntensityBar'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport interface WeekRowWorkout {\n name: string\n status: WorkoutPillStatus\n onPress?: () => void\n}\n\nexport interface WeekRowProps extends ViewProps {\n /** Week index within the mesocycle (1-based) */\n weekNumber: number\n /** Total weeks in the mesocycle */\n totalWeeks: number\n /** Workouts scheduled for this week */\n workouts: WeekRowWorkout[]\n /** Planned intensity for the week, 0-1 */\n intensityLevel: number\n /** Optional MRV/overexertion threshold, 0-1 */\n intensityThreshold?: number\n /** Highlights this row as the active week */\n isCurrent?: boolean\n /** Renders this row as a deload week (purple tint, deload pills) */\n isDeload?: boolean\n className?: string\n}\n\n/**\n * A single week within a mesocycle, showing the week number, its workout pills,\n * and a right-aligned vertical intensity indicator.\n *\n * @example\n * <WeekRow\n * weekNumber={1}\n * totalWeeks={4}\n * workouts={[\n * { name: 'Upper', status: 'completed' },\n * { name: 'Lower', status: 'current' },\n * ]}\n * intensityLevel={0.55}\n * intensityThreshold={0.8}\n * isCurrent\n * />\n */\nexport function WeekRow({\n weekNumber,\n totalWeeks,\n workouts,\n intensityLevel,\n intensityThreshold,\n isCurrent = false,\n isDeload = false,\n className,\n ...props\n}: WeekRowProps) {\n const rowStyle: Record<string, unknown> = {\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n paddingVertical: 10,\n paddingHorizontal: 12,\n gap: 12,\n }\n\n if (isDeload) {\n rowStyle.backgroundColor = 'rgba(186,41,150,0.06)'\n }\n\n if (isCurrent) {\n rowStyle.backgroundColor = 'rgba(255,121,0,0.04)'\n rowStyle.borderLeftWidth = 2\n rowStyle.borderLeftColor = BRAND_PRIMARY\n }\n\n return (\n <View\n className={className}\n style={rowStyle}\n accessibilityLabel={`Week ${weekNumber} of ${totalWeeks}, ${workouts.length} workouts`}\n testID=\"week-row\"\n {...props}\n >\n <View\n style={{ flexDirection: 'row', alignItems: 'center', width: 32, gap: 4 }}\n testID=\"week-row-number\"\n >\n {isCurrent && (\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: BRAND_PRIMARY,\n }}\n accessibilityElementsHidden\n testID=\"week-row-current-dot\"\n />\n )}\n <Text\n className={isCurrent ? undefined : 'text-text-primary'}\n style={{\n fontSize: 13,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n color: isCurrent ? BRAND_PRIMARY : undefined,\n }}\n accessibilityElementsHidden\n >\n {`W${weekNumber}`}\n </Text>\n </View>\n\n <View\n style={{ flex: 1, flexDirection: 'row', alignItems: 'center', flexWrap: 'wrap', gap: 6 }}\n testID=\"week-row-pills\"\n >\n {workouts.map((workout, i) => (\n <WorkoutPill\n key={i}\n name={workout.name}\n status={isDeload ? 'deload' : workout.status}\n onPress={workout.onPress}\n />\n ))}\n </View>\n\n <View testID=\"week-row-intensity\">\n <IntensityBar\n level={intensityLevel}\n threshold={intensityThreshold}\n orientation=\"vertical\"\n size={24}\n thickness={6}\n />\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { Badge } from '../../ui/badge'\nimport { WeekRow, type WeekRowProps } from './WeekRow'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n MESO_ACCENT_GRADIENT_DARK,\n MESO_ACCENT_GRADIENT_LIGHT,\n} from '../../../theme/extracted-colors-dataviz'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\nconst BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK\nconst BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT\nconst BORDER_DEFAULT = '#1F1F1F'\n\n/** Gradient stops for the 3px top accent: dark -> primary -> light. */\nconst ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY, BRAND_PRIMARY_LIGHT]\n\nexport interface MesoVolumeHeatmapEntry {\n /** Muscle group identifier (free-form to match plan data). */\n group: string\n /** Planned volume intensity for the group, 0-100. */\n percentage: number\n}\n\nexport interface MesoCardProps extends ViewProps {\n /** Mesocycle name, e.g. \"Accumulation\". */\n name: string\n /** Training goal, e.g. \"Hypertrophy\", \"Strength\", \"Peaking\". */\n goal: string\n /** Training split, e.g. \"Upper/Lower\", \"Push/Pull/Legs\". */\n split: string\n /** Week range label, e.g. \"Weeks 1-4\". */\n weekRange: string\n /** Current week within the mesocycle (1-based). */\n currentWeek?: number\n /** Total weeks in the mesocycle. */\n totalWeeks: number\n /** Weeks rendered as a WeekRow list when expanded. */\n weeks: WeekRowProps[]\n /** Whether the card is expanded to reveal the week list. */\n expanded?: boolean\n /** Toggles expansion; makes the header a button when provided. */\n onToggle?: () => void\n /** Whether this meso is highlighted in the MesoProgressBar. */\n highlighted?: boolean\n /** Volume heatmap data per muscle group for the meso. */\n volumeHeatmap?: MesoVolumeHeatmapEntry[]\n className?: string\n}\n\n/**\n * Maps a 0-100 volume percentage onto a brand-primary tint whose opacity\n * tracks intensity, keeping a visible floor so low-volume groups stay legible.\n */\nfunction heatmapColor(percentage: number): string {\n const clamped = Math.max(0, Math.min(100, percentage))\n const opacity = 0.12 + (clamped / 100) * 0.78\n return `rgba(255,121,0,${opacity.toFixed(3)})`\n}\n\n/**\n * A mesocycle card with name, goal, split, week range, an optional volume\n * heatmap strip, and an expandable WeekRow list. Highlighting animates the\n * border toward brand-primary with a subtle glow to stay in sync with the\n * MesoProgressBar.\n *\n * @example\n * <MesoCard\n * name=\"Accumulation\"\n * goal=\"Hypertrophy\"\n * split=\"Upper/Lower\"\n * weekRange=\"Weeks 1-4\"\n * currentWeek={2}\n * totalWeeks={4}\n * weeks={weeks}\n * volumeHeatmap={[{ group: 'chest', percentage: 80 }]}\n * expanded\n * onToggle={() => {}}\n * highlighted\n * />\n */\nexport function MesoCard({\n name,\n goal,\n split,\n weekRange,\n currentWeek,\n totalWeeks,\n weeks,\n expanded = false,\n onToggle,\n highlighted = false,\n volumeHeatmap,\n className,\n ...props\n}: MesoCardProps) {\n const isExpandable = onToggle != null\n const [highlight] = useState(() => new Animated.Value(highlighted ? 1 : 0))\n\n useEffect(() => {\n const animation = Animated.timing(highlight, {\n toValue: highlighted ? 1 : 0,\n duration: 250,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [highlighted, highlight])\n\n const borderColor = highlight.interpolate({\n inputRange: [0, 1],\n outputRange: [BORDER_DEFAULT, BRAND_PRIMARY],\n })\n\n const header = (\n <View style={{ paddingHorizontal: 14, paddingTop: 12, paddingBottom: 10 }} testID=\"meso-card-body\">\n <View className=\"flex-row items-center\" style={{ gap: 8 }} testID=\"meso-card-header\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"meso-card-name\"\n >\n {name}\n </Text>\n <Badge variant=\"subtle\" color=\"primary\" size=\"sm\" testID=\"meso-card-goal-badge\">\n {goal}\n </Badge>\n </View>\n\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"meso-card-subheader\"\n >\n {`${split} · ${weekRange}`}\n </Text>\n\n {volumeHeatmap && volumeHeatmap.length > 0 && (\n <View\n className=\"flex-row items-center\"\n style={{ marginTop: 10, gap: 3 }}\n accessibilityElementsHidden\n testID=\"meso-card-heatmap\"\n >\n {volumeHeatmap.map((entry) => (\n <View\n key={entry.group}\n style={{\n flex: 1,\n height: 8,\n borderRadius: 2,\n backgroundColor: heatmapColor(entry.percentage),\n }}\n testID=\"meso-card-heatmap-cell\"\n />\n ))}\n </View>\n )}\n </View>\n )\n\n return (\n <Animated.View style={highlighted ? { transform: [{ scale: 1.0 }] } : undefined} testID=\"meso-card-wrapper\">\n <Card\n variant=\"outline\"\n elevation={2}\n borderColor={highlighted ? BRAND_PRIMARY : BORDER_DEFAULT}\n className={className}\n style={[\n { borderColor: borderColor as unknown as string },\n highlighted\n ? { boxShadow: '0 0 12px 2px rgba(255,121,0,0.25)' }\n : undefined,\n ]}\n testID=\"meso-card\"\n {...props}\n >\n <View\n className=\"flex-row\"\n style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 3, zIndex: 1 }}\n accessibilityElementsHidden\n testID=\"meso-card-accent\"\n >\n {ACCENT_STOPS.map((color) => (\n <View key={color} style={{ flex: 1, backgroundColor: color }} />\n ))}\n </View>\n\n {isExpandable ? (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name}, ${goal}, ${weekRange}`}\n aria-expanded={expanded}\n testID=\"meso-card-toggle\"\n >\n {header}\n </Pressable>\n ) : (\n <View\n accessibilityLabel={`${name}, ${goal}, ${weekRange}`}\n testID=\"meso-card-static\"\n >\n {header}\n </View>\n )}\n\n {expanded && weeks.length > 0 && (\n <View\n style={{ borderTopWidth: 1, borderTopColor: BORDER_DEFAULT }}\n testID=\"meso-card-weeks\"\n >\n {weeks.map((week) => (\n <WeekRow\n key={week.weekNumber}\n {...week}\n totalWeeks={week.totalWeeks ?? totalWeeks}\n isCurrent={week.isCurrent ?? week.weekNumber === currentWeek}\n />\n ))}\n </View>\n )}\n </Card>\n </Animated.View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\n// Aliases for spec compatibility: under=behind, maintenance=ontrack, productive=target\nexport type VolumeStatus = 'untrained' | 'behind' | 'ontrack' | 'target' | 'over'\n\nexport interface MuscleGroupChipProps extends ViewProps {\n name: string\n volumeStatus?: VolumeStatus\n onPress?: () => void\n className?: string\n}\n\nconst dotColorMap: Record<VolumeStatus, string> = {\n untrained: '#2C2C2C',\n behind: t['brand-secondary'],\n ontrack: t['status-success'],\n target: t['brand-primary'],\n over: t['status-error'],\n}\n\nexport function MuscleGroupChip({\n name,\n volumeStatus,\n onPress,\n className,\n ...props\n}: MuscleGroupChipProps) {\n const dotColor = volumeStatus\n ? dotColorMap[volumeStatus]\n : '#2C2C2C'\n\n const statusLabel = volumeStatus ?? 'no status'\n\n const content = (\n <View\n className={['bg-surface-raised border-border', className].filter(Boolean).join(' ')}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 9999,\n paddingHorizontal: 9,\n paddingVertical: 3,\n borderWidth: 1,\n }}\n accessibilityLabel={onPress ? undefined : `${name}, volume status: ${statusLabel}`}\n testID=\"muscle-group-chip\"\n {...props}\n >\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 9999,\n marginRight: 5,\n flexShrink: 0,\n backgroundColor: dotColor,\n }}\n accessibilityElementsHidden\n testID=\"muscle-group-chip-dot\"\n />\n <Text\n className=\"text-text-secondary\"\n style={{\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n fontSize: 11,\n }}\n accessibilityElementsHidden\n >\n {name}\n </Text>\n </View>\n )\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name}, volume status: ${statusLabel}`}\n testID=\"muscle-group-chip-pressable\"\n >\n {content}\n </Pressable>\n )\n }\n\n return content\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, ScrollView, Pressable, type ViewProps } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'\nimport {\n MuscleGroupChip,\n type VolumeStatus,\n} from './MuscleGroupChip'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nexport type WorkoutStatus = 'completed' | 'today' | 'upcoming'\n\n/** Spec volume-status vocabulary; mapped to MuscleGroupChip's VolumeStatus internally. */\nexport type WorkoutMuscleVolumeStatus =\n | 'under'\n | 'maintenance'\n | 'productive'\n | 'over'\n\nexport interface WorkoutMuscleGroup {\n /** Muscle group identifier (free-form to match plan data). */\n group: string\n /** Display label, may be abbreviated. */\n label: string\n /** Volume status relative to landmarks. */\n volumeStatus?: WorkoutMuscleVolumeStatus\n}\n\nexport interface WorkoutCardProps extends ViewProps {\n name: string\n date: string\n /** e.g. \"45 min\" */\n duration?: string\n status: WorkoutStatus\n muscleGroups: WorkoutMuscleGroup[]\n totalSets: number\n /** Total lbs/kg moved across the workout. */\n totalVolume?: number\n unit: 'lbs' | 'kg'\n exercises?: ExerciseCardProps[]\n expanded?: boolean\n onToggle?: () => void\n className?: string\n}\n\nconst COLORS = {\n statusSuccess: t['status-success'],\n brandPrimary: t['brand-primary'],\n borderDefault: '#1F1F1F',\n brandPrimarySubtle: 'rgba(255,121,0,0.06)',\n}\n\nconst statusBorderColors: Record<WorkoutStatus, string> = {\n completed: COLORS.statusSuccess,\n today: COLORS.brandPrimary,\n upcoming: COLORS.borderDefault,\n}\n\n/** Maps the spec's volume-status vocabulary onto MuscleGroupChip's enum. */\nconst volumeStatusMap: Record<WorkoutMuscleVolumeStatus, VolumeStatus> = {\n under: 'behind',\n maintenance: 'ontrack',\n productive: 'target',\n over: 'over',\n}\n\nfunction formatStats(\n totalSets: number,\n totalVolume: number | undefined,\n unit: 'lbs' | 'kg',\n duration: string | undefined,\n): string {\n const parts = [`${totalSets} sets`]\n if (totalVolume != null) parts.push(`${totalVolume} ${unit}`)\n if (duration) parts.push(duration)\n return parts.join(' · ')\n}\n\n/**\n * A workout within a week: name, date, duration, muscle-group pills, and a\n * stats summary. When expandable it renders contained ExerciseCards on expand.\n * Status drives a colored left border, today adds a brand tint, and upcoming\n * is dimmed.\n *\n * @example\n * <WorkoutCard\n * name=\"Upper A\"\n * date=\"Mon, Jun 23\"\n * duration=\"45 min\"\n * status=\"today\"\n * muscleGroups={[{ group: 'chest', label: 'Chest', volumeStatus: 'productive' }]}\n * totalSets={18}\n * totalVolume={12450}\n * unit=\"lbs\"\n * expanded\n * onToggle={() => {}}\n * exercises={exercises}\n * />\n */\nexport function WorkoutCard({\n name,\n date,\n duration,\n status,\n muscleGroups,\n totalSets,\n totalVolume,\n unit,\n exercises,\n expanded = false,\n onToggle,\n className,\n ...props\n}: WorkoutCardProps) {\n const isExpandable = onToggle != null\n const isUpcoming = status === 'upcoming'\n const isToday = status === 'today'\n\n const summary = (\n <View style={{ padding: 14 }} testID=\"workout-card-body\">\n <View className=\"flex-row items-center\" testID=\"workout-card-header\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"workout-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"workout-card-date\"\n >\n {date}\n </Text>\n </View>\n\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"workout-card-stats\"\n >\n {formatStats(totalSets, totalVolume, unit, duration)}\n </Text>\n\n {muscleGroups.length > 0 && (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={{ gap: 5 }}\n style={{ marginTop: 8 }}\n testID=\"workout-card-muscle-groups\"\n >\n {muscleGroups.map((muscle) => (\n <MuscleGroupChip\n key={muscle.group}\n name={muscle.label}\n volumeStatus={\n muscle.volumeStatus\n ? volumeStatusMap[muscle.volumeStatus]\n : undefined\n }\n />\n ))}\n </ScrollView>\n )}\n </View>\n )\n\n return (\n <Card\n variant=\"accent\"\n elevation={1}\n accentColor={statusBorderColors[status]}\n bgColor={isToday ? COLORS.brandPrimarySubtle : undefined}\n className={className}\n style={isUpcoming ? { opacity: 0.6 } : undefined}\n testID=\"workout-card\"\n {...props}\n >\n {isExpandable ? (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name} workout, ${date}, ${status}`}\n aria-expanded={expanded}\n testID=\"workout-card-toggle\"\n >\n {summary}\n </Pressable>\n ) : (\n <View\n accessibilityLabel={`${name} workout, ${date}, ${status}`}\n testID=\"workout-card-static\"\n >\n {summary}\n </View>\n )}\n\n {expanded && exercises && exercises.length > 0 && (\n <View\n style={{ paddingHorizontal: 8, paddingBottom: 8, gap: 6 }}\n testID=\"workout-card-exercises\"\n >\n {exercises.map((exercise, i) => (\n <ExerciseCard key={i} {...exercise} />\n ))}\n </View>\n )}\n </Card>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { MesoProgressBar, type Meso, type MesoStatus } from './MesoProgressBar'\nimport { MesoCard, type MesoVolumeHeatmapEntry } from './MesoCard'\nimport { type WeekRowProps, type WeekRowWorkout } from './WeekRow'\nimport { WorkoutCard, type WorkoutStatus, type WorkoutMuscleGroup } from './WorkoutCard'\nimport { type WorkoutPillStatus } from './WorkoutPill'\nimport { type ExerciseCardProps } from './ExerciseCard'\nimport { cn } from '../../../utils/cn'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** A single workout within a planned week, plus its exercise breakdown. */\nexport interface PlanWorkout {\n /** Stable identifier used for drill-down selection. */\n id: string\n name: string\n date: string\n duration?: string\n status: WorkoutStatus\n muscleGroups: WorkoutMuscleGroup[]\n totalSets: number\n totalVolume?: number\n unit: 'lbs' | 'kg'\n /** Exercises revealed when the workout is opened. */\n exercises: ExerciseCardProps[]\n}\n\n/** A training week inside a mesocycle. */\nexport interface PlanWeek {\n /** 1-based week index within the mesocycle. */\n weekNumber: number\n /** Planned intensity for the week, 0-1. */\n intensityLevel: number\n /** Optional MRV/overexertion threshold, 0-1. */\n intensityThreshold?: number\n isDeload?: boolean\n isCurrent?: boolean\n workouts: PlanWorkout[]\n}\n\n/** A mesocycle: the top level of the drill-down. */\nexport interface PlanMeso {\n id: string\n name: string\n goal: string\n split: string\n weekRange: string\n weekCount: number\n currentWeek?: number\n status: MesoStatus\n volumeHeatmap?: MesoVolumeHeatmapEntry[]\n weeks: PlanWeek[]\n}\n\n/** Current depth of the meso -> week -> workout drill-down. */\nexport type ProgramNavLevel = 'meso' | 'week' | 'workout'\n\n/** The navigation cursor within the active mesocycle. */\nexport interface ProgramSelection {\n weekNumber: number | null\n workoutId: string | null\n}\n\n/** One tappable step in the breadcrumb trail. */\nexport interface ProgramBreadcrumb {\n key: string\n label: string\n level: ProgramNavLevel\n}\n\nexport interface ProgramPlanningPageProps extends ViewProps {\n /** Page heading. */\n title?: string\n /** Mesocycles that make up the program. */\n mesos: PlanMeso[]\n className?: string\n}\n\n/** Map a workout's lifecycle status onto a WorkoutPill status. */\nconst WORKOUT_PILL_STATUS: Record<WorkoutStatus, WorkoutPillStatus> = {\n completed: 'completed',\n today: 'current',\n upcoming: 'upcoming',\n}\n\n/** Derive the current drill-down level from the selection cursor (pure). */\nexport function deriveNavLevel(selection: ProgramSelection): ProgramNavLevel {\n if (selection.workoutId != null) return 'workout'\n if (selection.weekNumber != null) return 'week'\n return 'meso'\n}\n\n/** Project the mesocycles onto MesoProgressBar segment data (pure). */\nexport function toProgressBarMesos(mesos: PlanMeso[]): Meso[] {\n return mesos.map(({ id, name, weekCount, status, currentWeek }) => ({\n id,\n name,\n weekCount,\n status,\n currentWeek,\n }))\n}\n\n/** Look up a meso by id, or null. */\nexport function findMeso(mesos: PlanMeso[], id: string | null): PlanMeso | null {\n if (id == null) return null\n return mesos.find((meso) => meso.id === id) ?? null\n}\n\n/** Look up a week within a meso, or null. */\nexport function findWeek(meso: PlanMeso | null, weekNumber: number | null): PlanWeek | null {\n if (meso == null || weekNumber == null) return null\n return meso.weeks.find((week) => week.weekNumber === weekNumber) ?? null\n}\n\n/** Look up a workout within a week, or null. */\nexport function findWorkout(week: PlanWeek | null, workoutId: string | null): PlanWorkout | null {\n if (week == null || workoutId == null) return null\n return week.workouts.find((workout) => workout.id === workoutId) ?? null\n}\n\n/** Build the breadcrumb trail for the active drill path (pure). */\nexport function buildBreadcrumbs(\n meso: PlanMeso,\n weekNumber: number | null,\n workout: PlanWorkout | null\n): ProgramBreadcrumb[] {\n const crumbs: ProgramBreadcrumb[] = [{ key: 'meso', label: meso.name, level: 'meso' }]\n if (weekNumber != null) {\n crumbs.push({ key: 'week', label: `Week ${weekNumber}`, level: 'week' })\n }\n if (workout != null) {\n crumbs.push({ key: 'workout', label: workout.name, level: 'workout' })\n }\n return crumbs\n}\n\ninterface BreadcrumbsProps {\n crumbs: ProgramBreadcrumb[]\n onNavigate: (level: ProgramNavLevel) => void\n}\n\nfunction Breadcrumbs({ crumbs, onNavigate }: BreadcrumbsProps) {\n return (\n <View\n className=\"flex-row items-center flex-wrap\"\n style={{ gap: 4 }}\n testID=\"program-planning-page-breadcrumbs\"\n >\n {crumbs.map((crumb, index) => {\n const isLast = index === crumbs.length - 1\n return (\n <View key={crumb.key} className=\"flex-row items-center\" style={{ gap: 4 }}>\n {index > 0 && (\n <Text className=\"text-text-tertiary\" style={{ fontSize: 12 }}>\n {'›'}\n </Text>\n )}\n <Pressable\n onPress={() => onNavigate(crumb.level)}\n disabled={isLast}\n accessibilityRole=\"button\"\n testID={`program-planning-page-crumb-${crumb.key}`}\n >\n <Text\n className={isLast ? 'text-text-primary' : undefined}\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n fontWeight: isLast ? '700' : '500',\n color: isLast ? undefined : BRAND_PRIMARY,\n }}\n >\n {crumb.label}\n </Text>\n </Pressable>\n </View>\n )\n })}\n </View>\n )\n}\n\n/** Project a plan week onto WeekRow props, wiring pill taps to week selection. */\nfunction toWeekRow(\n week: PlanWeek,\n meso: PlanMeso,\n onSelectWeek: (weekNumber: number) => void\n): WeekRowProps {\n const workouts: WeekRowWorkout[] = week.workouts.map((workout) => ({\n name: workout.name,\n status: WORKOUT_PILL_STATUS[workout.status],\n onPress: () => onSelectWeek(week.weekNumber),\n }))\n return {\n weekNumber: week.weekNumber,\n totalWeeks: meso.weekCount,\n workouts,\n intensityLevel: week.intensityLevel,\n intensityThreshold: week.intensityThreshold,\n isCurrent: week.isCurrent ?? week.weekNumber === meso.currentWeek,\n isDeload: week.isDeload,\n }\n}\n\ninterface MesoLevelProps {\n mesos: PlanMeso[]\n activeMesoId: string | null\n onSelectMeso: (id: string) => void\n onSelectWeek: (weekNumber: number) => void\n}\n\nfunction MesoLevel({ mesos, activeMesoId, onSelectMeso, onSelectWeek }: MesoLevelProps) {\n return (\n <View style={{ gap: 12 }} testID=\"program-planning-page-meso-level\">\n {mesos.map((meso) => {\n const expanded = meso.id === activeMesoId\n return (\n <MesoCard\n key={meso.id}\n name={meso.name}\n goal={meso.goal}\n split={meso.split}\n weekRange={meso.weekRange}\n currentWeek={meso.currentWeek}\n totalWeeks={meso.weekCount}\n weeks={expanded ? meso.weeks.map((week) => toWeekRow(week, meso, onSelectWeek)) : []}\n volumeHeatmap={meso.volumeHeatmap}\n expanded={expanded}\n onToggle={() => onSelectMeso(meso.id)}\n highlighted={expanded}\n />\n )\n })}\n </View>\n )\n}\n\ninterface WeekLevelProps {\n week: PlanWeek\n onSelectWorkout: (id: string) => void\n}\n\nfunction WeekLevel({ week, onSelectWorkout }: WeekLevelProps) {\n return (\n <View style={{ gap: 10 }} testID=\"program-planning-page-week-level\">\n {week.workouts.map((workout) => (\n <WorkoutCard\n key={workout.id}\n name={workout.name}\n date={workout.date}\n duration={workout.duration}\n status={workout.status}\n muscleGroups={workout.muscleGroups}\n totalSets={workout.totalSets}\n totalVolume={workout.totalVolume}\n unit={workout.unit}\n exercises={workout.exercises}\n expanded={false}\n onToggle={() => onSelectWorkout(workout.id)}\n />\n ))}\n </View>\n )\n}\n\ninterface WorkoutLevelProps {\n workout: PlanWorkout\n expandedExercise: number | null\n onToggleExercise: (index: number) => void\n}\n\nfunction WorkoutLevel({ workout, expandedExercise, onToggleExercise }: WorkoutLevelProps) {\n // `upcoming` cards ignore `expanded`, so it's safe to wire the toggle uniformly.\n const exercises = workout.exercises.map((exercise, index) => ({\n ...exercise,\n expanded: index === expandedExercise,\n onExpandedChange: () => onToggleExercise(index),\n }))\n return (\n <View testID=\"program-planning-page-workout-level\">\n <WorkoutCard\n name={workout.name}\n date={workout.date}\n duration={workout.duration}\n status={workout.status}\n muscleGroups={workout.muscleGroups}\n totalSets={workout.totalSets}\n totalVolume={workout.totalVolume}\n unit={workout.unit}\n exercises={exercises}\n expanded\n onToggle={() => undefined}\n />\n </View>\n )\n}\n\n/**\n * ProgramPlanningPage — a meso -> week -> workout drill-down over an entire\n * training program. A `MesoProgressBar` pins the mesocycle timeline to the top;\n * the body swaps between three levels: expandable `MesoCard`s (with inline\n * `WeekRow`s), a week's `WorkoutCard` list, and a single opened `WorkoutCard`\n * with inline `ExerciseCard` expansion. A breadcrumb trail tracks and rewinds\n * the drill path. Selection is page-level state; children keep their own styles.\n *\n * @example\n * <ProgramPlanningPage mesos={mesos} />\n */\nexport function ProgramPlanningPage({\n title = 'Program Plan',\n mesos,\n className,\n ...props\n}: ProgramPlanningPageProps) {\n const [activeMesoId, setActiveMesoId] = useState<string | null>(mesos[0]?.id ?? null)\n const [selectedWeek, setSelectedWeek] = useState<number | null>(null)\n const [selectedWorkoutId, setSelectedWorkoutId] = useState<string | null>(null)\n const [expandedExercise, setExpandedExercise] = useState<number | null>(null)\n\n const progressMesos = useMemo(() => toProgressBarMesos(mesos), [mesos])\n const activeMeso = findMeso(mesos, activeMesoId)\n const level = deriveNavLevel({ weekNumber: selectedWeek, workoutId: selectedWorkoutId })\n const activeWeek = findWeek(activeMeso, selectedWeek)\n const activeWorkout = findWorkout(activeWeek, selectedWorkoutId)\n\n const selectMeso = (id: string) => {\n setActiveMesoId(id)\n setSelectedWeek(null)\n setSelectedWorkoutId(null)\n }\n const selectWeek = (weekNumber: number) => {\n setSelectedWeek(weekNumber)\n setSelectedWorkoutId(null)\n setExpandedExercise(null)\n }\n const selectWorkout = (id: string) => {\n setSelectedWorkoutId(id)\n setExpandedExercise(null)\n }\n const toggleExercise = (index: number) =>\n setExpandedExercise((current) => (current === index ? null : index))\n\n const navigateTo = (target: ProgramNavLevel) => {\n if (target === 'meso') selectMeso(activeMesoId ?? mesos[0]?.id)\n else if (target === 'week' && selectedWeek != null) selectWeek(selectedWeek)\n }\n\n return (\n <View\n className={cn(className, 'bg-background-base')}\n style={{ width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={title}\n testID=\"program-planning-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"program-planning-page-content\">\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"program-planning-page-title\"\n >\n {title}\n </Text>\n\n <View style={{ marginHorizontal: -16 }}>\n <MesoProgressBar\n mesos={progressMesos}\n activeMesoId={activeMesoId}\n onMesoPress={selectMeso}\n />\n </View>\n\n {activeMeso != null && (\n <Breadcrumbs\n crumbs={buildBreadcrumbs(activeMeso, selectedWeek, activeWorkout)}\n onNavigate={navigateTo}\n />\n )}\n\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n padding: 12,\n }}\n testID=\"program-planning-page-body\"\n >\n {level === 'meso' && (\n <MesoLevel\n mesos={mesos}\n activeMesoId={activeMesoId}\n onSelectMeso={selectMeso}\n onSelectWeek={selectWeek}\n />\n )}\n {level === 'week' && activeWeek != null && (\n <WeekLevel week={activeWeek} onSelectWorkout={selectWorkout} />\n )}\n {level === 'workout' && activeWorkout != null && (\n <WorkoutLevel\n workout={activeWorkout}\n expandedExercise={expandedExercise}\n onToggleExercise={toggleExercise}\n />\n )}\n </View>\n </View>\n </View>\n )\n}\n"]}